standalone sx1276 demo program

Dependencies:   SX1276Lib mbed

Fork of SX1276_GPS by CaryCoders

Revision:
32:a2472bbe7c92
Parent:
31:2c813f321db7
Child:
33:319cbac3b6eb
diff -r 2c813f321db7 -r a2472bbe7c92 utilities.cpp
--- a/utilities.cpp	Tue Jul 14 14:58:23 2015 +0000
+++ b/utilities.cpp	Wed Jul 29 12:14:42 2015 +0000
@@ -2,9 +2,23 @@
 #include "sx1276-hal.h"
 #include "main.h"
 #include "debug.h"
-//radfta #include "vt100.h"
 #include "serial_api.h"
 
+void gps_setup(void)
+{
+    printf("setting up gps\r\n");
+    gpsd.setBaud(9600);
+    gpsd.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); 
+    gpsd.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
+    gpsd.sendCommand(PGCMD_NOANTENNA);
+    gpsd.day=01;
+    gpsd.month=01;
+    gpsd.year=15;
+    gpsd.hour=1;
+    gpsd.minute=1;
+    gpsd.seconds=1;
+}    
+
 int get_kbd_str(char* buf, int size)
 {
     char c;
@@ -37,11 +51,23 @@
                 buf[i++] = c;
                 pc.putc(c);
             }
-        }  else {
+        }  
+        
+        else {
+#if 0            
+            return 0;
+#else            
             if (app == APP_PING)
                 ping_pong();
             if (app == APP_HELLO)
-                hello();
+            {
+             //   if (check_gps() == 0)
+             //   {
+                    return 0;
+                    //hello();
+             //   }
+            }                
+            
             if (app == APP_GPS)
                 check_gps();    
             #if 1    
@@ -51,6 +77,346 @@
                 check_rx_chat();    
             }
             #endif
+            #endif
         }
+
     } // ...for()
 }
