init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Revision:
19:22261767c87a
Parent:
18:22edaa7e74b1
Child:
20:5404841fdd2b
--- a/main.cpp	Tue Dec 18 12:43:32 2018 +0000
+++ b/main.cpp	Tue Dec 18 21:41:39 2018 +0000
@@ -12,7 +12,7 @@
 //------------------------------------------------------------------------------
 //GLOBAL VARS / CLEARED ON SLEEP (IF USING SOFT REBOOT HACK)
 //------------------------------------------------------------------------------ 
-char* GLOBAL_defaultApi = "b:gps2,d:3";
+char* GLOBAL_defaultApi = "b:gps2";
 bool GLOBAL_accel_healthy = false;
 bool GLOBAL_requireSoftReset = false;
 bool GLOBAL_motionFlagTriggered = false;
@@ -30,9 +30,10 @@
 #if defined ( __CC_ARM ) /** THIS IS THE MBED ONLINE COMPILER TOOLCHAIN*/ //MUST BE STATICS
 //IDENTITY
 static long long        RET_imei                                        __attribute__((section("noinit"),zero_init));
-static char             RET_pf_identifier[6]                            __attribute__((section("noinit"),zero_init));
+static char             RET_pf_identifier[7]                            __attribute__((section("noinit"),zero_init));
 //SETTINGS
 static int              RET_setting_firmware                            __attribute__((section("noinit"),zero_init));
+static uint8_t          RET_setting_location_mode                       __attribute__((section("noinit"),zero_init));
 static uint8_t          RET_setting_location_accuracy                   __attribute__((section("noinit"),zero_init));
 static uint32_t         RET_setting_location_tx_interval_mins           __attribute__((section("noinit"),zero_init));
 static uint32_t         RET_setting_location_tx_failsafe_hrs            __attribute__((section("noinit"),zero_init));
@@ -58,7 +59,6 @@
 static time_t           RET_buttonReleaseTime                           __attribute__((section("noinit"),zero_init));
 static time_t           RET_buttonHoldTime                              __attribute__((section("noinit"),zero_init));
 static time_t           RET_RTCunixtime                                 __attribute__((section("noinit"),zero_init));
-//static long long        RET_RTCmillis                                   __attribute__((section("noinit"),zero_init));
 //MOTION STATE
 static bool             RET_motionTriggered                             __attribute__((section("noinit"),zero_init));
 static time_t           RET_motionStartTime                             __attribute__((section("noinit"),zero_init));
@@ -67,13 +67,17 @@
 static bool             RET_motionPendingOffState                       __attribute__((section("noinit"),zero_init));
 static bool             RET_motionState                                 __attribute__((section("noinit"),zero_init));
 static float            RET_motionTotalActivityHours                    __attribute__((section("noinit"),zero_init));
-static char             RET_activityData[100]                             __attribute__((section("noinit"),zero_init));
+static char             RET_activityData[130]                           __attribute__((section("noinit"),zero_init));
+//TO MAKE THE ABOVE BIGGER YOU NEED TO ALLOCATE MORE NOINIT MEMORY!!!!!
+
 //IMPACT
 static bool             RET_impactTriggered                             __attribute__((section("noinit"),zero_init));
-//EVENT HANDLING
+//EVENTS LOGGING
 static time_t           RET_eventTime_location_log                      __attribute__((section("noinit"),zero_init));
+static time_t           RET_eventTime_environmental_log                 __attribute__((section("noinit"),zero_init));
+//EVENTS TX
 static time_t           RET_eventTime_location_tx                       __attribute__((section("noinit"),zero_init));
-static time_t           RET_eventTime_environmental_log                 __attribute__((section("noinit"),zero_init));
+static time_t           RET_eventTime_location_failsafe_tx              __attribute__((section("noinit"),zero_init));
 static time_t           RET_eventTime_environmental_tx                  __attribute__((section("noinit"),zero_init));
 static time_t           RET_eventTime_activity_tx                       __attribute__((section("noinit"),zero_init));
 static time_t           RET_eventTime_wakeFromDormant                   __attribute__((section("noinit"),zero_init));
@@ -127,29 +131,59 @@
     }
     mainthread.wait(sleep_milliseconds);
 }
