init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
Diff: main.cpp
- Revision:
- 13:29f67f256709
- Parent:
- 12:8345612bf867
- Child:
- 14:9a54b1b65bc8
--- a/main.cpp Sun Dec 16 01:06:14 2018 +0000
+++ b/main.cpp Sun Dec 16 15:21:38 2018 +0000
@@ -12,51 +12,56 @@
//------------------------------------------------------------------------------
//GLOBAL VARS / CLEARED ON SLEEP (IF USING SOFT REBOOT HACK)
//------------------------------------------------------------------------------
-bool accel_healthy = false;
-bool requireSoftReset = false;
-bool motionFlagTriggered = false;
-bool debugLED = false;
-bool needToConfigureLis3dh = false;
+bool GLOBAL_accel_healthy = false;
+bool GLOBAL_requireSoftReset = false;
+bool GLOBAL_motionFlagTriggered = false;
+bool GLOBAL_debugLED = false;
+bool GLOBAL_needToConfigureLis3dh = false;
+bool GLOBAL_registeredOnNetwork = false;
+long long GLOBAL_imei = 0;
+float GLOBAL_voltage = 0.0;
+time_t GLOBAL_RTCunixtime = 0;
+time_t GLOBAL_wakeTime = 0;
//------------------------------------------------------------------------------
//RETAINED NOINIT RAM VARS
//------------------------------------------------------------------------------
-#if defined ( __CC_ARM ) /** THIS IS THE MBED ONLINE COMPILER TOOLCHAIN*/
-static uint8_t RET_coldBoot __attribute__((section("noinit"),zero_init));
-static uint8_t RET_mode __attribute__((section("noinit"),zero_init));
-static uint8_t RET_mode_prev __attribute__((section("noinit"),zero_init));
-static uint8_t RET_buttonPressCount __attribute__((section("noinit"),zero_init));
-static time_t RET_buttonPressTime __attribute__((section("noinit"),zero_init));
-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 RET_RTCmicros __attribute__((section("noinit"),zero_init));
-static bool RET_requireImpactFlag __attribute__((section("noinit"),zero_init));
-static char RET_buffer[64] __attribute__((section("noinit"),zero_init));
-
+#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));
+//STATE
+static uint8_t RET_coldBoot __attribute__((section("noinit"),zero_init));
+static uint8_t RET_mode __attribute__((section("noinit"),zero_init));
+static uint8_t RET_mode_prev __attribute__((section("noinit"),zero_init));
+static uint8_t RET_buttonPressCount __attribute__((section("noinit"),zero_init));
+static time_t RET_buttonPressTime __attribute__((section("noinit"),zero_init));
+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 RET_RTCmicros __attribute__((section("noinit"),zero_init));
+static bool RET_requireImpactFlag __attribute__((section("noinit"),zero_init));
//MOTION SETTINGS
-static bool RET_impactTriggered __attribute__((section("noinit"),zero_init));
-static bool RET_motionTriggered __attribute__((section("noinit"),zero_init));
-static time_t RET_motionStartTime __attribute__((section("noinit"),zero_init));
-static time_t RET_motionStopTime __attribute__((section("noinit"),zero_init));
+static bool RET_impactTriggered __attribute__((section("noinit"),zero_init));
+static bool RET_motionTriggered __attribute__((section("noinit"),zero_init));
+static time_t RET_motionStartTime __attribute__((section("noinit"),zero_init));
+static time_t RET_motionStopTime __attribute__((section("noinit"),zero_init));
static time_t RET_motionStartThreshold_seconds __attribute__((section("noinit"),zero_init));
static time_t RET_motionStopThreshold_seconds __attribute__((section("noinit"),zero_init));
-static bool RET_motionPendingOnState __attribute__((section("noinit"),zero_init));
-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_motionData[100] __attribute__((section("noinit"),zero_init));
-
+static bool RET_motionPendingOnState __attribute__((section("noinit"),zero_init));
+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_motionData[100] __attribute__((section("noinit"),zero_init));
//EVENT HANDLING
static time_t RET_eventInterval_location_log __attribute__((section("noinit"),zero_init));
-static time_t RET_eventTime_location_log __attribute__((section("noinit"),zero_init));
-static time_t RET_eventTime_location_bc __attribute__((section("noinit"),zero_init));
+static time_t RET_eventTime_location_log __attribute__((section("noinit"),zero_init));
+static time_t RET_eventTime_location_bc __attribute__((section("noinit"),zero_init));
static time_t RET_eventInterval_environmental_log __attribute__((section("noinit"),zero_init));
-static time_t RET_eventTime_environmental_log __attribute__((section("noinit"),zero_init));
-static time_t RET_eventTime_environmental_bc __attribute__((section("noinit"),zero_init));
-static time_t RET_eventTime_activity_bc __attribute__((section("noinit"),zero_init));
-static time_t RET_eventTime_wakeFromDormant __attribute__((section("noinit"),zero_init));
+static time_t RET_eventTime_environmental_log __attribute__((section("noinit"),zero_init));
+static time_t RET_eventTime_environmental_bc __attribute__((section("noinit"),zero_init));
+static time_t RET_eventTime_activity_bc __attribute__((section("noinit"),zero_init));
+static time_t RET_eventTime_wakeFromDormant __attribute__((section("noinit"),zero_init));
#elif defined ( __GNUC__ )
#elif defined ( __ICCARM__ )
#endif
@@ -101,15 +106,15 @@
void gotoSleep(long sleep_milliseconds) {
turnOffEverything();
watchdog.kick();
- if (requireSoftReset) { //dont need to clear this var as reset changes it back to false
+ if (GLOBAL_requireSoftReset) { //dont need to clear this var as reset changes it back to false
system_reset();
}
mainthread.wait(sleep_milliseconds);
}
void RTCtick() {
- //RET_unixtime ++;
RET_RTCmicros += 100;
RET_RTCunixtime = (RET_RTCmicros / 1000);
+ GLOBAL_RTCunixtime = RET_RTCunixtime;
//button logic - check for hold
if (RET_buttonHoldTime > 4000) {
RET_buttonHoldTime = 0;
@@ -139,12 +144,13 @@
}
}
void factoryReset() {
- //firstBoot = true;
- requireSoftReset = false;
+ DEBUG("Factory Reset \n");
+ GLOBAL_requireSoftReset = false;
//RESET RETAINED VARS
+ RET_imei = 0;
RET_coldBoot = 1;
- RET_mode = MODE_NORMAL;
+ RET_mode = MODE_SETUP;
RET_mode_prev = RET_mode;
RET_RTCunixtime = 0;
RET_RTCmicros = 0;
@@ -173,10 +179,9 @@
//CONFIGURE ACCELL DEFAULT
lis3dh_configureForSleep(10,127);
-
- //SET IDENTIFIER
- //uint32_t nv_value = 12345678;
- //int rc = nvstore.set(NV_IDENTIFIER, sizeof(nv_value), &nv_value);
+}
+void copyRETtoGLOBAL() {
+ GLOBAL_imei = RET_imei;
}
void selfTest() {
//Accelerometer
@@ -207,44 +212,81 @@
//------------------------------------------------------------------------------
void checkMotion() {
if (lis3dh_int2) {
- if (debugLED) LED1blink(2,100);
+ if (GLOBAL_debugLED) LED1blink(2,100);
RET_motionTriggered = true;
- needToConfigureLis3dh = true; //interrupt has fire so need to clear it
+ GLOBAL_needToConfigureLis3dh = true; //interrupt has fire so need to clear it
if (!RET_motionPendingOnState) {
RET_motionPendingOnState = true;
RET_motionPendingOffState = false;
// Log start motion time
- RET_motionStartTime = time(NULL);
+ RET_motionStartTime = RET_RTCunixtime;
}
} else {
- if (debugLED) LED1blink(2,500);
+ if (GLOBAL_debugLED) LED1blink(2,500);
RET_motionTriggered = false;
RET_motionPendingOnState = false;
if (!RET_motionPendingOffState) {
RET_motionPendingOffState = true;
//log stop motion time
- RET_motionStopTime = time(NULL);
+ RET_motionStopTime = RET_RTCunixtime;
}
}
//calculate motion state
if (RET_motionPendingOnState) {
//check if above threshold
- time_t inMotionForSeconds = (time(NULL) - RET_motionStartTime);
+ time_t inMotionForSeconds = (RET_RTCunixtime - RET_motionStartTime);
if (inMotionForSeconds >= RET_motionStartThreshold_seconds) {
RET_motionState = true;
- if (debugLED) LED1blink(10,100);
+ if (GLOBAL_debugLED) LED1blink(10,100);
}
}
if (RET_motionPendingOffState) {
- time_t noMotionForSeconds = (time(NULL) - RET_motionStopTime);
+ time_t noMotionForSeconds = (RET_RTCunixtime - RET_motionStopTime);
if (noMotionForSeconds >= RET_motionStartThreshold_seconds) {
RET_motionState = false;
RET_motionTotalActivityHours += (float(RET_motionStopTime - RET_motionStartTime) / 3600.0);
- if (debugLED) LED1blink(5,500);
+ if (GLOBAL_debugLED) LED1blink(5,500);
}
}
}
+
+//------------------------------------------------------------------------------
+// SETUP
+//------------------------------------------------------------------------------
+bool setup() {
+ 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()) {
+ RET_imei = modem.getIMEI();
+ DEBUG("imei: %lld \n",RET_imei);
+ if (modem.registerOnNetwork(3,60000)) {
+ char* result = modem.USSDmessage("blahblah\0", true, 2);
+ if (result != "err") {
+ DEBUG("result: %s \n",result);
+ }
+ } else {
+ //modem failed to register on network
+ }
+ } else {
+ pass = false;
+ //Modem failed to turn on
+ }
+
+ while (1) {
+ Thread::wait(60000);
+ watchdog.kick();
+ }
+
+ //RESULT
+ if (pass) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+
//------------------------------------------------------------------------------
// STATE ENGINE
//------------------------------------------------------------------------------
@@ -252,7 +294,9 @@
switch(RET_mode) {
case MODE_SETUP :
factoryReset();
- //selftest();
+ if (setup()) {
+ RET_mode = MODE_NORMAL;
+ }
break;
case MODE_NORMAL :
//check and log motion
@@ -312,7 +356,6 @@
//------------------------------------------------------------------------------
// MAIN
//------------------------------------------------------------------------------
-
int main() {
RTCticker.attach(&RTCtick, 0.1);
turnOffEverything();
@@ -326,7 +369,7 @@
switch(NRF_POWER->RESETREAS) {
case 0x00000001 :
DEBUG("reset_reason: 0x%08x. - Hard Reset\n",NRF_POWER->RESETREAS);
- factoryReset();
+ RET_coldBoot = 1;
break;
case 0x00000002 :
DEBUG("reset_reason: 0x%08x. - Watchdog\n",NRF_POWER->RESETREAS);
@@ -340,58 +383,29 @@
//CHECK FOR FIRST BOOT
if (RET_coldBoot != 0) factoryReset();
+ copyRETtoGLOBAL();
+
while(true) {
//SLEEP
- if (RET_coldBoot != 1) gotoSleep(30000); //THIS HAS TO BE THE FIRST ITEM IN THE MAIN LOOP
+ if (RET_coldBoot != 1) gotoSleep(10000); //THIS HAS TO BE THE FIRST ITEM IN THE MAIN LOOP
watchdog.kick();
- //TEST SPACE
- Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN);
- if (modem.on()) {
- if (modem.registerOnNetwork(3,60000)) {
- if (modem.USSDsend("blahblah", 2)) {
- while(1) {
- char* response = modem.USSDreceive(105000);
- DEBUG("response: %s",response);
- }
- }
- } else {
- //modem failed to register on network
- }
- } else {
- //Modem failed to turn on
- }
-
-
-
- while (1) {
- Thread::wait(60000);
- watchdog.kick();
- }
-
+ //LOG START TIME
+ GLOBAL_wakeTime = RET_RTCunixtime;
//MAIN LOGIC
DEBUG("mode: %i time: %i, %i, %i, %i \n", RET_mode, RET_RTCmicros, RET_RTCunixtime, RET_buttonHoldTime, RET_buttonPressCount);
+
+ Thread::wait(5000);
+ RET_coldBoot = 0;
+ system_reset();
+
mainStateEngine();
//PRE-SLEEP ACTIONS
- if (needToConfigureLis3dh) { //ONLY RESET ACCELL IF WE NEED TO
+ if (GLOBAL_needToConfigureLis3dh) { //ONLY RESET ACCELL IF WE NEED TO
lis3dh_configureForSleep(10,127);
}
RET_coldBoot = 0;
-
-
- /*
- firstBoot = false; //temp
- if (!firstBoot) gotoSleep(10000);
-
- //INIT
- //Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN);
-
- //MAIN STATE ENGINE
-
- //Configure for sleep
- lis3dh_configureForSleep(10,127);
- */
}
}
\ No newline at end of file