init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Revision:
57:066dfbe8b4b9
Parent:
56:efd9f5613549
Child:
58:8d4a354816b1
--- a/main.cpp	Fri Aug 09 14:22:21 2019 +0000
+++ b/main.cpp	Thu Feb 13 00:57:06 2020 +0000
@@ -6,127 +6,88 @@
 • Ensure APP DATA address is correct
 */
 
-/*
-TO DO
-STOP FRASH WRITE FROM CRASHING IF THERE IS A PROBLEM
-*/
-
 //------------------------------------------------------------------------------
 //FUNCTION PROTOTYPES - NEED TO ADD ALL OF THE MISSING ONES
 //------------------------------------------------------------------------------ 
 //should really add these - will just add as and when needed for now
-void event_activity_tx();
-void event_location_tx(bool failsafe);
-#if BLE_ENABLED
-    void bleShutdown();
-#endif
+void bleShutdown();
 
 //------------------------------------------------------------------------------
-// GLOBALS
+// VARS
 //------------------------------------------------------------------------------
-char*            GLOBAL_defaultApi                                  = "b:gps2";
-bool             GLOBAL_accel_healthy                               = false;
-bool             GLOBAL_motionStopFlagTriggered                     = false;
-bool             GLOBAL_needToConfigureLis3dh                       = false;
-bool             GLOBAL_registeredOnNetwork                         = false;
-bool             GLOBAL_modemOn                                     = false;
-bool             GLOBAL_LEDSequenceinProgress                       = false;
-time_t           GLOBAL_wakeTime                                    = 0;
-char             GLOBAL_exceptionString[30];
-char             GLOBAL_exceptionStringRetainedUntilSuccess[10];
+char             RET_pf_identifier[6];
+time_t           RET_RTCunixtime                                    = 0;
+bool             RET_debug                                          = true;
+time_t           RET_debug_offat                                    = 0;
 char             GLOBAL_debug_buffer[DEBUG_BUFFERSIZE];
-char             GLOBAL_failed_broadcasts[5][160];
-bool             GLOBAL_failed_broadcast_slots[5];
-char             GLOBAL_GPSlocString_prev[70];
-bool             GLOBAL_have_GPSlocString_prev                      = false;
 
-//SETTINGS
-int              RET_setting_firmware                               = 0;
-uint32_t         RET_setting_minimumupdate_hrs                      = 0;
-uint8_t          RET_setting_location_mode                          = DEFAULT_LOCATION_MODE;
-uint8_t          RET_setting_location_accuracy                      = DEFAULT_LOCATION_ACCURACY;
-uint32_t         RET_setting_location_tx_interval_mins              = DEFAULT_LOCATION_TX_INTERVAL_MINS;
-uint32_t         RET_setting_location_tx_failsafe_hrs               = DEFAULT_LOCATION_TX_FAILSAFE_HRS;
-uint32_t         RET_location_failsafe_seconds_max                  = (DEFAULT_LOCATION_TX_FAILSAFE_HRS * 3600);
-uint16_t         RET_setting_location_timeout                       = DEFAULT_LOCATION_TIMEOUT;
-uint32_t         RET_setting_activity_tx_interval_hrs               = 0;
-uint8_t          RET_setting_activity_mode                          = 1;
-uint32_t         RET_setting_environmental_tx_interval_mins         = 0;
-uint16_t         RET_setting_motion_g                               = DEFAULT_MOTION_G;
-time_t           RET_setting_motion_start_seconds                   = DEFAULT_MOTION_START_SECONDS;
-time_t           RET_setting_motion_stop_seconds                    = DEFAULT_MOTION_STOP_SECONDS;
-uint16_t         RET_setting_impact_g                               = 0;
-uint8_t          RET_setting_impact_alert                           = 0;
-uint16_t         RET_setting_connection_timeout                     = DEFAULT_CONNECTION_TIMEOUT;
-uint16_t         RET_setting_beacon_interval_seconds                = 0;
-uint8_t          RET_setting_beacon_scan                            = 0;
+//SENSORS
+float            RET_voltage                                        = 0.0;
+float            RET_temperature                                    = 0.0;
+float            RET_humidity                                       = 0.0;
+bool             RET_motionState                                    = false;
+bool             RET_impactState                                    = false;
+
 //STATE
-char             RET_pf_identifier[7];
-uint8_t          RET_coldBoot                                       = 1;
-bool             RET_asleep                                         = false;
 bool             RET_busy                                           = false;
-time_t           RET_RTCunixtime                                    = 0;
-bool             RET_haveSettings                                   = false;
 uint8_t          RET_state                                          = STATE_SETUP;
 uint8_t          RET_state_prev                                     = RET_state;
+bool             RET_asleep                                         = false;
+bool             RET_coldBoot                                       = true;
+
+//BUTTON
+bool             RET_buttonPressed                                  = false;
 uint8_t          RET_buttonPressCount                               = 0;
 time_t           RET_buttonPressTime                                = 0;
 time_t           RET_buttonReleaseTime                              = 0;
 time_t           RET_buttonReleaseTime_prev                         = 0;
 time_t           RET_buttonHoldTime                                 = 0;
-time_t           RET_SetupRunAt                                     = 0;
-time_t           RET_SettingsGotAt                                  = 0;
-bool             RET_setupInProgress                                = false;
-bool             RET_force2G                                        = DEFAULT_FORCE2G;
-bool             RET_watchdogfired                                  = false;
-bool             RET_receivedNewSettings                            = false;
-uint32_t         RET_GPSFailCount                                   = 0;
-uint32_t         RET_NetworkFailCount                               = 0;
-bool             RET_NetworkFailFlag                                = false;
-bool             RET_debug                                          = true;
-time_t           RET_debug_offat                                    = 0;
-float            RET_voltage                                        = 0.0;
-float            RET_temperature                                    = 0.0;
-float            RET_humidity                                       = 0.0;
-float            RET_temperature_max                                = -999.0; //Within broadcast frame. Set inital value to low
-float            RET_temperature_min                                = 999.0; //Within broadcase frame. Set inital value to high
-uint32_t         RET_modemBrownOutCountInSession                    = 0;
-time_t           RET_lastTxTime                                     = 0;
-//MOTION STATE
-bool             RET_motionTriggeredinFrame                         = false;
-bool             RET_motionStateOnInLocTXInterval                   = false;
-time_t           RET_motionStartTime                                = 0;
-time_t           RET_motionStopTime                                 = 0;
-bool             RET_motionPendingOnState                           = false;
-bool             RET_motionPendingOffState                          = false;
-bool             RET_motionState                                    = false;
-float            RET_motionTotalActivityHours                       = 0.0f;
-float            RET_motionTotalActivityHoursSincePost              = 0.0f;
-time_t           RET_motionFrameStart                               = 0;
-char             RET_activityData[ACTIVITY_BUFFERSIZE];
-//IMPACT
-bool             RET_impactTriggered                                = 0;
-//EVENTS LOGGING
-time_t           RET_eventTime_location_log                         = 0;
-time_t           RET_eventTime_environmental_log                    = 0;
-//EVENTS TX
-time_t           RET_eventTime_location_tx                          = 0;
-time_t           RET_eventTime_location_failsafe_tx                 = 0;
-time_t           RET_location_failsafe_seconds_count                = 0;
-time_t           RET_eventTime_environmental_tx                     = 0;
-time_t           RET_eventTime_activity_tx                          = 0;
-time_t           RET_eventTime_wakeFromDormant                      = 0;
+
+//EVENTS
+bool             RET_haveEventsToRun                                = false;
+
+bool             EVENT_buttonPress                                  = false;
+
+bool             EVENT_battery                                      = false;
+time_t           EVENT_battery_interval                             = DEFAULT_INTERVAL_BATTERY;
+time_t           EVENT_battery_time                                 = 0;
+
+bool             EVENT_motionClear                                  = false;
+time_t           EVENT_motionClear_interval                         = DEFAULT_INTERVAL_MOTIONCLEAR;
+time_t           EVENT_motionClear_time                             = 0;
+
+bool             EVENT_buttonClear                                  = false;
+time_t           EVENT_buttonClear_interval                         = DEFAULT_INTERVAL_BUTTONCLEAR;
+time_t           EVENT_buttonClear_time                             = 0;
+
+bool             EVENT_temperature                                  = false;
+time_t           EVENT_temperature_interval                         = DEFAULT_INTERVAL_TEMPERATURE;
+time_t           EVENT_temperature_time                             = 0;
+
+bool             EVENT_humidity                                     = false;
+time_t           EVENT_humidity_interval                            = DEFAULT_INTERVAL_HUMIDITY;
+time_t           EVENT_humidity_time                                = 0;
+
+bool             EVENT_settingsScan                                 = false;
+time_t           EVENT_settingsScan_interval                        = DEFAULT_INTERVAL_SETTINGSSCAN;
+time_t           EVENT_settingsScan_time                            = 0;
+
+bool             EVENT_uwbScan                                      = false;
+time_t           EVENT_uwbScan_interval                        = 60;
+time_t           EVENT_uwbScan_time                                 = 0;
+
 //BLE
+uint16_t         RET_setting_beacon_interval_ms                     = DEFAULT_BEACON_INTERVAL_MS;
+uint16_t         RET_setting_beacon_interval_ms_active              = DEFAULT_BEACON_INTERVAL_MS;
 bool             RET_bleBroadcasting                                = false;
 uint8_t          RET_bleAdv_flags                                   = 0;
-char             RET_closestLocationTag_id[17];
-int              RET_closestLocationTag_rssi                        = 999;
-int              RET_closestBT04Tag_rssi                            = 999;
-bool             RET_locationTag_present                            = false;
-bool             RET_detector_present                               = false;
-const uint8_t    bleAdv_motionTriggeredinFrame_flag                 = 0b01000000;
-const uint8_t    bleAdv_motionState_flag                            = 0b00100000;
-const uint8_t    bleAdv_impact_flag                                 = 0b00010000;
+bool             RET_UWBdetector_present                            = true; //BEN should be false
+bool             RET_BLEpacketUpdate                                = false;
+bool             RET_settingsReceived                               = false;
+const uint8_t    bleAdv_motion_flag                                 = 0x01; //motion detected
+const uint8_t    bleAdv_impact_flag                                 = 0x02; //impact detected
+const uint8_t    bleAdv_button_pressed_flag                         = 0x08; //button press detected
+const uint8_t    bleAdv_gap_connected_flag                          = 0x40; //device is connected
 #pragma pack(1)
 struct bleData_t {
     uint16_t applicationSpecificId;
@@ -140,14 +101,9 @@
     int8_t accel_x;
     int8_t accel_y;
     int8_t accel_z;
-    /*char id_1; //cant use this and local name as it pushes us over size limit
-    char id_2;
-    char id_3;
-    char id_4;
-    char id_5;
-    char id_6;*/
 };
 #pragma pack()
