init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Revision:
40:4270e09e59f2
Parent:
39:f767b8037475
Child:
41:07e41dbd5304
--- a/main.cpp	Thu Jan 17 15:20:14 2019 +0000
+++ b/main.cpp	Thu Jan 17 21:59:18 2019 +0000
@@ -3,7 +3,7 @@
 //------------------------------------------------------------------------------
 //DEFINES
 //------------------------------------------------------------------------------ 
-#define FW_VERSION          14
+#define FW_VERSION          21
 #define SKU                 "GPSPLUS"
 #define HW_MAJORREVISION    "001"
 
@@ -70,8 +70,8 @@
 uint16_t         RET_setting_beacon_interval_seconds;
 uint16_t         RET_setting_beacon_scan;
 //STATE
+uint8_t          RET_coldBoot = 1;
 bool             RET_asleep = false;
-uint8_t          RET_coldBoot = 1;
 time_t           RET_RTCunixtime;
 bool             RET_haveSettings;
 uint8_t          RET_state;
@@ -84,7 +84,7 @@
 bool             RET_force2G;
 bool             RET_watchdogfired;
 //MOTION STATE
-bool             RET_motionTriggered;
+bool             RET_motionTriggeredinFrame;
 bool             RET_motionTriggeredInTXInterval;
 time_t           RET_motionStartTime;
 time_t           RET_motionStopTime;
@@ -338,7 +338,7 @@
     RET_buttonPressTime = 0;
     RET_buttonHoldTime = 0;
     //MOTION STATE
-    RET_motionTriggered = 0;
+    RET_motionTriggeredinFrame = 0;
     RET_motionTriggeredInTXInterval = 0;
     RET_motionStartTime = 0;
     RET_motionStopTime = 0;
