init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Committer:
pathfindr
Date:
Tue Dec 11 22:38:25 2018 +0000
Revision:
8:7351f8c4cd60
Parent:
7:e9a19750700d
Child:
9:b0a1535b8ef2
k

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 7:e9a19750700d 13 //GLOBAL VARS
pathfindr 0:94b743e06998 14 //------------------------------------------------------------------------------
pathfindr 0:94b743e06998 15 bool accel_healthy = false;
pathfindr 4:8d8e9bfa82e4 16 bool firstBoot = false;
pathfindr 4:8d8e9bfa82e4 17 bool requireSoftReset = false;
pathfindr 7:e9a19750700d 18 bool motionFlagTriggered = false;
pathfindr 0:94b743e06998 19
pathfindr 0:94b743e06998 20 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 21 //RETAINED NOINIT RAM VARS
pathfindr 0:94b743e06998 22 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 23 #if defined ( __CC_ARM ) /** THIS IS THE MBED ONLINE COMPILER TOOLCHAIN*/
pathfindr 7:e9a19750700d 24 static uint8_t RET_mode __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 25
pathfindr 7:e9a19750700d 26 static uint8_t RET_buttonReleaseCount __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 27 static uint32_t RET_buttonPressTime __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 28 static uint32_t RET_buttonReleaseTime __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 29 static uint32_t RET_unixtime_backup __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 30 static bool RET_requireImpactFlag __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 31 static char RET_buffer[64] __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 32
pathfindr 7:e9a19750700d 33 //MOTION SETTINGS
pathfindr 7:e9a19750700d 34 static bool RET_motionTriggered __attribute__((section("noinit"),zero_init));
pathfindr 8:7351f8c4cd60 35 static time_t RET_motionStartTime __attribute__((section("noinit"),zero_init));
pathfindr 8:7351f8c4cd60 36 static time_t RET_motionStopTime __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 37 static uint32_t RET_motionStartThreshold_seconds __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 38 static uint32_t RET_motionStopThreshold_seconds __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 39 static bool RET_motionPendingOnState __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 40 static bool RET_motionPendingOffState __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 41 static bool RET_motionState __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 42
pathfindr 7:e9a19750700d 43 //EVENT HANDLING
pathfindr 7:e9a19750700d 44 static uint32_t RET_eventTime_location __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 45 static uint32_t RET_eventTime_environmental __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 46 static uint32_t RET_eventTime_activity __attribute__((section("noinit"),zero_init));
pathfindr 4:8d8e9bfa82e4 47 #elif defined ( __GNUC__ )
pathfindr 4:8d8e9bfa82e4 48 #elif defined ( __ICCARM__ )
pathfindr 4:8d8e9bfa82e4 49 #endif
pathfindr 4:8d8e9bfa82e4 50
pathfindr 0:94b743e06998 51 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 52 //PERIPHERALS
pathfindr 0:94b743e06998 53 //------------------------------------------------------------------------------
pathfindr 4:8d8e9bfa82e4 54 //BLE myble;
pathfindr 7:e9a19750700d 55 WatchdogTimer watchdog(65.0); //Do not set to less than 4500ms or can cause issues with softdevice
pathfindr 7:e9a19750700d 56 InterruptIn button(PN_IN_BUTTON); //This causes wake from sleep
pathfindr 4:8d8e9bfa82e4 57 #if NEED_CONSOLE_OUTPUT
pathfindr 6:388d3c7efdd9 58 Serial uart(PN_UART_TX, PN_UART_RX, 115200);
pathfindr 4:8d8e9bfa82e4 59 #endif
pathfindr 2:fd554f01abdf 60
pathfindr 6:388d3c7efdd9 61 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 62 //SINGLETONS
pathfindr 6:388d3c7efdd9 63 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 64 //NVStore &nvstore = NVStore::get_instance();
pathfindr 6:388d3c7efdd9 65
pathfindr 0:94b743e06998 66
pathfindr 7:e9a19750700d 67 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 68 // LOW LEVEL CRITICAL FUNCS
pathfindr 7:e9a19750700d 69 //------------------------------------------------------------------------------
pathfindr 4:8d8e9bfa82e4 70 void gotoSleep(long sleep_milliseconds) {
pathfindr 4:8d8e9bfa82e4 71
pathfindr 4:8d8e9bfa82e4 72 if (requireSoftReset) { //dont need to clear this var as reset changes it back to false
pathfindr 6:388d3c7efdd9 73 RET_unixtime_backup = time(NULL); //save unixtime for reset
pathfindr 4:8d8e9bfa82e4 74 system_reset();
pathfindr 4:8d8e9bfa82e4 75 }
pathfindr 7:e9a19750700d 76
pathfindr 7:e9a19750700d 77 //button.fall(&buttonPress);
pathfindr 7:e9a19750700d 78 //button.rise(&buttonRelease);
pathfindr 7:e9a19750700d 79
pathfindr 7:e9a19750700d 80 ThisThread::sleep_for(sleep_milliseconds);
pathfindr 6:388d3c7efdd9 81 }
pathfindr 6:388d3c7efdd9 82
pathfindr 7:e9a19750700d 83 void factoryReset() {
pathfindr 4:8d8e9bfa82e4 84 firstBoot = true;
pathfindr 6:388d3c7efdd9 85
pathfindr 6:388d3c7efdd9 86 //RESET VARS
pathfindr 4:8d8e9bfa82e4 87 RET_mode = 0;
pathfindr 6:388d3c7efdd9 88 RET_unixtime_backup = 0;
pathfindr 7:e9a19750700d 89 RET_buttonReleaseCount = 0;
pathfindr 7:e9a19750700d 90 RET_eventTime_location = 0;
pathfindr 7:e9a19750700d 91 RET_eventTime_environmental = 0;
pathfindr 7:e9a19750700d 92 RET_eventTime_activity = 0;
pathfindr 7:e9a19750700d 93 RET_motionPendingOffState = 0;
pathfindr 7:e9a19750700d 94 RET_motionPendingOnState = 0;
pathfindr 7:e9a19750700d 95 RET_motionState = 0;
pathfindr 7:e9a19750700d 96 RET_motionStartTime = 0;
pathfindr 7:e9a19750700d 97 RET_motionStopTime = 0;
pathfindr 7:e9a19750700d 98 RET_motionStartThreshold_seconds = 60;
pathfindr 7:e9a19750700d 99 RET_motionStopThreshold_seconds = 60;
pathfindr 6:388d3c7efdd9 100 set_time(RET_unixtime_backup);
pathfindr 6:388d3c7efdd9 101
pathfindr 6:388d3c7efdd9 102 //SET IDENTIFIER
pathfindr 7:e9a19750700d 103 //uint32_t nv_value = 12345678;
pathfindr 7:e9a19750700d 104 //int rc = nvstore.set(NV_IDENTIFIER, sizeof(nv_value), &nv_value);
pathfindr 7:e9a19750700d 105 }
pathfindr 7:e9a19750700d 106
pathfindr 7:e9a19750700d 107 void turnOffEverything() {
pathfindr 7:e9a19750700d 108 //vreg_en = 0;
pathfindr 7:e9a19750700d 109 led1 = 1;
pathfindr 4:8d8e9bfa82e4 110 }
pathfindr 4:8d8e9bfa82e4 111
pathfindr 7:e9a19750700d 112 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 113 // USER BUTTON
pathfindr 7:e9a19750700d 114 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 115 void buttonPress() {
pathfindr 7:e9a19750700d 116 led1 = 0;
pathfindr 7:e9a19750700d 117
pathfindr 7:e9a19750700d 118 //while(RET_buttonReleaseCount < 1){
pathfindr 7:e9a19750700d 119 //wait
pathfindr 7:e9a19750700d 120 //}
pathfindr 7:e9a19750700d 121
pathfindr 7:e9a19750700d 122 //led1 = 1;
pathfindr 7:e9a19750700d 123 /*
pathfindr 7:e9a19750700d 124 //RET_buttonPressTime = time(NULL);
pathfindr 7:e9a19750700d 125 RET_buttonReleaseCount ++;
pathfindr 7:e9a19750700d 126 led1 = 0;
pathfindr 7:e9a19750700d 127 for (int i = 0; i < RET_buttonReleaseCount; i++) {
pathfindr 7:e9a19750700d 128 led1 = 0;
pathfindr 7:e9a19750700d 129 wait_ms(100);
pathfindr 7:e9a19750700d 130 led1 = 1;
pathfindr 7:e9a19750700d 131 wait_ms(100);
pathfindr 7:e9a19750700d 132 */
pathfindr 7:e9a19750700d 133 }
pathfindr 7:e9a19750700d 134 void buttonRelease() {
pathfindr 7:e9a19750700d 135 led1 = 1;
pathfindr 7:e9a19750700d 136 //RET_buttonReleaseCount ++;
pathfindr 7:e9a19750700d 137 /*RET_buttonReleaseCount ++;
pathfindr 7:e9a19750700d 138 led1 = 0;
pathfindr 7:e9a19750700d 139 for (int i = 0; i < RET_buttonReleaseCount; i++) {
pathfindr 7:e9a19750700d 140 led1 = 0;
pathfindr 7:e9a19750700d 141 wait_ms(100);
pathfindr 7:e9a19750700d 142 led1 = 1;
pathfindr 7:e9a19750700d 143 wait_ms(100);
pathfindr 7:e9a19750700d 144 }*/
pathfindr 7:e9a19750700d 145 }
pathfindr 7:e9a19750700d 146
pathfindr 8:7351f8c4cd60 147 bool selfTest() {
pathfindr 8:7351f8c4cd60 148 //Accelerometer
pathfindr 8:7351f8c4cd60 149 LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK);
pathfindr 8:7351f8c4cd60 150 uint8_t lis3dh_id;
pathfindr 8:7351f8c4cd60 151 lis3dh.LIS3DH_GetWHO_AM_I(&lis3dh_id);
pathfindr 8:7351f8c4cd60 152 if (asdf == 51) {
pathfindr 8:7351f8c4cd60 153 LED1blink(10,100);
pathfindr 8:7351f8c4cd60 154 }
pathfindr 8:7351f8c4cd60 155 }
pathfindr 8:7351f8c4cd60 156
pathfindr 7:e9a19750700d 157 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 158 // STATE ENGINE
pathfindr 7:e9a19750700d 159 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 160
pathfindr 6:388d3c7efdd9 161 void mainStateEngine() {
pathfindr 6:388d3c7efdd9 162
pathfindr 6:388d3c7efdd9 163 RET_mode = MODE_NORMAL;
pathfindr 6:388d3c7efdd9 164
pathfindr 6:388d3c7efdd9 165 switch(RET_mode) {
pathfindr 6:388d3c7efdd9 166 case MODE_SETUP :
pathfindr 7:e9a19750700d 167 factoryReset();
pathfindr 6:388d3c7efdd9 168 //selftest();
pathfindr 6:388d3c7efdd9 169 break;
pathfindr 6:388d3c7efdd9 170
pathfindr 6:388d3c7efdd9 171 case MODE_NORMAL :
pathfindr 7:e9a19750700d 172 //check and log motion
pathfindr 7:e9a19750700d 173 if (lis3dh_int1) {
pathfindr 7:e9a19750700d 174 LED1blink(2,100);
pathfindr 7:e9a19750700d 175 RET_motionTriggered = true;
pathfindr 7:e9a19750700d 176 if (!RET_motionPendingOnState) {
pathfindr 7:e9a19750700d 177 RET_motionPendingOnState = true;
pathfindr 7:e9a19750700d 178 RET_motionPendingOffState = false;
pathfindr 7:e9a19750700d 179 // Log start motion time
pathfindr 7:e9a19750700d 180 RET_motionStartTime = time(NULL);
pathfindr 7:e9a19750700d 181 RET_motionStopTime = 0;
pathfindr 7:e9a19750700d 182 }
pathfindr 7:e9a19750700d 183 } else {
pathfindr 7:e9a19750700d 184 LED1blink(2,500);
pathfindr 7:e9a19750700d 185 RET_motionTriggered = false;
pathfindr 7:e9a19750700d 186 RET_motionPendingOnState = false;
pathfindr 7:e9a19750700d 187 if (!RET_motionPendingOffState) {
pathfindr 7:e9a19750700d 188 RET_motionPendingOffState = true;
pathfindr 7:e9a19750700d 189 //log stop motion time
pathfindr 7:e9a19750700d 190 RET_motionStopTime = time(NULL);
pathfindr 7:e9a19750700d 191 RET_motionStartTime = 0;
pathfindr 7:e9a19750700d 192 }
pathfindr 7:e9a19750700d 193 }
pathfindr 7:e9a19750700d 194 //calculate motion state
pathfindr 7:e9a19750700d 195 if (RET_motionPendingOnState) {
pathfindr 7:e9a19750700d 196 //check if above threshold
pathfindr 7:e9a19750700d 197 time_t inMotionForSeconds = (time(NULL) - RET_motionStartTime);
pathfindr 7:e9a19750700d 198 if (inMotionForSeconds >= RET_motionStartThreshold_seconds) {
pathfindr 7:e9a19750700d 199 RET_motionState = true;
pathfindr 7:e9a19750700d 200 LED1blink(10,100);
pathfindr 7:e9a19750700d 201 }
pathfindr 7:e9a19750700d 202 }
pathfindr 7:e9a19750700d 203 if (RET_motionPendingOffState) {
pathfindr 7:e9a19750700d 204 time_t noMotionForSeconds = (time(NULL) - RET_motionStopTime);
pathfindr 7:e9a19750700d 205 if (noMotionForSeconds >= RET_motionStartThreshold_seconds) {
pathfindr 7:e9a19750700d 206 RET_motionState = false;
pathfindr 7:e9a19750700d 207 LED1blink(5,500);
pathfindr 7:e9a19750700d 208 }
pathfindr 6:388d3c7efdd9 209 }
pathfindr 6:388d3c7efdd9 210
pathfindr 6:388d3c7efdd9 211 break;
pathfindr 6:388d3c7efdd9 212
pathfindr 6:388d3c7efdd9 213 case MODE_DORMANT :
pathfindr 7:e9a19750700d 214 //LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK);
pathfindr 6:388d3c7efdd9 215 break;
pathfindr 6:388d3c7efdd9 216
pathfindr 6:388d3c7efdd9 217 case MODE_OFF_48HRS :
pathfindr 6:388d3c7efdd9 218
pathfindr 6:388d3c7efdd9 219 break;
pathfindr 6:388d3c7efdd9 220
pathfindr 6:388d3c7efdd9 221 default :
pathfindr 6:388d3c7efdd9 222 RET_mode = MODE_SETUP;
pathfindr 6:388d3c7efdd9 223 }
pathfindr 6:388d3c7efdd9 224 }
pathfindr 6:388d3c7efdd9 225
pathfindr 6:388d3c7efdd9 226
pathfindr 7:e9a19750700d 227 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 228 // MAIN
pathfindr 7:e9a19750700d 229 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 230
pathfindr 0:94b743e06998 231 int main() {
pathfindr 4:8d8e9bfa82e4 232
pathfindr 4:8d8e9bfa82e4 233 //CHECK IF THIS IS RESET
pathfindr 4:8d8e9bfa82e4 234 //0x00000004 == soft reset //0x00000002 == watchdog //0x00000001 == button/hardreset
pathfindr 4:8d8e9bfa82e4 235 if (NRF_POWER->RESETREAS != 0xffffffff) {
pathfindr 4:8d8e9bfa82e4 236 switch(NRF_POWER->RESETREAS) {
pathfindr 4:8d8e9bfa82e4 237 case 0x00000001 :
pathfindr 4:8d8e9bfa82e4 238 DEBUG("reset_reason: 0x%08x. - Hard Reset\n",NRF_POWER->RESETREAS);
pathfindr 7:e9a19750700d 239 factoryReset();
pathfindr 4:8d8e9bfa82e4 240 break;
pathfindr 4:8d8e9bfa82e4 241 case 0x00000002 :
pathfindr 4:8d8e9bfa82e4 242 DEBUG("reset_reason: 0x%08x. - Watchdog\n",NRF_POWER->RESETREAS);
pathfindr 6:388d3c7efdd9 243 set_time(RET_unixtime_backup);
pathfindr 4:8d8e9bfa82e4 244 break;
pathfindr 4:8d8e9bfa82e4 245 case 0x00000004 :
pathfindr 4:8d8e9bfa82e4 246 DEBUG("reset_reason: 0x%08x. - Soft reset\n",NRF_POWER->RESETREAS);
pathfindr 6:388d3c7efdd9 247 set_time(RET_unixtime_backup);
pathfindr 4:8d8e9bfa82e4 248 break;
pathfindr 4:8d8e9bfa82e4 249 }
pathfindr 4:8d8e9bfa82e4 250 NRF_POWER->RESETREAS = 0xffffffff;
pathfindr 4:8d8e9bfa82e4 251 }
pathfindr 7:e9a19750700d 252
pathfindr 0:94b743e06998 253 while(true) {
pathfindr 7:e9a19750700d 254 turnOffEverything();
pathfindr 4:8d8e9bfa82e4 255 watchdog.kick();
pathfindr 7:e9a19750700d 256 firstBoot = false; //temp
pathfindr 7:e9a19750700d 257 if (!firstBoot) gotoSleep(10000);
pathfindr 7:e9a19750700d 258
pathfindr 7:e9a19750700d 259 //INIT
pathfindr 7:e9a19750700d 260 Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN);
pathfindr 4:8d8e9bfa82e4 261
pathfindr 4:8d8e9bfa82e4 262 //MAIN STATE ENGINE
pathfindr 7:e9a19750700d 263 //LED1blink(1,100);
pathfindr 4:8d8e9bfa82e4 264 mainStateEngine();
pathfindr 7:e9a19750700d 265
pathfindr 7:e9a19750700d 266 //Configure for sleep
pathfindr 7:e9a19750700d 267 lis3dh_configureForSleep(10);
pathfindr 0:94b743e06998 268 }
pathfindr 7:e9a19750700d 269 }