+    
 //------------------------------------------------------------------------------
 //GPIO
 //------------------------------------------------------------------------------ 
@@ -156,13 +112,8 @@
 //------------------------------------------------------------------------------
 //PERIPHERALS
 //------------------------------------------------------------------------------ 
-#if BLE_ENABLED 
-    BLE myble;
-#endif
+BLE myble;
 WatchdogTimer watchdog;
-LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK);
-SI7060 si7060(PN_I2C_SDA, PN_I2C_SCL);
-Modem modem(PN_GSM_PWR_KEY, PN_VREG_EN, PN_GSM_WAKE_DISABLE);
 LowPowerTicker RTCticker;
 LowPowerTimer LPtimer;
 
@@ -192,10 +143,6 @@
     //nrf_gpio_cfg_input(PN_SPI_MOSI, NRF_GPIO_PIN_NOPULL);  //Don't need this one
     nrf_gpio_cfg_input(PN_SPI_MISO, NRF_GPIO_PIN_NOPULL);
     
-    //disable modem control lines
-    nrf_gpio_cfg_input(PN_GSM_PWR_KEY, NRF_GPIO_PIN_NOPULL);
-    nrf_gpio_cfg_input(PN_GSM_WAKE_DISABLE, NRF_GPIO_PIN_NOPULL);
-    
     //TWI0
     NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
     *(volatile uint32_t *)0x40003FFC = 0;
@@ -207,40 +154,9 @@
     *(volatile uint32_t *)0x40004FFC;
     *(volatile uint32_t *)0x40004FFC = 1;
 }
-void setState(uint8_t state) {
-    RET_state_prev = RET_state;
-    RET_state = state;
-}
-void dumpSettings() {  
-    if(RET_debug){
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_RTCunixtime:%u", RET_RTCunixtime);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_firmware:%d", RET_setting_firmware);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_minimumupdate_hrs:%d", RET_setting_minimumupdate_hrs);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_state:%d", RET_state);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_location_mode:%d", RET_setting_location_mode);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_location_accuracy:%d", RET_setting_location_accuracy);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_location_tx_interval_mins:%d", RET_setting_location_tx_interval_mins);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_location_failsafe_seconds_max:%d", RET_location_failsafe_seconds_max);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_location_timeout:%d", RET_setting_location_timeout);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_activity_tx_interval_hrs:%d", RET_setting_activity_tx_interval_hrs);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_activity_mode:%d", RET_setting_activity_mode);debug_exe();        
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_environmental_tx_interval_mins:%d", RET_setting_environmental_tx_interval_mins);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_motion_g:%d", RET_setting_motion_g);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_motion_start_seconds:%d", RET_setting_motion_start_seconds);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_motion_stop_seconds:%d", RET_setting_motion_stop_seconds);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_impact_g:%d", RET_setting_impact_g);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_impact_alert:%d", RET_setting_impact_alert);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_connection_timeout:%d", RET_setting_connection_timeout);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_beacon_interval_seconds:%d", RET_setting_beacon_interval_seconds);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_beacon_scan:%d", RET_setting_beacon_scan);debug_exe();
-        debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_pf_identifier:%s", RET_pf_identifier);debug_exe();
-    }
-}
+
 void recordFirmwareAsValid() {
-    #if BLE_ENABLED
-        bleShutdown();
-    #endif
-    debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RECORD FW %d AS VALID...", FW_VERSION);debug_exe();
+    bleShutdown();
     read_app_data_from_flash(&app_data);
     bool write_app_data_to_flash_execute = false;
     if(get_flag(&app_data, app_execution_flag) == true) {
@@ -280,33 +196,9 @@
     }
     RET_voltage = (voltage_accumulator / (float)readings);
 }
-//------------------------------------------------------------------------------
-// TEMPERATURE
-//------------------------------------------------------------------------------ 
-float getTemperature() {
-    return si7060.getTemperature();
-}
-void updateTemperatures() {
-    if (RET_temperature == 0.0) {RET_temperature = getTemperature();}
-    RET_temperature = (RET_temperature + (getTemperature() - RET_temperature) * 0.25f); //smoothed
-    if (RET_temperature < RET_temperature_min) {RET_temperature_min = RET_temperature;}
-    if (RET_temperature > RET_temperature_max) {RET_temperature_max = RET_temperature;}
-    if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Temp:%.1f  Min:%.1f  Max:%.1f",RET_temperature,RET_temperature_min,RET_temperature_max);debug_exe();}
-}
-void addToExceptionString(char* value) {
-    if(strstr(GLOBAL_exceptionString, value) == false){
-        snprintf(GLOBAL_exceptionString+strlen(GLOBAL_exceptionString),sizeof(GLOBAL_exceptionString),".%s",value);
-    }
-}
-void addToExceptionStringRetainedUntilSuccess(char* value) {
-    if(strstr(GLOBAL_exceptionStringRetainedUntilSuccess, value) == false){
-        snprintf(GLOBAL_exceptionStringRetainedUntilSuccess+strlen(GLOBAL_exceptionStringRetainedUntilSuccess),sizeof(GLOBAL_exceptionStringRetainedUntilSuccess),".%s",value);
-    }
-}
-void resetTemperatures() {
-    RET_temperature_max = -999.0; //Within broadcast frame. Set inital value to low
-    RET_temperature_min = 999.0; //Within broadcase frame. Set inital value to high   
-}
+
+
+
 //------------------------------------------------------------------------------
 // USER BUTTON HANDLING
 //------------------------------------------------------------------------------ 