@@ -407,7 +407,7 @@
 void checkMotion() {
     if (lis3dh_int2) {
         //if (GLOBAL_debugLED) LED1blink(1,50);
-        RET_motionTriggered = true;
+        RET_motionTriggeredinFrame = true;
         GLOBAL_needToConfigureLis3dh = true; //interrupt has fire so need to clear it
         if (!RET_motionPendingOnState) {
             RET_motionPendingOnState = true;
@@ -416,7 +416,7 @@
             RET_motionStartTime = RET_RTCunixtime;
         }
     } else {
-        RET_motionTriggered = false;
+        RET_motionTriggeredinFrame = false;
         RET_motionPendingOnState = false;
         if (!RET_motionPendingOffState) {
             RET_motionPendingOffState = true;
@@ -444,7 +444,7 @@
             RET_motionPendingOffState = false;
             RET_motionState = false;
             GLOBAL_motionStopFlagTriggered = true;
-            RET_motionTotalActivityHours += (float(RET_motionStopTime - RET_motionStartTime) / 3600.0); 
+            RET_motionTotalActivityHours += (float(RET_motionStopTime - RET_motionStartTime) / 3600.0f); 
             if (GLOBAL_debugLED) LED1blink(2,50);
             if (RET_setting_location_tx_failsafe_hrs > 0) {
                 time_t epochOffsetMins = ((RET_RTCunixtime - RET_motionFrameStart) / 60);
@@ -476,7 +476,7 @@
         if(TEMP_a != -1) { RET_setting_minimumupdate_hrs = TEMP_a;                 changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_minimumupdate_hrs:%u..%c\n",RET_setting_minimumupdate_hrs,changed);
         if(TEMP_b != 0)  { RET_RTCunixtime = TEMP_b; changed = 'Y';                               } else { changed = 'N'; critical_fail_count++; }; DEBUG("RET_RTCunixtime:%u..%c\n",RET_RTCunixtime,changed);
         if(TEMP_c != -1) { RET_setting_firmware = TEMP_c;                          changed = 'Y'; } else { changed = 'N'; RET_setting_firmware = -1;}; DEBUG("RET_setting_firmware:%d..%c\n",RET_setting_firmware,changed);
-        if(TEMP_d != -1) { setState(TEMP_d);                                       changed = 'Y'; } else { changed = 'N'; critical_fail_count++; }; DEBUG("RET_state:%d..%c\n",RET_state,changed);
+        if(TEMP_d != -1) { setState(TEMP_d);                                       changed = 'Y'; } else { setState(STATE_NORMAL); changed = 'N'; }; DEBUG("RET_state:%d..%c\n",RET_state,changed);
         if(TEMP_e != -1) { RET_setting_location_mode = TEMP_e;                     changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_mode:%d..%c\n",RET_setting_location_mode,changed);
             if(RET_setting_location_mode > 3) {RET_setting_location_mode = DEFAULT_LOCATION_MODE;}
         if(TEMP_f != -1) { RET_setting_location_accuracy = TEMP_f;                 changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_accuracy:%d..%c\n",RET_setting_location_accuracy,changed);
@@ -501,7 +501,7 @@
         
         if (critical_fail_count == 0) { 
             if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "GOT SETTINGS OK");debug_exe();}
-            dumpSettings(); 
+            dumpSettings();
             saveEventTimes();
             RET_haveSettings = true;
             GLOBAL_needToConfigureLis3dh = true;
@@ -552,6 +552,19 @@
 }
 
 //------------------------------------------------------------------------------
+// ERROR LOG
+//------------------------------------------------------------------------------ 
+void sendErrorLog(char* error) {
+    float voltage = getBatteryV();
+    int timetaken = (RET_RTCunixtime - GLOBAL_wakeTime);
+    char bytestosend[100];
+    memset(bytestosend,0x00,sizeof(bytestosend));
+    snprintf(bytestosend,sizeof(bytestosend),"(%s,a:error,f:%d,v:%.2f,e:%d,z:%s,c:1,s:0)\0",GLOBAL_defaultApi,FW_VERSION,voltage,timetaken,error);
+    modem.USSDmessage(bytestosend, false, 2, GLOBAL_defaultApi);
+    ThisThread::sleep_for(250);
+}
+
+//------------------------------------------------------------------------------
 // SETUP
 //------------------------------------------------------------------------------ 
 bool setup() {
@@ -561,14 +574,12 @@
     bool selftestresult = selfTest();
     if (selftestresult == false) { LED1errorCode(4,20); } //ERROR 4
     if (modem.on(RET_force2G)) {
-        //RET_imei = modem.getIMEI();
-        //DEBUG("imei: %lld \n",RET_imei);
         char locString[70];
         memcpy(locString, modem.getLocation(1, RET_setting_location_timeout), 70);
         if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,(RET_setting_connection_timeout*1000))) {
             int timetaken = (RET_RTCunixtime - GLOBAL_wakeTime) + 10; //add 10 for ussd response time.
             char bytestosend[160];
-            snprintf(bytestosend,sizeof(bytestosend),"(%s,a:setup,f:%d,v:%.2f,t:%.1f,e:%d,z:SETUP-%s,c:1,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,voltage,temperature,timetaken,GLOBAL_exceptionString,locString);
+            snprintf(bytestosend,sizeof(bytestosend),"(%s,a:setup,f:%d,v:%.2f,t:%.1f,e:%d,z:SETUP-%s,k:%s,m:%s,c:1,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,voltage,temperature,timetaken,GLOBAL_exceptionString,SKU,HW_MAJORREVISION,locString);
             char result[200];
             snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, true, 2, GLOBAL_defaultApi));
             if (strcmp(result, "err") != 0) {
@@ -578,9 +589,11 @@
                     pass = false;
                     modem.off(false);
                     if(GLOBAL_debugLED) LED1errorCode(5,10); //ERROR 5
-                }                           
+                    sendErrorLog("SETTINGS");
+                }                      
             } else {
                 //Response error
+                sendErrorLog("RESPONSE");
             }
         } else {
             //FAILUREMODE modem failed to register on network
@@ -624,11 +637,15 @@
             bool getSettings = true;
             snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, getSettings, 2, GLOBAL_defaultApi));
             if (result != "err") {
-                //DEBUG("\nfromserver: %s \n",result);
                 if (getSettings) {
-                    saveSettings(result);
-                    if(GLOBAL_debugLED) LED1blink(5,250);
+                    if (saveSettings(result)) {
+                        if(GLOBAL_debugLED) LED1blink(5,250);
+                    } else {
+                        sendErrorLog("SETTINGS");
+                    }
                 }
+            } else {
+                sendErrorLog("RESPONSE");
             }
         } else {
             modem.off(false);
@@ -660,8 +677,7 @@
                 snprintf(bytestosend,sizeof(bytestosend),"(%s,a:error,f:%d,t:%.1f,v:%.2f,z:TURNOFF,e:%d,c:1,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,voltage,timetaken,locString);
             }
             char result[180];
-            bool getSettings = false;
-            snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, getSettings, 2, GLOBAL_defaultApi));
+            snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, false, 2, GLOBAL_defaultApi));
         } else {
             modem.off(false);  
         }
