init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Files at this revision

API Documentation at this revision

Comitter:
pathfindr
Date:
Wed Jan 16 23:06:39 2019 +0000
Parent:
37:505ef618f06c
Child:
39:f767b8037475
Commit message:
updates

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
modem.cpp Show annotated file Show diff for this revision Revisions of this file
modem.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed Jan 16 21:27:28 2019 +0000
+++ b/main.cpp	Wed Jan 16 23:06:39 2019 +0000
@@ -3,7 +3,7 @@
 //------------------------------------------------------------------------------
 //DEFINES
 //------------------------------------------------------------------------------ 
-#define FW_VERSION          2
+#define FW_VERSION          11
 #define SKU                 "GPSPLUS"
 #define HW_MAJORREVISION    "001"
 
@@ -12,6 +12,7 @@
 
 //DEFAULT SETTINGS
 #define DEFAULT_SLEEP_FRAME                 60000
+#define DEFAULT_FORCE2G                     true
 #define DEFAULT_LOCATION_MODE               2
 #define DEFAULT_LOCATION_ACCURACY           2  // 0 = no location, 1 = cl only, 2 = gps then cl
 #define DEFAULT_LOCATION_TX_INTERVAL_MINS   1440
@@ -79,6 +80,7 @@
 time_t           RET_buttonHoldTime;
 time_t           RET_SetupRunAt;
 time_t           RET_SettingsGotAt;
+bool             RET_force2G;
 //MOTION STATE
 bool             RET_motionTriggered;
 bool             RET_motionTriggeredInTXInterval;
@@ -158,7 +160,7 @@
         debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_beacon_scan:%d", RET_setting_beacon_scan);debug_exe();
     }
     
-    DEBUG("RET_RTCunixtime:%u",RET_RTCunixtime);
+    /*DEBUG("RET_RTCunixtime:%u",RET_RTCunixtime);
     DEBUG("RET_setting_firmware:%d",RET_setting_firmware);
     DEBUG("RET_setting_minimumupdate_hrs:%d",RET_setting_minimumupdate_hrs);
     DEBUG("RET_state:%d",RET_state);
@@ -176,7 +178,7 @@
     DEBUG("RET_setting_impact_alert:%d",RET_setting_impact_alert);
     DEBUG("RET_setting_connection_timeout:%d",RET_setting_connection_timeout);
     DEBUG("RET_setting_beacon_interval_seconds:%d",RET_setting_beacon_interval_seconds);
-    DEBUG("RET_setting_beacon_scan:%d",RET_setting_beacon_scan);
+    DEBUG("RET_setting_beacon_scan:%d",RET_setting_beacon_scan);*/
 }
 float getBatteryV() {
     NRF52_SAADC batteryIn;
@@ -277,9 +279,16 @@
     GLOBAL_motionStopFlagTriggered = false;
     memset(GLOBAL_exceptionString,0x00,sizeof(GLOBAL_exceptionString));
 }
+void healthCheck() {
+    //check clock
+    if(RET_havesettings == 1) {
+        if (RET_RTCunixtime < 1547678732) { 
+            //go dormant for 72hrs and then resetup
+            RET_havesettings = 0; setState(STATE_DORMANT);
+        }
+    }
+}
 void setDefaults() {
-    //IDENTITY 
-    //RET_imei = 0;
     //STATE
     RET_haveSettings = 0;
     RET_state = STATE_SETUP;
@@ -287,6 +296,7 @@
     RET_RTCunixtime = 0;
     RET_SetupRunAt = 0;
     RET_SettingsGotAt = 0;
+    RET_force2G = DEFAULT_FORCE2G;
     //SETTINGS
     RET_setting_firmware = 0;
     RET_setting_minimumupdate_hrs = 0;
@@ -329,7 +339,6 @@
     RET_eventTime_environmental_tx = 0;
     RET_eventTime_activity_tx = 0;
     RET_eventTime_wakeFromDormant = 0;
-    
     //PERIPHERAL RESET
     lis3dh_configureForSleep(DEFAULT_MOTION_G,DEFAULT_IMPACT_G);
 }