@@ -316,15 +208,20 @@
 void buttonRelease() {
     //debounce catch
     RET_buttonReleaseTime = LPtimer.read_ms();
-    if ((RET_buttonReleaseTime - RET_buttonReleaseTime_prev) > 75) { 
+    if ((RET_buttonReleaseTime - RET_buttonReleaseTime_prev) > 100) { 
         RET_buttonPressCount ++;
         RET_buttonHoldTime = (RET_buttonReleaseTime - RET_buttonPressTime);
-        //temporarily enable debugging and dump settings
+        //temporarily enable debugging
         RET_debug = true;
         RET_debug_offat = (RET_RTCunixtime + 3600); //debug on for 1hr
+        EVENT_buttonPress = true;
+        mainthread.release();
     }
     RET_buttonReleaseTime_prev = RET_buttonReleaseTime;
 }
+
+
+
 //------------------------------------------------------------------------------
 // RTC TICKER
 //------------------------------------------------------------------------------
@@ -333,199 +230,86 @@
     //YOU MUST NOT CALL ANY OTHER FUNCTIONS OR DEBUG FROM INSIDE HERE!!! OR IT LOCKS UP THE DEVICE, just change vars & comparisons etc
     RET_RTCunixtime += 1;
     
-    //button logic
-    if (RET_buttonHoldTime >= 4000 && RET_buttonHoldTime <= 10000) {
-        RET_buttonHoldTime = 0;
-        RET_buttonPressCount = 0;
-        if (RET_state != STATE_DORMANT) {
-            RET_state_prev = RET_state;
-            RET_state = STATE_TURNOFF;
-        } else {
-            RET_state = STATE_TURNON;
+    //CHECK FOR EVENTS
+    if (RET_haveEventsToRun == false) {
+        if (EVENT_motionClear_time > 0 && RET_RTCunixtime >= EVENT_motionClear_time) {
+            RET_haveEventsToRun = true; EVENT_motionClear = true;
+        }
+        if (EVENT_buttonClear_time > 0 && RET_RTCunixtime >= EVENT_buttonClear_time) {
+            RET_haveEventsToRun = true; EVENT_buttonClear = true;
+        }
+        if (EVENT_battery_time > 0 && RET_RTCunixtime >= EVENT_battery_time) {
+            RET_haveEventsToRun = true; EVENT_battery = true;
         }
-        mainthread.release();
-    } else if (RET_buttonHoldTime >= 14000 && RET_buttonHoldTime <= 30000) {
-        RET_buttonHoldTime = 0;
-        RET_buttonPressCount = 0;
-        RET_state = STATE_SCORCHEDEARTH;
-        mainthread.release();
-    } else {
-        if((LPtimer.read_ms() - RET_buttonReleaseTime) > 1500 && RET_buttonPressCount > 0) {
-            if(RET_busy == true) { 
-                //RTCtick_ledflash_count = 4;// 2 flashes
-                RET_flash_busy = true;
-            } else {
-                RET_SetupRunAt = 0; //allow setup to run again
-                switch (RET_buttonPressCount) {   //double catches to help with debounce
-                    case 1 :
-                        if(RET_state_prev != RET_state) {RET_state_prev = RET_state;}
-                        RET_state = STATE_BUTTONPRESS1;
-                        RET_buttonPressCount = 0;
-                        mainthread.release();
-                        break;
-                    case 3 :
-                        if(RET_state_prev != RET_state) {RET_state_prev = RET_state;}
-                        RET_state = STATE_BUTTONPRESS3;
-                        RET_buttonPressCount = 0;
-                        mainthread.release();
-                        break;
-                    case 5 :
-                        if(RET_state_prev != RET_state) {RET_state_prev = RET_state;}
-                        RET_state = STATE_BUTTONPRESS5;
-                        RET_buttonPressCount = 0;
-                        mainthread.release();
-                        break;
-                    default :
-                        //do nothing
-                        break;
-                }
-            }
-            RET_buttonPressCount = 0;
+        if (EVENT_temperature_time > 0 && RET_RTCunixtime >= EVENT_temperature_time) {
+            RET_haveEventsToRun = true; EVENT_temperature = true;
+        }
+        if (EVENT_humidity_time > 0 && RET_RTCunixtime >= EVENT_humidity_time) {
+            RET_haveEventsToRun = true; EVENT_humidity = true;
+        }
+        if (EVENT_settingsScan_time > 0 && RET_RTCunixtime >= EVENT_settingsScan_time) {
+            RET_haveEventsToRun = true; EVENT_settingsScan = true;
+        }
+        if (EVENT_uwbScan_time > 0 && RET_RTCunixtime >= EVENT_uwbScan_time) {
+            RET_haveEventsToRun = true; EVENT_uwbScan = true;
         }
     }
     
-    if (RET_busy && RET_flash_busy) {
-        led1 = !led1;
-    } else {
-        RET_flash_busy = false;   
-    }
-    /*
-    if(RET_debug && GLOBAL_LEDSequenceinProgress == false){
-        if (RET_motionState) {
-            led1 = 0;   
-        } else {
-            led1 = 1;   
-        }
-    }
-    */
-}
-//------------------------------------------------------------------------------
-// GLOBALS
-//------------------------------------------------------------------------------ 
-void resetSessionVars() {
-    GLOBAL_accel_healthy = false;
-    RET_motionTriggeredinFrame = false;
-    RET_modemBrownOutCountInSession = 0;
-    RET_humidity = 99.0f;
-}
-void healthCheck() {
-    //check for watchdog fire
-    if (RET_watchdogfired == true) {
-        addToExceptionString("WD");
-        RET_watchdogfired = false;
-        RET_haveSettings = false;
-    }
-    //check clock
-    if(RET_haveSettings == true) {
-        if (RET_RTCunixtime < 1547678732 || RET_RTCunixtime > 1900000000) {
-            RET_haveSettings = false; 
-            addToExceptionString("CI");
-        }
-    }
-    //check that we have a reasonable time to loc
-    if(RET_haveSettings == true) {
-        //check location tx delta is set
-        if (RET_eventTime_location_tx == 0) {
-            //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ERR:eventTime_location_tx is 0");debug_exe();}
-            RET_haveSettings = false;
-            addToExceptionString("E3");
-        }
-        //check location failsafe tx is less than 2 weeks
-        if (RET_location_failsafe_seconds_max > (336 * 3600)) {
-            //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ERR:RET_location_failsafe_seconds_max too big");debug_exe();}
-            RET_haveSettings = false;
-            addToExceptionString("E2");
-        }
-    }
-    //check that we have had an attempted post within 2x failsafe time
-    long long unixtime = RET_RTCunixtime;
-    long long lasttxtime = RET_lastTxTime;
-    long long timeSinceTX = (unixtime - lasttxtime);
-    if (RET_lastTxTime > 0 && RET_location_failsafe_seconds_max > 0 && timeSinceTX > (RET_location_failsafe_seconds_max * 2)) {
-        RET_haveSettings = false;
-        addToExceptionString("E1");
-    }
-    //if have settings false then rerun setup
-    if (RET_haveSettings == false) {
-        setState(STATE_SETUP);
+    if (RET_haveEventsToRun) {
+        mainthread.release();
     }
 }
 
-bool selfTest() {
-    int test_count = 0;
-    int test_pass = 0;
-    
-    //Accelerometer
-    test_count ++;
-    uint8_t lis3dh_id; 
-    lis3dh.LIS3DH_GetWHO_AM_I(&lis3dh_id);
-    if (lis3dh_id == 51) {
-        GLOBAL_accel_healthy = true;
-        test_pass ++;
-    } else {
-        GLOBAL_accel_healthy = false;
-        addToExceptionString("AF");   
-    }
-    
-    //Result
-    if (test_count == test_pass) {
-        return true;
-    } else {
-        return false;   
-    }
-}
+
 //------------------------------------------------------------------------------
 // BLE FUNCS
 //------------------------------------------------------------------------------
-#if BLE_ENABLED
 void bleBuildData(bleData_t &bleData)
 {
-    bleData.applicationSpecificId = BLE_SERVICEID_GPSPLUS;
+    bleData.applicationSpecificId = BLE_SERVICEID_UWBBEACON;
     bleData.firmware = FW_VERSION;
     //set flags
-    if (RET_motionTriggeredinFrame) {
-        set_8bit_flag(RET_bleAdv_flags, bleAdv_motionTriggeredinFrame_flag);
+    if (RET_motionState) {
+        set_8bit_flag(RET_bleAdv_flags, bleAdv_motion_flag);
     } else {
-        clr_8bit_flag(RET_bleAdv_flags, bleAdv_motionTriggeredinFrame_flag);
+        clr_8bit_flag(RET_bleAdv_flags, bleAdv_motion_flag);
+    }
+    
+    if (RET_impactState) {
+        set_8bit_flag(RET_bleAdv_flags, bleAdv_impact_flag);
+    } else {
+        clr_8bit_flag(RET_bleAdv_flags, bleAdv_impact_flag);
     }
-    if (RET_motionState) {
-        set_8bit_flag(RET_bleAdv_flags, bleAdv_motionState_flag);
+    
+    if(RET_buttonPressed) {
+        set_8bit_flag(RET_bleAdv_flags, bleAdv_button_pressed_flag);
     } else {
-        clr_8bit_flag(RET_bleAdv_flags, bleAdv_motionState_flag);
+        clr_8bit_flag(RET_bleAdv_flags, bleAdv_button_pressed_flag);
     }
-    clr_8bit_flag(RET_bleAdv_flags, bleAdv_impact_flag);
+    
     bleData.flags = RET_bleAdv_flags;
-    bleData.voltage = uint16_t(RET_voltage * 100);
-    bleData.temperature = uint16_t(getTemperature() * 10);
+    bleData.voltage = RET_voltage;
+    bleData.buttonpresses = RET_buttonPressCount;
+    bleData.temperature = RET_temperature;
     bleData.humidity = 0xFF;
     bleData.lux = 0xFF;
     bleData.accel_x = 0xFF;
     bleData.accel_y = 0xFF;
     bleData.accel_z = 0xFF;
-    /*
-    bleData.id_1 = RET_pf_identifier[0]; //dont use this just stick it in the local name
-    bleData.id_2 = RET_pf_identifier[1];
-    bleData.id_3 = RET_pf_identifier[2];
-    bleData.id_4 = RET_pf_identifier[3];
-    bleData.id_5 = RET_pf_identifier[4];
-    bleData.id_6 = RET_pf_identifier[5];
-    */
 }
-void bleUpdateAndAdvertise(void)
+void bleUpdateAndAdvertise(void) 
 {
-    if (RET_setting_beacon_interval_seconds < 2) {RET_setting_beacon_interval_seconds = 2;}
-    int AdvertisingInterval = (RET_setting_beacon_interval_seconds * 1000);
     bleData_t bleData;
     bleBuildData(bleData);
     myble.gap().stopAdvertising();
     myble.gap().setTxPower(DEFAULT_BEACON_POWER); // set tx power,valid values are -40, -20, -16, -12, -8, -4, 0, 4
     myble.gap().accumulateAdvertisingPayloadTxPower(DEFAULT_BEACON_POWER); // (accepted values are -40, -30, -20, -16, -12, -8, -4, 0, and 4 dBm)
-    myble.gap().setAdvertisingInterval(AdvertisingInterval);
+    myble.gap().setAdvertisingInterval(RET_setting_beacon_interval_ms_active);
     myble.gap().updateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
     //myble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
     myble.gap().startAdvertising();
     RET_bleBroadcasting = true;
-    if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Adv Start");debug_exe();}
+    RET_BLEpacketUpdate = false;
 }
 void bleSetupAdvertising(BLE::InitializationCompleteCallbackContext *params)
 {
@@ -537,9 +321,8 @@
         myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE );
         myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)localname, sizeof(localname));
         myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
-        //myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
+        ////myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
         myble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
-        if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Setup...");debug_exe();}  
     }
 }
 void bleStopAdvertising(void)
@@ -548,7 +331,6 @@
     RET_bleBroadcasting = false;
     if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Adv Stop");debug_exe();}
 }
-int blecount = 0;
 void bleAdvertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
     struct AdvertisingData_t {
         uint8_t                        length;
@@ -559,135 +341,15 @@
         uint16_t applicationSpecificId;
     } PACKED;
     
-    //LOOKING FOR (SIAEC BETA)
-    //14f64b977c250854
-    //442ce31996801546
-    
-    char beta_location_tag_0[17] = {'4','1','1','7','6','9','0','5','6','4','6','8','3','f','6','8',0x00}; //bens
-    char beta_location_tag_1[17] = {'1','4','f','6','4','b','9','7','7','c','2','5','0','8','5','4',0x00}; //singapore
-    char beta_location_tag_2[17] = {'4','4','2','c','e','3','1','9','9','6','8','0','1','5','4','6',0x00}; //singapore
-    
-    //Portal demos
-    char beta_location_tag_3[17] = {'1','5','f','c','6','d','d','5','c','3','7','f','1','f','4','a',0x00};
-    char beta_location_tag_4[17] = {'b','a','a','e','c','d','6','8','b','d','7','e','e','a','6','5',0x00};
-    char beta_location_tag_5[17] = {'7','e','4','b','7','8','e','0','f','a','3','3','0','8','a','0',0x00};
-    char beta_location_tag_6[17] = {'e','1','1','3','c','d','e','a','a','e','f','f','1','4','d','9',0x00};
-    char beta_location_tag_7[17] = {'8','c','9','2','4','5','f','f','0','c','f','a','b','9','2','f',0x00};
-    char beta_location_tag_8[17] = {'0','7','e','9','9','1','d','3','b','e','b','6','4','0','4','8',0x00};
-    char beta_location_tag_9[17] = {'9','5','6','3','a','0','8','6','2','1','e','8','e','c','1','4',0x00};
-    
-    //RR demos
-    char beta_location_tag_10[17] = {'3','3','0','2','2','c','9','f','0','b','1','8','5','3','a','c',0x00};
-    char beta_location_tag_11[17] = {'2','5','6','c','4','0','2','b','d','c','1','4','2','5','2','7',0x00};
-    char beta_location_tag_12[17] = {'8','e','9','f','0','e','c','1','4','0','e','1','2','e','e','9',0x00};
-    char beta_location_tag_13[17] = {'8','d','6','b','8','5','e','b','8','4','6','e','e','0','0','e',0x00};
-    char beta_location_tag_14[17] = {'9','3','2','7','4','c','b','9','e','4','6','d','b','6','7','6',0x00};
-    char beta_location_tag_15[17] = {'1','a','e','3','0','7','7','f','8','f','3','a','f','7','c','1',0x00};
-    char beta_location_tag_16[17] = {'f','f','d','5','a','2','e','a','4','4','9','2','e','d','a','c',0x00};
-    char beta_location_tag_17[17] = {'f','0','e','f','2','d','8','b','f','7','6','1','3','a','1','d',0x00};
-    char beta_location_tag_18[17] = {'e','e','7','6','4','c','8','5','3','4','6','b','9','5','f','2',0x00};
-    char beta_location_tag_19[17] = {'b','b','0','3','6','7','d','b','d','a','5','b','a','5','a','5',0x00};
-    
-    blecount ++;
-    
     //Search for the manufacturer specific data with matching application-ID
     AdvertisingData_t *pAdvData;
     for (size_t index = 0; index < params->advertisingDataLen; index += (pAdvData->length + 1)) {
         pAdvData = (AdvertisingData_t *)&params->advertisingData[index];
         const bleData_t *pbleData = (const bleData_t *)pAdvData->data;
         
-        //ESTIMOTE BEACON
-        //example data 020104 0303 9afe1716 9afe 22 02c887042a33f9f0 00efebc60146f8ffffffff    //spaces just to show identifier
-        
         //BLE TYPE SWITCH
         switch(pbleData->applicationSpecificId) {
-            case BLE_SERVICEID_PFBEACON1 :
-            {
-                char beacon_identifier[17];
-                snprintf(beacon_identifier, sizeof(beacon_identifier), "%02x%02x%02x%02x%02x%02x%02x%02x",
-                params->advertisingData[12],
-                params->advertisingData[13],
-                params->advertisingData[14],
-                params->advertisingData[15],
-                params->advertisingData[16],
-                params->advertisingData[17],
-                params->advertisingData[18],
-                params->advertisingData[19]);
-                //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), " Mac: [%02x%02x%02x%02x%02x%02x], rssi: %d, AType: %u, S: %04x, Id: %s",params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],params->rssi, params->type, pbleData->applicationSpecificId, beacon_identifier);debug_exe();}
-                //check to see if its one of the two location beta beacons we are looking for...
-                if (strcmp(beacon_identifier, beta_location_tag_0) == 0 
-                    || strcmp(beacon_identifier, beta_location_tag_1) == 0 
-                    || strcmp(beacon_identifier, beta_location_tag_2) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_3) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_4) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_5) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_6) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_7) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_8) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_9) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_10) == 0 
-                    || strcmp(beacon_identifier, beta_location_tag_11) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_12) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_13) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_14) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_15) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_16) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_17) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_18) == 0
-                    || strcmp(beacon_identifier, beta_location_tag_19) == 0
-                    ) {
-                    //dump advertising data
-                    //for (unsigned index = 0; index < params->advertisingDataLen; index++) { if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "%02x",params->advertisingData[index]);debug_exe(false);}}
-                    //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), " MATCH");debug_exe();}
-                    int tag_rssi = params->rssi * -1; //to convert to positive number
-                    if (tag_rssi < RET_closestLocationTag_rssi) {
-                         RET_closestLocationTag_rssi = tag_rssi;
-                         memcpy(RET_closestLocationTag_id, beacon_identifier, sizeof(RET_closestLocationTag_id));
-                         RET_locationTag_present = true;
-                         //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Location Tag: %s, rssi: %d",RET_closestLocationTag_id, RET_closestLocationTag_rssi);debug_exe();}
-                    }
-                }
-                break;
-            }
-            case BLE_SERVICEID_BT04 :
-            {  
-                //get serial
-                //char serial[9];
-                //snprintf(serial, sizeof(serial), "%02x%02x%02x%02x", params->advertisingData[11], params->advertisingData[12], params->advertisingData[13], params->advertisingData[14]);
-                //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Serial: %s", serial);debug_exe();}
-    
-                //get battery
-                //int battery = params->advertisingData[15];
-                //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Battery: %i", battery);debug_exe();}
-                
-                //get temperature positive
-                /*
-                bool temppositive = !(params->advertisingData[17] & 0b01000000);            
-                float temperature =
-                        (
-                            ((params->advertisingData[17] & 0b00111111) << 8) |
-                            ((params->advertisingData[18] & 0b11111111))
-                        ) / 100.0;
-                if (!temppositive) temperature = -temperature;
-                //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Temp: %f", temperature);debug_exe();}
-                */
-                
-                //get humidity
-                int tag_rssi = params->rssi * -1; //to convert to positive number
-                if (tag_rssi < RET_closestBT04Tag_rssi) {
-                     RET_humidity =
-                        (
-                            ((params->advertisingData[19] & 0b01111111) << 8) |
-                            ((params->advertisingData[20] & 0b11111111))
-                        ) / 100.0;
-                     //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Humidity Tag Present: %f",RET_humidity);debug_exe();}
-                }
-                //rssi
-                //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Rssi: %i", params->rssi);debug_exe();}
-
-                break;
-            }
-            case BLE_SERVICEID_PFDETECTOR1 :
+            case BLE_SERVICEID_PFDETECTOR2 :
             {
                 char ble_advdata[100];
                 snprintf(ble_advdata, sizeof(ble_advdata), "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
@@ -715,8 +377,9 @@
                 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), " Mac: [%02x%02x%02x%02x%02x%02x], rssi: %d, AType: %u, Id: %s",params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],params->rssi, pAdvData->dataType, ble_advdata);debug_exe();}
                 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Detector @rssi: %d",params->rssi);debug_exe();}
                 if (params->rssi >= -75) {
-                    RET_detector_present = true;
+                    
                 }