+void OnTxTimeout( void )
+{
+    Radio.Sleep( );
+    State = TX_TIMEOUT;
+    //debug_if( DEBUG_MESSAGE, "> OnTxTimeout\r\n" );
+}
+
+void OnRxTimeout( void )
+{
+    Radio.Sleep( );
+    int i;
+    if (pkt_count >= max_pkts)
+    {
+        pkt_count=0;
+    } 
+    
+    // mark the rolling avg that a pkt has not been received
+    pkt_data[pkt_count]=2;
+ 
+    for (i=0; i< BUFFER_SIZE; i++)
+        BufferRx[ i ] = '\0';  // clear the buffer
+    BufferSize = 0;
+    State = RX_TIMEOUT;
+    rxTimeout = false;
+    // debug_if( DEBUG_MESSAGE, "> OnRxTimeout\r\n" );
+}
+
+void OnRxError( void )
+{
+    Radio.Sleep( );
+    if (pkt_count >= max_pkts)
+    {
+        pkt_count=0;
+    } 
+    
+    // mark the rolling avg that a pkt has not been received
+    pkt_data[pkt_count]=2;
+    State = RX_ERROR;
+    debug_if( DEBUG_MESSAGE, "> OnRxError\r\n" );
+}
+
+  
+char* itoa(int val, int base){
+    
+    static char buf[32] = {0};
+    
+    int i = 30;
+    
+    for(; val && i ; --i, val /= base)
+    
+        buf[i] = "0123456789abcdef"[val % base];
+    
+    return &buf[i+1];
+    
+}    
+
+unsigned int randomSeed(){
+    AnalogIn randIn(A0);  // analog input for random number seed
+    unsigned int rnum = 0;  // int = 4 bytes - 32 bits
+    // build 32 bit random number from the 2 lower bits from 16 analog reads
+    for (int i = 0; i<4;i++){
+        rnum = rnum | ((randIn.read_u16() & 15) << i*4);
+        wait_ms(5);
+    }
+    return rnum;
+}
+
+void configRxTx() {
+
+
+    Radio.SetTxConfig( MODEM_LORA, TxPower, 0, Bandwidth,
+                         SpreadingFactor, CodingRate,
+                         LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
+                         LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, 
+                         LORA_IQ_INVERSION_ON, 2000000 );
+    
+    Radio.SetRxConfig( MODEM_LORA, Bandwidth, SpreadingFactor,
+                         CodingRate, 0, LORA_PREAMBLE_LENGTH,
+                         LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
+                         LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, 
+                         LORA_IQ_INVERSION_ON, true );
+}
+
+void print_bandwidth()
+{
+    printf("bandwidth: ");
+    switch (((Radio.Read(REG_LR_MODEMCONFIG1) & 0xf0) >> 4)) {
+        case 0: printf("7.8KHz "); break;
+        case 1: printf("10.4KHz "); break;
+        case 2: printf("15.6KHz "); break;
+        case 3: printf("20.8KHz "); break;
+        case 4: printf("31.25KHz "); break;
+        case 5: printf("41.7KHz "); break;
+        case 6: printf("62.5KHz "); break;
+        case 7: printf("125KHz "); break;
+        case 8: printf("250KHz "); break;
+        case 9: printf("500KHz "); break;
+        default: printf("%x ", Radio.Read(REG_LR_MODEMCONFIG1)); break;
+    }
+    //printf("\r\n");     
+}
+
+void print_cr()
+{
+    int cr = (Radio.Read(REG_LR_MODEMCONFIG1) & 0x0f)>>1;
+    printf("coding rate: ");
+    switch (cr)
+    {
+        case 1:
+            printf("4/5");
+            break;
+        case 2:
+            printf("4/6");
+            break;
+        case 3:
+            printf("4/7");
+            break;     
+        case 4:
+            printf("4/8");
+            break;                   
+        default:
+            printf("unknown");
+            break;
+    
+    }
+    printf(" ");
+}
+
+void print_power()
+{
+    uint8_t paConfig = 0;
+    uint8_t paDac = 0;
+     
+    paConfig = Radio.Read( REG_PACONFIG );
+    paDac = Radio.Read( REG_PADAC );
+
+    paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | Radio.GetPaSelect( Radio.GetChannel()*1000000);
+    paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70;
+    printf("channel = %f getpa = %x, paConfig =%x \r\n",Radio.GetChannel(), Radio.GetPaSelect((uint32_t)Radio.GetChannel()*1000000), paConfig );
+    if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
+    {
+        if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON )
+        {
+            printf("Power: %d dBm ", ( uint8_t )( ( uint16_t )( paConfig) & 0x0f  ) + 5 );
+        }
+        else
+            printf("Power: %d dBm ", ( uint8_t )( ( uint16_t )( paConfig) &0x0f) + 2 );
+    }
+    else
+    {
+        printf("Power: %d dBm ", ( uint8_t )( ( uint16_t )( paConfig) & 0x0f ) - 1 );
+    }
+  
+}
+
+void print_errata()
+{
+    
+        int seqconfig1 = (Radio.Read(REG_SEQCONFIG1));
+        int timer2 = (Radio.Read(REG_TIMER2COEF));
+        printf("seqconfig1 = 0x%02x\r\n", seqconfig1);
+        printf("timer2coef = 0x%02x\r\n", timer2);
+
+}
+void print_status()
+{
+
+    printf("Radio version: 0x%02x Channel: %.1f MHz ", \
+            Radio.Read(REG_VERSION),\
+            Radio.GetChannel()\
+            );
+    print_power();        
+    print_bandwidth(); printf("\r\n");
+    printf("Spreading Factor: %d ",SpreadingFactor);
+    print_cr();
+    if (isMaster)
+        printf("Mode: master ");
+    else
+        printf("Mode: slave ");
+        
+ 
+     printf("\r\n");
+     print_errata();
+     printf("\r\n");
+ 
+}
+
+
+void OnTxDone( void )
+{
+    Radio.Sleep( );
+    State = TX;
+    pkt_count++;
+
+   
+    //debug_if( DEBUG_MESSAGE, "> OnTxDone\r\n" );
+}
+
+void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
+{
+    Radio.Sleep( );
+    if (pkt_count >= max_pkts)
+    {
+        pkt_count=0;
+    } 
+    
+    // mark the rolling avg that a pkt has been received
+    pkt_data[pkt_count]=1;
+    //printf("rx done, pkt_count = %d\r\n", pkt_count);
+ 
+    BufferSize = size;
+    int i;
+    for (i=0; i< BUFFER_SIZE; i++)
+        BufferRx[ i ] = '\0';  // clear the buffer
+ 
+    memcpy( BufferRx, payload, BufferSize );
+    if (rssi > 100)
+    {
+     rssi *= -1;
+    }
+    RssiValue = rssi;
+    SnrValue = snr;
+    State = RX;
+    rxTimeout = false;
+    if (app == APP_PING)  
+        debug_if( DEBUG_MESSAGE, "> OnRxDone size=%d rssi=%d snr=%d  \r\n", size, rssi, snr );
+  
+}
+
+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;
+      
+    distance = 0;
+    if (gpsd.lat_deg == 0.0)
+    {
+        distance = -1;
+        return;
+    }
+    if (gpsd.lon_deg == 0.0)
+    {
+        distance = -1;
+        return;
+    }
+    
+    lat1 = r_latitude;
+    lon1 = r_longitude;
+        
+    lat2 = gpsd.lat_deg;
+    lon2 = gpsd.lon_deg;
+    //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;
+    }
+    distance = distance + d;
+   // printf("distance: %f\r\n", gpsd.distance);
+   
+}
+ 
+int check_gps(void)
+{
+  
+        char c;
+        int debug=0;
+        c = gpsd.read();   //queries the GPS
+        if (debug)
+        {
+            if (c) { 
+                printf("%c", c);  //this line will echo the GPS data if not paused
+                return 1;
+                
+            }
+        }
+        
+        //check if we recieved a new message from GPS, if so, attempt to parse it,
+        if ( gpsd.newNMEAreceived() ) {
+              if (r_latitude != 0)
+              {
+                    find_distance();
+                    //printf("distance is %f\r\n",distance);
+                    if (distance < 50000 )
+                    {
+                        if (distance >= 0)
+                        {
+                            cLCD.setCursor(0,1);
+                            cLCD.printf("d:%0.1fm per:%d      ", distance,per);
+                        }
+                    }
+               }
+   
+            if ( !gpsd.parse(gpsd.lastNMEA()) ) 
+            {
+               // radfta led = !led;   
+               #if 0
+               if (gpsd.lat_deg != 0)
+               {
+                    cLCD.setCursor(0,1);
+                    cLCD.printf("d:Nx per:%d      ", per);
+                    cLCD.printf("%0.4f %0.4f", gpsd.lat_deg, gpsd.lon_deg);
+               }
+               #endif
+
+
+              
+               return 0;
+            }
+            else
+            {
+             // printf("GPS  %02d/%02d/20%02d_%02d:%02d:%02d (UTC)\r\n",gpsd.month,gpsd.day,gpsd.year,gpsd.hour,gpsd.minute,gpsd.seconds);
+               return 1;
+            }
+               
+        } 
+        else
+        {     
+           //printf("GPS  %02d/%02d/20%02d_%02d:%02d:%02d (UTC)\r\n",gpsd.month,gpsd.day,gpsd.year,gpsd.hour,gpsd.minute,gpsd.seconds);
+           return 0;   
+        }
+   
+}
+