init

Dependencies:   aconno_I2C Lis2dh12 WatchdogTimer

Revision:
7:e9a19750700d
Parent:
6:388d3c7efdd9
Child:
8:7351f8c4cd60
--- a/main.cpp	Wed Nov 14 16:08:28 2018 +0000
+++ b/main.cpp	Tue Dec 11 22:18:24 2018 +0000
@@ -1,205 +1,207 @@
 #include "main.h"
-#include "board.h"
-#include "modes.h"
-
 //include "nrf_soc.h"
 
-//#include "ATCommand.h"
-
-//LowPowerTicker ticker; //no impact on power consumption
-
 //------------------------------------------------------------------------------
-//Function declarations- Local
+//FUNCTION PROTOTYPES
 //------------------------------------------------------------------------------ 
 static void mainStateEngine(void);
-static void mode_mtu(void);
 static void selftest(void);
-static void LEDon(void);
-static void LEDoff(void);
+static void buttonPress(void);
+static void buttonRelease(void);
 
 //------------------------------------------------------------------------------
-//Var declarations- Local
+//GLOBAL VARS
 //------------------------------------------------------------------------------ 
 bool accel_healthy = false;
 bool firstBoot = false;
 bool requireSoftReset = false;
+bool motionFlagTriggered = false;
 
 //------------------------------------------------------------------------------
-//Var declarations- RETAINED NOINIT RAM
+//RETAINED NOINIT RAM VARS
 //------------------------------------------------------------------------------ 
-#if defined ( __CC_ARM )
-/** THIS IS THE MBED ONLINE COMPILER TOOLCHAIN*/
-static uint8_t          RET_mode                __attribute__((section("noinit"),zero_init));        
-static uint32_t         RET_unixtime_backup     __attribute__((section("noinit"),zero_init));
-static char             RET_buffer[64]          __attribute__((section("noinit"),zero_init));
+#if defined ( __CC_ARM ) /** THIS IS THE MBED ONLINE COMPILER TOOLCHAIN*/
+static uint8_t          RET_mode                    __attribute__((section("noinit"),zero_init));
+
+static uint8_t          RET_buttonReleaseCount      __attribute__((section("noinit"),zero_init));
+static uint32_t         RET_buttonPressTime         __attribute__((section("noinit"),zero_init));
+static uint32_t         RET_buttonReleaseTime       __attribute__((section("noinit"),zero_init));
+static uint32_t         RET_unixtime_backup         __attribute__((section("noinit"),zero_init));
+static bool             RET_requireImpactFlag       __attribute__((section("noinit"),zero_init));
+static char             RET_buffer[64]              __attribute__((section("noinit"),zero_init));
+
+//MOTION SETTINGS
+static bool             RET_motionTriggered              __attribute__((section("noinit"),zero_init));
+static time_t             RET_motionStartTime              __attribute__((section("noinit"),zero_init));
+static time_t             RET_motionStopTime              __attribute__((section("noinit"),zero_init));
+static uint32_t         RET_motionStartThreshold_seconds    __attribute__((section("noinit"),zero_init));
+static uint32_t         RET_motionStopThreshold_seconds     __attribute__((section("noinit"),zero_init));
+static bool             RET_motionPendingOnState              __attribute__((section("noinit"),zero_init));
+static bool             RET_motionPendingOffState              __attribute__((section("noinit"),zero_init));
+static bool             RET_motionState              __attribute__((section("noinit"),zero_init));
+
+//EVENT HANDLING
+static uint32_t         RET_eventTime_location      __attribute__((section("noinit"),zero_init));
+static uint32_t         RET_eventTime_environmental __attribute__((section("noinit"),zero_init));
+static uint32_t         RET_eventTime_activity      __attribute__((section("noinit"),zero_init));
 #elif defined ( __GNUC__ )
 #elif defined ( __ICCARM__ )
 #endif
 
-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(PN_LED);
-DigitalOut vreg_en(PN_VREG_EN);
-DigitalOut gsm_pwkey(PN_GSM_PWR_KEY);
-DigitalOut lis3dh_cs(PN_SPI_CS0);
-DigitalOut flash_cs(PN_SPI_CS1);
-DigitalIn lis3dh_int1(PN_ACC_INT1); //IMPACT
-DigitalIn lis3dh_int2(PN_ACC_INT2); //DISTURBED
-
-//------------------------------------------------------------------------------
-//Peripherals
+//PERIPHERALS
 //------------------------------------------------------------------------------ 
 //BLE myble;
+WatchdogTimer watchdog(65.0); //Do not set to less than 4500ms or can cause issues with softdevice
+InterruptIn button(PN_IN_BUTTON); //This causes wake from sleep
 #if NEED_CONSOLE_OUTPUT
 Serial uart(PN_UART_TX, PN_UART_RX, 115200);
 #endif
