init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Files at this revision

API Documentation at this revision

Comitter:
pathfindr
Date:
Sun Jan 20 00:15:03 2019 +0000
Parent:
42:f482f4cdb319
Child:
44:061509d1b38c
Commit message:
performance tweaks

Changed in this revision

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
mbed_app.json 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
--- a/main.cpp	Fri Jan 18 00:07:45 2019 +0000
+++ b/main.cpp	Sun Jan 20 00:15:03 2019 +0000
@@ -1,19 +1,9 @@
 #include "main.h"
 
 //------------------------------------------------------------------------------
-//DEFINES
-//------------------------------------------------------------------------------ 
-
-
-//------------------------------------------------------------------------------
 //FUNCTION PROTOTYPES - NEED TO ADD ALL OF THE MISSING ONES
 //------------------------------------------------------------------------------ 
-void mainStateEngine(void);
-void selftest(void);
-void buttonPress(void);
-void buttonRelease(void);
-void dumpSettings(void);
-//void setEventTimes(void);
+//should really add these
 
 //------------------------------------------------------------------------------
 // GLOBALS
@@ -27,7 +17,7 @@
 bool             GLOBAL_modemOn                      = false;
 bool             GLOBAL_LEDSequenceinProgress        = false;
 time_t           GLOBAL_wakeTime                     = 0;
-char             GLOBAL_exceptionString[15];
+char             GLOBAL_exceptionString[32];
 char             GLOBAL_debug_buffer[200];
 
 
@@ -188,6 +178,7 @@
 void buttonRelease() {
     RET_buttonHoldTime = (RET_RTCunixtime - RET_buttonPressTime);
     RET_buttonPressCount ++;
+    led1 = 1; //led off
 }
 //------------------------------------------------------------------------------
 // RTC TICKER
@@ -200,12 +191,14 @@
     if (RET_asleep == true) {
         //hold check
         if (RET_buttonHoldTime > 4 && RET_buttonHoldTime < 10) {
+            led1 = 0; // led on
             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) {
+            led1 = 1; //led off
             RET_buttonHoldTime = 0;
             RET_buttonPressCount = 0;
             RET_state_prev = RET_state;
@@ -349,9 +342,11 @@
     uint8_t lis3dh_id; 
     lis3dh.LIS3DH_GetWHO_AM_I(&lis3dh_id);
     if (lis3dh_id == 51) {
+        GLOBAL_accel_healthy = true;
         test_pass ++;
     } else {
-        addToExceptionString("A.");   
+        GLOBAL_accel_healthy = false;
+        addToExceptionString("A");   
     }
     
     //Temperature
@@ -366,15 +361,15 @@
     if (temperature > -40 && temperature < 60) {
         test_pass ++;
     } else {
-        addToExceptionString("T.");
+        addToExceptionString("T");
     }
     
     //Result
     if (test_count == test_pass) {
-        addToExceptionString("OK."); 
+        addToExceptionString("OK"); 
         return true;
     } else {
-        addToExceptionString("FAIL."); 
+        addToExceptionString("FAIL"); 
         return false;   
     }
 }
@@ -426,7 +421,7 @@
             RET_motionState = false;
             GLOBAL_motionStopFlagTriggered = true;
             if (RET_setting_location_tx_failsafe_hrs > 0) {
-                RET_motionTotalActivityHours += (float(RET_motionStopTime - RET_motionStartTime) / 3600.0f);
+                RET_motionTotalActivityHours += ((float(RET_motionStopTime)-float(RET_motionStartTime)) / 3600.0f);
                 time_t epochOffsetMins = ((RET_RTCunixtime - RET_motionFrameStart) / 60);
                 sprintf(RET_activityData+strlen(RET_activityData),"0.%u!",epochOffsetMins);
             }
@@ -463,7 +458,7 @@
         if(TEMP_j != -1) { RET_setting_activity_tx_interval_hrs = TEMP_j;               }
         if(TEMP_k != -1) { RET_setting_environmental_tx_interval_mins = TEMP_k;         }
         if(TEMP_l != -1) { RET_setting_motion_g = TEMP_l;                               }
-            if(RET_setting_motion_g < 6 || RET_setting_motion_g > 127) {RET_setting_motion_g = DEFAULT_MOTION_G;}
+            if(RET_setting_motion_g < 4 || RET_setting_motion_g > 127) {RET_setting_motion_g = DEFAULT_MOTION_G;}
         if(TEMP_m != -1) { RET_setting_motion_start_seconds = TEMP_m;                   }
         if(TEMP_n != -1) { RET_setting_motion_stop_seconds = TEMP_n;                    }
         if(TEMP_o != -1) { RET_setting_impact_g = TEMP_o;                               }
@@ -479,7 +474,6 @@
             RET_haveSettings = true;
             GLOBAL_needToConfigureLis3dh = true;
             RET_SettingsGotAt = RET_RTCunixtime;
-            
             //check for firmware update
             if (RET_setting_firmware > 0 && RET_setting_firmware != FW_VERSION) {
                 read_app_data_from_flash(&app_data);
@@ -489,7 +483,6 @@
                 ThisThread::sleep_for(250);
                 system_reset();
             }
-            
             return true;
         } else {
             if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "CRITICAL FAILS:%d",critical_fail_count);debug_exe();}
