init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
Diff: main.cpp
- Revision:
- 0:94b743e06998
- Child:
- 2:fd554f01abdf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Oct 27 23:08:33 2018 +0000 @@ -0,0 +1,268 @@ +#include "main.h" +#include "board.h" +#include "modes.h" + +//LowPowerTicker ticker; //no impact on power consumption + +//------------------------------------------------------------------------------ +//Function declarations- Local +//------------------------------------------------------------------------------ +static void setup(void); +static void loop(void); +static void mode_mtu(void); +static int selftest(void); +static void LEDon(int milliseconds); +static void LEDoff(void); + +//------------------------------------------------------------------------------ +//Var declarations- Local +//------------------------------------------------------------------------------ +int mode = 0; +string exceptions = ""; +bool accel_healthy = false; + +//------------------------------------------------------------------------------ +//Var declarations- RETAINED +//------------------------------------------------------------------------------ +int RET_mode = 0; +char RET_pf_identifier[9]; //includes null byte at end +int RET_interval_setting = 720; +int RET_interval_hours_failsafe = 24; +int RET_motioncheck_interval_seconds = 60; +int RET_gps_timeout = 180; +int RET_gsm_timeout = 120; +bool RET_gsmtimedout = false; +int RET_beacon_scan = 0; +int RET_accel_awake_thr = 11; +int RET_accel_awake_triggercount = 0; +int RET_accel_alarm_thr = 127; +unsigned long RET_unixtime_configrun = 0; +unsigned long RET_unixtime_lastpost = 0; +unsigned long RET_unixtime_nextpost = 0; +unsigned long RET_unixtime_nextpost_failsafe = 0; +unsigned long RET_unixtime_framestart = 0; +unsigned long RET_motionstarttime = 0; +unsigned long RET_motionstoptime = 0; +int RET_gsm_failcount = 0; +int RET_serverresponse_failcount = 0; +int RET_motionconsecutive = 0; +int RET_no_motionconsecutive = 0; +bool RET_wethinkinmotion = false; +bool RET_wethinkhasmoved = false; +bool RET_haveservertime = false; +float RET_operationTimeHours = 0; +float RET_operationFrameTimeHours = 0; +int RET_operationCount = 0; +char RET_operationTimeString[100]; + + +//------------------------------------------------------------------------------ +//Pin states +//------------------------------------------------------------------------------ +DigitalOut led1(p11); +DigitalOut vreg_en(p29); +DigitalOut gsm_pwkey(p28); + +//------------------------------------------------------------------------------ +//Peripherals +//------------------------------------------------------------------------------ +Serial uart(USBTX, USBRX, 115200); +LIS3DH accelerometer(p23, p19, p24, p22, LIS3DH_DR_NR_LP_25HZ, LIS3DH_FS_8G); +BLE myble; + + +void gotosleep(long milliseconds) { + accelerometer.configureForSleep(); + Thread::wait(milliseconds); + //system_reset(); +} + +void LED1on(int milliseconds = 0) { + led1 = 0; + if (milliseconds > 0) { + Thread::wait(milliseconds); + led1 = 1; + } +} +void LED1off() { + led1 = 1; +} + +int main() { + setup(); + while(true) { + loop(); + } +} + + +void setup() { + led1 = 1; + set_time(1256729737); + + LIS3DH accelerometer(p23, p19, p24, p22, LIS3DH_DR_NR_LP_25HZ, LIS3DH_FS_8G); + accelerometer.configureForSleep(); +} + +void loop() { + + bool accel_awake; + //uart.printf("blah blah blah"); + //sleep_manager_lock_deep_sleep(); + //uart.printf("Deep sleep allowed: %i\r\n", sleep_manager_can_deep_sleep()); + /* + if (accelerometer.read_id() == 51){ + led1 = 0; + Thread::wait(20); + led1 = 1; + } else { + led1 = 1; + }; + */ + mode = MODE_SETUP; + + switch(mode) { + case MODE_SETUP : + + selftest(); + break; + + case MODE_INTERVAL : + + break; + + case MODE_INTELLIGENT : + + break; + + case MODE_MTU : + mode_mtu(); + break; + + case MODE_DORMANT : + + break; + + default : + mode = MODE_SETUP; + } + + + + + gotosleep(60000); +} + + + + +void initMotion() { + //CHECK FOR ANY MOTION + if (!accelerometer.selfTest()) { + if (exceptions.find("A.") < 0) { + exceptions += "A."; + } + DEBUG("Couldnt start accelerometer"); + } else { + accel_healthy = true; + } +} + +void mode_mtu() { + bool accel_awake = accelerometer.getINT2(); + + //CHECK FOR MOTION + if (accel_awake == true) { + LED1on(50); + RET_motionconsecutive ++; + RET_no_motionconsecutive = 0; + + //this is needed to ensure accel_awake_triggercount is 1 or higher for mode 2 + if (RET_accel_awake_triggercount == 0) { + RET_accel_awake_triggercount = 1; + } + + if (RET_motionconsecutive == RET_accel_awake_triggercount && RET_wethinkinmotion == false) { + RET_wethinkinmotion = true; + RET_motionstarttime = (time(NULL) - ((RET_accel_awake_triggercount+1) * RET_motioncheck_interval_seconds)); + long eventEpoch = RET_motionstarttime; + long epochoffsetminutes = ((eventEpoch - RET_unixtime_framestart) / 60); + + char buf[20]; + sprintf(buf,"1.%i!", epochoffsetminutes); + strcat(RET_operationTimeString, buf); + RET_operationCount ++; + + DEBUG("%s", RET_operationTimeString); + + LEDon(100); + LEDon(100); + LEDon(100); + LEDon(100); + } + } else if (accel_awake == false) { + RET_no_motionconsecutive ++; + RET_motionconsecutive = 0; + if (RET_no_motionconsecutive == RET_accel_awake_triggercount && RET_wethinkinmotion == true) { + RET_wethinkinmotion = false; + // log engine stop + RET_motionstoptime = (time(NULL) - ((RET_accel_awake_triggercount+1) * RET_motioncheck_interval_seconds)); + long eventEpoch = RET_motionstoptime; + long epochoffsetminutes = ((eventEpoch - RET_unixtime_framestart) / 60); + + char buf[20]; + sprintf(buf,"0.%i!", epochoffsetminutes); + strcat(RET_operationTimeString, buf); + + RET_operationFrameTimeHours = (float(RET_motionstoptime - RET_motionstarttime) / 3600.0); + RET_operationTimeHours += RET_operationFrameTimeHours; + + //test by posting on every stop event + //doOperationTimePost = true; + + DEBUG("%i", RET_operationTimeHours); + LEDon(500); + } + } + + + // Check time interval for location run + if (time(NULL) > RET_unixtime_nextpost_failsafe) { + //setfailsafetime(); //these must be before gpsPost, incase gpsPost fails, then stuck in broadcast loop + //gpsPost(); + } + + //Check for operatingTime post time or if data buffer is full for force post + if (RET_operationFrameTimeHours > 0.0) { + if (time(NULL) > RET_unixtime_nextpost || strlen(RET_operationTimeString) > 60) { + //only bother if we actual have data to post + //setwaketime(); //these must be before gpsPost, incase gpsPost fails, then stuck in broadcast loop + //uploadOperationTimeData(); + } + } + +} + + + + + + +int selftest() { + int result = 0; + int tests = 0; + int testscore = 0; + led1 = 0; + string failures; + + //Accelerometer + tests ++; + if (accelerometer.read_id() == 51){ + testscore ++; + } else { + //Accelerometer Fail + failures += 'Ac,'; + }; + + return result; +} \ No newline at end of file