init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Files at this revision

API Documentation at this revision

Comitter:
pathfindr
Date:
Sun Dec 23 17:24:42 2018 +0000
Parent:
23:a3b0ccf75ca5
Child:
25:7adeb1a53360
Commit message:
eee

Changed in this revision

README.md Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
modem.cpp Show annotated file Show diff for this revision Revisions of this file
sensors.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/README.md	Sun Dec 23 01:37:00 2018 +0000
+++ b/README.md	Sun Dec 23 17:24:42 2018 +0000
@@ -11,7 +11,8 @@
 9) does 3g use less power
 10) add model version details of board to the setup tx
 11) add validation to each settings in 
-
+12) temp sensor not working
+13) make activity broadcast an option in normal lcoation one just total hours
 
 Temperature logging
 
--- a/main.cpp	Sun Dec 23 01:37:00 2018 +0000
+++ b/main.cpp	Sun Dec 23 17:24:42 2018 +0000
@@ -1,9 +1,10 @@
 #include "main.h"
 
 //------------------------------------------------------------------------------
-//FUNCTION PROTOTYPES
+//DEFINES
 //------------------------------------------------------------------------------ 
 #define FW_VERSION 1
+#define SLEEP_FRAME 30000
 
 //------------------------------------------------------------------------------
 //FUNCTION PROTOTYPES
@@ -12,6 +13,7 @@
 static void selftest(void);
 static void buttonPress(void);
 static void buttonRelease(void);
+static void dumpSettings(void);
 static void saveEventTimes(void);
 static void event_location_tx(void);
 
@@ -22,7 +24,7 @@
 bool GLOBAL_accel_healthy = false;
 bool GLOBAL_requireSoftReset = false;
 bool GLOBAL_motionStopFlagTriggered = false;
-bool GLOBAL_debugLED = false;
+bool GLOBAL_debugLED = true;
 bool GLOBAL_needToConfigureLis3dh = false;
 bool GLOBAL_registeredOnNetwork = false;
 bool GLOBAL_modemOn = false;
@@ -38,14 +40,13 @@
 //IDENTITY
 static long long        RET_imei                                        __attribute__((section("noinit"),zero_init));
 //SETTINGS
-static int              RET_setting_firmware                            __attribute__((section("noinit"),zero_init));
+static int              RET_setting_firmware                            __attribute__((section("noinit"),zero_init)); //must be int to support negative value
 static uint8_t          RET_setting_location_mode                       __attribute__((section("noinit"),zero_init));
 static uint8_t          RET_setting_location_accuracy                   __attribute__((section("noinit"),zero_init));
 static uint32_t         RET_setting_location_tx_interval_mins           __attribute__((section("noinit"),zero_init));
 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_hrs           __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));
@@ -56,6 +57,7 @@
 static uint16_t         RET_setting_beacon_interval_seconds             __attribute__((section("noinit"),zero_init));
 static uint16_t         RET_setting_beacon_scan                         __attribute__((section("noinit"),zero_init));
 //STATE
+static uint16_t         RET_sleepToggle                                 __attribute__((section("noinit"),zero_init));
 static uint8_t          RET_coldBoot                                    __attribute__((section("noinit"),zero_init));
 static bool             RET_haveSettings                                __attribute__((section("noinit"),zero_init));
 static uint8_t          RET_state                                       __attribute__((section("noinit"),zero_init));
@@ -75,7 +77,8 @@
 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_activityData[130]                           __attribute__((section("noinit"),zero_init));
+static time_t           RET_motionFrameStart                            __attribute__((section("noinit"),zero_init));
+static char             RET_activityData[140]                           __attribute__((section("noinit"),zero_init));
 //IMPACT
 static bool             RET_impactTriggered                             __attribute__((section("noinit"),zero_init));
 //EVENTS LOGGING
@@ -87,8 +90,9 @@
 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));
+//DUPLICATES MEM INIT CHECK
+static time_t           RET_RTCunixtime_bu                                __attribute__((section("noinit"),zero_init));
+static uint32_t         RET_memTest                                    __attribute__((section("noinit"),zero_init));
 #elif defined ( __GNUC__ )
 #elif defined ( __ICCARM__ )
 #endif
