standalone sx1276 demo program

Dependencies:   SX1276Lib mbed

Fork of SX1276_GPS by CaryCoders

hello.cpp

Committer:
ftagius
Date:
2015-07-14
Revision:
31:2c813f321db7
Parent:
29:0ea07cc7124b
Child:
32:a2472bbe7c92

File content as of revision 31:2c813f321db7:

#include "mbed.h"
#include "sx1276-hal.h"
#include "main.h"
#include "debug.h"
// radfta #include "vt100.h"
#include "serial_api.h"
#include "GPS.h"
#include <math.h>
#define PI 3.14159265

void start_hello(void)
{
    int len = get_kbd_str(pcbuf, PCBUF_SIZE);
    printf("in start gps/hello\r\n");
    if (len < 0) {
        fflush(stdout);
        Radio.Rx( RX_TIMEOUT_VALUE );
        Radio.Tx( TX_TIMEOUT_VALUE );
        Radio.Sleep( );
        if (gpsEnabled)
            debug("GPS exchange ended\r\n");
        else
            debug("Hello exchange ended\r\n");    
        app = APP_CONSOLE;
        print_help();
        printf("> ");
        fflush(stdout);
        return;
    }
    else
    {   
        hello();
    }
}

void find_distance()
{
    //float dist = 0;
    float lat2 = 0;
    float lon2 = 0;
    float lat1 = 0;
    float lon1 = 0;
    float dLat = 0;
    float dLon = 0;
    float c = 0;
    float a = 0;
    float d = 0;
    
#ifdef radfta    
    gpsd.distance = 0;
    if (gpsd.l_latitude == 0.0)
    {
        gpsd.distance = -1;
        return;
    }
    if (gpsd.l_longitude == 0.0)
    {
        gpsd.distance = -1;
        return;
    }
   
    //lat1 = 35.73244;
    //lon1 = -78.79333;
    
    lat1 = gpsd.r_latitude;
    lon1 = gpsd.r_longitude;
        
    lat2 = gpsd.l_latitude;
    lon2 = gpsd.l_longitude;
    //Calculate Distance
    dLat = (lat2-lat1)*(PI/180);
    dLon = (lon2-lon1)*(PI/180);
    a = sin(dLat/2) * sin(dLat/2) +
    sin(dLon/2) * sin(dLon/2) * cos(lat1*(PI/180)) * cos(lat2*(PI/180));
    c = 2 * atan2(sqrt(a), sqrt(1-a));
    d = 6371000 * c;
 
    //GPS is only precise to 5 meters, so throw out bad data
    if ( d <= 5) {
       d = 0;
    }
    gpsd.distance = gpsd.distance + d;
   // printf("distance: %f\r\n", gpsd.distance);
#endif  
}
 
void check_gps(void)
{
    static int gps_count=0;
#ifdef radfta    
    if (gps_count >= 0)
    {
        //printf("checking gps\r\n");
        gps_count=0;  // reset for next cycle
        if(gpsd.sample()) 
        {
            led = !led;   
            static int swap=0;
            //printf("gps sample is true \r\n");
            if (gpsd.l_latitude != 0)
            {
                if (RADIO_INSTALLED)
                {
                    cLCD.setCursor(0,1);
                    cLCD.printf("d:NA per:%d      ", per);
                    //cLCD.printf("%0.4f %0.4f", gpsd.l_latitude, gpsd.l_longitude);
                }    
                else
                {
                    if (swap)
                    {
                    cLCD.setCursor(0,0);
                    cLCD.printf("Lat: %0.6f ", gpsd.l_latitude);
                    cLCD.setCursor(0,1);
                    cLCD.printf("Lon: %0.6f ", gpsd.l_longitude);
                    swap = 0;
                    }
                    else
                    {
                    cLCD.setCursor(0,1);
                    cLCD.printf("Lat: %0.6f ", gpsd.l_latitude);
                    cLCD.setCursor(0,0);
                    cLCD.printf("Lon: %0.6f ", gpsd.l_longitude);
                    swap = 1;
                    }
                }

                if (gpsd.r_latitude != 0)
                {
                    find_distance();
                    if (gpsd.distance < 50000 )
                    {
                        if (gpsd.distance >= 0)
                            cLCD.setCursor(0,1);
                            cLCD.printf("d:%0.1fm per:%d      ", gpsd.distance,per);
                    }
                }
            }    
            else
            {
                cLCD.setCursor(0,1);
                cLCD.printf("No GPS. per:%d      ",per);
            }
        }
        else      
        {  
            //printf("gps sample is false \r\n");
            cLCD.setCursor(0,1);
            cLCD.printf("No GPS. per:%d      ",per);
        }
    }
    else
    {
        #if 0
        if (gps_count % 5)
            gpsd.flushSerialBuffer();
        #endif
        //printf("not checking gps\r\n");
        gps_count++;
    }
#endif       
}