+void setState(uint8_t state) {
+    RET_state_prev = RET_state;
+    RET_state = state;
+    DEBUG("STATEREADBACK %d\n",RET_state)
+}
+void getBatteryV() {
+    NRF52_SAADC batteryIn;
+    batteryIn.addChannel(9); // vdd for battery
+    batteryIn.calibrate();
+    for (uint8_t i = 1; i < 3; i++) { // need to get it 3 times to get accurate data, first one is always low for some reason
+        batteryIn.updateData();
+        GLOBAL_voltage = (batteryIn.getData()[0])*(1.0/1024.0)*3.65;
+    }
+}
+//------------------------------------------------------------------------------
+// USER BUTTON HANDLING
+//------------------------------------------------------------------------------ 
+void buttonPress() {
+    RET_buttonPressTime = RET_RTCunixtime;
+}
+void buttonRelease() {
+    RET_buttonHoldTime = (RET_RTCunixtime - RET_buttonPressTime);
+    RET_buttonPressCount ++;
+}
+//------------------------------------------------------------------------------
+// RTC TICKER
+//------------------------------------------------------------------------------ 
 void RTCtick() {
-    RET_RTCmillis += 100;
-    RET_RTCunixtime = (RET_RTCmillis / 1000);
+    //YOU MUST NOT CALL ANY OTHER FUNCTIONS OR DEBUG FROM INSIDE HERE!!! OR IT LOCKS UP THE DEVICE, just change vars
+    RET_RTCunixtime += 1;
     GLOBAL_RTCunixtime = RET_RTCunixtime;
+    
     //button logic - check for hold
-    if (RET_buttonHoldTime > 4000) {
+    if (RET_buttonHoldTime > 4) {
         RET_buttonHoldTime = 0;
         RET_buttonPressCount = 0;
         RET_state_prev = RET_state;
         RET_state = STATE_BUTTONHOLD;
         mainthread.release();
     } else {
-        if((RET_RTCmillis - RET_buttonPressTime) > 500) {
+        if((RET_RTCunixtime - RET_buttonPressTime) > 1) {
             switch (RET_buttonPressCount) {   
                 case 1 :
-                    RET_state_prev = RET_state;
-                    RET_state = STATE_BUTTONPRESS1;
-                    mainthread.release();
+                    if (RET_state == STATE_NORMAL) {
+                        RET_state = STATE_BUTTONPRESS1;
+                        mainthread.release();
+                    }
                     break;
                 case 2 :
-                    RET_state_prev = RET_state;
-                    RET_state = STATE_BUTTONPRESS2;
-                    mainthread.release();
+                    if (RET_state == STATE_NORMAL) {
+                        RET_state = STATE_BUTTONPRESS2;
+                        mainthread.release();
+                    }
                     break;
                 default :
                     //do nothing
@@ -158,6 +192,10 @@
             RET_buttonPressCount = 0;
         }
     }
+    //SETUP STATE VISUALISE
+    if (RET_state == STATE_SETUP) {
+        led1 = !led1;
+    }
 }
 void factoryReset() {
     DEBUG("Factory Reset \n");
@@ -165,8 +203,15 @@
     //IDENTITY 
     RET_imei = 0;
     memset(RET_pf_identifier,0,sizeof(RET_pf_identifier));
+    //STATE
+    RET_coldBoot = 1;
+    RET_haveSettings = 0;
+    RET_state = STATE_SETUP;
+    RET_state_prev = RET_state;
+    RET_RTCunixtime = 0;
     //SETTINGS
     RET_setting_firmware = 0;
+    RET_setting_location_mode = 2;
     RET_setting_location_accuracy = 1;
     RET_setting_location_tx_interval_mins = 1440;
     RET_setting_location_tx_failsafe_hrs = (7*24); //7 days
@@ -181,13 +226,7 @@
     RET_setting_connection_timeout = 180;
     RET_setting_beacon_interval_seconds = 10;
     RET_setting_beacon_scan = 0;
-    //STATE
-    RET_coldBoot = 1;
-    RET_haveSettings = 0;
-    RET_state = STATE_SETUP;
-    RET_state_prev = RET_state;
-    RET_RTCunixtime = 0;
-    RET_RTCmillis = 0;
+    //RET_RTCmillis = 0;
     RET_buttonPressCount = 0;
     RET_buttonPressTime = 0;
     RET_buttonReleaseTime = 0;
@@ -229,20 +268,6 @@
 }
 
 //------------------------------------------------------------------------------
-// USER BUTTON HANDLING
-//------------------------------------------------------------------------------ 
-void buttonPress() {
-    RET_buttonPressTime = RET_RTCmillis;
-}
-void buttonRelease() {
-    RET_buttonHoldTime = (RET_RTCmillis - RET_buttonPressTime);
-    //debounce catch
-    if((RET_RTCmillis - RET_buttonPressTime) >= 100) {
-        RET_buttonPressCount ++;
-    }
-}
-
-//------------------------------------------------------------------------------
 // MOTION FUNCS
 //------------------------------------------------------------------------------ 
 void checkMotion() {
@@ -291,8 +316,9 @@
 bool saveSettings(char* settingsBuffer) {
     //process result
     int matchCount = 0;
-    char TEMP_a[6]; 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 critical_fail_count = 0;
+    char TEMP_a[7]; time_t TEMP_b = 0; int TEMP_c = -1; int TEMP_d = -1; int TEMP_e = -1; int TEMP_f = -1; int TEMP_g = -1; int TEMP_h = -1; int TEMP_i = -1; int TEMP_j = -1; 
+    int TEMP_k = -1; int TEMP_l = -1; int TEMP_m = -1; int TEMP_n = -1; int TEMP_o = -1; int TEMP_p = -1; int TEMP_q = -1; int TEMP_r = -1; int TEMP_s = -1;
     if ( (matchCount = sscanf(settingsBuffer,"a:%c%c%c%c%c%c,b:%u,c:%d,d:%d,e:%d,f:%d,g:%d,h:%d,i:%d,j:%d,k:%d,l:%d,m:%d,n:%d,o:%d,p:%d,q:%d,r:%d,s:%d",
     &TEMP_a[0],&TEMP_a[1],&TEMP_a[2],&TEMP_a[3],&TEMP_a[4],&TEMP_a[5],&TEMP_b,&TEMP_c,&TEMP_d,&TEMP_e,&TEMP_f,&TEMP_g,&TEMP_h,&TEMP_i,&TEMP_j,&TEMP_k,&TEMP_l,&TEMP_m,&TEMP_n,&TEMP_o,&TEMP_p,&TEMP_q,&TEMP_r,&TEMP_s) ) > 0 ) {
         DEBUG("VALUES: a:%s,b:%u,c:%d,d:%d,e:%d,f:%d,g:%d,h:%d,i:%d,j:%d,k:%d,l:%d,m:%d,n:%d,o:%d,p:%d,q:%d,r:%d,s:%d\n",
@@ -300,29 +326,55 @@
         
         //FAILUREMODE need to be checking thse against checksums
         char changed;
-        if(TEMP_b != 0) { RET_RTCunixtime = TEMP_b;                                changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_RTCunixtime:%lld..%c\n",RET_RTCunixtime,changed);
-        if(TEMP_b != 0) { RET_RTCmillis = ((long long)TEMP_b * 1000);              changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_RTCmillis:%lld..%c\n",RET_RTCmillis,changed);
         //FAILUREMODE need to verify the identifier against a reg exp or similar
-        if(1==1) { memcpy(RET_pf_identifier, TEMP_a, sizeof(TEMP_a));              changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_pf_identifier:%s..%c\n",RET_pf_identifier,changed);
+        if(1==1) { memcpy(RET_pf_identifier, TEMP_a, sizeof(TEMP_a));              changed = 'Y'; } else { changed = 'N'; critical_fail_count++; }; DEBUG("RET_pf_identifier:%s..%c\n",RET_pf_identifier,changed);
+        if(TEMP_b != 0) { RET_RTCunixtime = TEMP_b;                                changed = 'Y'; } else { changed = 'N'; critical_fail_count++; }; DEBUG("RET_RTCunixtime:%u..%c\n",RET_RTCunixtime,changed);
         if(TEMP_c != -1) { RET_setting_firmware = TEMP_c;                          changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_firmware:%d..%c\n",RET_setting_firmware,changed);
-        if(TEMP_d != -1) { RET_state = TEMP_d; RET_state_prev = RET_state;         changed = 'Y'; } else { RET_state = STATE_DORMANT; changed = 'N'; }; DEBUG("RET_state:%d..%c\n",RET_state,changed);
-        if(TEMP_e != -1) { RET_setting_location_accuracy = TEMP_e;                 changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_accuracy:%d..%c\n",RET_setting_location_accuracy,changed);
-        if(TEMP_f != -1) { RET_setting_location_tx_interval_mins = TEMP_f;         changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_tx_interval_mins:%d..%c\n",RET_setting_location_tx_interval_mins,changed);
-        if(TEMP_g != -1) { RET_setting_location_tx_failsafe_hrs = TEMP_g;          changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_tx_failsafe_hrs:%d..%c\n",RET_setting_location_tx_failsafe_hrs,changed)
-        if(TEMP_h != -1) { RET_setting_location_timeout = TEMP_h;                  changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_timeout:%d..%c\n",RET_setting_location_timeout,changed)
-        if(TEMP_i != -1) { RET_setting_activity_tx_interval_mins = TEMP_i;         changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_activity_tx_interval_mins:%d..%c\n",RET_setting_activity_tx_interval_mins,changed)
-        if(TEMP_j != -1) { RET_setting_environmental_tx_interval_mins = TEMP_j;    changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_environmental_tx_interval_mins:%d..%c\n",RET_setting_environmental_tx_interval_mins,changed)
-        if(TEMP_k != -1) { RET_setting_motion_g = TEMP_k;                          changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_motion_g:%d..%c\n",RET_setting_motion_g,changed)
-        if(TEMP_l != -1) { RET_setting_motion_start_seconds = TEMP_l;              changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_motion_start_seconds:%d..%c\n",RET_setting_motion_start_seconds,changed)
-        if(TEMP_m != -1) { RET_setting_motion_stop_seconds = TEMP_m;               changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_motion_stop_seconds:%d..%c\n",RET_setting_motion_stop_seconds,changed)
-        if(TEMP_n != -1) { RET_setting_impact_g = TEMP_n;                          changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_impact_g:%d..%c\n",RET_setting_impact_g,changed)
-        if(TEMP_o != -1) { RET_setting_impact_alert = TEMP_o;                      changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_impact_alert:%d..%c\n",RET_setting_impact_alert,changed)
-        if(TEMP_p != -1) { RET_setting_connection_timeout = TEMP_p;                changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_connection_timeout:%d..%c\n",RET_setting_connection_timeout,changed)
-        if(TEMP_q != -1) { RET_setting_beacon_interval_seconds = TEMP_q;           changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_beacon_interval_seconds:%d..%c\n",RET_setting_beacon_interval_seconds,changed)
-        if(TEMP_r != -1) { RET_setting_beacon_scan = TEMP_r;                       changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_beacon_scan:%d..%c\n",RET_setting_beacon_scan,changed)
+        if(TEMP_d != -1) { setState(TEMP_d);                                       changed = 'Y'; } else { changed = 'N'; critical_fail_count++; }; DEBUG("RET_state:%d..%c\n",RET_state,changed);
+        if(TEMP_e != -1) { RET_setting_location_mode = TEMP_e;                     changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_accuracy:%d..%c\n",RET_setting_location_accuracy,changed);
+        if(TEMP_f != -1) { RET_setting_location_accuracy = TEMP_f;                 changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_accuracy:%d..%c\n",RET_setting_location_accuracy,changed);
+        if(TEMP_g != -1) { RET_setting_location_tx_interval_mins = TEMP_g;         changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_tx_interval_mins:%d..%c\n",RET_setting_location_tx_interval_mins,changed);
+        if(TEMP_h != -1) { RET_setting_location_tx_failsafe_hrs = TEMP_h;          changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_tx_failsafe_hrs:%d..%c\n",RET_setting_location_tx_failsafe_hrs,changed)
+        if(TEMP_i != -1) { RET_setting_location_timeout = TEMP_i;                  changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_location_timeout:%d..%c\n",RET_setting_location_timeout,changed)
+        if(TEMP_j != -1) { RET_setting_activity_tx_interval_mins = TEMP_j;         changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_activity_tx_interval_mins:%d..%c\n",RET_setting_activity_tx_interval_mins,changed)
+        if(TEMP_k != -1) { RET_setting_environmental_tx_interval_mins = TEMP_k;    changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_environmental_tx_interval_mins:%d..%c\n",RET_setting_environmental_tx_interval_mins,changed)
+        if(TEMP_l != -1) { RET_setting_motion_g = TEMP_l;                          changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_motion_g:%d..%c\n",RET_setting_motion_g,changed)
+        if(TEMP_m != -1) { RET_setting_motion_start_seconds = TEMP_m;              changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_motion_start_seconds:%d..%c\n",RET_setting_motion_start_seconds,changed)
+        if(TEMP_n != -1) { RET_setting_motion_stop_seconds = TEMP_n;               changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_motion_stop_seconds:%d..%c\n",RET_setting_motion_stop_seconds,changed)
+        if(TEMP_o != -1) { RET_setting_impact_g = TEMP_o;                          changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_impact_g:%d..%c\n",RET_setting_impact_g,changed)
+        if(TEMP_p != -1) { RET_setting_impact_alert = TEMP_p;                      changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_impact_alert:%d..%c\n",RET_setting_impact_alert,changed)
+        if(TEMP_q != -1) { RET_setting_connection_timeout = TEMP_q;                changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_connection_timeout:%d..%c\n",RET_setting_connection_timeout,changed)
+        if(TEMP_r != -1) { RET_setting_beacon_interval_seconds = TEMP_r;           changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_beacon_interval_seconds:%d..%c\n",RET_setting_beacon_interval_seconds,changed)
+        if(TEMP_s != -1) { RET_setting_beacon_scan = TEMP_s;                       changed = 'Y'; } else { changed = 'N'; }; DEBUG("RET_setting_beacon_scan:%d..%c\n",RET_setting_beacon_scan,changed)
         
-        RET_haveSettings = true;
-        return true;
+        if (critical_fail_count == 0) { 
+            DEBUG("GOT SETTINGS OK\n"); 
+            
+            //SET EVENT TIMES
+            if(RET_setting_location_tx_interval_mins > 0) { 
+                RET_eventTime_location_tx = (RET_RTCunixtime + (RET_setting_location_tx_interval_mins * 60));
+                DEBUG("EVENTSET - LOCATION TX at %u, MODE %d\n",RET_eventTime_location_tx, RET_setting_location_mode);
+            }
+            if(RET_setting_location_tx_failsafe_hrs > 0) { 
+                RET_eventTime_location_failsafe_tx = (RET_RTCunixtime + (RET_setting_location_tx_failsafe_hrs * 3600));
+                DEBUG("EVENTSET - LOCATION FAILSAFE TX at %u\n",RET_eventTime_location_failsafe_tx);
+            }
+            if(RET_setting_activity_tx_interval_mins > 0) { 
+                RET_eventTime_activity_tx = (RET_RTCunixtime + (RET_setting_activity_tx_interval_mins * 60));
+                DEBUG("EVENTSET - ACTIVITY TX at %u\n",RET_eventTime_activity_tx);
+            }
+            if(RET_eventTime_environmental_tx > 0) { 
+                RET_eventTime_environmental_tx = (RET_RTCunixtime + (RET_setting_environmental_tx_interval_mins * 60));
+                DEBUG("EVENTSET - ENVIRONMENTAL TX at %u\n",RET_eventTime_environmental_tx);
+            }
+            
+            RET_haveSettings = true;     
+            return true;
+        } else {
+            DEBUG("CRITICAL FAILS:%d\n",critical_fail_count);
+            RET_haveSettings = false; 
+            return false;
+        }
     } else {
         RET_haveSettings = false;
         return false;
@@ -334,7 +386,6 @@
 // SETUP
 //------------------------------------------------------------------------------ 
 bool setup() {
-    DEBUG("SETUP\n");
     bool pass = true;
     Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN);
     if (modem.on()) {
@@ -347,91 +398,143 @@
             char result[180];
             snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, true, 2, GLOBAL_defaultApi));
             if (result != "err") {
-                DEBUG("result: %s \n",result);
-                saveSettings(result);
+                DEBUG("fromserver: %s \n",result);
+                if (!saveSettings(result)) { 
+                    //something went critically wrong getting settings 
+                    pass = false;
+                }              
             }
         } else {
             //FAILUREMODE modem failed to register on network
+            pass = false;
         }
     } else {
+        //FAILUREMODE Modem failed to turn on  
         pass = false;
-        //FAILUREMODE Modem failed to turn on   
     }
-     
     
     //RESULT
-    if (pass) {
-        return true;
-    } else {
-        return false;   
-    }
+    return pass;
 }
 
-
+//------------------------------------------------------------------------------
+// EVENTS
+//------------------------------------------------------------------------------ 
+void event_location_tx() {
+    getBatteryV();
+        
+}
 //------------------------------------------------------------------------------
 // STATE ENGINE
 //------------------------------------------------------------------------------ 
 void mainStateEngine() {
-    DEBUG("StateEngine:%d \n",RET_state);
     switch(RET_state) {
         case STATE_SETUP :
-            factoryReset();
+            DEBUG("STATE:SETUP\n");
+            getBatteryV();
             if (setup()) {
                 copyRETtoGLOBAL();
+            } else {
+                RET_eventTime_wakeFromDormant = (RET_RTCunixtime + (72*3600)); //72hrs
+                setState(STATE_DORMANT);
+                DEBUG("SETSTATE:DORMANT until %u\n",RET_eventTime_wakeFromDormant);
             }
             break;
         case STATE_NORMAL :
+            DEBUG("STATE:NORMAL\n");
             //check and log motion
             checkMotion();
             
             //EVENTS
-            //Location
-            if(RET_RTCunixtime > RET_eventTime_location_log && RET_eventTime_location_log > 0) {
-                //getdata_environmental();
-                //event_location_log();
+            
+            //LOCATION
+            //Location Log
+            //if(RET_RTCunixtime > RET_eventTime_location_log && RET_eventTime_location_log > 0) { }
+            bool run_location_tx = false;
+            switch (RET_setting_location_mode) {
+                case 1: //INTERVAL POST
+                    if(RET_RTCunixtime > RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { run_location_tx = true; }
+                    if(RET_RTCunixtime > RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { run_location_tx = true; }
+                    break;
+                
+                case 2: //INTERVAL POST WITH MOTION CHECK
+                    
+                    break;
+                    
+                case 3: //POST ON STOP MOTION
+                    
+                    break;   
             }
-            if(RET_RTCunixtime > RET_eventTime_location_tx && RET_eventTime_location_tx > 0) {
-                //getdata_battery();
-                //event_location_broadcast();
+            if (run_location_tx) {
+                event_location_tx();
             }
-            //Environmental
+            
+            
+            
+            
+            
+            //Location TX
+            
+            //Environmental Log
             if(RET_RTCunixtime > RET_eventTime_environmental_log && RET_eventTime_environmental_log > 0) {
+                /*
                 Filesystem filesystem(BD_PAGE_ADDRESS,BD_TOTAL_SIZE);
                 SI7060 temperature(PN_I2C_SDA,PN_I2C_SCL);
                 float temperature_c = temperature.getTemperature();
-                DEBUG("Temperature log: %lld,%f \n", RET_RTCunixtime,temperature_c);
+                DEBUG("Temperature log: %u,%f \n", RET_RTCunixtime,temperature_c);
                 filesystem.addLogEntry_temperature(RET_RTCunixtime,temperature_c);
+                */
             }
+            //Environmental TX
             if(RET_RTCunixtime > RET_eventTime_environmental_tx && RET_eventTime_environmental_tx > 0) {
+                getBatteryV();
                 //event_environmental_bc();
                 //Filesystem filesystem(PN_SPI_MOSI,PN_SPI_MISO,PN_SPI_CLK,PN_SPI_CS1);
             }
-            //Activity
+            //Activity TX
             if(RET_RTCunixtime > RET_eventTime_activity_tx && RET_eventTime_activity_tx > 0) {
+                getBatteryV();
                 //event_activity_bc();
             }
             break;
         case STATE_DORMANT :
             if (RET_RTCunixtime > RET_eventTime_wakeFromDormant) {
-                RET_state = STATE_NORMAL;
+                setState(STATE_NORMAL);
+                DEBUG("WAKING UP FROM DORMANT\n");
             }
+            DEBUG("STATE:DORMANT until %u\n",RET_eventTime_wakeFromDormant);
             break;
         case STATE_BUTTONPRESS1 :
+            setState(STATE_NORMAL);
+            DEBUG("STATE:BUTTONPRESS1\n");
             LED1blink(1,300);
-            RET_state = RET_state_prev;
             break; 
         case STATE_BUTTONPRESS2 :
-            LED1blink(3,300);
-            RET_state = RET_state_prev;
+            setState(STATE_NORMAL);
+            DEBUG("STATE:BUTTONPRESS2\n");
+            LED1blink(2,300);
             break;  
         case STATE_BUTTONHOLD :
-            LED1blink(10,300);
-            RET_eventTime_wakeFromDormant = (RET_RTCunixtime + (48*3600)); //48hrs
-            RET_state = STATE_DORMANT;
+            DEBUG("STATE:BUTTONHOLD\n");
+            if (RET_state_prev == STATE_NORMAL) {
+                setState(STATE_DORMANT);
+                RET_eventTime_wakeFromDormant = (RET_RTCunixtime + (48*3600)); //48hrs
+                DEBUG("TURNING OFF\n");
+                DEBUG("STATE:DORMANT until %u\n",RET_eventTime_wakeFromDormant);
+                LED1on(5000);
+            } else {
+                if (RET_haveSettings) {
+                    setState(STATE_NORMAL);
+                } else {
+                    setState(STATE_SETUP);
+                }
+                DEBUG("TURNING ON\n");
+                LED1blink(20,100);
+            }
             break;
         default :
-            RET_state = STATE_SETUP;
-            DEBUG("DEFAULT STATE");
+            setState(STATE_SETUP);
+            DEBUG("DEFAULT STATE\n");
     }
 }
 
@@ -440,7 +543,7 @@
 // MAIN
 //------------------------------------------------------------------------------ 
 int main() {
-    RTCticker.attach(&RTCtick, 0.1);
+    RTCticker.attach(&RTCtick, 1.0);
     turnOffEverything();
     
     button.fall(&buttonPress); //does this affect power?
@@ -451,14 +554,14 @@
     if (NRF_POWER->RESETREAS != 0xffffffff) {
         switch(NRF_POWER->RESETREAS) {
             case 0x00000001  :
-                DEBUG("reset_reason: 0x%08x. - Hard Reset\n",NRF_POWER->RESETREAS);
+                DEBUG("reset_reason: 0x%08x. - Hard Reset - CSTATE:%d\n",NRF_POWER->RESETREAS, RET_state);
                 RET_coldBoot = 1;
             break;
             case 0x00000002  :
-                DEBUG("reset_reason: 0x%08x. - Watchdog\n",NRF_POWER->RESETREAS);
+                DEBUG("reset_reason: 0x%08x. - Watchdog - CSTATE:%d\n",NRF_POWER->RESETREAS, RET_state);
             break;
             case 0x00000004  :
-                DEBUG("reset_reason: 0x%08x. - Soft reset\n",NRF_POWER->RESETREAS);
+                DEBUG("reset_reason: 0x%08x. - Soft reset - CSTATE:%d\n",NRF_POWER->RESETREAS, RET_state);
             break;
         }
         NRF_POWER->RESETREAS = 0xffffffff;
@@ -478,7 +581,9 @@
         GLOBAL_wakeTime = RET_RTCunixtime;
         
         //MAIN LOGIC
-        DEBUG("STATE: %d,  RTC_MILLIS: %lld,  RTC_SECONDS:%lld,  BUTT_T:%d,  BUTT_C,%d \n", RET_state, RET_RTCmillis, RET_RTCunixtime, RET_buttonHoldTime, RET_buttonPressCount);
+        //DEBUG("STATE: %d,  RTC_MILLIS: %lld,  RTC_SECONDS:%lld,  BUTT_T:%d,  BUTT_C,%d \n", RET_state, RET_RTCmillis, RET_RTCunixtime, RET_buttonHoldTime, RET_buttonPressCount);
+        DEBUG("STATE: %d,  RTC_SECONDS:%u\n", RET_state, RET_RTCunixtime);
+
         mainStateEngine();
         
         //PRE-SLEEP ACTIONS