@@ -530,7 +523,7 @@
     }
 }
 void setEventTimes() {
-    //SET EVENT TIMES
+    //SET ALL EVENT TIMES
     setEventTime_Location();
     setEventTime_Activity();
     setEventTime_Environmental();
@@ -544,15 +537,19 @@
     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);
+    snprintf(bytestosend,sizeof(bytestosend),"(%s,a:log,f:%d,v:%.2f,e:%d,z:%s,c:1,s:0)\0",GLOBAL_defaultApi,FW_VERSION,voltage,timetaken,error);
+    if (modem.on(RET_force2G)) {
+        if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,(RET_setting_connection_timeout*1000))) {
+            modem.USSDmessage(bytestosend, false, 2, GLOBAL_defaultApi);
+        }
+    }
     ThisThread::sleep_for(250);
 }
 
 //------------------------------------------------------------------------------
-// SETUP
+// EVENTS
 //------------------------------------------------------------------------------ 
-bool setup() {
+bool event_setup(bool manualrun) {
     RET_setupInProgress = true;
     bool pass = true;
     float temperature = getTemperature();
@@ -564,90 +561,45 @@
         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.
+            if (manualrun) addToExceptionString("MAN");
             char bytestosend[160];
             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) {
-                if (!saveSettings(result)) {
+                if (saveSettings(result) == false) {
                     //something went critically wrong getting settings 
                     pass = false;
-                    modem.off(false);
+                    modem.off(true);
                     if(GLOBAL_debugLED) LED1errorCode(5,10); //ERROR 5
-                    sendErrorLog("SETTINGS");
+                    sendErrorLog("ERRSETTINGS");
                 }                      
             } else {
                 //Response error
-                sendErrorLog("RESPONSE");
+                sendErrorLog("ERRRESP");
             }
         } else {
             //FAILUREMODE modem failed to register on network
-            modem.off(false);
+            modem.off(true);
             if(GLOBAL_debugLED) LED1errorCode(3,10); //ERROR 3
             pass = false;
         }
     } else {
         //FAILUREMODE Modem failed to turn on  
-        modem.off(false);
+        modem.off(true);
         if(GLOBAL_debugLED) LED1errorCode(2,10); //ERROR 2
         pass = false;
     }
-    modem.off(false);
-    
+    modem.off(true);
     //LOG RUN TIME - THIS MUST GO AT END AFTER WE HAVE GOT SERVER TIMESTAMP
     RET_SetupRunAt = RET_RTCunixtime;
