init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Revision:
13:29f67f256709
Parent:
12:8345612bf867
Child:
14:9a54b1b65bc8
diff -r 8345612bf867 -r 29f67f256709 main.cpp
--- a/main.cpp	Sun Dec 16 01:06:14 2018 +0000
+++ b/main.cpp	Sun Dec 16 15:21:38 2018 +0000
@@ -12,51 +12,56 @@
 //------------------------------------------------------------------------------
 //GLOBAL VARS / CLEARED ON SLEEP (IF USING SOFT REBOOT HACK)
 //------------------------------------------------------------------------------ 
-bool accel_healthy = false;
-bool requireSoftReset = false;
-bool motionFlagTriggered = false;
-bool debugLED = false;
-bool needToConfigureLis3dh = false;
+bool GLOBAL_accel_healthy = false;
+bool GLOBAL_requireSoftReset = false;
+bool GLOBAL_motionFlagTriggered = false;
+bool GLOBAL_debugLED = false;
+bool GLOBAL_needToConfigureLis3dh = false;
+bool GLOBAL_registeredOnNetwork = false;
+long long GLOBAL_imei = 0;
+float GLOBAL_voltage = 0.0;
+time_t GLOBAL_RTCunixtime = 0;
+time_t GLOBAL_wakeTime = 0;
 
 //------------------------------------------------------------------------------
 //RETAINED NOINIT RAM VARS
 //------------------------------------------------------------------------------ 
-#if defined ( __CC_ARM ) /** THIS IS THE MBED ONLINE COMPILER TOOLCHAIN*/
-static uint8_t          RET_coldBoot                    __attribute__((section("noinit"),zero_init));
-static uint8_t          RET_mode                    __attribute__((section("noinit"),zero_init));
-static uint8_t          RET_mode_prev                    __attribute__((section("noinit"),zero_init));
-static uint8_t          RET_buttonPressCount      __attribute__((section("noinit"),zero_init));
-static time_t           RET_buttonPressTime         __attribute__((section("noinit"),zero_init));
-static time_t           RET_buttonReleaseTime       __attribute__((section("noinit"),zero_init));
-static time_t           RET_buttonHoldTime       __attribute__((section("noinit"),zero_init));
-static time_t           RET_RTCunixtime         __attribute__((section("noinit"),zero_init));
-static long             RET_RTCmicros         __attribute__((section("noinit"),zero_init));
-static bool             RET_requireImpactFlag       __attribute__((section("noinit"),zero_init));
-static char             RET_buffer[64]              __attribute__((section("noinit"),zero_init));
-
+#if defined ( __CC_ARM ) /** THIS IS THE MBED ONLINE COMPILER TOOLCHAIN*/ //MUST BE STATICS
+//IDENTITY
+static long long        RET_imei                            __attribute__((section("noinit"),zero_init));
+//STATE
+static uint8_t          RET_coldBoot                        __attribute__((section("noinit"),zero_init));
+static uint8_t          RET_mode                            __attribute__((section("noinit"),zero_init));
+static uint8_t          RET_mode_prev                       __attribute__((section("noinit"),zero_init));
+static uint8_t          RET_buttonPressCount                __attribute__((section("noinit"),zero_init));
+static time_t           RET_buttonPressTime                 __attribute__((section("noinit"),zero_init));
+static time_t           RET_buttonReleaseTime               __attribute__((section("noinit"),zero_init));
+static time_t           RET_buttonHoldTime                  __attribute__((section("noinit"),zero_init));
+static time_t           RET_RTCunixtime                     __attribute__((section("noinit"),zero_init));
+static long             RET_RTCmicros                       __attribute__((section("noinit"),zero_init));
+static bool             RET_requireImpactFlag               __attribute__((section("noinit"),zero_init));
 //MOTION SETTINGS