+                RET_settingsReceived = true;
                 break;
             }
         }
@@ -724,7 +387,6 @@
 }
 void bleConfigureScan(void)
 {
-    //configure scan
     myble.gap().setScanParams(200,200); //scan interval //scan window
     myble.gap().startScan(bleAdvertisementCallback);
 }
@@ -738,762 +400,146 @@
     bleStopAdvertising();
     myble.shutdown();
 }
-#endif
-
-//------------------------------------------------------------------------------
-// MOTION FUNCS
-//------------------------------------------------------------------------------ 
-bool checkMotion() {
-    if (RET_haveSettings) { //NEED THIS AS THINGS GO FUNKY WITHOUT RTC TIME SET CORRECTLY
-        if (lis3dh_int2) {
-            RET_motionTriggeredinFrame = true;
-            GLOBAL_needToConfigureLis3dh = true; //interrupt has fire so need to clear it
-            if(RET_debug) {
-                LED1on(100);
-            }
-            if (!RET_motionPendingOnState) {
-                RET_motionPendingOnState = true;
-                RET_motionPendingOffState = false;
-                // Log start motion time
-                RET_motionStartTime = RET_RTCunixtime;
-            }
-        } else {
-            RET_motionTriggeredinFrame = false;
-            RET_motionPendingOnState = false;
-            if (!RET_motionPendingOffState) {
-                RET_motionPendingOffState = true;
-                //log stop motion time
-                RET_motionStopTime = RET_RTCunixtime;
-            }
-        }
-        //calculate motion state
-        if (RET_motionFrameStart == 0) {RET_motionFrameStart = RET_RTCunixtime;}
-        if (RET_motionPendingOnState) {
-            //check if above threshold
-            time_t inMotionForSeconds = ((RET_RTCunixtime - RET_motionStartTime) + (DEFAULT_SLEEP_FRAME / 1000)); //Plus DEFAULT_SLEEP_FRAME as it should include frame time
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "M:%u",inMotionForSeconds);debug_exe();}
-            if (inMotionForSeconds >= RET_setting_motion_start_seconds) {
-                //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "MotionOn");debug_exe();}
-                RET_motionState = true;
-                RET_motionStateOnInLocTXInterval = true;
-                GLOBAL_have_GPSlocString_prev = false;
-                if (RET_motionState == false) { //If this is first after motionState 0
-                    if (RET_setting_activity_mode == 2 && RET_setting_activity_tx_interval_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) + (DEFAULT_SLEEP_FRAME / 1000)); //Plus DEFAULT_SLEEP_FRAME as it should include frame time
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "NM:%u",noMotionForSeconds);debug_exe();}
-            if (noMotionForSeconds >= RET_setting_motion_stop_seconds) {
-                if (RET_motionState == true) {
-                    RET_motionPendingOffState = false;
-                    RET_motionState = false;
-                    GLOBAL_motionStopFlagTriggered = true;
-                    //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "MotionStop");debug_exe();}
-                    if (RET_setting_activity_mode > 0 && RET_setting_activity_tx_interval_hrs > 0) {
-                        RET_motionTotalActivityHoursSincePost += ((float(RET_motionStopTime)-float(RET_motionStartTime)) / 3600.0f);
-                        RET_motionTotalActivityHours += RET_motionTotalActivityHoursSincePost;
-                        if (RET_setting_activity_mode == 2) {
-                            time_t epochOffsetMins = ((RET_RTCunixtime - RET_motionFrameStart) / 60);
-                            sprintf(RET_activityData+strlen(RET_activityData),"0.%u!",epochOffsetMins);
-                        }
-                    }
-                }
-            }
-        }
-    }
-    return RET_motionState;
-}
 
 //------------------------------------------------------------------------------
-// UPDATE OPERATING SETTINGS
+// FIRST RUN
 //------------------------------------------------------------------------------ 
-bool saveSettings(char* settingsBuffer) {
-    int matchCount = 0;
-    int critical_fail_count = 0;
-    int TEMP_a = -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; int TEMP_t = -1; char TEMP_u[7];
-    
-    if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RESP: %s",settingsBuffer);debug_exe();}
-    
-    //exampple
-    //+CUSD: 0,”1#a:12,b:1558020598,c:-1,d:-1,e:1,f:2,g:5,h:168,i:90,j:168,k:0,l:8,m:60,n:60,o:0,p:0,q:120,r:0,s:0,t:1,u:F859C1#”,15    
+void firstRun() {
+    //Set Serial Number
+    RET_pf_identifier[0] = 'U';
+    RET_pf_identifier[1] = 'W';
+    RET_pf_identifier[2] = 'B';
+    RET_pf_identifier[3] = '0';
+    RET_pf_identifier[4] = '1';
+    RET_pf_identifier[5] = 0x00;
     
-    if ( (matchCount = sscanf(settingsBuffer,"a:%d,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,t:%d,u:%s",
-    &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,&TEMP_t,&TEMP_u) ) > 0 ) {
-        
-        if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "PARAMS: a:%d,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,t:%d,u:%s\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,TEMP_t,TEMP_u);debug_exe();}
-        
-        if(TEMP_a > 0) { RET_setting_minimumupdate_hrs = TEMP_a;                      }
-        if(TEMP_b > 1552915630 && TEMP_b < 1900000000) {
-            if (RET_RTCunixtime < 1552915630) {
-                //assume this is first proper unixtime and set
-                RET_RTCunixtime = TEMP_b;
-            } else {
-                //this is not a first unixtime, so check within safe range, convert to long long first to avoid -1 rollover issue
-                long long unixtime_in = TEMP_b;
-                long long unixtime_current = RET_RTCunixtime;
-                if ((unixtime_in - unixtime_current) < 604800) { //allow 1 week difference
-                    RET_RTCunixtime = TEMP_b;
-                } else {
-                    critical_fail_count++;
-                    if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "unixtime too far ahead. C:%u  N:%u",RET_RTCunixtime,TEMP_b);debug_exe();}
-                }
-            }
-        } else { 
-            critical_fail_count++;
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "unixtime too low");debug_exe();}
-        }
-        if(TEMP_c > 0) { RET_setting_firmware = TEMP_c;                               } else { RET_setting_firmware = -1;}
-        if(TEMP_d > -1) { setState(TEMP_d);                                           } else { setState(STATE_NORMAL);}
-        if(TEMP_e > 0) { RET_setting_location_mode = TEMP_e;                          }
-            if(RET_setting_location_mode > 4) {RET_setting_location_mode = DEFAULT_LOCATION_MODE;}
-        if(TEMP_f > 0) { RET_setting_location_accuracy = TEMP_f;                      }
-            if(RET_setting_location_accuracy > 3) {RET_setting_location_accuracy = DEFAULT_LOCATION_ACCURACY;}
-        if(TEMP_g > 0) { RET_setting_location_tx_interval_mins = TEMP_g;              }
-        if(TEMP_h > 0) { RET_setting_location_tx_failsafe_hrs = TEMP_h;               }
-            if(RET_setting_location_tx_failsafe_hrs > 504) {RET_setting_location_tx_failsafe_hrs = DEFAULT_LOCATION_TX_FAILSAFE_HRS;}
-        if(TEMP_i > 0) { RET_setting_location_timeout = TEMP_i;                       }
-            if(RET_setting_location_timeout < 60 || RET_setting_location_timeout > 300) {RET_setting_location_timeout = DEFAULT_LOCATION_TIMEOUT;}
-        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 > 0) { RET_setting_motion_g = TEMP_l;                               }
-            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;                               }
-        if(TEMP_p > -1) { RET_setting_impact_alert = TEMP_p;                           }
-        if(TEMP_q > -1) { RET_setting_connection_timeout = TEMP_q;                     }
-            if(RET_setting_connection_timeout < 60 || RET_setting_connection_timeout > 240) { RET_setting_connection_timeout = DEFAULT_CONNECTION_TIMEOUT; }
-        if(TEMP_r > -1) { RET_setting_beacon_interval_seconds = TEMP_r;                }
-        if(TEMP_s > -1) { RET_setting_beacon_scan = TEMP_s;                            }
-        if(TEMP_t > -1) { RET_setting_activity_mode = TEMP_t;                          }
-        if(TEMP_u[0] != 0x00 && TEMP_u[1] != 0x00 && TEMP_u[2] != 0x00) { strcpy(RET_pf_identifier,TEMP_u);                      }
+    //GET INITITAL SENSORS
+    updateBatteryV();
+    //updateTemperature
+    //updateHumidity
 