@@ -436,8 +445,8 @@
     int TEMP_k = -1; int TEMP_l = -1; int TEMP_m = -1; int TEMP_n = -1; int TEMP_o = -1; int TEMP_p = -1; int TEMP_q = -1; int TEMP_r = -1; int TEMP_s = -1;
     if ( (matchCount = sscanf(settingsBuffer,"a:%d,b:%u,c:%d,d:%d,e:%d,f:%d,g:%d,h:%d,i:%d,j:%d,k:%d,l:%d,m:%d,n:%d,o:%d,p:%d,q:%d,r:%d,s:%d",
     &TEMP_a,&TEMP_b,&TEMP_c,&TEMP_d,&TEMP_e,&TEMP_f,&TEMP_g,&TEMP_h,&TEMP_i,&TEMP_j,&TEMP_k,&TEMP_l,&TEMP_m,&TEMP_n,&TEMP_o,&TEMP_p,&TEMP_q,&TEMP_r,&TEMP_s) ) > 0 ) {
-        DEBUG("FROMSERVER: a:%d,b:%u,c:%d,d:%d,e:%d,f:%d,g:%d,h:%d,i:%d,j:%d,k:%d,l:%d,m:%d,n:%d,o:%d,p:%d,q:%d,r:%d,s:%d\n",
-        TEMP_a,TEMP_b,TEMP_c,TEMP_d,TEMP_e,TEMP_f,TEMP_g,TEMP_h,TEMP_i,TEMP_j,TEMP_k,TEMP_l,TEMP_m,TEMP_n,TEMP_o,TEMP_p,TEMP_q,TEMP_r,TEMP_s);
+        /*DEBUG("FROMSERVER: a:%d,b:%u,c:%d,d:%d,e:%d,f:%d,g:%d,h:%d,i:%d,j:%d,k:%d,l:%d,m:%d,n:%d,o:%d,p:%d,q:%d,r:%d,s:%d\n",
+        TEMP_a,TEMP_b,TEMP_c,TEMP_d,TEMP_e,TEMP_f,TEMP_g,TEMP_h,TEMP_i,TEMP_j,TEMP_k,TEMP_l,TEMP_m,TEMP_n,TEMP_o,TEMP_p,TEMP_q,TEMP_r,TEMP_s);*/
         
         if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "FROMSERVER: a:%d,b:%u,c:%d,d:%d,e:%d,f:%d,g:%d,h:%d,i:%d,j:%d,k:%d,l:%d,m:%d,n:%d,o:%d,p:%d,q:%d,r:%d,s:%d\n",
         TEMP_a,TEMP_b,TEMP_c,TEMP_d,TEMP_e,TEMP_f,TEMP_g,TEMP_h,TEMP_i,TEMP_j,TEMP_k,TEMP_l,TEMP_m,TEMP_n,TEMP_o,TEMP_p,TEMP_q,TEMP_r,TEMP_s);debug_exe();}
@@ -473,7 +482,6 @@
         
         if (critical_fail_count == 0) { 
             if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "GOT SETTINGS OK");debug_exe();}
-            DEBUG("GOT SETTINGS OK",false);
             dumpSettings(); 
             saveEventTimes();
             RET_haveSettings = true;
@@ -481,18 +489,18 @@
             RET_SettingsGotAt = RET_RTCunixtime;
             
             //check for firmware update
-            if (RET_setting_firmware != FW_VERSION) {
+            if (RET_setting_firmware > 0 && RET_setting_firmware != FW_VERSION) {
                 read_app_data_from_flash(&app_data);
                 app_data.target_firmware_version = RET_setting_firmware;
                 write_app_data_to_flash(&app_data);
-                ThisThread::wait(500);
+                if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Perform fw update\n");debug_exe();}
+                ThisThread::sleep_for(250);
                 system_reset();
             }
             
             return true;
         } else {
             if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "CRITICAL FAILS:%d",critical_fail_count);debug_exe();}
-            DEBUG("CRITICAL FAILS:%d",critical_fail_count);
             dumpSettings();
             RET_haveSettings = false; 
             return false;
@@ -508,23 +516,19 @@
     if(RET_setting_location_tx_interval_mins > 0) { 
         RET_eventTime_location_tx = (RET_RTCunixtime + (RET_setting_location_tx_interval_mins * 60));
         if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENTSET - LOCATION TX at %u, MODE %d\n",RET_eventTime_location_tx, RET_setting_location_mode);debug_exe();}
-        DEBUG("EVENTSET - LOCATION TX at %u, MODE %d\n",RET_eventTime_location_tx, RET_setting_location_mode);
     }
     if(RET_setting_location_tx_failsafe_hrs > 0) { 
         RET_eventTime_location_failsafe_tx = (RET_RTCunixtime + (RET_setting_location_tx_failsafe_hrs * 3600));
         if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENTSET - LOCATION FAILSAFE TX at %u\n",RET_eventTime_location_failsafe_tx);debug_exe();}
-        DEBUG("EVENTSET - LOCATION FAILSAFE TX at %u\n",RET_eventTime_location_failsafe_tx);
     }
     if(RET_setting_activity_tx_interval_hrs > 0) { 
         RET_motionFrameStart = RET_RTCunixtime; //SET START FRAME INITAL
         RET_eventTime_activity_tx = (RET_RTCunixtime + (RET_setting_activity_tx_interval_hrs * 3600));
         if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENTSET - ACTIVITY TX at %u\n",RET_eventTime_activity_tx);debug_exe();}
-        DEBUG("EVENTSET - ACTIVITY TX at %u\n",RET_eventTime_activity_tx);
     }
     if(RET_eventTime_environmental_tx > 0) { 
         RET_eventTime_environmental_tx = (RET_RTCunixtime + (RET_setting_environmental_tx_interval_mins * 60));
         if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENTSET - ENVIRONMENTAL TX at %u\n",RET_eventTime_environmental_tx);debug_exe();}
-        DEBUG("EVENTSET - ENVIRONMENTAL TX at %u\n",RET_eventTime_environmental_tx);
     }
 }
 
