init
Dependencies: aconno_I2C Lis2dh12 WatchdogTimer
Revision 49:15ddd84ec9fa, committed 2019-02-07
- Comitter:
- pathfindr
- Date:
- Thu Feb 07 00:34:30 2019 +0000
- Parent:
- 48:64b1613941d5
- Child:
- 50:a94e70c00fff
- Commit message:
- update to led logic, and moved location check back in the setup sequence
Changed in this revision
--- a/main.cpp Tue Feb 05 14:30:57 2019 +0000
+++ b/main.cpp Thu Feb 07 00:34:30 2019 +0000
@@ -5,6 +5,7 @@
//------------------------------------------------------------------------------
//should really add these - will just add as and when needed for now
void event_activity_tx();
+void event_location_tx();
//------------------------------------------------------------------------------
// GLOBALS
@@ -50,6 +51,7 @@
uint8_t RET_state_prev;
uint8_t RET_buttonPressCount;
time_t RET_buttonPressTime;
+time_t RET_buttonReleaseTime;
time_t RET_buttonHoldTime;
time_t RET_SetupRunAt;
time_t RET_SettingsGotAt;
@@ -160,11 +162,16 @@
NRF52_SAADC batteryIn;
batteryIn.addChannel(9); // vdd for battery
batteryIn.calibrate();
- float voltage = 0.0;
- for (uint8_t i = 1; i <= 2; i++) { // need to get it 2 times to get accurate data, first one is always low for some reason
+ //get initial reading, first reading is always low
+ batteryIn.updateData(); batteryIn.getData()[0];
+ float voltage_accumulator = 0.0;
+ uint8_t readings = 0;
+ for (uint8_t i = 1; i <= 50; i++) { // need to get it 2 times to get accurate data, first one is always low for some reason
batteryIn.updateData();
- voltage = (batteryIn.getData()[0])*(1.0/1024.0)*3.65;
+ voltage_accumulator += (batteryIn.getData()[0])*(1.0/1024.0)*3.60;
+ readings ++;
}
+ float voltage = (voltage_accumulator / (float)readings);
return voltage;
}
float nrfTemperature() {
@@ -202,9 +209,9 @@
RET_buttonPressTime = RET_RTCunixtime;
}
void buttonRelease() {
- RET_buttonHoldTime = (RET_RTCunixtime - RET_buttonPressTime);
+ RET_buttonReleaseTime = RET_RTCunixtime;
+ RET_buttonHoldTime = (RET_buttonReleaseTime - RET_buttonPressTime);
RET_buttonPressCount ++;
- led1 = 1; //led off
}
//------------------------------------------------------------------------------
// RTC TICKER
@@ -215,65 +222,72 @@
RET_RTCunixtime += 1;
//button logic, only when device asleep
- //if (RET_asleep == true) {
- //led indicator
- //if (RET_buttonPressTime > 0 && (RET_RTCunixtime - RET_buttonPressTime) > 4) led1 = 0;
- //if (RET_buttonPressTime > 0 && (RET_RTCunixtime - RET_buttonPressTime) > 14) led1 = 1;
- //hold check
- if (RET_buttonHoldTime > 4 && RET_buttonHoldTime < 10) {
- RET_buttonHoldTime = 0;
- RET_buttonPressCount = 0;
- RET_state_prev = RET_state;
- RET_state = STATE_BUTTONHOLD;
- mainthread.release();
- } else if (RET_buttonHoldTime > 14 && RET_buttonHoldTime < 30) {
- RET_buttonHoldTime = 0;
- RET_buttonPressCount = 0;
- RET_state_prev = RET_state;
- RET_state = STATE_SCORCHEDEARTH;
- mainthread.release();
- } else {
- if((RET_RTCunixtime - RET_buttonPressTime) > 1 && RET_buttonPressCount > 0) {
- if(RET_busy == true) {
- RTCtick_ledflash_count = 16;// 8 flashes
- } else {
- switch (RET_buttonPressCount) {
- case 1 :
- RET_state_prev = RET_state;
- RET_state = STATE_BUTTONPRESS1;
- mainthread.release();
- break;
- case 3 :
- RET_state_prev = RET_state;
- RET_state = STATE_BUTTONPRESS3;
- mainthread.release();
- break;
- case 5 :
- RET_state_prev = RET_state;
- RET_state = STATE_BUTTONPRESS5;
- mainthread.release();
- break;
- default :
- //do nothing
- break;
- }
+ //hold check
+ if (RET_buttonHoldTime >= 4 && RET_buttonHoldTime <= 10) {
+ RET_buttonHoldTime = 0;
+ RET_buttonPressCount = 0;
+ RET_state_prev = RET_state;
+ RET_state = STATE_BUTTONHOLD;
+ mainthread.release();
+ } else if (RET_buttonHoldTime >= 14 && RET_buttonHoldTime <= 30) {
+ RET_buttonHoldTime = 0;
+ RET_buttonPressCount = 0;
+ RET_state_prev = RET_state;
+ RET_state = STATE_SCORCHEDEARTH;
+ mainthread.release();
+ } else {
+ if((RET_RTCunixtime - RET_buttonReleaseTime) > 1 && RET_buttonPressCount > 0) {
+ if(RET_busy == true) {
+ //RTCtick_ledflash_count = 4;// 2 flashes
+ } else {
+ RET_SetupRunAt = 0; //allow setup to run again
+ switch (RET_buttonPressCount) { //double catches to help with debounce
+ case 1 :
+ case 2 :
+ RET_state_prev = RET_state;
+ RET_state = STATE_BUTTONPRESS1;
+ RET_buttonPressCount = 0;
+ mainthread.release();
+ break;
+ case 3 :
+ case 4 :
+ RET_state_prev = RET_state;
+ RET_state = STATE_BUTTONPRESS3;
+ RET_buttonPressCount = 0;
+ mainthread.release();
+ break;
+ case 5 :
+ case 6 :
+ RET_state_prev = RET_state;
+ RET_state = STATE_BUTTONPRESS5;
+ RET_buttonPressCount = 0;
+ mainthread.release();
+ break;
+ default :
+ //do nothing
+ break;
}
- RET_SetupRunAt = 0; //allow setup to run again
- RET_buttonPressCount = 0;
}
}
- //SETUP STATE VISUALISE
- if (!GLOBAL_LEDSequenceinProgress && RET_setupInProgress) {
- led1 = !led1;
- } else if (!GLOBAL_LEDSequenceinProgress && RTCtick_ledflash_count > 0) {
- //IN OPERATION VISUALISE
- led1 = !led1;
- RTCtick_ledflash_count --;
- } else if (!GLOBAL_LEDSequenceinProgress && RTCtick_ledflash_count <= 0) {
- RTCtick_ledflash_count = 0;
+ }
+
+ /*
+ if (RET_setupInProgress) {
+ led1 = 0;
+ } else if (!GLOBAL_LEDSequenceinProgress) {
+ led1 = 1;
+ }
+ */
+ /*
+ if (RTCtick_ledflash_count > 0) {
+ led1 = !led1;
+ RTCtick_ledflash_count --;
+ if (RTCtick_ledflash_count <= 0) {
+ RTCtick_ledflash_count = 0;
led1 = 1; //turn off led
}
- //}
+ }
+ */
}
void resetGlobals() {
GLOBAL_accel_healthy = false;
@@ -349,6 +363,7 @@
RET_setting_beacon_scan = 0;
RET_buttonPressCount = 0;
RET_buttonPressTime = 0;
+ RET_buttonReleaseTime = 0;
RET_buttonHoldTime = 0;
//MOTION STATE
RET_motionTriggeredinFrame = false;
@@ -615,60 +630,72 @@
// EVENTS
//------------------------------------------------------------------------------
bool event_setup(bool manualrun) {
+ bool pass = true;
+ float voltage = getBatteryV();
+ LED1on(0);
if (RET_NetworkFailCount > DEFAULT_MAX_FAILED_CONNECTIONS) addToExceptionString("NF");
if (RET_GPSFailCount > DEFAULT_MAX_FAILED_GPS) addToExceptionString("GF");
RET_setupInProgress = true;
RET_NetworkFailCount = 0;
RET_GPSFailCount = 0;
- bool pass = true;
+ RET_setting_connection_timeout = 180; //reset to longer value to setup run to help with connection
float temperature = getTemperature();
- float voltage = getBatteryV();
bool selftestresult = selfTest();
- if (selftestresult == false) { LED1errorCode(4,10); } //ERROR 4
int connectionStartTime = RET_RTCunixtime;
if (modem.on(RET_force2G)) {
- char locString[70];
- int gpsStartTime = RET_RTCunixtime;
- memcpy(locString, modem.getLocation(1, RET_setting_location_timeout, RET_GPSFailCount, RET_NetworkFailCount), sizeof(locString));
- int timetaken_gps = (RET_RTCunixtime - gpsStartTime);
if (modem.registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,RET_setting_connection_timeout,RET_NetworkFailCount)) {
int timetaken_total = (RET_RTCunixtime - GLOBAL_wakeTime) + 10; //add 10 for ussd response time.
int timetaken_connection = (RET_RTCunixtime - connectionStartTime);
if (manualrun) addToExceptionString("MAN");
char bytestosend[160];
- snprintf(bytestosend,sizeof(bytestosend),"(%s,a:setup,f:%d,v:%.2f,t:%.1f,e:%d,y:%d,x:%d,z:SETUP-%s,k:%s,m:%s,c:1,s:1%s)\0",GLOBAL_defaultApi,FW_VERSION,voltage,temperature,timetaken_total,timetaken_connection,timetaken_gps,GLOBAL_exceptionString,SKU,HW_MAJORREVISION,locString);
+ snprintf(bytestosend,sizeof(bytestosend),"(%s,a:setup,f:%d,v:%.2f,t:%.1f,e:%d,y:%d,z:SETUP-%s,k:%s,m:%s,c:1,s:1)\0",GLOBAL_defaultApi,FW_VERSION,voltage,temperature,timetaken_total,timetaken_connection,GLOBAL_exceptionString,SKU,HW_MAJORREVISION);
char result[200];
snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, true, 2, GLOBAL_defaultApi));
+ RET_setupInProgress = false; //this turns off the flashing led
if (strcmp(result, "err") != 0) {
if (saveSettings(result) == false) {
//something went critically wrong getting settings
pass = false;
sendErrorLog("ERR-SU-IR");
- }
+ }
} else {
//Response error
sendErrorLog("ERR-SU-NR");
}
} else {
//FAILUREMODE modem failed to register on network
- modem.off(true);
- LED1errorCode(3,5); //ERROR 3
+ //LED1errorCode(3,1); //ERROR 3
pass = false;
}
} else {
//FAILUREMODE Modem failed to turn on
- modem.off(true);
- LED1errorCode(2,5); //ERROR 2
+ LED1errorCode(2,1); //ERROR 2
pass = false;
}
- //SEND ANY ACTIVITY DATA
- event_activity_tx();
+
+ //IF WE PASSED THEN LETS DO OTHER POSTS
+ if (pass == true) {
+ GLOBAL_wakeTime = RET_RTCunixtime; //lets reset this here so that the following loc and act function have sensible values for total time
+
+ //GET LOC DATA
+ uint8_t previous_location_accuracy = RET_setting_location_accuracy;
+ RET_setting_location_accuracy = 1; //set location mode to CL only
+ event_location_tx();
+ RET_setting_location_accuracy = previous_location_accuracy; //set location mode back to previous
+
+ //SEND ANY ACTIVITY DATA
+ event_activity_tx();
+
+ LED1blink(4,500); //PASS AND END
+ }
+
+ //TIDY UP = LOG RUN TIME - THIS MUST GO AT END AFTER WE HAVE GOT SERVER TIMESTAMP
modem.off(true);
-
- //LOG RUN TIME - THIS MUST GO AT END AFTER WE HAVE GOT SERVER TIMESTAMP
RET_SetupRunAt = RET_RTCunixtime;
setEventTimes();
- RET_setupInProgress = false; //this turns off the flashing led
+
+ RET_GPSFailCount = 0;
+ RET_NetworkFailCount = 0;
//RESULT
return pass;
}
@@ -676,8 +703,8 @@
void event_turnonofflog_tx(bool turnon) {
RET_NetworkFailCount = 0; //reset network blocker
RET_GPSFailCount = 0;
+ float voltage = getBatteryV();
float temperature = getTemperature();
- float voltage = getBatteryV();
int connectionStartTime = RET_RTCunixtime;
if (modem.on(RET_force2G)) {
char locString[70];
@@ -695,19 +722,15 @@
}
char result[180];
snprintf(result,sizeof(result),"%s",modem.USSDmessage(bytestosend, false, 2, GLOBAL_defaultApi));
- } else {
- modem.off(true);
}
- } else {
- modem.off(true);
}
modem.off(true);
}
void event_location_tx() {
+ float voltage = getBatteryV();
float temperature = getTemperature();
- float voltage = getBatteryV();
- int selfTestResult = selfTest();
+ bool selfTestResult = selfTest();
//Set any network or GPS fail flags
if (RET_NetworkFailCount > DEFAULT_MAX_FAILED_CONNECTIONS) addToExceptionString("NF");
if (RET_GPSFailCount > DEFAULT_MAX_FAILED_GPS) addToExceptionString("GF");
@@ -739,15 +762,7 @@
} else {
sendErrorLog("ERR-LOC-NR");
}
- } else {
- //Modem fails to register on network
- modem.off(true);
- LED1errorCode(3,5); //ERROR 3
}
- } else {
- //Modem fails to turn on
- modem.off(true);
- LED1errorCode(2,5); //ERROR 2
}
}
modem.off(true);
@@ -790,13 +805,7 @@
//TODO: LETS LOG THE DATA INSTEAD
event_activity_log(bytesToSend);
}
- } else {
- //Modem fails to register on network
- modem.off(true);
}
- } else {
- //Modem fails to turn on
- modem.off(true);
}
modem.off(true);
} else {
@@ -818,7 +827,7 @@
RET_busy = true;
//check that we havent run setup too recently
time_t setupRunAt_delta = (RET_RTCunixtime - RET_SetupRunAt);
- if (RET_SetupRunAt == 0 || setupRunAt_delta > ONEDAYINSECONDS) {
+ if (RET_SetupRunAt == 0 || setupRunAt_delta >= ONEDAYINSECONDS) {
if (event_setup(false)) {
// All good
setState(STATE_NORMAL);
@@ -978,7 +987,7 @@
//------------------------------------------------------------------------------
int main() {
//INIT
- watchdog.configure(240.0); //4 mins
+ watchdog.configure(300.0); //5 mins
LED1off();
modem.off(false);
RTCticker.attach(&RTCtick, 1.0);
--- a/main.h Tue Feb 05 14:30:57 2019 +0000 +++ b/main.h Thu Feb 07 00:34:30 2019 +0000 @@ -16,7 +16,7 @@ //------------------------------------------------------------------------------ //DEFINES //------------------------------------------------------------------------------ -#define FW_VERSION 4 +#define FW_VERSION 8 //#define SKU "GPSPLUSDEV" #define SKU "GPSPLUS" #define HW_MAJORREVISION "001" @@ -38,7 +38,7 @@ #define DEFAULT_MOTION_STOP_SECONDS 120 #define DEFAULT_IMPACT_G 127 #define DEFAULT_CONNECTION_ATTEMPTS 1 -#define DEFAULT_CONNECTION_TIMEOUT 120 +#define DEFAULT_CONNECTION_TIMEOUT 140 #define DEFAULT_BEACON_INTERVAL_SECONDS 20 #define DEFAULT_MAX_FAILED_CONNECTIONS 2 //max number of failed connections before device stops broadcasting until movement detected #define DEFAULT_MAX_FAILED_GPS 2 //max number of failed gps searches before device stops trying gps until movement detected
--- a/modem.cpp Tue Feb 05 14:30:57 2019 +0000
+++ b/modem.cpp Thu Feb 07 00:34:30 2019 +0000
@@ -251,14 +251,12 @@
while(!received && runtime < timeout) {
runtime = (t.read_ms() - startmillis);
if (ATwaitForWord("+CUSD: 0",ATTIMEOUT_SHORT)) {
- led1 = 0;
if (ATgetResponse('\r',ATTIMEOUT_SHORT)) {
if ( (matchCount = sscanf(ATinBuffer,",\"%d#%[^#]",USSDmessageIndex,ATinBuffer) ) > 0 ) {
if (USSDmessageIndex == messageIndex) {
//NEED TO GET THIS WORKING SO WE KNOW WE ARE DEALING WITH THE RIGHT MESSAGE
//MOVE THE BELOW INTO THIS IF STAEMEBNTS WHEN DONE
}
- led1 = 1;
received = true;
}
}
@@ -374,7 +372,7 @@
//SHALL WE GET CELL LOCATION
if (!haveGPSFix && accuracy >= 1) {
- uint16_t cellLocateTimeout = (timeout_seconds / 2); //half the GPS timeout seems like a good rule
+ uint16_t cellLocateTimeout = timeout_seconds;
if (registerOnNetwork(DEFAULT_CONNECTION_ATTEMPTS,cellLocateTimeout,BYREF_NetworkFailCount)) {
int matchCount; char type[6]; char cellID[6]; char lac[6]; int mcc; int mnc;
t.reset();