Lora_with_GPS integration code - program hangs after a few transmissions

Dependencies:   mbed LoRaWAN-lib SingleFrequencyLora

Fork of simple-demo-76_revised_20171113 by Christopher De Bank

Revision:
12:7debb1c79a06
Parent:
11:32323f490d9e
diff -r 32323f490d9e -r 7debb1c79a06 app/main.cpp
--- a/app/main.cpp	Thu Nov 16 14:30:39 2017 +0000
+++ b/app/main.cpp	Mon Nov 20 12:03:22 2017 +0000
@@ -16,15 +16,71 @@
 #include "board.h"
 #include "radio.h"
 #include "LoRaMac.h"
-
+#include "l86.hpp"
 
-#define APPDATA_SIZE 7
+// #define APPDATA_SIZE 55 // size of a GPS_data struct //commented by Rish
 #define LORAWAN_DEFAULT_DATARATE DR_0
 #define LORAWAN_DEVICE_ADDRESS                      ( uint32_t )0x01234567
 #define LORAWAN_NWKSKEY                             { 0x11, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }
 #define LORAWAN_APPSKEY                             { 0x11, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }
 
-uint8_t AppData[APPDATA_SIZE];
+
+RawSerial gps(GPS_TX, GPS_RX); // USART1
+// RawSerial pc(PC_TX, PC_RX);
+
+DigitalOut Reset(RESET_PIN);
+DigitalOut Force_on(FORCE_ON_PIN);
+DigitalOut GPS_status(GPS_STATUS_LED);
+// DigitalIn  OnePPS(ONEPPS_PIN);
+
+
+// uint8_t AppDatasend[APPDATA_SIZE];
+RMC_data RMC;
+GPS_data GPS_parse;
+volatile int Char_index = 0;                  // index for char array
+char Rx_data[MAX_NMEA_LENGTH] = "0";          // char array to store received bytes
+char tx_line[82];
+
+void gps_receive(void) {
+    // Note: you need to actually read from the serial to clear the RX interrupt
+    while(gps.readable()) {
+        char incoming = gps.getc();
+        // #ifdef DEBUGGER
+        // pc.putc(incoming);
+        // #endif
+        Rx_data[Char_index] = incoming;
+    
+       if((Rx_data[Char_index] == '\n')){    // Received the end of an NMEA scentence
+            if((strncmp(GPRMC_Tag,Rx_data,(sizeof(GPRMC_Tag)-1)) == 0) || (strncmp(GNRMC_Tag,Rx_data,(sizeof(GNRMC_Tag)-1)) == 0)){
+                RMC = Parse_RMC_sentence(Rx_data);
+                if(strcmp(RMC.Status, "A") == 0){
+                    GPS_status = 0;    // Turn status LED off
+                    // GPS_parse = Parse_RMC_data(RMC); // Parse into format suitable for Tom (Dinghy_RaceTrak software)
+                    // Call function to send using LoRa module
+                }
+                else{
+                    GPS_status = 1;
+                    // Send "No GPS fix" over LoRa?
+                }
+                
+                // delete this line // Or replace with whatever Tom wants for invalid GPS data
+                GPS_parse = Parse_RMC_data(RMC); // Parse into format suitable for Tom (Dinghy_RaceTrak software)
+               // __disable_irq(); // edit
+               // Send_GPS_data(GPS_parse); //edit
+
+
+            }
+            Char_index = 0;
+            memset(Rx_data,0,sizeof(Rx_data));
+        }
+        else
+            Char_index++;
+    }
+    // __enable_irq();// edit
+    return;
+    // store chars into a string then process into LAT, LONG, SOG, COG & DATETIME, VALID/INVLAID
+}
+
 static uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
 static uint8_t AppSKey[] = LORAWAN_APPSKEY;
 
@@ -46,7 +102,8 @@
 int main( void )
 {
     //Initialise firmware
-        
+
+    
     LoRaMacPrimitives_t LoRaMacPrimitives;
     LoRaMacCallback_t LoRaMacCallbacks;
     MibRequestConfirm_t mibReq;
@@ -94,7 +151,7 @@
     mibReq.Param.ChannelsDefaultTxPower = LORAMAC_MAX_TX_POWER;
     LoRaMacMibSetRequestConfirm( &mibReq );
 
-    //Prepareframe
+    /*//Prepareframe
 
     AppData[0] = 0x43;
     AppData[1] = 0x68;
@@ -102,11 +159,11 @@
     AppData[3] = 0x69;
     AppData[4] = 0x73;
     AppData[5] = 0x21;
-    AppData[6] = 0x21;
+    AppData[6] = 0x21;*/
     
     //Sendframe
     
-    McpsReq_t mcpsReq;
+    /*McpsReq_t mcpsReq;
     
     uint8_t AppPort = 3;
     mcpsReq.Type = MCPS_UNCONFIRMED;
@@ -115,11 +172,21 @@
     mcpsReq.Req.Unconfirmed.fBufferSize = APPDATA_SIZE;
     mcpsReq.Req.Unconfirmed.Datarate = DR_5;
         
-    LoRaMacMcpsRequest( &mcpsReq );
+    LoRaMacMcpsRequest( &mcpsReq ); // Commented out by Rish*/
+    
+    GPS_status = 1;
+    gps.attach(&gps_receive, Serial::RxIrq);
+    gps.printf(PMTK_SET_NMEA_OUTPUT_RMC); // Only output RMC and GPTXT
+    gps.printf(PMTK_SET_UPDATE_F_2HZ);    // Set update Frequency to 2Hz 
     
     while(1){
-        wait(1);
-        LoRaMacMcpsRequest( &mcpsReq );
+        wait(5); // could time how long the IRQ takes to improve the efficienct of this
+        //LoRaMacMcpsRequest( &mcpsReq );
+        // Print_GPS_data(GPS_parse);
+        Send_GPS_data(GPS_parse);
+
+        //interrupt is not getting triggered!- reentrancy issues
+        //gps_receive();
         }
 }