-        if (critical_fail_count == 0) { 
-            RET_receivedNewSettings = true;
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "NEW SETTINGS");debug_exe();}
-            dumpSettings();
-            RET_haveSettings = true;
-            GLOBAL_needToConfigureLis3dh = true;
-            RET_SettingsGotAt = RET_RTCunixtime;
-            //check for firmware update
-            if (RET_setting_firmware > 0 && RET_setting_firmware != FW_VERSION) {
-                //Broadcast any activity data we have before fw update
-                event_activity_tx();
-                //prep for FW update
-                #if BLE_ENABLED
-                    bleShutdown();
-                #endif
-                read_app_data_from_flash(&app_data);
-                clr_flag(&app_data, app_execution_flag);
-                clr_flag(&app_data, first_run_flag);
-                app_data.current_firmware_version = FW_VERSION;
-                app_data.target_firmware_version = RET_setting_firmware;
-                write_app_data_to_flash(&app_data);
-                if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "OTA\n");debug_exe();}
-                ThisThread::sleep_for(200);
-                system_reset();
-            }
-            return true;
-        } else {
-            addToExceptionString("SCF");
-            return false;
-        }
-    } else {
-        addToExceptionString("SPE");
-        return false;
-    }
-}
-
-//------------------------------------------------------------------------------
-// SET EVENT TIMES
-//------------------------------------------------------------------------------ 
-void setEventTime_Location() {
-    if(RET_setting_location_tx_interval_mins > 0) { 
-        RET_eventTime_location_tx = (RET_RTCunixtime + (RET_setting_location_tx_interval_mins * 60));
-        if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVTSET - LOC TX @ %u, MODE %d",RET_eventTime_location_tx, RET_setting_location_mode);debug_exe();}
-    }
-    if(RET_setting_location_tx_failsafe_hrs > 0 && RET_setting_location_tx_failsafe_hrs <= 168) { 
-        RET_location_failsafe_seconds_max = (RET_setting_location_tx_failsafe_hrs * 3600);
-        if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVTSET - LOC FS TX %u s",RET_location_failsafe_seconds_max);debug_exe();}
-    } else {
-        RET_location_failsafe_seconds_max = (DEFAULT_LOCATION_TX_FAILSAFE_HRS * 3600);
-    }
-    RET_eventTime_location_failsafe_tx = (RET_RTCunixtime + RET_location_failsafe_seconds_max);
-}
-void setEventTime_Activity() {
-    if(RET_setting_activity_tx_interval_hrs > 0) { 
-        RET_eventTime_activity_tx = (RET_RTCunixtime + (RET_setting_activity_tx_interval_hrs * 3600));
-        if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVTSET - ACT TX @ %u",RET_eventTime_activity_tx);debug_exe();}
-    }
-}
-void setEventTime_Environmental() {
-    if(RET_eventTime_environmental_tx > 0) { 
-        RET_eventTime_environmental_tx = (RET_RTCunixtime + (RET_setting_environmental_tx_interval_mins * 60));
-        if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVTSET - ENV TX @ %u",RET_eventTime_environmental_tx);debug_exe();}
-    }
-}
-void setEventTimes() {
-    //SET ALL EVENT TIMES
-    setEventTime_Location();
-    setEventTime_Activity();
-    setEventTime_Environmental();
-}
-
-//------------------------------------------------------------------------------
-// ERROR LOG
-//------------------------------------------------------------------------------ 
-void sendErrorLog(char* error) {
-    updateBatteryV();
-    int timetaken = (RET_RTCunixtime - GLOBAL_wakeTime);
-    char bytestosend[100];
-    memset(bytestosend,0x00,sizeof(bytestosend));
-    snprintf(bytestosend,sizeof(bytestosend),"(%s,a:log,f:%d,v:%.2f,e:%d,z:%s.%s,s:0)\0",GLOBAL_defaultApi,FW_VERSION,RET_voltage,timetaken,error,GLOBAL_exceptionString);
-    if (modem.on(RET_force2G)) {
-        if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
-            modem.USSDmessage(bytestosend, false, 2, GLOBAL_defaultApi);
-        }
-    }
-    ThisThread::sleep_for(250);
+    //SET EVENT TIMES
+    EVENT_battery_time = (RET_RTCunixtime + EVENT_battery_interval);
+    EVENT_temperature_time = (RET_RTCunixtime + EVENT_temperature_interval);
+    EVENT_humidity_time = (RET_RTCunixtime + EVENT_humidity_interval);
+    EVENT_settingsScan_time = (RET_RTCunixtime + EVENT_settingsScan_interval);
+    EVENT_uwbScan_time = (RET_RTCunixtime + EVENT_uwbScan_interval);
 }
 
 //------------------------------------------------------------------------------
-// EVENTS
+// BLE SETTINGS SCAN
 //------------------------------------------------------------------------------ 
