init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Committer:
pathfindr
Date:
Sat Dec 15 14:33:59 2018 +0000
Revision:
10:c8798fd9773b
Parent:
9:b0a1535b8ef2
Child:
11:60eb0ff945f2
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pathfindr 0:94b743e06998 1 #include "main.h"
pathfindr 5:8f8951127724 2 //include "nrf_soc.h"
pathfindr 4:8d8e9bfa82e4 3
pathfindr 0:94b743e06998 4 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 5 //FUNCTION PROTOTYPES
pathfindr 0:94b743e06998 6 //------------------------------------------------------------------------------
pathfindr 4:8d8e9bfa82e4 7 static void mainStateEngine(void);
pathfindr 4:8d8e9bfa82e4 8 static void selftest(void);
pathfindr 7:e9a19750700d 9 static void buttonPress(void);
pathfindr 7:e9a19750700d 10 static void buttonRelease(void);
pathfindr 0:94b743e06998 11
pathfindr 0:94b743e06998 12 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 13 //GLOBAL VARS / CLEARED ON SLEEP (IF USING SOFT REBOOT HACK)
pathfindr 0:94b743e06998 14 //------------------------------------------------------------------------------
pathfindr 0:94b743e06998 15 bool accel_healthy = false;
pathfindr 4:8d8e9bfa82e4 16 bool requireSoftReset = false;
pathfindr 7:e9a19750700d 17 bool motionFlagTriggered = false;
pathfindr 9:b0a1535b8ef2 18 bool debugLED = false;
pathfindr 10:c8798fd9773b 19 bool needToConfigureLis3dh = false;
pathfindr 0:94b743e06998 20
pathfindr 0:94b743e06998 21 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 22 //RETAINED NOINIT RAM VARS
pathfindr 0:94b743e06998 23 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 24 #if defined ( __CC_ARM ) /** THIS IS THE MBED ONLINE COMPILER TOOLCHAIN*/
pathfindr 9:b0a1535b8ef2 25 static uint8_t RET_coldBoot __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 26 static uint8_t RET_mode __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 27 static uint8_t RET_mode_prev __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 28 static uint8_t RET_buttonPressCount __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 29 static time_t RET_buttonPressTime __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 30 static time_t RET_buttonReleaseTime __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 31 static time_t RET_buttonHoldTime __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 32 static time_t RET_RTCunixtime __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 33 static long RET_RTCmicros __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 34 static bool RET_requireImpactFlag __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 35 static char RET_buffer[64] __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 36
pathfindr 7:e9a19750700d 37 //MOTION SETTINGS
pathfindr 10:c8798fd9773b 38 static bool RET_impactTriggered __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 39 static bool RET_motionTriggered __attribute__((section("noinit"),zero_init));
pathfindr 8:7351f8c4cd60 40 static time_t RET_motionStartTime __attribute__((section("noinit"),zero_init));
pathfindr 8:7351f8c4cd60 41 static time_t RET_motionStopTime __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 42 static time_t RET_motionStartThreshold_seconds __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 43 static time_t RET_motionStopThreshold_seconds __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 44 static bool RET_motionPendingOnState __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 45 static bool RET_motionPendingOffState __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 46 static bool RET_motionState __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 47 static float RET_motionTotalActivityHours __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 48 static char RET_motionData[100] __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 49
pathfindr 7:e9a19750700d 50 //EVENT HANDLING
pathfindr 9:b0a1535b8ef2 51 static time_t RET_eventTime_location_log __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 52 static time_t RET_eventTime_location_bc __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 53 static time_t RET_eventTime_environmental_log __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 54 static time_t RET_eventTime_environmental_bc __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 55 static time_t RET_eventTime_activity_bc __attribute__((section("noinit"),zero_init));
pathfindr 9:b0a1535b8ef2 56 static time_t RET_eventTime_wakeFromDormant __attribute__((section("noinit"),zero_init));
pathfindr 4:8d8e9bfa82e4 57 #elif defined ( __GNUC__ )
pathfindr 4:8d8e9bfa82e4 58 #elif defined ( __ICCARM__ )
pathfindr 4:8d8e9bfa82e4 59 #endif
pathfindr 4:8d8e9bfa82e4 60
pathfindr 0:94b743e06998 61 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 62 //GPIO
pathfindr 9:b0a1535b8ef2 63 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 64 InterruptIn button(PN_IN_BUTTON); //This causes wake from sleep
pathfindr 9:b0a1535b8ef2 65
pathfindr 9:b0a1535b8ef2 66 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 67 //PERIPHERALS
pathfindr 0:94b743e06998 68 //------------------------------------------------------------------------------
pathfindr 4:8d8e9bfa82e4 69 //BLE myble;
pathfindr 7:e9a19750700d 70 WatchdogTimer watchdog(65.0); //Do not set to less than 4500ms or can cause issues with softdevice
pathfindr 4:8d8e9bfa82e4 71 #if NEED_CONSOLE_OUTPUT
pathfindr 6:388d3c7efdd9 72 Serial uart(PN_UART_TX, PN_UART_RX, 115200);
pathfindr 4:8d8e9bfa82e4 73 #endif
pathfindr 2:fd554f01abdf 74
pathfindr 6:388d3c7efdd9 75 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 76 //TIMERS
pathfindr 9:b0a1535b8ef2 77 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 78 LowPowerTicker RTCticker; //no impact on power consumption
pathfindr 9:b0a1535b8ef2 79
pathfindr 9:b0a1535b8ef2 80 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 81 //THREAD SEMAPHORES
pathfindr 9:b0a1535b8ef2 82 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 83 Semaphore mainthread;
pathfindr 9:b0a1535b8ef2 84
pathfindr 9:b0a1535b8ef2 85 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 86 //SINGLETONS
pathfindr 6:388d3c7efdd9 87 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 88 //NVStore &nvstore = NVStore::get_instance();
pathfindr 6:388d3c7efdd9 89
pathfindr 7:e9a19750700d 90 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 91 // LOW LEVEL FUNCS
pathfindr 7:e9a19750700d 92 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 93 void turnOffEverything() {
pathfindr 9:b0a1535b8ef2 94 //vreg_en = 0;
pathfindr 9:b0a1535b8ef2 95 LED1off();
pathfindr 9:b0a1535b8ef2 96 }
pathfindr 4:8d8e9bfa82e4 97 void gotoSleep(long sleep_milliseconds) {
pathfindr 9:b0a1535b8ef2 98 turnOffEverything();
pathfindr 9:b0a1535b8ef2 99 watchdog.kick();
pathfindr 4:8d8e9bfa82e4 100 if (requireSoftReset) { //dont need to clear this var as reset changes it back to false
pathfindr 4:8d8e9bfa82e4 101 system_reset();
pathfindr 4:8d8e9bfa82e4 102 }
pathfindr 9:b0a1535b8ef2 103 mainthread.wait(sleep_milliseconds);
pathfindr 6:388d3c7efdd9 104 }
pathfindr 9:b0a1535b8ef2 105 void RTCtick() {
pathfindr 9:b0a1535b8ef2 106 //RET_unixtime ++;
pathfindr 9:b0a1535b8ef2 107 RET_RTCmicros += 100;
pathfindr 9:b0a1535b8ef2 108 RET_RTCunixtime = (RET_RTCmicros / 1000);
pathfindr 9:b0a1535b8ef2 109 //button logic - check for hold
pathfindr 9:b0a1535b8ef2 110 if (RET_buttonHoldTime > 4000) {
pathfindr 9:b0a1535b8ef2 111 RET_buttonHoldTime = 0;
pathfindr 9:b0a1535b8ef2 112 RET_buttonPressCount = 0;
pathfindr 9:b0a1535b8ef2 113 RET_mode_prev = RET_mode;
pathfindr 9:b0a1535b8ef2 114 RET_mode = MODE_BUTTONHOLD;
pathfindr 9:b0a1535b8ef2 115 mainthread.release();
pathfindr 9:b0a1535b8ef2 116 } else {
pathfindr 9:b0a1535b8ef2 117 if((RET_RTCmicros - RET_buttonPressTime) > 500) {
pathfindr 9:b0a1535b8ef2 118 switch (RET_buttonPressCount) {
pathfindr 9:b0a1535b8ef2 119 case 1 :
pathfindr 9:b0a1535b8ef2 120 RET_mode_prev = RET_mode;
pathfindr 9:b0a1535b8ef2 121 RET_mode = MODE_BUTTONPRESS1;
pathfindr 9:b0a1535b8ef2 122 mainthread.release();
pathfindr 9:b0a1535b8ef2 123 break;
pathfindr 9:b0a1535b8ef2 124 case 2 :
pathfindr 9:b0a1535b8ef2 125 RET_mode_prev = RET_mode;
pathfindr 9:b0a1535b8ef2 126 RET_mode = MODE_BUTTONPRESS2;
pathfindr 9:b0a1535b8ef2 127 mainthread.release();
pathfindr 9:b0a1535b8ef2 128 break;
pathfindr 9:b0a1535b8ef2 129 default :
pathfindr 9:b0a1535b8ef2 130 //do nothing
pathfindr 9:b0a1535b8ef2 131 break;
pathfindr 9:b0a1535b8ef2 132 }
pathfindr 9:b0a1535b8ef2 133 RET_buttonPressCount = 0;
pathfindr 9:b0a1535b8ef2 134 }
pathfindr 9:b0a1535b8ef2 135 }
pathfindr 9:b0a1535b8ef2 136 }
pathfindr 7:e9a19750700d 137 void factoryReset() {
pathfindr 9:b0a1535b8ef2 138 //firstBoot = true;
pathfindr 9:b0a1535b8ef2 139 requireSoftReset = false;
pathfindr 6:388d3c7efdd9 140
pathfindr 9:b0a1535b8ef2 141 //RESET RETAINED VARS
pathfindr 9:b0a1535b8ef2 142 RET_coldBoot = 1;
pathfindr 9:b0a1535b8ef2 143 RET_mode = MODE_NORMAL;
pathfindr 9:b0a1535b8ef2 144 RET_mode_prev = RET_mode;
pathfindr 9:b0a1535b8ef2 145 RET_RTCunixtime = 0;
pathfindr 9:b0a1535b8ef2 146 RET_RTCmicros = 0;
pathfindr 9:b0a1535b8ef2 147 RET_eventTime_location_log = 0;
pathfindr 9:b0a1535b8ef2 148 RET_eventTime_location_bc = 0;
pathfindr 9:b0a1535b8ef2 149 RET_eventTime_environmental_log = 0;
pathfindr 9:b0a1535b8ef2 150 RET_eventTime_environmental_bc = 0;
pathfindr 9:b0a1535b8ef2 151 RET_eventTime_activity_bc = 0;
pathfindr 9:b0a1535b8ef2 152 RET_eventTime_wakeFromDormant = 0;
pathfindr 7:e9a19750700d 153 RET_motionPendingOffState = 0;
pathfindr 7:e9a19750700d 154 RET_motionPendingOnState = 0;
pathfindr 10:c8798fd9773b 155 RET_motionTriggered = 0;
pathfindr 10:c8798fd9773b 156 RET_impactTriggered = 0;
pathfindr 7:e9a19750700d 157 RET_motionState = 0;
pathfindr 7:e9a19750700d 158 RET_motionStartTime = 0;
pathfindr 7:e9a19750700d 159 RET_motionStopTime = 0;
pathfindr 7:e9a19750700d 160 RET_motionStartThreshold_seconds = 60;
pathfindr 7:e9a19750700d 161 RET_motionStopThreshold_seconds = 60;
pathfindr 9:b0a1535b8ef2 162 RET_motionTotalActivityHours = 0.0;
pathfindr 9:b0a1535b8ef2 163 RET_buttonPressTime = 0;
pathfindr 9:b0a1535b8ef2 164 RET_buttonPressCount = 0;
pathfindr 9:b0a1535b8ef2 165 RET_buttonHoldTime = 0;
pathfindr 6:388d3c7efdd9 166
pathfindr 10:c8798fd9773b 167 //CONFIGURE ACCELL DEFAULT
pathfindr 10:c8798fd9773b 168 lis3dh_configureForSleep(10,127);
pathfindr 10:c8798fd9773b 169
pathfindr 6:388d3c7efdd9 170 //SET IDENTIFIER
pathfindr 7:e9a19750700d 171 //uint32_t nv_value = 12345678;
pathfindr 7:e9a19750700d 172 //int rc = nvstore.set(NV_IDENTIFIER, sizeof(nv_value), &nv_value);
pathfindr 7:e9a19750700d 173 }
pathfindr 9:b0a1535b8ef2 174 void selfTest() {
pathfindr 8:7351f8c4cd60 175 //Accelerometer
pathfindr 8:7351f8c4cd60 176 LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK);
pathfindr 8:7351f8c4cd60 177 uint8_t lis3dh_id;
pathfindr 8:7351f8c4cd60 178 lis3dh.LIS3DH_GetWHO_AM_I(&lis3dh_id);
pathfindr 9:b0a1535b8ef2 179 if (lis3dh_id == 51) {
pathfindr 9:b0a1535b8ef2 180 LED1blink(10,50);
pathfindr 9:b0a1535b8ef2 181 }
pathfindr 9:b0a1535b8ef2 182 }
pathfindr 9:b0a1535b8ef2 183
pathfindr 9:b0a1535b8ef2 184 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 185 // USER BUTTON HANDLING
pathfindr 9:b0a1535b8ef2 186 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 187 void buttonPress() {
pathfindr 9:b0a1535b8ef2 188 RET_buttonPressTime = RET_RTCmicros;
pathfindr 9:b0a1535b8ef2 189 }
pathfindr 9:b0a1535b8ef2 190 void buttonRelease() {
pathfindr 9:b0a1535b8ef2 191 RET_buttonHoldTime = (RET_RTCmicros - RET_buttonPressTime);
pathfindr 9:b0a1535b8ef2 192 //debounce catch
pathfindr 9:b0a1535b8ef2 193 if((RET_RTCmicros - RET_buttonPressTime) >= 100) {
pathfindr 9:b0a1535b8ef2 194 RET_buttonPressCount ++;
pathfindr 9:b0a1535b8ef2 195 }
pathfindr 9:b0a1535b8ef2 196 }
pathfindr 9:b0a1535b8ef2 197
pathfindr 9:b0a1535b8ef2 198 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 199 // MOTION FUNCS
pathfindr 9:b0a1535b8ef2 200 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 201 void checkMotion() {
pathfindr 9:b0a1535b8ef2 202 if (lis3dh_int2) {
pathfindr 9:b0a1535b8ef2 203 if (debugLED) LED1blink(2,100);
pathfindr 9:b0a1535b8ef2 204 RET_motionTriggered = true;
pathfindr 10:c8798fd9773b 205 needToConfigureLis3dh = true; //interrupt has fire so need to clear it
pathfindr 9:b0a1535b8ef2 206 if (!RET_motionPendingOnState) {
pathfindr 9:b0a1535b8ef2 207 RET_motionPendingOnState = true;
pathfindr 9:b0a1535b8ef2 208 RET_motionPendingOffState = false;
pathfindr 9:b0a1535b8ef2 209 // Log start motion time
pathfindr 9:b0a1535b8ef2 210 RET_motionStartTime = time(NULL);
pathfindr 9:b0a1535b8ef2 211 }
pathfindr 9:b0a1535b8ef2 212 } else {
pathfindr 9:b0a1535b8ef2 213 if (debugLED) LED1blink(2,500);
pathfindr 9:b0a1535b8ef2 214 RET_motionTriggered = false;
pathfindr 9:b0a1535b8ef2 215 RET_motionPendingOnState = false;
pathfindr 9:b0a1535b8ef2 216 if (!RET_motionPendingOffState) {
pathfindr 9:b0a1535b8ef2 217 RET_motionPendingOffState = true;
pathfindr 9:b0a1535b8ef2 218 //log stop motion time
pathfindr 9:b0a1535b8ef2 219 RET_motionStopTime = time(NULL);
pathfindr 9:b0a1535b8ef2 220 }
pathfindr 9:b0a1535b8ef2 221 }
pathfindr 9:b0a1535b8ef2 222 //calculate motion state
pathfindr 9:b0a1535b8ef2 223 if (RET_motionPendingOnState) {
pathfindr 9:b0a1535b8ef2 224 //check if above threshold
pathfindr 9:b0a1535b8ef2 225 time_t inMotionForSeconds = (time(NULL) - RET_motionStartTime);
pathfindr 9:b0a1535b8ef2 226 if (inMotionForSeconds >= RET_motionStartThreshold_seconds) {
pathfindr 9:b0a1535b8ef2 227 RET_motionState = true;
pathfindr 9:b0a1535b8ef2 228 if (debugLED) LED1blink(10,100);
pathfindr 9:b0a1535b8ef2 229 }
pathfindr 9:b0a1535b8ef2 230 }
pathfindr 9:b0a1535b8ef2 231 if (RET_motionPendingOffState) {
pathfindr 9:b0a1535b8ef2 232 time_t noMotionForSeconds = (time(NULL) - RET_motionStopTime);
pathfindr 9:b0a1535b8ef2 233 if (noMotionForSeconds >= RET_motionStartThreshold_seconds) {
pathfindr 9:b0a1535b8ef2 234 RET_motionState = false;
pathfindr 9:b0a1535b8ef2 235 RET_motionTotalActivityHours += (float(RET_motionStopTime - RET_motionStartTime) / 3600.0);
pathfindr 9:b0a1535b8ef2 236 if (debugLED) LED1blink(5,500);
pathfindr 9:b0a1535b8ef2 237 }
pathfindr 9:b0a1535b8ef2 238 }
pathfindr 8:7351f8c4cd60 239 }
pathfindr 8:7351f8c4cd60 240
pathfindr 7:e9a19750700d 241 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 242 // STATE ENGINE
pathfindr 7:e9a19750700d 243 //------------------------------------------------------------------------------
pathfindr 6:388d3c7efdd9 244 void mainStateEngine() {
pathfindr 6:388d3c7efdd9 245 switch(RET_mode) {
pathfindr 6:388d3c7efdd9 246 case MODE_SETUP :
pathfindr 7:e9a19750700d 247 factoryReset();
pathfindr 6:388d3c7efdd9 248 //selftest();
pathfindr 6:388d3c7efdd9 249 break;
pathfindr 6:388d3c7efdd9 250 case MODE_NORMAL :
pathfindr 7:e9a19750700d 251 //check and log motion
pathfindr 9:b0a1535b8ef2 252 checkMotion();
pathfindr 9:b0a1535b8ef2 253
pathfindr 9:b0a1535b8ef2 254 //EVENTS
pathfindr 9:b0a1535b8ef2 255 //Location
pathfindr 9:b0a1535b8ef2 256 if(time(NULL) > RET_eventTime_location_log && RET_eventTime_location_log > 0) {
pathfindr 9:b0a1535b8ef2 257 //getdata_environmental();
pathfindr 9:b0a1535b8ef2 258 //event_location_log();
pathfindr 9:b0a1535b8ef2 259 }
pathfindr 9:b0a1535b8ef2 260 if(time(NULL) > RET_eventTime_location_bc && RET_eventTime_location_bc > 0) {
pathfindr 9:b0a1535b8ef2 261 //getdata_battery();
pathfindr 9:b0a1535b8ef2 262 //event_location_broadcast();
pathfindr 9:b0a1535b8ef2 263 }
pathfindr 9:b0a1535b8ef2 264 //Environmental
pathfindr 9:b0a1535b8ef2 265 if(time(NULL) > RET_eventTime_environmental_log && RET_eventTime_environmental_log > 0) {
pathfindr 9:b0a1535b8ef2 266 //event_environmental_log();
pathfindr 9:b0a1535b8ef2 267 }
pathfindr 9:b0a1535b8ef2 268 if(time(NULL) > RET_eventTime_environmental_bc && RET_eventTime_environmental_bc > 0) {
pathfindr 9:b0a1535b8ef2 269 //event_environmental_bc();
pathfindr 7:e9a19750700d 270 }
pathfindr 9:b0a1535b8ef2 271 //Activity
pathfindr 9:b0a1535b8ef2 272 if(time(NULL) > RET_eventTime_activity_bc && RET_eventTime_activity_bc > 0) {
pathfindr 9:b0a1535b8ef2 273 //event_activity_bc();
pathfindr 9:b0a1535b8ef2 274 }
pathfindr 9:b0a1535b8ef2 275 break;
pathfindr 9:b0a1535b8ef2 276 case MODE_DORMANT :
pathfindr 9:b0a1535b8ef2 277 if (time(NULL) > RET_eventTime_wakeFromDormant) {
pathfindr 9:b0a1535b8ef2 278 RET_mode = MODE_NORMAL;
pathfindr 7:e9a19750700d 279 }
pathfindr 9:b0a1535b8ef2 280 break;
pathfindr 9:b0a1535b8ef2 281 case MODE_BUTTONPRESS1 :
pathfindr 9:b0a1535b8ef2 282 LED1blink(2,300);
pathfindr 9:b0a1535b8ef2 283 RET_mode = RET_mode_prev;
pathfindr 9:b0a1535b8ef2 284 break;
pathfindr 9:b0a1535b8ef2 285 case MODE_BUTTONPRESS2 :
pathfindr 9:b0a1535b8ef2 286 LED1blink(4,300);
pathfindr 9:b0a1535b8ef2 287 RET_mode = RET_mode_prev;
pathfindr 9:b0a1535b8ef2 288 break;
pathfindr 9:b0a1535b8ef2 289 case MODE_BUTTONHOLD :
pathfindr 9:b0a1535b8ef2 290 LED1blink(10,300);
pathfindr 9:b0a1535b8ef2 291 RET_mode = RET_mode_prev;
pathfindr 6:388d3c7efdd9 292 break;
pathfindr 6:388d3c7efdd9 293 default :
pathfindr 6:388d3c7efdd9 294 RET_mode = MODE_SETUP;
pathfindr 6:388d3c7efdd9 295 }
pathfindr 6:388d3c7efdd9 296 }
pathfindr 6:388d3c7efdd9 297
pathfindr 6:388d3c7efdd9 298
pathfindr 7:e9a19750700d 299 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 300 // MAIN
pathfindr 7:e9a19750700d 301 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 302
pathfindr 0:94b743e06998 303 int main() {
pathfindr 9:b0a1535b8ef2 304 RTCticker.attach(&RTCtick, 0.1);
pathfindr 9:b0a1535b8ef2 305 turnOffEverything();
pathfindr 4:8d8e9bfa82e4 306
pathfindr 9:b0a1535b8ef2 307 button.fall(&buttonPress); //does this affect power?
pathfindr 9:b0a1535b8ef2 308 button.rise(&buttonRelease);
pathfindr 9:b0a1535b8ef2 309
pathfindr 4:8d8e9bfa82e4 310 //CHECK IF THIS IS RESET
pathfindr 4:8d8e9bfa82e4 311 //0x00000004 == soft reset //0x00000002 == watchdog //0x00000001 == button/hardreset
pathfindr 4:8d8e9bfa82e4 312 if (NRF_POWER->RESETREAS != 0xffffffff) {
pathfindr 4:8d8e9bfa82e4 313 switch(NRF_POWER->RESETREAS) {
pathfindr 4:8d8e9bfa82e4 314 case 0x00000001 :
pathfindr 4:8d8e9bfa82e4 315 DEBUG("reset_reason: 0x%08x. - Hard Reset\n",NRF_POWER->RESETREAS);
pathfindr 7:e9a19750700d 316 factoryReset();
pathfindr 4:8d8e9bfa82e4 317 break;
pathfindr 4:8d8e9bfa82e4 318 case 0x00000002 :
pathfindr 4:8d8e9bfa82e4 319 DEBUG("reset_reason: 0x%08x. - Watchdog\n",NRF_POWER->RESETREAS);
pathfindr 4:8d8e9bfa82e4 320 break;
pathfindr 4:8d8e9bfa82e4 321 case 0x00000004 :
pathfindr 4:8d8e9bfa82e4 322 DEBUG("reset_reason: 0x%08x. - Soft reset\n",NRF_POWER->RESETREAS);
pathfindr 4:8d8e9bfa82e4 323 break;
pathfindr 4:8d8e9bfa82e4 324 }
pathfindr 4:8d8e9bfa82e4 325 NRF_POWER->RESETREAS = 0xffffffff;
pathfindr 4:8d8e9bfa82e4 326 }
pathfindr 9:b0a1535b8ef2 327 //CHECK FOR FIRST BOOT
pathfindr 9:b0a1535b8ef2 328 if (RET_coldBoot != 0) factoryReset();
pathfindr 9:b0a1535b8ef2 329
pathfindr 0:94b743e06998 330 while(true) {
pathfindr 9:b0a1535b8ef2 331 //SLEEP
pathfindr 9:b0a1535b8ef2 332 if (RET_coldBoot != 1) gotoSleep(30000); //THIS HAS TO BE THE FIRST ITEM IN THE MAIN LOOP
pathfindr 4:8d8e9bfa82e4 333 watchdog.kick();
pathfindr 9:b0a1535b8ef2 334
pathfindr 9:b0a1535b8ef2 335 //MAIN LOGIC
pathfindr 9:b0a1535b8ef2 336 DEBUG("mode: %i time: %i, %i, %i, %i \n", RET_mode, RET_RTCmicros, RET_RTCunixtime, RET_buttonHoldTime, RET_buttonPressCount);
pathfindr 9:b0a1535b8ef2 337 mainStateEngine();
pathfindr 9:b0a1535b8ef2 338
pathfindr 9:b0a1535b8ef2 339 //PRE-SLEEP ACTIONS
pathfindr 10:c8798fd9773b 340 if (needToConfigureLis3dh) { //ONLY RESET ACCELL IF WE NEED TO
pathfindr 10:c8798fd9773b 341 lis3dh_configureForSleep(10,127);
pathfindr 10:c8798fd9773b 342 }
pathfindr 9:b0a1535b8ef2 343 RET_coldBoot = 0;
pathfindr 9:b0a1535b8ef2 344
pathfindr 9:b0a1535b8ef2 345
pathfindr 9:b0a1535b8ef2 346 /*
pathfindr 7:e9a19750700d 347 firstBoot = false; //temp
pathfindr 7:e9a19750700d 348 if (!firstBoot) gotoSleep(10000);
pathfindr 7:e9a19750700d 349
pathfindr 7:e9a19750700d 350 //INIT
pathfindr 9:b0a1535b8ef2 351 //Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN);
pathfindr 4:8d8e9bfa82e4 352
pathfindr 4:8d8e9bfa82e4 353 //MAIN STATE ENGINE
pathfindr 7:e9a19750700d 354
pathfindr 7:e9a19750700d 355 //Configure for sleep
pathfindr 9:b0a1535b8ef2 356 lis3dh_configureForSleep(10,127);
pathfindr 9:b0a1535b8ef2 357 */
pathfindr 0:94b743e06998 358 }
pathfindr 7:e9a19750700d 359 }