init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Revision:
39:f767b8037475
Parent:
38:476a9b5629a1
Child:
40:4270e09e59f2
--- a/main.cpp	Wed Jan 16 23:06:39 2019 +0000
+++ b/main.cpp	Thu Jan 17 15:20:14 2019 +0000
@@ -3,7 +3,7 @@
 //------------------------------------------------------------------------------
 //DEFINES
 //------------------------------------------------------------------------------ 
-#define FW_VERSION          11
+#define FW_VERSION          14
 #define SKU                 "GPSPLUS"
 #define HW_MAJORREVISION    "001"
 
@@ -70,6 +70,7 @@
 uint16_t         RET_setting_beacon_interval_seconds;
 uint16_t         RET_setting_beacon_scan;
 //STATE
+bool             RET_asleep = false;
 uint8_t          RET_coldBoot = 1;
 time_t           RET_RTCunixtime;
 bool             RET_haveSettings;
@@ -81,6 +82,7 @@
 time_t           RET_SetupRunAt;
 time_t           RET_SettingsGotAt;
 bool             RET_force2G;
+bool             RET_watchdogfired;
 //MOTION STATE
 bool             RET_motionTriggered;
 bool             RET_motionTriggeredInTXInterval;
@@ -233,45 +235,54 @@
 void RTCtick() {
     //YOU MUST NOT CALL ANY OTHER FUNCTIONS OR DEBUG FROM INSIDE HERE!!! OR IT LOCKS UP THE DEVICE, just change vars
     RET_RTCunixtime += 1;
-    
-    //button logic - check for hold
-    if (RET_buttonHoldTime > 4) {
-        RET_buttonHoldTime = 0;
-        RET_buttonPressCount = 0;
-        RET_state_prev = RET_state;
-        RET_state = STATE_BUTTONHOLD;
-        mainthread.release();
-    } else {
-        if((RET_RTCunixtime - RET_buttonPressTime) > 1) {
-            switch (RET_buttonPressCount) {   
-                case 1 :
-                    if (RET_state == STATE_NORMAL) {
-                        RET_state = STATE_BUTTONPRESS1;
-                        mainthread.release();
-                    }
-                    break;
-                case 3 :
-                    if (RET_state == STATE_NORMAL) {
-                        RET_state = STATE_BUTTONPRESS2;
-                        mainthread.release();
-                    }
-                    break;
-                case 5 :
-                    if (RET_state == STATE_NORMAL) {
-                        RET_state = STATE_BUTTONPRESS3;
-                        mainthread.release();
-                    }
-                    break;
-                default :
-                    //do nothing
-                    break;
+
+    //button logic, only when device asleep
+    if (RET_asleep == true) {
+        //hold check
+        if (RET_buttonHoldTime > 4 && RET_buttonHoldTime < 10) {
+            RET_buttonHoldTime = 0;
+            RET_buttonPressCount = 0;
+            RET_state_prev = RET_state;
+            RET_state = STATE_BUTTONHOLD;
+            mainthread.release();
+        } else if (RET_buttonHoldTime > 14 && RET_buttonHoldTime < 30) {
+            RET_buttonHoldTime = 0;
+            RET_buttonPressCount = 0;
+            RET_state_prev = RET_state;
+            RET_state = STATE_SCORCHEDEARTH;
+            mainthread.release();
+        } else {
+            if((RET_RTCunixtime - RET_buttonPressTime) > 1) {
+                switch (RET_buttonPressCount) {   
+                    case 1 :
+                        if (RET_state == STATE_NORMAL) {
+                            RET_state = STATE_BUTTONPRESS1;
+                            mainthread.release();
+                        }
+                        break;
+                    case 3 :
+                        if (RET_state == STATE_NORMAL) {
+                            RET_state = STATE_BUTTONPRESS2;
+                            mainthread.release();
+                        }
+                        break;
+                    case 5 :
+                        if (RET_state == STATE_NORMAL) {
+                            RET_state = STATE_BUTTONPRESS3;
+                            mainthread.release();
+                        }
+                        break;
+                    default :
+                        //do nothing
+                        break;
+                }
+                RET_buttonPressCount = 0;
             }
-            RET_buttonPressCount = 0;
         }
-    }
-    //SETUP STATE VISUALISE
-    if (!GLOBAL_LEDSequenceinProgress && RET_state == STATE_SETUP) {
-        led1 = !led1; 
+        //SETUP STATE VISUALISE
+        if (!GLOBAL_LEDSequenceinProgress && RET_state == STATE_SETUP) {
+            led1 = !led1; 
+        }
     }
 }
 void resetGlobals() {
@@ -281,15 +292,22 @@
 }
 void healthCheck() {
     //check clock
-    if(RET_havesettings == 1) {
-        if (RET_RTCunixtime < 1547678732) { 
+    if(RET_haveSettings == 1) {
+        if (RET_RTCunixtime < 1547678732) {
             //go dormant for 72hrs and then resetup
-            RET_havesettings = 0; setState(STATE_DORMANT);
+            RET_haveSettings = 0; 
+            setState(STATE_DORMANT);
         }
     }
+    //check for watchdog fire
+    if (RET_watchdogfired == true) {
+        addToExceptionString("WD");
+        RET_watchdogfired = false;
+    }
 }
 void setDefaults() {
     //STATE
+    RET_asleep = false;
     RET_haveSettings = 0;
     RET_state = STATE_SETUP;
     RET_state_prev = RET_state;
@@ -297,6 +315,7 @@
     RET_SetupRunAt = 0;
     RET_SettingsGotAt = 0;
     RET_force2G = DEFAULT_FORCE2G;
+    RET_watchdogfired = false;
     //SETTINGS
     RET_setting_firmware = 0;
     RET_setting_minimumupdate_hrs = 0;
@@ -625,6 +644,35 @@
     saveEventTimes();
 }
 
+void event_turnonofflog_tx(bool turnon) {
+    DEBUG("TEST EVENT\n",false);
+    float temperature = getTemperature();
+    float voltage = getBatteryV();
+    if (modem.on(RET_force2G)) {
+        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];
+            if (turnon) {
+                snprintf(bytestosend,sizeof(bytestosend),"(%s,a:error,f:%d,t:%.1f,v:%.2f,z:TURNON,e:%d,c:1,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,voltage,timetaken,locString);
+            } else {
+                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));
+        } else {
+            modem.off(false);  
+        }
+    } else {
+        modem.off(false);
+    }
+    modem.off(false);
+    //RESETS
+    RET_motionTriggeredInTXInterval = 0;
+}
+
 void event_location_tx() {
     DEBUG("LOCATION TX\n",false);
     float temperature = getTemperature();
@@ -797,6 +845,7 @@
                 DEBUG("TURNING OFF\n",false);
                 DEBUG("STATE:DORMANT until %u\n",RET_eventTime_wakeFromDormant);
                 LED1on(5000);
+                event_turnonofflog_tx(false);
             } else {
                 if (RET_haveSettings) {
                     setState(STATE_NORMAL);
@@ -805,9 +854,20 @@
                 }
                 DEBUG("TURNING ON\n",false);
                 LED1blink(20,100);
+                event_turnonofflog_tx(true);
             }
             break;
         }
+        case STATE_SCORCHEDEARTH :
+        {
+            setState(STATE_SETUP); //this wont be used but just incase to kick it out of this state
+            read_app_data_from_flash(&app_data);
+            app_data.current_firmware_version = 0;
+            app_data.target_firmware_version = 0;
+            write_app_data_to_flash(&app_data);
+            system_reset();
+            break;
+        }
         default :
         {
             setState(STATE_SETUP);
@@ -834,15 +894,15 @@
     if (NRF_POWER->RESETREAS != 0xffffffff) {
         switch(NRF_POWER->RESETREAS) {
             case 0x00000001  :
-                DEBUG("0x%08x. Hard Reset ST:%d\n",NRF_POWER->RESETREAS, RET_state);
+                //DEBUG("0x%08x. Hard Reset ST:%d\n",NRF_POWER->RESETREAS, RET_state);
                 RET_coldBoot = 1;
-                dumpSettings();
             break;
             case 0x00000002  :
-                DEBUG("Watchdog ST:%d\n",RET_state);
+                //DEBUG("Watchdog ST:%d\n",RET_state);
+                RET_watchdogfired = true;
             break;
             case 0x00000004  :
-                DEBUG("Soft ST:%d\n",RET_state);
+                //DEBUG("Soft ST:%d\n",RET_state);
             break;
         }
         NRF_POWER->RESETREAS = 0xffffffff;
@@ -867,18 +927,23 @@
     while(true) {
         //WATCHDOG
         watchdogKick();
+        RET_asleep = false;
         
         //INIT
         resetGlobals();
-        healthCheck();
+        healthCheck(); //this must be after resetGlobals
         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, 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();
+            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), "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();
+            }
         }
 
         mainStateEngine();
@@ -911,6 +976,7 @@
         watchdogKick();
         
         //SLEEP
+        RET_asleep = true;
         mainthread.wait(DEFAULT_SLEEP_FRAME);
     }
 }
\ No newline at end of file