init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
Diff: main.cpp
- Revision:
- 36:8e359069192b
- Parent:
- 35:d9421d57d116
- Child:
- 37:505ef618f06c
--- a/main.cpp Sun Jan 13 23:48:41 2019 +0000
+++ b/main.cpp Tue Jan 15 11:19:41 2019 +0000
@@ -3,7 +3,7 @@
//------------------------------------------------------------------------------
//DEFINES
//------------------------------------------------------------------------------
-#define FW_VERSION 1
+#define FW_VERSION 2
//MODES
#define USE_NRF_TEMP_SENSOR 1
@@ -26,81 +26,79 @@
//------------------------------------------------------------------------------
//FUNCTION PROTOTYPES
//------------------------------------------------------------------------------
-static void mainStateEngine(void);
-static void selftest(void);
-static void buttonPress(void);
-static void buttonRelease(void);
-static void dumpSettings(void);
-static void saveEventTimes(void);
-static void event_location_tx(void);
+void mainStateEngine(void);
+void selftest(void);
+void buttonPress(void);
+void buttonRelease(void);
+void dumpSettings(void);
+void saveEventTimes(void);
//------------------------------------------------------------------------------
-//GLOBAL VARS
+// GLOBALS
//------------------------------------------------------------------------------
-char* GLOBAL_defaultApi = "b:gps2";
-bool GLOBAL_accel_healthy = false;
-bool GLOBAL_motionStopFlagTriggered = false;
-bool GLOBAL_debugLED = true;
-bool GLOBAL_needToConfigureLis3dh = false;
-bool GLOBAL_registeredOnNetwork = false;
-bool GLOBAL_modemOn = false;
-bool GLOBAL_LEDSequenceinProgress = false;
-time_t GLOBAL_wakeTime = 0;
-char GLOBAL_exceptionString[15];
-bool NRFuart_enabled = false;
-char GLOBAL_debug_buffer[200];
+char* GLOBAL_defaultApi = "b:gps2";
+bool GLOBAL_accel_healthy = false;
+bool GLOBAL_motionStopFlagTriggered = false;
+bool GLOBAL_debugLED = true;
+bool GLOBAL_needToConfigureLis3dh = false;
+bool GLOBAL_registeredOnNetwork = false;
+bool GLOBAL_modemOn = false;
+bool GLOBAL_LEDSequenceinProgress = false;
+time_t GLOBAL_wakeTime = 0;
+char GLOBAL_exceptionString[15];
+char GLOBAL_debug_buffer[200];
-static int RET_setting_firmware;
-static uint32_t RET_setting_minimumupdate_hrs;
-static uint8_t RET_setting_location_mode;
-static uint8_t RET_setting_location_accuracy;
-static uint32_t RET_setting_location_tx_interval_mins;
-static uint32_t RET_setting_location_tx_failsafe_hrs;
-static uint16_t RET_setting_location_timeout;
-static uint32_t RET_setting_activity_tx_interval_hrs;
-static uint32_t RET_setting_environmental_tx_interval_mins;
-static uint16_t RET_setting_motion_g;
-static time_t RET_setting_motion_start_seconds;
-static time_t RET_setting_motion_stop_seconds;
-static uint16_t RET_setting_impact_g;
-static uint8_t RET_setting_impact_alert;
-static uint16_t RET_setting_connection_timeout;
-static uint16_t RET_setting_beacon_interval_seconds;
-static uint16_t RET_setting_beacon_scan;
+int RET_setting_firmware;
+uint32_t RET_setting_minimumupdate_hrs;
+uint8_t RET_setting_location_mode;
+uint8_t RET_setting_location_accuracy;
+uint32_t RET_setting_location_tx_interval_mins;
+uint32_t RET_setting_location_tx_failsafe_hrs;
+uint16_t RET_setting_location_timeout;
+uint32_t RET_setting_activity_tx_interval_hrs;
+uint32_t RET_setting_environmental_tx_interval_mins;
+uint16_t RET_setting_motion_g;
+time_t RET_setting_motion_start_seconds;
+time_t RET_setting_motion_stop_seconds;
+uint16_t RET_setting_impact_g;
+uint8_t RET_setting_impact_alert;
+uint16_t RET_setting_connection_timeout;
+uint16_t RET_setting_beacon_interval_seconds;
+uint16_t RET_setting_beacon_scan;
//STATE
-static uint8_t RET_coldBoot = 1;
-static bool RET_haveSettings;
-static uint8_t RET_state;
-static uint8_t RET_state_prev;
-static uint8_t RET_buttonPressCount;
-static time_t RET_buttonPressTime;
-static time_t RET_buttonHoldTime;
-static time_t RET_RTCunixtime;
-static time_t RET_SetupRunAt;
-static time_t RET_SettingsGotAt;
+uint8_t RET_coldBoot = 1;
+time_t RET_RTCunixtime;
+bool RET_haveSettings;
+uint8_t RET_state;
+uint8_t RET_state_prev;
+uint8_t RET_buttonPressCount;
+time_t RET_buttonPressTime;
+time_t RET_buttonHoldTime;
+time_t RET_SetupRunAt;
+time_t RET_SettingsGotAt;
//MOTION STATE
-static bool RET_motionTriggered;
-static bool RET_motionTriggeredInTXInterval;
-static time_t RET_motionStartTime;
-static time_t RET_motionStopTime;
-static bool RET_motionPendingOnState;
-static bool RET_motionPendingOffState;
-static bool RET_motionState;
-static float RET_motionTotalActivityHours;
-static time_t RET_motionFrameStart;
-static char RET_activityData[140];
+bool RET_motionTriggered;
+bool RET_motionTriggeredInTXInterval;
+time_t RET_motionStartTime;
+time_t RET_motionStopTime;
+bool RET_motionPendingOnState;
+bool RET_motionPendingOffState;
+bool RET_motionState;
+float RET_motionTotalActivityHours;
+time_t RET_motionFrameStart;
+char RET_activityData[140];
//IMPACT
-static bool RET_impactTriggered;
+bool RET_impactTriggered;
//EVENTS LOGGING
-static time_t RET_eventTime_location_log;
-static time_t RET_eventTime_environmental_log;
+time_t RET_eventTime_location_log;
+time_t RET_eventTime_environmental_log;
//EVENTS TX
-static time_t RET_eventTime_location_tx;
-static time_t RET_eventTime_location_failsafe_tx;
-static time_t RET_eventTime_environmental_tx;
-static time_t RET_eventTime_activity_tx;
-static time_t RET_eventTime_wakeFromDormant;
+time_t RET_eventTime_location_tx;
+time_t RET_eventTime_location_failsafe_tx;
+time_t RET_eventTime_environmental_tx;
+time_t RET_eventTime_activity_tx;
+time_t RET_eventTime_wakeFromDormant;
//------------------------------------------------------------------------------
//GPIO
@@ -116,10 +114,6 @@
SI7060 si7060(PN_I2C_SDA, PN_I2C_SCL);
LIS3DH lis3dh(PN_SPI_MOSI, PN_SPI_MISO, PN_SPI_CS0, PN_SPI_CLK);
Modem modem(PN_GSM_PWR_KEY, PN_VREG_EN, PN_GSM_WAKE_DISABLE);
-
-//------------------------------------------------------------------------------
-//TIMERS
-//-----------------------------------------------mi-------------------------------
LowPowerTicker RTCticker; //no impact on power consumption
//------------------------------------------------------------------------------
@@ -130,140 +124,6 @@
//------------------------------------------------------------------------------
// LOW LEVEL FUNCS
//------------------------------------------------------------------------------
-void NRFuart_init_nohwfc() {
- if(NRFuart_enabled == false) {
- //Configure UART0 pins.
- nrf_gpio_cfg_output(PN_UART_TX);
- nrf_gpio_cfg_input(PN_UART_RX, NRF_GPIO_PIN_NOPULL);
- NRF_UART0->PSELTXD = PN_UART_TX;
- NRF_UART0->PSELRXD = PN_UART_RX;
- NRF_UART0->CONFIG = (UART_CONFIG_PARITY_Excluded << UART_CONFIG_PARITY_Pos) | UART_CONFIG_HWFC_Disabled;
- NRF_UART0->BAUDRATE = NRF_UART_BAUDRATE_115200;
- NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Enabled;
- NRF_UART0->EVENTS_RXDRDY = 0;
- NRF_UART0->EVENTS_TXDRDY = 0;
- NRF_UART0->EVENTS_ERROR = 0;
- NRF_UART0->EVENTS_TXDRDY = 0;
- NRF_UART0->TASKS_STARTRX = 1;
- NRF_UART0->TASKS_STARTTX = 1;
-
- //NRF_UART0->INTENCLR = 0xffffffffUL;
- //NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Msk;
- /*NRF_UART0->INTENSET = (UART_INTENSET_RXDRDY_Set << UART_INTENSET_RXDRDY_Pos) |
- (UART_INTENSET_TXDRDY_Set << UART_INTENSET_TXDRDY_Pos) |
- (UART_INTENSET_ERROR_Set << UART_INTENSET_ERROR_Pos);*/
- //NVIC_ClearPendingIRQ(UART0_IRQn);
- //NVIC_SetPriority(UART0_IRQn, 1); //3
- //NVIC_EnableIRQ(UART0_IRQn);
- //NVIC_SetVector(UART0_IRQn, (uint32_t) UART0_IRQHandler);
- }
- NRFuart_enabled = true;
-};
-void NRFuart_uninit() {
- if (NRFuart_enabled) {
- NVIC_DisableIRQ(UART0_IRQn);
- NRF_UART0->INTENCLR = 0xffffffffUL;
- NRF_UART0->TASKS_STOPRX = 1;
- NRF_UART0->TASKS_STOPTX = 1;
- NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Disabled;
- NRF_UART0->PSELTXD = 0xFFFFFFFF;
- NRF_UART0->PSELRXD = 0xFFFFFFFF;
- NRF_UART0->PSELRTS = 0xFFFFFFFF;
- NRF_UART0->PSELCTS = 0xFFFFFFFF;
- NRFuart_enabled = false;
- }
-};
-void NRFuart_putc(char byte) {
- if (!NRFuart_enabled) NRFuart_init_nohwfc();
- NRF_UART0->TXD = byte;
- uint32_t safetycounter = 0;
- while(NRF_UART0->EVENTS_TXDRDY != 1 && safetycounter < 10000)
- {
- safetycounter ++; // Wait for the current TXD data to be sent.
- }
- NRF_UART0->EVENTS_TXDRDY = 0;
-};
-void NRFuart_puts(char* bytes) {
- if (!NRFuart_enabled) NRFuart_init_nohwfc();
- for(int i = 0; bytes[i] != '\0'; i++) {
- NRFuart_putc(bytes[i]);
- }
-};
-void NRFuart_puts_debug(char* bytes) {
- if (!NRFuart_enabled) NRFuart_init_nohwfc();
- for(int i = 0; bytes[i] != '\0'; i++) {
- NRFuart_putc(bytes[i]);
- }
- NRFuart_putc('\n');
-};
-void debug_prep(){
- memset(GLOBAL_debug_buffer, '\0', sizeof(GLOBAL_debug_buffer));
-}
-void debug_exe(){
- NRFuart_puts_debug(GLOBAL_debug_buffer);
-}
-char NRFuart_getc() {
- if (!NRFuart_enabled) NRFuart_init_nohwfc();
- uint32_t safetycounter = 0;
- while(NRF_UART0->EVENTS_RXDRDY != 1 && safetycounter < 10000){
- safetycounter ++;
- }
- NRF_UART0->EVENTS_RXDRDY = 0;
- return (uint8_t)NRF_UART0->RXD;
-};
-char* NRFuart_gets(char terminator) {
- if (!NRFuart_enabled) NRFuart_init_nohwfc();
- static char buffer[200];
- int charindex = 0;
- memset(buffer,'\0',sizeof(buffer));
- while(1) {
- if (NRF_UART0->EVENTS_RXDRDY == 0) {
- //Nothing available from the UART.
- continue;
- } else {
- char inbyte = NRFuart_getc();
- if (inbyte == terminator) {
- break;
- } else {
- buffer[charindex] = inbyte;
- charindex++;
- }
- }
- }
- buffer[charindex] = '\n'; //make sure we end with whitespace lf
- return buffer;
-};
-void NRFuart_flush() {
- if (!NRFuart_enabled) NRFuart_init_nohwfc();
- //THIS HASNT BEEN TESTED
- char char1 = 0;
- while (NRFuart_readable()) {
- char1 = NRFuart_getc();
- }
-};
-bool NRFuart_readable() {
- if (!NRFuart_enabled) NRFuart_init_nohwfc();
- return (NRF_UART0->EVENTS_RXDRDY == 1);
-};
-#define CONSOLE_DEBUG 0
-#if CONSOLE_DEBUG
-#define DEBUG(str, ... ) do{\
- /*int n;\
- char buffer[200];\
- memset(buffer, '\0', sizeof(buffer));\
- n = snprintf(buffer, sizeof(buffer), str, __VA_ARGS__);\
- buffer[sizeof(buffer)-1] = 0x00;\
- if(n < 0) { }\
- else if(n >= sizeof(buffer)) { }\
- else\
- {\
- NRFuart_puts_debug(buffer);\
- }\
-}while(0)*/
-#else
-#define DEBUG(...)
-#endif
-
void nrf_configureGPIOForSleep(){
nrf_gpio_cfg_input(PN_SPI_MOSI, NRF_GPIO_PIN_NOPULL);
nrf_gpio_cfg_input(PN_SPI_MISO, NRF_GPIO_PIN_NOPULL);
@@ -327,17 +187,25 @@
}
return voltage;
}
+float nrfTemperature() {
+ //INTERNAL NRF52 TEMP SENSOR
+ uint32_t safetycounter = 0;
+ float temperature = 0.0;
+ NRF_TEMP->TASKS_START=1;
+ while (NRF_TEMP->EVENTS_DATARDY==0 && safetycounter < 10000) {
+ safetycounter ++;
+ };
+ NRF_TEMP->EVENTS_DATARDY=0;
+ temperature = nrf_temp_read()/4.0;
+ NRF_TEMP->TASKS_STOP=1;
+ return temperature;
+}
float getTemperature() {
float temperature;
-
+
if (USE_NRF_TEMP_SENSOR) {
//INTERNAL NRF52 TEMP SENSOR
- uint32_t safetycounter = 0;
- NRF_TEMP->TASKS_START=1;
- while (NRF_TEMP->EVENTS_DATARDY==0 && safetycounter < 10000);
- NRF_TEMP->EVENTS_DATARDY=0;
- temperature = nrf_temp_read()/4.0;
- NRF_TEMP->TASKS_STOP=1;
+ temperature = nrfTemperature();
} else {
temperature = si7060.getTemperature(); //currently disabled because its causing a high current 450ua sleep, most likely due to sensor not sleeping correctly, or i2c sleep issue
}
@@ -410,7 +278,7 @@
memset(GLOBAL_exceptionString,0x00,sizeof(GLOBAL_exceptionString));
if (DEBUG_ON) {memset(GLOBAL_debug_buffer,0x00,sizeof(GLOBAL_debug_buffer));}
}
-void factoryReset() {
+void setDefaults() {
//IDENTITY
//RET_imei = 0;
//STATE
@@ -486,12 +354,7 @@
float temperature;
if (USE_NRF_TEMP_SENSOR) {
//INTERNAL NRF52 TEMP SENSOR
- uint32_t safetycounter = 0;
- NRF_TEMP->TASKS_START=1;
- while (NRF_TEMP->EVENTS_DATARDY==0 && safetycounter < 10000);
- NRF_TEMP->EVENTS_DATARDY=0;
- temperature = nrf_temp_read()/4.0;
- NRF_TEMP->TASKS_STOP=1;
+ temperature = nrfTemperature();
} else {
temperature = si7060.getTemperature();
}
@@ -684,7 +547,7 @@
pass = false;
modem.off(false);
if(GLOBAL_debugLED) LED1errorCode(5,10); //ERROR 5
- }
+ }
} else {
//Response error
}
@@ -967,22 +830,30 @@
DEBUG("0x%08x. Hard Reset ST:%d\n",NRF_POWER->RESETREAS, RET_state);
RET_coldBoot = 1;
dumpSettings();
- NRF_POWER->RESETREAS = 0xffffffff;
break;
case 0x00000002 :
DEBUG("Watchdog ST:%d\n",RET_state);
- NRF_POWER->RESETREAS = 0xffffffff;
break;
case 0x00000004 :
DEBUG("Soft ST:%d\n",RET_state);
break;
}
+ NRF_POWER->RESETREAS = 0xffffffff;
}
//CHECK FOR FIRST BOOT
if (RET_coldBoot == 1) {
- factoryReset();
- LED1errorCode(6,2);
+ setDefaults();
+ //check battery
+ float voltage = getBatteryV();
+ if (voltage > 2.5) {
+ //battery ok
+ LED1errorCode(6,2);
+ } else {
+ //battery low
+ LED1errorCode(10,2);
+ }
+ mainthread.wait(2000);
}
//MAIN LOOP