@@ -128,12 +132,14 @@
     LED1off();
 }
 void gotoSleep(long sleep_milliseconds) {
+    /*
     turnOffEverything();
     watchdogKick();
     if (GLOBAL_requireSoftReset) { //dont need to clear this var as reset changes it back to false
         system_reset();
     }
     mainthread.wait(sleep_milliseconds);
+    */
 }
 void setState(uint8_t state) {
     RET_state_prev = RET_state;
@@ -141,15 +147,38 @@
     DEBUG("STATEREADBACK %d\n",RET_state)
 }
 bool memoryIntegrityCheck() {
+    bool pass = true;
+    //check memory is init correct
+    if (RET_memTest != 12345) {
+        pass = false;
+    }
     //Check clocks match and are in range
-    if (RET_RTCunixtime != RET_RTCunixtime && RET_RTCunixtime > 1545412457) {
-        RET_coldBoot = 1;
-        return false;  
-    } else {
-        return true;   
-    } 
+    if (RET_RTCunixtime != RET_RTCunixtime || RET_RTCunixtime < 1545412457) {
+        pass = false;
+    }
+    return pass;
 }
-void getBatteryV() {
+void dumpSettings() {
+    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_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_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);
+    DEBUG("RET_setting_motion_stop_seconds:%d \n",RET_setting_motion_stop_seconds);
+    DEBUG("RET_setting_impact_g:%d \n",RET_setting_impact_g);
+    DEBUG("RET_setting_impact_alert:%d \n",RET_setting_impact_alert);
+    DEBUG("RET_setting_connection_timeout:%d \n",RET_setting_connection_timeout);
+    DEBUG("RET_setting_beacon_interval_seconds:%d \n",RET_setting_beacon_interval_seconds);
+    DEBUG("RET_setting_beacon_scan:%d \n",RET_setting_beacon_scan);
+}
+void getBatteryV() { //this creates an extra 400ua of power usage!!!
     NRF52_SAADC batteryIn;
     batteryIn.addChannel(9); // vdd for battery
     batteryIn.calibrate();
@@ -181,7 +210,7 @@
 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;
+    RET_RTCunixtime_bu += 1;
     
     GLOBAL_RTCunixtime = RET_RTCunixtime;
     
@@ -219,18 +248,20 @@
         led1 = !led1;
     }
 }
+
 void factoryReset() {
-    DEBUG("Factory Reset \n");
-    Thread::wait(200); //wait to ensure that devices are turned off
+    //MEM CHECK
+    RET_memTest = 12345;
     //IDENTITY 
     RET_imei = 0;
     //STATE
+    RET_sleepToggle = 0;
     RET_coldBoot = 1;
     RET_haveSettings = 0;
     RET_state = STATE_SETUP;
     RET_state_prev = RET_state;
     RET_RTCunixtime = 0;
-    RET_RTCunixtime = 2;
+    RET_RTCunixtime_bu = 0;
     RET_SetupRunAt = 0;
     //SETTINGS
     RET_setting_firmware = 0;
@@ -263,6 +294,7 @@
     RET_motionPendingOffState = 0;
     RET_motionState = 0;
     RET_motionTotalActivityHours = 0.0;
+    RET_motionFrameStart = 0;
     memset(RET_activityData,0,sizeof(RET_activityData));
     //IMPACT
     RET_impactTriggered = 0;
@@ -276,6 +308,7 @@
     RET_eventTime_wakeFromDormant = 0;
     //OTHER LOCAL GLOBALS   
     GLOBAL_requireSoftReset = false;   
+    
     //PERIPHERAL RESET
     lis3dh_configureForSleep(10,127);
 }
