init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Revision:
22:810425eb76e1
Parent:
21:e0b866630c27
Child:
23:a3b0ccf75ca5
diff -r e0b866630c27 -r 810425eb76e1 main.cpp
--- a/main.cpp	Thu Dec 20 22:04:45 2018 +0000
+++ b/main.cpp	Sat Dec 22 19:33:35 2018 +0000
@@ -24,6 +24,7 @@
 bool GLOBAL_debugLED = false;
 bool GLOBAL_needToConfigureLis3dh = false;
 bool GLOBAL_registeredOnNetwork = false;
+bool GLOBAL_modemOn = false;
 long long GLOBAL_imei = 0;
 float GLOBAL_voltage = 0.0;
 time_t GLOBAL_RTCunixtime = 0;
@@ -35,7 +36,6 @@
 #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));
-static char             RET_pf_identifier[7]                            __attribute__((section("noinit"),zero_init));
 //SETTINGS
 static int              RET_setting_firmware                            __attribute__((section("noinit"),zero_init));
 static uint8_t          RET_setting_location_mode                       __attribute__((section("noinit"),zero_init));
@@ -44,7 +44,7 @@
 static uint32_t         RET_setting_location_tx_failsafe_hrs            __attribute__((section("noinit"),zero_init));
 static uint16_t         RET_setting_location_timeout                    __attribute__((section("noinit"),zero_init));
 static uint8_t          RET_setting_activity_mode                       __attribute__((section("noinit"),zero_init));
-static uint32_t         RET_setting_activity_tx_interval_mins           __attribute__((section("noinit"),zero_init));
+static uint32_t         RET_setting_activity_tx_interval_hrs           __attribute__((section("noinit"),zero_init));
 static uint32_t         RET_setting_environmental_tx_interval_mins      __attribute__((section("noinit"),zero_init));
 static uint16_t         RET_setting_motion_g                            __attribute__((section("noinit"),zero_init));
 static time_t           RET_setting_motion_start_seconds                __attribute__((section("noinit"),zero_init));
@@ -75,8 +75,6 @@
 static bool             RET_motionState                                 __attribute__((section("noinit"),zero_init));
 static float            RET_motionTotalActivityHours                    __attribute__((section("noinit"),zero_init));
 static char             RET_activityData[130]                           __attribute__((section("noinit"),zero_init));
-//TO MAKE THE ABOVE BIGGER YOU NEED TO ALLOCATE MORE NOINIT MEMORY!!!!!
-
 //IMPACT
 static bool             RET_impactTriggered                             __attribute__((section("noinit"),zero_init));
 //EVENTS LOGGING
@@ -88,6 +86,8 @@
 static time_t           RET_eventTime_environmental_tx                  __attribute__((section("noinit"),zero_init));
 static time_t           RET_eventTime_activity_tx                       __attribute__((section("noinit"),zero_init));
 static time_t           RET_eventTime_wakeFromDormant                   __attribute__((section("noinit"),zero_init));
+//DUPLICATES
+static time_t           RET_RTCunixtime2                                __attribute__((section("noinit"),zero_init));
 #elif defined ( __GNUC__ )
 #elif defined ( __ICCARM__ )
 #endif
@@ -120,11 +120,6 @@
 Semaphore mainthread;
 
 //------------------------------------------------------------------------------
-//SINGLETONS
-//------------------------------------------------------------------------------
-//NVStore &nvstore = NVStore::get_instance();
-
-//------------------------------------------------------------------------------
 // LOW LEVEL FUNCS
 //------------------------------------------------------------------------------ 
 void turnOffEverything() {
@@ -144,14 +139,30 @@
     RET_state = state;
     DEBUG("STATEREADBACK %d\n",RET_state)
 }