-    
     //SET ALL EVENT TIMES
     setEventTimes();
-    
     RET_setupInProgress = false; //this turns off the flashing led
-    
     //RESULT
     return pass;
 }
 
-//------------------------------------------------------------------------------
-// EVENTS
-//------------------------------------------------------------------------------ 
-void event_connectiontest_tx(int location_accuracy) {
-    float temperature = getTemperature();
-    float voltage = getBatteryV();  
-    int selftestresult = selfTest();
-    if (modem.on(RET_force2G)) {
-        char locString[70];
-        memcpy(locString, modem.getLocation(location_accuracy, 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:loc,f:%d,t:%.1f,v:%.2f,z:TEST-%s,e:%d,c:1,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,voltage,GLOBAL_exceptionString,timetaken,locString);
-            char result[180];
-            bool getSettings = true;
-            snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, getSettings, 2, GLOBAL_defaultApi));
-            if (result != "err") {
-                if (getSettings) {
-                    if (saveSettings(result)) {
-                        if(GLOBAL_debugLED) LED1blink(5,250);
-                    } else {
-                        sendErrorLog("SETTINGS");
-                    }
-                }
-            } else {
-                sendErrorLog("RESPONSE");
-            }
-        } else {
-            modem.off(false);
-            if(GLOBAL_debugLED) LED1errorCode(3,20); //ERROR 3   
-        }
-    } else {
-        modem.off(false);
-        if(GLOBAL_debugLED) LED1errorCode(2,20); //ERROR 2
-    }
-    modem.off(false);
-    //RESETS
-    RET_motionTriggeredInTXInterval = 0;
-    setEventTimes();
-}
-
 void event_turnonofflog_tx(bool turnon) {
     float temperature = getTemperature();
     float voltage = getBatteryV();
@@ -658,19 +610,19 @@
             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);
+                snprintf(bytestosend,sizeof(bytestosend),"(%s,a:log,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);
+                snprintf(bytestosend,sizeof(bytestosend),"(%s,a:log,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];
             snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, false, 2, GLOBAL_defaultApi));
         } else {
-            modem.off(false);  
+            modem.off(true);  
         }
     } else {
-        modem.off(false);
+        modem.off(true);
     }
-    modem.off(false);
+    modem.off(true);
     //RESETS
     RET_motionTriggeredInTXInterval = 0;
 }
@@ -694,22 +646,20 @@
             snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytesToSend, getSettings, 2, GLOBAL_defaultApi));
             if (result != "err") {
                 if (getSettings) {
-                    saveSettings(result);
-                } else {
-                    sendErrorLog("SETTINGS");   
+                    if (saveSettings(result) == false){sendErrorLog("ERRSETTINGS");}
                 }
             } else {
-                sendErrorLog("RESPONSE");
+                sendErrorLog("ERRRESP");
             }
         } else {
-            modem.off(false);
-            if(GLOBAL_debugLED) LED1errorCode(3,20); //ERROR 3   
+            modem.off(true);
+            if(GLOBAL_debugLED) LED1errorCode(3,10); //ERROR 3   
         }
     } else {
-        modem.off(false);
-        if(GLOBAL_debugLED) LED1errorCode(2,20); //ERROR 2
+        modem.off(true);
+        if(GLOBAL_debugLED) LED1errorCode(2,10); //ERROR 2
     }
-    modem.off(false);
+    modem.off(true);
     //RESETS
     RET_motionTriggeredInTXInterval = 0;
     setEventTime_Location();
@@ -732,14 +682,14 @@
                 if (RET_haveSettings) { RET_motionFrameStart = RET_RTCunixtime; }
             }
         } else {
-            modem.off(false);
-            if(GLOBAL_debugLED) LED1errorCode(3,20); //ERROR 3
+            modem.off(true);
+            if(GLOBAL_debugLED) LED1errorCode(3,10); //ERROR 3
         }
     } else {
-        modem.off(false);
-        if(GLOBAL_debugLED) LED1errorCode(2,20); //ERROR 3
+        modem.off(true);
+        if(GLOBAL_debugLED) LED1errorCode(2,10); //ERROR 3
     }
