init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Revision:
38:476a9b5629a1
Parent:
37:505ef618f06c
Child:
39:f767b8037475
diff -r 505ef618f06c -r 476a9b5629a1 main.cpp
--- 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();