init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
Diff: main.cpp
- Revision:
- 39:f767b8037475
- Parent:
- 38:476a9b5629a1
- Child:
- 40:4270e09e59f2
--- a/main.cpp Wed Jan 16 23:06:39 2019 +0000 +++ b/main.cpp Thu Jan 17 15:20:14 2019 +0000 @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ //DEFINES //------------------------------------------------------------------------------ -#define FW_VERSION 11 +#define FW_VERSION 14 #define SKU "GPSPLUS" #define HW_MAJORREVISION "001" @@ -70,6 +70,7 @@ uint16_t RET_setting_beacon_interval_seconds; uint16_t RET_setting_beacon_scan; //STATE +bool RET_asleep = false; uint8_t RET_coldBoot = 1; time_t RET_RTCunixtime; bool RET_haveSettings; @@ -81,6 +82,7 @@ time_t RET_SetupRunAt; time_t RET_SettingsGotAt; bool RET_force2G; +bool RET_watchdogfired; //MOTION STATE bool RET_motionTriggered; bool RET_motionTriggeredInTXInterval; @@ -233,45 +235,54 @@ void RTCtick() { //YOU MUST NOT CALL ANY OTHER FUNCTIONS OR DEBUG FROM INSIDE HERE!!! OR IT LOCKS UP THE DEVICE, just change vars RET_RTCunixtime += 1; - - //button logic - check for hold - if (RET_buttonHoldTime > 4) { - RET_buttonHoldTime = 0; - RET_buttonPressCount = 0; - RET_state_prev = RET_state; - RET_state = STATE_BUTTONHOLD; - mainthread.release(); - } else { - if((RET_RTCunixtime - RET_buttonPressTime) > 1) { - switch (RET_buttonPressCount) { - case 1 : - if (RET_state == STATE_NORMAL) { - RET_state = STATE_BUTTONPRESS1; - mainthread.release(); - } - break; - case 3 : - if (RET_state == STATE_NORMAL) { - RET_state = STATE_BUTTONPRESS2; - mainthread.release(); - } - break; - case 5 : - if (RET_state == STATE_NORMAL) { - RET_state = STATE_BUTTONPRESS3; - mainthread.release(); - } - break; - default : - //do nothing - break; + + //button logic, only when device asleep + if (RET_asleep == true) { + //hold check + if (RET_buttonHoldTime > 4 && RET_buttonHoldTime < 10) { + RET_buttonHoldTime = 0; + RET_buttonPressCount = 0; + RET_state_prev = RET_state; + RET_state = STATE_BUTTONHOLD; + mainthread.release(); + } else if (RET_buttonHoldTime > 14 && RET_buttonHoldTime < 30) { + RET_buttonHoldTime = 0; + RET_buttonPressCount = 0; + RET_state_prev = RET_state; + RET_state = STATE_SCORCHEDEARTH; + mainthread.release(); + } else { + if((RET_RTCunixtime - RET_buttonPressTime) > 1) { + switch (RET_buttonPressCount) { + case 1 : + if (RET_state == STATE_NORMAL) { + RET_state = STATE_BUTTONPRESS1; + mainthread.release(); + } + break; + case 3 : + if (RET_state == STATE_NORMAL) { + RET_state = STATE_BUTTONPRESS2; + mainthread.release(); + } + break; + case 5 : + if (RET_state == STATE_NORMAL) { + RET_state = STATE_BUTTONPRESS3; + mainthread.release(); + } + break; + default : + //do nothing + break; + } + RET_buttonPressCount = 0; } - RET_buttonPressCount = 0; } - } - //SETUP STATE VISUALISE - if (!GLOBAL_LEDSequenceinProgress && RET_state == STATE_SETUP) { - led1 = !led1; + //SETUP STATE VISUALISE + if (!GLOBAL_LEDSequenceinProgress && RET_state == STATE_SETUP) { + led1 = !led1; + } } } void resetGlobals() { @@ -281,15 +292,22 @@ } void healthCheck() { //check clock - if(RET_havesettings == 1) { - if (RET_RTCunixtime < 1547678732) { + if(RET_haveSettings == 1) { + if (RET_RTCunixtime < 1547678732) { //go dormant for 72hrs and then resetup - RET_havesettings = 0; setState(STATE_DORMANT); + RET_haveSettings = 0; + setState(STATE_DORMANT); } } + //check for watchdog fire + if (RET_watchdogfired == true) { + addToExceptionString("WD"); + RET_watchdogfired = false; + } } void setDefaults() { //STATE + RET_asleep = false; RET_haveSettings = 0; RET_state = STATE_SETUP; RET_state_prev = RET_state; @@ -297,6 +315,7 @@ RET_SetupRunAt = 0; RET_SettingsGotAt = 0; RET_force2G = DEFAULT_FORCE2G; + RET_watchdogfired = false; //SETTINGS RET_setting_firmware = 0; RET_setting_minimumupdate_hrs = 0; @@ -625,6 +644,35 @@ saveEventTimes(); } +void event_turnonofflog_tx(bool turnon) { + DEBUG("TEST EVENT\n",false); + float temperature = getTemperature(); + float voltage = getBatteryV(); + if (modem.on(RET_force2G)) { + char locString[70]; + memcpy(locString, modem.getLocation(1, RET_setting_location_timeout), 70); + if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,(RET_setting_connection_timeout*1000))) { + int timetaken = (RET_RTCunixtime - GLOBAL_wakeTime) + 10; //add 10 for ussd response time.; + char bytestosend[160]; + if (turnon) { + snprintf(bytestosend,sizeof(bytestosend),"(%s,a:error,f:%d,t:%.1f,v:%.2f,z:TURNON,e:%d,c:1,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,voltage,timetaken,locString); + } else { + snprintf(bytestosend,sizeof(bytestosend),"(%s,a:error,f:%d,t:%.1f,v:%.2f,z:TURNOFF,e:%d,c:1,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,voltage,timetaken,locString); + } + char result[180]; + bool getSettings = false; + snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, getSettings, 2, GLOBAL_defaultApi)); + } else { + modem.off(false); + } + } else { + modem.off(false); + } + modem.off(false); + //RESETS + RET_motionTriggeredInTXInterval = 0; +} + void event_location_tx() { DEBUG("LOCATION TX\n",false); float temperature = getTemperature(); @@ -797,6 +845,7 @@ DEBUG("TURNING OFF\n",false); DEBUG("STATE:DORMANT until %u\n",RET_eventTime_wakeFromDormant); LED1on(5000); + event_turnonofflog_tx(false); } else { if (RET_haveSettings) { setState(STATE_NORMAL); @@ -805,9 +854,20 @@ } DEBUG("TURNING ON\n",false); LED1blink(20,100); + event_turnonofflog_tx(true); } break; } + case STATE_SCORCHEDEARTH : + { + 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(); + break; + } default : { setState(STATE_SETUP); @@ -834,15 +894,15 @@ if (NRF_POWER->RESETREAS != 0xffffffff) { switch(NRF_POWER->RESETREAS) { case 0x00000001 : - DEBUG("0x%08x. Hard Reset ST:%d\n",NRF_POWER->RESETREAS, RET_state); + //DEBUG("0x%08x. Hard Reset ST:%d\n",NRF_POWER->RESETREAS, RET_state); RET_coldBoot = 1; - dumpSettings(); break; case 0x00000002 : - DEBUG("Watchdog ST:%d\n",RET_state); + //DEBUG("Watchdog ST:%d\n",RET_state); + RET_watchdogfired = true; break; case 0x00000004 : - DEBUG("Soft ST:%d\n",RET_state); + //DEBUG("Soft ST:%d\n",RET_state); break; } NRF_POWER->RESETREAS = 0xffffffff; @@ -867,18 +927,23 @@ while(true) { //WATCHDOG watchdogKick(); + RET_asleep = false; //INIT resetGlobals(); - healthCheck(); + healthCheck(); //this must be after resetGlobals GLOBAL_wakeTime = RET_RTCunixtime; //MAIN LOGIC //DEBUG("STATE:%d, HAVESETTINGS:%d, MOTION: %d, RTC:%u, BOOTAT:%u, LOC:%u, LOCFS:%u, ACT:%u \n", RET_state, RET_haveSettings, RET_motionState, RET_RTCunixtime,RET_SetupRunAt,RET_eventTime_location_tx,RET_eventTime_location_failsafe_tx,RET_eventTime_activity_tx); //DEBUG("ACTIVITY:%s\n",RET_activityData); if(DEBUG_ON){ - debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "STATE:%d, HAVESETTINGS:%d, MOTION: %d, RTC:%u, LOC:%u, LOCFS:%u, ACT:%u \n", RET_state, RET_haveSettings, RET_motionState, RET_RTCunixtime,RET_eventTime_location_tx,RET_eventTime_location_failsafe_tx,RET_eventTime_activity_tx);debug_exe(); - //debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ACTIVITY:%s\n",RET_activityData);debug_exe(); + if (RET_state != 99) { + debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ST:%d, SETTINGS:%d, MOT: %d, RTC:%u, LOC:%u, LOCFS:%u, ACT:%u \n", RET_state, RET_haveSettings, RET_motionState, RET_RTCunixtime,RET_eventTime_location_tx,RET_eventTime_location_failsafe_tx,RET_eventTime_activity_tx);debug_exe(); + debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ACT:%s\n",RET_activityData);debug_exe(); + } else { + debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ST:%d, WAKE@:%u, \n", RET_state, RET_eventTime_wakeFromDormant);debug_exe(); + } } mainStateEngine(); @@ -911,6 +976,7 @@ watchdogKick(); //SLEEP + RET_asleep = true; mainthread.wait(DEFAULT_SLEEP_FRAME); } } \ No newline at end of file