-static bool             RET_impactTriggered              __attribute__((section("noinit"),zero_init));
-static bool             RET_motionTriggered              __attribute__((section("noinit"),zero_init));
-static time_t           RET_motionStartTime              __attribute__((section("noinit"),zero_init));
-static time_t           RET_motionStopTime              __attribute__((section("noinit"),zero_init));
+static bool             RET_impactTriggered                 __attribute__((section("noinit"),zero_init));
+static bool             RET_motionTriggered                 __attribute__((section("noinit"),zero_init));
+static time_t           RET_motionStartTime                 __attribute__((section("noinit"),zero_init));
+static time_t           RET_motionStopTime                  __attribute__((section("noinit"),zero_init));
 static time_t           RET_motionStartThreshold_seconds    __attribute__((section("noinit"),zero_init));
 static time_t           RET_motionStopThreshold_seconds     __attribute__((section("noinit"),zero_init));
-static bool             RET_motionPendingOnState              __attribute__((section("noinit"),zero_init));
-static bool             RET_motionPendingOffState              __attribute__((section("noinit"),zero_init));
-static bool             RET_motionState              __attribute__((section("noinit"),zero_init));
-static float            RET_motionTotalActivityHours     __attribute__((section("noinit"),zero_init));
-static char             RET_motionData[100]              __attribute__((section("noinit"),zero_init));
-
+static bool             RET_motionPendingOnState            __attribute__((section("noinit"),zero_init));
+static bool             RET_motionPendingOffState           __attribute__((section("noinit"),zero_init));
+static bool             RET_motionState                     __attribute__((section("noinit"),zero_init));
+static float            RET_motionTotalActivityHours        __attribute__((section("noinit"),zero_init));
+static char             RET_motionData[100]                 __attribute__((section("noinit"),zero_init));
 //EVENT HANDLING
 static time_t           RET_eventInterval_location_log      __attribute__((section("noinit"),zero_init));
-static time_t           RET_eventTime_location_log      __attribute__((section("noinit"),zero_init));
-static time_t           RET_eventTime_location_bc      __attribute__((section("noinit"),zero_init));
+static time_t           RET_eventTime_location_log          __attribute__((section("noinit"),zero_init));
+static time_t           RET_eventTime_location_bc           __attribute__((section("noinit"),zero_init));
 
 static time_t           RET_eventInterval_environmental_log __attribute__((section("noinit"),zero_init));
-static time_t           RET_eventTime_environmental_log __attribute__((section("noinit"),zero_init));
-static time_t           RET_eventTime_environmental_bc __attribute__((section("noinit"),zero_init));
-static time_t           RET_eventTime_activity_bc      __attribute__((section("noinit"),zero_init));
-static time_t           RET_eventTime_wakeFromDormant      __attribute__((section("noinit"),zero_init));
+static time_t           RET_eventTime_environmental_log     __attribute__((section("noinit"),zero_init));
+static time_t           RET_eventTime_environmental_bc      __attribute__((section("noinit"),zero_init));
+static time_t           RET_eventTime_activity_bc           __attribute__((section("noinit"),zero_init));
+static time_t           RET_eventTime_wakeFromDormant       __attribute__((section("noinit"),zero_init));
 #elif defined ( __GNUC__ )
 #elif defined ( __ICCARM__ )
 #endif