@@ -685,11 +701,9 @@
         //SEND DATA
         if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,(RET_setting_connection_timeout*1000))) {
             int timetaken = (RET_RTCunixtime - GLOBAL_wakeTime) + 10; //add 10 for ussd response time 
-            
             //Check if we should wait for settings back
             bool getSettings = true;
             if (  ((RET_RTCunixtime - RET_SettingsGotAt)/3600) < RET_setting_minimumupdate_hrs  ) { getSettings = false; timetaken -= 10;} //remove the extra 10 seconds from times
-            
             char bytesToSend[160];
             snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:loc,f:%d,t:%.1f,v:%.2f,z:LOC-%s,e:%d,c:1,s:%d%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,voltage,GLOBAL_exceptionString,timetaken,getSettings,locString);
             char result[180];
@@ -698,7 +712,11 @@
                 //DEBUG("\nfromserver: %s \n",result);
                 if (getSettings) {
                     saveSettings(result);
+                } else {
+                    sendErrorLog("SETTINGS");   
                 }
+            } else {
+                sendErrorLog("RESPONSE");
             }
         } else {
             modem.off(false);
@@ -717,6 +735,7 @@
 void event_activity_tx() {
     DEBUG("ACTIVITY TX\n",false);
     float temperature = getTemperature();
+    float voltage = getBatteryV();
     if (modem.on(RET_force2G)) {
         //SEND DATA
         if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,(RET_setting_connection_timeout*1000))) {
@@ -755,6 +774,7 @@
             DEBUG("STATE:SETUP\n",false);
             if (setup()) {
                 // All good
+                setState(STATE_NORMAL);
             } else {
                 RET_eventTime_wakeFromDormant = (RET_RTCunixtime + (24*3600)); //24hrs
                 setState(STATE_DORMANT);
@@ -766,9 +786,6 @@
         {
             DEBUG("STATE:NORMAL\n",false);
             
-            //check and log motion
-            checkMotion();
-            
             //LOCATION EVENT
             bool run_location_tx = false;
             switch (RET_setting_location_mode) {
@@ -776,7 +793,13 @@
                     if(RET_RTCunixtime >= RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { run_location_tx = true; }
                     break;
                 case 2: //INTERVAL POST WITH MOTION CHECK
-                    if(RET_motionTriggeredInTXInterval && RET_RTCunixtime >= RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { run_location_tx = true; }
+                    if(RET_RTCunixtime >= RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { 
+                        if (RET_motionTriggeredInTXInterval) {
+                            run_location_tx = true;
+                        } else {
+                             if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Skip TX due to no motion\n");debug_exe();}
+                        }
+                    }
                     break;
                 case 3: //POST ON STOP MOTION
                     if (GLOBAL_motionStopFlagTriggered) { run_location_tx = true; GLOBAL_motionStopFlagTriggered = false; }
@@ -913,7 +936,7 @@
         setDefaults(); 
         //check battery
         float voltage = getBatteryV();
-        if (voltage > 2.5) {
+        if (voltage > 2.5f) {
             //battery ok
             LED1errorCode(6,2);
         } else {
@@ -927,6 +950,7 @@
     while(true) {
         //WATCHDOG
         watchdogKick();
+        LED1off();
         RET_asleep = false;
         
         //INIT
@@ -934,15 +958,18 @@
         healthCheck(); //this must be after resetGlobals
         GLOBAL_wakeTime = RET_RTCunixtime;
         
+        //check and log motion
+        if (RET_state == STATE_NORMAL) { checkMotion(); }
+        
         //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){
             if (RET_state != 99) {
-                debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ST:%d, SETTINGS:%d, MOT: %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), "FW:%d,ST:%d, SET:%d, MOTFR:%d, MOTST: %d, RTC:%u, LOC:%u, LOCFS:%u, ACT:%u \n", FW_VERSION, RET_state, RET_haveSettings, RET_motionTriggeredinFrame, 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), "ACT:%s\n",RET_activityData);debug_exe();
             } else {
-                debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ST:%d, WAKE@:%u, \n", RET_state, RET_eventTime_wakeFromDormant);debug_exe();
+                debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "FW:%d, ST:%d, WAKE@:%u\n", FW_VERSION, RET_state, RET_eventTime_wakeFromDormant);debug_exe();
             }
         }
 
@@ -968,6 +995,7 @@
         }
         
         //PRE-SLEEP ACTIONS
+        RET_motionTriggeredinFrame = false;
         LED1off();
         if (GLOBAL_needToConfigureLis3dh) { lis3dh_configureForSleep(RET_setting_motion_g,RET_setting_impact_g); }
         modem.off(false);