init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

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