+bool memoryIntegrityCheck() {
+    //Check clocks match and are in range
+    if (RET_RTCunixtime != RET_RTCunixtime && RET_RTCunixtime > 1545412457) {
+        RET_coldBoot = 1;
+        return false;  
+    } else {
+        return true;   
+    } 
+}
 void getBatteryV() {
     NRF52_SAADC batteryIn;
     batteryIn.addChannel(9); // vdd for battery
     batteryIn.calibrate();
-    for (uint8_t i = 1; i < 3; i++) { // need to get it 3 times to get accurate data, first one is always low for some reason
+    for (uint8_t i = 1; i <= 2; i++) { // need to get it 3 times to get accurate data, first one is always low for some reason
         batteryIn.updateData();
         GLOBAL_voltage = (batteryIn.getData()[0])*(1.0/1024.0)*3.65;
     }
+    DEBUG("Voltage:%.2f\n",GLOBAL_voltage);
+}
+float getTemperature() {
+    SI7060 si7060(PN_I2C_SDA, PN_I2C_SCL);
+    float temperature = si7060.getTemperature();
+    DEBUG("Temperature:%.2f\n",temperature);
+    return temperature;  
 }
 //------------------------------------------------------------------------------
 // USER BUTTON HANDLING
@@ -169,6 +180,8 @@
 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;
+    RET_RTCunixtime2 += 1;
+    
     GLOBAL_RTCunixtime = RET_RTCunixtime;
     
     //button logic - check for hold
@@ -210,22 +223,22 @@
     Thread::wait(200); //wait to ensure that devices are turned off
     //IDENTITY 
     RET_imei = 0;
-    memset(RET_pf_identifier,0,sizeof(RET_pf_identifier));
     //STATE
     RET_coldBoot = 1;
     RET_haveSettings = 0;
     RET_state = STATE_SETUP;
     RET_state_prev = RET_state;
     RET_RTCunixtime = 0;
+    RET_RTCunixtime = 2;
     RET_SetupRunAt = 0;
     //SETTINGS
     RET_setting_firmware = 0;
     RET_setting_location_mode = 2;
-    RET_setting_location_accuracy = 1;
+    RET_setting_location_accuracy = 2; // 0 = no location, 1 = cl only, 2 = gps then cl
     RET_setting_location_tx_interval_mins = 1440;
     RET_setting_location_tx_failsafe_hrs = (7*24); //7 days
     RET_setting_location_timeout = 240;
-    RET_setting_activity_tx_interval_mins = 0;
+    RET_setting_activity_tx_interval_hrs = 0;
     RET_setting_environmental_tx_interval_mins = 0;
     RET_setting_motion_g = 11;
     RET_setting_motion_start_seconds = 120;
@@ -255,6 +268,7 @@
     //EVENT HANDLING
     RET_eventTime_location_log = 0;
     RET_eventTime_location_tx = 0;
+    RET_eventTime_location_failsafe_tx = 0;
     RET_eventTime_environmental_log = 0;
     RET_eventTime_environmental_tx = 0;
     RET_eventTime_activity_tx = 0;
@@ -267,13 +281,29 @@
 void copyRETtoGLOBAL() {
     GLOBAL_imei = RET_imei; 
 }
-void selfTest() {
+bool selfTest() {
+    int test_count = 0;
+    int test_pass = 0;
+    
     //Accelerometer
+    test_count ++;
     LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK);
     uint8_t lis3dh_id; 
     lis3dh.LIS3DH_GetWHO_AM_I(&lis3dh_id);
-    if (lis3dh_id == 51) {
-        LED1blink(10,50);
+    if (lis3dh_id == 51) {test_pass ++;}
+    
+    //Temperature
+    test_count ++;
+    SI7060 si7060(PN_I2C_SDA, PN_I2C_SCL);
+    float temperature;
+    temperature = si7060.getTemperature();
+    test_pass ++;
+    
+    //Result
+    if (test_count == test_pass) {
+        return true;
+    } else {
+        return false;   
     }
 }
 
@@ -329,26 +359,25 @@
     //process result
     int matchCount = 0;
     int critical_fail_count = 0;
-    char TEMP_a[7]; time_t TEMP_b = 0; int TEMP_c = -1; int TEMP_d = -1; int TEMP_e = -1; int TEMP_f = -1; int TEMP_g = -1; int TEMP_h = -1; int TEMP_i = -1; int TEMP_j = -1; 
+    time_t TEMP_b = 0; int TEMP_c = -1; int TEMP_d = -1; int TEMP_e = -1; int TEMP_f = -1; int TEMP_g = -1; int TEMP_h = -1; int TEMP_i = -1; int TEMP_j = -1; 
     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:%c%c%c%c%c%c,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[0],&TEMP_a[1],&TEMP_a[2],&TEMP_a[3],&TEMP_a[4],&TEMP_a[5],&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("VALUES: a:%s,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 ( (matchCount = sscanf(settingsBuffer,"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_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("VALUES: 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_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);
         
         //FAILUREMODE need to be checking thse against checksums
         char changed;
         //FAILUREMODE need to verify the identifier against a reg exp or similar
-        if(1==1) { memcpy(RET_pf_identifier, TEMP_a, sizeof(TEMP_a));              changed = 'Y'; } else { changed = 'N'; critical_fail_count++; }; DEBUG("RET_pf_identifier:%s..%c\n",RET_pf_identifier,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_e != -1) { RET_setting_location_mode = TEMP_e;                     changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_accuracy:%d..%c\n",RET_setting_location_accuracy,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(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);
         if(TEMP_g != -1) { RET_setting_location_tx_interval_mins = TEMP_g;         changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_tx_interval_mins:%d..%c\n",RET_setting_location_tx_interval_mins,changed);
         if(TEMP_h != -1) { RET_setting_location_tx_failsafe_hrs = TEMP_h;          changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_tx_failsafe_hrs:%d..%c\n",RET_setting_location_tx_failsafe_hrs,changed);
         if(TEMP_i != -1) { RET_setting_location_timeout = TEMP_i;                  changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_timeout:%d..%c\n",RET_setting_location_timeout,changed);
-        if(TEMP_j != -1) { RET_setting_activity_tx_interval_mins = TEMP_j;         changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_activity_tx_interval_mins:%d..%c\n",RET_setting_activity_tx_interval_mins,changed);
+        if(TEMP_j != -1) { RET_setting_activity_tx_interval_hrs = TEMP_j;          changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_activity_tx_interval_hrs:%d..%c\n",RET_setting_activity_tx_interval_hrs,changed);
         if(TEMP_k != -1) { RET_setting_environmental_tx_interval_mins = TEMP_k;    changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_environmental_tx_interval_mins:%d..%c\n",RET_setting_environmental_tx_interval_mins,changed);
         if(TEMP_l != -1) { RET_setting_motion_g = TEMP_l;                          changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_motion_g:%d..%c\n",RET_setting_motion_g,changed);
         if(TEMP_m != -1) { RET_setting_motion_start_seconds = TEMP_m;              changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_motion_start_seconds:%d..%c\n",RET_setting_motion_start_seconds,changed);
@@ -375,16 +404,15 @@
     }
 }
 bool dumpSettings() {
-    DEBUG("RET_pf_identifier:%s \n",RET_pf_identifier);
     DEBUG("RET_RTCunixtime:%u \n",RET_RTCunixtime);
     DEBUG("RET_setting_firmware:%d \n",RET_setting_firmware);
     DEBUG("RET_state:%d \n",RET_state);
-    DEBUG("RET_setting_location_accuracy:%d \n",RET_setting_location_accuracy);
+    DEBUG("RET_setting_location_mode:%d \n",RET_setting_location_mode);
     DEBUG("RET_setting_location_accuracy:%d \n",RET_setting_location_accuracy);
     DEBUG("RET_setting_location_tx_interval_mins:%d \n",RET_setting_location_tx_interval_mins);
     DEBUG("RET_setting_location_tx_failsafe_hrs:%d \n",RET_setting_location_tx_failsafe_hrs);
     DEBUG("RET_setting_location_timeout:%d \n",RET_setting_location_timeout);
-    DEBUG("RET_setting_activity_tx_interval_mins:%d \n",RET_setting_activity_tx_interval_mins);
+    DEBUG("RET_setting_activity_tx_interval_hrs:%d \n",RET_setting_activity_tx_interval_hrs);
     DEBUG("RET_setting_environmental_tx_interval_mins:%d \n",RET_setting_environmental_tx_interval_mins);
     DEBUG("RET_setting_motion_g:%d \n",RET_setting_motion_g);
     DEBUG("RET_setting_motion_start_seconds:%d \n",RET_setting_motion_start_seconds);
@@ -405,8 +433,8 @@
         RET_eventTime_location_failsafe_tx = (RET_RTCunixtime + (RET_setting_location_tx_failsafe_hrs * 3600));
         DEBUG("EVENTSET - LOCATION FAILSAFE TX at %u\n",RET_eventTime_location_failsafe_tx);
     }
-    if(RET_setting_activity_tx_interval_mins > 0) { 
-        RET_eventTime_activity_tx = (RET_RTCunixtime + (RET_setting_activity_tx_interval_mins * 60));
+    if(RET_setting_activity_tx_interval_hrs > 0) { 
+        RET_eventTime_activity_tx = (RET_RTCunixtime + (RET_setting_activity_tx_interval_hrs * 3600));
         DEBUG("EVENTSET - ACTIVITY TX at %u\n",RET_eventTime_activity_tx);
     }
     if(RET_eventTime_environmental_tx > 0) { 
@@ -426,8 +454,9 @@
         GLOBAL_imei = RET_imei;
         DEBUG("imei: %lld \n",RET_imei);
         if (modem.registerOnNetwork(2,180000)) {
+            int timetaken = (RET_RTCunixtime - GLOBAL_wakeTime);
             char bytestosend[160];
-            snprintf(bytestosend,sizeof(bytestosend),"(%s,im:%lld,v:%.2f,fr:1,z:SETUP,c:1)\0",GLOBAL_defaultApi,GLOBAL_imei,GLOBAL_voltage);
+            snprintf(bytestosend,sizeof(bytestosend),"(%s,im:%lld,f:%d,v:%.2f,e:%d,fr:1,z:SETUP,c:1)\0",GLOBAL_defaultApi,GLOBAL_imei,FW_VERSION,GLOBAL_voltage,timetaken);
             char result[180];
             snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, true, 2, GLOBAL_defaultApi));
             if (result != "err") {
@@ -456,13 +485,61 @@
 //------------------------------------------------------------------------------
 // EVENTS
 //------------------------------------------------------------------------------ 
-void event_location_tx() {
-    DEBUG("PERFORM LOCATION TX\n");
+void event_shakertest_tx() {
+    DEBUG("SHAKER TEST\n");
     getBatteryV();  
+    float temperature = getTemperature();
+    bool selftestresult = selfTest();
     Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN, PN_GSM_WAKE_DISABLE);
     if (modem.on()) {
-        //RET_setting_location_accuracy
-        modem.getLocation(true, 3, true, RET_setting_location_timeout);
+        if (modem.registerOnNetwork(2,180000)) {
+            int timetaken = (RET_RTCunixtime - GLOBAL_wakeTime);
+            char bytestosend[160];
+            snprintf(bytestosend,sizeof(bytestosend),"(%s,f:%d,t:%.2f,v:%.2f,z:SHAKERTEST-%d,e:%d,c:1)\0",GLOBAL_defaultApi,FW_VERSION,temperature,GLOBAL_voltage,selftestresult,timetaken);
+            char result[180];
+            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);
+                }
+            }
+        }
+    }
+    //RESETS
+    RET_motionTriggeredInTXInterval = 0;
+    saveEventTimes();
+}
+
+void event_location_tx() {
+    DEBUG("LOCATION TX\n");
+    getBatteryV();
+    float temperature = getTemperature();
+    Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN, PN_GSM_WAKE_DISABLE);
+    if (modem.on()) {
+        int timetaken = (RET_RTCunixtime - GLOBAL_wakeTime);
+        char gpsString[70];
+        if (RET_setting_location_accuracy > 0) { 
+            snprintf(gpsString,sizeof(gpsString),"%s",modem.getLocation(RET_setting_location_accuracy, RET_setting_location_timeout));
+            DEBUG("\ngpsString:%s\n",gpsString);
+        } else {
+            DEBUG("localisation disabled\n");
+        }
+        //SEND DATA
+        if (modem.registerOnNetwork(2,180000)) {
+            char bytestosend[160];
+            snprintf(bytestosend,sizeof(bytestosend),"(%s,f:%d,t:%.2f,v:%.2f,z:OK,e:%d,c:1%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,GLOBAL_voltage,timetaken,gpsString);
+            char result[180];
+            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);
+                }
+            }
+        }
     }
     //RESETS
     RET_motionTriggeredInTXInterval = 0;
@@ -475,11 +552,12 @@
     switch(RET_state) {
         case STATE_SETUP :
             DEBUG("STATE:SETUP\n");
+            factoryReset();
             getBatteryV();
             if (setup()) {
                 copyRETtoGLOBAL();
             } else {
-                RET_eventTime_wakeFromDormant = (RET_RTCunixtime + (72*3600)); //72hrs
+                RET_eventTime_wakeFromDormant = (RET_RTCunixtime + (24*3600)); //24hrs
                 setState(STATE_DORMANT);
                 DEBUG("SETSTATE:DORMANT until %u\n",RET_eventTime_wakeFromDormant);
             }
@@ -490,63 +568,32 @@
             checkMotion();
             
             //EVENTS
-            
             //LOCATION
-            //Location Log
-            /*
-            if(RET_RTCunixtime > RET_eventTime_location_log && RET_eventTime_location_log > 0)  { 
-            }
-            */
             bool run_location_tx = false;
-            switch (RET_setting_location_mode) {
-                case 1: //INTERVAL POST
-                    if(RET_RTCunixtime > RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { 
-                        DEBUG("INTERVAL LOC TX...\n");
-                        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) {
-                        DEBUG("INTERVAL LOC TX WMC...\n"); 
-                        run_location_tx = true; 
-                    }
-                    break;
-                case 3: //POST ON STOP MOTION
-                    if (GLOBAL_motionStopFlagTriggered) {
-                        DEBUG("MOTION STOP LOC TX...\n");
-                        run_location_tx = true;
-                        GLOBAL_motionStopFlagTriggered = false;
-                    }
-                    break;   
+            if(RET_RTCunixtime >= RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { 
+                DEBUG("INTERVAL LOC TX...\n");
+                run_location_tx = true; 
             }
-            //Failsafe timer catchall
-            if(RET_RTCunixtime > RET_eventTime_location_failsafe_tx && RET_eventTime_location_failsafe_tx > 0) { run_location_tx = true; }
-            if (run_location_tx) {event_location_tx();}
+            //Location Failsafe timer catchall
+            if(RET_RTCunixtime >= RET_eventTime_location_failsafe_tx && RET_eventTime_location_failsafe_tx > 0) { run_location_tx = true; }
+            if (run_location_tx) {
+                event_location_tx();
+            }
             
-            //Environmental Log
-            if(RET_RTCunixtime > RET_eventTime_environmental_log && RET_eventTime_environmental_log > 0) {
-                /*
-                Filesystem filesystem(BD_PAGE_ADDRESS,BD_TOTAL_SIZE);
-                SI7060 temperature(PN_I2C_SDA,PN_I2C_SCL);
-                float temperature_c = temperature.getTemperature();
-                DEBUG("Temperature log: %u,%f \n", RET_RTCunixtime,temperature_c);
-                filesystem.addLogEntry_temperature(RET_RTCunixtime,temperature_c);
-                */
-            }
-            //Environmental TX
-            if(RET_RTCunixtime > RET_eventTime_environmental_tx && RET_eventTime_environmental_tx > 0) {
-                //getBatteryV();
-                //event_environmental_bc();
-                //Filesystem filesystem(PN_SPI_MOSI,PN_SPI_MISO,PN_SPI_CLK,PN_SPI_CS1);
-            }
-            //Activity TX
-            if(RET_RTCunixtime > RET_eventTime_activity_tx && RET_eventTime_activity_tx > 0) {
+            //ACTIVITY TX
+            if(RET_RTCunixtime >= RET_eventTime_activity_tx && RET_eventTime_activity_tx > 0) {
                 //event_activity_tx();
+                event_shakertest_tx();
             }
             break;
         case STATE_DORMANT :
-            if (RET_RTCunixtime > RET_eventTime_wakeFromDormant) {
-                setState(STATE_NORMAL);
+            if (RET_RTCunixtime >= RET_eventTime_wakeFromDormant) {
+                if (RET_haveSettings) {
+                    setState(STATE_NORMAL); 
+                } else {
+                    setState(STATE_SETUP); 
+                }
+                
                 DEBUG("WAKING UP FROM DORMANT\n");
             }
             DEBUG("STATE:DORMANT until %u\n",RET_eventTime_wakeFromDormant);
@@ -591,6 +638,7 @@
 //------------------------------------------------------------------------------ 
 int main() {
     turnOffEverything();
+    memoryIntegrityCheck();
     
     //CHECK IF THIS IS RESET
     //0x00000004 == soft reset  //0x00000002 == watchdog  //0x00000001 == button/hardreset 
@@ -622,24 +670,29 @@
     copyRETtoGLOBAL();
     
     while(true) {
-        //SLEEP
-        if (RET_coldBoot != 1) gotoSleep(10000); //THIS HAS TO BE THE FIRST ITEM IN THE MAIN LOOP
+        memoryIntegrityCheck();
         watchdogKick();
         
         //LOG START TIME
         GLOBAL_wakeTime = RET_RTCunixtime;
         
         //MAIN LOGIC
-        DEBUG("STATE:%d, RTC_SECONDS:%u, SETUPAT:%u\n", RET_state, RET_RTCunixtime,RET_SetupRunAt);
-        
-        event_location_tx();
-        while(1) {   
-        }
-
+        DEBUG("STATE:%d, HAVESETTINGS:%d, RTC:%u, BOOTAT:%u, LOC:%u, LOC_FS:%u, ACT:%u \n", RET_state, RET_haveSettings, RET_RTCunixtime,RET_SetupRunAt,RET_eventTime_location_tx,RET_eventTime_location_failsafe_tx,RET_eventTime_activity_tx);
         mainStateEngine();
         
         //PRE-SLEEP ACTIONS
         if (GLOBAL_needToConfigureLis3dh) { lis3dh_configureForSleep(10,127); }
+        if (GLOBAL_modemOn) {
+            DEBUG("SHUTTING DOWN MODEM\n");
+            Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN, PN_GSM_WAKE_DISABLE);
+            modem.off(true);
+        }
         RET_coldBoot = 0;
+        
+        //SLEEP DIFFERENT FOR THIS SHAKER TEST VERSION - AS IS WILL GIVE 450ua sleep
+        NRF_UART0->TASKS_SUSPEND = 1;
+        NRF_UART0->ENABLE = 0; //NO MORE SERIAL OR DEBUG OUTPUTS AFTER THIS
+        mainthread.wait(30000);
+        system_reset();
     }
 }
\ No newline at end of file