-    modem.off(false);
+    modem.off(true);
     //RESETS
     RET_motionTriggeredInTXInterval = 0;
     setEventTime_Activity();
@@ -749,14 +699,13 @@
 // STATE ENGINE
 //------------------------------------------------------------------------------ 
 void mainStateEngine() {
-    
     switch(RET_state) {
         case STATE_SETUP :
         { //need the curlies to avoid "transfer of control bypass init error warning"
             //check that we havent run setup too recently
             time_t setupRunAt_delta = (RET_RTCunixtime - RET_SetupRunAt);
             if (RET_SetupRunAt == 0 || setupRunAt_delta > ONEDAYINSECONDS) {
-                if (setup()) {
+                if (event_setup(false)) {
                     // All good
                     setState(STATE_NORMAL);
                 } else {
@@ -783,7 +732,7 @@
                         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();}
+                             if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Skip TX no mot\n");debug_exe();}
                         }
                     }
                     break;
@@ -800,9 +749,8 @@
             if(RET_RTCunixtime >= RET_eventTime_activity_tx && RET_eventTime_activity_tx > 0 && strlen(RET_activityData) > 1) { 
                 run_activity_tx = true;
             }
-            if (strlen(RET_activityData) > 130) { run_activity_tx = true; }
+            if (strlen(RET_activityData) > 8) { run_activity_tx = true; } //was 130
             if (run_activity_tx) { event_activity_tx();}
-            
             break;
         }
         case STATE_DORMANT :
@@ -830,7 +778,7 @@
             if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 2\n");debug_exe();}
             LED1blink(2,300);
             LED1on(0);
-            event_connectiontest_tx(1);
+            event_setup(true);
             LED1off();
             break;
         }
@@ -840,7 +788,7 @@
             if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 3\n");debug_exe();}
             LED1blink(3,300);
             LED1on(0);
-            event_connectiontest_tx(2);
+            event_location_tx();
             LED1off();
             break;  
         }
@@ -862,12 +810,12 @@
                 }
                 if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"TURNING ON\n");debug_exe();}
                 LED1blink(20,100);
-                event_turnonofflog_tx(true);
             }
             break;
         }
         case STATE_SCORCHEDEARTH :
         {
+            LED1blink(40,50);
             if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"SCORCHED EARTH - RESETTING");debug_exe();}
             setState(STATE_SETUP); //this wont be used but just incase to kick it out of this state
             read_app_data_from_flash(&app_data);
@@ -891,29 +839,38 @@
     //INIT
     watchdog.configure(240.0); //4 mins
     LED1off();
+    modem.off(false);
     RTCticker.attach(&RTCtick, 1.0);
     button.fall(&buttonPress);
     button.rise(&buttonRelease);
-
+    read_app_data_from_flash(&app_data);
     dumpSettings();
     
     //CHECK IF THIS IS RESET
-    //0x00000004 == soft reset  //0x00000002 == watchdog  //0x00000001 == button/hardreset 
+    //0x00000008 == lock up //0x00000004 == soft reset  //0x00000002 == watchdog  //0x00000001 == button/hardreset 
     if (NRF_POWER->RESETREAS != 0xffffffff) {
+        RET_coldBoot = 1;
         switch(NRF_POWER->RESETREAS) {
             case 0x00000001  :
-                if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"0x%08x. Hard Reset ST:%d\n",NRF_POWER->RESETREAS, RET_state);debug_exe();}
-                RET_coldBoot = 1;
+                if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:PI\n");debug_exe();}
             break;
             case 0x00000002  :
