init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Committer:
pathfindr
Date:
Thu Feb 13 00:57:06 2020 +0000
Revision:
57:066dfbe8b4b9
Parent:
56:efd9f5613549
Child:
58:8d4a354816b1
init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pathfindr 54:2840f2d50734 1 #include "main.h"
pathfindr 51:9078e6928412 2 // MUST USE MBED 5.10.4 2fd0c5cfbd
pathfindr 51:9078e6928412 3
pathfindr 51:9078e6928412 4 /*
pathfindr 51:9078e6928412 5 PRE DEPLOYMENT CHECKS!!
pathfindr 51:9078e6928412 6 • Ensure APP DATA address is correct
pathfindr 51:9078e6928412 7 */
pathfindr 51:9078e6928412 8
pathfindr 21:e0b866630c27 9 //------------------------------------------------------------------------------
pathfindr 37:505ef618f06c 10 //FUNCTION PROTOTYPES - NEED TO ADD ALL OF THE MISSING ONES
pathfindr 0:94b743e06998 11 //------------------------------------------------------------------------------
pathfindr 45:6c7f5b556d74 12 //should really add these - will just add as and when needed for now
pathfindr 57:066dfbe8b4b9 13 void bleShutdown();
pathfindr 0:94b743e06998 14
pathfindr 0:94b743e06998 15 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 16 // VARS
pathfindr 51:9078e6928412 17 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 18 char RET_pf_identifier[6];
pathfindr 57:066dfbe8b4b9 19 time_t RET_RTCunixtime = 0;
pathfindr 57:066dfbe8b4b9 20 bool RET_debug = true;
pathfindr 57:066dfbe8b4b9 21 time_t RET_debug_offat = 0;
pathfindr 52:bd7678eade77 22 char GLOBAL_debug_buffer[DEBUG_BUFFERSIZE];
pathfindr 34:4493c9f6d707 23
pathfindr 57:066dfbe8b4b9 24 //SENSORS
pathfindr 57:066dfbe8b4b9 25 float RET_voltage = 0.0;
pathfindr 57:066dfbe8b4b9 26 float RET_temperature = 0.0;
pathfindr 57:066dfbe8b4b9 27 float RET_humidity = 0.0;
pathfindr 57:066dfbe8b4b9 28 bool RET_motionState = false;
pathfindr 57:066dfbe8b4b9 29 bool RET_impactState = false;
pathfindr 57:066dfbe8b4b9 30
pathfindr 13:29f67f256709 31 //STATE
pathfindr 52:bd7678eade77 32 bool RET_busy = false;
pathfindr 52:bd7678eade77 33 uint8_t RET_state = STATE_SETUP;
pathfindr 52:bd7678eade77 34 uint8_t RET_state_prev = RET_state;
pathfindr 57:066dfbe8b4b9 35 bool RET_asleep = false;
pathfindr 57:066dfbe8b4b9 36 bool RET_coldBoot = true;
pathfindr 57:066dfbe8b4b9 37
pathfindr 57:066dfbe8b4b9 38 //BUTTON
pathfindr 57:066dfbe8b4b9 39 bool RET_buttonPressed = false;
pathfindr 52:bd7678eade77 40 uint8_t RET_buttonPressCount = 0;
pathfindr 52:bd7678eade77 41 time_t RET_buttonPressTime = 0;
pathfindr 52:bd7678eade77 42 time_t RET_buttonReleaseTime = 0;
pathfindr 52:bd7678eade77 43 time_t RET_buttonReleaseTime_prev = 0;
pathfindr 52:bd7678eade77 44 time_t RET_buttonHoldTime = 0;
pathfindr 57:066dfbe8b4b9 45
pathfindr 57:066dfbe8b4b9 46 //EVENTS
pathfindr 57:066dfbe8b4b9 47 bool RET_haveEventsToRun = false;
pathfindr 57:066dfbe8b4b9 48
pathfindr 57:066dfbe8b4b9 49 bool EVENT_buttonPress = false;
pathfindr 57:066dfbe8b4b9 50
pathfindr 57:066dfbe8b4b9 51 bool EVENT_battery = false;
pathfindr 57:066dfbe8b4b9 52 time_t EVENT_battery_interval = DEFAULT_INTERVAL_BATTERY;
pathfindr 57:066dfbe8b4b9 53 time_t EVENT_battery_time = 0;
pathfindr 57:066dfbe8b4b9 54
pathfindr 57:066dfbe8b4b9 55 bool EVENT_motionClear = false;
pathfindr 57:066dfbe8b4b9 56 time_t EVENT_motionClear_interval = DEFAULT_INTERVAL_MOTIONCLEAR;
pathfindr 57:066dfbe8b4b9 57 time_t EVENT_motionClear_time = 0;
pathfindr 57:066dfbe8b4b9 58
pathfindr 57:066dfbe8b4b9 59 bool EVENT_buttonClear = false;
pathfindr 57:066dfbe8b4b9 60 time_t EVENT_buttonClear_interval = DEFAULT_INTERVAL_BUTTONCLEAR;
pathfindr 57:066dfbe8b4b9 61 time_t EVENT_buttonClear_time = 0;
pathfindr 57:066dfbe8b4b9 62
pathfindr 57:066dfbe8b4b9 63 bool EVENT_temperature = false;
pathfindr 57:066dfbe8b4b9 64 time_t EVENT_temperature_interval = DEFAULT_INTERVAL_TEMPERATURE;
pathfindr 57:066dfbe8b4b9 65 time_t EVENT_temperature_time = 0;
pathfindr 57:066dfbe8b4b9 66
pathfindr 57:066dfbe8b4b9 67 bool EVENT_humidity = false;
pathfindr 57:066dfbe8b4b9 68 time_t EVENT_humidity_interval = DEFAULT_INTERVAL_HUMIDITY;
pathfindr 57:066dfbe8b4b9 69 time_t EVENT_humidity_time = 0;
pathfindr 57:066dfbe8b4b9 70
pathfindr 57:066dfbe8b4b9 71 bool EVENT_settingsScan = false;
pathfindr 57:066dfbe8b4b9 72 time_t EVENT_settingsScan_interval = DEFAULT_INTERVAL_SETTINGSSCAN;
pathfindr 57:066dfbe8b4b9 73 time_t EVENT_settingsScan_time = 0;
pathfindr 57:066dfbe8b4b9 74
pathfindr 57:066dfbe8b4b9 75 bool EVENT_uwbScan = false;
pathfindr 57:066dfbe8b4b9 76 time_t EVENT_uwbScan_interval = 60;
pathfindr 57:066dfbe8b4b9 77 time_t EVENT_uwbScan_time = 0;
pathfindr 57:066dfbe8b4b9 78
pathfindr 52:bd7678eade77 79 //BLE
pathfindr 57:066dfbe8b4b9 80 uint16_t RET_setting_beacon_interval_ms = DEFAULT_BEACON_INTERVAL_MS;
pathfindr 57:066dfbe8b4b9 81 uint16_t RET_setting_beacon_interval_ms_active = DEFAULT_BEACON_INTERVAL_MS;
pathfindr 54:2840f2d50734 82 bool RET_bleBroadcasting = false;
pathfindr 54:2840f2d50734 83 uint8_t RET_bleAdv_flags = 0;
pathfindr 57:066dfbe8b4b9 84 bool RET_UWBdetector_present = true; //BEN should be false
pathfindr 57:066dfbe8b4b9 85 bool RET_BLEpacketUpdate = false;
pathfindr 57:066dfbe8b4b9 86 bool RET_settingsReceived = false;
pathfindr 57:066dfbe8b4b9 87 const uint8_t bleAdv_motion_flag = 0x01; //motion detected
pathfindr 57:066dfbe8b4b9 88 const uint8_t bleAdv_impact_flag = 0x02; //impact detected
pathfindr 57:066dfbe8b4b9 89 const uint8_t bleAdv_button_pressed_flag = 0x08; //button press detected
pathfindr 57:066dfbe8b4b9 90 const uint8_t bleAdv_gap_connected_flag = 0x40; //device is connected
pathfindr 54:2840f2d50734 91 #pragma pack(1)
pathfindr 54:2840f2d50734 92 struct bleData_t {
pathfindr 54:2840f2d50734 93 uint16_t applicationSpecificId;
pathfindr 54:2840f2d50734 94 uint8_t firmware;
pathfindr 54:2840f2d50734 95 uint8_t flags;
pathfindr 54:2840f2d50734 96 uint16_t voltage;
pathfindr 54:2840f2d50734 97 uint8_t buttonpresses;
pathfindr 54:2840f2d50734 98 int16_t temperature;
pathfindr 54:2840f2d50734 99 uint8_t humidity;
pathfindr 54:2840f2d50734 100 uint8_t lux;
pathfindr 54:2840f2d50734 101 int8_t accel_x;
pathfindr 54:2840f2d50734 102 int8_t accel_y;
pathfindr 54:2840f2d50734 103 int8_t accel_z;
pathfindr 54:2840f2d50734 104 };
pathfindr 54:2840f2d50734 105 #pragma pack()
pathfindr 57:066dfbe8b4b9 106
pathfindr 0:94b743e06998 107 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 108 //GPIO
pathfindr 9:b0a1535b8ef2 109 //------------------------------------------------------------------------------
pathfindr 34:4493c9f6d707 110 InterruptIn button(PN_IN_BUTTON);
pathfindr 9:b0a1535b8ef2 111
pathfindr 9:b0a1535b8ef2 112 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 113 //PERIPHERALS
pathfindr 0:94b743e06998 114 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 115 BLE myble;
pathfindr 52:bd7678eade77 116 WatchdogTimer watchdog;
pathfindr 37:505ef618f06c 117 LowPowerTicker RTCticker;
pathfindr 51:9078e6928412 118 LowPowerTimer LPtimer;
pathfindr 9:b0a1535b8ef2 119
pathfindr 9:b0a1535b8ef2 120 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 121 //SEMAPHORES
pathfindr 9:b0a1535b8ef2 122 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 123 Semaphore mainthread;
pathfindr 9:b0a1535b8ef2 124
pathfindr 9:b0a1535b8ef2 125 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 126 // LOW LEVEL FUNCS
pathfindr 34:4493c9f6d707 127 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 128 void watchdogKick() {
pathfindr 52:bd7678eade77 129 watchdog.kick();
pathfindr 52:bd7678eade77 130 }
pathfindr 51:9078e6928412 131 void set_8bit_flag(uint8_t& flags, uint8_t flag) {
pathfindr 51:9078e6928412 132 flags |= flag;
pathfindr 51:9078e6928412 133 }
pathfindr 51:9078e6928412 134 bool get_8bit_flag(uint8_t& flags, uint8_t flag) {
pathfindr 51:9078e6928412 135 bool result = (flags & flag);
pathfindr 51:9078e6928412 136 return result;
pathfindr 51:9078e6928412 137 }
pathfindr 51:9078e6928412 138 void clr_8bit_flag(uint8_t& flags, uint8_t flag) {
pathfindr 51:9078e6928412 139 flags &= ~flag;
pathfindr 51:9078e6928412 140 }
pathfindr 50:a94e70c00fff 141 void nrf_configureForSleep(){
pathfindr 50:a94e70c00fff 142 //Disable SPI pins to reduce power
pathfindr 50:a94e70c00fff 143 //nrf_gpio_cfg_input(PN_SPI_MOSI, NRF_GPIO_PIN_NOPULL); //Don't need this one
pathfindr 34:4493c9f6d707 144 nrf_gpio_cfg_input(PN_SPI_MISO, NRF_GPIO_PIN_NOPULL);
pathfindr 50:a94e70c00fff 145
pathfindr 50:a94e70c00fff 146 //TWI0
pathfindr 52:bd7678eade77 147 NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
pathfindr 50:a94e70c00fff 148 *(volatile uint32_t *)0x40003FFC = 0;
pathfindr 50:a94e70c00fff 149 *(volatile uint32_t *)0x40003FFC;
pathfindr 50:a94e70c00fff 150 *(volatile uint32_t *)0x40003FFC = 1;
pathfindr 50:a94e70c00fff 151 //TWI1
pathfindr 52:bd7678eade77 152 NRF_TWI1->ENABLE=TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
pathfindr 50:a94e70c00fff 153 *(volatile uint32_t *)0x40004FFC = 0;
pathfindr 50:a94e70c00fff 154 *(volatile uint32_t *)0x40004FFC;
pathfindr 50:a94e70c00fff 155 *(volatile uint32_t *)0x40004FFC = 1;
pathfindr 6:388d3c7efdd9 156 }
pathfindr 57:066dfbe8b4b9 157
pathfindr 45:6c7f5b556d74 158 void recordFirmwareAsValid() {
pathfindr 57:066dfbe8b4b9 159 bleShutdown();
pathfindr 45:6c7f5b556d74 160 read_app_data_from_flash(&app_data);
pathfindr 45:6c7f5b556d74 161 bool write_app_data_to_flash_execute = false;
pathfindr 45:6c7f5b556d74 162 if(get_flag(&app_data, app_execution_flag) == true) {
pathfindr 45:6c7f5b556d74 163 clr_flag(&app_data, app_execution_flag);
pathfindr 45:6c7f5b556d74 164 clr_flag(&app_data, first_run_flag);
pathfindr 45:6c7f5b556d74 165 write_app_data_to_flash_execute = true;
pathfindr 45:6c7f5b556d74 166 }
pathfindr 45:6c7f5b556d74 167 if(app_data.current_firmware_version != FW_VERSION) {
pathfindr 45:6c7f5b556d74 168 app_data.current_firmware_version = FW_VERSION;
pathfindr 45:6c7f5b556d74 169 app_data.target_firmware_version = FW_VERSION;
pathfindr 45:6c7f5b556d74 170 write_app_data_to_flash_execute = true;
pathfindr 45:6c7f5b556d74 171 }
pathfindr 45:6c7f5b556d74 172 if (write_app_data_to_flash_execute) {
pathfindr 45:6c7f5b556d74 173 write_app_data_to_flash(&app_data);
pathfindr 51:9078e6928412 174 //read back to check
pathfindr 51:9078e6928412 175 ThisThread::sleep_for(200); //need this delay
pathfindr 51:9078e6928412 176 read_app_data_from_flash(&app_data);
pathfindr 51:9078e6928412 177 if (app_data.current_firmware_version == FW_VERSION) {
pathfindr 51:9078e6928412 178 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "OK");debug_exe();
pathfindr 51:9078e6928412 179 } else {
pathfindr 51:9078e6928412 180 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "FAIL - IS BLE SHUTDOWN?");debug_exe();
pathfindr 51:9078e6928412 181 }
pathfindr 51:9078e6928412 182 }
pathfindr 45:6c7f5b556d74 183 }
pathfindr 51:9078e6928412 184 void updateBatteryV() {
pathfindr 19:22261767c87a 185 NRF52_SAADC batteryIn;
pathfindr 19:22261767c87a 186 batteryIn.addChannel(9); // vdd for battery
pathfindr 19:22261767c87a 187 batteryIn.calibrate();
pathfindr 49:15ddd84ec9fa 188 //get initial reading, first reading is always low
pathfindr 49:15ddd84ec9fa 189 batteryIn.updateData(); batteryIn.getData()[0];
pathfindr 49:15ddd84ec9fa 190 float voltage_accumulator = 0.0;
pathfindr 49:15ddd84ec9fa 191 uint8_t readings = 0;
pathfindr 49:15ddd84ec9fa 192 for (uint8_t i = 1; i <= 50; i++) { // need to get it 2 times to get accurate data, first one is always low for some reason
pathfindr 19:22261767c87a 193 batteryIn.updateData();
pathfindr 49:15ddd84ec9fa 194 voltage_accumulator += (batteryIn.getData()[0])*(1.0/1024.0)*3.60;
pathfindr 49:15ddd84ec9fa 195 readings ++;
pathfindr 19:22261767c87a 196 }
pathfindr 51:9078e6928412 197 RET_voltage = (voltage_accumulator / (float)readings);
pathfindr 22:810425eb76e1 198 }
pathfindr 57:066dfbe8b4b9 199
pathfindr 57:066dfbe8b4b9 200
pathfindr 57:066dfbe8b4b9 201
pathfindr 19:22261767c87a 202 //------------------------------------------------------------------------------
pathfindr 19:22261767c87a 203 // USER BUTTON HANDLING
pathfindr 19:22261767c87a 204 //------------------------------------------------------------------------------
pathfindr 19:22261767c87a 205 void buttonPress() {
pathfindr 51:9078e6928412 206 RET_buttonPressTime = LPtimer.read_ms();
pathfindr 19:22261767c87a 207 }
pathfindr 19:22261767c87a 208 void buttonRelease() {
pathfindr 51:9078e6928412 209 //debounce catch
pathfindr 51:9078e6928412 210 RET_buttonReleaseTime = LPtimer.read_ms();
pathfindr 57:066dfbe8b4b9 211 if ((RET_buttonReleaseTime - RET_buttonReleaseTime_prev) > 100) {
pathfindr 51:9078e6928412 212 RET_buttonPressCount ++;
pathfindr 51:9078e6928412 213 RET_buttonHoldTime = (RET_buttonReleaseTime - RET_buttonPressTime);
pathfindr 57:066dfbe8b4b9 214 //temporarily enable debugging
pathfindr 51:9078e6928412 215 RET_debug = true;
pathfindr 52:bd7678eade77 216 RET_debug_offat = (RET_RTCunixtime + 3600); //debug on for 1hr
pathfindr 57:066dfbe8b4b9 217 EVENT_buttonPress = true;
pathfindr 57:066dfbe8b4b9 218 mainthread.release();
pathfindr 51:9078e6928412 219 }
pathfindr 51:9078e6928412 220 RET_buttonReleaseTime_prev = RET_buttonReleaseTime;
pathfindr 19:22261767c87a 221 }
pathfindr 57:066dfbe8b4b9 222
pathfindr 57:066dfbe8b4b9 223
pathfindr 57:066dfbe8b4b9 224
pathfindr 19:22261767c87a 225 //------------------------------------------------------------------------------
pathfindr 19:22261767c87a 226 // RTC TICKER
pathfindr 51:9078e6928412 227 //------------------------------------------------------------------------------
pathfindr 54:2840f2d50734 228 bool RET_flash_busy = false;
pathfindr 9:b0a1535b8ef2 229 void RTCtick() {
pathfindr 51:9078e6928412 230 //YOU MUST NOT CALL ANY OTHER FUNCTIONS OR DEBUG FROM INSIDE HERE!!! OR IT LOCKS UP THE DEVICE, just change vars & comparisons etc
pathfindr 19:22261767c87a 231 RET_RTCunixtime += 1;
pathfindr 51:9078e6928412 232
pathfindr 57:066dfbe8b4b9 233 //CHECK FOR EVENTS
pathfindr 57:066dfbe8b4b9 234 if (RET_haveEventsToRun == false) {
pathfindr 57:066dfbe8b4b9 235 if (EVENT_motionClear_time > 0 && RET_RTCunixtime >= EVENT_motionClear_time) {
pathfindr 57:066dfbe8b4b9 236 RET_haveEventsToRun = true; EVENT_motionClear = true;
pathfindr 57:066dfbe8b4b9 237 }
pathfindr 57:066dfbe8b4b9 238 if (EVENT_buttonClear_time > 0 && RET_RTCunixtime >= EVENT_buttonClear_time) {
pathfindr 57:066dfbe8b4b9 239 RET_haveEventsToRun = true; EVENT_buttonClear = true;
pathfindr 57:066dfbe8b4b9 240 }
pathfindr 57:066dfbe8b4b9 241 if (EVENT_battery_time > 0 && RET_RTCunixtime >= EVENT_battery_time) {
pathfindr 57:066dfbe8b4b9 242 RET_haveEventsToRun = true; EVENT_battery = true;
pathfindr 51:9078e6928412 243 }
pathfindr 57:066dfbe8b4b9 244 if (EVENT_temperature_time > 0 && RET_RTCunixtime >= EVENT_temperature_time) {
pathfindr 57:066dfbe8b4b9 245 RET_haveEventsToRun = true; EVENT_temperature = true;
pathfindr 57:066dfbe8b4b9 246 }
pathfindr 57:066dfbe8b4b9 247 if (EVENT_humidity_time > 0 && RET_RTCunixtime >= EVENT_humidity_time) {
pathfindr 57:066dfbe8b4b9 248 RET_haveEventsToRun = true; EVENT_humidity = true;
pathfindr 57:066dfbe8b4b9 249 }
pathfindr 57:066dfbe8b4b9 250 if (EVENT_settingsScan_time > 0 && RET_RTCunixtime >= EVENT_settingsScan_time) {
pathfindr 57:066dfbe8b4b9 251 RET_haveEventsToRun = true; EVENT_settingsScan = true;
pathfindr 57:066dfbe8b4b9 252 }
pathfindr 57:066dfbe8b4b9 253 if (EVENT_uwbScan_time > 0 && RET_RTCunixtime >= EVENT_uwbScan_time) {
pathfindr 57:066dfbe8b4b9 254 RET_haveEventsToRun = true; EVENT_uwbScan = true;
pathfindr 9:b0a1535b8ef2 255 }
pathfindr 49:15ddd84ec9fa 256 }
pathfindr 52:bd7678eade77 257
pathfindr 57:066dfbe8b4b9 258 if (RET_haveEventsToRun) {
pathfindr 57:066dfbe8b4b9 259 mainthread.release();
pathfindr 41:07e41dbd5304 260 }
pathfindr 38:476a9b5629a1 261 }
pathfindr 24:c161db07557f 262
pathfindr 57:066dfbe8b4b9 263
pathfindr 52:bd7678eade77 264 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 265 // BLE FUNCS
pathfindr 52:bd7678eade77 266 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 267 void bleBuildData(bleData_t &bleData)
pathfindr 52:bd7678eade77 268 {
pathfindr 57:066dfbe8b4b9 269 bleData.applicationSpecificId = BLE_SERVICEID_UWBBEACON;
pathfindr 52:bd7678eade77 270 bleData.firmware = FW_VERSION;
pathfindr 52:bd7678eade77 271 //set flags
pathfindr 57:066dfbe8b4b9 272 if (RET_motionState) {
pathfindr 57:066dfbe8b4b9 273 set_8bit_flag(RET_bleAdv_flags, bleAdv_motion_flag);
pathfindr 52:bd7678eade77 274 } else {
pathfindr 57:066dfbe8b4b9 275 clr_8bit_flag(RET_bleAdv_flags, bleAdv_motion_flag);
pathfindr 57:066dfbe8b4b9 276 }
pathfindr 57:066dfbe8b4b9 277
pathfindr 57:066dfbe8b4b9 278 if (RET_impactState) {
pathfindr 57:066dfbe8b4b9 279 set_8bit_flag(RET_bleAdv_flags, bleAdv_impact_flag);
pathfindr 57:066dfbe8b4b9 280 } else {
pathfindr 57:066dfbe8b4b9 281 clr_8bit_flag(RET_bleAdv_flags, bleAdv_impact_flag);
pathfindr 52:bd7678eade77 282 }
pathfindr 57:066dfbe8b4b9 283
pathfindr 57:066dfbe8b4b9 284 if(RET_buttonPressed) {
pathfindr 57:066dfbe8b4b9 285 set_8bit_flag(RET_bleAdv_flags, bleAdv_button_pressed_flag);
pathfindr 52:bd7678eade77 286 } else {
pathfindr 57:066dfbe8b4b9 287 clr_8bit_flag(RET_bleAdv_flags, bleAdv_button_pressed_flag);
pathfindr 52:bd7678eade77 288 }
pathfindr 57:066dfbe8b4b9 289
pathfindr 52:bd7678eade77 290 bleData.flags = RET_bleAdv_flags;
pathfindr 57:066dfbe8b4b9 291 bleData.voltage = RET_voltage;
pathfindr 57:066dfbe8b4b9 292 bleData.buttonpresses = RET_buttonPressCount;
pathfindr 57:066dfbe8b4b9 293 bleData.temperature = RET_temperature;
pathfindr 52:bd7678eade77 294 bleData.humidity = 0xFF;
pathfindr 52:bd7678eade77 295 bleData.lux = 0xFF;
pathfindr 52:bd7678eade77 296 bleData.accel_x = 0xFF;
pathfindr 52:bd7678eade77 297 bleData.accel_y = 0xFF;
pathfindr 52:bd7678eade77 298 bleData.accel_z = 0xFF;
pathfindr 52:bd7678eade77 299 }
pathfindr 57:066dfbe8b4b9 300 void bleUpdateAndAdvertise(void)
pathfindr 52:bd7678eade77 301 {
pathfindr 52:bd7678eade77 302 bleData_t bleData;
pathfindr 52:bd7678eade77 303 bleBuildData(bleData);
pathfindr 52:bd7678eade77 304 myble.gap().stopAdvertising();
pathfindr 52:bd7678eade77 305 myble.gap().setTxPower(DEFAULT_BEACON_POWER); // set tx power,valid values are -40, -20, -16, -12, -8, -4, 0, 4
pathfindr 52:bd7678eade77 306 myble.gap().accumulateAdvertisingPayloadTxPower(DEFAULT_BEACON_POWER); // (accepted values are -40, -30, -20, -16, -12, -8, -4, 0, and 4 dBm)
pathfindr 57:066dfbe8b4b9 307 myble.gap().setAdvertisingInterval(RET_setting_beacon_interval_ms_active);
pathfindr 52:bd7678eade77 308 myble.gap().updateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 52:bd7678eade77 309 //myble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 52:bd7678eade77 310 myble.gap().startAdvertising();
pathfindr 52:bd7678eade77 311 RET_bleBroadcasting = true;
pathfindr 57:066dfbe8b4b9 312 RET_BLEpacketUpdate = false;
pathfindr 52:bd7678eade77 313 }
pathfindr 52:bd7678eade77 314 void bleSetupAdvertising(BLE::InitializationCompleteCallbackContext *params)
pathfindr 52:bd7678eade77 315 {
pathfindr 52:bd7678eade77 316 if (RET_pf_identifier[0] != 0x00 && RET_pf_identifier[1] != 0x00 && RET_pf_identifier[2] != 0x00) {
pathfindr 52:bd7678eade77 317 bleData_t bleData;
pathfindr 52:bd7678eade77 318 bleBuildData(bleData);
pathfindr 52:bd7678eade77 319 char localname[6];
pathfindr 52:bd7678eade77 320 memcpy(localname,RET_pf_identifier,6);
pathfindr 52:bd7678eade77 321 myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE );
pathfindr 52:bd7678eade77 322 myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)localname, sizeof(localname));
pathfindr 52:bd7678eade77 323 myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 57:066dfbe8b4b9 324 ////myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 52:bd7678eade77 325 myble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
pathfindr 52:bd7678eade77 326 }
pathfindr 52:bd7678eade77 327 }
pathfindr 52:bd7678eade77 328 void bleStopAdvertising(void)
pathfindr 52:bd7678eade77 329 {
pathfindr 52:bd7678eade77 330 myble.gap().stopAdvertising();
pathfindr 52:bd7678eade77 331 RET_bleBroadcasting = false;
pathfindr 52:bd7678eade77 332 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Adv Stop");debug_exe();}
pathfindr 52:bd7678eade77 333 }
pathfindr 52:bd7678eade77 334 void bleAdvertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
pathfindr 52:bd7678eade77 335 struct AdvertisingData_t {
pathfindr 52:bd7678eade77 336 uint8_t length;
pathfindr 52:bd7678eade77 337 GapAdvertisingData::DataType_t dataType;
pathfindr 52:bd7678eade77 338 uint8_t data[0];
pathfindr 52:bd7678eade77 339 } PACKED;
pathfindr 52:bd7678eade77 340 struct bleData_t {
pathfindr 52:bd7678eade77 341 uint16_t applicationSpecificId;
pathfindr 52:bd7678eade77 342 } PACKED;
pathfindr 52:bd7678eade77 343
pathfindr 52:bd7678eade77 344 //Search for the manufacturer specific data with matching application-ID
pathfindr 52:bd7678eade77 345 AdvertisingData_t *pAdvData;
pathfindr 52:bd7678eade77 346 for (size_t index = 0; index < params->advertisingDataLen; index += (pAdvData->length + 1)) {
pathfindr 52:bd7678eade77 347 pAdvData = (AdvertisingData_t *)&params->advertisingData[index];
pathfindr 52:bd7678eade77 348 const bleData_t *pbleData = (const bleData_t *)pAdvData->data;
pathfindr 52:bd7678eade77 349
pathfindr 52:bd7678eade77 350 //BLE TYPE SWITCH
pathfindr 52:bd7678eade77 351 switch(pbleData->applicationSpecificId) {
pathfindr 57:066dfbe8b4b9 352 case BLE_SERVICEID_PFDETECTOR2 :
pathfindr 52:bd7678eade77 353 {
pathfindr 52:bd7678eade77 354 char ble_advdata[100];
pathfindr 52:bd7678eade77 355 snprintf(ble_advdata, sizeof(ble_advdata), "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
pathfindr 52:bd7678eade77 356 params->advertisingData[0],
pathfindr 52:bd7678eade77 357 params->advertisingData[1],
pathfindr 52:bd7678eade77 358 params->advertisingData[2],
pathfindr 52:bd7678eade77 359 params->advertisingData[3],
pathfindr 52:bd7678eade77 360 params->advertisingData[4],
pathfindr 52:bd7678eade77 361 params->advertisingData[5],
pathfindr 52:bd7678eade77 362 params->advertisingData[6],
pathfindr 52:bd7678eade77 363 params->advertisingData[7],
pathfindr 52:bd7678eade77 364 params->advertisingData[8],
pathfindr 52:bd7678eade77 365 params->advertisingData[9],
pathfindr 52:bd7678eade77 366 params->advertisingData[10],
pathfindr 52:bd7678eade77 367 params->advertisingData[11],
pathfindr 52:bd7678eade77 368 params->advertisingData[12],
pathfindr 52:bd7678eade77 369 params->advertisingData[13],
pathfindr 52:bd7678eade77 370 params->advertisingData[14],
pathfindr 52:bd7678eade77 371 params->advertisingData[15],
pathfindr 52:bd7678eade77 372 params->advertisingData[16],
pathfindr 52:bd7678eade77 373 params->advertisingData[17],
pathfindr 52:bd7678eade77 374 params->advertisingData[18],
pathfindr 52:bd7678eade77 375 params->advertisingData[19],
pathfindr 52:bd7678eade77 376 params->advertisingData[20]);
pathfindr 52:bd7678eade77 377 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), " Mac: [%02x%02x%02x%02x%02x%02x], rssi: %d, AType: %u, Id: %s",params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],params->rssi, pAdvData->dataType, ble_advdata);debug_exe();}
pathfindr 54:2840f2d50734 378 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Detector @rssi: %d",params->rssi);debug_exe();}
pathfindr 52:bd7678eade77 379 if (params->rssi >= -75) {
pathfindr 57:066dfbe8b4b9 380
pathfindr 52:bd7678eade77 381 }
pathfindr 57:066dfbe8b4b9 382 RET_settingsReceived = true;
pathfindr 52:bd7678eade77 383 break;
pathfindr 52:bd7678eade77 384 }
pathfindr 52:bd7678eade77 385 }
pathfindr 52:bd7678eade77 386 }
pathfindr 52:bd7678eade77 387 }
pathfindr 52:bd7678eade77 388 void bleConfigureScan(void)
pathfindr 52:bd7678eade77 389 {
pathfindr 54:2840f2d50734 390 myble.gap().setScanParams(200,200); //scan interval //scan window
pathfindr 52:bd7678eade77 391 myble.gap().startScan(bleAdvertisementCallback);
pathfindr 52:bd7678eade77 392 }
pathfindr 52:bd7678eade77 393 void bleStopScan(void)
pathfindr 52:bd7678eade77 394 {
pathfindr 52:bd7678eade77 395 myble.gap().stopScan();
pathfindr 52:bd7678eade77 396 }
pathfindr 52:bd7678eade77 397 void bleShutdown(void)
pathfindr 52:bd7678eade77 398 {
pathfindr 52:bd7678eade77 399 bleStopScan();
pathfindr 52:bd7678eade77 400 bleStopAdvertising();
pathfindr 52:bd7678eade77 401 myble.shutdown();
pathfindr 52:bd7678eade77 402 }
pathfindr 8:7351f8c4cd60 403
pathfindr 14:9a54b1b65bc8 404 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 405 // FIRST RUN
pathfindr 14:9a54b1b65bc8 406 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 407 void firstRun() {
pathfindr 57:066dfbe8b4b9 408 //Set Serial Number
pathfindr 57:066dfbe8b4b9 409 RET_pf_identifier[0] = 'U';
pathfindr 57:066dfbe8b4b9 410 RET_pf_identifier[1] = 'W';
pathfindr 57:066dfbe8b4b9 411 RET_pf_identifier[2] = 'B';
pathfindr 57:066dfbe8b4b9 412 RET_pf_identifier[3] = '0';
pathfindr 57:066dfbe8b4b9 413 RET_pf_identifier[4] = '1';
pathfindr 57:066dfbe8b4b9 414 RET_pf_identifier[5] = 0x00;
pathfindr 51:9078e6928412 415
pathfindr 57:066dfbe8b4b9 416 //GET INITITAL SENSORS
pathfindr 57:066dfbe8b4b9 417 updateBatteryV();
pathfindr 57:066dfbe8b4b9 418 //updateTemperature
pathfindr 57:066dfbe8b4b9 419 //updateHumidity
pathfindr 45:6c7f5b556d74 420
pathfindr 57:066dfbe8b4b9 421 //SET EVENT TIMES
pathfindr 57:066dfbe8b4b9 422 EVENT_battery_time = (RET_RTCunixtime + EVENT_battery_interval);
pathfindr 57:066dfbe8b4b9 423 EVENT_temperature_time = (RET_RTCunixtime + EVENT_temperature_interval);
pathfindr 57:066dfbe8b4b9 424 EVENT_humidity_time = (RET_RTCunixtime + EVENT_humidity_interval);
pathfindr 57:066dfbe8b4b9 425 EVENT_settingsScan_time = (RET_RTCunixtime + EVENT_settingsScan_interval);
pathfindr 57:066dfbe8b4b9 426 EVENT_uwbScan_time = (RET_RTCunixtime + EVENT_uwbScan_interval);
pathfindr 40:4270e09e59f2 427 }
pathfindr 40:4270e09e59f2 428
pathfindr 40:4270e09e59f2 429 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 430 // BLE SETTINGS SCAN
pathfindr 13:29f67f256709 431 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 432 void settingsScan() {
pathfindr 49:15ddd84ec9fa 433 LED1on(0);
pathfindr 57:066dfbe8b4b9 434 bleStopAdvertising();
pathfindr 57:066dfbe8b4b9 435 LowPowerTimer bleScan_t;
pathfindr 57:066dfbe8b4b9 436 bleScan_t.start();
pathfindr 57:066dfbe8b4b9 437 RET_settingsReceived = false;
pathfindr 57:066dfbe8b4b9 438 uint32_t bleScan_startmillis = bleScan_t.read_ms(); uint32_t bleScan_runtime = 0;
pathfindr 57:066dfbe8b4b9 439 if (!myble.hasInitialized()) {
pathfindr 57:066dfbe8b4b9 440 myble.init();
pathfindr 57:066dfbe8b4b9 441 while (!myble.hasInitialized() && bleScan_runtime < 1000) {
pathfindr 57:066dfbe8b4b9 442 bleScan_runtime = (bleScan_t.read_ms() - bleScan_startmillis);
pathfindr 39:f767b8037475 443 }
pathfindr 39:f767b8037475 444 }
pathfindr 57:066dfbe8b4b9 445 if (myble.hasInitialized()) {
pathfindr 57:066dfbe8b4b9 446 bleConfigureScan();
pathfindr 57:066dfbe8b4b9 447 bleScan_startmillis = bleScan_t.read_ms();
pathfindr 57:066dfbe8b4b9 448 while (bleScan_runtime < DEFAULT_SETTINGSSCANTIME_MS && RET_settingsReceived == false) {
pathfindr 57:066dfbe8b4b9 449 bleScan_runtime = (bleScan_t.read_ms() - bleScan_startmillis);
pathfindr 57:066dfbe8b4b9 450 myble.waitForEvent(); // low power wait for event
pathfindr 22:810425eb76e1 451 }
pathfindr 20:5404841fdd2b 452 }
pathfindr 57:066dfbe8b4b9 453 bleScan_t.stop();
pathfindr 57:066dfbe8b4b9 454 myble.gap().stopScan();
pathfindr 57:066dfbe8b4b9 455 LED1off();
pathfindr 48:64b1613941d5 456 }
pathfindr 24:c161db07557f 457
pathfindr 7:e9a19750700d 458 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 459 // STATE ENGINE
pathfindr 7:e9a19750700d 460 //------------------------------------------------------------------------------
pathfindr 6:388d3c7efdd9 461 void mainStateEngine() {
pathfindr 57:066dfbe8b4b9 462 if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "MainStateEngine");debug_exe();}
pathfindr 57:066dfbe8b4b9 463
pathfindr 57:066dfbe8b4b9 464 if (EVENT_buttonPress) {
pathfindr 57:066dfbe8b4b9 465 if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_ButtonPress");debug_exe();}
pathfindr 57:066dfbe8b4b9 466 EVENT_buttonClear_time = (RET_RTCunixtime + EVENT_buttonClear_interval);
pathfindr 57:066dfbe8b4b9 467 RET_setting_beacon_interval_ms_active = DEFAULT_BEACON_INTERVAL_FAST_MS;
pathfindr 57:066dfbe8b4b9 468 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 469 EVENT_buttonPress = false;
pathfindr 57:066dfbe8b4b9 470 }
pathfindr 57:066dfbe8b4b9 471
pathfindr 57:066dfbe8b4b9 472 if (EVENT_motionClear) {
pathfindr 57:066dfbe8b4b9 473 if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_MotionClear");debug_exe();}
pathfindr 57:066dfbe8b4b9 474 EVENT_motionClear_time = 0;
pathfindr 57:066dfbe8b4b9 475 RET_motionState = false;
pathfindr 57:066dfbe8b4b9 476 RET_impactState = false;
pathfindr 57:066dfbe8b4b9 477 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 478 EVENT_motionClear = false;
pathfindr 57:066dfbe8b4b9 479 }
pathfindr 57:066dfbe8b4b9 480
pathfindr 57:066dfbe8b4b9 481 if (EVENT_buttonClear) {
pathfindr 57:066dfbe8b4b9 482 if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_ButtonClear");debug_exe();}
pathfindr 57:066dfbe8b4b9 483 EVENT_buttonClear_time = 0;
pathfindr 57:066dfbe8b4b9 484 RET_buttonPressed = false;
pathfindr 57:066dfbe8b4b9 485 RET_buttonPressCount = 0;
pathfindr 57:066dfbe8b4b9 486 RET_setting_beacon_interval_ms_active = RET_setting_beacon_interval_ms; //reset back to normal broadcast rate
pathfindr 57:066dfbe8b4b9 487 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 488 EVENT_buttonClear = false;
pathfindr 57:066dfbe8b4b9 489 }
pathfindr 57:066dfbe8b4b9 490
pathfindr 57:066dfbe8b4b9 491 if (EVENT_battery) {
pathfindr 57:066dfbe8b4b9 492 if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_Battery");debug_exe();}
pathfindr 57:066dfbe8b4b9 493 EVENT_battery_time = (RET_RTCunixtime + EVENT_battery_interval);
pathfindr 57:066dfbe8b4b9 494 updateBatteryV();
pathfindr 57:066dfbe8b4b9 495 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 496 EVENT_battery = false;
pathfindr 57:066dfbe8b4b9 497 }
pathfindr 57:066dfbe8b4b9 498
pathfindr 57:066dfbe8b4b9 499 if (EVENT_temperature) {
pathfindr 57:066dfbe8b4b9 500 if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_Temperature");debug_exe();}
pathfindr 57:066dfbe8b4b9 501 EVENT_temperature_time = (RET_RTCunixtime + EVENT_temperature_interval);
pathfindr 57:066dfbe8b4b9 502 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 503 EVENT_temperature = false;
pathfindr 57:066dfbe8b4b9 504 //get temperature TODO - only update ble if different to last
pathfindr 57:066dfbe8b4b9 505 }
pathfindr 57:066dfbe8b4b9 506
pathfindr 57:066dfbe8b4b9 507 if (EVENT_humidity) {
pathfindr 57:066dfbe8b4b9 508 if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_Humidity");debug_exe();}
pathfindr 57:066dfbe8b4b9 509 EVENT_humidity_time = (RET_RTCunixtime + EVENT_humidity_interval);
pathfindr 57:066dfbe8b4b9 510 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 511 EVENT_humidity = false;
pathfindr 57:066dfbe8b4b9 512 //get humidity TODO - only update ble if different to last
pathfindr 57:066dfbe8b4b9 513 }
pathfindr 57:066dfbe8b4b9 514
pathfindr 57:066dfbe8b4b9 515 if (EVENT_settingsScan) {
pathfindr 57:066dfbe8b4b9 516 if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_SettingsScan");debug_exe();}
pathfindr 57:066dfbe8b4b9 517 EVENT_settingsScan_time = (RET_RTCunixtime + EVENT_settingsScan_interval);
pathfindr 57:066dfbe8b4b9 518 EVENT_settingsScan = false;
pathfindr 57:066dfbe8b4b9 519 settingsScan();
pathfindr 57:066dfbe8b4b9 520 }
pathfindr 57:066dfbe8b4b9 521
pathfindr 57:066dfbe8b4b9 522 if (EVENT_uwbScan) {
pathfindr 57:066dfbe8b4b9 523 if(debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_uwbScan");debug_exe();}
pathfindr 57:066dfbe8b4b9 524 EVENT_uwbScan_time = (RET_RTCunixtime + EVENT_uwbScan_interval);
pathfindr 57:066dfbe8b4b9 525 EVENT_uwbScan = false;
pathfindr 57:066dfbe8b4b9 526 }
pathfindr 57:066dfbe8b4b9 527
pathfindr 57:066dfbe8b4b9 528 //BLE START OR UPDATE
pathfindr 57:066dfbe8b4b9 529 if (RET_bleBroadcasting == false) {
pathfindr 57:066dfbe8b4b9 530 myble.init(bleSetupAdvertising);
pathfindr 57:066dfbe8b4b9 531 if (myble.hasInitialized()) {
pathfindr 57:066dfbe8b4b9 532 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Start");debug_exe();}
pathfindr 57:066dfbe8b4b9 533 bleUpdateAndAdvertise();
pathfindr 34:4493c9f6d707 534 }
pathfindr 6:388d3c7efdd9 535 }
pathfindr 57:066dfbe8b4b9 536 if (RET_BLEpacketUpdate == true) {
pathfindr 57:066dfbe8b4b9 537 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Update only");debug_exe();}
pathfindr 57:066dfbe8b4b9 538 bleUpdateAndAdvertise();
pathfindr 57:066dfbe8b4b9 539 }
pathfindr 57:066dfbe8b4b9 540
pathfindr 57:066dfbe8b4b9 541 //END
pathfindr 57:066dfbe8b4b9 542 RET_haveEventsToRun = false;
pathfindr 6:388d3c7efdd9 543 }
pathfindr 6:388d3c7efdd9 544
pathfindr 7:e9a19750700d 545 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 546 // MAIN
pathfindr 7:e9a19750700d 547 //------------------------------------------------------------------------------
pathfindr 50:a94e70c00fff 548 int main() {
pathfindr 24:c161db07557f 549 //INIT
pathfindr 51:9078e6928412 550 LED1off();
pathfindr 51:9078e6928412 551 ThisThread::sleep_for(2000); //Initial pause, this is needed for softdevice to init, dont remove!! If we dont have this we get crashes
pathfindr 54:2840f2d50734 552 watchdog.configure(400.0); //6.6 mins //Do not set to less than 4500ms or can cause issues with softdevice
pathfindr 24:c161db07557f 553 RTCticker.attach(&RTCtick, 1.0);
pathfindr 51:9078e6928412 554 LPtimer.start();
pathfindr 34:4493c9f6d707 555 button.fall(&buttonPress);
pathfindr 24:c161db07557f 556 button.rise(&buttonRelease);
pathfindr 57:066dfbe8b4b9 557 //read_app_data_from_flash(&app_data);
pathfindr 57:066dfbe8b4b9 558 firstRun();
pathfindr 13:29f67f256709 559
pathfindr 34:4493c9f6d707 560 //MAIN LOOP
pathfindr 52:bd7678eade77 561 while(true) {
pathfindr 39:f767b8037475 562 RET_asleep = false;
pathfindr 57:066dfbe8b4b9 563 LED1on(20);
pathfindr 40:4270e09e59f2 564
pathfindr 42:f482f4cdb319 565 //STATE ENGINE
pathfindr 9:b0a1535b8ef2 566 mainStateEngine();
pathfindr 51:9078e6928412 567
pathfindr 34:4493c9f6d707 568 //LOG FIRST RUN - BOOTLOADER COMMS
pathfindr 34:4493c9f6d707 569 if (RET_coldBoot) {
pathfindr 57:066dfbe8b4b9 570 //recordFirmwareAsValid();
pathfindr 34:4493c9f6d707 571 RET_coldBoot = 0;
pathfindr 34:4493c9f6d707 572 }
pathfindr 51:9078e6928412 573
pathfindr 57:066dfbe8b4b9 574 //DEBUGGING OFF TIMER
pathfindr 57:066dfbe8b4b9 575 if(RET_debug){
pathfindr 57:066dfbe8b4b9 576 if (RET_RTCunixtime > RET_debug_offat) {
pathfindr 57:066dfbe8b4b9 577 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"DEBUGGING OFF\n");debug_exe();
pathfindr 57:066dfbe8b4b9 578 RET_debug = false;
pathfindr 52:bd7678eade77 579 }
pathfindr 57:066dfbe8b4b9 580 }
pathfindr 57:066dfbe8b4b9 581
pathfindr 9:b0a1535b8ef2 582 //PRE-SLEEP ACTIONS
pathfindr 57:066dfbe8b4b9 583 //if (GLOBAL_needToConfigureLis3dh) { lis3dh_configureForSleep(RET_setting_motion_g,RET_setting_impact_g); }
pathfindr 57:066dfbe8b4b9 584 watchdogKick();
pathfindr 57:066dfbe8b4b9 585 //SLEEP
pathfindr 50:a94e70c00fff 586 nrf_configureForSleep();
pathfindr 34:4493c9f6d707 587 NRFuart_uninit();
pathfindr 39:f767b8037475 588 RET_asleep = true;
pathfindr 57:066dfbe8b4b9 589 LED1off();
pathfindr 26:fa3579737329 590 mainthread.wait(DEFAULT_SLEEP_FRAME);
pathfindr 34:4493c9f6d707 591 }
pathfindr 7:e9a19750700d 592 }