-void failed_broadcast_log(char* eventstring) {
-    //First available free slot
-    bool saved = false;
-    for(int i = 0; i < sizeof(GLOBAL_failed_broadcast_slots); i++) {
-        if (GLOBAL_failed_broadcast_slots[i] == false) {
-            memset(GLOBAL_failed_broadcasts[i],0x00,sizeof(GLOBAL_failed_broadcasts[i])); //clear row
-            snprintf(GLOBAL_failed_broadcasts[i],sizeof(GLOBAL_failed_broadcasts[i]),"%s",eventstring); //save new row
-            GLOBAL_failed_broadcast_slots[i] = true;
-            saved = true;
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Failed Broadcast saved: %s",eventstring);debug_exe();}
-            break;
-        }
-    }
-    if (!saved) {
-        if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Failed Broadcast save fail");debug_exe();}
-    }
-    return;
-}
-void failed_broadcasts_tx() {
-    #if BLE_ENABLED
-        bleStopAdvertising();
-    #endif
-    //check we have something to send...
-    int numbertosend = 0;
-    for(int i = 0; i < sizeof(GLOBAL_failed_broadcast_slots); i++) {
-        if (GLOBAL_failed_broadcast_slots[i] == true) {
-            numbertosend ++;
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Retry:%s",GLOBAL_failed_broadcasts[i]);debug_exe();}
-        }
-    }
-    if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Failed Broadcasts to send:%d",numbertosend);debug_exe();}
-    for(int i = 0; i < sizeof(GLOBAL_failed_broadcast_slots); i++) {
-        if (GLOBAL_failed_broadcast_slots[i] == true) {
-            if (RET_NetworkFailCount <= DEFAULT_MAX_FAILED_CONNECTIONS) {
-                if (modem.on(RET_force2G)) {
-                    if (modem.registerOnNetwork(2,RET_setting_connection_timeout,RET_NetworkFailCount)) {
-                        char result[100];
-                        bool getResponse = false;
-                        snprintf(result,sizeof(result),"%s",modem.USSDmessage(GLOBAL_failed_broadcasts[i], getResponse, 2, GLOBAL_defaultApi));
-                        if (strcmp(result, "sendok") == 0) {
-                            //clear row
-                            memset(GLOBAL_failed_broadcasts[i],0x00,sizeof(GLOBAL_failed_broadcasts[i]));
-                            GLOBAL_failed_broadcast_slots[i] = false;
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-bool event_setup(bool manualrun) {
-    #if BLE_ENABLED
-        bleStopAdvertising();
-    #endif
-    bool pass = false;
+void settingsScan() {
     LED1on(0);
-    if (RET_NetworkFailCount > DEFAULT_MAX_FAILED_CONNECTIONS) addToExceptionString("NF");
-    if (RET_GPSFailCount > DEFAULT_MAX_FAILED_GPS) addToExceptionString("GF");
-    RET_setupInProgress = true;
-    GLOBAL_have_GPSlocString_prev = false;
-    RET_lastTxTime = RET_RTCunixtime;
-    RET_NetworkFailCount = 0;
-    RET_GPSFailCount = 0;
-    RET_setting_connection_timeout = 180; //reset to longer value to setup run to help with connection
-    bool selftestresult = selfTest();
-    int connectionStartTime = RET_RTCunixtime;
-    if (modem.on(RET_force2G)) {
-        if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
-            int timetaken_total = (RET_RTCunixtime - GLOBAL_wakeTime) + 10; //add 10 for ussd response time.
-            int timetaken_connection = (RET_RTCunixtime - connectionStartTime);
-            if (manualrun) addToExceptionString("MAN");
-            char bytestosend[160];
-            snprintf(bytestosend,sizeof(bytestosend),"(%s,a:setup,f:%d,v:%.2f,t:%.1f,e:%d,y:%d,z:SETUP-%s,k:%s,m:%s,s:1)\0",GLOBAL_defaultApi,FW_VERSION,RET_voltage,RET_temperature,timetaken_total,timetaken_connection,GLOBAL_exceptionString,SKU,HW_MAJORREVISION);
-            char result[200];
-            snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, true, 2, GLOBAL_defaultApi));
-            RET_setupInProgress = false; //this turns off the flashing led
-            if (strcmp(result, "sendokrecfail") == 0) {
-                //send ok but receive fail
-                if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"USSD Send Ok but Rec fail");debug_exe();}
-                sendErrorLog("ERR-SU-NR");
-            } else if (strcmp(result, "sendfail") == 0) {
-                //do nothing
-                if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"USSD Send Fail");debug_exe();}
-            } else {
-                if (saveSettings(result) == true) {
-                    pass = true;
-                } else {
-                    //something went critically wrong getting settings 
-                    sendErrorLog("ERR-SU-IR");
-                }
-            }
-        }
-    } else {
-        //FAILUREMODE Modem failed to turn on  
-        if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Modem Fail");debug_exe();}
-    }
-    
-    //IF WE PASSED THEN LETS DO OTHER POSTS
-    if (pass == true) {
-        GLOBAL_wakeTime = RET_RTCunixtime; //lets reset this here so that the following loc and act function have sensible values for total time
-        //GET LOC DATA
-        //uint8_t previous_location_accuracy = RET_setting_location_accuracy;
-        //RET_setting_location_accuracy = 1; //set location mode to CL only
-        event_location_tx(false);
-        //RET_setting_location_accuracy = previous_location_accuracy; //set location mode back to previous
-        //SEND ANY ACTIVITY DATA
-        event_activity_tx();
-        LED1blink(4,500); //PASS AND END
-    }
-    
-    //TIDY UP = LOG RUN TIME - THIS MUST GO AT END AFTER WE HAVE GOT SERVER TIMESTAMP
-    RET_SetupRunAt = RET_RTCunixtime;
-    RET_GPSFailCount = 0;
-    RET_NetworkFailCount = 0;
-    setEventTimes();
-    //RESULT
-    return pass;
-}
-void event_turnonofflog_tx(bool turnon) {
-    #if BLE_ENABLED
-        bleStopAdvertising();
-    #endif
-    RET_NetworkFailCount = 0; //reset network blocker
-    RET_GPSFailCount = 0;
-    updateBatteryV();
-    int connectionStartTime = RET_RTCunixtime;
-    if (modem.on(RET_force2G)) {
-        char locString[70];
-        int gpsStartTime = RET_RTCunixtime;
-        memcpy(locString, modem.getLocation(1, RET_setting_location_timeout, RET_GPSFailCount, RET_NetworkFailCount), sizeof(locString));
-        int timetaken_gps = (RET_RTCunixtime - gpsStartTime);
-        if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
-            int timetaken_total = (RET_RTCunixtime - GLOBAL_wakeTime);
-            int timetaken_connection = (RET_RTCunixtime - connectionStartTime);
-            char bytestosend[160];
-            if (turnon) {
-                snprintf(bytestosend,sizeof(bytestosend),"(%s,a:log,f:%d,t:%.1f,v:%.2f,z:TURNON,e:%d,y:%d,x:%d,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,RET_temperature,RET_voltage,timetaken_total,timetaken_connection,timetaken_gps,locString);
-            } else {
-                snprintf(bytestosend,sizeof(bytestosend),"(%s,a:log,f:%d,t:%.1f,v:%.2f,z:TURNOFF,e:%d,y:%d,x:%d,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,RET_temperature,RET_voltage,timetaken_total,timetaken_connection,timetaken_gps,locString);
-            }
-            char result[180];
-            snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, false, 2, GLOBAL_defaultApi));
+    bleStopAdvertising();
+    LowPowerTimer bleScan_t;
+    bleScan_t.start();
+    RET_settingsReceived = false;
+    uint32_t bleScan_startmillis = bleScan_t.read_ms(); uint32_t bleScan_runtime = 0;
+    if (!myble.hasInitialized()) {
+        myble.init();
+        while (!myble.hasInitialized() && bleScan_runtime < 1000) { 
+            bleScan_runtime = (bleScan_t.read_ms() - bleScan_startmillis);
         }
     }
-}
-void event_location_tx(bool failsafe) {
-    #if BLE_ENABLED
-        bleStopAdvertising();
-    #endif
-    RET_location_failsafe_seconds_count = 0; //reset failsafe count
-    RET_lastTxTime = RET_RTCunixtime;
-    //check if we have any outstanding to send
-    failed_broadcasts_tx();
-    bool selfTestResult = selfTest();
-    bool skipTX = false;
-    char bytesToSend[160];
-    
-    //Check for Nearby Location Beacons
-    memset(RET_closestLocationTag_id, 0x00, sizeof(RET_closestLocationTag_id));
-    RET_closestLocationTag_rssi = 999;
-    RET_locationTag_present = false;
-    RET_detector_present = false;
-    #if BLE_ENABLED
-        blecount = 0;
-        if (RET_setting_beacon_scan == 1 && RET_setting_location_mode != LOCATION_MODE_REALTIME) {
-            LowPowerTimer bleScan_t;
-            bleScan_t.start();
-            uint32_t bleScan_startmillis = bleScan_t.read_ms(); uint32_t bleScan_runtime = 0;
-            if (!myble.hasInitialized()) {
-                myble.init();
-                while (!myble.hasInitialized() && bleScan_runtime < 1000) { 
-                    bleScan_runtime = (bleScan_t.read_ms() - bleScan_startmillis);
-                }
-            }
-            if (myble.hasInitialized()) {
-                //Scan for 10 seconds
-                bleConfigureScan();
-                bleScan_startmillis = bleScan_t.read_ms();
-                while (bleScan_runtime < 20000 && RET_detector_present == false) {
-                    bleScan_runtime = (bleScan_t.read_ms() - bleScan_startmillis);
-                    myble.waitForEvent(); // low power wait for event
-                }
-                if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLECount: %d",blecount);debug_exe();}
-                if (RET_locationTag_present && RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "LocationTag: %s, rssi: %d",RET_closestLocationTag_id, RET_closestLocationTag_rssi);debug_exe();}
-            }
-            bleScan_t.stop();
-            myble.gap().stopScan();
-        }
-        //see if we are in range of ble detector, if so, no need to get gps and broadcast
-        if (RET_detector_present == true && RET_setting_beacon_interval_seconds > 0) {
-            skipTX = true;
-        }
-    #endif
-    
-    if (skipTX == false || failsafe == true) {
-        //Set any network or GPS fail flags
-        if (RET_NetworkFailCount > DEFAULT_MAX_FAILED_CONNECTIONS) {RET_NetworkFailFlag = true;}
-        if (RET_GPSFailCount > DEFAULT_MAX_FAILED_GPS) {addToExceptionString("GF");}
-        //lets check to see if we've had repeated comms failings in this location, if so dont bother trying. reset by movment and failsafe
-        if (RET_NetworkFailCount <= DEFAULT_MAX_FAILED_CONNECTIONS) {
-            if (RET_NetworkFailFlag) {RET_NetworkFailFlag = false; addToExceptionString("NF");}
-            if (RET_receivedNewSettings) {RET_receivedNewSettings = false; addToExceptionString("SR");}
-            if (modem.on(RET_force2G)) {
-                char locString[70];
-                memset(locString,0x00,sizeof(locString));
-                int gpsStartTime = RET_RTCunixtime;
-                if (RET_locationTag_present) {
-                    snprintf(locString, sizeof(locString), ",l:%s.%d\0",RET_closestLocationTag_id,RET_closestLocationTag_rssi);
-                    addToExceptionString("BL");
-                } else {
-                    //check if we have moved since last post, if not use same valid gps fix if exists
-                    if (RET_motionStateOnInLocTXInterval == false && GLOBAL_have_GPSlocString_prev == true) {
-                        memcpy(locString, GLOBAL_GPSlocString_prev, sizeof(locString));
-                        addToExceptionString("P");
-                    } else {
-                        GLOBAL_have_GPSlocString_prev = false;
-                        memcpy(locString, modem.getLocation(RET_setting_location_accuracy, RET_setting_location_timeout, RET_GPSFailCount, RET_NetworkFailCount), sizeof(locString));
-                    }
-                }
-                int timetaken_gps = (RET_RTCunixtime - gpsStartTime);
-                
-                //SEND DATA
-                int connectionStartTime = RET_RTCunixtime;
-                
-                if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
-                    int timetaken_total = (RET_RTCunixtime - GLOBAL_wakeTime) + 10; //add 10 for avg ussd response time.
-                    int timetaken_connection = (RET_RTCunixtime - connectionStartTime);
-                    //Check if we should wait for settings back
-                    bool getSettings = true;
-                    //work out if we need to get settings back
-                    if (  ((RET_RTCunixtime - RET_SettingsGotAt)/3600) < RET_setting_minimumupdate_hrs  ) { getSettings = false; timetaken_total -= 10;} //remove the extra 10 seconds from times
-                    char bytesToSend[160];
-                    //snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:loc,f:%d,t:%.1f,v:%.2f,z:LOC-%s,e:%d,y:%d,x:%d,c:1,s:%d%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,voltage,GLOBAL_exceptionString,timetaken_total,timetaken_connection,timetaken_gps,getSettings,locString);
-                    snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:loc,f:%d,t:%.0f,n:%.0f,q:%.0f,w:%.0f,v:%.1f,z:L%s,e:%d,y:%d,x:%d,j:%d,s:%d%s)\0",GLOBAL_defaultApi,FW_VERSION,RET_temperature,RET_temperature_min,RET_temperature_max,RET_humidity,RET_voltage,GLOBAL_exceptionString,timetaken_total,timetaken_connection,timetaken_gps,RET_motionStateOnInLocTXInterval,getSettings,locString);
-                    char result[180];
-                    snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytesToSend, getSettings, 2, GLOBAL_defaultApi));
-                    //if (result != "err") {
-                    if (strcmp(result, "err") != 0) {
-                        if (getSettings) {
-                            if (saveSettings(result) == false){sendErrorLog("ERR-LOC-IR");}
-                        }
-                    } else {
-                        sendErrorLog("ERR-LOC-NR");
-                    }
-                }
-                
-                /*
-                if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
-                    int timetaken_total = (RET_RTCunixtime - GLOBAL_wakeTime) + 10; //add 10 for avg ussd response time.
-                    int timetaken_connection = (RET_RTCunixtime - connectionStartTime);
-                    //Check if we should wait for settings back
-                    bool getSettings = true;
-                    //work out if we need to get settings back
-                    if (  ((RET_RTCunixtime - RET_SettingsGotAt)/3600) < RET_setting_minimumupdate_hrs  ) { getSettings = false; timetaken_total -= 10;} //remove the extra 10 seconds from times
-                    snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:loc,f:%d,t:%.0f,n:%.0f,q:%.0f,w:%.0f,v:%.1f,z:L%s,e:%d,y:%d,x:%d,j:%d,s:%d%s)\0",GLOBAL_defaultApi,FW_VERSION,RET_temperature,RET_temperature_min,RET_temperature_max,RET_humidity,RET_voltage,GLOBAL_exceptionString,timetaken_total,timetaken_connection,timetaken_gps,RET_motionStateOnInLocTXInterval,getSettings,locString);
-                    //snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:loc,f:%d,t:%.0f,v:%.1f,z:L-%s,e:%d,y:%d,x:%d,j:%d,s:%d%s)\0",GLOBAL_defaultApi,FW_VERSION,RET_temperature,RET_voltage,GLOBAL_exceptionString,timetaken_total,timetaken_connection,timetaken_gps,RET_motionStateOnInLocTXInterval,getSettings,locString);
-                    char result[180];
-                    snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytesToSend, getSettings, GLOBAL_defaultApi));
-                    if (getSettings == true && strcmp(result, "sendokrecfail") == 0) {
-                        //send ok but receive fail
-                        if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"USSD Send Ok but Rec fail");debug_exe();}
-                        sendErrorLog("ERR-LOC-NR");
-                    } else if (strcmp(result, "sendok") == 0) {
-                        //do nothing
-                    } else if (strcmp(result, "sendfail") == 0) {
-                        if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"USSD Send Fail");debug_exe();}
-                        //need to log for retry
-                    } else {
-                        if (getSettings) {
-                            if (saveSettings(result) == false){sendErrorLog("ERR-LOC-IR");}
-                        }
-                    }
-                }
-                */
-            }
+    if (myble.hasInitialized()) {
+        bleConfigureScan();
+        bleScan_startmillis = bleScan_t.read_ms();
+        while (bleScan_runtime < DEFAULT_SETTINGSSCANTIME_MS && RET_settingsReceived == false) {
+            bleScan_runtime = (bleScan_t.read_ms() - bleScan_startmillis);
+            myble.waitForEvent(); // low power wait for event
         }
     }