-//ATSerial atserial(PN_UART_TX, PN_UART_RX, 115200);
-WatchdogTimer watchdog(65.0); //Do not set to less than 4500ms or can cause issues with softdevice
 
 //------------------------------------------------------------------------------
-//Singletons
+//SINGLETONS
 //------------------------------------------------------------------------------
-NVStore &nvstore = NVStore::get_instance();
+//NVStore &nvstore = NVStore::get_instance();
 
 
-
+//------------------------------------------------------------------------------
+// LOW LEVEL CRITICAL FUNCS
+//------------------------------------------------------------------------------ 
 void gotoSleep(long sleep_milliseconds) {
-    //accelerometer.configureForSleep();
     
     if (requireSoftReset) { //dont need to clear this var as reset changes it back to false
         RET_unixtime_backup = time(NULL); //save unixtime for reset
-        //NVIC_SystemReset();
         system_reset();
     }
-    ThisThread::sleep_for(sleep_milliseconds);    
-}
-
-void LED1on(long flash_milliseconds = 0) {
-    led1 = 0;
-    if (flash_milliseconds > 0) {
-        ThisThread::sleep_for(flash_milliseconds);
-        led1 = 1;
-    }
-}
-void LED1off() {
-    led1 = 1;
-}
-
-bool GSMon() {
-    //power on GSM
-    vreg_en = 1;
-    ThisThread::sleep_for(500);
-    gsm_pwkey = 0;
-    ThisThread::sleep_for(1500);
-    gsm_pwkey = 1;
-    LED1on(1000);
+    
+    //button.fall(&buttonPress);
+    //button.rise(&buttonRelease);
+    
+    ThisThread::sleep_for(sleep_milliseconds);   
 }
 
