init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

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?

UserRevisionLine numberNew 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 */