init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Committer:
pathfindr
Date:
Tue Dec 11 22:18:24 2018 +0000
Revision:
7:e9a19750700d
Parent:
6:388d3c7efdd9
Child:
8:7351f8c4cd60
init

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 7:e9a19750700d 35 static time_t RET_motionStartTime __attribute__((section("noinit"),zero_init));
pathfindr 7:e9a19750700d 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 7:e9a19750700d 147 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 148 // STATE ENGINE
pathfindr 7:e9a19750700d 149 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 150
pathfindr 6:388d3c7efdd9 151 void mainStateEngine() {
pathfindr 6:388d3c7efdd9 152
pathfindr 6:388d3c7efdd9 153 RET_mode = MODE_NORMAL;
pathfindr 6:388d3c7efdd9 154
pathfindr 6:388d3c7efdd9 155 switch(RET_mode) {
pathfindr 6:388d3c7efdd9 156 case MODE_SETUP :
pathfindr 7:e9a19750700d 157 factoryReset();
pathfindr 6:388d3c7efdd9 158 //selftest();
pathfindr 6:388d3c7efdd9 159 break;
pathfindr 6:388d3c7efdd9 160
pathfindr 6:388d3c7efdd9 161 case MODE_NORMAL :
pathfindr 7:e9a19750700d 162 //check and log motion
pathfindr 7:e9a19750700d 163 if (lis3dh_int1) {
pathfindr 7:e9a19750700d 164 LED1blink(2,100);
pathfindr 7:e9a19750700d 165 RET_motionTriggered = true;
pathfindr 7:e9a19750700d 166 if (!RET_motionPendingOnState) {
pathfindr 7:e9a19750700d 167 RET_motionPendingOnState = true;
pathfindr 7:e9a19750700d 168 RET_motionPendingOffState = false;
pathfindr 7:e9a19750700d 169 // Log start motion time
pathfindr 7:e9a19750700d 170 RET_motionStartTime = time(NULL);
pathfindr 7:e9a19750700d 171 RET_motionStopTime = 0;
pathfindr 7:e9a19750700d 172 }
pathfindr 7:e9a19750700d 173 } else {
pathfindr 7:e9a19750700d 174 LED1blink(2,500);
pathfindr 7:e9a19750700d 175 RET_motionTriggered = false;
pathfindr 7:e9a19750700d 176 RET_motionPendingOnState = false;
pathfindr 7:e9a19750700d 177 if (!RET_motionPendingOffState) {
pathfindr 7:e9a19750700d 178 RET_motionPendingOffState = true;
pathfindr 7:e9a19750700d 179 //log stop motion time
pathfindr 7:e9a19750700d 180 RET_motionStopTime = time(NULL);
pathfindr 7:e9a19750700d 181 RET_motionStartTime = 0;
pathfindr 7:e9a19750700d 182 }
pathfindr 7:e9a19750700d 183 }
pathfindr 7:e9a19750700d 184 //calculate motion state
pathfindr 7:e9a19750700d 185 if (RET_motionPendingOnState) {
pathfindr 7:e9a19750700d 186 //check if above threshold
pathfindr 7:e9a19750700d 187 time_t inMotionForSeconds = (time(NULL) - RET_motionStartTime);
pathfindr 7:e9a19750700d 188 if (inMotionForSeconds >= RET_motionStartThreshold_seconds) {
pathfindr 7:e9a19750700d 189 RET_motionState = true;
pathfindr 7:e9a19750700d 190 LED1blink(10,100);
pathfindr 7:e9a19750700d 191 }
pathfindr 7:e9a19750700d 192 }
pathfindr 7:e9a19750700d 193 if (RET_motionPendingOffState) {
pathfindr 7:e9a19750700d 194 time_t noMotionForSeconds = (time(NULL) - RET_motionStopTime);
pathfindr 7:e9a19750700d 195 if (noMotionForSeconds >= RET_motionStartThreshold_seconds) {
pathfindr 7:e9a19750700d 196 RET_motionState = false;
pathfindr 7:e9a19750700d 197 LED1blink(5,500);
pathfindr 7:e9a19750700d 198 }
pathfindr 6:388d3c7efdd9 199 }
pathfindr 6:388d3c7efdd9 200
pathfindr 6:388d3c7efdd9 201 break;
pathfindr 6:388d3c7efdd9 202
pathfindr 6:388d3c7efdd9 203 case MODE_DORMANT :
pathfindr 7:e9a19750700d 204 //LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK);
pathfindr 6:388d3c7efdd9 205 break;
pathfindr 6:388d3c7efdd9 206
pathfindr 6:388d3c7efdd9 207 case MODE_OFF_48HRS :
pathfindr 6:388d3c7efdd9 208
pathfindr 6:388d3c7efdd9 209 break;
pathfindr 6:388d3c7efdd9 210
pathfindr 6:388d3c7efdd9 211 default :
pathfindr 6:388d3c7efdd9 212 RET_mode = MODE_SETUP;
pathfindr 6:388d3c7efdd9 213 }
pathfindr 6:388d3c7efdd9 214 }
pathfindr 6:388d3c7efdd9 215
pathfindr 6:388d3c7efdd9 216
pathfindr 7:e9a19750700d 217 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 218 // MAIN
pathfindr 7:e9a19750700d 219 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 220
pathfindr 0:94b743e06998 221 int main() {
pathfindr 4:8d8e9bfa82e4 222
pathfindr 4:8d8e9bfa82e4 223 //CHECK IF THIS IS RESET
pathfindr 4:8d8e9bfa82e4 224 //0x00000004 == soft reset //0x00000002 == watchdog //0x00000001 == button/hardreset
pathfindr 4:8d8e9bfa82e4 225 if (NRF_POWER->RESETREAS != 0xffffffff) {
pathfindr 4:8d8e9bfa82e4 226 switch(NRF_POWER->RESETREAS) {
pathfindr 4:8d8e9bfa82e4 227 case 0x00000001 :
pathfindr 4:8d8e9bfa82e4 228 DEBUG("reset_reason: 0x%08x. - Hard Reset\n",NRF_POWER->RESETREAS);
pathfindr 7:e9a19750700d 229 factoryReset();
pathfindr 4:8d8e9bfa82e4 230 break;
pathfindr 4:8d8e9bfa82e4 231 case 0x00000002 :
pathfindr 4:8d8e9bfa82e4 232 DEBUG("reset_reason: 0x%08x. - Watchdog\n",NRF_POWER->RESETREAS);
pathfindr 6:388d3c7efdd9 233 set_time(RET_unixtime_backup);
pathfindr 4:8d8e9bfa82e4 234 break;
pathfindr 4:8d8e9bfa82e4 235 case 0x00000004 :
pathfindr 4:8d8e9bfa82e4 236 DEBUG("reset_reason: 0x%08x. - Soft reset\n",NRF_POWER->RESETREAS);
pathfindr 6:388d3c7efdd9 237 set_time(RET_unixtime_backup);
pathfindr 4:8d8e9bfa82e4 238 break;
pathfindr 4:8d8e9bfa82e4 239 }
pathfindr 4:8d8e9bfa82e4 240 NRF_POWER->RESETREAS = 0xffffffff;
pathfindr 4:8d8e9bfa82e4 241 }
pathfindr 7:e9a19750700d 242
pathfindr 0:94b743e06998 243 while(true) {
pathfindr 7:e9a19750700d 244 turnOffEverything();
pathfindr 4:8d8e9bfa82e4 245 watchdog.kick();
pathfindr 7:e9a19750700d 246 firstBoot = false; //temp
pathfindr 7:e9a19750700d 247 if (!firstBoot) gotoSleep(10000);
pathfindr 7:e9a19750700d 248
pathfindr 7:e9a19750700d 249 //INIT
pathfindr 7:e9a19750700d 250 Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN);
pathfindr 4:8d8e9bfa82e4 251
pathfindr 4:8d8e9bfa82e4 252 //MAIN STATE ENGINE
pathfindr 7:e9a19750700d 253 //LED1blink(1,100);
pathfindr 4:8d8e9bfa82e4 254 mainStateEngine();
pathfindr 7:e9a19750700d 255
pathfindr 7:e9a19750700d 256 //Configure for sleep
pathfindr 7:e9a19750700d 257 lis3dh_configureForSleep(10);
pathfindr 0:94b743e06998 258 }
pathfindr 7:e9a19750700d 259 }