-                if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Watchdog ST:%d\n",RET_state);debug_exe();}
-                RET_watchdogfired = true;
+                if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:WD\n");debug_exe();}
             break;
             case 0x00000004  :
-                if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Soft ST:%d\n",RET_state);debug_exe();}
+                if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:SW\n");debug_exe();}
             break;
+            case 0x00000008  :
+                if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:LU\n");debug_exe();}
+            break;            
         }
         NRF_POWER->RESETREAS = 0xffffffff;
+    } else {
+        //if its not one of these reasons then its a power-on or a brown-out
+        if(get_flag(&app_data, app_execution_flag) == false) {
+            //THIS is a unexpected reset / brownout???
+            //THIS NEEDS TESTING
+        }
     }
     
     //CHECK FOR FIRST BOOT
@@ -928,6 +885,7 @@
             //battery low
             LED1errorCode(10,2);
         }
+        addToExceptionString("FR");
         mainthread.wait(2000);
     }
     
@@ -948,12 +906,20 @@
         //MAIN LOGIC
         if(DEBUG_ON){
             if (RET_state != 99) {
-                debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "FW:%d,ST:%d, SET:%d, MFR:%d, MST: %d, RTC:%u, L:%u, LFS:%u, A:%u", 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), "F:%d,S:%d, SET:%d, MF:%d, MS: %d, %u, L:%u, LFS:%u, A:%u", 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), "FW:%d, ST:%d, WAKE@:%u\n", FW_VERSION, RET_state, RET_eventTime_wakeFromDormant);debug_exe();
+                debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "F:%d, S:%d, WAKE@:%u\n", FW_VERSION, RET_state, RET_eventTime_wakeFromDormant);debug_exe();
             }
         }
+        
+        /*
+        if (modem.on(RET_force2G)) {
+            if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,(RET_setting_connection_timeout*1000))) {
+                modem.USSDsend("(b:gps2,a:act,e:1.7!0.15!,t:1547937626,r:0.13,c:1)\0",2);
+            }
+        }
+        */
 
         //STATE ENGINE
         mainStateEngine();
@@ -964,6 +930,7 @@
             bool write_app_data_to_flash_execute = false;
             if(get_flag(&app_data, app_execution_flag) == true) {
                 clr_flag(&app_data, app_execution_flag);
+                clr_flag(&app_data, first_run_flag);
                 write_app_data_to_flash_execute = true;
             }
             if(app_data.current_firmware_version != FW_VERSION) {
--- a/main.h	Fri Jan 18 00:07:45 2019 +0000
+++ b/main.h	Sun Jan 20 00:15:03 2019 +0000
@@ -16,8 +16,8 @@
 //------------------------------------------------------------------------------
 //DEFINES
 //------------------------------------------------------------------------------ 
-#define FW_VERSION          21
-#define SKU                 "GPSPLUS"
+#define FW_VERSION          1
+#define SKU                 "GPSP"
 #define HW_MAJORREVISION    "001"
 
 //MODES
@@ -25,7 +25,7 @@
 #define DEBUG_ON                            1
 
 //DEFAULT SETTINGS
-#define DEFAULT_SLEEP_FRAME                 60000
+#define DEFAULT_SLEEP_FRAME                 30000
 #define DEFAULT_FORCE2G                     true
 #define DEFAULT_LOCATION_MODE               2
 #define DEFAULT_LOCATION_ACCURACY           2  // 0 = no location, 1 = cl only, 2 = gps then cl
--- a/mbed_app.json	Fri Jan 18 00:07:45 2019 +0000
+++ b/mbed_app.json	Sun Jan 20 00:15:03 2019 +0000
@@ -23,6 +23,8 @@
             "platform.sys-stats-enabled": false
         },
         "NRF52_DK": {
+            "target.mbed_app_start": "0x3E000",
+            "target.bootloader_img": null,
             "target.OUTPUT_EXT": "bin",
             "target.uart_hwfc": 0,
             "nordic.uart_0_fifo_size": 1024,
--- a/modem.cpp	Fri Jan 18 00:07:45 2019 +0000
+++ b/modem.cpp	Sun Jan 20 00:15:03 2019 +0000
@@ -131,18 +131,17 @@
 
 void Modem::off(bool soft) 
 {
-    if (soft) {
-        //ATsendCMD("AT+QPOWD");
-        //_pwrkey = 0;
-        //ThisThread::sleep_for(800);
-        //_pwrkey = 1;
-        //ATwaitForWord("POWERED DOWN",ATTIMEOUT_SHORT);
+    if (GLOBAL_modemOn) {
+        if (soft) {
+            //ATsendCMD("AT+QPOWD=0");
+            //ATwaitForWord("POWERED DOWN",ATTIMEOUT_VERYSHORT);
+        }
+        GLOBAL_modemOn = false;
     }
-    GLOBAL_modemOn = false;
     GLOBAL_registeredOnNetwork = false;
     _w_disable = 0; //enable airplane mode
-    _pwrkey = 0;
-    _vreg_en = 0;
+    _pwrkey = 0;    //set power key low
+    _vreg_en = 0;   //kill power to module
 }
 
 long long Modem::getIMEI() 
@@ -154,7 +153,6 @@
             imei = atoll(ATinBuffer);
         }
     };