-void setup_CS_LIS3DH()
-{
-    //Without this setup CS lines of AT45 & LIS3DH are in conflict, causing huge current consumption    
-    lis3dh_cs = 1; //not selected
-    flash_cs = 1; //not selected
-    //AT_RS = 0; //asserted == reset state
-    //wait_ms(100);
-    //AT_RS = 1;
-}
-
-void lis3dh_configureForSleep() {
-    //init
-    LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK);
-    requireSoftReset = true; //WE HAVE STARTED SPI SO NEED THIS
-    //Mode
-    lis3dh.InitLIS3DH(LIS3DH_NORMAL, LIS3DH_ODR_25Hz, LIS3DH_FULLSCALE_8);   
-    lis3dh.LIS3DH_SetIntMode(LIS3DH_INT_MODE_6D_MOVEMENT); 
-    //Int1
-    lis3dh.LIS3DH_SetInt1Pin(LIS3DH_CLICK_ON_PIN_INT1_DISABLE | LIS3DH_I1_INT1_ON_PIN_INT1_ENABLE |              
-                    LIS3DH_I1_INT2_ON_PIN_INT1_DISABLE | LIS3DH_I1_DRDY1_ON_INT1_DISABLE | LIS3DH_I1_DRDY2_ON_INT1_DISABLE |
-                    LIS3DH_WTM_ON_INT1_DISABLE | LIS3DH_INT1_OVERRUN_DISABLE );
-    lis3dh.LIS3DH_SetInt1Threshold(10);             
-    lis3dh.LIS3DH_SetIntConfiguration(LIS3DH_INT1_ZHIE_ENABLE | LIS3DH_INT1_ZLIE_ENABLE |
-                                       LIS3DH_INT1_YHIE_ENABLE | LIS3DH_INT1_YLIE_ENABLE |
-                                       LIS3DH_INT1_XHIE_ENABLE | LIS3DH_INT1_XLIE_ENABLE );   
-    lis3dh.LIS3DH_SetInt1Duration(0);
-    lis3dh.LIS3DH_Int1LatchEnable(MEMS_ENABLE);
-    //HP filter
-    lis3dh.LIS3DH_SetHPFMode(LIS3DH_HPM_AUTORESET_INT);
-    lis3dh.LIS3DH_SetFilterDataSel(MEMS_ENABLE);
-    lis3dh.LIS3DH_HPFAOI1Enable(MEMS_ENABLE);
-    lis3dh.LIS3DH_HPFAOI2Enable(MEMS_ENABLE);
-}
-
-void resetState() {
+void factoryReset() {
     firstBoot = true;
     
     //RESET VARS
     RET_mode = 0;
     RET_unixtime_backup = 0;
+    RET_buttonReleaseCount = 0;
+    RET_eventTime_location = 0;
+    RET_eventTime_environmental = 0;
+    RET_eventTime_activity = 0;
+    RET_motionPendingOffState = 0;
+    RET_motionPendingOnState = 0;
+    RET_motionState = 0;
+    RET_motionStartTime = 0;
+    RET_motionStopTime = 0;
+    RET_motionStartThreshold_seconds = 60;
+    RET_motionStopThreshold_seconds = 60;
     set_time(RET_unixtime_backup);
     
     //SET IDENTIFIER
-    uint32_t nv_value = 12345678;
-    int rc = nvstore.set(NV_IDENTIFIER, sizeof(nv_value), &nv_value);
+    //uint32_t nv_value = 12345678;
+    //int rc = nvstore.set(NV_IDENTIFIER, sizeof(nv_value), &nv_value);
+}
+
+void turnOffEverything() {
+    //vreg_en = 0;
+    led1 = 1;
 }
 
+//------------------------------------------------------------------------------
+// USER BUTTON
+//------------------------------------------------------------------------------ 
+void buttonPress() {
+    led1 = 0;
+    
+    //while(RET_buttonReleaseCount < 1){
+        //wait   
+    //}
+    
+    //led1 = 1;
+    /*
+    //RET_buttonPressTime = time(NULL);
+    RET_buttonReleaseCount ++;
+    led1 = 0;
+    for (int i = 0; i < RET_buttonReleaseCount; i++) {
+        led1 = 0;
+        wait_ms(100);
+        led1 = 1;
+        wait_ms(100);
+    */
+}
+void buttonRelease() {
+    led1 = 1;
+    //RET_buttonReleaseCount ++;
+    /*RET_buttonReleaseCount ++;
+    led1 = 0;
+    for (int i = 0; i < RET_buttonReleaseCount; i++) {
+        led1 = 0;
+        wait_ms(100);
+        led1 = 1;
+        wait_ms(100);
+    }*/
+}
+
+//------------------------------------------------------------------------------
+// STATE ENGINE
+//------------------------------------------------------------------------------ 
+
 void mainStateEngine() {
     
     RET_mode = MODE_NORMAL;
     
-    
     switch(RET_mode) {
         case MODE_SETUP :
-            resetState();
+            factoryReset();
             //selftest();
             break;
             
         case MODE_NORMAL :
-            
-            if (RET_requireMotionFlag) {
-                   bool MotionFlagTriggered = false;
-                   
-                   //check interrupt
-                   if (lis3dh_int2) {
-                       MotionFlagTriggered = true;
-                   }
+            //check and log motion
+            if (lis3dh_int1) {
+                LED1blink(2,100);
+                RET_motionTriggered = true;
+                if (!RET_motionPendingOnState) {
+                    RET_motionPendingOnState = true;
+                    RET_motionPendingOffState = false;
+                    // Log start motion time
+                    RET_motionStartTime = time(NULL);
+                    RET_motionStopTime = 0;                
+                }
+            } else {
+                LED1blink(2,500);
+                RET_motionTriggered = false;
+                RET_motionPendingOnState = false;
+                if (!RET_motionPendingOffState) {
+                    RET_motionPendingOffState = true;
+                    //log stop motion time
+                    RET_motionStopTime = time(NULL);
+                    RET_motionStartTime = 0;
+                }
+            }
+            //calculate motion state
+            if (RET_motionPendingOnState) {
+                //check if above threshold
+                time_t inMotionForSeconds = (time(NULL) - RET_motionStartTime);
+                if (inMotionForSeconds >= RET_motionStartThreshold_seconds) {
+                    RET_motionState = true;
+                    LED1blink(10,100);
+                }
+            }
+            if (RET_motionPendingOffState) {
+                time_t noMotionForSeconds = (time(NULL) - RET_motionStopTime);
+                if (noMotionForSeconds >= RET_motionStartThreshold_seconds) {
+                    RET_motionState = false;
+                    LED1blink(5,500);
+                }
             }
             
             break;
             
         case MODE_DORMANT :
-           
+            //LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK);
             break;
             
         case MODE_OFF_48HRS :
@@ -212,8 +214,11 @@
 }
 
 
+//------------------------------------------------------------------------------
+// MAIN
+//------------------------------------------------------------------------------ 
+
 int main() {
-    led1 = 1;
     
     //CHECK IF THIS IS RESET
     //0x00000004 == soft reset  //0x00000002 == watchdog  //0x00000001 == button/hardreset 
@@ -221,7 +226,7 @@
         switch(NRF_POWER->RESETREAS) {
             case 0x00000001  :
                 DEBUG("reset_reason: 0x%08x. - Hard Reset\n",NRF_POWER->RESETREAS);
-                resetState();
+                factoryReset();
             break;
             case 0x00000002  :
                 DEBUG("reset_reason: 0x%08x. - Watchdog\n",NRF_POWER->RESETREAS);
@@ -234,238 +239,21 @@
         }
         NRF_POWER->RESETREAS = 0xffffffff;
     }
-    
+        
     while(true) {
-        //GOTO TO SLEEP
-        if (!firstBoot) gotoSleep(60000);
-        LED1on(20);
+        turnOffEverything();
         watchdog.kick();
+        firstBoot = false; //temp
+        if (!firstBoot) gotoSleep(10000);
+        
+        //INIT
+        Modem modem(PN_UART_TX, PN_UART_RX, PN_UART_CTS, PN_UART_RTS, PN_GSM_PWR_KEY, PN_VREG_EN);
         
         //MAIN STATE ENGINE
+        //LED1blink(1,100);
         mainStateEngine();
-    }
-}
-
-
-
-/*
-void initMotion() {
-    //CHECK FOR ANY MOTION
-    if (!accelerometer.selfTest()) {
-        if (exceptions.find("A.") < 0) {
-            exceptions += "A.";
-        }
-        DEBUG("Couldnt start accelerometer");
-    } else {
-        accel_healthy = true;
+        
+        //Configure for sleep
+        lis3dh_configureForSleep(10);
     }
-}
-*/
-
-/*
-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;   
-}
-*/
-
-
-/*
-void readRegs(uint8_t addr, uint8_t * data, int len) {
-    lis3dh_cs = 0;
-    for (int i = 0 ; i < len ; i++ ) {    
-       spi.write((addr+i)|0x80) ;  // specify address to read
-       data[i] = spi.write((addr+i)|0x80) ; 
-    } 
-    spi.write(0x00) ; // to terminate read mode
-    lis3dh_cs = 1;
-}
-
-uint8_t read_reg(uint8_t addr)
-{
-    uint8_t data[1] ;    
-    readRegs(addr, data, 1) ;
-    return( data[0] ) ;
-}
-*/
-
-
-
-
-
-
-
-
-
-
-
-
-/*
-//OPTION 1
-    // Switch on both RAM banks when in System OFF mode.
-    NRF_POWER->RAMON |= (POWER_RAMON_OFFRAM0_RAM0On << POWER_RAMON_OFFRAM0_Pos) | 
-                    (POWER_RAMON_OFFRAM1_RAM1On << POWER_RAMON_OFFRAM1_Pos);
-
-    // Enter System OFF and wait for wake up from GPIO detect signal.
-    NRF_POWER->SYSTEMOFF = 0x1;
-    
-
-    //spi.close();
-    
-    //delete spi;  
-    //spi_disable();
-    
-    //spi_free(spi);
-    
-    //nrf_drv_spi_uninit(spi);
-    //nordic_nrf5_spi_initialized[instance] = false;
-    //HFCLKSTOP = 0x1;
-    
-    NRF_SPI0->ENABLE = 0;
-    NRF_SPI1->ENABLE = 0;
-    NRF_SPI2->ENABLE = 0;
-    NRF_TWI0->ENABLE = 0;
-    NRF_TWI1->ENABLE = 0;
-    
-    sd_clock_hfclk_release();
-    NRF_POWER->SYSTEMOFF=1;
-    //NRF_SPI0->POWER = 0;
-
-    //OPTION 3
-    
-    *(volatile uint32_t *)0x40003FFC = 0;
-    *(volatile uint32_t *)0x40003FFC;
-    *(volatile uint32_t *)0x40003FFC = 1;
-    
-    NRF_SPI0->ENABLE = (SPI_ENABLE_ENABLE_Disabled << SPI_ENABLE_ENABLE_Pos); 
-    NRF_SPI1->ENABLE = (SPI_ENABLE_ENABLE_Disabled << SPI_ENABLE_ENABLE_Pos); 
-    
-    
-    if (sleep_manager_can_deep_sleep()) {
-        ThisThread::sleep_for(10000);
-    } else { 
-        led1 = 0;
-        wait(50.0);
-    }
-    
-    //system_reset();
-*/
-
-
-        //time_t unixtime = time(NULL);
-        //DEBUG("got: %i, %d, %d \n", RET_mode, RET_unixtime, unixtime);
-     
-/*
-uint8_t acc_id;
-        lis3dh.LIS3DH_GetWHO_AM_I(&acc_id);
-        uart.printf("%i \n\r", acc_id);
-        */   
-        
-/*
- AxesRaw_t                   accel_raw; 
-        lis3dh.LIS3DH_GetAccAxesRaw(&accel_raw);
-        
-        uart.printf("x=");
-        uart.printf("%i", accel_raw.AXIS_X);
-        uart.printf("   y=");
-        uart.printf("%i", accel_raw.AXIS_Y);
-        uart.printf("   z=");
-        uart.printf("%i", accel_raw.AXIS_Z);
-        uart.printf("\n\r");
-*/
\ No newline at end of file
+}
\ No newline at end of file