init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
Diff: main.cpp
- Revision:
- 4:8d8e9bfa82e4
- Parent:
- 2:fd554f01abdf
- Child:
- 5:8f8951127724
--- a/main.cpp Thu Nov 08 15:22:58 2018 +0000
+++ b/main.cpp Sun Nov 11 20:52:22 2018 +0000
@@ -2,6 +2,8 @@
#include "board.h"
#include "modes.h"
+#include "nrf_soc.h"
+
//#include "ATCommand.h"
//LowPowerTicker ticker; //no impact on power consumption
@@ -9,23 +11,30 @@
//------------------------------------------------------------------------------
//Function declarations- Local
//------------------------------------------------------------------------------
-static void setup(void);
-static void loop(void);
+static void mainStateEngine(void);
static void mode_mtu(void);
-static int selftest(void);
+static void selftest(void);
static void LEDon(void);
static void LEDoff(void);
//------------------------------------------------------------------------------
//Var declarations- Local
//------------------------------------------------------------------------------
-int mode = 0;
bool accel_healthy = false;
+bool firstBoot = false;
+bool requireSoftReset = false;
//------------------------------------------------------------------------------
-//Var declarations- RETAINED
+//Var declarations- RETAINED NOINIT RAM
//------------------------------------------------------------------------------
-int RET_mode = 0;
+#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 __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;
@@ -63,22 +72,29 @@
DigitalOut led1(p11);
DigitalOut vreg_en(p29);
DigitalOut gsm_pwkey(p28);
+DigitalOut lis3dh_cs(p22);
//------------------------------------------------------------------------------
//Peripherals
//------------------------------------------------------------------------------
+//BLE myble;
+#if NEED_CONSOLE_OUTPUT
+Serial uart(p6, p8, 115200);
+#endif
+//ATSerial atserial(p6,p8,115200);
+WatchdogTimer watchdog(65.0); //Do not set to less than 4500ms or can cause issues with softdevice
-//LIS3DH accelerometer(p23, p19, p24, p22, LIS3DH_DR_NR_LP_25HZ, LIS3DH_FS_8G);
-//BLE myble;
-
-//Serial uart(p6, p8, 115200);
-//ATSerial atserial(p6,p8,115200);
-void gotosleep(long sleep_milliseconds) {
+void gotoSleep(long sleep_milliseconds) {
//accelerometer.configureForSleep();
- ThisThread::sleep_for(sleep_milliseconds);
- //system_reset();
+
+ if (requireSoftReset) { //dont need to clear this var as reset changes it back to false
+ RET_unixtime = time(NULL); //save unixtime for reset
+ //NVIC_SystemReset();
+ system_reset();
+ }
+ ThisThread::sleep_for(sleep_milliseconds);
}
void LED1on(long flash_milliseconds = 0) {
@@ -92,10 +108,44 @@
led1 = 1;
}
+void resetState() {
+ firstBoot = true;
+ RET_mode = 0;
+ RET_unixtime = 0;
+ set_time(RET_unixtime);
+}
+
int main() {
- setup();
+ led1 = 1;
+
+ //CHECK IF THIS IS RESET
+ //0x00000004 == soft reset //0x00000002 == watchdog //0x00000001 == button/hardreset
+ if (NRF_POWER->RESETREAS != 0xffffffff) {
+ switch(NRF_POWER->RESETREAS) {
+ case 0x00000001 :
+ DEBUG("reset_reason: 0x%08x. - Hard Reset\n",NRF_POWER->RESETREAS);
+ resetState();
+ break;
+ case 0x00000002 :
+ DEBUG("reset_reason: 0x%08x. - Watchdog\n",NRF_POWER->RESETREAS);
+ set_time(RET_unixtime);
+ break;
+ case 0x00000004 :
+ DEBUG("reset_reason: 0x%08x. - Soft reset\n",NRF_POWER->RESETREAS);
+ set_time(RET_unixtime);
+ break;
+ }
+ NRF_POWER->RESETREAS = 0xffffffff;
+ }
+
while(true) {
- loop();
+ //GOTO TO SLEEP
+ if (!firstBoot) gotoSleep(60000);
+ LED1on(50);
+ watchdog.kick();
+
+ //MAIN STATE ENGINE
+ mainStateEngine();
}
}
@@ -109,28 +159,29 @@
LED1on(1000);
}
-void setup() {
- led1 = 1;
- LED1on(50);
+
+void mainStateEngine() {
- set_time(1256729737);
- //accelerometer.configureForSleep();
+ //TEST AREA
+ LIS3DH accelerometer(p23, p19, p24, p22, LIS3DH_DR_NR_LP_25HZ, LIS3DH_FS_8G);
+ requireSoftReset = true;
+ if (accelerometer.selfTest()) {
+ LED1on(100);
+ }
+ accelerometer.configureForSleep();
ThisThread::sleep_for(10000);
- LIS3DH accelerometer(p23, p19, p24, p22, LIS3DH_DR_NR_LP_25HZ, LIS3DH_FS_8G);
- ThisThread::sleep_for(10000);
- system_reset();
-}
-
-void loop() {
- LED1on(50);
+
+
+
+
bool accel_awake;
- mode = MODE_SETUP;
+ RET_mode = MODE_SETUP;
- switch(mode) {
+ switch(RET_mode) {
case MODE_SETUP :
//selftest();
@@ -153,11 +204,9 @@
break;
default :
- mode = MODE_SETUP;
+ RET_mode = MODE_SETUP;
}
-
- gotosleep(10000);
}
@@ -274,4 +323,91 @@
return result;
}
-*/
\ No newline at end of file
+*/
+
+
+/*
+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);
+
\ No newline at end of file