-    //RESETS
-    RET_motionStateOnInLocTXInterval = false;
-    setEventTime_Location();
-}
-void event_activity_tx() {
-    #if BLE_ENABLED
-        bleStopAdvertising();
-    #endif
-    //check if we have any outstanding to send
-    failed_broadcasts_tx();
-    //check we have something to send...
-    bool sendok = false;
-    if (RET_motionTotalActivityHoursSincePost > 0.0f && RET_setting_activity_mode > 0) {
-        //Build data to send
-        char bytesToSend[160];
-        if (RET_setting_activity_mode == 1) {
-            snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:act,t:%u,r:%.2f,h:%.2f)\0",GLOBAL_defaultApi,RET_motionFrameStart,RET_motionTotalActivityHoursSincePost,RET_motionTotalActivityHours);
-        } else if (RET_setting_activity_mode == 2) {
-            snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:act,e:%s,t:%u,r:%.2f)\0",GLOBAL_defaultApi,RET_activityData,RET_motionFrameStart,RET_motionTotalActivityHoursSincePost);
-        }
-        if (RET_NetworkFailCount <= DEFAULT_MAX_FAILED_CONNECTIONS) {
-            if (modem.on(RET_force2G)) {
-                //SEND DATA
-                if (modem.registerOnNetwork(2,RET_setting_connection_timeout,RET_NetworkFailCount)) {
-                    char result[100];
-                    bool getResponse = false;
-                    snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytesToSend, getResponse, 2, GLOBAL_defaultApi));
-                    if (strcmp(result, "sendok") == 0) {
-                        sendok = true;
-                        //if(!RET_debug) {sendok = true;} //FOR TESTING
-                    }
-                }
-            }
-        }
-        //If send failed then log it for retry - only need to do this for mode 2, for mode the time just increments
-        if (sendok == true) {
-            if (RET_setting_activity_mode == 1) {
-                RET_motionTotalActivityHoursSincePost = 0.0f;
-                if (RET_haveSettings) { RET_motionFrameStart = RET_RTCunixtime; }
-            } else if (RET_setting_activity_mode == 2) {
-                RET_motionTotalActivityHoursSincePost = 0.0f;
-                if (RET_haveSettings) { RET_motionFrameStart = RET_RTCunixtime; }
-            }
-        } else if (sendok == false) {
-            if (RET_setting_activity_mode == 1) {
-                //do nothing
-            } else if (RET_setting_activity_mode == 2) {
-                failed_broadcast_log(bytesToSend);
-                RET_motionTotalActivityHoursSincePost = 0.0f;
-                if (RET_haveSettings) { RET_motionFrameStart = RET_RTCunixtime; }
-            }
-        }
-    }
-    //RESETS
-    memset(RET_activityData,0x00,sizeof(RET_activityData));
-    setEventTime_Activity();
+    bleScan_t.stop();
+    myble.gap().stopScan();
+    LED1off();
 }
 
 //------------------------------------------------------------------------------
 // STATE ENGINE
 //------------------------------------------------------------------------------ 
 void mainStateEngine() {
-    switch(RET_state) {
-        case STATE_SETUP :
-        { //need the curlies to avoid "transfer of control bypass init error warning"
-            RET_busy = true;
-            //check that we havent run setup too recently
-            time_t setupRunAt_delta = (RET_RTCunixtime - RET_SetupRunAt);
-            if (RET_SetupRunAt == 0 || setupRunAt_delta >= ONEDAYINSECONDS) {
-                updateBatteryV();
-                if (event_setup(false)) {
-                    // All good
-                    setState(STATE_NORMAL);
-                } else {
-                    RET_eventTime_wakeFromDormant = (RET_RTCunixtime + ONEDAYINSECONDS);
-                    setState(STATE_DORMANT);
-                    if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"SETUP FAILED:DORMANT until %u\n",RET_eventTime_wakeFromDormant);debug_exe();}
-                }
-            } else {
-                time_t setupCanRunAt = (RET_RTCunixtime + (ONEDAYINSECONDS - setupRunAt_delta));
-                if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"SETUP CAN RUN AGAIN @%u \n",setupCanRunAt);debug_exe();}
-            }
-            RET_busy = false;
-            break;
-        }
-        case STATE_NORMAL :
-        {   
-            RET_busy = true;
-            //LOCATION EVENT
-            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) { run_location_tx = true; }
-                    break;
-                case 2: //INTERVAL POST WITH MOTION CHECK
-                    if(RET_RTCunixtime >= RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { 
-                        if (RET_motionStateOnInLocTXInterval == true || RET_motionState == true) {
-                            run_location_tx = true;
-                        } else {
-                            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Skip TX no mot\n");debug_exe();}
-                        }
-                    }
-                    break;
-                case 3: //POST ON STOP MOTION
-                    if (GLOBAL_motionStopFlagTriggered) { GLOBAL_motionStopFlagTriggered = false; run_location_tx = true; }
-                    break;
-            }
-            if(run_location_tx == false && RET_location_failsafe_seconds_count >= RET_location_failsafe_seconds_max) { 
-                RET_NetworkFailCount = 0; //reset to ensure connection
-                RET_GPSFailCount = 0; // reset to ensure gps try
-                addToExceptionString("FS");
-                updateBatteryV();
-                event_location_tx(true);
-            } else {
-                if (run_location_tx) { 
-                    updateBatteryV(); 
-                    event_location_tx(false); 
-                }
-            }
-            
-            //ACTIVITY EVENT
-            bool run_activity_tx = false;
-            if(RET_RTCunixtime >= RET_eventTime_activity_tx && RET_eventTime_activity_tx > 0) {
-                if (RET_setting_activity_mode == 1 && RET_motionTotalActivityHoursSincePost > 0.0f) {
-                    run_activity_tx = true;
-                }
-                if (RET_setting_activity_mode == 2 && strlen(RET_activityData) > 1) {
-                    run_activity_tx = true;
-                }
-            }
-            //If in sendevent mode, check if buffer is close to full, if so send
-            if (RET_setting_activity_mode == 2 && strlen(RET_activityData) > (ACTIVITY_BUFFERSIZE-20)) { run_activity_tx = true; }
-            if (run_activity_tx) { event_activity_tx(); }
-            
-            RET_busy = false;
-            break;
-        }
-        case STATE_DORMANT :
-        {
-            RET_busy = true;
-            if (RET_RTCunixtime >= RET_eventTime_wakeFromDormant) {
-                if (RET_haveSettings) {
-                    setState(STATE_NORMAL); 
-                } else {
-                    setState(STATE_SETUP); 
-                }
-            }
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"STATE:DORMANT until %u  Prev S:%d\n",RET_eventTime_wakeFromDormant,RET_state_prev);debug_exe();}
-            RET_busy = false;
-            break;
-        }
-        case STATE_BUTTONPRESS1 :
-        {
-            RET_busy = true;
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 1\n");debug_exe();}
-            updateBatteryV();
-            if (RET_voltage < 2.5f) {
-                LED1blink(3,500);
-            } else if (selfTest() == false){
-                LED1blink(4,500);
-            } else {
-                if(RET_state_prev == STATE_DORMANT) {
-                    LED1on(500);
-                } else if (RET_state_prev == STATE_NORMAL) {
-                    LED1blink(2,500);
-                }
-            }
-            if (RET_state_prev != STATE_NORMAL || RET_state_prev != STATE_DORMANT) {
-                setState(STATE_NORMAL);
-            } else {
-                setState(RET_state_prev);
-            }
-            dumpSettings();
-            RET_busy = false;
-            break;
-        }
-        case STATE_BUTTONPRESS3 :
-        {
-            RET_busy = true;
-            if(RET_state_prev == STATE_DORMANT || RET_state_prev == STATE_NORMAL) {
-                if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 3\n");debug_exe();}
-                LED1blink(3,500);
-                LED1on(0);
-                updateBatteryV();
-                event_setup(true);
-                LED1off();
-            }
-            setState(STATE_NORMAL); //turns device back on
-            RET_busy = false;
-            break;
-        }
-        case STATE_BUTTONPRESS5 :
-        {
-            RET_busy = true;
-            if(RET_state_prev == STATE_DORMANT || RET_state_prev == STATE_NORMAL) {
-                if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 5\n");debug_exe();}
-                LED1blink(5,500);
-                LED1on(0);
-                updateBatteryV();
-                event_location_tx(false);
-                LED1off();
-            }
-            setState(STATE_NORMAL); //turns device back on
-            RET_busy = false;
-            break;  
-        }
-        case STATE_TURNOFF :
-        {
-            RET_busy = true;
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON HOLD \n");debug_exe();}
-            RET_eventTime_wakeFromDormant = (RET_RTCunixtime + THREEDAYSINSECONDS);
-            setState(STATE_DORMANT);
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"TURNING OFF\n");debug_exe();}
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"STATE:DORMANT until %u\n",RET_eventTime_wakeFromDormant);debug_exe();}
-            LED1on(5000);
-            //event_turnonofflog_tx(false);
-            RET_busy = false;
-            break;
-        }
-        case STATE_TURNON :
-        {
-            RET_busy = true;
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON HOLD \n");debug_exe();}
-            if (RET_haveSettings) {
-                setState(STATE_NORMAL);
-            } else {
-                setState(STATE_SETUP);
-            }
-            if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"TURNING ON\n");debug_exe();}
-            LED1blink(20,100);
-            RET_busy = false;
-            break;
-        }
-        case STATE_SCORCHEDEARTH :
-        {
-            RET_busy = true;
-            if(RET_debug){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);
-            app_data.current_firmware_version = 0;
-            app_data.target_firmware_version = 0;
-            write_app_data_to_flash(&app_data);
-            system_reset();
-            RET_busy = false;
-            break;
-        }
-        default :
-        {
-            setState(STATE_SETUP);
+    if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "MainStateEngine");debug_exe();}
+    
+    if (EVENT_buttonPress) {
+        if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_ButtonPress");debug_exe();}
+        EVENT_buttonClear_time = (RET_RTCunixtime + EVENT_buttonClear_interval);
+        RET_setting_beacon_interval_ms_active = DEFAULT_BEACON_INTERVAL_FAST_MS;
+        RET_BLEpacketUpdate = true;
+        EVENT_buttonPress = false;
+    }
+    
+    if (EVENT_motionClear) {
+        if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_MotionClear");debug_exe();}
+        EVENT_motionClear_time = 0;
+        RET_motionState = false;
+        RET_impactState = false;
+        RET_BLEpacketUpdate = true;
+        EVENT_motionClear = false;
+    }
+    
+    if (EVENT_buttonClear) {
+        if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_ButtonClear");debug_exe();}
+        EVENT_buttonClear_time = 0;
+        RET_buttonPressed = false;
+        RET_buttonPressCount = 0;
+        RET_setting_beacon_interval_ms_active = RET_setting_beacon_interval_ms; //reset back to normal broadcast rate
+        RET_BLEpacketUpdate = true;
+        EVENT_buttonClear = false;
+    }
+    
+    if (EVENT_battery) {
+        if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_Battery");debug_exe();}
+        EVENT_battery_time = (RET_RTCunixtime + EVENT_battery_interval);
+        updateBatteryV();
+        RET_BLEpacketUpdate = true;
+        EVENT_battery = false;
+    }
+    
+    if (EVENT_temperature) {
+        if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_Temperature");debug_exe();}
+        EVENT_temperature_time = (RET_RTCunixtime + EVENT_temperature_interval);
+        RET_BLEpacketUpdate = true;
+        EVENT_temperature = false;
+        //get temperature TODO - only update ble if different to last
+    }
+    
+    if (EVENT_humidity) {
+        if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_Humidity");debug_exe();}
+        EVENT_humidity_time = (RET_RTCunixtime + EVENT_humidity_interval);
+        RET_BLEpacketUpdate = true;
+        EVENT_humidity = false;
+        //get humidity TODO - only update ble if different to last
+    }
+    
+    if (EVENT_settingsScan) {
+        if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_SettingsScan");debug_exe();}
+        EVENT_settingsScan_time = (RET_RTCunixtime + EVENT_settingsScan_interval);
+        EVENT_settingsScan = false;
+        settingsScan();
+    }
+    
+    if (EVENT_uwbScan) {
+        if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_uwbScan");debug_exe();}
+        EVENT_uwbScan_time = (RET_RTCunixtime + EVENT_uwbScan_interval);
+        EVENT_uwbScan = false;
+    }
+        
+    //BLE START OR UPDATE
+    if (RET_bleBroadcasting == false) {
+        myble.init(bleSetupAdvertising);
+        if (myble.hasInitialized()) {
+            if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Start");debug_exe();}
+            bleUpdateAndAdvertise();
         }
     }