@@ -537,10 +541,9 @@
     float voltage = getBatteryV();
     bool selftestresult = selfTest();
     if (selftestresult == false) { LED1errorCode(4,20); } //ERROR 4
-    if (modem.on()) {
+    if (modem.on(RET_force2G)) {
         //RET_imei = modem.getIMEI();
         //DEBUG("imei: %lld \n",RET_imei);
-        //char* modemModel = modem.getModemModel();
         char locString[70];
         memcpy(locString, modem.getLocation(1, RET_setting_location_timeout), 70);
         if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,(RET_setting_connection_timeout*1000))) {
@@ -591,7 +594,7 @@
     float temperature = getTemperature();
     float voltage = getBatteryV();  
     int selftestresult = selfTest();
-    if (modem.on()) {
+    if (modem.on(RET_force2G)) {
         char locString[70];
         memcpy(locString, modem.getLocation(location_accuracy, RET_setting_location_timeout), 70);
         if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,(RET_setting_connection_timeout*1000))) {
@@ -627,7 +630,7 @@
     float temperature = getTemperature();
     float voltage = getBatteryV();
     int selfTestResult = selfTest();
-    if (modem.on()) {
+    if (modem.on(RET_force2G)) {
         char locString[70];
         memcpy(locString, modem.getLocation(RET_setting_location_accuracy, RET_setting_location_timeout), 70);
         //DEBUG("locString:%s-\n",locString);
@@ -666,7 +669,7 @@
 void event_activity_tx() {
     DEBUG("ACTIVITY TX\n",false);
     float temperature = getTemperature();
-    if (modem.on()) {
+    if (modem.on(RET_force2G)) {
         //SEND DATA
         if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,(RET_setting_connection_timeout*1000))) {
             char bytesToSend[160];
@@ -816,11 +819,9 @@
 //------------------------------------------------------------------------------
 // MAIN
 //------------------------------------------------------------------------------ 
-int main() {
-    LED1on(500);
-    
+int main() {    
     //INIT
-    watchdog.configure(300.0);
+    watchdog.configure(240.0); //4 mins
     LED1off();
     RTCticker.attach(&RTCtick, 1.0);
     button.fall(&buttonPress);
@@ -865,17 +866,20 @@
     //MAIN LOOP
     while(true) {
         //WATCHDOG
-        watchdogKick(); //only need this if we're in while loop
+        watchdogKick();
         
         //INIT
-        resetGlobals(); // could move this into state switches to save actions on each loop
+        resetGlobals();
+        healthCheck();
         GLOBAL_wakeTime = RET_RTCunixtime;
         
         //MAIN LOGIC
         //DEBUG("STATE:%d, HAVESETTINGS:%d, MOTION: %d, RTC:%u, BOOTAT:%u, LOC:%u, LOCFS:%u, ACT:%u \n", RET_state, RET_haveSettings, RET_motionState, RET_RTCunixtime,RET_SetupRunAt,RET_eventTime_location_tx,RET_eventTime_location_failsafe_tx,RET_eventTime_activity_tx);
         //DEBUG("ACTIVITY:%s\n",RET_activityData);
-        if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "STATE:%d, HAVESETTINGS:%d, MOTION: %d, RTC:%u, BOOTAT:%u, LOC:%u, LOCFS:%u, ACT:%u \n", RET_state, RET_haveSettings, RET_motionState, RET_RTCunixtime,RET_SetupRunAt,RET_eventTime_location_tx,RET_eventTime_location_failsafe_tx,RET_eventTime_activity_tx);debug_exe();}
-        if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ACTIVITY:%s\n",RET_activityData);debug_exe();}
+        if(DEBUG_ON){
+            debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "STATE:%d, HAVESETTINGS:%d, MOTION: %d, RTC:%u, LOC:%u, LOCFS:%u, ACT:%u \n", RET_state, RET_haveSettings, RET_motionState, RET_RTCunixtime,RET_eventTime_location_tx,RET_eventTime_location_failsafe_tx,RET_eventTime_activity_tx);debug_exe();
+            //debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ACTIVITY:%s\n",RET_activityData);debug_exe();
+        }
 
         mainStateEngine();
                 
--- a/main.h	Wed Jan 16 21:27:28 2019 +0000
+++ b/main.h	Wed Jan 16 23:06:39 2019 +0000
@@ -95,7 +95,7 @@
 extern time_t GLOBAL_RTCunixtime;
 extern time_t GLOBAL_wakeTime;
 extern char GLOBAL_debug_buffer[200];
-
+extern bool RET_force2G;
 //FUNCS
 extern void watchdogKick();
 
--- a/modem.cpp	Wed Jan 16 21:27:28 2019 +0000
+++ b/modem.cpp	Wed Jan 16 23:06:39 2019 +0000
@@ -42,7 +42,6 @@
     }
     t.stop();
     t.reset();
-    //ThisThread::sleep_for(250);
     if (havefullmatch) {
         return true;
     } else {
@@ -79,7 +78,7 @@
 }
 
 
-bool Modem::on(void) 
+bool Modem::on(bool force2G) 
 {
     NRFuart_init_nohwfc();
     
@@ -97,23 +96,25 @@
         if (ATwaitForWord("RDY",ATTIMEOUT_MED)) {
             
             //TURN OFF ECHO
-            ATsendCMD("ATE0");
-            ATwaitForWord("OK",ATTIMEOUT_SHORT);
+            //ATsendCMD("ATE0");
+            //ATwaitForWord("OK",ATTIMEOUT_SHORT);
              
             //ENABLE AIRPLANE MODE CONTROL WITH PIN
             ATsendCMD("AT+QCFG=\"airplanecontrol\",1");
             ATwaitForWord("OK",ATTIMEOUT_SHORT);
-            
-            //PRIORITISE 2G connection (reason being uses less power in some instances and can get cell tower tirangulation)
-            ATsendCMD("AT+QCFG=\"nwscanseq\",1"); //2G priority
-            //ATsendCMD("AT+QCFG=\"nwscanseq\",2"); //3G priority
-            //ATsendCMD("AT+QCFG=\"nwscanseq\",0"); //AUTO - default
-            ATwaitForWord("OK",ATTIMEOUT_SHORT);
-            
+                        
             //CONNECTION TYPE
-            //ATsendCMD("AT+QCFG=\"nwscanmode\",1"); //2G only connection
             //ATsendCMD("AT+QCFG=\"nwscanmode\",2"); //3G only connection
-            //ATwaitForWord("OK",ATTIMEOUT_SHORT);
+            if (force2G) {
+                ATsendCMD("AT+QCFG=\"nwscanmode\",1"); //2G only connection
+                ATwaitForWord("OK",ATTIMEOUT_SHORT);
+            } else {
+                //PRIORITISE 2G connection (reason being uses less power in some instances and can get cell tower tirangulation)
+                ATsendCMD("AT+QCFG=\"nwscanseq\",1"); //2G priority
+                //ATsendCMD("AT+QCFG=\"nwscanseq\",2"); //3G priority
+                //ATsendCMD("AT+QCFG=\"nwscanseq\",0"); //AUTO - default
+                ATwaitForWord("OK",ATTIMEOUT_SHORT);
+            }
             
             return true;
         } else {
@@ -194,7 +195,7 @@
             if (!GLOBAL_registeredOnNetwork) {
                 off(true);
                 Thread::wait(1000);
-                on();
+                on(RET_force2G);
             }
             attempt ++;
         }
@@ -243,7 +244,7 @@
     uint32_t runtime = 0;
     while(!received && runtime < timeout) {
         runtime = (t.read_ms() - startmillis);
-        if (ATwaitForWord("+CUSD: 0",ATTIMEOUT_SHORT)) {
+        if (ATwaitForWord("+CUSD: 0",ATTIMEOUT_LONG)) {
             led1 = 0;
             if (ATgetResponse('\r',ATTIMEOUT_SHORT)) {  
                 if ( (matchCount = sscanf(ATinBuffer,",\"%d#%[^#]",USSDmessageIndex,ATinBuffer) ) > 0 ) {
--- a/modem.h	Wed Jan 16 21:27:28 2019 +0000
+++ b/modem.h	Wed Jan 16 23:06:39 2019 +0000
@@ -19,7 +19,7 @@
             ~Modem();
             
             //control
-            bool on(void);
+            bool on(bool force2G);
             void off(bool soft);
              
             //funcs