-    
     NRFuart_flush();
     return imei;
 }
@@ -191,13 +189,13 @@
                 runtime = (t.read_ms() - startmillis);
                 ThisThread::sleep_for(1000);
                 ATsendCMD("AT+CREG?");
-                if (ATwaitForWord("+CREG: 0,5",3000)) {
+                if (ATwaitForWord("+CREG: 0,5",ATTIMEOUT_VERYSHORT)) {
                     NRFuart_flush();
                     GLOBAL_registeredOnNetwork = true;
                 };
             }
             if (!GLOBAL_registeredOnNetwork) {
-                off(true);
+                off(false);
                 ThisThread::sleep_for(1000);
                 on(RET_force2G);
             }
@@ -222,7 +220,7 @@
         char bytestosend[160];
         snprintf(bytestosend, sizeof(bytestosend), "AT+CUSD=1,\"#469*%s#\"", message);
         ATsendCMD(bytestosend);
-        if (ATwaitForWord("+CUSD: 0",ATTIMEOUT_SHORT)) {
+        if (ATwaitForWord("+CUSD: 0",ATTIMEOUT_MED)) {
             sent = true;
         };
         NRFuart_flush();
@@ -238,7 +236,7 @@
 char* Modem::USSDreceive(int messageIndex) 
 {
     bool received = false;
-    uint32_t timeout = ATTIMEOUT_MED;
+    uint32_t timeout = ATTIMEOUT_LONG;
     int USSDmessageIndex = 0;
     int matchCount = 0;
     Timer t;
@@ -248,13 +246,13 @@
     uint32_t runtime = 0;
     while(!received && runtime < timeout) {
         runtime = (t.read_ms() - startmillis);
-        if (ATwaitForWord("+CUSD: 0",ATTIMEOUT_LONG)) {
+        if (ATwaitForWord("+CUSD: 0",ATTIMEOUT_SHORT)) {
             led1 = 0;
             if (ATgetResponse('\r',ATTIMEOUT_SHORT)) {  
                 if ( (matchCount = sscanf(ATinBuffer,",\"%d#%[^#]",USSDmessageIndex,ATinBuffer) ) > 0 ) {
                     if (USSDmessageIndex == messageIndex) {
                         //NEED TO GET THIS WORKING SO WE KNOW WE ARE DEALING WITH THE RIGHT MESSAGE
-                        //MOVE THE BELOW INTO THIS IF STAEMEBNTS
+                        //MOVE THE BELOW INTO THIS IF STAEMEBNTS WHEN DONE
                     }
                     led1 = 1;
                     received = true;