init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
main.cpp@57:066dfbe8b4b9, 2020-02-13 (annotated)
- 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?
User | Revision | Line number | New 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 *)¶ms->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 | } |