@@ -313,7 +346,7 @@
 //------------------------------------------------------------------------------ 
 void checkMotion() {
     if (lis3dh_int2) {
-        if (GLOBAL_debugLED) LED1blink(2,100);
+        if (GLOBAL_debugLED) LED1blink(1,100);
         RET_motionTriggered = true;
         GLOBAL_needToConfigureLis3dh = true; //interrupt has fire so need to clear it
         if (!RET_motionPendingOnState) {
@@ -323,7 +356,6 @@
             RET_motionStartTime = RET_RTCunixtime;
         }
     } else {
-        if (GLOBAL_debugLED) LED1blink(2,500);
         RET_motionTriggered = false;
         RET_motionPendingOnState = false;
         if (!RET_motionPendingOffState) {
@@ -335,25 +367,28 @@
     //calculate motion state
     if (RET_motionPendingOnState) {
         //check if above threshold
-        time_t inMotionForSeconds = (RET_RTCunixtime - RET_motionStartTime);
-        if (inMotionForSeconds >= RET_setting_motion_start_seconds) {
+        time_t inMotionForSeconds = (RET_RTCunixtime - RET_motionStartTime) + 2; //Plus 2 to account for rounding and non exact clocks
+        if (inMotionForSeconds >= RET_setting_motion_start_seconds && RET_motionState == false) {
             RET_motionState = true;
             RET_motionTriggeredInTXInterval = true;
             if (GLOBAL_debugLED) LED1blink(10,100);
-            if (RET_setting_activity_mode == 1) {
-                //RET_activityData 
+            if (RET_setting_location_tx_failsafe_hrs > 0) {
+                time_t epochOffsetMins = ((RET_RTCunixtime - RET_motionFrameStart) / 60);
+                sprintf(RET_activityData+strlen(RET_activityData),"1.%u!",epochOffsetMins);
             }
         }
     }
     if (RET_motionPendingOffState) {
-        time_t noMotionForSeconds = (RET_RTCunixtime - RET_motionStopTime);
-        if (noMotionForSeconds >= RET_setting_motion_stop_seconds) {
+        time_t noMotionForSeconds = (RET_RTCunixtime - RET_motionStopTime) + 2; //Plus 2 to account for rounding and non exact clocks
+        if (noMotionForSeconds >= RET_setting_motion_stop_seconds && RET_motionState == true) {
+            RET_motionPendingOffState = false;
             RET_motionState = false;
             GLOBAL_motionStopFlagTriggered = true;
             RET_motionTotalActivityHours += (float(RET_motionStopTime - RET_motionStartTime) / 3600.0); 
             if (GLOBAL_debugLED) LED1blink(5,500);
-            if (RET_setting_activity_mode == 1) {
-                
+            if (RET_setting_location_tx_failsafe_hrs > 0) {
+                time_t epochOffsetMins = ((RET_RTCunixtime - RET_motionFrameStart) / 60);
+                sprintf(RET_activityData+strlen(RET_activityData),"0.%u!",epochOffsetMins);
             }
         }
     }
@@ -410,26 +445,7 @@
         return false;
     }
 }
-bool dumpSettings() {
-    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_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_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);
-    DEBUG("RET_setting_motion_stop_seconds:%d \n",RET_setting_motion_stop_seconds);
-    DEBUG("RET_setting_impact_g:%d \n",RET_setting_impact_g);
-    DEBUG("RET_setting_impact_alert:%d \n",RET_setting_impact_alert);
-    DEBUG("RET_setting_connection_timeout:%d \n",RET_setting_connection_timeout);
-    DEBUG("RET_setting_beacon_interval_seconds:%d \n",RET_setting_beacon_interval_seconds);
-    DEBUG("RET_setting_beacon_scan:%d \n",RET_setting_beacon_scan);
-}
+
 void saveEventTimes() {
     //SET EVENT TIMES
     if(RET_setting_location_tx_interval_mins > 0) { 
@@ -441,6 +457,7 @@
         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));
         DEBUG("EVENTSET - ACTIVITY TX at %u\n",RET_eventTime_activity_tx);
     }
@@ -464,7 +481,7 @@
         if (modem.registerOnNetwork(2,180000)) {
             int timetaken = (RET_RTCunixtime - GLOBAL_wakeTime);
             char bytestosend[160];
-            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);
+            snprintf(bytestosend,sizeof(bytestosend),"(%s,im:%lld,a:loc,f:%d,v:%.2f,e:%d,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") {
@@ -503,7 +520,7 @@
         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);
+            snprintf(bytestosend,sizeof(bytestosend),"(%s,a:loc,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));
@@ -535,7 +552,7 @@
         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:OK,e:%d,c:1%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,GLOBAL_voltage,timetaken,locString);
+            snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:loc,f:%d,t:%.2f,v:%.2f,z:OK,e:%d,c:1%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,GLOBAL_voltage,timetaken,locString);
             char result[180];
             bool getSettings = true;
             snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytesToSend, getSettings, 2, GLOBAL_defaultApi));