void hello(void)
{
    srand ( randomSeed() );
    // generate a random wait time
    int mywait = ((rand()%2 +1));
    int i=0;
    int rcvd=0;
    int lost=0;
 
    for (i=0;i<max_pkts;i++)
    {
        
        if (pkt_data[i]==1)
        {
            //printf("rcvd, pkt count=%d\r\n",i);
            rcvd++;
        }
        else if (pkt_data[i] == 2)
        {
            //printf("lose, pkt count=%d\r\n",i);
            lost++;
        }
     
    }
    if ((rcvd + lost) > 0)
    {
        per = 100 - (rcvd*100 / (rcvd + lost));
        //printf("rcvd = %d, lost = %d per = %d\r\n",rcvd, lost, per);
    }
    else 
        per = 0;

 
    switch( State )
    {
  
        case RX_TIMEOUT:

            printf("rx timeout in gps/hello loop. ");
            printf("per=%d\r\n", per);
            // radfta gpsd.r_latitude = 0;
            // radfta gpsd.r_longitude = 0;
            // printf("rcv - rssi = %d snr = %d msg=%s\r\n", RssiValue, SnrValue, BufferRx);
            cLCD.setCursor(0,0);
            cLCD.printf("RI:NA SR:NA      ");
        case RX:
             
            if( BufferSize > 0 )
            {
                if( strncmp( ( const char* )BufferRx, ( const char* )HelloMsg, 5 ) == 0 )
                {
                    led = !led;     
                    printf("rcv - rssi = %d snr = %d msg=%s ", RssiValue, SnrValue, BufferRx );
                    printf("per=%d\r\n", per);
                    cLCD.setCursor(0,0);
                    cLCD.printf("RI:%d SR:%d   ", RssiValue, SnrValue);
                }
                else
                {
                  // float latitude, longitude;
#ifdef radfta                  
                  if(sscanf((char *)BufferRx, "GP,%f,%f", &gpsd.r_latitude, &gpsd.r_longitude ) >= 1) 
                  {                    
                    led = !led;     
                    printf("rssi=%d snr=%d rlat=%0.5f rlon=%0.5f llat=%0.5f llon=%0.5f dst=%0.0fm ", RssiValue, SnrValue, gpsd.r_latitude, gpsd.r_longitude, gpsd.l_latitude, gpsd.l_longitude, gpsd.distance);
                    printf("per=%d\r\n", per);
                    cLCD.setCursor(0,0);
                    cLCD.printf("RI:%d SR:%d    ", RssiValue,SnrValue);
                    //printf("Msg received - Lat: %0.4f Lon: %0.4f\r\n", latitude, longitude);
                  }
                  else
                    printf("strange received message: %s\r\n", BufferRx);
#else
                  cLCD.setCursor(0,0);
                  cLCD.printf("RI:%d SR:%d    ", RssiValue,SnrValue);
                  printf("received message: %s\r\n", BufferRx);               
#endif                    
              }                  
            }
       case RX_ERROR:
            if (gpsEnabled)
            {
                check_gps();
            }   
#ifdef radfta            
            if (gpsEnabled)
                sprintf((char *)BufferTx, "GP,%4.5f,%4.5f", gpsd.l_latitude, gpsd.l_longitude);
            else
#else            
                strcpy( ( char* )BufferTx, ( char* )HelloMsg );
#endif               
            BufferSize=strlen((char *)BufferTx);
            //printf("Sending new buffer\r\n");
            Radio.Send( BufferTx, BufferSize );
            State = LOWPOWER;

            break;
        case TX:    
            //printf("tx state\r\n");
            //wait_ms (30);
 
            Radio.Rx( RX_TIMEOUT_VALUE / mywait  );
            State = LOWPOWER;
            break;
         case TX_TIMEOUT:
            debug("tx timeout\r\n");
            Radio.Tx( TX_TIMEOUT_VALUE );
            State = LOWPOWER;
            break;
        case LOWPOWER:
            wait_ms (5);
            break;
        default:
            debug("state is set to low power\r\n");
            State = LOWPOWER;
            break;
    }    
}