init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Committer:
pathfindr
Date:
Fri Aug 09 14:22:21 2019 +0000
Revision:
56:efd9f5613549
Parent:
55:0914bfcedcf8
Child:
57:066dfbe8b4b9
35 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 51:9078e6928412 9 /*
pathfindr 51:9078e6928412 10 TO DO
pathfindr 51:9078e6928412 11 STOP FRASH WRITE FROM CRASHING IF THERE IS A PROBLEM
pathfindr 51:9078e6928412 12 */
pathfindr 51:9078e6928412 13
pathfindr 21:e0b866630c27 14 //------------------------------------------------------------------------------
pathfindr 37:505ef618f06c 15 //FUNCTION PROTOTYPES - NEED TO ADD ALL OF THE MISSING ONES
pathfindr 0:94b743e06998 16 //------------------------------------------------------------------------------
pathfindr 45:6c7f5b556d74 17 //should really add these - will just add as and when needed for now
pathfindr 48:64b1613941d5 18 void event_activity_tx();
pathfindr 51:9078e6928412 19 void event_location_tx(bool failsafe);
pathfindr 52:bd7678eade77 20 #if BLE_ENABLED
pathfindr 52:bd7678eade77 21 void bleShutdown();
pathfindr 52:bd7678eade77 22 #endif
pathfindr 0:94b743e06998 23
pathfindr 0:94b743e06998 24 //------------------------------------------------------------------------------
pathfindr 36:8e359069192b 25 // GLOBALS
pathfindr 51:9078e6928412 26 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 27 char* GLOBAL_defaultApi = "b:gps2";
pathfindr 52:bd7678eade77 28 bool GLOBAL_accel_healthy = false;
pathfindr 52:bd7678eade77 29 bool GLOBAL_motionStopFlagTriggered = false;
pathfindr 52:bd7678eade77 30 bool GLOBAL_needToConfigureLis3dh = false;
pathfindr 52:bd7678eade77 31 bool GLOBAL_registeredOnNetwork = false;
pathfindr 52:bd7678eade77 32 bool GLOBAL_modemOn = false;
pathfindr 52:bd7678eade77 33 bool GLOBAL_LEDSequenceinProgress = false;
pathfindr 52:bd7678eade77 34 time_t GLOBAL_wakeTime = 0;
pathfindr 44:061509d1b38c 35 char GLOBAL_exceptionString[30];
pathfindr 54:2840f2d50734 36 char GLOBAL_exceptionStringRetainedUntilSuccess[10];
pathfindr 52:bd7678eade77 37 char GLOBAL_debug_buffer[DEBUG_BUFFERSIZE];
pathfindr 55:0914bfcedcf8 38 char GLOBAL_failed_broadcasts[5][160];
pathfindr 55:0914bfcedcf8 39 bool GLOBAL_failed_broadcast_slots[5];
pathfindr 52:bd7678eade77 40 char GLOBAL_GPSlocString_prev[70];
pathfindr 52:bd7678eade77 41 bool GLOBAL_have_GPSlocString_prev = false;
pathfindr 34:4493c9f6d707 42
pathfindr 48:64b1613941d5 43 //SETTINGS
pathfindr 52:bd7678eade77 44 int RET_setting_firmware = 0;
pathfindr 52:bd7678eade77 45 uint32_t RET_setting_minimumupdate_hrs = 0;
pathfindr 52:bd7678eade77 46 uint8_t RET_setting_location_mode = DEFAULT_LOCATION_MODE;
pathfindr 52:bd7678eade77 47 uint8_t RET_setting_location_accuracy = DEFAULT_LOCATION_ACCURACY;
pathfindr 52:bd7678eade77 48 uint32_t RET_setting_location_tx_interval_mins = DEFAULT_LOCATION_TX_INTERVAL_MINS;
pathfindr 52:bd7678eade77 49 uint32_t RET_setting_location_tx_failsafe_hrs = DEFAULT_LOCATION_TX_FAILSAFE_HRS;
pathfindr 54:2840f2d50734 50 uint32_t RET_location_failsafe_seconds_max = (DEFAULT_LOCATION_TX_FAILSAFE_HRS * 3600);
pathfindr 52:bd7678eade77 51 uint16_t RET_setting_location_timeout = DEFAULT_LOCATION_TIMEOUT;
pathfindr 52:bd7678eade77 52 uint32_t RET_setting_activity_tx_interval_hrs = 0;
pathfindr 52:bd7678eade77 53 uint8_t RET_setting_activity_mode = 1;
pathfindr 52:bd7678eade77 54 uint32_t RET_setting_environmental_tx_interval_mins = 0;
pathfindr 52:bd7678eade77 55 uint16_t RET_setting_motion_g = DEFAULT_MOTION_G;
pathfindr 52:bd7678eade77 56 time_t RET_setting_motion_start_seconds = DEFAULT_MOTION_START_SECONDS;
pathfindr 52:bd7678eade77 57 time_t RET_setting_motion_stop_seconds = DEFAULT_MOTION_STOP_SECONDS;
pathfindr 52:bd7678eade77 58 uint16_t RET_setting_impact_g = 0;
pathfindr 52:bd7678eade77 59 uint8_t RET_setting_impact_alert = 0;
pathfindr 52:bd7678eade77 60 uint16_t RET_setting_connection_timeout = DEFAULT_CONNECTION_TIMEOUT;
pathfindr 52:bd7678eade77 61 uint16_t RET_setting_beacon_interval_seconds = 0;
pathfindr 52:bd7678eade77 62 uint8_t RET_setting_beacon_scan = 0;
pathfindr 13:29f67f256709 63 //STATE
pathfindr 51:9078e6928412 64 char RET_pf_identifier[7];
pathfindr 52:bd7678eade77 65 uint8_t RET_coldBoot = 1;
pathfindr 52:bd7678eade77 66 bool RET_asleep = false;
pathfindr 52:bd7678eade77 67 bool RET_busy = false;
pathfindr 52:bd7678eade77 68 time_t RET_RTCunixtime = 0;
pathfindr 52:bd7678eade77 69 bool RET_haveSettings = false;
pathfindr 52:bd7678eade77 70 uint8_t RET_state = STATE_SETUP;
pathfindr 52:bd7678eade77 71 uint8_t RET_state_prev = RET_state;
pathfindr 52:bd7678eade77 72 uint8_t RET_buttonPressCount = 0;
pathfindr 52:bd7678eade77 73 time_t RET_buttonPressTime = 0;
pathfindr 52:bd7678eade77 74 time_t RET_buttonReleaseTime = 0;
pathfindr 52:bd7678eade77 75 time_t RET_buttonReleaseTime_prev = 0;
pathfindr 52:bd7678eade77 76 time_t RET_buttonHoldTime = 0;
pathfindr 52:bd7678eade77 77 time_t RET_SetupRunAt = 0;
pathfindr 52:bd7678eade77 78 time_t RET_SettingsGotAt = 0;
pathfindr 52:bd7678eade77 79 bool RET_setupInProgress = false;
pathfindr 52:bd7678eade77 80 bool RET_force2G = DEFAULT_FORCE2G;
pathfindr 52:bd7678eade77 81 bool RET_watchdogfired = false;
pathfindr 52:bd7678eade77 82 bool RET_receivedNewSettings = false;
pathfindr 52:bd7678eade77 83 uint32_t RET_GPSFailCount = 0;
pathfindr 52:bd7678eade77 84 uint32_t RET_NetworkFailCount = 0;
pathfindr 54:2840f2d50734 85 bool RET_NetworkFailFlag = false;
pathfindr 52:bd7678eade77 86 bool RET_debug = true;
pathfindr 52:bd7678eade77 87 time_t RET_debug_offat = 0;
pathfindr 52:bd7678eade77 88 float RET_voltage = 0.0;
pathfindr 52:bd7678eade77 89 float RET_temperature = 0.0;
pathfindr 53:c6942af186d7 90 float RET_humidity = 0.0;
pathfindr 52:bd7678eade77 91 float RET_temperature_max = -999.0; //Within broadcast frame. Set inital value to low
pathfindr 52:bd7678eade77 92 float RET_temperature_min = 999.0; //Within broadcase frame. Set inital value to high
pathfindr 52:bd7678eade77 93 uint32_t RET_modemBrownOutCountInSession = 0;
pathfindr 54:2840f2d50734 94 time_t RET_lastTxTime = 0;
pathfindr 16:3bf5f1a5f869 95 //MOTION STATE
pathfindr 52:bd7678eade77 96 bool RET_motionTriggeredinFrame = false;
pathfindr 52:bd7678eade77 97 bool RET_motionStateOnInLocTXInterval = false;
pathfindr 52:bd7678eade77 98 time_t RET_motionStartTime = 0;
pathfindr 52:bd7678eade77 99 time_t RET_motionStopTime = 0;
pathfindr 52:bd7678eade77 100 bool RET_motionPendingOnState = false;
pathfindr 52:bd7678eade77 101 bool RET_motionPendingOffState = false;
pathfindr 52:bd7678eade77 102 bool RET_motionState = false;
pathfindr 52:bd7678eade77 103 float RET_motionTotalActivityHours = 0.0f;
pathfindr 52:bd7678eade77 104 float RET_motionTotalActivityHoursSincePost = 0.0f;
pathfindr 52:bd7678eade77 105 time_t RET_motionFrameStart = 0;
pathfindr 45:6c7f5b556d74 106 char RET_activityData[ACTIVITY_BUFFERSIZE];
pathfindr 16:3bf5f1a5f869 107 //IMPACT
pathfindr 52:bd7678eade77 108 bool RET_impactTriggered = 0;
pathfindr 19:22261767c87a 109 //EVENTS LOGGING
pathfindr 52:bd7678eade77 110 time_t RET_eventTime_location_log = 0;
pathfindr 52:bd7678eade77 111 time_t RET_eventTime_environmental_log = 0;
pathfindr 19:22261767c87a 112 //EVENTS TX
pathfindr 52:bd7678eade77 113 time_t RET_eventTime_location_tx = 0;
pathfindr 52:bd7678eade77 114 time_t RET_eventTime_location_failsafe_tx = 0;
pathfindr 54:2840f2d50734 115 time_t RET_location_failsafe_seconds_count = 0;
pathfindr 52:bd7678eade77 116 time_t RET_eventTime_environmental_tx = 0;
pathfindr 52:bd7678eade77 117 time_t RET_eventTime_activity_tx = 0;
pathfindr 52:bd7678eade77 118 time_t RET_eventTime_wakeFromDormant = 0;
pathfindr 52:bd7678eade77 119 //BLE
pathfindr 54:2840f2d50734 120 bool RET_bleBroadcasting = false;
pathfindr 54:2840f2d50734 121 uint8_t RET_bleAdv_flags = 0;
pathfindr 54:2840f2d50734 122 char RET_closestLocationTag_id[17];
pathfindr 54:2840f2d50734 123 int RET_closestLocationTag_rssi = 999;
pathfindr 54:2840f2d50734 124 int RET_closestBT04Tag_rssi = 999;
pathfindr 54:2840f2d50734 125 bool RET_locationTag_present = false;
pathfindr 54:2840f2d50734 126 bool RET_detector_present = false;
pathfindr 54:2840f2d50734 127 const uint8_t bleAdv_motionTriggeredinFrame_flag = 0b01000000;
pathfindr 54:2840f2d50734 128 const uint8_t bleAdv_motionState_flag = 0b00100000;
pathfindr 54:2840f2d50734 129 const uint8_t bleAdv_impact_flag = 0b00010000;
pathfindr 54:2840f2d50734 130 #pragma pack(1)
pathfindr 54:2840f2d50734 131 struct bleData_t {
pathfindr 54:2840f2d50734 132 uint16_t applicationSpecificId;
pathfindr 54:2840f2d50734 133 uint8_t firmware;
pathfindr 54:2840f2d50734 134 uint8_t flags;
pathfindr 54:2840f2d50734 135 uint16_t voltage;
pathfindr 54:2840f2d50734 136 uint8_t buttonpresses;
pathfindr 54:2840f2d50734 137 int16_t temperature;
pathfindr 54:2840f2d50734 138 uint8_t humidity;
pathfindr 54:2840f2d50734 139 uint8_t lux;
pathfindr 54:2840f2d50734 140 int8_t accel_x;
pathfindr 54:2840f2d50734 141 int8_t accel_y;
pathfindr 54:2840f2d50734 142 int8_t accel_z;
pathfindr 54:2840f2d50734 143 /*char id_1; //cant use this and local name as it pushes us over size limit
pathfindr 54:2840f2d50734 144 char id_2;
pathfindr 54:2840f2d50734 145 char id_3;
pathfindr 54:2840f2d50734 146 char id_4;
pathfindr 54:2840f2d50734 147 char id_5;
pathfindr 54:2840f2d50734 148 char id_6;*/
pathfindr 54:2840f2d50734 149 };
pathfindr 54:2840f2d50734 150 #pragma pack()
pathfindr 0:94b743e06998 151 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 152 //GPIO
pathfindr 9:b0a1535b8ef2 153 //------------------------------------------------------------------------------
pathfindr 34:4493c9f6d707 154 InterruptIn button(PN_IN_BUTTON);
pathfindr 9:b0a1535b8ef2 155
pathfindr 9:b0a1535b8ef2 156 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 157 //PERIPHERALS
pathfindr 0:94b743e06998 158 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 159 #if BLE_ENABLED
pathfindr 52:bd7678eade77 160 BLE myble;
pathfindr 52:bd7678eade77 161 #endif
pathfindr 52:bd7678eade77 162 WatchdogTimer watchdog;
pathfindr 34:4493c9f6d707 163 LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK);
pathfindr 52:bd7678eade77 164 SI7060 si7060(PN_I2C_SDA, PN_I2C_SCL);
pathfindr 34:4493c9f6d707 165 Modem modem(PN_GSM_PWR_KEY, PN_VREG_EN, PN_GSM_WAKE_DISABLE);
pathfindr 37:505ef618f06c 166 LowPowerTicker RTCticker;
pathfindr 51:9078e6928412 167 LowPowerTimer LPtimer;
pathfindr 9:b0a1535b8ef2 168
pathfindr 9:b0a1535b8ef2 169 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 170 //SEMAPHORES
pathfindr 9:b0a1535b8ef2 171 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 172 Semaphore mainthread;
pathfindr 9:b0a1535b8ef2 173
pathfindr 9:b0a1535b8ef2 174 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 175 // LOW LEVEL FUNCS
pathfindr 34:4493c9f6d707 176 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 177 void watchdogKick() {
pathfindr 52:bd7678eade77 178 watchdog.kick();
pathfindr 52:bd7678eade77 179 }
pathfindr 51:9078e6928412 180 void set_8bit_flag(uint8_t& flags, uint8_t flag) {
pathfindr 51:9078e6928412 181 flags |= flag;
pathfindr 51:9078e6928412 182 }
pathfindr 51:9078e6928412 183 bool get_8bit_flag(uint8_t& flags, uint8_t flag) {
pathfindr 51:9078e6928412 184 bool result = (flags & flag);
pathfindr 51:9078e6928412 185 return result;
pathfindr 51:9078e6928412 186 }
pathfindr 51:9078e6928412 187 void clr_8bit_flag(uint8_t& flags, uint8_t flag) {
pathfindr 51:9078e6928412 188 flags &= ~flag;
pathfindr 51:9078e6928412 189 }
pathfindr 50:a94e70c00fff 190 void nrf_configureForSleep(){
pathfindr 50:a94e70c00fff 191 //Disable SPI pins to reduce power
pathfindr 50:a94e70c00fff 192 //nrf_gpio_cfg_input(PN_SPI_MOSI, NRF_GPIO_PIN_NOPULL); //Don't need this one
pathfindr 34:4493c9f6d707 193 nrf_gpio_cfg_input(PN_SPI_MISO, NRF_GPIO_PIN_NOPULL);
pathfindr 50:a94e70c00fff 194
pathfindr 50:a94e70c00fff 195 //disable modem control lines
pathfindr 50:a94e70c00fff 196 nrf_gpio_cfg_input(PN_GSM_PWR_KEY, NRF_GPIO_PIN_NOPULL);
pathfindr 50:a94e70c00fff 197 nrf_gpio_cfg_input(PN_GSM_WAKE_DISABLE, NRF_GPIO_PIN_NOPULL);
pathfindr 50:a94e70c00fff 198
pathfindr 50:a94e70c00fff 199 //TWI0
pathfindr 52:bd7678eade77 200 NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
pathfindr 50:a94e70c00fff 201 *(volatile uint32_t *)0x40003FFC = 0;
pathfindr 50:a94e70c00fff 202 *(volatile uint32_t *)0x40003FFC;
pathfindr 50:a94e70c00fff 203 *(volatile uint32_t *)0x40003FFC = 1;
pathfindr 50:a94e70c00fff 204 //TWI1
pathfindr 52:bd7678eade77 205 NRF_TWI1->ENABLE=TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
pathfindr 50:a94e70c00fff 206 *(volatile uint32_t *)0x40004FFC = 0;
pathfindr 50:a94e70c00fff 207 *(volatile uint32_t *)0x40004FFC;
pathfindr 50:a94e70c00fff 208 *(volatile uint32_t *)0x40004FFC = 1;
pathfindr 6:388d3c7efdd9 209 }
pathfindr 19:22261767c87a 210 void setState(uint8_t state) {
pathfindr 19:22261767c87a 211 RET_state_prev = RET_state;
pathfindr 19:22261767c87a 212 RET_state = state;
pathfindr 22:810425eb76e1 213 }
pathfindr 51:9078e6928412 214 void dumpSettings() {
pathfindr 51:9078e6928412 215 if(RET_debug){
pathfindr 34:4493c9f6d707 216 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_RTCunixtime:%u", RET_RTCunixtime);debug_exe();
pathfindr 34:4493c9f6d707 217 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_firmware:%d", RET_setting_firmware);debug_exe();
pathfindr 34:4493c9f6d707 218 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_minimumupdate_hrs:%d", RET_setting_minimumupdate_hrs);debug_exe();
pathfindr 34:4493c9f6d707 219 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_state:%d", RET_state);debug_exe();
pathfindr 34:4493c9f6d707 220 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_location_mode:%d", RET_setting_location_mode);debug_exe();
pathfindr 34:4493c9f6d707 221 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_location_accuracy:%d", RET_setting_location_accuracy);debug_exe();
pathfindr 34:4493c9f6d707 222 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_location_tx_interval_mins:%d", RET_setting_location_tx_interval_mins);debug_exe();
pathfindr 54:2840f2d50734 223 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_location_failsafe_seconds_max:%d", RET_location_failsafe_seconds_max);debug_exe();
pathfindr 34:4493c9f6d707 224 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_location_timeout:%d", RET_setting_location_timeout);debug_exe();
pathfindr 34:4493c9f6d707 225 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_activity_tx_interval_hrs:%d", RET_setting_activity_tx_interval_hrs);debug_exe();
pathfindr 45:6c7f5b556d74 226 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_activity_mode:%d", RET_setting_activity_mode);debug_exe();
pathfindr 34:4493c9f6d707 227 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_environmental_tx_interval_mins:%d", RET_setting_environmental_tx_interval_mins);debug_exe();
pathfindr 34:4493c9f6d707 228 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_motion_g:%d", RET_setting_motion_g);debug_exe();
pathfindr 34:4493c9f6d707 229 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_motion_start_seconds:%d", RET_setting_motion_start_seconds);debug_exe();
pathfindr 34:4493c9f6d707 230 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_motion_stop_seconds:%d", RET_setting_motion_stop_seconds);debug_exe();
pathfindr 34:4493c9f6d707 231 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_impact_g:%d", RET_setting_impact_g);debug_exe();
pathfindr 34:4493c9f6d707 232 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_impact_alert:%d", RET_setting_impact_alert);debug_exe();
pathfindr 34:4493c9f6d707 233 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_connection_timeout:%d", RET_setting_connection_timeout);debug_exe();
pathfindr 34:4493c9f6d707 234 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_beacon_interval_seconds:%d", RET_setting_beacon_interval_seconds);debug_exe();
pathfindr 34:4493c9f6d707 235 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_setting_beacon_scan:%d", RET_setting_beacon_scan);debug_exe();
pathfindr 51:9078e6928412 236 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RET_pf_identifier:%s", RET_pf_identifier);debug_exe();
pathfindr 34:4493c9f6d707 237 }
pathfindr 24:c161db07557f 238 }
pathfindr 45:6c7f5b556d74 239 void recordFirmwareAsValid() {
pathfindr 52:bd7678eade77 240 #if BLE_ENABLED
pathfindr 52:bd7678eade77 241 bleShutdown();
pathfindr 52:bd7678eade77 242 #endif
pathfindr 51:9078e6928412 243 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RECORD FW %d AS VALID...", FW_VERSION);debug_exe();
pathfindr 45:6c7f5b556d74 244 read_app_data_from_flash(&app_data);
pathfindr 45:6c7f5b556d74 245 bool write_app_data_to_flash_execute = false;
pathfindr 45:6c7f5b556d74 246 if(get_flag(&app_data, app_execution_flag) == true) {
pathfindr 45:6c7f5b556d74 247 clr_flag(&app_data, app_execution_flag);
pathfindr 45:6c7f5b556d74 248 clr_flag(&app_data, first_run_flag);
pathfindr 45:6c7f5b556d74 249 write_app_data_to_flash_execute = true;
pathfindr 45:6c7f5b556d74 250 }
pathfindr 45:6c7f5b556d74 251 if(app_data.current_firmware_version != FW_VERSION) {
pathfindr 45:6c7f5b556d74 252 app_data.current_firmware_version = FW_VERSION;
pathfindr 45:6c7f5b556d74 253 app_data.target_firmware_version = FW_VERSION;
pathfindr 45:6c7f5b556d74 254 write_app_data_to_flash_execute = true;
pathfindr 45:6c7f5b556d74 255 }
pathfindr 45:6c7f5b556d74 256 if (write_app_data_to_flash_execute) {
pathfindr 45:6c7f5b556d74 257 write_app_data_to_flash(&app_data);
pathfindr 51:9078e6928412 258 //read back to check
pathfindr 51:9078e6928412 259 ThisThread::sleep_for(200); //need this delay
pathfindr 51:9078e6928412 260 read_app_data_from_flash(&app_data);
pathfindr 51:9078e6928412 261 if (app_data.current_firmware_version == FW_VERSION) {
pathfindr 51:9078e6928412 262 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "OK");debug_exe();
pathfindr 51:9078e6928412 263 } else {
pathfindr 51:9078e6928412 264 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "FAIL - IS BLE SHUTDOWN?");debug_exe();
pathfindr 51:9078e6928412 265 }
pathfindr 51:9078e6928412 266 }
pathfindr 45:6c7f5b556d74 267 }
pathfindr 51:9078e6928412 268 void updateBatteryV() {
pathfindr 19:22261767c87a 269 NRF52_SAADC batteryIn;
pathfindr 19:22261767c87a 270 batteryIn.addChannel(9); // vdd for battery
pathfindr 19:22261767c87a 271 batteryIn.calibrate();
pathfindr 49:15ddd84ec9fa 272 //get initial reading, first reading is always low
pathfindr 49:15ddd84ec9fa 273 batteryIn.updateData(); batteryIn.getData()[0];
pathfindr 49:15ddd84ec9fa 274 float voltage_accumulator = 0.0;
pathfindr 49:15ddd84ec9fa 275 uint8_t readings = 0;
pathfindr 49:15ddd84ec9fa 276 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 277 batteryIn.updateData();
pathfindr 49:15ddd84ec9fa 278 voltage_accumulator += (batteryIn.getData()[0])*(1.0/1024.0)*3.60;
pathfindr 49:15ddd84ec9fa 279 readings ++;
pathfindr 19:22261767c87a 280 }
pathfindr 51:9078e6928412 281 RET_voltage = (voltage_accumulator / (float)readings);
pathfindr 22:810425eb76e1 282 }
pathfindr 52:bd7678eade77 283 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 284 // TEMPERATURE
pathfindr 52:bd7678eade77 285 //------------------------------------------------------------------------------
pathfindr 22:810425eb76e1 286 float getTemperature() {
pathfindr 52:bd7678eade77 287 return si7060.getTemperature();
pathfindr 19:22261767c87a 288 }
pathfindr 51:9078e6928412 289 void updateTemperatures() {
pathfindr 52:bd7678eade77 290 if (RET_temperature == 0.0) {RET_temperature = getTemperature();}
pathfindr 51:9078e6928412 291 RET_temperature = (RET_temperature + (getTemperature() - RET_temperature) * 0.25f); //smoothed
pathfindr 52:bd7678eade77 292 if (RET_temperature < RET_temperature_min) {RET_temperature_min = RET_temperature;}
pathfindr 52:bd7678eade77 293 if (RET_temperature > RET_temperature_max) {RET_temperature_max = RET_temperature;}
pathfindr 51:9078e6928412 294 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Temp:%.1f Min:%.1f Max:%.1f",RET_temperature,RET_temperature_min,RET_temperature_max);debug_exe();}
pathfindr 51:9078e6928412 295 }
pathfindr 27:fa76f5a08195 296 void addToExceptionString(char* value) {
pathfindr 45:6c7f5b556d74 297 if(strstr(GLOBAL_exceptionString, value) == false){
pathfindr 52:bd7678eade77 298 snprintf(GLOBAL_exceptionString+strlen(GLOBAL_exceptionString),sizeof(GLOBAL_exceptionString),".%s",value);
pathfindr 45:6c7f5b556d74 299 }
pathfindr 27:fa76f5a08195 300 }
pathfindr 54:2840f2d50734 301 void addToExceptionStringRetainedUntilSuccess(char* value) {
pathfindr 54:2840f2d50734 302 if(strstr(GLOBAL_exceptionStringRetainedUntilSuccess, value) == false){
pathfindr 54:2840f2d50734 303 snprintf(GLOBAL_exceptionStringRetainedUntilSuccess+strlen(GLOBAL_exceptionStringRetainedUntilSuccess),sizeof(GLOBAL_exceptionStringRetainedUntilSuccess),".%s",value);
pathfindr 54:2840f2d50734 304 }
pathfindr 54:2840f2d50734 305 }
pathfindr 51:9078e6928412 306 void resetTemperatures() {
pathfindr 51:9078e6928412 307 RET_temperature_max = -999.0; //Within broadcast frame. Set inital value to low
pathfindr 51:9078e6928412 308 RET_temperature_min = 999.0; //Within broadcase frame. Set inital value to high
pathfindr 51:9078e6928412 309 }
pathfindr 19:22261767c87a 310 //------------------------------------------------------------------------------
pathfindr 19:22261767c87a 311 // USER BUTTON HANDLING
pathfindr 19:22261767c87a 312 //------------------------------------------------------------------------------
pathfindr 19:22261767c87a 313 void buttonPress() {
pathfindr 51:9078e6928412 314 RET_buttonPressTime = LPtimer.read_ms();
pathfindr 19:22261767c87a 315 }
pathfindr 19:22261767c87a 316 void buttonRelease() {
pathfindr 51:9078e6928412 317 //debounce catch
pathfindr 51:9078e6928412 318 RET_buttonReleaseTime = LPtimer.read_ms();
pathfindr 51:9078e6928412 319 if ((RET_buttonReleaseTime - RET_buttonReleaseTime_prev) > 75) {
pathfindr 51:9078e6928412 320 RET_buttonPressCount ++;
pathfindr 51:9078e6928412 321 RET_buttonHoldTime = (RET_buttonReleaseTime - RET_buttonPressTime);
pathfindr 51:9078e6928412 322 //temporarily enable debugging and dump settings
pathfindr 51:9078e6928412 323 RET_debug = true;
pathfindr 52:bd7678eade77 324 RET_debug_offat = (RET_RTCunixtime + 3600); //debug on for 1hr
pathfindr 51:9078e6928412 325 }
pathfindr 51:9078e6928412 326 RET_buttonReleaseTime_prev = RET_buttonReleaseTime;
pathfindr 19:22261767c87a 327 }
pathfindr 19:22261767c87a 328 //------------------------------------------------------------------------------
pathfindr 19:22261767c87a 329 // RTC TICKER
pathfindr 51:9078e6928412 330 //------------------------------------------------------------------------------
pathfindr 54:2840f2d50734 331 bool RET_flash_busy = false;
pathfindr 9:b0a1535b8ef2 332 void RTCtick() {
pathfindr 51:9078e6928412 333 //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 334 RET_RTCunixtime += 1;
pathfindr 51:9078e6928412 335
pathfindr 51:9078e6928412 336 //button logic
pathfindr 51:9078e6928412 337 if (RET_buttonHoldTime >= 4000 && RET_buttonHoldTime <= 10000) {
pathfindr 49:15ddd84ec9fa 338 RET_buttonHoldTime = 0;
pathfindr 49:15ddd84ec9fa 339 RET_buttonPressCount = 0;
pathfindr 51:9078e6928412 340 if (RET_state != STATE_DORMANT) {
pathfindr 51:9078e6928412 341 RET_state_prev = RET_state;
pathfindr 51:9078e6928412 342 RET_state = STATE_TURNOFF;
pathfindr 51:9078e6928412 343 } else {
pathfindr 51:9078e6928412 344 RET_state = STATE_TURNON;
pathfindr 51:9078e6928412 345 }
pathfindr 49:15ddd84ec9fa 346 mainthread.release();
pathfindr 51:9078e6928412 347 } else if (RET_buttonHoldTime >= 14000 && RET_buttonHoldTime <= 30000) {
pathfindr 49:15ddd84ec9fa 348 RET_buttonHoldTime = 0;
pathfindr 49:15ddd84ec9fa 349 RET_buttonPressCount = 0;
pathfindr 49:15ddd84ec9fa 350 RET_state = STATE_SCORCHEDEARTH;
pathfindr 49:15ddd84ec9fa 351 mainthread.release();
pathfindr 49:15ddd84ec9fa 352 } else {
pathfindr 51:9078e6928412 353 if((LPtimer.read_ms() - RET_buttonReleaseTime) > 1500 && RET_buttonPressCount > 0) {
pathfindr 49:15ddd84ec9fa 354 if(RET_busy == true) {
pathfindr 49:15ddd84ec9fa 355 //RTCtick_ledflash_count = 4;// 2 flashes
pathfindr 54:2840f2d50734 356 RET_flash_busy = true;
pathfindr 49:15ddd84ec9fa 357 } else {
pathfindr 49:15ddd84ec9fa 358 RET_SetupRunAt = 0; //allow setup to run again
pathfindr 49:15ddd84ec9fa 359 switch (RET_buttonPressCount) { //double catches to help with debounce
pathfindr 49:15ddd84ec9fa 360 case 1 :
pathfindr 50:a94e70c00fff 361 if(RET_state_prev != RET_state) {RET_state_prev = RET_state;}
pathfindr 49:15ddd84ec9fa 362 RET_state = STATE_BUTTONPRESS1;
pathfindr 49:15ddd84ec9fa 363 RET_buttonPressCount = 0;
pathfindr 49:15ddd84ec9fa 364 mainthread.release();
pathfindr 49:15ddd84ec9fa 365 break;
pathfindr 49:15ddd84ec9fa 366 case 3 :
pathfindr 50:a94e70c00fff 367 if(RET_state_prev != RET_state) {RET_state_prev = RET_state;}
pathfindr 49:15ddd84ec9fa 368 RET_state = STATE_BUTTONPRESS3;
pathfindr 49:15ddd84ec9fa 369 RET_buttonPressCount = 0;
pathfindr 49:15ddd84ec9fa 370 mainthread.release();
pathfindr 49:15ddd84ec9fa 371 break;
pathfindr 49:15ddd84ec9fa 372 case 5 :
pathfindr 50:a94e70c00fff 373 if(RET_state_prev != RET_state) {RET_state_prev = RET_state;}
pathfindr 49:15ddd84ec9fa 374 RET_state = STATE_BUTTONPRESS5;
pathfindr 49:15ddd84ec9fa 375 RET_buttonPressCount = 0;
pathfindr 49:15ddd84ec9fa 376 mainthread.release();
pathfindr 49:15ddd84ec9fa 377 break;
pathfindr 49:15ddd84ec9fa 378 default :
pathfindr 49:15ddd84ec9fa 379 //do nothing
pathfindr 49:15ddd84ec9fa 380 break;
pathfindr 39:f767b8037475 381 }
pathfindr 9:b0a1535b8ef2 382 }
pathfindr 51:9078e6928412 383 RET_buttonPressCount = 0;
pathfindr 9:b0a1535b8ef2 384 }
pathfindr 49:15ddd84ec9fa 385 }
pathfindr 52:bd7678eade77 386
pathfindr 54:2840f2d50734 387 if (RET_busy && RET_flash_busy) {
pathfindr 54:2840f2d50734 388 led1 = !led1;
pathfindr 54:2840f2d50734 389 } else {
pathfindr 54:2840f2d50734 390 RET_flash_busy = false;
pathfindr 54:2840f2d50734 391 }
pathfindr 54:2840f2d50734 392 /*
pathfindr 52:bd7678eade77 393 if(RET_debug && GLOBAL_LEDSequenceinProgress == false){
pathfindr 52:bd7678eade77 394 if (RET_motionState) {
pathfindr 52:bd7678eade77 395 led1 = 0;
pathfindr 52:bd7678eade77 396 } else {
pathfindr 52:bd7678eade77 397 led1 = 1;
pathfindr 52:bd7678eade77 398 }
pathfindr 52:bd7678eade77 399 }
pathfindr 54:2840f2d50734 400 */
pathfindr 9:b0a1535b8ef2 401 }
pathfindr 52:bd7678eade77 402 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 403 // GLOBALS
pathfindr 52:bd7678eade77 404 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 405 void resetSessionVars() {
pathfindr 34:4493c9f6d707 406 GLOBAL_accel_healthy = false;
pathfindr 52:bd7678eade77 407 RET_motionTriggeredinFrame = false;
pathfindr 52:bd7678eade77 408 RET_modemBrownOutCountInSession = 0;
pathfindr 53:c6942af186d7 409 RET_humidity = 99.0f;
pathfindr 34:4493c9f6d707 410 }
pathfindr 38:476a9b5629a1 411 void healthCheck() {
pathfindr 39:f767b8037475 412 //check for watchdog fire
pathfindr 39:f767b8037475 413 if (RET_watchdogfired == true) {
pathfindr 39:f767b8037475 414 addToExceptionString("WD");
pathfindr 39:f767b8037475 415 RET_watchdogfired = false;
pathfindr 54:2840f2d50734 416 RET_haveSettings = false;
pathfindr 39:f767b8037475 417 }
pathfindr 41:07e41dbd5304 418 //check clock
pathfindr 41:07e41dbd5304 419 if(RET_haveSettings == true) {
pathfindr 54:2840f2d50734 420 if (RET_RTCunixtime < 1547678732 || RET_RTCunixtime > 1900000000) {
pathfindr 41:07e41dbd5304 421 RET_haveSettings = false;
pathfindr 54:2840f2d50734 422 addToExceptionString("CI");
pathfindr 41:07e41dbd5304 423 }
pathfindr 41:07e41dbd5304 424 }
pathfindr 41:07e41dbd5304 425 //check that we have a reasonable time to loc
pathfindr 41:07e41dbd5304 426 if(RET_haveSettings == true) {
pathfindr 41:07e41dbd5304 427 //check location tx delta is set
pathfindr 41:07e41dbd5304 428 if (RET_eventTime_location_tx == 0) {
pathfindr 56:efd9f5613549 429 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ERR:eventTime_location_tx is 0");debug_exe();}
pathfindr 41:07e41dbd5304 430 RET_haveSettings = false;
pathfindr 56:efd9f5613549 431 addToExceptionString("E3");
pathfindr 41:07e41dbd5304 432 }
pathfindr 54:2840f2d50734 433 //check location failsafe tx is less than 2 weeks
pathfindr 54:2840f2d50734 434 if (RET_location_failsafe_seconds_max > (336 * 3600)) {
pathfindr 56:efd9f5613549 435 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ERR:RET_location_failsafe_seconds_max too big");debug_exe();}
pathfindr 41:07e41dbd5304 436 RET_haveSettings = false;
pathfindr 56:efd9f5613549 437 addToExceptionString("E2");
pathfindr 41:07e41dbd5304 438 }
pathfindr 41:07e41dbd5304 439 }
pathfindr 56:efd9f5613549 440 //check that we have had an attempted post within 2x failsafe time
pathfindr 56:efd9f5613549 441 long long unixtime = RET_RTCunixtime;
pathfindr 56:efd9f5613549 442 long long lasttxtime = RET_lastTxTime;
pathfindr 56:efd9f5613549 443 long long timeSinceTX = (unixtime - lasttxtime);
pathfindr 56:efd9f5613549 444 if (RET_lastTxTime > 0 && RET_location_failsafe_seconds_max > 0 && timeSinceTX > (RET_location_failsafe_seconds_max * 2)) {
pathfindr 54:2840f2d50734 445 RET_haveSettings = false;
pathfindr 54:2840f2d50734 446 addToExceptionString("E1");
pathfindr 54:2840f2d50734 447 }
pathfindr 54:2840f2d50734 448 //if have settings false then rerun setup
pathfindr 41:07e41dbd5304 449 if (RET_haveSettings == false) {
pathfindr 41:07e41dbd5304 450 setState(STATE_SETUP);
pathfindr 41:07e41dbd5304 451 }
pathfindr 38:476a9b5629a1 452 }
pathfindr 24:c161db07557f 453
pathfindr 22:810425eb76e1 454 bool selfTest() {
pathfindr 22:810425eb76e1 455 int test_count = 0;
pathfindr 22:810425eb76e1 456 int test_pass = 0;
pathfindr 22:810425eb76e1 457
pathfindr 8:7351f8c4cd60 458 //Accelerometer
pathfindr 22:810425eb76e1 459 test_count ++;
pathfindr 8:7351f8c4cd60 460 uint8_t lis3dh_id;
pathfindr 8:7351f8c4cd60 461 lis3dh.LIS3DH_GetWHO_AM_I(&lis3dh_id);
pathfindr 27:fa76f5a08195 462 if (lis3dh_id == 51) {
pathfindr 43:7b232f03628f 463 GLOBAL_accel_healthy = true;
pathfindr 27:fa76f5a08195 464 test_pass ++;
pathfindr 27:fa76f5a08195 465 } else {
pathfindr 43:7b232f03628f 466 GLOBAL_accel_healthy = false;
pathfindr 52:bd7678eade77 467 addToExceptionString("AF");
pathfindr 27:fa76f5a08195 468 }
pathfindr 22:810425eb76e1 469
pathfindr 22:810425eb76e1 470 //Result
pathfindr 22:810425eb76e1 471 if (test_count == test_pass) {
pathfindr 22:810425eb76e1 472 return true;
pathfindr 22:810425eb76e1 473 } else {
pathfindr 22:810425eb76e1 474 return false;
pathfindr 9:b0a1535b8ef2 475 }
pathfindr 9:b0a1535b8ef2 476 }
pathfindr 52:bd7678eade77 477 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 478 // BLE FUNCS
pathfindr 52:bd7678eade77 479 //------------------------------------------------------------------------------
pathfindr 52:bd7678eade77 480 #if BLE_ENABLED
pathfindr 52:bd7678eade77 481 void bleBuildData(bleData_t &bleData)
pathfindr 52:bd7678eade77 482 {
pathfindr 52:bd7678eade77 483 bleData.applicationSpecificId = BLE_SERVICEID_GPSPLUS;
pathfindr 52:bd7678eade77 484 bleData.firmware = FW_VERSION;
pathfindr 52:bd7678eade77 485 //set flags
pathfindr 52:bd7678eade77 486 if (RET_motionTriggeredinFrame) {
pathfindr 52:bd7678eade77 487 set_8bit_flag(RET_bleAdv_flags, bleAdv_motionTriggeredinFrame_flag);
pathfindr 52:bd7678eade77 488 } else {
pathfindr 52:bd7678eade77 489 clr_8bit_flag(RET_bleAdv_flags, bleAdv_motionTriggeredinFrame_flag);
pathfindr 52:bd7678eade77 490 }
pathfindr 52:bd7678eade77 491 if (RET_motionState) {
pathfindr 52:bd7678eade77 492 set_8bit_flag(RET_bleAdv_flags, bleAdv_motionState_flag);
pathfindr 52:bd7678eade77 493 } else {
pathfindr 52:bd7678eade77 494 clr_8bit_flag(RET_bleAdv_flags, bleAdv_motionState_flag);
pathfindr 52:bd7678eade77 495 }
pathfindr 52:bd7678eade77 496 clr_8bit_flag(RET_bleAdv_flags, bleAdv_impact_flag);
pathfindr 52:bd7678eade77 497 bleData.flags = RET_bleAdv_flags;
pathfindr 52:bd7678eade77 498 bleData.voltage = uint16_t(RET_voltage * 100);
pathfindr 52:bd7678eade77 499 bleData.temperature = uint16_t(getTemperature() * 10);
pathfindr 52:bd7678eade77 500 bleData.humidity = 0xFF;
pathfindr 52:bd7678eade77 501 bleData.lux = 0xFF;
pathfindr 52:bd7678eade77 502 bleData.accel_x = 0xFF;
pathfindr 52:bd7678eade77 503 bleData.accel_y = 0xFF;
pathfindr 52:bd7678eade77 504 bleData.accel_z = 0xFF;
pathfindr 52:bd7678eade77 505 /*
pathfindr 52:bd7678eade77 506 bleData.id_1 = RET_pf_identifier[0]; //dont use this just stick it in the local name
pathfindr 52:bd7678eade77 507 bleData.id_2 = RET_pf_identifier[1];
pathfindr 52:bd7678eade77 508 bleData.id_3 = RET_pf_identifier[2];
pathfindr 52:bd7678eade77 509 bleData.id_4 = RET_pf_identifier[3];
pathfindr 52:bd7678eade77 510 bleData.id_5 = RET_pf_identifier[4];
pathfindr 52:bd7678eade77 511 bleData.id_6 = RET_pf_identifier[5];
pathfindr 52:bd7678eade77 512 */
pathfindr 52:bd7678eade77 513 }
pathfindr 52:bd7678eade77 514 void bleUpdateAndAdvertise(void)
pathfindr 52:bd7678eade77 515 {
pathfindr 54:2840f2d50734 516 if (RET_setting_beacon_interval_seconds < 2) {RET_setting_beacon_interval_seconds = 2;}
pathfindr 52:bd7678eade77 517 int AdvertisingInterval = (RET_setting_beacon_interval_seconds * 1000);
pathfindr 52:bd7678eade77 518 bleData_t bleData;
pathfindr 52:bd7678eade77 519 bleBuildData(bleData);
pathfindr 52:bd7678eade77 520 myble.gap().stopAdvertising();
pathfindr 52:bd7678eade77 521 myble.gap().setTxPower(DEFAULT_BEACON_POWER); // set tx power,valid values are -40, -20, -16, -12, -8, -4, 0, 4
pathfindr 52:bd7678eade77 522 myble.gap().accumulateAdvertisingPayloadTxPower(DEFAULT_BEACON_POWER); // (accepted values are -40, -30, -20, -16, -12, -8, -4, 0, and 4 dBm)
pathfindr 52:bd7678eade77 523 myble.gap().setAdvertisingInterval(AdvertisingInterval);
pathfindr 52:bd7678eade77 524 myble.gap().updateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 52:bd7678eade77 525 //myble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 52:bd7678eade77 526 myble.gap().startAdvertising();
pathfindr 52:bd7678eade77 527 RET_bleBroadcasting = true;
pathfindr 52:bd7678eade77 528 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Adv Start");debug_exe();}
pathfindr 52:bd7678eade77 529 }
pathfindr 52:bd7678eade77 530 void bleSetupAdvertising(BLE::InitializationCompleteCallbackContext *params)
pathfindr 52:bd7678eade77 531 {
pathfindr 52:bd7678eade77 532 if (RET_pf_identifier[0] != 0x00 && RET_pf_identifier[1] != 0x00 && RET_pf_identifier[2] != 0x00) {
pathfindr 52:bd7678eade77 533 bleData_t bleData;
pathfindr 52:bd7678eade77 534 bleBuildData(bleData);
pathfindr 52:bd7678eade77 535 char localname[6];
pathfindr 52:bd7678eade77 536 memcpy(localname,RET_pf_identifier,6);
pathfindr 52:bd7678eade77 537 myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE );
pathfindr 52:bd7678eade77 538 myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)localname, sizeof(localname));
pathfindr 52:bd7678eade77 539 myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 52:bd7678eade77 540 //myble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&bleData, sizeof(bleData_t));
pathfindr 52:bd7678eade77 541 myble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
pathfindr 52:bd7678eade77 542 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Setup...");debug_exe();}
pathfindr 52:bd7678eade77 543 }
pathfindr 52:bd7678eade77 544 }
pathfindr 52:bd7678eade77 545 void bleStopAdvertising(void)
pathfindr 52:bd7678eade77 546 {
pathfindr 52:bd7678eade77 547 myble.gap().stopAdvertising();
pathfindr 52:bd7678eade77 548 RET_bleBroadcasting = false;
pathfindr 52:bd7678eade77 549 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE Adv Stop");debug_exe();}
pathfindr 52:bd7678eade77 550 }
pathfindr 54:2840f2d50734 551 int blecount = 0;
pathfindr 52:bd7678eade77 552 void bleAdvertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
pathfindr 52:bd7678eade77 553 struct AdvertisingData_t {
pathfindr 52:bd7678eade77 554 uint8_t length;
pathfindr 52:bd7678eade77 555 GapAdvertisingData::DataType_t dataType;
pathfindr 52:bd7678eade77 556 uint8_t data[0];
pathfindr 52:bd7678eade77 557 } PACKED;
pathfindr 52:bd7678eade77 558 struct bleData_t {
pathfindr 52:bd7678eade77 559 uint16_t applicationSpecificId;
pathfindr 52:bd7678eade77 560 } PACKED;
pathfindr 52:bd7678eade77 561
pathfindr 52:bd7678eade77 562 //LOOKING FOR (SIAEC BETA)
pathfindr 52:bd7678eade77 563 //14f64b977c250854
pathfindr 52:bd7678eade77 564 //442ce31996801546
pathfindr 52:bd7678eade77 565
pathfindr 52:bd7678eade77 566 char beta_location_tag_0[17] = {'4','1','1','7','6','9','0','5','6','4','6','8','3','f','6','8',0x00}; //bens
pathfindr 52:bd7678eade77 567 char beta_location_tag_1[17] = {'1','4','f','6','4','b','9','7','7','c','2','5','0','8','5','4',0x00}; //singapore
pathfindr 52:bd7678eade77 568 char beta_location_tag_2[17] = {'4','4','2','c','e','3','1','9','9','6','8','0','1','5','4','6',0x00}; //singapore
pathfindr 52:bd7678eade77 569
pathfindr 52:bd7678eade77 570 //Portal demos
pathfindr 52:bd7678eade77 571 char beta_location_tag_3[17] = {'1','5','f','c','6','d','d','5','c','3','7','f','1','f','4','a',0x00};
pathfindr 52:bd7678eade77 572 char beta_location_tag_4[17] = {'b','a','a','e','c','d','6','8','b','d','7','e','e','a','6','5',0x00};
pathfindr 52:bd7678eade77 573 char beta_location_tag_5[17] = {'7','e','4','b','7','8','e','0','f','a','3','3','0','8','a','0',0x00};
pathfindr 52:bd7678eade77 574 char beta_location_tag_6[17] = {'e','1','1','3','c','d','e','a','a','e','f','f','1','4','d','9',0x00};
pathfindr 52:bd7678eade77 575 char beta_location_tag_7[17] = {'8','c','9','2','4','5','f','f','0','c','f','a','b','9','2','f',0x00};
pathfindr 52:bd7678eade77 576 char beta_location_tag_8[17] = {'0','7','e','9','9','1','d','3','b','e','b','6','4','0','4','8',0x00};
pathfindr 52:bd7678eade77 577 char beta_location_tag_9[17] = {'9','5','6','3','a','0','8','6','2','1','e','8','e','c','1','4',0x00};
pathfindr 52:bd7678eade77 578
pathfindr 54:2840f2d50734 579 //RR demos
pathfindr 54:2840f2d50734 580 char beta_location_tag_10[17] = {'3','3','0','2','2','c','9','f','0','b','1','8','5','3','a','c',0x00};
pathfindr 54:2840f2d50734 581 char beta_location_tag_11[17] = {'2','5','6','c','4','0','2','b','d','c','1','4','2','5','2','7',0x00};
pathfindr 54:2840f2d50734 582 char beta_location_tag_12[17] = {'8','e','9','f','0','e','c','1','4','0','e','1','2','e','e','9',0x00};
pathfindr 54:2840f2d50734 583 char beta_location_tag_13[17] = {'8','d','6','b','8','5','e','b','8','4','6','e','e','0','0','e',0x00};
pathfindr 54:2840f2d50734 584 char beta_location_tag_14[17] = {'9','3','2','7','4','c','b','9','e','4','6','d','b','6','7','6',0x00};
pathfindr 54:2840f2d50734 585 char beta_location_tag_15[17] = {'1','a','e','3','0','7','7','f','8','f','3','a','f','7','c','1',0x00};
pathfindr 54:2840f2d50734 586 char beta_location_tag_16[17] = {'f','f','d','5','a','2','e','a','4','4','9','2','e','d','a','c',0x00};
pathfindr 54:2840f2d50734 587 char beta_location_tag_17[17] = {'f','0','e','f','2','d','8','b','f','7','6','1','3','a','1','d',0x00};
pathfindr 54:2840f2d50734 588 char beta_location_tag_18[17] = {'e','e','7','6','4','c','8','5','3','4','6','b','9','5','f','2',0x00};
pathfindr 54:2840f2d50734 589 char beta_location_tag_19[17] = {'b','b','0','3','6','7','d','b','d','a','5','b','a','5','a','5',0x00};
pathfindr 54:2840f2d50734 590
pathfindr 54:2840f2d50734 591 blecount ++;
pathfindr 54:2840f2d50734 592
pathfindr 52:bd7678eade77 593 //Search for the manufacturer specific data with matching application-ID
pathfindr 52:bd7678eade77 594 AdvertisingData_t *pAdvData;
pathfindr 52:bd7678eade77 595 for (size_t index = 0; index < params->advertisingDataLen; index += (pAdvData->length + 1)) {
pathfindr 52:bd7678eade77 596 pAdvData = (AdvertisingData_t *)&params->advertisingData[index];
pathfindr 52:bd7678eade77 597 const bleData_t *pbleData = (const bleData_t *)pAdvData->data;
pathfindr 52:bd7678eade77 598
pathfindr 52:bd7678eade77 599 //ESTIMOTE BEACON
pathfindr 52:bd7678eade77 600 //example data 020104 0303 9afe1716 9afe 22 02c887042a33f9f0 00efebc60146f8ffffffff //spaces just to show identifier
pathfindr 52:bd7678eade77 601
pathfindr 52:bd7678eade77 602 //BLE TYPE SWITCH
pathfindr 52:bd7678eade77 603 switch(pbleData->applicationSpecificId) {
pathfindr 52:bd7678eade77 604 case BLE_SERVICEID_PFBEACON1 :
pathfindr 52:bd7678eade77 605 {
pathfindr 52:bd7678eade77 606 char beacon_identifier[17];
pathfindr 52:bd7678eade77 607 snprintf(beacon_identifier, sizeof(beacon_identifier), "%02x%02x%02x%02x%02x%02x%02x%02x",
pathfindr 52:bd7678eade77 608 params->advertisingData[12],
pathfindr 52:bd7678eade77 609 params->advertisingData[13],
pathfindr 52:bd7678eade77 610 params->advertisingData[14],
pathfindr 52:bd7678eade77 611 params->advertisingData[15],
pathfindr 52:bd7678eade77 612 params->advertisingData[16],
pathfindr 52:bd7678eade77 613 params->advertisingData[17],
pathfindr 52:bd7678eade77 614 params->advertisingData[18],
pathfindr 52:bd7678eade77 615 params->advertisingData[19]);
pathfindr 52:bd7678eade77 616 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), " Mac: [%02x%02x%02x%02x%02x%02x], rssi: %d, AType: %u, S: %04x, Id: %s",params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],params->rssi, params->type, pbleData->applicationSpecificId, beacon_identifier);debug_exe();}
pathfindr 52:bd7678eade77 617 //check to see if its one of the two location beta beacons we are looking for...
pathfindr 52:bd7678eade77 618 if (strcmp(beacon_identifier, beta_location_tag_0) == 0
pathfindr 52:bd7678eade77 619 || strcmp(beacon_identifier, beta_location_tag_1) == 0
pathfindr 52:bd7678eade77 620 || strcmp(beacon_identifier, beta_location_tag_2) == 0
pathfindr 52:bd7678eade77 621 || strcmp(beacon_identifier, beta_location_tag_3) == 0
pathfindr 52:bd7678eade77 622 || strcmp(beacon_identifier, beta_location_tag_4) == 0
pathfindr 52:bd7678eade77 623 || strcmp(beacon_identifier, beta_location_tag_5) == 0
pathfindr 52:bd7678eade77 624 || strcmp(beacon_identifier, beta_location_tag_6) == 0
pathfindr 52:bd7678eade77 625 || strcmp(beacon_identifier, beta_location_tag_7) == 0
pathfindr 52:bd7678eade77 626 || strcmp(beacon_identifier, beta_location_tag_8) == 0
pathfindr 52:bd7678eade77 627 || strcmp(beacon_identifier, beta_location_tag_9) == 0
pathfindr 54:2840f2d50734 628 || strcmp(beacon_identifier, beta_location_tag_10) == 0
pathfindr 54:2840f2d50734 629 || strcmp(beacon_identifier, beta_location_tag_11) == 0
pathfindr 54:2840f2d50734 630 || strcmp(beacon_identifier, beta_location_tag_12) == 0
pathfindr 54:2840f2d50734 631 || strcmp(beacon_identifier, beta_location_tag_13) == 0
pathfindr 54:2840f2d50734 632 || strcmp(beacon_identifier, beta_location_tag_14) == 0
pathfindr 54:2840f2d50734 633 || strcmp(beacon_identifier, beta_location_tag_15) == 0
pathfindr 54:2840f2d50734 634 || strcmp(beacon_identifier, beta_location_tag_16) == 0
pathfindr 54:2840f2d50734 635 || strcmp(beacon_identifier, beta_location_tag_17) == 0
pathfindr 54:2840f2d50734 636 || strcmp(beacon_identifier, beta_location_tag_18) == 0
pathfindr 54:2840f2d50734 637 || strcmp(beacon_identifier, beta_location_tag_19) == 0
pathfindr 52:bd7678eade77 638 ) {
pathfindr 52:bd7678eade77 639 //dump advertising data
pathfindr 52:bd7678eade77 640 //for (unsigned index = 0; index < params->advertisingDataLen; index++) { if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "%02x",params->advertisingData[index]);debug_exe(false);}}
pathfindr 52:bd7678eade77 641 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), " MATCH");debug_exe();}
pathfindr 52:bd7678eade77 642 int tag_rssi = params->rssi * -1; //to convert to positive number
pathfindr 52:bd7678eade77 643 if (tag_rssi < RET_closestLocationTag_rssi) {
pathfindr 52:bd7678eade77 644 RET_closestLocationTag_rssi = tag_rssi;
pathfindr 52:bd7678eade77 645 memcpy(RET_closestLocationTag_id, beacon_identifier, sizeof(RET_closestLocationTag_id));
pathfindr 52:bd7678eade77 646 RET_locationTag_present = true;
pathfindr 54:2840f2d50734 647 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Location Tag: %s, rssi: %d",RET_closestLocationTag_id, RET_closestLocationTag_rssi);debug_exe();}
pathfindr 52:bd7678eade77 648 }
pathfindr 52:bd7678eade77 649 }
pathfindr 52:bd7678eade77 650 break;
pathfindr 52:bd7678eade77 651 }
pathfindr 52:bd7678eade77 652 case BLE_SERVICEID_BT04 :
pathfindr 52:bd7678eade77 653 {
pathfindr 53:c6942af186d7 654 //get serial
pathfindr 53:c6942af186d7 655 //char serial[9];
pathfindr 53:c6942af186d7 656 //snprintf(serial, sizeof(serial), "%02x%02x%02x%02x", params->advertisingData[11], params->advertisingData[12], params->advertisingData[13], params->advertisingData[14]);
pathfindr 53:c6942af186d7 657 //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Serial: %s", serial);debug_exe();}
pathfindr 53:c6942af186d7 658
pathfindr 53:c6942af186d7 659 //get battery
pathfindr 53:c6942af186d7 660 //int battery = params->advertisingData[15];
pathfindr 53:c6942af186d7 661 //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Battery: %i", battery);debug_exe();}
pathfindr 53:c6942af186d7 662
pathfindr 53:c6942af186d7 663 //get temperature positive
pathfindr 53:c6942af186d7 664 /*
pathfindr 53:c6942af186d7 665 bool temppositive = !(params->advertisingData[17] & 0b01000000);
pathfindr 53:c6942af186d7 666 float temperature =
pathfindr 53:c6942af186d7 667 (
pathfindr 53:c6942af186d7 668 ((params->advertisingData[17] & 0b00111111) << 8) |
pathfindr 53:c6942af186d7 669 ((params->advertisingData[18] & 0b11111111))
pathfindr 53:c6942af186d7 670 ) / 100.0;
pathfindr 53:c6942af186d7 671 if (!temppositive) temperature = -temperature;
pathfindr 53:c6942af186d7 672 //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Temp: %f", temperature);debug_exe();}
pathfindr 53:c6942af186d7 673 */
pathfindr 53:c6942af186d7 674
pathfindr 53:c6942af186d7 675 //get humidity
pathfindr 53:c6942af186d7 676 int tag_rssi = params->rssi * -1; //to convert to positive number
pathfindr 53:c6942af186d7 677 if (tag_rssi < RET_closestBT04Tag_rssi) {
pathfindr 53:c6942af186d7 678 RET_humidity =
pathfindr 53:c6942af186d7 679 (
pathfindr 53:c6942af186d7 680 ((params->advertisingData[19] & 0b01111111) << 8) |
pathfindr 53:c6942af186d7 681 ((params->advertisingData[20] & 0b11111111))
pathfindr 53:c6942af186d7 682 ) / 100.0;
pathfindr 54:2840f2d50734 683 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Humidity Tag Present: %f",RET_humidity);debug_exe();}
pathfindr 53:c6942af186d7 684 }
pathfindr 53:c6942af186d7 685 //rssi
pathfindr 53:c6942af186d7 686 //if(DEBUG_ON){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Rssi: %i", params->rssi);debug_exe();}
pathfindr 53:c6942af186d7 687
pathfindr 52:bd7678eade77 688 break;
pathfindr 52:bd7678eade77 689 }
pathfindr 52:bd7678eade77 690 case BLE_SERVICEID_PFDETECTOR1 :
pathfindr 52:bd7678eade77 691 {
pathfindr 52:bd7678eade77 692 char ble_advdata[100];
pathfindr 52:bd7678eade77 693 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 694 params->advertisingData[0],
pathfindr 52:bd7678eade77 695 params->advertisingData[1],
pathfindr 52:bd7678eade77 696 params->advertisingData[2],
pathfindr 52:bd7678eade77 697 params->advertisingData[3],
pathfindr 52:bd7678eade77 698 params->advertisingData[4],
pathfindr 52:bd7678eade77 699 params->advertisingData[5],
pathfindr 52:bd7678eade77 700 params->advertisingData[6],
pathfindr 52:bd7678eade77 701 params->advertisingData[7],
pathfindr 52:bd7678eade77 702 params->advertisingData[8],
pathfindr 52:bd7678eade77 703 params->advertisingData[9],
pathfindr 52:bd7678eade77 704 params->advertisingData[10],
pathfindr 52:bd7678eade77 705 params->advertisingData[11],
pathfindr 52:bd7678eade77 706 params->advertisingData[12],
pathfindr 52:bd7678eade77 707 params->advertisingData[13],
pathfindr 52:bd7678eade77 708 params->advertisingData[14],
pathfindr 52:bd7678eade77 709 params->advertisingData[15],
pathfindr 52:bd7678eade77 710 params->advertisingData[16],
pathfindr 52:bd7678eade77 711 params->advertisingData[17],
pathfindr 52:bd7678eade77 712 params->advertisingData[18],
pathfindr 52:bd7678eade77 713 params->advertisingData[19],
pathfindr 52:bd7678eade77 714 params->advertisingData[20]);
pathfindr 52:bd7678eade77 715 //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 716 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Detector @rssi: %d",params->rssi);debug_exe();}
pathfindr 52:bd7678eade77 717 if (params->rssi >= -75) {
pathfindr 52:bd7678eade77 718 RET_detector_present = true;
pathfindr 52:bd7678eade77 719 }
pathfindr 52:bd7678eade77 720 break;
pathfindr 52:bd7678eade77 721 }
pathfindr 52:bd7678eade77 722 }
pathfindr 52:bd7678eade77 723 }
pathfindr 52:bd7678eade77 724 }
pathfindr 52:bd7678eade77 725 void bleConfigureScan(void)
pathfindr 52:bd7678eade77 726 {
pathfindr 52:bd7678eade77 727 //configure scan
pathfindr 54:2840f2d50734 728 myble.gap().setScanParams(200,200); //scan interval //scan window
pathfindr 52:bd7678eade77 729 myble.gap().startScan(bleAdvertisementCallback);
pathfindr 52:bd7678eade77 730 }
pathfindr 52:bd7678eade77 731 void bleStopScan(void)
pathfindr 52:bd7678eade77 732 {
pathfindr 52:bd7678eade77 733 myble.gap().stopScan();
pathfindr 52:bd7678eade77 734 }
pathfindr 52:bd7678eade77 735 void bleShutdown(void)
pathfindr 52:bd7678eade77 736 {
pathfindr 52:bd7678eade77 737 bleStopScan();
pathfindr 52:bd7678eade77 738 bleStopAdvertising();
pathfindr 52:bd7678eade77 739 myble.shutdown();
pathfindr 52:bd7678eade77 740 }
pathfindr 52:bd7678eade77 741 #endif
pathfindr 9:b0a1535b8ef2 742
pathfindr 9:b0a1535b8ef2 743 //------------------------------------------------------------------------------
pathfindr 9:b0a1535b8ef2 744 // MOTION FUNCS
pathfindr 9:b0a1535b8ef2 745 //------------------------------------------------------------------------------
pathfindr 48:64b1613941d5 746 bool checkMotion() {
pathfindr 51:9078e6928412 747 if (RET_haveSettings) { //NEED THIS AS THINGS GO FUNKY WITHOUT RTC TIME SET CORRECTLY
pathfindr 51:9078e6928412 748 if (lis3dh_int2) {
pathfindr 51:9078e6928412 749 RET_motionTriggeredinFrame = true;
pathfindr 51:9078e6928412 750 GLOBAL_needToConfigureLis3dh = true; //interrupt has fire so need to clear it
pathfindr 52:bd7678eade77 751 if(RET_debug) {
pathfindr 52:bd7678eade77 752 LED1on(100);
pathfindr 52:bd7678eade77 753 }
pathfindr 51:9078e6928412 754 if (!RET_motionPendingOnState) {
pathfindr 51:9078e6928412 755 RET_motionPendingOnState = true;
pathfindr 51:9078e6928412 756 RET_motionPendingOffState = false;
pathfindr 51:9078e6928412 757 // Log start motion time
pathfindr 51:9078e6928412 758 RET_motionStartTime = RET_RTCunixtime;
pathfindr 51:9078e6928412 759 }
pathfindr 51:9078e6928412 760 } else {
pathfindr 51:9078e6928412 761 RET_motionTriggeredinFrame = false;
pathfindr 51:9078e6928412 762 RET_motionPendingOnState = false;
pathfindr 51:9078e6928412 763 if (!RET_motionPendingOffState) {
pathfindr 51:9078e6928412 764 RET_motionPendingOffState = true;
pathfindr 51:9078e6928412 765 //log stop motion time
pathfindr 51:9078e6928412 766 RET_motionStopTime = RET_RTCunixtime;
pathfindr 51:9078e6928412 767 }
pathfindr 9:b0a1535b8ef2 768 }
pathfindr 51:9078e6928412 769 //calculate motion state
pathfindr 51:9078e6928412 770 if (RET_motionFrameStart == 0) {RET_motionFrameStart = RET_RTCunixtime;}
pathfindr 51:9078e6928412 771 if (RET_motionPendingOnState) {
pathfindr 51:9078e6928412 772 //check if above threshold
pathfindr 51:9078e6928412 773 time_t inMotionForSeconds = ((RET_RTCunixtime - RET_motionStartTime) + (DEFAULT_SLEEP_FRAME / 1000)); //Plus DEFAULT_SLEEP_FRAME as it should include frame time
pathfindr 52:bd7678eade77 774 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "M:%u",inMotionForSeconds);debug_exe();}
pathfindr 52:bd7678eade77 775 if (inMotionForSeconds >= RET_setting_motion_start_seconds) {
pathfindr 52:bd7678eade77 776 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "MotionOn");debug_exe();}
pathfindr 51:9078e6928412 777 RET_motionState = true;
pathfindr 52:bd7678eade77 778 RET_motionStateOnInLocTXInterval = true;
pathfindr 54:2840f2d50734 779 GLOBAL_have_GPSlocString_prev = false;
pathfindr 52:bd7678eade77 780 if (RET_motionState == false) { //If this is first after motionState 0
pathfindr 52:bd7678eade77 781 if (RET_setting_activity_mode == 2 && RET_setting_activity_tx_interval_hrs > 0) {
pathfindr 52:bd7678eade77 782 time_t epochOffsetMins = ((RET_RTCunixtime - RET_motionFrameStart) / 60);
pathfindr 52:bd7678eade77 783 sprintf(RET_activityData+strlen(RET_activityData),"1.%u!",epochOffsetMins);
pathfindr 52:bd7678eade77 784 }
pathfindr 45:6c7f5b556d74 785 }
pathfindr 23:a3b0ccf75ca5 786 }
pathfindr 9:b0a1535b8ef2 787 }
pathfindr 51:9078e6928412 788 if (RET_motionPendingOffState) {
pathfindr 51:9078e6928412 789 time_t noMotionForSeconds = ((RET_RTCunixtime - RET_motionStopTime) + (DEFAULT_SLEEP_FRAME / 1000)); //Plus DEFAULT_SLEEP_FRAME as it should include frame time
pathfindr 52:bd7678eade77 790 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "NM:%u",noMotionForSeconds);debug_exe();}
pathfindr 52:bd7678eade77 791 if (noMotionForSeconds >= RET_setting_motion_stop_seconds) {
pathfindr 52:bd7678eade77 792 if (RET_motionState == true) {
pathfindr 52:bd7678eade77 793 RET_motionPendingOffState = false;
pathfindr 52:bd7678eade77 794 RET_motionState = false;
pathfindr 52:bd7678eade77 795 GLOBAL_motionStopFlagTriggered = true;
pathfindr 52:bd7678eade77 796 //if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "MotionStop");debug_exe();}
pathfindr 52:bd7678eade77 797 if (RET_setting_activity_mode > 0 && RET_setting_activity_tx_interval_hrs > 0) {
pathfindr 52:bd7678eade77 798 RET_motionTotalActivityHoursSincePost += ((float(RET_motionStopTime)-float(RET_motionStartTime)) / 3600.0f);
pathfindr 52:bd7678eade77 799 RET_motionTotalActivityHours += RET_motionTotalActivityHoursSincePost;
pathfindr 52:bd7678eade77 800 if (RET_setting_activity_mode == 2) {
pathfindr 52:bd7678eade77 801 time_t epochOffsetMins = ((RET_RTCunixtime - RET_motionFrameStart) / 60);
pathfindr 52:bd7678eade77 802 sprintf(RET_activityData+strlen(RET_activityData),"0.%u!",epochOffsetMins);
pathfindr 52:bd7678eade77 803 }
pathfindr 51:9078e6928412 804 }
pathfindr 45:6c7f5b556d74 805 }
pathfindr 23:a3b0ccf75ca5 806 }
pathfindr 9:b0a1535b8ef2 807 }
pathfindr 9:b0a1535b8ef2 808 }
pathfindr 48:64b1613941d5 809 return RET_motionState;
pathfindr 8:7351f8c4cd60 810 }
pathfindr 8:7351f8c4cd60 811
pathfindr 14:9a54b1b65bc8 812 //------------------------------------------------------------------------------
pathfindr 14:9a54b1b65bc8 813 // UPDATE OPERATING SETTINGS
pathfindr 14:9a54b1b65bc8 814 //------------------------------------------------------------------------------
pathfindr 14:9a54b1b65bc8 815 bool saveSettings(char* settingsBuffer) {
pathfindr 18:22edaa7e74b1 816 int matchCount = 0;
pathfindr 19:22261767c87a 817 int critical_fail_count = 0;
pathfindr 32:dff4858bdf37 818 int TEMP_a = -1; time_t TEMP_b = 0; int TEMP_c = -1; int TEMP_d = -1; int TEMP_e = -1; int TEMP_f = -1; int TEMP_g = -1; int TEMP_h = -1; int TEMP_i = -1; int TEMP_j = -1;
pathfindr 51:9078e6928412 819 int TEMP_k = -1; int TEMP_l = -1; int TEMP_m = -1; int TEMP_n = -1; int TEMP_o = -1; int TEMP_p = -1; int TEMP_q = -1; int TEMP_r = -1; int TEMP_s = -1; int TEMP_t = -1; char TEMP_u[7];
pathfindr 50:a94e70c00fff 820
pathfindr 51:9078e6928412 821 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "RESP: %s",settingsBuffer);debug_exe();}
pathfindr 50:a94e70c00fff 822
pathfindr 51:9078e6928412 823 //exampple
pathfindr 51:9078e6928412 824 //+CUSD: 0,”1#a:12,b:1558020598,c:-1,d:-1,e:1,f:2,g:5,h:168,i:90,j:168,k:0,l:8,m:60,n:60,o:0,p:0,q:120,r:0,s:0,t:1,u:F859C1#”,15
pathfindr 51:9078e6928412 825
pathfindr 51:9078e6928412 826 if ( (matchCount = sscanf(settingsBuffer,"a:%d,b:%u,c:%d,d:%d,e:%d,f:%d,g:%d,h:%d,i:%d,j:%d,k:%d,l:%d,m:%d,n:%d,o:%d,p:%d,q:%d,r:%d,s:%d,t:%d,u:%s",
pathfindr 51:9078e6928412 827 &TEMP_a,&TEMP_b,&TEMP_c,&TEMP_d,&TEMP_e,&TEMP_f,&TEMP_g,&TEMP_h,&TEMP_i,&TEMP_j,&TEMP_k,&TEMP_l,&TEMP_m,&TEMP_n,&TEMP_o,&TEMP_p,&TEMP_q,&TEMP_r,&TEMP_s,&TEMP_t,&TEMP_u) ) > 0 ) {
pathfindr 48:64b1613941d5 828
pathfindr 51:9078e6928412 829 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "PARAMS: a:%d,b:%u,c:%d,d:%d,e:%d,f:%d,g:%d,h:%d,i:%d,j:%d,k:%d,l:%d,m:%d,n:%d,o:%d,p:%d,q:%d,r:%d,s:%d,t:%d,u:%s\n",
pathfindr 51:9078e6928412 830 TEMP_a,TEMP_b,TEMP_c,TEMP_d,TEMP_e,TEMP_f,TEMP_g,TEMP_h,TEMP_i,TEMP_j,TEMP_k,TEMP_l,TEMP_m,TEMP_n,TEMP_o,TEMP_p,TEMP_q,TEMP_r,TEMP_s,TEMP_t,TEMP_u);debug_exe();}
pathfindr 34:4493c9f6d707 831
pathfindr 54:2840f2d50734 832 if(TEMP_a > 0) { RET_setting_minimumupdate_hrs = TEMP_a; }
pathfindr 54:2840f2d50734 833 if(TEMP_b > 1552915630 && TEMP_b < 1900000000) {
pathfindr 50:a94e70c00fff 834 if (RET_RTCunixtime < 1552915630) {
pathfindr 50:a94e70c00fff 835 //assume this is first proper unixtime and set
pathfindr 50:a94e70c00fff 836 RET_RTCunixtime = TEMP_b;
pathfindr 50:a94e70c00fff 837 } else {
pathfindr 51:9078e6928412 838 //this is not a first unixtime, so check within safe range, convert to long long first to avoid -1 rollover issue
pathfindr 51:9078e6928412 839 long long unixtime_in = TEMP_b;
pathfindr 51:9078e6928412 840 long long unixtime_current = RET_RTCunixtime;
pathfindr 51:9078e6928412 841 if ((unixtime_in - unixtime_current) < 604800) { //allow 1 week difference
pathfindr 50:a94e70c00fff 842 RET_RTCunixtime = TEMP_b;
pathfindr 50:a94e70c00fff 843 } else {
pathfindr 50:a94e70c00fff 844 critical_fail_count++;
pathfindr 51:9078e6928412 845 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "unixtime too far ahead. C:%u N:%u",RET_RTCunixtime,TEMP_b);debug_exe();}
pathfindr 50:a94e70c00fff 846 }
pathfindr 50:a94e70c00fff 847 }
pathfindr 50:a94e70c00fff 848 } else {
pathfindr 50:a94e70c00fff 849 critical_fail_count++;
pathfindr 51:9078e6928412 850 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "unixtime too low");debug_exe();}
pathfindr 50:a94e70c00fff 851 }
pathfindr 54:2840f2d50734 852 if(TEMP_c > 0) { RET_setting_firmware = TEMP_c; } else { RET_setting_firmware = -1;}
pathfindr 54:2840f2d50734 853 if(TEMP_d > -1) { setState(TEMP_d); } else { setState(STATE_NORMAL);}
pathfindr 54:2840f2d50734 854 if(TEMP_e > 0) { RET_setting_location_mode = TEMP_e; }
pathfindr 52:bd7678eade77 855 if(RET_setting_location_mode > 4) {RET_setting_location_mode = DEFAULT_LOCATION_MODE;}
pathfindr 54:2840f2d50734 856 if(TEMP_f > 0) { RET_setting_location_accuracy = TEMP_f; }
pathfindr 34:4493c9f6d707 857 if(RET_setting_location_accuracy > 3) {RET_setting_location_accuracy = DEFAULT_LOCATION_ACCURACY;}
pathfindr 54:2840f2d50734 858 if(TEMP_g > 0) { RET_setting_location_tx_interval_mins = TEMP_g; }
pathfindr 54:2840f2d50734 859 if(TEMP_h > 0) { RET_setting_location_tx_failsafe_hrs = TEMP_h; }
pathfindr 34:4493c9f6d707 860 if(RET_setting_location_tx_failsafe_hrs > 504) {RET_setting_location_tx_failsafe_hrs = DEFAULT_LOCATION_TX_FAILSAFE_HRS;}
pathfindr 54:2840f2d50734 861 if(TEMP_i > 0) { RET_setting_location_timeout = TEMP_i; }
pathfindr 27:fa76f5a08195 862 if(RET_setting_location_timeout < 60 || RET_setting_location_timeout > 300) {RET_setting_location_timeout = DEFAULT_LOCATION_TIMEOUT;}
pathfindr 54:2840f2d50734 863 if(TEMP_j > -1) { RET_setting_activity_tx_interval_hrs = TEMP_j; }
pathfindr 54:2840f2d50734 864 if(TEMP_k > -1) { RET_setting_environmental_tx_interval_mins = TEMP_k; }
pathfindr 54:2840f2d50734 865 if(TEMP_l > 0) { RET_setting_motion_g = TEMP_l; }
pathfindr 43:7b232f03628f 866 if(RET_setting_motion_g < 4 || RET_setting_motion_g > 127) {RET_setting_motion_g = DEFAULT_MOTION_G;}
pathfindr 54:2840f2d50734 867 if(TEMP_m > -1) { RET_setting_motion_start_seconds = TEMP_m; }
pathfindr 54:2840f2d50734 868 if(TEMP_n > -1) { RET_setting_motion_stop_seconds = TEMP_n; }
pathfindr 54:2840f2d50734 869 if(TEMP_o > -1) { RET_setting_impact_g = TEMP_o; }
pathfindr 54:2840f2d50734 870 if(TEMP_p > -1) { RET_setting_impact_alert = TEMP_p; }
pathfindr 54:2840f2d50734 871 if(TEMP_q > -1) { RET_setting_connection_timeout = TEMP_q; }
pathfindr 47:cc6d4d0bf897 872 if(RET_setting_connection_timeout < 60 || RET_setting_connection_timeout > 240) { RET_setting_connection_timeout = DEFAULT_CONNECTION_TIMEOUT; }
pathfindr 54:2840f2d50734 873 if(TEMP_r > -1) { RET_setting_beacon_interval_seconds = TEMP_r; }
pathfindr 54:2840f2d50734 874 if(TEMP_s > -1) { RET_setting_beacon_scan = TEMP_s; }
pathfindr 54:2840f2d50734 875 if(TEMP_t > -1) { RET_setting_activity_mode = TEMP_t; }
pathfindr 51:9078e6928412 876 if(TEMP_u[0] != 0x00 && TEMP_u[1] != 0x00 && TEMP_u[2] != 0x00) { strcpy(RET_pf_identifier,TEMP_u); }
pathfindr 45:6c7f5b556d74 877
pathfindr 19:22261767c87a 878 if (critical_fail_count == 0) {
pathfindr 45:6c7f5b556d74 879 RET_receivedNewSettings = true;
pathfindr 51:9078e6928412 880 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "NEW SETTINGS");debug_exe();}
pathfindr 40:4270e09e59f2 881 dumpSettings();
pathfindr 32:dff4858bdf37 882 RET_haveSettings = true;
pathfindr 34:4493c9f6d707 883 GLOBAL_needToConfigureLis3dh = true;
pathfindr 32:dff4858bdf37 884 RET_SettingsGotAt = RET_RTCunixtime;
pathfindr 37:505ef618f06c 885 //check for firmware update
pathfindr 38:476a9b5629a1 886 if (RET_setting_firmware > 0 && RET_setting_firmware != FW_VERSION) {
pathfindr 48:64b1613941d5 887 //Broadcast any activity data we have before fw update
pathfindr 48:64b1613941d5 888 event_activity_tx();
pathfindr 48:64b1613941d5 889 //prep for FW update
pathfindr 52:bd7678eade77 890 #if BLE_ENABLED
pathfindr 52:bd7678eade77 891 bleShutdown();
pathfindr 52:bd7678eade77 892 #endif
pathfindr 37:505ef618f06c 893 read_app_data_from_flash(&app_data);
pathfindr 45:6c7f5b556d74 894 clr_flag(&app_data, app_execution_flag);
pathfindr 45:6c7f5b556d74 895 clr_flag(&app_data, first_run_flag);
pathfindr 45:6c7f5b556d74 896 app_data.current_firmware_version = FW_VERSION;
pathfindr 37:505ef618f06c 897 app_data.target_firmware_version = RET_setting_firmware;
pathfindr 37:505ef618f06c 898 write_app_data_to_flash(&app_data);
pathfindr 51:9078e6928412 899 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "OTA\n");debug_exe();}
pathfindr 48:64b1613941d5 900 ThisThread::sleep_for(200);
pathfindr 37:505ef618f06c 901 system_reset();
pathfindr 37:505ef618f06c 902 }
pathfindr 19:22261767c87a 903 return true;
pathfindr 19:22261767c87a 904 } else {
pathfindr 44:061509d1b38c 905 addToExceptionString("SCF");
pathfindr 19:22261767c87a 906 return false;
pathfindr 19:22261767c87a 907 }
pathfindr 14:9a54b1b65bc8 908 } else {
pathfindr 44:061509d1b38c 909 addToExceptionString("SPE");
pathfindr 15:7aad9a7f970c 910 return false;
pathfindr 14:9a54b1b65bc8 911 }
pathfindr 14:9a54b1b65bc8 912 }
pathfindr 24:c161db07557f 913
pathfindr 41:07e41dbd5304 914 //------------------------------------------------------------------------------
pathfindr 41:07e41dbd5304 915 // SET EVENT TIMES
pathfindr 41:07e41dbd5304 916 //------------------------------------------------------------------------------
pathfindr 41:07e41dbd5304 917 void setEventTime_Location() {
pathfindr 20:5404841fdd2b 918 if(RET_setting_location_tx_interval_mins > 0) {
pathfindr 20:5404841fdd2b 919 RET_eventTime_location_tx = (RET_RTCunixtime + (RET_setting_location_tx_interval_mins * 60));
pathfindr 51:9078e6928412 920 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVTSET - LOC TX @ %u, MODE %d",RET_eventTime_location_tx, RET_setting_location_mode);debug_exe();}
pathfindr 20:5404841fdd2b 921 }
pathfindr 54:2840f2d50734 922 if(RET_setting_location_tx_failsafe_hrs > 0 && RET_setting_location_tx_failsafe_hrs <= 168) {
pathfindr 54:2840f2d50734 923 RET_location_failsafe_seconds_max = (RET_setting_location_tx_failsafe_hrs * 3600);
pathfindr 54:2840f2d50734 924 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVTSET - LOC FS TX %u s",RET_location_failsafe_seconds_max);debug_exe();}
pathfindr 54:2840f2d50734 925 } else {
pathfindr 54:2840f2d50734 926 RET_location_failsafe_seconds_max = (DEFAULT_LOCATION_TX_FAILSAFE_HRS * 3600);
pathfindr 20:5404841fdd2b 927 }
pathfindr 54:2840f2d50734 928 RET_eventTime_location_failsafe_tx = (RET_RTCunixtime + RET_location_failsafe_seconds_max);
pathfindr 41:07e41dbd5304 929 }
pathfindr 41:07e41dbd5304 930 void setEventTime_Activity() {
pathfindr 22:810425eb76e1 931 if(RET_setting_activity_tx_interval_hrs > 0) {
pathfindr 22:810425eb76e1 932 RET_eventTime_activity_tx = (RET_RTCunixtime + (RET_setting_activity_tx_interval_hrs * 3600));
pathfindr 51:9078e6928412 933 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVTSET - ACT TX @ %u",RET_eventTime_activity_tx);debug_exe();}
pathfindr 20:5404841fdd2b 934 }
pathfindr 41:07e41dbd5304 935 }
pathfindr 41:07e41dbd5304 936 void setEventTime_Environmental() {
pathfindr 20:5404841fdd2b 937 if(RET_eventTime_environmental_tx > 0) {
pathfindr 20:5404841fdd2b 938 RET_eventTime_environmental_tx = (RET_RTCunixtime + (RET_setting_environmental_tx_interval_mins * 60));
pathfindr 51:9078e6928412 939 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "EVTSET - ENV TX @ %u",RET_eventTime_environmental_tx);debug_exe();}
pathfindr 34:4493c9f6d707 940 }
pathfindr 20:5404841fdd2b 941 }
pathfindr 41:07e41dbd5304 942 void setEventTimes() {
pathfindr 43:7b232f03628f 943 //SET ALL EVENT TIMES
pathfindr 41:07e41dbd5304 944 setEventTime_Location();
pathfindr 41:07e41dbd5304 945 setEventTime_Activity();
pathfindr 41:07e41dbd5304 946 setEventTime_Environmental();
pathfindr 41:07e41dbd5304 947 }
pathfindr 13:29f67f256709 948
pathfindr 13:29f67f256709 949 //------------------------------------------------------------------------------
pathfindr 40:4270e09e59f2 950 // ERROR LOG
pathfindr 40:4270e09e59f2 951 //------------------------------------------------------------------------------
pathfindr 40:4270e09e59f2 952 void sendErrorLog(char* error) {
pathfindr 51:9078e6928412 953 updateBatteryV();
pathfindr 40:4270e09e59f2 954 int timetaken = (RET_RTCunixtime - GLOBAL_wakeTime);
pathfindr 40:4270e09e59f2 955 char bytestosend[100];
pathfindr 40:4270e09e59f2 956 memset(bytestosend,0x00,sizeof(bytestosend));
pathfindr 52:bd7678eade77 957 snprintf(bytestosend,sizeof(bytestosend),"(%s,a:log,f:%d,v:%.2f,e:%d,z:%s.%s,s:0)\0",GLOBAL_defaultApi,FW_VERSION,RET_voltage,timetaken,error,GLOBAL_exceptionString);
pathfindr 43:7b232f03628f 958 if (modem.on(RET_force2G)) {
pathfindr 48:64b1613941d5 959 if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
pathfindr 56:efd9f5613549 960 modem.USSDmessage(bytestosend, false, 2, GLOBAL_defaultApi);
pathfindr 43:7b232f03628f 961 }
pathfindr 43:7b232f03628f 962 }
pathfindr 40:4270e09e59f2 963 ThisThread::sleep_for(250);
pathfindr 40:4270e09e59f2 964 }
pathfindr 40:4270e09e59f2 965
pathfindr 40:4270e09e59f2 966 //------------------------------------------------------------------------------
pathfindr 43:7b232f03628f 967 // EVENTS
pathfindr 13:29f67f256709 968 //------------------------------------------------------------------------------
pathfindr 51:9078e6928412 969 void failed_broadcast_log(char* eventstring) {
pathfindr 51:9078e6928412 970 //First available free slot
pathfindr 51:9078e6928412 971 bool saved = false;
pathfindr 51:9078e6928412 972 for(int i = 0; i < sizeof(GLOBAL_failed_broadcast_slots); i++) {
pathfindr 51:9078e6928412 973 if (GLOBAL_failed_broadcast_slots[i] == false) {
pathfindr 51:9078e6928412 974 memset(GLOBAL_failed_broadcasts[i],0x00,sizeof(GLOBAL_failed_broadcasts[i])); //clear row
pathfindr 51:9078e6928412 975 snprintf(GLOBAL_failed_broadcasts[i],sizeof(GLOBAL_failed_broadcasts[i]),"%s",eventstring); //save new row
pathfindr 51:9078e6928412 976 GLOBAL_failed_broadcast_slots[i] = true;
pathfindr 51:9078e6928412 977 saved = true;
pathfindr 51:9078e6928412 978 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Failed Broadcast saved: %s",eventstring);debug_exe();}
pathfindr 51:9078e6928412 979 break;
pathfindr 51:9078e6928412 980 }
pathfindr 51:9078e6928412 981 }
pathfindr 51:9078e6928412 982 if (!saved) {
pathfindr 51:9078e6928412 983 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Failed Broadcast save fail");debug_exe();}
pathfindr 51:9078e6928412 984 }
pathfindr 51:9078e6928412 985 return;
pathfindr 51:9078e6928412 986 }
pathfindr 51:9078e6928412 987 void failed_broadcasts_tx() {
pathfindr 52:bd7678eade77 988 #if BLE_ENABLED
pathfindr 52:bd7678eade77 989 bleStopAdvertising();
pathfindr 52:bd7678eade77 990 #endif
pathfindr 51:9078e6928412 991 //check we have something to send...
pathfindr 51:9078e6928412 992 int numbertosend = 0;
pathfindr 51:9078e6928412 993 for(int i = 0; i < sizeof(GLOBAL_failed_broadcast_slots); i++) {
pathfindr 51:9078e6928412 994 if (GLOBAL_failed_broadcast_slots[i] == true) {
pathfindr 51:9078e6928412 995 numbertosend ++;
pathfindr 51:9078e6928412 996 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Retry:%s",GLOBAL_failed_broadcasts[i]);debug_exe();}
pathfindr 51:9078e6928412 997 }
pathfindr 51:9078e6928412 998 }
pathfindr 51:9078e6928412 999 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Failed Broadcasts to send:%d",numbertosend);debug_exe();}
pathfindr 51:9078e6928412 1000 for(int i = 0; i < sizeof(GLOBAL_failed_broadcast_slots); i++) {
pathfindr 51:9078e6928412 1001 if (GLOBAL_failed_broadcast_slots[i] == true) {
pathfindr 51:9078e6928412 1002 if (RET_NetworkFailCount <= DEFAULT_MAX_FAILED_CONNECTIONS) {
pathfindr 51:9078e6928412 1003 if (modem.on(RET_force2G)) {
pathfindr 51:9078e6928412 1004 if (modem.registerOnNetwork(2,RET_setting_connection_timeout,RET_NetworkFailCount)) {
pathfindr 51:9078e6928412 1005 char result[100];
pathfindr 51:9078e6928412 1006 bool getResponse = false;
pathfindr 56:efd9f5613549 1007 snprintf(result,sizeof(result),"%s",modem.USSDmessage(GLOBAL_failed_broadcasts[i], getResponse, 2, GLOBAL_defaultApi));
pathfindr 51:9078e6928412 1008 if (strcmp(result, "sendok") == 0) {
pathfindr 51:9078e6928412 1009 //clear row
pathfindr 51:9078e6928412 1010 memset(GLOBAL_failed_broadcasts[i],0x00,sizeof(GLOBAL_failed_broadcasts[i]));
pathfindr 51:9078e6928412 1011 GLOBAL_failed_broadcast_slots[i] = false;
pathfindr 51:9078e6928412 1012 }
pathfindr 51:9078e6928412 1013 }
pathfindr 51:9078e6928412 1014 }
pathfindr 51:9078e6928412 1015 }
pathfindr 51:9078e6928412 1016 }
pathfindr 51:9078e6928412 1017 }
pathfindr 51:9078e6928412 1018 }
pathfindr 43:7b232f03628f 1019 bool event_setup(bool manualrun) {
pathfindr 52:bd7678eade77 1020 #if BLE_ENABLED
pathfindr 52:bd7678eade77 1021 bleStopAdvertising();
pathfindr 52:bd7678eade77 1022 #endif
pathfindr 51:9078e6928412 1023 bool pass = false;
pathfindr 49:15ddd84ec9fa 1024 LED1on(0);
pathfindr 48:64b1613941d5 1025 if (RET_NetworkFailCount > DEFAULT_MAX_FAILED_CONNECTIONS) addToExceptionString("NF");
pathfindr 48:64b1613941d5 1026 if (RET_GPSFailCount > DEFAULT_MAX_FAILED_GPS) addToExceptionString("GF");
pathfindr 41:07e41dbd5304 1027 RET_setupInProgress = true;
pathfindr 56:efd9f5613549 1028 GLOBAL_have_GPSlocString_prev = false;
pathfindr 56:efd9f5613549 1029 RET_lastTxTime = RET_RTCunixtime;
pathfindr 48:64b1613941d5 1030 RET_NetworkFailCount = 0;
pathfindr 48:64b1613941d5 1031 RET_GPSFailCount = 0;
pathfindr 49:15ddd84ec9fa 1032 RET_setting_connection_timeout = 180; //reset to longer value to setup run to help with connection
pathfindr 25:7adeb1a53360 1033 bool selftestresult = selfTest();
pathfindr 45:6c7f5b556d74 1034 int connectionStartTime = RET_RTCunixtime;
pathfindr 38:476a9b5629a1 1035 if (modem.on(RET_force2G)) {
pathfindr 48:64b1613941d5 1036 if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
pathfindr 45:6c7f5b556d74 1037 int timetaken_total = (RET_RTCunixtime - GLOBAL_wakeTime) + 10; //add 10 for ussd response time.
pathfindr 45:6c7f5b556d74 1038 int timetaken_connection = (RET_RTCunixtime - connectionStartTime);
pathfindr 43:7b232f03628f 1039 if (manualrun) addToExceptionString("MAN");
pathfindr 17:ba55c026b1d6 1040 char bytestosend[160];
pathfindr 52:bd7678eade77 1041 snprintf(bytestosend,sizeof(bytestosend),"(%s,a:setup,f:%d,v:%.2f,t:%.1f,e:%d,y:%d,z:SETUP-%s,k:%s,m:%s,s:1)\0",GLOBAL_defaultApi,FW_VERSION,RET_voltage,RET_temperature,timetaken_total,timetaken_connection,GLOBAL_exceptionString,SKU,HW_MAJORREVISION);
pathfindr 34:4493c9f6d707 1042 char result[200];
pathfindr 56:efd9f5613549 1043 snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, true, 2, GLOBAL_defaultApi));
pathfindr 49:15ddd84ec9fa 1044 RET_setupInProgress = false; //this turns off the flashing led
pathfindr 51:9078e6928412 1045 if (strcmp(result, "sendokrecfail") == 0) {
pathfindr 51:9078e6928412 1046 //send ok but receive fail
pathfindr 51:9078e6928412 1047 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"USSD Send Ok but Rec fail");debug_exe();}
pathfindr 51:9078e6928412 1048 sendErrorLog("ERR-SU-NR");
pathfindr 51:9078e6928412 1049 } else if (strcmp(result, "sendfail") == 0) {
pathfindr 51:9078e6928412 1050 //do nothing
pathfindr 51:9078e6928412 1051 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"USSD Send Fail");debug_exe();}
pathfindr 51:9078e6928412 1052 } else {
pathfindr 51:9078e6928412 1053 if (saveSettings(result) == true) {
pathfindr 51:9078e6928412 1054 pass = true;
pathfindr 51:9078e6928412 1055 } else {
pathfindr 19:22261767c87a 1056 //something went critically wrong getting settings
pathfindr 48:64b1613941d5 1057 sendErrorLog("ERR-SU-IR");
pathfindr 51:9078e6928412 1058 }
pathfindr 16:3bf5f1a5f869 1059 }
pathfindr 13:29f67f256709 1060 }
pathfindr 13:29f67f256709 1061 } else {
pathfindr 19:22261767c87a 1062 //FAILUREMODE Modem failed to turn on
pathfindr 51:9078e6928412 1063 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"Modem Fail");debug_exe();}
pathfindr 13:29f67f256709 1064 }
pathfindr 49:15ddd84ec9fa 1065
pathfindr 49:15ddd84ec9fa 1066 //IF WE PASSED THEN LETS DO OTHER POSTS
pathfindr 49:15ddd84ec9fa 1067 if (pass == true) {
pathfindr 49:15ddd84ec9fa 1068 GLOBAL_wakeTime = RET_RTCunixtime; //lets reset this here so that the following loc and act function have sensible values for total time
pathfindr 49:15ddd84ec9fa 1069 //GET LOC DATA
pathfindr 52:bd7678eade77 1070 //uint8_t previous_location_accuracy = RET_setting_location_accuracy;
pathfindr 52:bd7678eade77 1071 //RET_setting_location_accuracy = 1; //set location mode to CL only
pathfindr 51:9078e6928412 1072 event_location_tx(false);
pathfindr 52:bd7678eade77 1073 //RET_setting_location_accuracy = previous_location_accuracy; //set location mode back to previous
pathfindr 49:15ddd84ec9fa 1074 //SEND ANY ACTIVITY DATA
pathfindr 49:15ddd84ec9fa 1075 event_activity_tx();
pathfindr 49:15ddd84ec9fa 1076 LED1blink(4,500); //PASS AND END
pathfindr 49:15ddd84ec9fa 1077 }
pathfindr 49:15ddd84ec9fa 1078
pathfindr 49:15ddd84ec9fa 1079 //TIDY UP = LOG RUN TIME - THIS MUST GO AT END AFTER WE HAVE GOT SERVER TIMESTAMP
pathfindr 21:e0b866630c27 1080 RET_SetupRunAt = RET_RTCunixtime;
pathfindr 49:15ddd84ec9fa 1081 RET_GPSFailCount = 0;
pathfindr 49:15ddd84ec9fa 1082 RET_NetworkFailCount = 0;
pathfindr 52:bd7678eade77 1083 setEventTimes();
pathfindr 13:29f67f256709 1084 //RESULT
pathfindr 19:22261767c87a 1085 return pass;
pathfindr 13:29f67f256709 1086 }
pathfindr 39:f767b8037475 1087 void event_turnonofflog_tx(bool turnon) {
pathfindr 52:bd7678eade77 1088 #if BLE_ENABLED
pathfindr 52:bd7678eade77 1089 bleStopAdvertising();
pathfindr 52:bd7678eade77 1090 #endif
pathfindr 48:64b1613941d5 1091 RET_NetworkFailCount = 0; //reset network blocker
pathfindr 48:64b1613941d5 1092 RET_GPSFailCount = 0;
pathfindr 51:9078e6928412 1093 updateBatteryV();
pathfindr 45:6c7f5b556d74 1094 int connectionStartTime = RET_RTCunixtime;
pathfindr 39:f767b8037475 1095 if (modem.on(RET_force2G)) {
pathfindr 39:f767b8037475 1096 char locString[70];
pathfindr 45:6c7f5b556d74 1097 int gpsStartTime = RET_RTCunixtime;
pathfindr 48:64b1613941d5 1098 memcpy(locString, modem.getLocation(1, RET_setting_location_timeout, RET_GPSFailCount, RET_NetworkFailCount), sizeof(locString));
pathfindr 45:6c7f5b556d74 1099 int timetaken_gps = (RET_RTCunixtime - gpsStartTime);
pathfindr 48:64b1613941d5 1100 if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
pathfindr 45:6c7f5b556d74 1101 int timetaken_total = (RET_RTCunixtime - GLOBAL_wakeTime);
pathfindr 45:6c7f5b556d74 1102 int timetaken_connection = (RET_RTCunixtime - connectionStartTime);
pathfindr 39:f767b8037475 1103 char bytestosend[160];
pathfindr 39:f767b8037475 1104 if (turnon) {
pathfindr 52:bd7678eade77 1105 snprintf(bytestosend,sizeof(bytestosend),"(%s,a:log,f:%d,t:%.1f,v:%.2f,z:TURNON,e:%d,y:%d,x:%d,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,RET_temperature,RET_voltage,timetaken_total,timetaken_connection,timetaken_gps,locString);
pathfindr 39:f767b8037475 1106 } else {
pathfindr 52:bd7678eade77 1107 snprintf(bytestosend,sizeof(bytestosend),"(%s,a:log,f:%d,t:%.1f,v:%.2f,z:TURNOFF,e:%d,y:%d,x:%d,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,RET_temperature,RET_voltage,timetaken_total,timetaken_connection,timetaken_gps,locString);
pathfindr 39:f767b8037475 1108 }
pathfindr 39:f767b8037475 1109 char result[180];
pathfindr 56:efd9f5613549 1110 snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, false, 2, GLOBAL_defaultApi));
pathfindr 39:f767b8037475 1111 }
pathfindr 39:f767b8037475 1112 }
pathfindr 39:f767b8037475 1113 }
pathfindr 51:9078e6928412 1114 void event_location_tx(bool failsafe) {
pathfindr 52:bd7678eade77 1115 #if BLE_ENABLED
pathfindr 52:bd7678eade77 1116 bleStopAdvertising();
pathfindr 52:bd7678eade77 1117 #endif
pathfindr 56:efd9f5613549 1118 RET_location_failsafe_seconds_count = 0; //reset failsafe count
pathfindr 54:2840f2d50734 1119 RET_lastTxTime = RET_RTCunixtime;
pathfindr 51:9078e6928412 1120 //check if we have any outstanding to send
pathfindr 51:9078e6928412 1121 failed_broadcasts_tx();
pathfindr 49:15ddd84ec9fa 1122 bool selfTestResult = selfTest();
pathfindr 52:bd7678eade77 1123 bool skipTX = false;
pathfindr 51:9078e6928412 1124 char bytesToSend[160];
pathfindr 52:bd7678eade77 1125
pathfindr 52:bd7678eade77 1126 //Check for Nearby Location Beacons
pathfindr 53:c6942af186d7 1127 memset(RET_closestLocationTag_id, 0x00, sizeof(RET_closestLocationTag_id));
pathfindr 53:c6942af186d7 1128 RET_closestLocationTag_rssi = 999;
pathfindr 53:c6942af186d7 1129 RET_locationTag_present = false;
pathfindr 53:c6942af186d7 1130 RET_detector_present = false;
pathfindr 52:bd7678eade77 1131 #if BLE_ENABLED
pathfindr 54:2840f2d50734 1132 blecount = 0;
pathfindr 52:bd7678eade77 1133 if (RET_setting_beacon_scan == 1 && RET_setting_location_mode != LOCATION_MODE_REALTIME) {
pathfindr 52:bd7678eade77 1134 LowPowerTimer bleScan_t;
pathfindr 52:bd7678eade77 1135 bleScan_t.start();
pathfindr 52:bd7678eade77 1136 uint32_t bleScan_startmillis = bleScan_t.read_ms(); uint32_t bleScan_runtime = 0;
pathfindr 52:bd7678eade77 1137 if (!myble.hasInitialized()) {
pathfindr 52:bd7678eade77 1138 myble.init();
pathfindr 52:bd7678eade77 1139 while (!myble.hasInitialized() && bleScan_runtime < 1000) {
pathfindr 52:bd7678eade77 1140 bleScan_runtime = (bleScan_t.read_ms() - bleScan_startmillis);
pathfindr 52:bd7678eade77 1141 }
pathfindr 52:bd7678eade77 1142 }
pathfindr 52:bd7678eade77 1143 if (myble.hasInitialized()) {
pathfindr 52:bd7678eade77 1144 //Scan for 10 seconds
pathfindr 52:bd7678eade77 1145 bleConfigureScan();
pathfindr 52:bd7678eade77 1146 bleScan_startmillis = bleScan_t.read_ms();
pathfindr 54:2840f2d50734 1147 while (bleScan_runtime < 20000 && RET_detector_present == false) {
pathfindr 52:bd7678eade77 1148 bleScan_runtime = (bleScan_t.read_ms() - bleScan_startmillis);
pathfindr 52:bd7678eade77 1149 myble.waitForEvent(); // low power wait for event
pathfindr 52:bd7678eade77 1150 }
pathfindr 54:2840f2d50734 1151 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLECount: %d",blecount);debug_exe();}
pathfindr 53:c6942af186d7 1152 if (RET_locationTag_present && RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "LocationTag: %s, rssi: %d",RET_closestLocationTag_id, RET_closestLocationTag_rssi);debug_exe();}
pathfindr 52:bd7678eade77 1153 }
pathfindr 52:bd7678eade77 1154 bleScan_t.stop();
pathfindr 52:bd7678eade77 1155 myble.gap().stopScan();
pathfindr 52:bd7678eade77 1156 }
pathfindr 52:bd7678eade77 1157 //see if we are in range of ble detector, if so, no need to get gps and broadcast
pathfindr 52:bd7678eade77 1158 if (RET_detector_present == true && RET_setting_beacon_interval_seconds > 0) {
pathfindr 52:bd7678eade77 1159 skipTX = true;
pathfindr 52:bd7678eade77 1160 }
pathfindr 52:bd7678eade77 1161 #endif
pathfindr 52:bd7678eade77 1162
pathfindr 52:bd7678eade77 1163 if (skipTX == false || failsafe == true) {
pathfindr 52:bd7678eade77 1164 //Set any network or GPS fail flags
pathfindr 54:2840f2d50734 1165 if (RET_NetworkFailCount > DEFAULT_MAX_FAILED_CONNECTIONS) {RET_NetworkFailFlag = true;}
pathfindr 54:2840f2d50734 1166 if (RET_GPSFailCount > DEFAULT_MAX_FAILED_GPS) {addToExceptionString("GF");}
pathfindr 54:2840f2d50734 1167 //lets check to see if we've had repeated comms failings in this location, if so dont bother trying. reset by movment and failsafe
pathfindr 52:bd7678eade77 1168 if (RET_NetworkFailCount <= DEFAULT_MAX_FAILED_CONNECTIONS) {
pathfindr 54:2840f2d50734 1169 if (RET_NetworkFailFlag) {RET_NetworkFailFlag = false; addToExceptionString("NF");}
pathfindr 54:2840f2d50734 1170 if (RET_receivedNewSettings) {RET_receivedNewSettings = false; addToExceptionString("SR");}
pathfindr 52:bd7678eade77 1171 if (modem.on(RET_force2G)) {
pathfindr 52:bd7678eade77 1172 char locString[70];
pathfindr 56:efd9f5613549 1173 memset(locString,0x00,sizeof(locString));
pathfindr 52:bd7678eade77 1174 int gpsStartTime = RET_RTCunixtime;
pathfindr 53:c6942af186d7 1175 if (RET_locationTag_present) {
pathfindr 53:c6942af186d7 1176 snprintf(locString, sizeof(locString), ",l:%s.%d\0",RET_closestLocationTag_id,RET_closestLocationTag_rssi);
pathfindr 53:c6942af186d7 1177 addToExceptionString("BL");
pathfindr 51:9078e6928412 1178 } else {
pathfindr 53:c6942af186d7 1179 //check if we have moved since last post, if not use same valid gps fix if exists
pathfindr 53:c6942af186d7 1180 if (RET_motionStateOnInLocTXInterval == false && GLOBAL_have_GPSlocString_prev == true) {
pathfindr 53:c6942af186d7 1181 memcpy(locString, GLOBAL_GPSlocString_prev, sizeof(locString));
pathfindr 53:c6942af186d7 1182 addToExceptionString("P");
pathfindr 53:c6942af186d7 1183 } else {
pathfindr 56:efd9f5613549 1184 GLOBAL_have_GPSlocString_prev = false;
pathfindr 53:c6942af186d7 1185 memcpy(locString, modem.getLocation(RET_setting_location_accuracy, RET_setting_location_timeout, RET_GPSFailCount, RET_NetworkFailCount), sizeof(locString));
pathfindr 53:c6942af186d7 1186 }
pathfindr 52:bd7678eade77 1187 }
pathfindr 52:bd7678eade77 1188 int timetaken_gps = (RET_RTCunixtime - gpsStartTime);
pathfindr 52:bd7678eade77 1189
pathfindr 52:bd7678eade77 1190 //SEND DATA
pathfindr 52:bd7678eade77 1191 int connectionStartTime = RET_RTCunixtime;
pathfindr 56:efd9f5613549 1192
pathfindr 56:efd9f5613549 1193 if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
pathfindr 56:efd9f5613549 1194 int timetaken_total = (RET_RTCunixtime - GLOBAL_wakeTime) + 10; //add 10 for avg ussd response time.
pathfindr 56:efd9f5613549 1195 int timetaken_connection = (RET_RTCunixtime - connectionStartTime);
pathfindr 56:efd9f5613549 1196 //Check if we should wait for settings back
pathfindr 56:efd9f5613549 1197 bool getSettings = true;
pathfindr 56:efd9f5613549 1198 //work out if we need to get settings back
pathfindr 56:efd9f5613549 1199 if ( ((RET_RTCunixtime - RET_SettingsGotAt)/3600) < RET_setting_minimumupdate_hrs ) { getSettings = false; timetaken_total -= 10;} //remove the extra 10 seconds from times
pathfindr 56:efd9f5613549 1200 char bytesToSend[160];
pathfindr 56:efd9f5613549 1201 //snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:loc,f:%d,t:%.1f,v:%.2f,z:LOC-%s,e:%d,y:%d,x:%d,c:1,s:%d%s)\0",GLOBAL_defaultApi,FW_VERSION,temperature,voltage,GLOBAL_exceptionString,timetaken_total,timetaken_connection,timetaken_gps,getSettings,locString);
pathfindr 56:efd9f5613549 1202 snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:loc,f:%d,t:%.0f,n:%.0f,q:%.0f,w:%.0f,v:%.1f,z:L%s,e:%d,y:%d,x:%d,j:%d,s:%d%s)\0",GLOBAL_defaultApi,FW_VERSION,RET_temperature,RET_temperature_min,RET_temperature_max,RET_humidity,RET_voltage,GLOBAL_exceptionString,timetaken_total,timetaken_connection,timetaken_gps,RET_motionStateOnInLocTXInterval,getSettings,locString);
pathfindr 56:efd9f5613549 1203 char result[180];
pathfindr 56:efd9f5613549 1204 snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytesToSend, getSettings, 2, GLOBAL_defaultApi));
pathfindr 56:efd9f5613549 1205 //if (result != "err") {
pathfindr 56:efd9f5613549 1206 if (strcmp(result, "err") != 0) {
pathfindr 56:efd9f5613549 1207 if (getSettings) {
pathfindr 56:efd9f5613549 1208 if (saveSettings(result) == false){sendErrorLog("ERR-LOC-IR");}
pathfindr 56:efd9f5613549 1209 }
pathfindr 56:efd9f5613549 1210 } else {
pathfindr 56:efd9f5613549 1211 sendErrorLog("ERR-LOC-NR");
pathfindr 56:efd9f5613549 1212 }
pathfindr 56:efd9f5613549 1213 }
pathfindr 56:efd9f5613549 1214
pathfindr 56:efd9f5613549 1215 /*
pathfindr 52:bd7678eade77 1216 if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
pathfindr 52:bd7678eade77 1217 int timetaken_total = (RET_RTCunixtime - GLOBAL_wakeTime) + 10; //add 10 for avg ussd response time.
pathfindr 52:bd7678eade77 1218 int timetaken_connection = (RET_RTCunixtime - connectionStartTime);
pathfindr 52:bd7678eade77 1219 //Check if we should wait for settings back
pathfindr 52:bd7678eade77 1220 bool getSettings = true;
pathfindr 52:bd7678eade77 1221 //work out if we need to get settings back
pathfindr 52:bd7678eade77 1222 if ( ((RET_RTCunixtime - RET_SettingsGotAt)/3600) < RET_setting_minimumupdate_hrs ) { getSettings = false; timetaken_total -= 10;} //remove the extra 10 seconds from times
pathfindr 53:c6942af186d7 1223 snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:loc,f:%d,t:%.0f,n:%.0f,q:%.0f,w:%.0f,v:%.1f,z:L%s,e:%d,y:%d,x:%d,j:%d,s:%d%s)\0",GLOBAL_defaultApi,FW_VERSION,RET_temperature,RET_temperature_min,RET_temperature_max,RET_humidity,RET_voltage,GLOBAL_exceptionString,timetaken_total,timetaken_connection,timetaken_gps,RET_motionStateOnInLocTXInterval,getSettings,locString);
pathfindr 52:bd7678eade77 1224 //snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:loc,f:%d,t:%.0f,v:%.1f,z:L-%s,e:%d,y:%d,x:%d,j:%d,s:%d%s)\0",GLOBAL_defaultApi,FW_VERSION,RET_temperature,RET_voltage,GLOBAL_exceptionString,timetaken_total,timetaken_connection,timetaken_gps,RET_motionStateOnInLocTXInterval,getSettings,locString);
pathfindr 52:bd7678eade77 1225 char result[180];
pathfindr 52:bd7678eade77 1226 snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytesToSend, getSettings, GLOBAL_defaultApi));
pathfindr 52:bd7678eade77 1227 if (getSettings == true && strcmp(result, "sendokrecfail") == 0) {
pathfindr 52:bd7678eade77 1228 //send ok but receive fail
pathfindr 52:bd7678eade77 1229 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"USSD Send Ok but Rec fail");debug_exe();}
pathfindr 54:2840f2d50734 1230 sendErrorLog("ERR-LOC-NR");
pathfindr 52:bd7678eade77 1231 } else if (strcmp(result, "sendok") == 0) {
pathfindr 52:bd7678eade77 1232 //do nothing
pathfindr 52:bd7678eade77 1233 } else if (strcmp(result, "sendfail") == 0) {
pathfindr 52:bd7678eade77 1234 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"USSD Send Fail");debug_exe();}
pathfindr 52:bd7678eade77 1235 //need to log for retry
pathfindr 52:bd7678eade77 1236 } else {
pathfindr 52:bd7678eade77 1237 if (getSettings) {
pathfindr 52:bd7678eade77 1238 if (saveSettings(result) == false){sendErrorLog("ERR-LOC-IR");}
pathfindr 52:bd7678eade77 1239 }
pathfindr 48:64b1613941d5 1240 }
pathfindr 22:810425eb76e1 1241 }
pathfindr 56:efd9f5613549 1242 */
pathfindr 22:810425eb76e1 1243 }
pathfindr 22:810425eb76e1 1244 }
pathfindr 20:5404841fdd2b 1245 }
pathfindr 20:5404841fdd2b 1246 //RESETS
pathfindr 52:bd7678eade77 1247 RET_motionStateOnInLocTXInterval = false;
pathfindr 41:07e41dbd5304 1248 setEventTime_Location();
pathfindr 19:22261767c87a 1249 }
pathfindr 51:9078e6928412 1250 void event_activity_tx() {
pathfindr 52:bd7678eade77 1251 #if BLE_ENABLED
pathfindr 52:bd7678eade77 1252 bleStopAdvertising();
pathfindr 52:bd7678eade77 1253 #endif
pathfindr 51:9078e6928412 1254 //check if we have any outstanding to send
pathfindr 51:9078e6928412 1255 failed_broadcasts_tx();
pathfindr 51:9078e6928412 1256 //check we have something to send...
pathfindr 51:9078e6928412 1257 bool sendok = false;
pathfindr 51:9078e6928412 1258 if (RET_motionTotalActivityHoursSincePost > 0.0f && RET_setting_activity_mode > 0) {
pathfindr 51:9078e6928412 1259 //Build data to send
pathfindr 51:9078e6928412 1260 char bytesToSend[160];
pathfindr 51:9078e6928412 1261 if (RET_setting_activity_mode == 1) {
pathfindr 52:bd7678eade77 1262 snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:act,t:%u,r:%.2f,h:%.2f)\0",GLOBAL_defaultApi,RET_motionFrameStart,RET_motionTotalActivityHoursSincePost,RET_motionTotalActivityHours);
pathfindr 51:9078e6928412 1263 } else if (RET_setting_activity_mode == 2) {
pathfindr 52:bd7678eade77 1264 snprintf(bytesToSend,sizeof(bytesToSend),"(%s,a:act,e:%s,t:%u,r:%.2f)\0",GLOBAL_defaultApi,RET_activityData,RET_motionFrameStart,RET_motionTotalActivityHoursSincePost);
pathfindr 51:9078e6928412 1265 }
pathfindr 51:9078e6928412 1266 if (RET_NetworkFailCount <= DEFAULT_MAX_FAILED_CONNECTIONS) {
pathfindr 51:9078e6928412 1267 if (modem.on(RET_force2G)) {
pathfindr 51:9078e6928412 1268 //SEND DATA
pathfindr 51:9078e6928412 1269 if (modem.registerOnNetwork(2,RET_setting_connection_timeout,RET_NetworkFailCount)) {
pathfindr 51:9078e6928412 1270 char result[100];
pathfindr 51:9078e6928412 1271 bool getResponse = false;
pathfindr 56:efd9f5613549 1272 snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytesToSend, getResponse, 2, GLOBAL_defaultApi));
pathfindr 51:9078e6928412 1273 if (strcmp(result, "sendok") == 0) {
pathfindr 51:9078e6928412 1274 sendok = true;
pathfindr 51:9078e6928412 1275 //if(!RET_debug) {sendok = true;} //FOR TESTING
pathfindr 51:9078e6928412 1276 }
pathfindr 51:9078e6928412 1277 }
pathfindr 51:9078e6928412 1278 }
pathfindr 51:9078e6928412 1279 }
pathfindr 51:9078e6928412 1280 //If send failed then log it for retry - only need to do this for mode 2, for mode the time just increments
pathfindr 51:9078e6928412 1281 if (sendok == true) {
pathfindr 51:9078e6928412 1282 if (RET_setting_activity_mode == 1) {
pathfindr 51:9078e6928412 1283 RET_motionTotalActivityHoursSincePost = 0.0f;
pathfindr 51:9078e6928412 1284 if (RET_haveSettings) { RET_motionFrameStart = RET_RTCunixtime; }
pathfindr 51:9078e6928412 1285 } else if (RET_setting_activity_mode == 2) {
pathfindr 51:9078e6928412 1286 RET_motionTotalActivityHoursSincePost = 0.0f;
pathfindr 51:9078e6928412 1287 if (RET_haveSettings) { RET_motionFrameStart = RET_RTCunixtime; }
pathfindr 51:9078e6928412 1288 }
pathfindr 51:9078e6928412 1289 } else if (sendok == false) {
pathfindr 51:9078e6928412 1290 if (RET_setting_activity_mode == 1) {
pathfindr 51:9078e6928412 1291 //do nothing
pathfindr 51:9078e6928412 1292 } else if (RET_setting_activity_mode == 2) {
pathfindr 51:9078e6928412 1293 failed_broadcast_log(bytesToSend);
pathfindr 51:9078e6928412 1294 RET_motionTotalActivityHoursSincePost = 0.0f;
pathfindr 51:9078e6928412 1295 if (RET_haveSettings) { RET_motionFrameStart = RET_RTCunixtime; }
pathfindr 51:9078e6928412 1296 }
pathfindr 51:9078e6928412 1297 }
pathfindr 51:9078e6928412 1298 }
pathfindr 51:9078e6928412 1299 //RESETS
pathfindr 51:9078e6928412 1300 memset(RET_activityData,0x00,sizeof(RET_activityData));
pathfindr 51:9078e6928412 1301 setEventTime_Activity();
pathfindr 48:64b1613941d5 1302 }
pathfindr 24:c161db07557f 1303
pathfindr 7:e9a19750700d 1304 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 1305 // STATE ENGINE
pathfindr 7:e9a19750700d 1306 //------------------------------------------------------------------------------
pathfindr 6:388d3c7efdd9 1307 void mainStateEngine() {
pathfindr 16:3bf5f1a5f869 1308 switch(RET_state) {
pathfindr 16:3bf5f1a5f869 1309 case STATE_SETUP :
pathfindr 34:4493c9f6d707 1310 { //need the curlies to avoid "transfer of control bypass init error warning"
pathfindr 48:64b1613941d5 1311 RET_busy = true;
pathfindr 41:07e41dbd5304 1312 //check that we havent run setup too recently
pathfindr 41:07e41dbd5304 1313 time_t setupRunAt_delta = (RET_RTCunixtime - RET_SetupRunAt);
pathfindr 49:15ddd84ec9fa 1314 if (RET_SetupRunAt == 0 || setupRunAt_delta >= ONEDAYINSECONDS) {
pathfindr 51:9078e6928412 1315 updateBatteryV();
pathfindr 43:7b232f03628f 1316 if (event_setup(false)) {
pathfindr 41:07e41dbd5304 1317 // All good
pathfindr 41:07e41dbd5304 1318 setState(STATE_NORMAL);
pathfindr 41:07e41dbd5304 1319 } else {
pathfindr 41:07e41dbd5304 1320 RET_eventTime_wakeFromDormant = (RET_RTCunixtime + ONEDAYINSECONDS);
pathfindr 41:07e41dbd5304 1321 setState(STATE_DORMANT);
pathfindr 51:9078e6928412 1322 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"SETUP FAILED:DORMANT until %u\n",RET_eventTime_wakeFromDormant);debug_exe();}
pathfindr 41:07e41dbd5304 1323 }
pathfindr 19:22261767c87a 1324 } else {
pathfindr 41:07e41dbd5304 1325 time_t setupCanRunAt = (RET_RTCunixtime + (ONEDAYINSECONDS - setupRunAt_delta));
pathfindr 51:9078e6928412 1326 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"SETUP CAN RUN AGAIN @%u \n",setupCanRunAt);debug_exe();}
pathfindr 13:29f67f256709 1327 }
pathfindr 48:64b1613941d5 1328 RET_busy = false;
pathfindr 6:388d3c7efdd9 1329 break;
pathfindr 34:4493c9f6d707 1330 }
pathfindr 16:3bf5f1a5f869 1331 case STATE_NORMAL :
pathfindr 48:64b1613941d5 1332 {
pathfindr 48:64b1613941d5 1333 RET_busy = true;
pathfindr 24:c161db07557f 1334 //LOCATION EVENT
pathfindr 19:22261767c87a 1335 bool run_location_tx = false;
pathfindr 27:fa76f5a08195 1336 switch (RET_setting_location_mode) {
pathfindr 27:fa76f5a08195 1337 case 1: //INTERVAL POST
pathfindr 27:fa76f5a08195 1338 if(RET_RTCunixtime >= RET_eventTime_location_tx && RET_eventTime_location_tx > 0) { run_location_tx = true; }
pathfindr 27:fa76f5a08195 1339 break;
pathfindr 27:fa76f5a08195 1340 case 2: //INTERVAL POST WITH MOTION CHECK
pathfindr 40:4270e09e59f2 1341 if(RET_RTCunixtime >= RET_eventTime_location_tx && RET_eventTime_location_tx > 0) {
pathfindr 52:bd7678eade77 1342 if (RET_motionStateOnInLocTXInterval == true || RET_motionState == true) {
pathfindr 40:4270e09e59f2 1343 run_location_tx = true;
pathfindr 40:4270e09e59f2 1344 } else {
pathfindr 52:bd7678eade77 1345 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "Skip TX no mot\n");debug_exe();}
pathfindr 40:4270e09e59f2 1346 }
pathfindr 40:4270e09e59f2 1347 }
pathfindr 27:fa76f5a08195 1348 break;
pathfindr 27:fa76f5a08195 1349 case 3: //POST ON STOP MOTION
pathfindr 52:bd7678eade77 1350 if (GLOBAL_motionStopFlagTriggered) { GLOBAL_motionStopFlagTriggered = false; run_location_tx = true; }
pathfindr 27:fa76f5a08195 1351 break;
pathfindr 27:fa76f5a08195 1352 }
pathfindr 54:2840f2d50734 1353 if(run_location_tx == false && RET_location_failsafe_seconds_count >= RET_location_failsafe_seconds_max) {
pathfindr 48:64b1613941d5 1354 RET_NetworkFailCount = 0; //reset to ensure connection
pathfindr 48:64b1613941d5 1355 RET_GPSFailCount = 0; // reset to ensure gps try
pathfindr 52:bd7678eade77 1356 addToExceptionString("FS");
pathfindr 51:9078e6928412 1357 updateBatteryV();
pathfindr 51:9078e6928412 1358 event_location_tx(true);
pathfindr 51:9078e6928412 1359 } else {
pathfindr 54:2840f2d50734 1360 if (run_location_tx) {
pathfindr 54:2840f2d50734 1361 updateBatteryV();
pathfindr 54:2840f2d50734 1362 event_location_tx(false);
pathfindr 54:2840f2d50734 1363 }
pathfindr 48:64b1613941d5 1364 }
pathfindr 19:22261767c87a 1365
pathfindr 24:c161db07557f 1366 //ACTIVITY EVENT
pathfindr 24:c161db07557f 1367 bool run_activity_tx = false;
pathfindr 45:6c7f5b556d74 1368 if(RET_RTCunixtime >= RET_eventTime_activity_tx && RET_eventTime_activity_tx > 0) {
pathfindr 48:64b1613941d5 1369 if (RET_setting_activity_mode == 1 && RET_motionTotalActivityHoursSincePost > 0.0f) {
pathfindr 45:6c7f5b556d74 1370 run_activity_tx = true;
pathfindr 45:6c7f5b556d74 1371 }
pathfindr 45:6c7f5b556d74 1372 if (RET_setting_activity_mode == 2 && strlen(RET_activityData) > 1) {
pathfindr 45:6c7f5b556d74 1373 run_activity_tx = true;
pathfindr 45:6c7f5b556d74 1374 }
pathfindr 9:b0a1535b8ef2 1375 }
pathfindr 45:6c7f5b556d74 1376 //If in sendevent mode, check if buffer is close to full, if so send
pathfindr 45:6c7f5b556d74 1377 if (RET_setting_activity_mode == 2 && strlen(RET_activityData) > (ACTIVITY_BUFFERSIZE-20)) { run_activity_tx = true; }
pathfindr 48:64b1613941d5 1378 if (run_activity_tx) { event_activity_tx(); }
pathfindr 48:64b1613941d5 1379
pathfindr 48:64b1613941d5 1380 RET_busy = false;
pathfindr 9:b0a1535b8ef2 1381 break;
pathfindr 34:4493c9f6d707 1382 }
pathfindr 16:3bf5f1a5f869 1383 case STATE_DORMANT :
pathfindr 34:4493c9f6d707 1384 {
pathfindr 50:a94e70c00fff 1385 RET_busy = true;
pathfindr 22:810425eb76e1 1386 if (RET_RTCunixtime >= RET_eventTime_wakeFromDormant) {
pathfindr 22:810425eb76e1 1387 if (RET_haveSettings) {
pathfindr 22:810425eb76e1 1388 setState(STATE_NORMAL);
pathfindr 22:810425eb76e1 1389 } else {
pathfindr 22:810425eb76e1 1390 setState(STATE_SETUP);
pathfindr 22:810425eb76e1 1391 }
pathfindr 7:e9a19750700d 1392 }
pathfindr 51:9078e6928412 1393 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"STATE:DORMANT until %u Prev S:%d\n",RET_eventTime_wakeFromDormant,RET_state_prev);debug_exe();}
pathfindr 50:a94e70c00fff 1394 RET_busy = false;
pathfindr 12:8345612bf867 1395 break;
pathfindr 34:4493c9f6d707 1396 }
pathfindr 16:3bf5f1a5f869 1397 case STATE_BUTTONPRESS1 :
pathfindr 34:4493c9f6d707 1398 {
pathfindr 50:a94e70c00fff 1399 RET_busy = true;
pathfindr 51:9078e6928412 1400 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 1\n");debug_exe();}
pathfindr 51:9078e6928412 1401 updateBatteryV();
pathfindr 51:9078e6928412 1402 if (RET_voltage < 2.5f) {
pathfindr 48:64b1613941d5 1403 LED1blink(3,500);
pathfindr 48:64b1613941d5 1404 } else if (selfTest() == false){
pathfindr 48:64b1613941d5 1405 LED1blink(4,500);
pathfindr 48:64b1613941d5 1406 } else {
pathfindr 48:64b1613941d5 1407 if(RET_state_prev == STATE_DORMANT) {
pathfindr 48:64b1613941d5 1408 LED1on(500);
pathfindr 48:64b1613941d5 1409 } else if (RET_state_prev == STATE_NORMAL) {
pathfindr 48:64b1613941d5 1410 LED1blink(2,500);
pathfindr 48:64b1613941d5 1411 }
pathfindr 48:64b1613941d5 1412 }
pathfindr 50:a94e70c00fff 1413 if (RET_state_prev != STATE_NORMAL || RET_state_prev != STATE_DORMANT) {
pathfindr 50:a94e70c00fff 1414 setState(STATE_NORMAL);
pathfindr 50:a94e70c00fff 1415 } else {
pathfindr 50:a94e70c00fff 1416 setState(RET_state_prev);
pathfindr 50:a94e70c00fff 1417 }
pathfindr 51:9078e6928412 1418 dumpSettings();
pathfindr 50:a94e70c00fff 1419 RET_busy = false;
pathfindr 28:24b02608fa5f 1420 break;
pathfindr 34:4493c9f6d707 1421 }
pathfindr 28:24b02608fa5f 1422 case STATE_BUTTONPRESS3 :
pathfindr 34:4493c9f6d707 1423 {
pathfindr 50:a94e70c00fff 1424 RET_busy = true;
pathfindr 48:64b1613941d5 1425 if(RET_state_prev == STATE_DORMANT || RET_state_prev == STATE_NORMAL) {
pathfindr 51:9078e6928412 1426 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 3\n");debug_exe();}
pathfindr 48:64b1613941d5 1427 LED1blink(3,500);
pathfindr 48:64b1613941d5 1428 LED1on(0);
pathfindr 51:9078e6928412 1429 updateBatteryV();
pathfindr 48:64b1613941d5 1430 event_setup(true);
pathfindr 48:64b1613941d5 1431 LED1off();
pathfindr 48:64b1613941d5 1432 }
pathfindr 48:64b1613941d5 1433 setState(STATE_NORMAL); //turns device back on
pathfindr 50:a94e70c00fff 1434 RET_busy = false;
pathfindr 48:64b1613941d5 1435 break;
pathfindr 48:64b1613941d5 1436 }
pathfindr 48:64b1613941d5 1437 case STATE_BUTTONPRESS5 :
pathfindr 48:64b1613941d5 1438 {
pathfindr 50:a94e70c00fff 1439 RET_busy = true;
pathfindr 48:64b1613941d5 1440 if(RET_state_prev == STATE_DORMANT || RET_state_prev == STATE_NORMAL) {
pathfindr 51:9078e6928412 1441 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON PRESS 5\n");debug_exe();}
pathfindr 48:64b1613941d5 1442 LED1blink(5,500);
pathfindr 48:64b1613941d5 1443 LED1on(0);
pathfindr 51:9078e6928412 1444 updateBatteryV();
pathfindr 51:9078e6928412 1445 event_location_tx(false);
pathfindr 48:64b1613941d5 1446 LED1off();
pathfindr 48:64b1613941d5 1447 }
pathfindr 48:64b1613941d5 1448 setState(STATE_NORMAL); //turns device back on
pathfindr 50:a94e70c00fff 1449 RET_busy = false;
pathfindr 9:b0a1535b8ef2 1450 break;
pathfindr 34:4493c9f6d707 1451 }
pathfindr 51:9078e6928412 1452 case STATE_TURNOFF :
pathfindr 34:4493c9f6d707 1453 {
pathfindr 50:a94e70c00fff 1454 RET_busy = true;
pathfindr 51:9078e6928412 1455 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON HOLD \n");debug_exe();}
pathfindr 51:9078e6928412 1456 RET_eventTime_wakeFromDormant = (RET_RTCunixtime + THREEDAYSINSECONDS);
pathfindr 51:9078e6928412 1457 setState(STATE_DORMANT);
pathfindr 51:9078e6928412 1458 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"TURNING OFF\n");debug_exe();}
pathfindr 51:9078e6928412 1459 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"STATE:DORMANT until %u\n",RET_eventTime_wakeFromDormant);debug_exe();}
pathfindr 51:9078e6928412 1460 LED1on(5000);
pathfindr 51:9078e6928412 1461 //event_turnonofflog_tx(false);
pathfindr 51:9078e6928412 1462 RET_busy = false;
pathfindr 51:9078e6928412 1463 break;
pathfindr 51:9078e6928412 1464 }
pathfindr 51:9078e6928412 1465 case STATE_TURNON :
pathfindr 51:9078e6928412 1466 {
pathfindr 51:9078e6928412 1467 RET_busy = true;
pathfindr 51:9078e6928412 1468 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"BUTTON HOLD \n");debug_exe();}
pathfindr 51:9078e6928412 1469 if (RET_haveSettings) {
pathfindr 51:9078e6928412 1470 setState(STATE_NORMAL);
pathfindr 19:22261767c87a 1471 } else {
pathfindr 51:9078e6928412 1472 setState(STATE_SETUP);
pathfindr 19:22261767c87a 1473 }
pathfindr 51:9078e6928412 1474 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"TURNING ON\n");debug_exe();}
pathfindr 51:9078e6928412 1475 LED1blink(20,100);
pathfindr 50:a94e70c00fff 1476 RET_busy = false;
pathfindr 6:388d3c7efdd9 1477 break;
pathfindr 34:4493c9f6d707 1478 }
pathfindr 39:f767b8037475 1479 case STATE_SCORCHEDEARTH :
pathfindr 39:f767b8037475 1480 {
pathfindr 50:a94e70c00fff 1481 RET_busy = true;
pathfindr 51:9078e6928412 1482 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"SCORCHED EARTH - RESETTING");debug_exe();}
pathfindr 39:f767b8037475 1483 setState(STATE_SETUP); //this wont be used but just incase to kick it out of this state
pathfindr 39:f767b8037475 1484 read_app_data_from_flash(&app_data);
pathfindr 39:f767b8037475 1485 app_data.current_firmware_version = 0;
pathfindr 39:f767b8037475 1486 app_data.target_firmware_version = 0;
pathfindr 39:f767b8037475 1487 write_app_data_to_flash(&app_data);
pathfindr 39:f767b8037475 1488 system_reset();
pathfindr 50:a94e70c00fff 1489 RET_busy = false;
pathfindr 39:f767b8037475 1490 break;
pathfindr 39:f767b8037475 1491 }
pathfindr 6:388d3c7efdd9 1492 default :
pathfindr 34:4493c9f6d707 1493 {
pathfindr 19:22261767c87a 1494 setState(STATE_SETUP);
pathfindr 34:4493c9f6d707 1495 }
pathfindr 6:388d3c7efdd9 1496 }
pathfindr 6:388d3c7efdd9 1497 }
pathfindr 6:388d3c7efdd9 1498
pathfindr 7:e9a19750700d 1499 //------------------------------------------------------------------------------
pathfindr 7:e9a19750700d 1500 // MAIN
pathfindr 7:e9a19750700d 1501 //------------------------------------------------------------------------------
pathfindr 50:a94e70c00fff 1502 int main() {
pathfindr 24:c161db07557f 1503 //INIT
pathfindr 51:9078e6928412 1504 LED1off();
pathfindr 51:9078e6928412 1505 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 1506 watchdog.configure(400.0); //6.6 mins //Do not set to less than 4500ms or can cause issues with softdevice
pathfindr 43:7b232f03628f 1507 modem.off(false);
pathfindr 24:c161db07557f 1508 RTCticker.attach(&RTCtick, 1.0);
pathfindr 51:9078e6928412 1509 LPtimer.start();
pathfindr 34:4493c9f6d707 1510 button.fall(&buttonPress);
pathfindr 24:c161db07557f 1511 button.rise(&buttonRelease);
pathfindr 43:7b232f03628f 1512 read_app_data_from_flash(&app_data);
pathfindr 34:4493c9f6d707 1513 dumpSettings();
pathfindr 4:8d8e9bfa82e4 1514
pathfindr 4:8d8e9bfa82e4 1515 //CHECK IF THIS IS RESET
pathfindr 43:7b232f03628f 1516 //0x00000008 == lock up //0x00000004 == soft reset //0x00000002 == watchdog //0x00000001 == button/hardreset
pathfindr 4:8d8e9bfa82e4 1517 if (NRF_POWER->RESETREAS != 0xffffffff) {
pathfindr 43:7b232f03628f 1518 RET_coldBoot = 1;
pathfindr 4:8d8e9bfa82e4 1519 switch(NRF_POWER->RESETREAS) {
pathfindr 4:8d8e9bfa82e4 1520 case 0x00000001 :
pathfindr 52:bd7678eade77 1521 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:HW\n");debug_exe();}
pathfindr 54:2840f2d50734 1522 addToExceptionString("RH");
pathfindr 4:8d8e9bfa82e4 1523 break;
pathfindr 4:8d8e9bfa82e4 1524 case 0x00000002 :
pathfindr 52:bd7678eade77 1525 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:WD\n");debug_exe();}
pathfindr 54:2840f2d50734 1526 addToExceptionString("WD");
pathfindr 4:8d8e9bfa82e4 1527 break;
pathfindr 4:8d8e9bfa82e4 1528 case 0x00000004 :
pathfindr 52:bd7678eade77 1529 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:SW\n");debug_exe();}
pathfindr 54:2840f2d50734 1530 addToExceptionString("RS");
pathfindr 4:8d8e9bfa82e4 1531 break;
pathfindr 43:7b232f03628f 1532 case 0x00000008 :
pathfindr 52:bd7678eade77 1533 if(RET_debug){debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"RR:LU\n");debug_exe();}
pathfindr 54:2840f2d50734 1534 addToExceptionString("RL");
pathfindr 43:7b232f03628f 1535 break;
pathfindr 4:8d8e9bfa82e4 1536 }
pathfindr 36:8e359069192b 1537 NRF_POWER->RESETREAS = 0xffffffff;
pathfindr 4:8d8e9bfa82e4 1538 }
pathfindr 24:c161db07557f 1539
pathfindr 9:b0a1535b8ef2 1540 //CHECK FOR FIRST BOOT
pathfindr 52:bd7678eade77 1541 if (RET_coldBoot == 1) {
pathfindr 52:bd7678eade77 1542 memset(RET_activityData,0x00,sizeof(RET_activityData));
pathfindr 52:bd7678eade77 1543 lis3dh_configureForSleep(DEFAULT_MOTION_G,DEFAULT_IMPACT_G);
pathfindr 51:9078e6928412 1544 updateBatteryV();
pathfindr 52:bd7678eade77 1545 if (RET_voltage < 2.5f) { LED1errorCode(10,2);}
pathfindr 43:7b232f03628f 1546 addToExceptionString("FR");
pathfindr 24:c161db07557f 1547 }
pathfindr 13:29f67f256709 1548
pathfindr 34:4493c9f6d707 1549 //MAIN LOOP
pathfindr 52:bd7678eade77 1550 while(true) {
pathfindr 39:f767b8037475 1551 RET_asleep = false;
pathfindr 52:bd7678eade77 1552 watchdogKick();
pathfindr 51:9078e6928412 1553 updateTemperatures();
pathfindr 52:bd7678eade77 1554 resetSessionVars();
pathfindr 39:f767b8037475 1555 healthCheck(); //this must be after resetGlobals
pathfindr 13:29f67f256709 1556 GLOBAL_wakeTime = RET_RTCunixtime;
pathfindr 11:60eb0ff945f2 1557
pathfindr 40:4270e09e59f2 1558 //check and log motion
pathfindr 48:64b1613941d5 1559 if (RET_state == STATE_NORMAL || RET_state == STATE_SETUP) {
pathfindr 52:bd7678eade77 1560 if (checkMotion() == true) { //if motionstate is true, then reset network and gps fail counts, so that they are not skipped
pathfindr 48:64b1613941d5 1561 RET_NetworkFailCount = 0;
pathfindr 48:64b1613941d5 1562 RET_GPSFailCount = 0;
pathfindr 48:64b1613941d5 1563 }
pathfindr 48:64b1613941d5 1564 }
pathfindr 40:4270e09e59f2 1565
pathfindr 9:b0a1535b8ef2 1566 //MAIN LOGIC
pathfindr 51:9078e6928412 1567 if(RET_debug){
pathfindr 39:f767b8037475 1568 if (RET_state != 99) {
pathfindr 54:2840f2d50734 1569 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "F:%d, S:%d, SET:%d, MF:%d, MS:%d, MTX:%d, %u, L:%u, FSC:%u FSM:%u, FST:%u, A:%u", FW_VERSION, RET_state, RET_haveSettings, RET_motionTriggeredinFrame, RET_motionState, RET_motionStateOnInLocTXInterval, RET_RTCunixtime,RET_eventTime_location_tx,RET_location_failsafe_seconds_count,RET_location_failsafe_seconds_max,RET_eventTime_location_failsafe_tx,RET_eventTime_activity_tx);debug_exe();
pathfindr 51:9078e6928412 1570 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "ACT M:%d, HsP:%.2f, Ht:%.2f, D:%s",RET_setting_activity_mode,RET_motionTotalActivityHoursSincePost,RET_motionTotalActivityHours,RET_activityData);debug_exe();
pathfindr 39:f767b8037475 1571 } else {
pathfindr 43:7b232f03628f 1572 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "F:%d, S:%d, WAKE@:%u\n", FW_VERSION, RET_state, RET_eventTime_wakeFromDormant);debug_exe();
pathfindr 39:f767b8037475 1573 }
pathfindr 51:9078e6928412 1574 if (RET_coldBoot == false && RET_RTCunixtime > RET_debug_offat) {
pathfindr 51:9078e6928412 1575 debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer),"DEBUGGING OFF\n");debug_exe();
pathfindr 51:9078e6928412 1576 RET_debug = false;
pathfindr 51:9078e6928412 1577 }
pathfindr 38:476a9b5629a1 1578 }
pathfindr 37:505ef618f06c 1579
pathfindr 42:f482f4cdb319 1580 //STATE ENGINE
pathfindr 9:b0a1535b8ef2 1581 mainStateEngine();
pathfindr 51:9078e6928412 1582
pathfindr 34:4493c9f6d707 1583 //LOG FIRST RUN - BOOTLOADER COMMS
pathfindr 34:4493c9f6d707 1584 if (RET_coldBoot) {
pathfindr 45:6c7f5b556d74 1585 recordFirmwareAsValid();
pathfindr 34:4493c9f6d707 1586 RET_coldBoot = 0;
pathfindr 34:4493c9f6d707 1587 }
pathfindr 51:9078e6928412 1588
pathfindr 52:bd7678eade77 1589 //CONFIGURE BLE BEACON BROADCAST
pathfindr 52:bd7678eade77 1590 #if BLE_ENABLED
pathfindr 52:bd7678eade77 1591 //see if we are in range of ble detector, if so, no need to get gps and broadcast
pathfindr 52:bd7678eade77 1592 if (RET_setting_beacon_interval_seconds > 0 && RET_pf_identifier[0] != 0x00 && RET_pf_identifier[1] != 0x00 && RET_pf_identifier[2] != 0x00) {
pathfindr 52:bd7678eade77 1593 if (RET_bleBroadcasting == false) {
pathfindr 52:bd7678eade77 1594 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE init...");debug_exe();}
pathfindr 52:bd7678eade77 1595 myble.init(bleSetupAdvertising);
pathfindr 52:bd7678eade77 1596 if (myble.hasInitialized()) {
pathfindr 52:bd7678eade77 1597 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "OK");debug_exe();}
pathfindr 52:bd7678eade77 1598 bleUpdateAndAdvertise();
pathfindr 52:bd7678eade77 1599 } else {
pathfindr 52:bd7678eade77 1600 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "FAIL");debug_exe();}
pathfindr 52:bd7678eade77 1601 }
pathfindr 52:bd7678eade77 1602 } else {
pathfindr 52:bd7678eade77 1603 if(RET_debug) {debug_prep();snprintf(GLOBAL_debug_buffer, sizeof(GLOBAL_debug_buffer), "BLE update");debug_exe();}
pathfindr 52:bd7678eade77 1604 bleUpdateAndAdvertise();
pathfindr 52:bd7678eade77 1605 }
pathfindr 52:bd7678eade77 1606 } else {
pathfindr 52:bd7678eade77 1607 if (RET_bleBroadcasting == true) bleStopAdvertising();
pathfindr 52:bd7678eade77 1608 }
pathfindr 52:bd7678eade77 1609 #endif
pathfindr 52:bd7678eade77 1610
pathfindr 9:b0a1535b8ef2 1611 //PRE-SLEEP ACTIONS
pathfindr 54:2840f2d50734 1612 RET_location_failsafe_seconds_count += (DEFAULT_SLEEP_FRAME / 1000);
pathfindr 54:2840f2d50734 1613 memset(GLOBAL_exceptionString,0x00,sizeof(GLOBAL_exceptionString));
pathfindr 45:6c7f5b556d74 1614 LED1off();
pathfindr 52:bd7678eade77 1615 modem.off(GLOBAL_modemOn); //HARD OR SOFT SHUT DOWN - DEPENDING ON modemOn state
pathfindr 34:4493c9f6d707 1616 if (GLOBAL_needToConfigureLis3dh) { lis3dh_configureForSleep(RET_setting_motion_g,RET_setting_impact_g); }
pathfindr 50:a94e70c00fff 1617 nrf_configureForSleep();
pathfindr 34:4493c9f6d707 1618 NRFuart_uninit();
pathfindr 34:4493c9f6d707 1619 watchdogKick();
pathfindr 34:4493c9f6d707 1620 //SLEEP
pathfindr 39:f767b8037475 1621 RET_asleep = true;
pathfindr 26:fa3579737329 1622 mainthread.wait(DEFAULT_SLEEP_FRAME);
pathfindr 34:4493c9f6d707 1623 }
pathfindr 7:e9a19750700d 1624 }