@@ -551,6 +568,32 @@
     RET_motionTriggeredInTXInterval = 0;
     saveEventTimes();
 }
+
+void event_activity_tx() {
+    DEBUG("ACTIVITY 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()) {
+        //SEND DATA
+        if (modem.registerOnNetwork(2,180000)) {
+            char bytesToSend[160];
+            snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:act,e:%s,t:%u,r:%.2f,c:1)\0",GLOBAL_defaultApi,RET_activityData,RET_motionFrameStart,RET_motionTotalActivityHours);
+            char result[180];
+            bool getResponse = false;
+            snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytesToSend, getResponse, 2, GLOBAL_defaultApi));
+            if (result != "err") {
+                //RESET ACTIVITY FRAME
+                memset(RET_activityData,0,sizeof(RET_activityData));
+                if (RET_haveSettings) {RET_motionFrameStart = RET_RTCunixtime;}
+            }
+        }
+    }
+    //RESETS
+    RET_motionTriggeredInTXInterval = 0;
+    saveEventTimes();
+}
+
 //------------------------------------------------------------------------------
 // STATE ENGINE
 //------------------------------------------------------------------------------ 
@@ -573,24 +616,24 @@
             //check and log motion
             checkMotion();
             
-            //EVENTS
-            //LOCATION
+            //LOCATION EVENT
             bool run_location_tx = false;