+    if (RET_BLEpacketUpdate == true) {
+        if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Update only");debug_exe();}
+        bleUpdateAndAdvertise();
+    }    
+    
+    //END
+    RET_haveEventsToRun = false;
 }
 
 //------------------------------------------------------------------------------
@@ -1504,121 +550,43 @@
     LED1off();
     ThisThread::sleep_for(2000); //Initial pause, this is needed for softdevice to init, dont remove!! If we dont have this we get crashes
     watchdog.configure(400.0); //6.6 mins //Do not set to less than 4500ms or can cause issues with softdevice
-    modem.off(false);
     RTCticker.attach(&RTCtick, 1.0);
     LPtimer.start();
     button.fall(&buttonPress);
     button.rise(&buttonRelease);
-    read_app_data_from_flash(&app_data);
-    dumpSettings();
-    
-    //CHECK IF THIS IS RESET
-    //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(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:HW\n");debug_exe();}
-                addToExceptionString("RH");
-            break;
-            case 0x00000002  :
-                if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:WD\n");debug_exe();}
-                addToExceptionString("WD");
-            break;
-            case 0x00000004  :
-                if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:SW\n");debug_exe();}
-                addToExceptionString("RS");
-            break;
-            case 0x00000008  :
-                if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:LU\n");debug_exe();}
-                addToExceptionString("RL");
-            break;            
-        }
-        NRF_POWER->RESETREAS = 0xffffffff;
-    }
-    
-    //CHECK FOR FIRST BOOT
-    if (RET_coldBoot == 1) {  
-        memset(RET_activityData,0x00,sizeof(RET_activityData));
-        lis3dh_configureForSleep(DEFAULT_MOTION_G,DEFAULT_IMPACT_G);
-        updateBatteryV();
-        if (RET_voltage < 2.5f) { LED1errorCode(10,2);}
-        addToExceptionString("FR");
-    }
+    //read_app_data_from_flash(&app_data);
+    firstRun();
     
     //MAIN LOOP
     while(true) {
         RET_asleep = false;
-        watchdogKick();
-        updateTemperatures();
-        resetSessionVars();
-        healthCheck(); //this must be after resetGlobals
-        GLOBAL_wakeTime = RET_RTCunixtime;
-        
-        //check and log motion
-        if (RET_state == STATE_NORMAL || RET_state == STATE_SETUP) { 
-            if (checkMotion() == true) { //if motionstate is true, then reset network and gps fail counts, so that they are not skipped
-                RET_NetworkFailCount = 0;
-                RET_GPSFailCount = 0;
-            }
-        }
+        LED1on(20);
         
-        //MAIN LOGIC
-        if(RET_debug){
-            if (RET_state != 99) {
-                debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "F:%d, S:%d, SET:%d, MF:%d, MS:%d, MTX:%d, %u, L:%u, FSC:%u FSM:%u, FST:%u, A:%u", FW_VERSION, RET_state, RET_haveSettings, RET_motionTriggeredinFrame, RET_motionState, RET_motionStateOnInLocTXInterval, RET_RTCunixtime,RET_eventTime_location_tx,RET_location_failsafe_seconds_count,RET_location_failsafe_seconds_max,RET_eventTime_location_failsafe_tx,RET_eventTime_activity_tx);debug_exe();
-                debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ACT M:%d, HsP:%.2f, Ht:%.2f, D:%s",RET_setting_activity_mode,RET_motionTotalActivityHoursSincePost,RET_motionTotalActivityHours,RET_activityData);debug_exe();
-            } else {
-                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 (RET_coldBoot == false && RET_RTCunixtime > RET_debug_offat) {
-                debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"DEBUGGING OFF\n");debug_exe();
-                RET_debug = false;
-            }
-        }
-
         //STATE ENGINE
         mainStateEngine();
         
         //LOG FIRST RUN - BOOTLOADER COMMS
         if (RET_coldBoot) {
-            recordFirmwareAsValid();
+            //recordFirmwareAsValid();
             RET_coldBoot = 0;
         }
         
-        //CONFIGURE BLE BEACON BROADCAST
-        #if BLE_ENABLED
-            //see if we are in range of ble detector, if so, no need to get gps and broadcast
-            if (RET_setting_beacon_interval_seconds > 0 && RET_pf_identifier[0] != 0x00 && RET_pf_identifier[1] != 0x00 && RET_pf_identifier[2] != 0x00) {
-                if (RET_bleBroadcasting == false) {
-                    if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE init...");debug_exe();}
-                    myble.init(bleSetupAdvertising);
-                    if (myble.hasInitialized()) {
-                        if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "OK");debug_exe();}
-                        bleUpdateAndAdvertise();
-                    } else {
-                        if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "FAIL");debug_exe();}
-                    }
-                } else {
-                    if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE update");debug_exe();}
-                    bleUpdateAndAdvertise();
-                }
-            } else {
-                if (RET_bleBroadcasting == true) bleStopAdvertising();
+        //DEBUGGING OFF TIMER
+        if(RET_debug){
+            if (RET_RTCunixtime > RET_debug_offat) {
+                debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"DEBUGGING OFF\n");debug_exe();
+                RET_debug = false;
             }
-        #endif
-        
+        }
+                
         //PRE-SLEEP ACTIONS
-        RET_location_failsafe_seconds_count += (DEFAULT_SLEEP_FRAME / 1000);
-        memset(GLOBAL_exceptionString,0x00,sizeof(GLOBAL_exceptionString));
-        LED1off();
-        modem.off(GLOBAL_modemOn); //HARD OR SOFT SHUT DOWN - DEPENDING ON modemOn state
-        if (GLOBAL_needToConfigureLis3dh) { lis3dh_configureForSleep(RET_setting_motion_g,RET_setting_impact_g); }
+        //if (GLOBAL_needToConfigureLis3dh) { lis3dh_configureForSleep(RET_setting_motion_g,RET_setting_impact_g); }
+        watchdogKick();
+        //SLEEP
         nrf_configureForSleep();
         NRFuart_uninit();
-        watchdogKick();
-        //SLEEP
         RET_asleep = true;
+        LED1off();
         mainthread.wait(DEFAULT_SLEEP_FRAME);
     }
 }
\ No newline at end of file