init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
main.cpp@6:388d3c7efdd9, 2018-11-14 (annotated)
- Committer:
- pathfindr
- Date:
- Wed Nov 14 16:08:28 2018 +0000
- Revision:
- 6:388d3c7efdd9
- Parent:
- 5:8f8951127724
- Child:
- 7:e9a19750700d
update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pathfindr | 0:94b743e06998 | 1 | #include "main.h" |
pathfindr | 0:94b743e06998 | 2 | #include "board.h" |
pathfindr | 0:94b743e06998 | 3 | #include "modes.h" |
pathfindr | 0:94b743e06998 | 4 | |
pathfindr | 5:8f8951127724 | 5 | //include "nrf_soc.h" |
pathfindr | 4:8d8e9bfa82e4 | 6 | |
pathfindr | 2:fd554f01abdf | 7 | //#include "ATCommand.h" |
pathfindr | 2:fd554f01abdf | 8 | |
pathfindr | 0:94b743e06998 | 9 | //LowPowerTicker ticker; //no impact on power consumption |
pathfindr | 0:94b743e06998 | 10 | |
pathfindr | 0:94b743e06998 | 11 | //------------------------------------------------------------------------------ |
pathfindr | 0:94b743e06998 | 12 | //Function declarations- Local |
pathfindr | 0:94b743e06998 | 13 | //------------------------------------------------------------------------------ |
pathfindr | 4:8d8e9bfa82e4 | 14 | static void mainStateEngine(void); |
pathfindr | 0:94b743e06998 | 15 | static void mode_mtu(void); |
pathfindr | 4:8d8e9bfa82e4 | 16 | static void selftest(void); |
pathfindr | 2:fd554f01abdf | 17 | static void LEDon(void); |
pathfindr | 0:94b743e06998 | 18 | static void LEDoff(void); |
pathfindr | 0:94b743e06998 | 19 | |
pathfindr | 0:94b743e06998 | 20 | //------------------------------------------------------------------------------ |
pathfindr | 0:94b743e06998 | 21 | //Var declarations- Local |
pathfindr | 0:94b743e06998 | 22 | //------------------------------------------------------------------------------ |
pathfindr | 0:94b743e06998 | 23 | bool accel_healthy = false; |
pathfindr | 4:8d8e9bfa82e4 | 24 | bool firstBoot = false; |
pathfindr | 4:8d8e9bfa82e4 | 25 | bool requireSoftReset = false; |
pathfindr | 0:94b743e06998 | 26 | |
pathfindr | 0:94b743e06998 | 27 | //------------------------------------------------------------------------------ |
pathfindr | 4:8d8e9bfa82e4 | 28 | //Var declarations- RETAINED NOINIT RAM |
pathfindr | 0:94b743e06998 | 29 | //------------------------------------------------------------------------------ |
pathfindr | 4:8d8e9bfa82e4 | 30 | #if defined ( __CC_ARM ) |
pathfindr | 4:8d8e9bfa82e4 | 31 | /** THIS IS THE MBED ONLINE COMPILER TOOLCHAIN*/ |
pathfindr | 6:388d3c7efdd9 | 32 | static uint8_t RET_mode __attribute__((section("noinit"),zero_init)); |
pathfindr | 6:388d3c7efdd9 | 33 | static uint32_t RET_unixtime_backup __attribute__((section("noinit"),zero_init)); |
pathfindr | 6:388d3c7efdd9 | 34 | static char RET_buffer[64] __attribute__((section("noinit"),zero_init)); |
pathfindr | 4:8d8e9bfa82e4 | 35 | #elif defined ( __GNUC__ ) |
pathfindr | 4:8d8e9bfa82e4 | 36 | #elif defined ( __ICCARM__ ) |
pathfindr | 4:8d8e9bfa82e4 | 37 | #endif |
pathfindr | 4:8d8e9bfa82e4 | 38 | |
pathfindr | 0:94b743e06998 | 39 | char RET_pf_identifier[9]; //includes null byte at end |
pathfindr | 0:94b743e06998 | 40 | int RET_interval_setting = 720; |
pathfindr | 0:94b743e06998 | 41 | int RET_interval_hours_failsafe = 24; |
pathfindr | 0:94b743e06998 | 42 | int RET_motioncheck_interval_seconds = 60; |
pathfindr | 0:94b743e06998 | 43 | int RET_gps_timeout = 180; |
pathfindr | 0:94b743e06998 | 44 | int RET_gsm_timeout = 120; |
pathfindr | 0:94b743e06998 | 45 | bool RET_gsmtimedout = false; |
pathfindr | 0:94b743e06998 | 46 | int RET_beacon_scan = 0; |
pathfindr | 0:94b743e06998 | 47 | int RET_accel_awake_thr = 11; |
pathfindr | 0:94b743e06998 | 48 | int RET_accel_awake_triggercount = 0; |
pathfindr | 0:94b743e06998 | 49 | int RET_accel_alarm_thr = 127; |
pathfindr | 0:94b743e06998 | 50 | unsigned long RET_unixtime_configrun = 0; |
pathfindr | 0:94b743e06998 | 51 | unsigned long RET_unixtime_lastpost = 0; |
pathfindr | 0:94b743e06998 | 52 | unsigned long RET_unixtime_nextpost = 0; |
pathfindr | 0:94b743e06998 | 53 | unsigned long RET_unixtime_nextpost_failsafe = 0; |
pathfindr | 0:94b743e06998 | 54 | unsigned long RET_unixtime_framestart = 0; |
pathfindr | 0:94b743e06998 | 55 | unsigned long RET_motionstarttime = 0; |
pathfindr | 0:94b743e06998 | 56 | unsigned long RET_motionstoptime = 0; |
pathfindr | 0:94b743e06998 | 57 | int RET_gsm_failcount = 0; |
pathfindr | 0:94b743e06998 | 58 | int RET_serverresponse_failcount = 0; |
pathfindr | 0:94b743e06998 | 59 | int RET_motionconsecutive = 0; |
pathfindr | 0:94b743e06998 | 60 | int RET_no_motionconsecutive = 0; |
pathfindr | 0:94b743e06998 | 61 | bool RET_wethinkinmotion = false; |
pathfindr | 0:94b743e06998 | 62 | bool RET_wethinkhasmoved = false; |
pathfindr | 0:94b743e06998 | 63 | bool RET_haveservertime = false; |
pathfindr | 0:94b743e06998 | 64 | float RET_operationTimeHours = 0; |
pathfindr | 0:94b743e06998 | 65 | float RET_operationFrameTimeHours = 0; |
pathfindr | 0:94b743e06998 | 66 | int RET_operationCount = 0; |
pathfindr | 0:94b743e06998 | 67 | char RET_operationTimeString[100]; |
pathfindr | 0:94b743e06998 | 68 | |
pathfindr | 0:94b743e06998 | 69 | |
pathfindr | 0:94b743e06998 | 70 | //------------------------------------------------------------------------------ |
pathfindr | 0:94b743e06998 | 71 | //Pin states |
pathfindr | 0:94b743e06998 | 72 | //------------------------------------------------------------------------------ |
pathfindr | 6:388d3c7efdd9 | 73 | DigitalOut led1(PN_LED); |
pathfindr | 6:388d3c7efdd9 | 74 | DigitalOut vreg_en(PN_VREG_EN); |
pathfindr | 6:388d3c7efdd9 | 75 | DigitalOut gsm_pwkey(PN_GSM_PWR_KEY); |
pathfindr | 6:388d3c7efdd9 | 76 | DigitalOut lis3dh_cs(PN_SPI_CS0); |
pathfindr | 6:388d3c7efdd9 | 77 | DigitalOut flash_cs(PN_SPI_CS1); |
pathfindr | 6:388d3c7efdd9 | 78 | DigitalIn lis3dh_int1(PN_ACC_INT1); //IMPACT |
pathfindr | 6:388d3c7efdd9 | 79 | DigitalIn lis3dh_int2(PN_ACC_INT2); //DISTURBED |
pathfindr | 0:94b743e06998 | 80 | |
pathfindr | 0:94b743e06998 | 81 | //------------------------------------------------------------------------------ |
pathfindr | 0:94b743e06998 | 82 | //Peripherals |
pathfindr | 0:94b743e06998 | 83 | //------------------------------------------------------------------------------ |
pathfindr | 4:8d8e9bfa82e4 | 84 | //BLE myble; |
pathfindr | 4:8d8e9bfa82e4 | 85 | #if NEED_CONSOLE_OUTPUT |
pathfindr | 6:388d3c7efdd9 | 86 | Serial uart(PN_UART_TX, PN_UART_RX, 115200); |
pathfindr | 4:8d8e9bfa82e4 | 87 | #endif |
pathfindr | 6:388d3c7efdd9 | 88 | //ATSerial atserial(PN_UART_TX, PN_UART_RX, 115200); |
pathfindr | 4:8d8e9bfa82e4 | 89 | WatchdogTimer watchdog(65.0); //Do not set to less than 4500ms or can cause issues with softdevice |
pathfindr | 2:fd554f01abdf | 90 | |
pathfindr | 6:388d3c7efdd9 | 91 | //------------------------------------------------------------------------------ |
pathfindr | 6:388d3c7efdd9 | 92 | //Singletons |
pathfindr | 6:388d3c7efdd9 | 93 | //------------------------------------------------------------------------------ |
pathfindr | 6:388d3c7efdd9 | 94 | NVStore &nvstore = NVStore::get_instance(); |
pathfindr | 6:388d3c7efdd9 | 95 | |
pathfindr | 0:94b743e06998 | 96 | |
pathfindr | 0:94b743e06998 | 97 | |
pathfindr | 4:8d8e9bfa82e4 | 98 | void gotoSleep(long sleep_milliseconds) { |
pathfindr | 2:fd554f01abdf | 99 | //accelerometer.configureForSleep(); |
pathfindr | 4:8d8e9bfa82e4 | 100 | |
pathfindr | 4:8d8e9bfa82e4 | 101 | if (requireSoftReset) { //dont need to clear this var as reset changes it back to false |
pathfindr | 6:388d3c7efdd9 | 102 | RET_unixtime_backup = time(NULL); //save unixtime for reset |
pathfindr | 4:8d8e9bfa82e4 | 103 | //NVIC_SystemReset(); |
pathfindr | 4:8d8e9bfa82e4 | 104 | system_reset(); |
pathfindr | 4:8d8e9bfa82e4 | 105 | } |
pathfindr | 4:8d8e9bfa82e4 | 106 | ThisThread::sleep_for(sleep_milliseconds); |
pathfindr | 0:94b743e06998 | 107 | } |
pathfindr | 0:94b743e06998 | 108 | |
pathfindr | 2:fd554f01abdf | 109 | void LED1on(long flash_milliseconds = 0) { |
pathfindr | 0:94b743e06998 | 110 | led1 = 0; |
pathfindr | 2:fd554f01abdf | 111 | if (flash_milliseconds > 0) { |
pathfindr | 2:fd554f01abdf | 112 | ThisThread::sleep_for(flash_milliseconds); |
pathfindr | 0:94b743e06998 | 113 | led1 = 1; |
pathfindr | 0:94b743e06998 | 114 | } |
pathfindr | 0:94b743e06998 | 115 | } |
pathfindr | 0:94b743e06998 | 116 | void LED1off() { |
pathfindr | 0:94b743e06998 | 117 | led1 = 1; |
pathfindr | 0:94b743e06998 | 118 | } |
pathfindr | 0:94b743e06998 | 119 | |
pathfindr | 6:388d3c7efdd9 | 120 | bool GSMon() { |
pathfindr | 6:388d3c7efdd9 | 121 | //power on GSM |
pathfindr | 6:388d3c7efdd9 | 122 | vreg_en = 1; |
pathfindr | 6:388d3c7efdd9 | 123 | ThisThread::sleep_for(500); |
pathfindr | 6:388d3c7efdd9 | 124 | gsm_pwkey = 0; |
pathfindr | 6:388d3c7efdd9 | 125 | ThisThread::sleep_for(1500); |
pathfindr | 6:388d3c7efdd9 | 126 | gsm_pwkey = 1; |
pathfindr | 6:388d3c7efdd9 | 127 | LED1on(1000); |
pathfindr | 6:388d3c7efdd9 | 128 | } |
pathfindr | 6:388d3c7efdd9 | 129 | |
pathfindr | 6:388d3c7efdd9 | 130 | void setup_CS_LIS3DH() |
pathfindr | 6:388d3c7efdd9 | 131 | { |
pathfindr | 6:388d3c7efdd9 | 132 | //Without this setup CS lines of AT45 & LIS3DH are in conflict, causing huge current consumption |
pathfindr | 6:388d3c7efdd9 | 133 | lis3dh_cs = 1; //not selected |
pathfindr | 6:388d3c7efdd9 | 134 | flash_cs = 1; //not selected |
pathfindr | 6:388d3c7efdd9 | 135 | //AT_RS = 0; //asserted == reset state |
pathfindr | 6:388d3c7efdd9 | 136 | //wait_ms(100); |
pathfindr | 6:388d3c7efdd9 | 137 | //AT_RS = 1; |
pathfindr | 6:388d3c7efdd9 | 138 | } |
pathfindr | 6:388d3c7efdd9 | 139 | |
pathfindr | 6:388d3c7efdd9 | 140 | void lis3dh_configureForSleep() { |
pathfindr | 6:388d3c7efdd9 | 141 | //init |
pathfindr | 6:388d3c7efdd9 | 142 | LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK); |
pathfindr | 6:388d3c7efdd9 | 143 | requireSoftReset = true; //WE HAVE STARTED SPI SO NEED THIS |
pathfindr | 6:388d3c7efdd9 | 144 | //Mode |
pathfindr | 6:388d3c7efdd9 | 145 | lis3dh.InitLIS3DH(LIS3DH_NORMAL, LIS3DH_ODR_25Hz, LIS3DH_FULLSCALE_8); |
pathfindr | 6:388d3c7efdd9 | 146 | lis3dh.LIS3DH_SetIntMode(LIS3DH_INT_MODE_6D_MOVEMENT); |
pathfindr | 6:388d3c7efdd9 | 147 | //Int1 |
pathfindr | 6:388d3c7efdd9 | 148 | lis3dh.LIS3DH_SetInt1Pin(LIS3DH_CLICK_ON_PIN_INT1_DISABLE | LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE | |
pathfindr | 6:388d3c7efdd9 | 149 | LIS3DH_I1_INT2_ON_PIN_INT1_DISABLE | LIS3DH_I1_DRDY1_ON_INT1_DISABLE | LIS3DH_I1_DRDY2_ON_INT1_DISABLE | |
pathfindr | 6:388d3c7efdd9 | 150 | LIS3DH_WTM_ON_INT1_DISABLE | LIS3DH_INT1_OVERRUN_DISABLE ); |
pathfindr | 6:388d3c7efdd9 | 151 | lis3dh.LIS3DH_SetInt1Threshold(10); |
pathfindr | 6:388d3c7efdd9 | 152 | lis3dh.LIS3DH_SetIntConfiguration(LIS3DH_INT1_ZHIE_ENABLE | LIS3DH_INT1_ZLIE_ENABLE | |
pathfindr | 6:388d3c7efdd9 | 153 | LIS3DH_INT1_YHIE_ENABLE | LIS3DH_INT1_YLIE_ENABLE | |
pathfindr | 6:388d3c7efdd9 | 154 | LIS3DH_INT1_XHIE_ENABLE | LIS3DH_INT1_XLIE_ENABLE ); |
pathfindr | 6:388d3c7efdd9 | 155 | lis3dh.LIS3DH_SetInt1Duration(0); |
pathfindr | 6:388d3c7efdd9 | 156 | lis3dh.LIS3DH_Int1LatchEnable(MEMS_ENABLE); |
pathfindr | 6:388d3c7efdd9 | 157 | //HP filter |
pathfindr | 6:388d3c7efdd9 | 158 | lis3dh.LIS3DH_SetHPFMode(LIS3DH_HPM_AUTORESET_INT); |
pathfindr | 6:388d3c7efdd9 | 159 | lis3dh.LIS3DH_SetFilterDataSel(MEMS_ENABLE); |
pathfindr | 6:388d3c7efdd9 | 160 | lis3dh.LIS3DH_HPFAOI1Enable(MEMS_ENABLE); |
pathfindr | 6:388d3c7efdd9 | 161 | lis3dh.LIS3DH_HPFAOI2Enable(MEMS_ENABLE); |
pathfindr | 6:388d3c7efdd9 | 162 | } |
pathfindr | 6:388d3c7efdd9 | 163 | |
pathfindr | 4:8d8e9bfa82e4 | 164 | void resetState() { |
pathfindr | 4:8d8e9bfa82e4 | 165 | firstBoot = true; |
pathfindr | 6:388d3c7efdd9 | 166 | |
pathfindr | 6:388d3c7efdd9 | 167 | //RESET VARS |
pathfindr | 4:8d8e9bfa82e4 | 168 | RET_mode = 0; |
pathfindr | 6:388d3c7efdd9 | 169 | RET_unixtime_backup = 0; |
pathfindr | 6:388d3c7efdd9 | 170 | set_time(RET_unixtime_backup); |
pathfindr | 6:388d3c7efdd9 | 171 | |
pathfindr | 6:388d3c7efdd9 | 172 | //SET IDENTIFIER |
pathfindr | 6:388d3c7efdd9 | 173 | uint32_t nv_value = 12345678; |
pathfindr | 6:388d3c7efdd9 | 174 | int rc = nvstore.set(NV_IDENTIFIER, sizeof(nv_value), &nv_value); |
pathfindr | 4:8d8e9bfa82e4 | 175 | } |
pathfindr | 4:8d8e9bfa82e4 | 176 | |
pathfindr | 6:388d3c7efdd9 | 177 | void mainStateEngine() { |
pathfindr | 6:388d3c7efdd9 | 178 | |
pathfindr | 6:388d3c7efdd9 | 179 | RET_mode = MODE_NORMAL; |
pathfindr | 6:388d3c7efdd9 | 180 | |
pathfindr | 6:388d3c7efdd9 | 181 | |
pathfindr | 6:388d3c7efdd9 | 182 | switch(RET_mode) { |
pathfindr | 6:388d3c7efdd9 | 183 | case MODE_SETUP : |
pathfindr | 6:388d3c7efdd9 | 184 | resetState(); |
pathfindr | 6:388d3c7efdd9 | 185 | //selftest(); |
pathfindr | 6:388d3c7efdd9 | 186 | break; |
pathfindr | 6:388d3c7efdd9 | 187 | |
pathfindr | 6:388d3c7efdd9 | 188 | case MODE_NORMAL : |
pathfindr | 6:388d3c7efdd9 | 189 | |
pathfindr | 6:388d3c7efdd9 | 190 | if (RET_requireMotionFlag) { |
pathfindr | 6:388d3c7efdd9 | 191 | bool MotionFlagTriggered = false; |
pathfindr | 6:388d3c7efdd9 | 192 | |
pathfindr | 6:388d3c7efdd9 | 193 | //check interrupt |
pathfindr | 6:388d3c7efdd9 | 194 | if (lis3dh_int2) { |
pathfindr | 6:388d3c7efdd9 | 195 | MotionFlagTriggered = true; |
pathfindr | 6:388d3c7efdd9 | 196 | } |
pathfindr | 6:388d3c7efdd9 | 197 | } |
pathfindr | 6:388d3c7efdd9 | 198 | |
pathfindr | 6:388d3c7efdd9 | 199 | break; |
pathfindr | 6:388d3c7efdd9 | 200 | |
pathfindr | 6:388d3c7efdd9 | 201 | case MODE_DORMANT : |
pathfindr | 6:388d3c7efdd9 | 202 | |
pathfindr | 6:388d3c7efdd9 | 203 | break; |
pathfindr | 6:388d3c7efdd9 | 204 | |
pathfindr | 6:388d3c7efdd9 | 205 | case MODE_OFF_48HRS : |
pathfindr | 6:388d3c7efdd9 | 206 | |
pathfindr | 6:388d3c7efdd9 | 207 | break; |
pathfindr | 6:388d3c7efdd9 | 208 | |
pathfindr | 6:388d3c7efdd9 | 209 | default : |
pathfindr | 6:388d3c7efdd9 | 210 | RET_mode = MODE_SETUP; |
pathfindr | 6:388d3c7efdd9 | 211 | } |
pathfindr | 6:388d3c7efdd9 | 212 | } |
pathfindr | 6:388d3c7efdd9 | 213 | |
pathfindr | 6:388d3c7efdd9 | 214 | |
pathfindr | 0:94b743e06998 | 215 | int main() { |
pathfindr | 4:8d8e9bfa82e4 | 216 | led1 = 1; |
pathfindr | 4:8d8e9bfa82e4 | 217 | |
pathfindr | 4:8d8e9bfa82e4 | 218 | //CHECK IF THIS IS RESET |
pathfindr | 4:8d8e9bfa82e4 | 219 | //0x00000004 == soft reset //0x00000002 == watchdog //0x00000001 == button/hardreset |
pathfindr | 4:8d8e9bfa82e4 | 220 | if (NRF_POWER->RESETREAS != 0xffffffff) { |
pathfindr | 4:8d8e9bfa82e4 | 221 | switch(NRF_POWER->RESETREAS) { |
pathfindr | 4:8d8e9bfa82e4 | 222 | case 0x00000001 : |
pathfindr | 4:8d8e9bfa82e4 | 223 | DEBUG("reset_reason: 0x%08x. - Hard Reset\n",NRF_POWER->RESETREAS); |
pathfindr | 4:8d8e9bfa82e4 | 224 | resetState(); |
pathfindr | 4:8d8e9bfa82e4 | 225 | break; |
pathfindr | 4:8d8e9bfa82e4 | 226 | case 0x00000002 : |
pathfindr | 4:8d8e9bfa82e4 | 227 | DEBUG("reset_reason: 0x%08x. - Watchdog\n",NRF_POWER->RESETREAS); |
pathfindr | 6:388d3c7efdd9 | 228 | set_time(RET_unixtime_backup); |
pathfindr | 4:8d8e9bfa82e4 | 229 | break; |
pathfindr | 4:8d8e9bfa82e4 | 230 | case 0x00000004 : |
pathfindr | 4:8d8e9bfa82e4 | 231 | DEBUG("reset_reason: 0x%08x. - Soft reset\n",NRF_POWER->RESETREAS); |
pathfindr | 6:388d3c7efdd9 | 232 | set_time(RET_unixtime_backup); |
pathfindr | 4:8d8e9bfa82e4 | 233 | break; |
pathfindr | 4:8d8e9bfa82e4 | 234 | } |
pathfindr | 4:8d8e9bfa82e4 | 235 | NRF_POWER->RESETREAS = 0xffffffff; |
pathfindr | 4:8d8e9bfa82e4 | 236 | } |
pathfindr | 4:8d8e9bfa82e4 | 237 | |
pathfindr | 0:94b743e06998 | 238 | while(true) { |
pathfindr | 4:8d8e9bfa82e4 | 239 | //GOTO TO SLEEP |
pathfindr | 4:8d8e9bfa82e4 | 240 | if (!firstBoot) gotoSleep(60000); |
pathfindr | 5:8f8951127724 | 241 | LED1on(20); |
pathfindr | 4:8d8e9bfa82e4 | 242 | watchdog.kick(); |
pathfindr | 4:8d8e9bfa82e4 | 243 | |
pathfindr | 4:8d8e9bfa82e4 | 244 | //MAIN STATE ENGINE |
pathfindr | 4:8d8e9bfa82e4 | 245 | mainStateEngine(); |
pathfindr | 0:94b743e06998 | 246 | } |
pathfindr | 0:94b743e06998 | 247 | } |
pathfindr | 0:94b743e06998 | 248 | |
pathfindr | 0:94b743e06998 | 249 | |
pathfindr | 0:94b743e06998 | 250 | |
pathfindr | 2:fd554f01abdf | 251 | /* |
pathfindr | 0:94b743e06998 | 252 | void initMotion() { |
pathfindr | 0:94b743e06998 | 253 | //CHECK FOR ANY MOTION |
pathfindr | 0:94b743e06998 | 254 | if (!accelerometer.selfTest()) { |
pathfindr | 0:94b743e06998 | 255 | if (exceptions.find("A.") < 0) { |
pathfindr | 0:94b743e06998 | 256 | exceptions += "A."; |
pathfindr | 0:94b743e06998 | 257 | } |
pathfindr | 0:94b743e06998 | 258 | DEBUG("Couldnt start accelerometer"); |
pathfindr | 0:94b743e06998 | 259 | } else { |
pathfindr | 0:94b743e06998 | 260 | accel_healthy = true; |
pathfindr | 0:94b743e06998 | 261 | } |
pathfindr | 0:94b743e06998 | 262 | } |
pathfindr | 6:388d3c7efdd9 | 263 | */ |
pathfindr | 0:94b743e06998 | 264 | |
pathfindr | 6:388d3c7efdd9 | 265 | /* |
pathfindr | 0:94b743e06998 | 266 | void mode_mtu() { |
pathfindr | 6:388d3c7efdd9 | 267 | bool accel_awake = accelerometer.getINT2(); |
pathfindr | 0:94b743e06998 | 268 | |
pathfindr | 0:94b743e06998 | 269 | //CHECK FOR MOTION |
pathfindr | 0:94b743e06998 | 270 | if (accel_awake == true) { |
pathfindr | 0:94b743e06998 | 271 | LED1on(50); |
pathfindr | 0:94b743e06998 | 272 | RET_motionconsecutive ++; |
pathfindr | 0:94b743e06998 | 273 | RET_no_motionconsecutive = 0; |
pathfindr | 0:94b743e06998 | 274 | |
pathfindr | 0:94b743e06998 | 275 | //this is needed to ensure accel_awake_triggercount is 1 or higher for mode 2 |
pathfindr | 0:94b743e06998 | 276 | if (RET_accel_awake_triggercount == 0) { |
pathfindr | 0:94b743e06998 | 277 | RET_accel_awake_triggercount = 1; |
pathfindr | 0:94b743e06998 | 278 | } |
pathfindr | 0:94b743e06998 | 279 | |
pathfindr | 0:94b743e06998 | 280 | if (RET_motionconsecutive == RET_accel_awake_triggercount && RET_wethinkinmotion == false) { |
pathfindr | 0:94b743e06998 | 281 | RET_wethinkinmotion = true; |
pathfindr | 0:94b743e06998 | 282 | RET_motionstarttime = (time(NULL) - ((RET_accel_awake_triggercount+1) * RET_motioncheck_interval_seconds)); |
pathfindr | 0:94b743e06998 | 283 | long eventEpoch = RET_motionstarttime; |
pathfindr | 0:94b743e06998 | 284 | long epochoffsetminutes = ((eventEpoch - RET_unixtime_framestart) / 60); |
pathfindr | 0:94b743e06998 | 285 | |
pathfindr | 0:94b743e06998 | 286 | char buf[20]; |
pathfindr | 0:94b743e06998 | 287 | sprintf(buf,"1.%i!", epochoffsetminutes); |
pathfindr | 0:94b743e06998 | 288 | strcat(RET_operationTimeString, buf); |
pathfindr | 0:94b743e06998 | 289 | RET_operationCount ++; |
pathfindr | 0:94b743e06998 | 290 | |
pathfindr | 0:94b743e06998 | 291 | DEBUG("%s", RET_operationTimeString); |
pathfindr | 0:94b743e06998 | 292 | |
pathfindr | 0:94b743e06998 | 293 | LEDon(100); |
pathfindr | 0:94b743e06998 | 294 | LEDon(100); |
pathfindr | 0:94b743e06998 | 295 | LEDon(100); |
pathfindr | 0:94b743e06998 | 296 | LEDon(100); |
pathfindr | 0:94b743e06998 | 297 | } |
pathfindr | 0:94b743e06998 | 298 | } else if (accel_awake == false) { |
pathfindr | 0:94b743e06998 | 299 | RET_no_motionconsecutive ++; |
pathfindr | 0:94b743e06998 | 300 | RET_motionconsecutive = 0; |
pathfindr | 0:94b743e06998 | 301 | if (RET_no_motionconsecutive == RET_accel_awake_triggercount && RET_wethinkinmotion == true) { |
pathfindr | 0:94b743e06998 | 302 | RET_wethinkinmotion = false; |
pathfindr | 0:94b743e06998 | 303 | // log engine stop |
pathfindr | 0:94b743e06998 | 304 | RET_motionstoptime = (time(NULL) - ((RET_accel_awake_triggercount+1) * RET_motioncheck_interval_seconds)); |
pathfindr | 0:94b743e06998 | 305 | long eventEpoch = RET_motionstoptime; |
pathfindr | 0:94b743e06998 | 306 | long epochoffsetminutes = ((eventEpoch - RET_unixtime_framestart) / 60); |
pathfindr | 0:94b743e06998 | 307 | |
pathfindr | 0:94b743e06998 | 308 | char buf[20]; |
pathfindr | 0:94b743e06998 | 309 | sprintf(buf,"0.%i!", epochoffsetminutes); |
pathfindr | 0:94b743e06998 | 310 | strcat(RET_operationTimeString, buf); |
pathfindr | 0:94b743e06998 | 311 | |
pathfindr | 0:94b743e06998 | 312 | RET_operationFrameTimeHours = (float(RET_motionstoptime - RET_motionstarttime) / 3600.0); |
pathfindr | 0:94b743e06998 | 313 | RET_operationTimeHours += RET_operationFrameTimeHours; |
pathfindr | 0:94b743e06998 | 314 | |
pathfindr | 0:94b743e06998 | 315 | //test by posting on every stop event |
pathfindr | 0:94b743e06998 | 316 | //doOperationTimePost = true; |
pathfindr | 0:94b743e06998 | 317 | |
pathfindr | 0:94b743e06998 | 318 | DEBUG("%i", RET_operationTimeHours); |
pathfindr | 0:94b743e06998 | 319 | LEDon(500); |
pathfindr | 0:94b743e06998 | 320 | } |
pathfindr | 0:94b743e06998 | 321 | } |
pathfindr | 0:94b743e06998 | 322 | |
pathfindr | 0:94b743e06998 | 323 | |
pathfindr | 0:94b743e06998 | 324 | // Check time interval for location run |
pathfindr | 0:94b743e06998 | 325 | if (time(NULL) > RET_unixtime_nextpost_failsafe) { |
pathfindr | 0:94b743e06998 | 326 | //setfailsafetime(); //these must be before gpsPost, incase gpsPost fails, then stuck in broadcast loop |
pathfindr | 0:94b743e06998 | 327 | //gpsPost(); |
pathfindr | 0:94b743e06998 | 328 | } |
pathfindr | 0:94b743e06998 | 329 | |
pathfindr | 0:94b743e06998 | 330 | //Check for operatingTime post time or if data buffer is full for force post |
pathfindr | 0:94b743e06998 | 331 | if (RET_operationFrameTimeHours > 0.0) { |
pathfindr | 0:94b743e06998 | 332 | if (time(NULL) > RET_unixtime_nextpost || strlen(RET_operationTimeString) > 60) { |
pathfindr | 0:94b743e06998 | 333 | //only bother if we actual have data to post |
pathfindr | 0:94b743e06998 | 334 | //setwaketime(); //these must be before gpsPost, incase gpsPost fails, then stuck in broadcast loop |
pathfindr | 0:94b743e06998 | 335 | //uploadOperationTimeData(); |
pathfindr | 0:94b743e06998 | 336 | } |
pathfindr | 0:94b743e06998 | 337 | } |
pathfindr | 0:94b743e06998 | 338 | |
pathfindr | 0:94b743e06998 | 339 | } |
pathfindr | 2:fd554f01abdf | 340 | */ |
pathfindr | 0:94b743e06998 | 341 | |
pathfindr | 0:94b743e06998 | 342 | |
pathfindr | 0:94b743e06998 | 343 | |
pathfindr | 0:94b743e06998 | 344 | |
pathfindr | 6:388d3c7efdd9 | 345 | |
pathfindr | 2:fd554f01abdf | 346 | /* |
pathfindr | 0:94b743e06998 | 347 | |
pathfindr | 0:94b743e06998 | 348 | int selftest() { |
pathfindr | 0:94b743e06998 | 349 | int result = 0; |
pathfindr | 0:94b743e06998 | 350 | int tests = 0; |
pathfindr | 0:94b743e06998 | 351 | int testscore = 0; |
pathfindr | 0:94b743e06998 | 352 | led1 = 0; |
pathfindr | 0:94b743e06998 | 353 | string failures; |
pathfindr | 0:94b743e06998 | 354 | |
pathfindr | 0:94b743e06998 | 355 | //Accelerometer |
pathfindr | 0:94b743e06998 | 356 | tests ++; |
pathfindr | 0:94b743e06998 | 357 | if (accelerometer.read_id() == 51){ |
pathfindr | 0:94b743e06998 | 358 | testscore ++; |
pathfindr | 0:94b743e06998 | 359 | } else { |
pathfindr | 0:94b743e06998 | 360 | //Accelerometer Fail |
pathfindr | 0:94b743e06998 | 361 | failures += 'Ac,'; |
pathfindr | 0:94b743e06998 | 362 | }; |
pathfindr | 0:94b743e06998 | 363 | |
pathfindr | 0:94b743e06998 | 364 | return result; |
pathfindr | 2:fd554f01abdf | 365 | } |
pathfindr | 4:8d8e9bfa82e4 | 366 | */ |
pathfindr | 4:8d8e9bfa82e4 | 367 | |
pathfindr | 4:8d8e9bfa82e4 | 368 | |
pathfindr | 4:8d8e9bfa82e4 | 369 | /* |
pathfindr | 4:8d8e9bfa82e4 | 370 | void readRegs(uint8_t addr, uint8_t * data, int len) { |
pathfindr | 4:8d8e9bfa82e4 | 371 | lis3dh_cs = 0; |
pathfindr | 4:8d8e9bfa82e4 | 372 | for (int i = 0 ; i < len ; i++ ) { |
pathfindr | 4:8d8e9bfa82e4 | 373 | spi.write((addr+i)|0x80) ; // specify address to read |
pathfindr | 4:8d8e9bfa82e4 | 374 | data[i] = spi.write((addr+i)|0x80) ; |
pathfindr | 4:8d8e9bfa82e4 | 375 | } |
pathfindr | 4:8d8e9bfa82e4 | 376 | spi.write(0x00) ; // to terminate read mode |
pathfindr | 4:8d8e9bfa82e4 | 377 | lis3dh_cs = 1; |
pathfindr | 4:8d8e9bfa82e4 | 378 | } |
pathfindr | 4:8d8e9bfa82e4 | 379 | |
pathfindr | 4:8d8e9bfa82e4 | 380 | uint8_t read_reg(uint8_t addr) |
pathfindr | 4:8d8e9bfa82e4 | 381 | { |
pathfindr | 4:8d8e9bfa82e4 | 382 | uint8_t data[1] ; |
pathfindr | 4:8d8e9bfa82e4 | 383 | readRegs(addr, data, 1) ; |
pathfindr | 4:8d8e9bfa82e4 | 384 | return( data[0] ) ; |
pathfindr | 4:8d8e9bfa82e4 | 385 | } |
pathfindr | 4:8d8e9bfa82e4 | 386 | */ |
pathfindr | 4:8d8e9bfa82e4 | 387 | |
pathfindr | 4:8d8e9bfa82e4 | 388 | |
pathfindr | 4:8d8e9bfa82e4 | 389 | |
pathfindr | 4:8d8e9bfa82e4 | 390 | |
pathfindr | 4:8d8e9bfa82e4 | 391 | |
pathfindr | 4:8d8e9bfa82e4 | 392 | |
pathfindr | 4:8d8e9bfa82e4 | 393 | |
pathfindr | 4:8d8e9bfa82e4 | 394 | |
pathfindr | 4:8d8e9bfa82e4 | 395 | |
pathfindr | 4:8d8e9bfa82e4 | 396 | |
pathfindr | 4:8d8e9bfa82e4 | 397 | |
pathfindr | 4:8d8e9bfa82e4 | 398 | |
pathfindr | 4:8d8e9bfa82e4 | 399 | /* |
pathfindr | 4:8d8e9bfa82e4 | 400 | //OPTION 1 |
pathfindr | 4:8d8e9bfa82e4 | 401 | // Switch on both RAM banks when in System OFF mode. |
pathfindr | 4:8d8e9bfa82e4 | 402 | NRF_POWER->RAMON |= (POWER_RAMON_OFFRAM0_RAM0On << POWER_RAMON_OFFRAM0_Pos) | |
pathfindr | 4:8d8e9bfa82e4 | 403 | (POWER_RAMON_OFFRAM1_RAM1On << POWER_RAMON_OFFRAM1_Pos); |
pathfindr | 4:8d8e9bfa82e4 | 404 | |
pathfindr | 4:8d8e9bfa82e4 | 405 | // Enter System OFF and wait for wake up from GPIO detect signal. |
pathfindr | 4:8d8e9bfa82e4 | 406 | NRF_POWER->SYSTEMOFF = 0x1; |
pathfindr | 4:8d8e9bfa82e4 | 407 | |
pathfindr | 4:8d8e9bfa82e4 | 408 | |
pathfindr | 4:8d8e9bfa82e4 | 409 | //spi.close(); |
pathfindr | 4:8d8e9bfa82e4 | 410 | |
pathfindr | 4:8d8e9bfa82e4 | 411 | //delete spi; |
pathfindr | 4:8d8e9bfa82e4 | 412 | //spi_disable(); |
pathfindr | 4:8d8e9bfa82e4 | 413 | |
pathfindr | 4:8d8e9bfa82e4 | 414 | //spi_free(spi); |
pathfindr | 4:8d8e9bfa82e4 | 415 | |
pathfindr | 4:8d8e9bfa82e4 | 416 | //nrf_drv_spi_uninit(spi); |
pathfindr | 4:8d8e9bfa82e4 | 417 | //nordic_nrf5_spi_initialized[instance] = false; |
pathfindr | 4:8d8e9bfa82e4 | 418 | //HFCLKSTOP = 0x1; |
pathfindr | 4:8d8e9bfa82e4 | 419 | |
pathfindr | 4:8d8e9bfa82e4 | 420 | NRF_SPI0->ENABLE = 0; |
pathfindr | 4:8d8e9bfa82e4 | 421 | NRF_SPI1->ENABLE = 0; |
pathfindr | 4:8d8e9bfa82e4 | 422 | NRF_SPI2->ENABLE = 0; |
pathfindr | 4:8d8e9bfa82e4 | 423 | NRF_TWI0->ENABLE = 0; |
pathfindr | 4:8d8e9bfa82e4 | 424 | NRF_TWI1->ENABLE = 0; |
pathfindr | 4:8d8e9bfa82e4 | 425 | |
pathfindr | 4:8d8e9bfa82e4 | 426 | sd_clock_hfclk_release(); |
pathfindr | 4:8d8e9bfa82e4 | 427 | NRF_POWER->SYSTEMOFF=1; |
pathfindr | 4:8d8e9bfa82e4 | 428 | //NRF_SPI0->POWER = 0; |
pathfindr | 4:8d8e9bfa82e4 | 429 | |
pathfindr | 4:8d8e9bfa82e4 | 430 | //OPTION 3 |
pathfindr | 4:8d8e9bfa82e4 | 431 | |
pathfindr | 4:8d8e9bfa82e4 | 432 | *(volatile uint32_t *)0x40003FFC = 0; |
pathfindr | 4:8d8e9bfa82e4 | 433 | *(volatile uint32_t *)0x40003FFC; |
pathfindr | 4:8d8e9bfa82e4 | 434 | *(volatile uint32_t *)0x40003FFC = 1; |
pathfindr | 4:8d8e9bfa82e4 | 435 | |
pathfindr | 4:8d8e9bfa82e4 | 436 | NRF_SPI0->ENABLE = (SPI_ENABLE_ENABLE_Disabled << SPI_ENABLE_ENABLE_Pos); |
pathfindr | 4:8d8e9bfa82e4 | 437 | NRF_SPI1->ENABLE = (SPI_ENABLE_ENABLE_Disabled << SPI_ENABLE_ENABLE_Pos); |
pathfindr | 4:8d8e9bfa82e4 | 438 | |
pathfindr | 4:8d8e9bfa82e4 | 439 | |
pathfindr | 4:8d8e9bfa82e4 | 440 | if (sleep_manager_can_deep_sleep()) { |
pathfindr | 4:8d8e9bfa82e4 | 441 | ThisThread::sleep_for(10000); |
pathfindr | 4:8d8e9bfa82e4 | 442 | } else { |
pathfindr | 4:8d8e9bfa82e4 | 443 | led1 = 0; |
pathfindr | 4:8d8e9bfa82e4 | 444 | wait(50.0); |
pathfindr | 4:8d8e9bfa82e4 | 445 | } |
pathfindr | 4:8d8e9bfa82e4 | 446 | |
pathfindr | 4:8d8e9bfa82e4 | 447 | //system_reset(); |
pathfindr | 4:8d8e9bfa82e4 | 448 | */ |
pathfindr | 4:8d8e9bfa82e4 | 449 | |
pathfindr | 4:8d8e9bfa82e4 | 450 | |
pathfindr | 4:8d8e9bfa82e4 | 451 | //time_t unixtime = time(NULL); |
pathfindr | 4:8d8e9bfa82e4 | 452 | //DEBUG("got: %i, %d, %d \n", RET_mode, RET_unixtime, unixtime); |
pathfindr | 6:388d3c7efdd9 | 453 | |
pathfindr | 6:388d3c7efdd9 | 454 | /* |
pathfindr | 6:388d3c7efdd9 | 455 | uint8_t acc_id; |
pathfindr | 6:388d3c7efdd9 | 456 | lis3dh.LIS3DH_GetWHO_AM_I(&acc_id); |
pathfindr | 6:388d3c7efdd9 | 457 | uart.printf("%i \n\r", acc_id); |
pathfindr | 6:388d3c7efdd9 | 458 | */ |
pathfindr | 6:388d3c7efdd9 | 459 | |
pathfindr | 6:388d3c7efdd9 | 460 | /* |
pathfindr | 6:388d3c7efdd9 | 461 | AxesRaw_t accel_raw; |
pathfindr | 6:388d3c7efdd9 | 462 | lis3dh.LIS3DH_GetAccAxesRaw(&accel_raw); |
pathfindr | 6:388d3c7efdd9 | 463 | |
pathfindr | 6:388d3c7efdd9 | 464 | uart.printf("x="); |
pathfindr | 6:388d3c7efdd9 | 465 | uart.printf("%i", accel_raw.AXIS_X); |
pathfindr | 6:388d3c7efdd9 | 466 | uart.printf(" y="); |
pathfindr | 6:388d3c7efdd9 | 467 | uart.printf("%i", accel_raw.AXIS_Y); |
pathfindr | 6:388d3c7efdd9 | 468 | uart.printf(" z="); |
pathfindr | 6:388d3c7efdd9 | 469 | uart.printf("%i", accel_raw.AXIS_Z); |
pathfindr | 6:388d3c7efdd9 | 470 | uart.printf("\n\r"); |
pathfindr | 6:388d3c7efdd9 | 471 | */ |