@@ -101,15 +106,15 @@
 void gotoSleep(long sleep_milliseconds) {
     turnOffEverything();
     watchdog.kick();
-    if (requireSoftReset) { //dont need to clear this var as reset changes it back to false
+    if (GLOBAL_requireSoftReset) { //dont need to clear this var as reset changes it back to false
         system_reset();
     }
     mainthread.wait(sleep_milliseconds);
 }
 void RTCtick() {
-    //RET_unixtime ++;
     RET_RTCmicros += 100;
     RET_RTCunixtime = (RET_RTCmicros / 1000);
+    GLOBAL_RTCunixtime = RET_RTCunixtime;
     //button logic - check for hold
     if (RET_buttonHoldTime > 4000) {
         RET_buttonHoldTime = 0;
@@ -139,12 +144,13 @@
     }
 }
 void factoryReset() {
-    //firstBoot = true;
-    requireSoftReset = false;
+    DEBUG("Factory Reset \n");
+    GLOBAL_requireSoftReset = false;
     
     //RESET RETAINED VARS
+    RET_imei = 0;
     RET_coldBoot = 1;
-    RET_mode = MODE_NORMAL;
+    RET_mode = MODE_SETUP;
     RET_mode_prev = RET_mode;
     RET_RTCunixtime = 0;
     RET_RTCmicros = 0;
@@ -173,10 +179,9 @@
     
     //CONFIGURE ACCELL DEFAULT
     lis3dh_configureForSleep(10,127);
-    
-    //SET IDENTIFIER
-    //uint32_t nv_value = 12345678;
-    //int rc = nvstore.set(NV_IDENTIFIER, sizeof(nv_value), &nv_value);
+}
+void copyRETtoGLOBAL() {
+    GLOBAL_imei = RET_imei;   
 }
 void selfTest() {
     //Accelerometer
@@ -207,44 +212,81 @@
 //------------------------------------------------------------------------------ 
 void checkMotion() {
     if (lis3dh_int2) {
-        if (debugLED) LED1blink(2,100);
+        if (GLOBAL_debugLED) LED1blink(2,100);
         RET_motionTriggered = true;
-        needToConfigureLis3dh = true; //interrupt has fire so need to clear it
+        GLOBAL_needToConfigureLis3dh = true; //interrupt has fire so need to clear it
         if (!RET_motionPendingOnState) {
             RET_motionPendingOnState = true;
             RET_motionPendingOffState = false;
             // Log start motion time
-            RET_motionStartTime = time(NULL);
+            RET_motionStartTime = RET_RTCunixtime;
         }
     } else {
-        if (debugLED) LED1blink(2,500);
+        if (GLOBAL_debugLED) LED1blink(2,500);
         RET_motionTriggered = false;
         RET_motionPendingOnState = false;
         if (!RET_motionPendingOffState) {
             RET_motionPendingOffState = true;
             //log stop motion time
-            RET_motionStopTime = time(NULL);
+            RET_motionStopTime = RET_RTCunixtime;
         }
     }
     //calculate motion state
     if (RET_motionPendingOnState) {
         //check if above threshold
-        time_t inMotionForSeconds = (time(NULL) - RET_motionStartTime);
+        time_t inMotionForSeconds = (RET_RTCunixtime - RET_motionStartTime);
         if (inMotionForSeconds >= RET_motionStartThreshold_seconds) {
             RET_motionState = true;
-            if (debugLED) LED1blink(10,100);
+            if (GLOBAL_debugLED) LED1blink(10,100);
         }
     }
     if (RET_motionPendingOffState) {
-        time_t noMotionForSeconds = (time(NULL) - RET_motionStopTime);
+        time_t noMotionForSeconds = (RET_RTCunixtime - RET_motionStopTime);
         if (noMotionForSeconds >= RET_motionStartThreshold_seconds) {
             RET_motionState = false;
             RET_motionTotalActivityHours += (float(RET_motionStopTime - RET_motionStartTime) / 3600.0); 
-            if (debugLED) LED1blink(5,500);
+            if (GLOBAL_debugLED) LED1blink(5,500);
         }
     }
 }
 
+
+//------------------------------------------------------------------------------
+// SETUP
+//------------------------------------------------------------------------------ 
+bool setup() {
+    bool pass = true;
+    Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN);
+    if (modem.on()) {
+        RET_imei = modem.getIMEI();
+        DEBUG("imei: %lld \n",RET_imei);
+        if (modem.registerOnNetwork(3,60000)) {
+                char* result = modem.USSDmessage("blahblah\0", true, 2);
+                if (result != "err") {
+                    DEBUG("result: %s \n",result);
+                }
+        } else {
+            //modem failed to register on network
+        }
+    } else {
+        pass = false;
+        //Modem failed to turn on   
+    }
+     
+    while (1) {
+        Thread::wait(60000);
+        watchdog.kick();
+    }
+    
+    //RESULT
+    if (pass) {
+        return true;
+    } else {
+        return false;   
+    }
+}
+
+
 //------------------------------------------------------------------------------
 // STATE ENGINE
 //------------------------------------------------------------------------------ 
@@ -252,7 +294,9 @@
     switch(RET_mode) {
         case MODE_SETUP :
             factoryReset();
-            //selftest();
+            if (setup()) {
+                RET_mode = MODE_NORMAL;
+            }
             break;
         case MODE_NORMAL :
             //check and log motion
@@ -312,7 +356,6 @@
 //------------------------------------------------------------------------------
 // MAIN
 //------------------------------------------------------------------------------ 
-
 int main() {
     RTCticker.attach(&RTCtick, 0.1);
     turnOffEverything();
@@ -326,7 +369,7 @@
         switch(NRF_POWER->RESETREAS) {
             case 0x00000001  :
                 DEBUG("reset_reason: 0x%08x. - Hard Reset\n",NRF_POWER->RESETREAS);
-                factoryReset();
+                RET_coldBoot = 1;
             break;
             case 0x00000002  :
                 DEBUG("reset_reason: 0x%08x. - Watchdog\n",NRF_POWER->RESETREAS);
@@ -340,58 +383,29 @@
     //CHECK FOR FIRST BOOT
     if (RET_coldBoot != 0) factoryReset();
     
+    copyRETtoGLOBAL();
+    
     while(true) {
         //SLEEP
-        if (RET_coldBoot != 1) gotoSleep(30000); //THIS HAS TO BE THE FIRST ITEM IN THE MAIN LOOP
+        if (RET_coldBoot != 1) gotoSleep(10000); //THIS HAS TO BE THE FIRST ITEM IN THE MAIN LOOP
         watchdog.kick();
         
-        //TEST SPACE
-        Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN);
-        if (modem.on()) {
-            if (modem.registerOnNetwork(3,60000)) {
-                    if (modem.USSDsend("blahblah", 2)) {
-                        while(1) {
-                        char* response = modem.USSDreceive(105000);
-                        DEBUG("response: %s",response);
-                        }
-                    }
-            } else {
-                //modem failed to register on network
-            }
-        } else {
-            //Modem failed to turn on   
-        }
-        
-        
-        
-        while (1) {
-            Thread::wait(60000);
-            watchdog.kick();
-        }
-        
+        //LOG START TIME
+        GLOBAL_wakeTime = RET_RTCunixtime;
         
         //MAIN LOGIC
         DEBUG("mode: %i  time: %i, %i, %i, %i \n", RET_mode, RET_RTCmicros, RET_RTCunixtime, RET_buttonHoldTime, RET_buttonPressCount);
+        
+        Thread::wait(5000);
+        RET_coldBoot = 0;
+        system_reset();
+        
         mainStateEngine();
         
         //PRE-SLEEP ACTIONS
-        if (needToConfigureLis3dh) { //ONLY RESET ACCELL IF WE NEED TO
+        if (GLOBAL_needToConfigureLis3dh) { //ONLY RESET ACCELL IF WE NEED TO
             lis3dh_configureForSleep(10,127);
         }
         RET_coldBoot = 0;
-        
-        
-        /*
-        firstBoot = false; //temp
-        if (!firstBoot) gotoSleep(10000);
-        
-        //INIT
-        //Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN);
-        
-        //MAIN STATE ENGINE
-        
-        //Configure for sleep
-        lis3dh_configureForSleep(10,127);
-        */
     }
 }
\ No newline at end of file