init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Committer:
pathfindr
Date:
Mon Feb 17 23:24:52 2020 +0000
Revision:
58:8d4a354816b1
Parent:
57:066dfbe8b4b9
usb

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pathfindr 58:8d4a354816b1 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 58:8d4a354816b1 29 int8_t RET_accX = 0;
pathfindr 58:8d4a354816b1 30 int8_t RET_accY = 0;
pathfindr 58:8d4a354816b1 31 int8_t RET_accZ = 0;
pathfindr 58:8d4a354816b1 32 time_t RET_motionLastDetected = 0;
pathfindr 58:8d4a354816b1 33 time_t RET_InMotionSeconds = 0;
pathfindr 58:8d4a354816b1 34 time_t RET_NoMotionSeconds = 0;
pathfindr 57:066dfbe8b4b9 35 bool RET_impactState = false;
pathfindr 57:066dfbe8b4b9 36
pathfindr 13:29f67f256709 37 //STATE
pathfindr 52:bd7678eade77 38 bool RET_busy = false;
pathfindr 57:066dfbe8b4b9 39 bool RET_asleep = false;
pathfindr 57:066dfbe8b4b9 40 bool RET_coldBoot = true;
pathfindr 57:066dfbe8b4b9 41
pathfindr 57:066dfbe8b4b9 42 //BUTTON
pathfindr 57:066dfbe8b4b9 43 bool RET_buttonPressed = false;
pathfindr 52:bd7678eade77 44 uint8_t RET_buttonPressCount = 0;
pathfindr 52:bd7678eade77 45 time_t RET_buttonPressTime = 0;
pathfindr 52:bd7678eade77 46 time_t RET_buttonReleaseTime = 0;
pathfindr 52:bd7678eade77 47 time_t RET_buttonReleaseTime_prev = 0;
pathfindr 52:bd7678eade77 48 time_t RET_buttonHoldTime = 0;
pathfindr 57:066dfbe8b4b9 49
pathfindr 57:066dfbe8b4b9 50 //EVENTS
pathfindr 57:066dfbe8b4b9 51 bool RET_haveEventsToRun = false;
pathfindr 57:066dfbe8b4b9 52
pathfindr 57:066dfbe8b4b9 53 bool EVENT_buttonPress = false;
pathfindr 57:066dfbe8b4b9 54
pathfindr 57:066dfbe8b4b9 55 bool EVENT_battery = false;
pathfindr 57:066dfbe8b4b9 56 time_t EVENT_battery_interval = DEFAULT_INTERVAL_BATTERY;
pathfindr 57:066dfbe8b4b9 57 time_t EVENT_battery_time = 0;
pathfindr 57:066dfbe8b4b9 58
pathfindr 57:066dfbe8b4b9 59 bool EVENT_motionClear = false;
pathfindr 57:066dfbe8b4b9 60 time_t EVENT_motionClear_interval = DEFAULT_INTERVAL_MOTIONCLEAR;
pathfindr 57:066dfbe8b4b9 61 time_t EVENT_motionClear_time = 0;
pathfindr 57:066dfbe8b4b9 62
pathfindr 57:066dfbe8b4b9 63 bool EVENT_buttonClear = false;
pathfindr 57:066dfbe8b4b9 64 time_t EVENT_buttonClear_interval = DEFAULT_INTERVAL_BUTTONCLEAR;
pathfindr 57:066dfbe8b4b9 65 time_t EVENT_buttonClear_time = 0;
pathfindr 57:066dfbe8b4b9 66
pathfindr 57:066dfbe8b4b9 67 bool EVENT_temperature = false;
pathfindr 57:066dfbe8b4b9 68 time_t EVENT_temperature_interval = DEFAULT_INTERVAL_TEMPERATURE;
pathfindr 57:066dfbe8b4b9 69 time_t EVENT_temperature_time = 0;
pathfindr 57:066dfbe8b4b9 70
pathfindr 57:066dfbe8b4b9 71 bool EVENT_humidity = false;
pathfindr 57:066dfbe8b4b9 72 time_t EVENT_humidity_interval = DEFAULT_INTERVAL_HUMIDITY;
pathfindr 57:066dfbe8b4b9 73 time_t EVENT_humidity_time = 0;
pathfindr 57:066dfbe8b4b9 74
pathfindr 57:066dfbe8b4b9 75 bool EVENT_settingsScan = false;
pathfindr 57:066dfbe8b4b9 76 time_t EVENT_settingsScan_interval = DEFAULT_INTERVAL_SETTINGSSCAN;
pathfindr 57:066dfbe8b4b9 77 time_t EVENT_settingsScan_time = 0;
pathfindr 57:066dfbe8b4b9 78
pathfindr 57:066dfbe8b4b9 79 bool EVENT_uwbScan = false;
pathfindr 58:8d4a354816b1 80 time_t EVENT_uwbScan_interval = 60;
pathfindr 57:066dfbe8b4b9 81 time_t EVENT_uwbScan_time = 0;
pathfindr 57:066dfbe8b4b9 82
pathfindr 58:8d4a354816b1 83 bool EVENT_resetACCInt = false;
pathfindr 58:8d4a354816b1 84 time_t EVENT_resetACCInt_interval = DEFAULT_INTERVAL_RESETACCINT;
pathfindr 58:8d4a354816b1 85 time_t EVENT_resetACCInt_time = 0;
pathfindr 58:8d4a354816b1 86
pathfindr 58:8d4a354816b1 87
pathfindr 52:bd7678eade77 88 //BLE
pathfindr 57:066dfbe8b4b9 89 uint16_t RET_setting_beacon_interval_ms = DEFAULT_BEACON_INTERVAL_MS;
pathfindr 57:066dfbe8b4b9 90 uint16_t RET_setting_beacon_interval_ms_active = DEFAULT_BEACON_INTERVAL_MS;
pathfindr 54:2840f2d50734 91 bool RET_bleBroadcasting = false;
pathfindr 54:2840f2d50734 92 uint8_t RET_bleAdv_flags = 0;
pathfindr 57:066dfbe8b4b9 93 bool RET_UWBdetector_present = true; //BEN should be false
pathfindr 57:066dfbe8b4b9 94 bool RET_BLEpacketUpdate = false;
pathfindr 57:066dfbe8b4b9 95 bool RET_settingsReceived = false;
pathfindr 57:066dfbe8b4b9 96 const uint8_t bleAdv_motion_flag = 0x01; //motion detected
pathfindr 57:066dfbe8b4b9 97 const uint8_t bleAdv_impact_flag = 0x02; //impact detected
pathfindr 57:066dfbe8b4b9 98 const uint8_t bleAdv_button_pressed_flag = 0x08; //button press detected
pathfindr 57:066dfbe8b4b9 99 const uint8_t bleAdv_gap_connected_flag = 0x40; //device is connected
pathfindr 54:2840f2d50734 100 #pragma pack(1)
pathfindr 54:2840f2d50734 101 struct bleData_t {
pathfindr 54:2840f2d50734 102 uint16_t applicationSpecificId;
pathfindr 54:2840f2d50734 103 uint8_t firmware;
pathfindr 54:2840f2d50734 104 uint8_t flags;
pathfindr 54:2840f2d50734 105 uint16_t voltage;
pathfindr 54:2840f2d50734 106 uint8_t buttonpresses;
pathfindr 54:2840f2d50734 107 int16_t temperature;
pathfindr 54:2840f2d50734 108 uint8_t humidity;
pathfindr 54:2840f2d50734 109 uint8_t lux;
pathfindr 54:2840f2d50734 110 int8_t accel_x;
pathfindr 54:2840f2d50734 111 int8_t accel_y;
pathfindr 54:2840f2d50734 112 int8_t accel_z;
pathfindr 54:2840f2d50734 113 };
pathfindr 54:2840f2d50734 114 #pragma pack()
pathfindr 57:066dfbe8b4b9 115
pathfindr 0:94b743e06998 116 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 117 //GPIO
pathfindr 9:b0a1535b8ef2 118 //------------------------------------------------------------------------------
pathfindr 34:4493c9f6d707 119 InterruptIn button(PN_IN_BUTTON);
pathfindr 58:8d4a354816b1 120 InterruptIn accInt1(PN_ACC_INT1);
pathfindr 58:8d4a354816b1 121 //InterruptIn DW_irq(DW1000_IRQ);
pathfindr 9:b0a1535b8ef2 122
pathfindr 9:b0a1535b8ef2 123 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 124 //PERIPHERALS
pathfindr 0:94b743e06998 125 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 126 BLE myble;
pathfindr 52:bd7678eade77 127 WatchdogTimer watchdog;
pathfindr 37:505ef618f06c 128 LowPowerTicker RTCticker;
pathfindr 51:9078e6928412 129 LowPowerTimer LPtimer;
pathfindr 9:b0a1535b8ef2 130
pathfindr 58:8d4a354816b1 131 I2C i2c(PN_I2C_SDA,PN_I2C_SCL);
pathfindr 58:8d4a354816b1 132 SPI spi(PN_SPI_MOSI,PN_SPI_MISO,PN_SPI_CLK);
pathfindr 58:8d4a354816b1 133 Lis2dh12 acc(&i2c, 0x32);
pathfindr 58:8d4a354816b1 134
pathfindr 9:b0a1535b8ef2 135 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 136 //SEMAPHORES
pathfindr 9:b0a1535b8ef2 137 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 138 Semaphore mainthread;
pathfindr 9:b0a1535b8ef2 139
pathfindr 9:b0a1535b8ef2 140 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 141 // LOW LEVEL FUNCS
pathfindr 34:4493c9f6d707 142 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 143 void watchdogKick() {
pathfindr 52:bd7678eade77 144 watchdog.kick();
pathfindr 52:bd7678eade77 145 }
pathfindr 51:9078e6928412 146 void set_8bit_flag(uint8_t& flags, uint8_t flag) {
pathfindr 51:9078e6928412 147 flags |= flag;
pathfindr 51:9078e6928412 148 }
pathfindr 51:9078e6928412 149 bool get_8bit_flag(uint8_t& flags, uint8_t flag) {
pathfindr 51:9078e6928412 150 bool result = (flags & flag);
pathfindr 51:9078e6928412 151 return result;
pathfindr 51:9078e6928412 152 }
pathfindr 51:9078e6928412 153 void clr_8bit_flag(uint8_t& flags, uint8_t flag) {
pathfindr 51:9078e6928412 154 flags &= ~flag;
pathfindr 51:9078e6928412 155 }
pathfindr 50:a94e70c00fff 156 void nrf_configureForSleep(){
pathfindr 50:a94e70c00fff 157 //Disable SPI pins to reduce power
pathfindr 50:a94e70c00fff 158 //nrf_gpio_cfg_input(PN_SPI_MOSI, NRF_GPIO_PIN_NOPULL); //Don't need this one
pathfindr 34:4493c9f6d707 159 nrf_gpio_cfg_input(PN_SPI_MISO, NRF_GPIO_PIN_NOPULL);
pathfindr 50:a94e70c00fff 160
pathfindr 50:a94e70c00fff 161 //TWI0
pathfindr 52:bd7678eade77 162 NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
pathfindr 50:a94e70c00fff 163 *(volatile uint32_t *)0x40003FFC = 0;
pathfindr 50:a94e70c00fff 164 *(volatile uint32_t *)0x40003FFC;
pathfindr 50:a94e70c00fff 165 *(volatile uint32_t *)0x40003FFC = 1;
pathfindr 50:a94e70c00fff 166 //TWI1
pathfindr 52:bd7678eade77 167 NRF_TWI1->ENABLE=TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
pathfindr 50:a94e70c00fff 168 *(volatile uint32_t *)0x40004FFC = 0;
pathfindr 50:a94e70c00fff 169 *(volatile uint32_t *)0x40004FFC;
pathfindr 50:a94e70c00fff 170 *(volatile uint32_t *)0x40004FFC = 1;
pathfindr 6:388d3c7efdd9 171 }
pathfindr 57:066dfbe8b4b9 172
pathfindr 45:6c7f5b556d74 173 void recordFirmwareAsValid() {
pathfindr 57:066dfbe8b4b9 174 bleShutdown();
pathfindr 45:6c7f5b556d74 175 read_app_data_from_flash(&app_data);
pathfindr 45:6c7f5b556d74 176 bool write_app_data_to_flash_execute = false;
pathfindr 45:6c7f5b556d74 177 if(get_flag(&app_data, app_execution_flag) == true) {
pathfindr 45:6c7f5b556d74 178 clr_flag(&app_data, app_execution_flag);
pathfindr 45:6c7f5b556d74 179 clr_flag(&app_data, first_run_flag);
pathfindr 45:6c7f5b556d74 180 write_app_data_to_flash_execute = true;
pathfindr 45:6c7f5b556d74 181 }
pathfindr 45:6c7f5b556d74 182 if(app_data.current_firmware_version != FW_VERSION) {
pathfindr 45:6c7f5b556d74 183 app_data.current_firmware_version = FW_VERSION;
pathfindr 45:6c7f5b556d74 184 app_data.target_firmware_version = FW_VERSION;
pathfindr 45:6c7f5b556d74 185 write_app_data_to_flash_execute = true;
pathfindr 45:6c7f5b556d74 186 }
pathfindr 45:6c7f5b556d74 187 if (write_app_data_to_flash_execute) {
pathfindr 45:6c7f5b556d74 188 write_app_data_to_flash(&app_data);
pathfindr 51:9078e6928412 189 //read back to check
pathfindr 51:9078e6928412 190 ThisThread::sleep_for(200); //need this delay
pathfindr 51:9078e6928412 191 read_app_data_from_flash(&app_data);
pathfindr 51:9078e6928412 192 if (app_data.current_firmware_version == FW_VERSION) {
pathfindr 51:9078e6928412 193 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "OK");debug_exe();
pathfindr 51:9078e6928412 194 } else {
pathfindr 51:9078e6928412 195 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "FAIL - IS BLE SHUTDOWN?");debug_exe();
pathfindr 51:9078e6928412 196 }
pathfindr 51:9078e6928412 197 }
pathfindr 45:6c7f5b556d74 198 }
pathfindr 51:9078e6928412 199 void updateBatteryV() {
pathfindr 19:22261767c87a 200 NRF52_SAADC batteryIn;
pathfindr 19:22261767c87a 201 batteryIn.addChannel(9); // vdd for battery
pathfindr 19:22261767c87a 202 batteryIn.calibrate();
pathfindr 49:15ddd84ec9fa 203 //get initial reading, first reading is always low
pathfindr 49:15ddd84ec9fa 204 batteryIn.updateData(); batteryIn.getData()[0];
pathfindr 49:15ddd84ec9fa 205 float voltage_accumulator = 0.0;
pathfindr 49:15ddd84ec9fa 206 uint8_t readings = 0;
pathfindr 49:15ddd84ec9fa 207 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 208 batteryIn.updateData();
pathfindr 49:15ddd84ec9fa 209 voltage_accumulator += (batteryIn.getData()[0])*(1.0/1024.0)*3.60;
pathfindr 49:15ddd84ec9fa 210 readings ++;
pathfindr 19:22261767c87a 211 }
pathfindr 51:9078e6928412 212 RET_voltage = (voltage_accumulator / (float)readings);
pathfindr 22:810425eb76e1 213 }
pathfindr 57:066dfbe8b4b9 214
pathfindr 57:066dfbe8b4b9 215
pathfindr 57:066dfbe8b4b9 216
pathfindr 19:22261767c87a 217 //------------------------------------------------------------------------------
pathfindr 58:8d4a354816b1 218 // INTERUPTS
pathfindr 19:22261767c87a 219 //------------------------------------------------------------------------------
pathfindr 19:22261767c87a 220 void buttonPress() {
pathfindr 51:9078e6928412 221 RET_buttonPressTime = LPtimer.read_ms();
pathfindr 19:22261767c87a 222 }
pathfindr 19:22261767c87a 223 void buttonRelease() {
pathfindr 51:9078e6928412 224 //debounce catch
pathfindr 51:9078e6928412 225 RET_buttonReleaseTime = LPtimer.read_ms();
pathfindr 57:066dfbe8b4b9 226 if ((RET_buttonReleaseTime - RET_buttonReleaseTime_prev) > 100) {
pathfindr 51:9078e6928412 227 RET_buttonPressCount ++;
pathfindr 51:9078e6928412 228 RET_buttonHoldTime = (RET_buttonReleaseTime - RET_buttonPressTime);
pathfindr 57:066dfbe8b4b9 229 //temporarily enable debugging
pathfindr 51:9078e6928412 230 RET_debug = true;
pathfindr 52:bd7678eade77 231 RET_debug_offat = (RET_RTCunixtime + 3600); //debug on for 1hr
pathfindr 57:066dfbe8b4b9 232 EVENT_buttonPress = true;
pathfindr 57:066dfbe8b4b9 233 mainthread.release();
pathfindr 51:9078e6928412 234 }
pathfindr 51:9078e6928412 235 RET_buttonReleaseTime_prev = RET_buttonReleaseTime;
pathfindr 19:22261767c87a 236 }
pathfindr 57:066dfbe8b4b9 237
pathfindr 58:8d4a354816b1 238 void accInt1ISR() {
pathfindr 58:8d4a354816b1 239 //led2 = !led2;
pathfindr 58:8d4a354816b1 240 RET_motionLastDetected = RET_RTCunixtime;
pathfindr 58:8d4a354816b1 241 }
pathfindr 57:066dfbe8b4b9 242
pathfindr 19:22261767c87a 243 //------------------------------------------------------------------------------
pathfindr 19:22261767c87a 244 // RTC TICKER
pathfindr 51:9078e6928412 245 //------------------------------------------------------------------------------
pathfindr 54:2840f2d50734 246 bool RET_flash_busy = false;
pathfindr 9:b0a1535b8ef2 247 void RTCtick() {
pathfindr 51:9078e6928412 248 //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 249 RET_RTCunixtime += 1;
pathfindr 51:9078e6928412 250
pathfindr 57:066dfbe8b4b9 251 //CHECK FOR EVENTS
pathfindr 57:066dfbe8b4b9 252 if (RET_haveEventsToRun == false) {
pathfindr 57:066dfbe8b4b9 253 if (EVENT_motionClear_time > 0 && RET_RTCunixtime >= EVENT_motionClear_time) {
pathfindr 57:066dfbe8b4b9 254 RET_haveEventsToRun = true; EVENT_motionClear = true;
pathfindr 57:066dfbe8b4b9 255 }
pathfindr 57:066dfbe8b4b9 256 if (EVENT_buttonClear_time > 0 && RET_RTCunixtime >= EVENT_buttonClear_time) {
pathfindr 57:066dfbe8b4b9 257 RET_haveEventsToRun = true; EVENT_buttonClear = true;
pathfindr 57:066dfbe8b4b9 258 }
pathfindr 57:066dfbe8b4b9 259 if (EVENT_battery_time > 0 && RET_RTCunixtime >= EVENT_battery_time) {
pathfindr 57:066dfbe8b4b9 260 RET_haveEventsToRun = true; EVENT_battery = true;
pathfindr 51:9078e6928412 261 }
pathfindr 57:066dfbe8b4b9 262 if (EVENT_temperature_time > 0 && RET_RTCunixtime >= EVENT_temperature_time) {
pathfindr 57:066dfbe8b4b9 263 RET_haveEventsToRun = true; EVENT_temperature = true;
pathfindr 57:066dfbe8b4b9 264 }
pathfindr 57:066dfbe8b4b9 265 if (EVENT_humidity_time > 0 && RET_RTCunixtime >= EVENT_humidity_time) {
pathfindr 57:066dfbe8b4b9 266 RET_haveEventsToRun = true; EVENT_humidity = true;
pathfindr 57:066dfbe8b4b9 267 }
pathfindr 57:066dfbe8b4b9 268 if (EVENT_settingsScan_time > 0 && RET_RTCunixtime >= EVENT_settingsScan_time) {
pathfindr 57:066dfbe8b4b9 269 RET_haveEventsToRun = true; EVENT_settingsScan = true;
pathfindr 57:066dfbe8b4b9 270 }
pathfindr 57:066dfbe8b4b9 271 if (EVENT_uwbScan_time > 0 && RET_RTCunixtime >= EVENT_uwbScan_time) {
pathfindr 57:066dfbe8b4b9 272 RET_haveEventsToRun = true; EVENT_uwbScan = true;
pathfindr 9:b0a1535b8ef2 273 }
pathfindr 58:8d4a354816b1 274 if (EVENT_resetACCInt_time > 0 && RET_RTCunixtime >= EVENT_resetACCInt_time) {
pathfindr 58:8d4a354816b1 275 RET_haveEventsToRun = true; EVENT_resetACCInt = true;
pathfindr 58:8d4a354816b1 276 }
pathfindr 49:15ddd84ec9fa 277 }
pathfindr 52:bd7678eade77 278
pathfindr 58:8d4a354816b1 279 //CHECK FOR MOTION OPT
pathfindr 58:8d4a354816b1 280 //Had motion in last 5 seconds?
pathfindr 58:8d4a354816b1 281 if (RET_motionLastDetected > 0 && (RET_RTCunixtime-RET_motionLastDetected) < 5) {
pathfindr 58:8d4a354816b1 282 EVENT_motionClear_time = (RET_RTCunixtime + EVENT_motionClear_interval);
pathfindr 58:8d4a354816b1 283 if (RET_motionState == 0) {
pathfindr 58:8d4a354816b1 284 RET_motionState = 1;
pathfindr 58:8d4a354816b1 285 RET_BLEpacketUpdate = true;
pathfindr 58:8d4a354816b1 286 RET_haveEventsToRun = true;
pathfindr 58:8d4a354816b1 287 }
pathfindr 58:8d4a354816b1 288 }
pathfindr 58:8d4a354816b1 289 led1 = !RET_motionState;
pathfindr 58:8d4a354816b1 290
pathfindr 58:8d4a354816b1 291 //WAKE UP MAIN LOOP AND RUN ANY EVENTS
pathfindr 58:8d4a354816b1 292 if (RET_haveEventsToRun && RET_asleep) {
pathfindr 57:066dfbe8b4b9 293 mainthread.release();
pathfindr 41:07e41dbd5304 294 }
pathfindr 38:476a9b5629a1 295 }
pathfindr 24:c161db07557f 296
pathfindr 57:066dfbe8b4b9 297
pathfindr 52:bd7678eade77 298 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 299 // BLE FUNCS
pathfindr 52:bd7678eade77 300 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 301 void bleBuildData(bleData_t &bleData)
pathfindr 52:bd7678eade77 302 {
pathfindr 57:066dfbe8b4b9 303 bleData.applicationSpecificId = BLE_SERVICEID_UWBBEACON;
pathfindr 52:bd7678eade77 304 bleData.firmware = FW_VERSION;
pathfindr 52:bd7678eade77 305 //set flags
pathfindr 57:066dfbe8b4b9 306 if (RET_motionState) {
pathfindr 57:066dfbe8b4b9 307 set_8bit_flag(RET_bleAdv_flags, bleAdv_motion_flag);
pathfindr 52:bd7678eade77 308 } else {
pathfindr 57:066dfbe8b4b9 309 clr_8bit_flag(RET_bleAdv_flags, bleAdv_motion_flag);
pathfindr 57:066dfbe8b4b9 310 }
pathfindr 57:066dfbe8b4b9 311
pathfindr 57:066dfbe8b4b9 312 if (RET_impactState) {
pathfindr 57:066dfbe8b4b9 313 set_8bit_flag(RET_bleAdv_flags, bleAdv_impact_flag);
pathfindr 57:066dfbe8b4b9 314 } else {
pathfindr 57:066dfbe8b4b9 315 clr_8bit_flag(RET_bleAdv_flags, bleAdv_impact_flag);
pathfindr 52:bd7678eade77 316 }
pathfindr 57:066dfbe8b4b9 317
pathfindr 57:066dfbe8b4b9 318 if(RET_buttonPressed) {
pathfindr 57:066dfbe8b4b9 319 set_8bit_flag(RET_bleAdv_flags, bleAdv_button_pressed_flag);
pathfindr 52:bd7678eade77 320 } else {
pathfindr 57:066dfbe8b4b9 321 clr_8bit_flag(RET_bleAdv_flags, bleAdv_button_pressed_flag);
pathfindr 52:bd7678eade77 322 }
pathfindr 57:066dfbe8b4b9 323
pathfindr 52:bd7678eade77 324 bleData.flags = RET_bleAdv_flags;
pathfindr 57:066dfbe8b4b9 325 bleData.voltage = RET_voltage;
pathfindr 57:066dfbe8b4b9 326 bleData.buttonpresses = RET_buttonPressCount;
pathfindr 57:066dfbe8b4b9 327 bleData.temperature = RET_temperature;
pathfindr 52:bd7678eade77 328 bleData.humidity = 0xFF;
pathfindr 52:bd7678eade77 329 bleData.lux = 0xFF;
pathfindr 52:bd7678eade77 330 bleData.accel_x = 0xFF;
pathfindr 52:bd7678eade77 331 bleData.accel_y = 0xFF;
pathfindr 52:bd7678eade77 332 bleData.accel_z = 0xFF;
pathfindr 52:bd7678eade77 333 }
pathfindr 57:066dfbe8b4b9 334 void bleUpdateAndAdvertise(void)
pathfindr 52:bd7678eade77 335 {
pathfindr 52:bd7678eade77 336 bleData_t bleData;
pathfindr 52:bd7678eade77 337 bleBuildData(bleData);
pathfindr 52:bd7678eade77 338 myble.gap().stopAdvertising();
pathfindr 52:bd7678eade77 339 myble.gap().setTxPower(DEFAULT_BEACON_POWER); // set tx power,valid values are -40, -20, -16, -12, -8, -4, 0, 4
pathfindr 52:bd7678eade77 340 myble.gap().accumulateAdvertisingPayloadTxPower(DEFAULT_BEACON_POWER); // (accepted values are -40, -30, -20, -16, -12, -8, -4, 0, and 4 dBm)
pathfindr 57:066dfbe8b4b9 341 myble.gap().setAdvertisingInterval(RET_setting_beacon_interval_ms_active);
pathfindr 52:bd7678eade77 342 myble.gap().updateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 52:bd7678eade77 343 //myble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 52:bd7678eade77 344 myble.gap().startAdvertising();
pathfindr 52:bd7678eade77 345 RET_bleBroadcasting = true;
pathfindr 57:066dfbe8b4b9 346 RET_BLEpacketUpdate = false;
pathfindr 52:bd7678eade77 347 }
pathfindr 52:bd7678eade77 348 void bleSetupAdvertising(BLE::InitializationCompleteCallbackContext *params)
pathfindr 52:bd7678eade77 349 {
pathfindr 52:bd7678eade77 350 if (RET_pf_identifier[0] != 0x00 && RET_pf_identifier[1] != 0x00 && RET_pf_identifier[2] != 0x00) {
pathfindr 52:bd7678eade77 351 bleData_t bleData;
pathfindr 52:bd7678eade77 352 bleBuildData(bleData);
pathfindr 52:bd7678eade77 353 char localname[6];
pathfindr 52:bd7678eade77 354 memcpy(localname,RET_pf_identifier,6);
pathfindr 52:bd7678eade77 355 myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE );
pathfindr 52:bd7678eade77 356 myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)localname, sizeof(localname));
pathfindr 52:bd7678eade77 357 myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 57:066dfbe8b4b9 358 ////myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 52:bd7678eade77 359 myble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
pathfindr 52:bd7678eade77 360 }
pathfindr 52:bd7678eade77 361 }
pathfindr 52:bd7678eade77 362 void bleStopAdvertising(void)
pathfindr 52:bd7678eade77 363 {
pathfindr 52:bd7678eade77 364 myble.gap().stopAdvertising();
pathfindr 52:bd7678eade77 365 RET_bleBroadcasting = false;
pathfindr 52:bd7678eade77 366 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Adv Stop");debug_exe();}
pathfindr 52:bd7678eade77 367 }
pathfindr 52:bd7678eade77 368 void bleAdvertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
pathfindr 52:bd7678eade77 369 struct AdvertisingData_t {
pathfindr 52:bd7678eade77 370 uint8_t length;
pathfindr 52:bd7678eade77 371 GapAdvertisingData::DataType_t dataType;
pathfindr 52:bd7678eade77 372 uint8_t data[0];
pathfindr 52:bd7678eade77 373 } PACKED;
pathfindr 52:bd7678eade77 374 struct bleData_t {
pathfindr 52:bd7678eade77 375 uint16_t applicationSpecificId;
pathfindr 52:bd7678eade77 376 } PACKED;
pathfindr 52:bd7678eade77 377
pathfindr 52:bd7678eade77 378 //Search for the manufacturer specific data with matching application-ID
pathfindr 52:bd7678eade77 379 AdvertisingData_t *pAdvData;
pathfindr 52:bd7678eade77 380 for (size_t index = 0; index < params->advertisingDataLen; index += (pAdvData->length + 1)) {
pathfindr 52:bd7678eade77 381 pAdvData = (AdvertisingData_t *)&params->advertisingData[index];
pathfindr 52:bd7678eade77 382 const bleData_t *pbleData = (const bleData_t *)pAdvData->data;
pathfindr 52:bd7678eade77 383
pathfindr 52:bd7678eade77 384 //BLE TYPE SWITCH
pathfindr 52:bd7678eade77 385 switch(pbleData->applicationSpecificId) {
pathfindr 57:066dfbe8b4b9 386 case BLE_SERVICEID_PFDETECTOR2 :
pathfindr 52:bd7678eade77 387 {
pathfindr 52:bd7678eade77 388 char ble_advdata[100];
pathfindr 52:bd7678eade77 389 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 390 params->advertisingData[0],
pathfindr 52:bd7678eade77 391 params->advertisingData[1],
pathfindr 52:bd7678eade77 392 params->advertisingData[2],
pathfindr 52:bd7678eade77 393 params->advertisingData[3],
pathfindr 52:bd7678eade77 394 params->advertisingData[4],
pathfindr 52:bd7678eade77 395 params->advertisingData[5],
pathfindr 52:bd7678eade77 396 params->advertisingData[6],
pathfindr 52:bd7678eade77 397 params->advertisingData[7],
pathfindr 52:bd7678eade77 398 params->advertisingData[8],
pathfindr 52:bd7678eade77 399 params->advertisingData[9],
pathfindr 52:bd7678eade77 400 params->advertisingData[10],
pathfindr 52:bd7678eade77 401 params->advertisingData[11],
pathfindr 52:bd7678eade77 402 params->advertisingData[12],
pathfindr 52:bd7678eade77 403 params->advertisingData[13],
pathfindr 52:bd7678eade77 404 params->advertisingData[14],
pathfindr 52:bd7678eade77 405 params->advertisingData[15],
pathfindr 52:bd7678eade77 406 params->advertisingData[16],
pathfindr 52:bd7678eade77 407 params->advertisingData[17],
pathfindr 52:bd7678eade77 408 params->advertisingData[18],
pathfindr 52:bd7678eade77 409 params->advertisingData[19],
pathfindr 52:bd7678eade77 410 params->advertisingData[20]);
pathfindr 52:bd7678eade77 411 //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 412 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Detector @rssi: %d",params->rssi);debug_exe();}
pathfindr 52:bd7678eade77 413 if (params->rssi >= -75) {
pathfindr 57:066dfbe8b4b9 414
pathfindr 52:bd7678eade77 415 }
pathfindr 57:066dfbe8b4b9 416 RET_settingsReceived = true;
pathfindr 52:bd7678eade77 417 break;
pathfindr 52:bd7678eade77 418 }
pathfindr 52:bd7678eade77 419 }
pathfindr 52:bd7678eade77 420 }
pathfindr 52:bd7678eade77 421 }
pathfindr 52:bd7678eade77 422 void bleConfigureScan(void)
pathfindr 52:bd7678eade77 423 {
pathfindr 54:2840f2d50734 424 myble.gap().setScanParams(200,200); //scan interval //scan window
pathfindr 52:bd7678eade77 425 myble.gap().startScan(bleAdvertisementCallback);
pathfindr 52:bd7678eade77 426 }
pathfindr 52:bd7678eade77 427 void bleStopScan(void)
pathfindr 52:bd7678eade77 428 {
pathfindr 52:bd7678eade77 429 myble.gap().stopScan();
pathfindr 52:bd7678eade77 430 }
pathfindr 52:bd7678eade77 431 void bleShutdown(void)
pathfindr 52:bd7678eade77 432 {
pathfindr 52:bd7678eade77 433 bleStopScan();
pathfindr 52:bd7678eade77 434 bleStopAdvertising();
pathfindr 52:bd7678eade77 435 myble.shutdown();
pathfindr 52:bd7678eade77 436 }
pathfindr 8:7351f8c4cd60 437
pathfindr 14:9a54b1b65bc8 438 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 439 // FIRST RUN
pathfindr 14:9a54b1b65bc8 440 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 441 void firstRun() {
pathfindr 57:066dfbe8b4b9 442 //Set Serial Number
pathfindr 57:066dfbe8b4b9 443 RET_pf_identifier[0] = 'U';
pathfindr 57:066dfbe8b4b9 444 RET_pf_identifier[1] = 'W';
pathfindr 57:066dfbe8b4b9 445 RET_pf_identifier[2] = 'B';
pathfindr 57:066dfbe8b4b9 446 RET_pf_identifier[3] = '0';
pathfindr 57:066dfbe8b4b9 447 RET_pf_identifier[4] = '1';
pathfindr 57:066dfbe8b4b9 448 RET_pf_identifier[5] = 0x00;
pathfindr 51:9078e6928412 449
pathfindr 57:066dfbe8b4b9 450 //GET INITITAL SENSORS
pathfindr 57:066dfbe8b4b9 451 updateBatteryV();
pathfindr 57:066dfbe8b4b9 452 //updateTemperature
pathfindr 57:066dfbe8b4b9 453 //updateHumidity
pathfindr 45:6c7f5b556d74 454
pathfindr 57:066dfbe8b4b9 455 //SET EVENT TIMES
pathfindr 57:066dfbe8b4b9 456 EVENT_battery_time = (RET_RTCunixtime + EVENT_battery_interval);
pathfindr 57:066dfbe8b4b9 457 EVENT_temperature_time = (RET_RTCunixtime + EVENT_temperature_interval);
pathfindr 57:066dfbe8b4b9 458 EVENT_humidity_time = (RET_RTCunixtime + EVENT_humidity_interval);
pathfindr 57:066dfbe8b4b9 459 EVENT_settingsScan_time = (RET_RTCunixtime + EVENT_settingsScan_interval);
pathfindr 57:066dfbe8b4b9 460 EVENT_uwbScan_time = (RET_RTCunixtime + EVENT_uwbScan_interval);
pathfindr 40:4270e09e59f2 461 }
pathfindr 40:4270e09e59f2 462
pathfindr 40:4270e09e59f2 463 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 464 // BLE SETTINGS SCAN
pathfindr 13:29f67f256709 465 //------------------------------------------------------------------------------
pathfindr 57:066dfbe8b4b9 466 void settingsScan() {
pathfindr 58:8d4a354816b1 467 //LED1on(0);
pathfindr 57:066dfbe8b4b9 468 bleStopAdvertising();
pathfindr 57:066dfbe8b4b9 469 LowPowerTimer bleScan_t;
pathfindr 57:066dfbe8b4b9 470 bleScan_t.start();
pathfindr 57:066dfbe8b4b9 471 RET_settingsReceived = false;
pathfindr 57:066dfbe8b4b9 472 uint32_t bleScan_startmillis = bleScan_t.read_ms(); uint32_t bleScan_runtime = 0;
pathfindr 57:066dfbe8b4b9 473 if (!myble.hasInitialized()) {
pathfindr 57:066dfbe8b4b9 474 myble.init();
pathfindr 57:066dfbe8b4b9 475 while (!myble.hasInitialized() && bleScan_runtime < 1000) {
pathfindr 57:066dfbe8b4b9 476 bleScan_runtime = (bleScan_t.read_ms() - bleScan_startmillis);
pathfindr 39:f767b8037475 477 }
pathfindr 39:f767b8037475 478 }
pathfindr 57:066dfbe8b4b9 479 if (myble.hasInitialized()) {
pathfindr 57:066dfbe8b4b9 480 bleConfigureScan();
pathfindr 57:066dfbe8b4b9 481 bleScan_startmillis = bleScan_t.read_ms();
pathfindr 57:066dfbe8b4b9 482 while (bleScan_runtime < DEFAULT_SETTINGSSCANTIME_MS && RET_settingsReceived == false) {
pathfindr 57:066dfbe8b4b9 483 bleScan_runtime = (bleScan_t.read_ms() - bleScan_startmillis);
pathfindr 57:066dfbe8b4b9 484 myble.waitForEvent(); // low power wait for event
pathfindr 22:810425eb76e1 485 }
pathfindr 20:5404841fdd2b 486 }
pathfindr 57:066dfbe8b4b9 487 bleScan_t.stop();
pathfindr 57:066dfbe8b4b9 488 myble.gap().stopScan();
pathfindr 58:8d4a354816b1 489 //LED1off();
pathfindr 58:8d4a354816b1 490 }
pathfindr 58:8d4a354816b1 491
pathfindr 58:8d4a354816b1 492 //------------------------------------------------------------------------------
pathfindr 58:8d4a354816b1 493 // UWB SCAN
pathfindr 58:8d4a354816b1 494 //------------------------------------------------------------------------------
pathfindr 58:8d4a354816b1 495 struct __attribute__((packed, aligned(1))) DistancesFrame {
pathfindr 58:8d4a354816b1 496 uint8_t source;
pathfindr 58:8d4a354816b1 497 uint8_t destination;
pathfindr 58:8d4a354816b1 498 uint8_t type;
pathfindr 58:8d4a354816b1 499 float dist[4];
pathfindr 58:8d4a354816b1 500 };
pathfindr 58:8d4a354816b1 501
pathfindr 58:8d4a354816b1 502 DW1000 dw(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CLK, DW1000_CS, DW1000_IRQ, DW1000_RST); // Device driver instanceSPI pins: (MOSI, MISO, SCLK, CS, IRQ)
pathfindr 58:8d4a354816b1 503 //DW1000 dw(&spi,DW_irq,DW1000_CS,DW1000_RST);
pathfindr 58:8d4a354816b1 504 MM2WayRanging node(dw);
pathfindr 58:8d4a354816b1 505
pathfindr 58:8d4a354816b1 506 void uwbScan() {
pathfindr 58:8d4a354816b1 507
pathfindr 58:8d4a354816b1 508 }
pathfindr 58:8d4a354816b1 509
pathfindr 58:8d4a354816b1 510 //------------------------------------------------------------------------------
pathfindr 58:8d4a354816b1 511 // ACC
pathfindr 58:8d4a354816b1 512 //------------------------------------------------------------------------------
pathfindr 58:8d4a354816b1 513 void acc_configForMotionInt() {
pathfindr 58:8d4a354816b1 514 acc.setMode(LOW_POWER);
pathfindr 58:8d4a354816b1 515 acc.enableAxes(X_axis);
pathfindr 58:8d4a354816b1 516 acc.enableAxes(Y_axis);
pathfindr 58:8d4a354816b1 517 acc.enableAxes(Z_axis);
pathfindr 58:8d4a354816b1 518 acc.setODR(ODR_1Hz);
pathfindr 58:8d4a354816b1 519 acc.setScale(_8g);
pathfindr 58:8d4a354816b1 520 acc.int1Setup(0b01000000); // IntActivity 1 driven to INT1 pad
pathfindr 58:8d4a354816b1 521 //acc.setCTRL_REG2(0b11001011); //High pass filter active
pathfindr 58:8d4a354816b1 522 acc.setCTRL_REG2(0b00000000); //High pass filter off
pathfindr 58:8d4a354816b1 523 acc.int1Latch(0b00000000); //Dont latch
pathfindr 58:8d4a354816b1 524 acc.int1Threshold(7);
pathfindr 58:8d4a354816b1 525 acc.int1Duration(0x00);
pathfindr 58:8d4a354816b1 526 acc.int1Config(0b01111111); // INT2_CFG Enable XHigh, YHigh and ZHigh, triggers INT1 on any motion
pathfindr 58:8d4a354816b1 527 acc.clearIntFlag(); //reset int1
pathfindr 58:8d4a354816b1 528 }
pathfindr 58:8d4a354816b1 529
pathfindr 58:8d4a354816b1 530 void acc_updateOrientation() {
pathfindr 58:8d4a354816b1 531 //Divide by 16 to get range of +- 16 on each axis
pathfindr 58:8d4a354816b1 532 RET_accX = (acc.readXAxis() / 16);
pathfindr 58:8d4a354816b1 533 RET_accY = (acc.readYAxis() / 16);
pathfindr 58:8d4a354816b1 534 RET_accZ = (acc.readZAxis() / 16);
pathfindr 48:64b1613941d5 535 }
pathfindr 24:c161db07557f 536
pathfindr 7:e9a19750700d 537 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 538 // STATE ENGINE
pathfindr 7:e9a19750700d 539 //------------------------------------------------------------------------------
pathfindr 6:388d3c7efdd9 540 void mainStateEngine() {
pathfindr 58:8d4a354816b1 541 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "MainStateEngine");debug_exe();}
pathfindr 57:066dfbe8b4b9 542
pathfindr 57:066dfbe8b4b9 543 if (EVENT_buttonPress) {
pathfindr 58:8d4a354816b1 544 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_ButtonPress");debug_exe();}
pathfindr 57:066dfbe8b4b9 545 EVENT_buttonClear_time = (RET_RTCunixtime + EVENT_buttonClear_interval);
pathfindr 57:066dfbe8b4b9 546 RET_setting_beacon_interval_ms_active = DEFAULT_BEACON_INTERVAL_FAST_MS;
pathfindr 57:066dfbe8b4b9 547 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 548 EVENT_buttonPress = false;
pathfindr 57:066dfbe8b4b9 549 }
pathfindr 57:066dfbe8b4b9 550
pathfindr 57:066dfbe8b4b9 551 if (EVENT_motionClear) {
pathfindr 58:8d4a354816b1 552 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_MotionClear");debug_exe();}
pathfindr 57:066dfbe8b4b9 553 EVENT_motionClear_time = 0;
pathfindr 58:8d4a354816b1 554 EVENT_motionClear = false;
pathfindr 57:066dfbe8b4b9 555 RET_motionState = false;
pathfindr 57:066dfbe8b4b9 556 RET_impactState = false;
pathfindr 58:8d4a354816b1 557 acc_updateOrientation(); //update orientation data
pathfindr 57:066dfbe8b4b9 558 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 559 }
pathfindr 57:066dfbe8b4b9 560
pathfindr 57:066dfbe8b4b9 561 if (EVENT_buttonClear) {
pathfindr 58:8d4a354816b1 562 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_ButtonClear");debug_exe();}
pathfindr 57:066dfbe8b4b9 563 EVENT_buttonClear_time = 0;
pathfindr 58:8d4a354816b1 564 EVENT_buttonClear = false;
pathfindr 57:066dfbe8b4b9 565 RET_buttonPressed = false;
pathfindr 57:066dfbe8b4b9 566 RET_buttonPressCount = 0;
pathfindr 57:066dfbe8b4b9 567 RET_setting_beacon_interval_ms_active = RET_setting_beacon_interval_ms; //reset back to normal broadcast rate
pathfindr 57:066dfbe8b4b9 568 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 569 }
pathfindr 57:066dfbe8b4b9 570
pathfindr 57:066dfbe8b4b9 571 if (EVENT_battery) {
pathfindr 58:8d4a354816b1 572 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_Battery");debug_exe();}
pathfindr 57:066dfbe8b4b9 573 EVENT_battery_time = (RET_RTCunixtime + EVENT_battery_interval);
pathfindr 58:8d4a354816b1 574 EVENT_battery = false;
pathfindr 57:066dfbe8b4b9 575 updateBatteryV();
pathfindr 57:066dfbe8b4b9 576 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 577 }
pathfindr 57:066dfbe8b4b9 578
pathfindr 57:066dfbe8b4b9 579 if (EVENT_temperature) {
pathfindr 58:8d4a354816b1 580 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_Temperature");debug_exe();}
pathfindr 57:066dfbe8b4b9 581 EVENT_temperature_time = (RET_RTCunixtime + EVENT_temperature_interval);
pathfindr 57:066dfbe8b4b9 582 EVENT_temperature = false;
pathfindr 57:066dfbe8b4b9 583 //get temperature TODO - only update ble if different to last
pathfindr 58:8d4a354816b1 584 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 585 }
pathfindr 57:066dfbe8b4b9 586
pathfindr 57:066dfbe8b4b9 587 if (EVENT_humidity) {
pathfindr 58:8d4a354816b1 588 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_Humidity");debug_exe();}
pathfindr 57:066dfbe8b4b9 589 EVENT_humidity_time = (RET_RTCunixtime + EVENT_humidity_interval);
pathfindr 57:066dfbe8b4b9 590 EVENT_humidity = false;
pathfindr 57:066dfbe8b4b9 591 //get humidity TODO - only update ble if different to last
pathfindr 58:8d4a354816b1 592 RET_BLEpacketUpdate = true;
pathfindr 57:066dfbe8b4b9 593 }
pathfindr 57:066dfbe8b4b9 594
pathfindr 57:066dfbe8b4b9 595 if (EVENT_settingsScan) {
pathfindr 58:8d4a354816b1 596 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_SettingsScan");debug_exe();}
pathfindr 57:066dfbe8b4b9 597 EVENT_settingsScan_time = (RET_RTCunixtime + EVENT_settingsScan_interval);
pathfindr 57:066dfbe8b4b9 598 EVENT_settingsScan = false;
pathfindr 57:066dfbe8b4b9 599 settingsScan();
pathfindr 57:066dfbe8b4b9 600 }
pathfindr 57:066dfbe8b4b9 601
pathfindr 57:066dfbe8b4b9 602 if (EVENT_uwbScan) {
pathfindr 58:8d4a354816b1 603 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_uwbScan");debug_exe();}
pathfindr 57:066dfbe8b4b9 604 EVENT_uwbScan_time = (RET_RTCunixtime + EVENT_uwbScan_interval);
pathfindr 57:066dfbe8b4b9 605 EVENT_uwbScan = false;
pathfindr 57:066dfbe8b4b9 606 }
pathfindr 58:8d4a354816b1 607
pathfindr 58:8d4a354816b1 608 /*if (EVENT_resetACCInt) {
pathfindr 58:8d4a354816b1 609 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVENT_resetACCInt1");debug_exe();}
pathfindr 58:8d4a354816b1 610 EVENT_resetACCInt_time = 0;
pathfindr 58:8d4a354816b1 611 EVENT_resetACCInt = false;
pathfindr 58:8d4a354816b1 612 acc.clearIntFlag();
pathfindr 58:8d4a354816b1 613 }*/
pathfindr 57:066dfbe8b4b9 614
pathfindr 57:066dfbe8b4b9 615 //BLE START OR UPDATE
pathfindr 57:066dfbe8b4b9 616 if (RET_bleBroadcasting == false) {
pathfindr 57:066dfbe8b4b9 617 myble.init(bleSetupAdvertising);
pathfindr 57:066dfbe8b4b9 618 if (myble.hasInitialized()) {
pathfindr 57:066dfbe8b4b9 619 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Start");debug_exe();}
pathfindr 57:066dfbe8b4b9 620 bleUpdateAndAdvertise();
pathfindr 34:4493c9f6d707 621 }
pathfindr 6:388d3c7efdd9 622 }
pathfindr 57:066dfbe8b4b9 623 if (RET_BLEpacketUpdate == true) {
pathfindr 57:066dfbe8b4b9 624 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Update only");debug_exe();}
pathfindr 58:8d4a354816b1 625 bleUpdateAndAdvertise(); //this function also sets RET_BLEpacketUpdate = false
pathfindr 58:8d4a354816b1 626 }
pathfindr 57:066dfbe8b4b9 627
pathfindr 57:066dfbe8b4b9 628 //END
pathfindr 57:066dfbe8b4b9 629 RET_haveEventsToRun = false;
pathfindr 6:388d3c7efdd9 630 }
pathfindr 6:388d3c7efdd9 631
pathfindr 58:8d4a354816b1 632
pathfindr 58:8d4a354816b1 633
pathfindr 7:e9a19750700d 634 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 635 // MAIN
pathfindr 7:e9a19750700d 636 //------------------------------------------------------------------------------
pathfindr 50:a94e70c00fff 637 int main() {
pathfindr 24:c161db07557f 638 //INIT
pathfindr 51:9078e6928412 639 LED1off();
pathfindr 51:9078e6928412 640 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 641 watchdog.configure(400.0); //6.6 mins //Do not set to less than 4500ms or can cause issues with softdevice
pathfindr 24:c161db07557f 642 RTCticker.attach(&RTCtick, 1.0);
pathfindr 51:9078e6928412 643 LPtimer.start();
pathfindr 34:4493c9f6d707 644 button.fall(&buttonPress);
pathfindr 24:c161db07557f 645 button.rise(&buttonRelease);
pathfindr 58:8d4a354816b1 646 accInt1.rise(&accInt1ISR);
pathfindr 57:066dfbe8b4b9 647 //read_app_data_from_flash(&app_data);
pathfindr 58:8d4a354816b1 648 acc_configForMotionInt();
pathfindr 57:066dfbe8b4b9 649 firstRun();
pathfindr 58:8d4a354816b1 650 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Ready\n");debug_exe();
pathfindr 13:29f67f256709 651
pathfindr 34:4493c9f6d707 652 //MAIN LOOP
pathfindr 52:bd7678eade77 653 while(true) {
pathfindr 39:f767b8037475 654 RET_asleep = false;
pathfindr 58:8d4a354816b1 655 //LED2on(30);
pathfindr 58:8d4a354816b1 656
pathfindr 58:8d4a354816b1 657
pathfindr 58:8d4a354816b1 658 while(1) {
pathfindr 58:8d4a354816b1 659 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"UWB SCAN START\n");debug_exe();
pathfindr 58:8d4a354816b1 660 uwbScan();
pathfindr 58:8d4a354816b1 661 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"UWB SCAN END\n");debug_exe();
pathfindr 58:8d4a354816b1 662 nrf_configureForSleep();
pathfindr 58:8d4a354816b1 663 ThisThread::sleep_for(1000);
pathfindr 58:8d4a354816b1 664 }
pathfindr 58:8d4a354816b1 665
pathfindr 58:8d4a354816b1 666
pathfindr 58:8d4a354816b1 667 while(1) {
pathfindr 58:8d4a354816b1 668 acc_updateOrientation();
pathfindr 58:8d4a354816b1 669 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"X:%d Y:%d D:%d\n",RET_accX,RET_accY,RET_accZ);debug_exe();
pathfindr 58:8d4a354816b1 670 ThisThread::sleep_for(20);
pathfindr 58:8d4a354816b1 671 }
pathfindr 40:4270e09e59f2 672
pathfindr 42:f482f4cdb319 673 //STATE ENGINE
pathfindr 9:b0a1535b8ef2 674 mainStateEngine();
pathfindr 51:9078e6928412 675
pathfindr 34:4493c9f6d707 676 //LOG FIRST RUN - BOOTLOADER COMMS
pathfindr 34:4493c9f6d707 677 if (RET_coldBoot) {
pathfindr 57:066dfbe8b4b9 678 //recordFirmwareAsValid();
pathfindr 34:4493c9f6d707 679 RET_coldBoot = 0;
pathfindr 34:4493c9f6d707 680 }
pathfindr 51:9078e6928412 681
pathfindr 57:066dfbe8b4b9 682 //DEBUGGING OFF TIMER
pathfindr 57:066dfbe8b4b9 683 if(RET_debug){
pathfindr 58:8d4a354816b1 684 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"TIME:%d\n",RET_RTCunixtime);debug_exe();
pathfindr 57:066dfbe8b4b9 685 if (RET_RTCunixtime > RET_debug_offat) {
pathfindr 57:066dfbe8b4b9 686 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"DEBUGGING OFF\n");debug_exe();
pathfindr 57:066dfbe8b4b9 687 RET_debug = false;
pathfindr 52:bd7678eade77 688 }
pathfindr 57:066dfbe8b4b9 689 }
pathfindr 57:066dfbe8b4b9 690
pathfindr 9:b0a1535b8ef2 691 //PRE-SLEEP ACTIONS
pathfindr 58:8d4a354816b1 692 acc_configForMotionInt();
pathfindr 57:066dfbe8b4b9 693 watchdogKick();
pathfindr 57:066dfbe8b4b9 694 //SLEEP
pathfindr 50:a94e70c00fff 695 nrf_configureForSleep();
pathfindr 34:4493c9f6d707 696 NRFuart_uninit();
pathfindr 39:f767b8037475 697 RET_asleep = true;
pathfindr 58:8d4a354816b1 698 //LED1off();
pathfindr 26:fa3579737329 699 mainthread.wait(DEFAULT_SLEEP_FRAME);
pathfindr 34:4493c9f6d707 700 }
pathfindr 7:e9a19750700d 701 }