-            if(RET_RTCunixtime >= RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { 
-                DEBUG("INTERVAL LOC TX...\n");
-                run_location_tx = true; 
-            }
+            if(RET_RTCunixtime >= RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { DEBUG("INTERVAL LOC TX...\n"); run_location_tx = true; }
             //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();
             }
             
-            //ACTIVITY TX
-            if(RET_RTCunixtime >= RET_eventTime_activity_tx && RET_eventTime_activity_tx > 0) {
-                //event_activity_tx();
-                event_shakertest_tx();
+            //ACTIVITY EVENT
+            bool run_activity_tx = false;
+            if(RET_RTCunixtime >= RET_eventTime_activity_tx && RET_eventTime_activity_tx > 0) { 
+                run_activity_tx = true; 
+                //event_shakertest_tx(); 
             }
+            if (strlen(RET_activityData) > 130) { run_activity_tx = true; }
+            if (run_activity_tx) {event_activity_tx();}
+            
             break;
         case STATE_DORMANT :
             if (RET_RTCunixtime >= RET_eventTime_wakeFromDormant) {
@@ -643,49 +686,61 @@
 // MAIN
 //------------------------------------------------------------------------------ 
 int main() {
+    //INIT
     turnOffEverything();
-    memoryIntegrityCheck();
+    if (!memoryIntegrityCheck()) { RET_coldBoot = 1;}
+    RTCticker.attach(&RTCtick, 1.0);
+    button.fall(&buttonPress); //does this affect power?
+    button.rise(&buttonRelease);
+    copyRETtoGLOBAL();
     
     //CHECK IF THIS IS RESET
     //0x00000004 == soft reset  //0x00000002 == watchdog  //0x00000001 == button/hardreset 
     if (NRF_POWER->RESETREAS != 0xffffffff) {
         switch(NRF_POWER->RESETREAS) {
             case 0x00000001  :
-                DEBUG("reset_reason: 0x%08x. - Hard Reset - CSTATE:%d\n",NRF_POWER->RESETREAS, RET_state);
+                DEBUG("reset_reason: 0x%08x. Hard Reset STATE:%d\n",NRF_POWER->RESETREAS, RET_state);
                 RET_coldBoot = 1;
             break;
             case 0x00000002  :
-                DEBUG("reset_reason: 0x%08x. - Watchdog - CSTATE:%d\n",NRF_POWER->RESETREAS, RET_state);
+                DEBUG("Watchdog reset STATE:%d\n",RET_state);
             break;
             case 0x00000004  :
-                DEBUG("reset_reason: 0x%08x. - Soft reset - CSTATE:%d\n",NRF_POWER->RESETREAS, RET_state);
+                DEBUG("Soft reset STATE:%d SLEEP:%d\n",RET_state, RET_sleepToggle);
             break;
         }
         NRF_POWER->RESETREAS = 0xffffffff;
     }
-    //DEBUG
+    
     dumpSettings();
     
     //CHECK FOR FIRST BOOT
-    if (RET_coldBoot == 1) { factoryReset(); }
+    if (RET_coldBoot == 1) { factoryReset(); dumpSettings(); }
     
-    //INIT
-    RTCticker.attach(&RTCtick, 1.0);
-    button.fall(&buttonPress); //does this affect power?
-    button.rise(&buttonRelease);
-    copyRETtoGLOBAL();
+    //SHALL WE SLEEP
+    if (RET_sleepToggle == 1) {
+        RET_sleepToggle = 0; 
+        NRF_UART0->TASKS_SUSPEND = 1;
+        NRF_UART0->ENABLE = 0; //NO MORE SERIAL OR DEBUG OUTPUTS AFTER THIS
+        mainthread.wait(SLEEP_FRAME);
+        system_reset();
+    }
     
     while(true) {
-        memoryIntegrityCheck();
+        if (!memoryIntegrityCheck()) { RET_coldBoot = 1;}
         watchdogKick();
-        
         //LOG START TIME
         GLOBAL_wakeTime = RET_RTCunixtime;
         
         //MAIN LOGIC
-        DEBUG("STATE:%d, HAVESETTINGS:%d, RTC:%u, BOOTAT:%u, LOC:%u, LOCFS:%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);
+        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);
         mainStateEngine();
         
+        //sprintf(RET_activityData+strlen(RET_activityData),"test");
+        //int result = strlen(RET_activityData);
+        //DEBUG("size:%d\n",result)
+        
         //PRE-SLEEP ACTIONS
         if (GLOBAL_needToConfigureLis3dh) { lis3dh_configureForSleep(10,127); }
         if (GLOBAL_modemOn) {
@@ -695,10 +750,13 @@
         }
         RET_coldBoot = 0;
         
-        //SLEEP DIFFERENT FOR THIS SHAKER TEST VERSION - AS IS WILL GIVE 450ua sleep
+        //SLEEP DIFFERENT FOR THIS SHAKER TEST VERSION - AS IS WILL GIVE 450ua sleep if in motion
+        /*
         NRF_UART0->TASKS_SUSPEND = 1;
         NRF_UART0->ENABLE = 0; //NO MORE SERIAL OR DEBUG OUTPUTS AFTER THIS
-        mainthread.wait(30000);
+        mainthread.wait(SLEEP_FRAME);
+        */
+        RET_sleepToggle = 1;
         system_reset();
     }
 }
\ No newline at end of file
--- a/main.h	Sun Dec 23 01:37:00 2018 +0000
+++ b/main.h	Sun Dec 23 17:24:42 2018 +0000
@@ -21,7 +21,7 @@
 #include "mbed.h"
 #include "board.h"
 #include "WatchdogTimer.h"
-#include "ble/BLE.h"
+//#include "ble/BLE.h"
 //#include "nvstore.h"
 
 //------------------------------------------------------------------------------
--- a/modem.cpp	Sun Dec 23 01:37:00 2018 +0000
+++ b/modem.cpp	Sun Dec 23 17:24:42 2018 +0000
@@ -101,11 +101,10 @@
 {
     if (soft) {
         //ATsendCMD("AT+QPOWD");
+        //_pwrkey = 0;
+        //Thread::wait(800);
+        //_pwrkey = 1;
         //ATwaitForWord("POWERED DOWN",ATTIMEOUT_SHORT);
-        _pwrkey = 0;
-        Thread::wait(800);
-        _pwrkey = 1;
-        ATwaitForWord("POWERED DOWN",ATTIMEOUT_SHORT);
     }
     GLOBAL_registeredOnNetwork = false;
     _vreg_en = 0;
--- a/sensors.cpp	Sun Dec 23 01:37:00 2018 +0000
+++ b/sensors.cpp	Sun Dec 23 17:24:42 2018 +0000
@@ -45,4 +45,4 @@
     //Clear interrupts
     lis3dh.LIS3DH_ResetInt1Latch();
     lis3dh.LIS3DH_ResetInt2Latch();
-}
\ No newline at end of file
+}