init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
Diff: main.cpp
- Revision:
- 50:a94e70c00fff
- Parent:
- 49:15ddd84ec9fa
- Child:
- 51:9078e6928412
--- a/main.cpp Thu Feb 07 00:34:30 2019 +0000
+++ b/main.cpp Thu May 16 12:31:44 2019 +0000
@@ -109,9 +109,27 @@
//------------------------------------------------------------------------------
// LOW LEVEL FUNCS
//------------------------------------------------------------------------------
-void nrf_configureGPIOForSleep(){
- nrf_gpio_cfg_input(PN_SPI_MOSI, NRF_GPIO_PIN_NOPULL);
+void nrf_configureForSleep(){
+ //Disable SPI pins to reduce power
+ //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);
+
+ //ERRATA 89, shut down i2c channels properly
+ //TWI0
+ //NRF_TWI0->ENABLE=0;//TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
+ //NRF_TWI0->ENABLE=1;//TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
+ *(volatile uint32_t *)0x40003FFC = 0;
+ *(volatile uint32_t *)0x40003FFC;
+ *(volatile uint32_t *)0x40003FFC = 1;
+ //TWI1
+ //NRF_TWI1->ENABLE=TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
+ *(volatile uint32_t *)0x40004FFC = 0;
+ *(volatile uint32_t *)0x40004FFC;
+ *(volatile uint32_t *)0x40004FFC = 1;
}
void setState(uint8_t state) {
RET_state_prev = RET_state;
@@ -244,21 +262,21 @@
switch (RET_buttonPressCount) { //double catches to help with debounce
case 1 :
case 2 :
- RET_state_prev = RET_state;
+ if(RET_state_prev != RET_state) {RET_state_prev = RET_state;}
RET_state = STATE_BUTTONPRESS1;
RET_buttonPressCount = 0;
mainthread.release();
break;
case 3 :
case 4 :
- RET_state_prev = RET_state;
+ if(RET_state_prev != RET_state) {RET_state_prev = RET_state;}
RET_state = STATE_BUTTONPRESS3;
RET_buttonPressCount = 0;
mainthread.release();
break;
case 5 :
case 6 :
- RET_state_prev = RET_state;
+ if(RET_state_prev != RET_state) {RET_state_prev = RET_state;}
RET_state = STATE_BUTTONPRESS5;
RET_buttonPressCount = 0;
mainthread.release();
@@ -270,24 +288,6 @@
}
}
}
-
- /*
- if (RET_setupInProgress) {
- led1 = 0;
- } else if (!GLOBAL_LEDSequenceinProgress) {
- led1 = 1;
- }
- */
- /*
- if (RTCtick_ledflash_count > 0) {
- led1 = !led1;
- RTCtick_ledflash_count --;
- if (RTCtick_ledflash_count <= 0) {
- RTCtick_ledflash_count = 0;
- led1 = 1; //turn off led
- }
- }
- */
}
void resetGlobals() {
GLOBAL_accel_healthy = false;
@@ -414,7 +414,7 @@
//INTERNAL NRF52 TEMP SENSOR
temperature = nrfTemperature();
} else {
- temperature = si7060.getTemperature();
+ //temperature = si7060.getTemperature();
}
if (temperature > -40 && temperature < 60) {
test_pass ++;
@@ -461,7 +461,7 @@
//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(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "MOT:%u s",inMotionForSeconds);debug_exe();}
- if (inMotionForSeconds >= RET_setting_motion_start_seconds && RET_motionState == false) {
+ if (inMotionForSeconds >= (RET_setting_motion_start_seconds + 15) && RET_motionState == false) {
RET_motionState = true;
RET_motionTriggeredInLocTXInterval = true;
//if (GLOBAL_debugLED) LED1blink(1,50);
@@ -476,7 +476,7 @@
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(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "MOTLESS:%u s",noMotionForSeconds);debug_exe();}
- if (noMotionForSeconds >= RET_setting_motion_stop_seconds && RET_motionState == true) {
+ if (noMotionForSeconds >= (RET_setting_motion_stop_seconds + 15) && RET_motionState == true) {
//if (GLOBAL_debugLED) LED1blink(2,50);
RET_motionPendingOffState = false;
RET_motionState = false;
@@ -505,15 +505,31 @@
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;
- //int varTotal = 19; //change this if var number changes!!!!!!!!
+
+ //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RESP: %s",settingsBuffer);debug_exe();}
+
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",
&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) ) > 0 ) {
- if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "FROMSERVER: 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\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);debug_exe();}
+ //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "SERVERPARAMS: 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\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);debug_exe();}
if(TEMP_a != -1) { RET_setting_minimumupdate_hrs = TEMP_a; }
- if(TEMP_b != 0) { RET_RTCunixtime = TEMP_b; } else { critical_fail_count++; }
+ if(TEMP_b > 1552915630) {
+ 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
+ if ((TEMP_b - RET_RTCunixtime) < 604800) { //allow 1 week difference
+ RET_RTCunixtime = TEMP_b;
+ } else {
+ critical_fail_count++;
+ }
+ }
+ } else {
+ critical_fail_count++;
+ }
if(TEMP_c != -1) { RET_setting_firmware = TEMP_c; } else { RET_setting_firmware = -1;}
if(TEMP_d != -1) { setState(TEMP_d); } else { setState(STATE_NORMAL);}
if(TEMP_e != -1) { RET_setting_location_mode = TEMP_e; }
@@ -541,7 +557,7 @@
if (critical_fail_count == 0) {
RET_receivedNewSettings = true;
- if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "SETTINGS OK");debug_exe();}
+ //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "SETTINGS OK");debug_exe();}
dumpSettings();
RET_haveSettings = true;
GLOBAL_needToConfigureLis3dh = true;
@@ -563,8 +579,7 @@
}
return true;
} else {
- if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "CRITICAL FAILS:%d",critical_fail_count);debug_exe();}
- dumpSettings();
+ //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "CRITICAL FAILS:%d",critical_fail_count);debug_exe();}
addToExceptionString("SCF");
//dont set RET_haveSettings = false; here, if we already have settings continue to use them
return false;
@@ -892,6 +907,7 @@
}
case STATE_DORMANT :
{
+ RET_busy = true;
if (RET_RTCunixtime >= RET_eventTime_wakeFromDormant) {
if (RET_haveSettings) {
setState(STATE_NORMAL);
@@ -900,10 +916,12 @@
}
}
if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"STATE:DORMANT until %u\n",RET_eventTime_wakeFromDormant);debug_exe();}
+ RET_busy = false;
break;
}
case STATE_BUTTONPRESS1 :
{
+ RET_busy = true;
if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 1\n");debug_exe();}
if (getBatteryV() < 2.5f) {
LED1blink(3,500);
@@ -916,11 +934,17 @@
LED1blink(2,500);
}
}
- setState(RET_state_prev);
+ if (RET_state_prev != STATE_NORMAL || RET_state_prev != STATE_DORMANT) {
+ setState(STATE_NORMAL);
+ } else {
+ setState(RET_state_prev);
+ }
+ RET_busy = false;
break;
}
case STATE_BUTTONPRESS3 :
{
+ RET_busy = true;
if(RET_state_prev == STATE_DORMANT || RET_state_prev == STATE_NORMAL) {
if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 3\n");debug_exe();}
LED1blink(3,500);
@@ -929,10 +953,12 @@
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(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 5\n");debug_exe();}
LED1blink(5,500);
@@ -941,10 +967,12 @@
LED1off();
}
setState(STATE_NORMAL); //turns device back on
+ RET_busy = false;
break;
}
case STATE_BUTTONHOLD :
{
+ RET_busy = true;
if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON HOLD \n");debug_exe();}
if (RET_state_prev == STATE_NORMAL) {
RET_eventTime_wakeFromDormant = (RET_RTCunixtime + THREEDAYSINSECONDS);
@@ -962,10 +990,12 @@
if(DEBUG_ON){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(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"SCORCHED EARTH - RESETTING");debug_exe();}
setState(STATE_SETUP); //this wont be used but just incase to kick it out of this state
read_app_data_from_flash(&app_data);
@@ -973,6 +1003,7 @@
app_data.target_firmware_version = 0;
write_app_data_to_flash(&app_data);
system_reset();
+ RET_busy = false;
break;
}
default :
@@ -985,7 +1016,7 @@
//------------------------------------------------------------------------------
// MAIN
//------------------------------------------------------------------------------
-int main() {
+int main() {
//INIT
watchdog.configure(300.0); //5 mins
LED1off();
@@ -1036,7 +1067,7 @@
}
//MAIN LOOP
- while(true) {
+ while(true) {
//WATCHDOG
watchdogKick();
RET_asleep = false;
@@ -1064,14 +1095,6 @@
debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "F:%d, S:%d, WAKE@:%u\n", FW_VERSION, RET_state, RET_eventTime_wakeFromDormant);debug_exe();
}
}
-
- /*
- if (modem.on(RET_force2G)) {
- if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
- modem.USSDsend("(b:gps2,a:act,e:1.7!0.15!,t:1547937626,r:0.13,c:1)\0",2);
- }
- }
- */
//STATE ENGINE
mainStateEngine();
@@ -1081,13 +1104,13 @@
recordFirmwareAsValid();
RET_coldBoot = 0;
}
-
+
//PRE-SLEEP ACTIONS
LED1off();
modem.off(false);
RET_motionTriggeredinFrame = false;
if (GLOBAL_needToConfigureLis3dh) { lis3dh_configureForSleep(RET_setting_motion_g,RET_setting_impact_g); }
- nrf_configureGPIOForSleep();
+ nrf_configureForSleep();
NRFuart_uninit();
watchdogKick();