From 95b43e3f4409fb077e4df036684aec5f671709ec Mon Sep 17 00:00:00 2001 From: Bertrand Lemasle Date: Fri, 3 Aug 2018 21:58:05 +1200 Subject: [PATCH] Added a fourth alert (RTC clock halt) and saving active alerts to eeprom to survive resets --- GpsTracker/Alerts.cpp | 37 +++++++++++++++++++++++++++---------- GpsTracker/Alerts.h | 11 +++++------ GpsTracker/Config.cpp | 6 ++++-- GpsTracker/Config.h | 3 ++- GpsTracker/Core.cpp | 10 +++++++--- 5 files changed, 45 insertions(+), 22 deletions(-) diff --git a/GpsTracker/Alerts.cpp b/GpsTracker/Alerts.cpp index 2ab31ce..24c315c 100644 --- a/GpsTracker/Alerts.cpp +++ b/GpsTracker/Alerts.cpp @@ -2,42 +2,59 @@ #include "Alerts.h" #include "Config.h" +#include "Rtc.h" namespace alerts { - uint8_t _alerts = 0; - uint8_t getTriggered(PositionEntryMetadata &metadata) { config_t* config = &config::main::value; uint8_t result = 0; - if (metadata.temperature == ALERT_SUSPICIOUS_RTC_TEMPERATURE && !bitRead(_alerts, ALERT_RTC_FAILURE)) { - bitSet(result, ALERT_RTC_FAILURE); + if (!rtc::isAccurate() && !bitRead(config->activeAlerts, ALERT_RTC_CLOCK_FAILURE)) { + bitSet(result, ALERT_RTC_CLOCK_FAILURE); + } + + if (metadata.temperature == ALERT_SUSPICIOUS_RTC_TEMPERATURE && !bitRead(config->activeAlerts, ALERT_RTC_TEMPERATURE_FAILURE)) { + bitSet(result, ALERT_RTC_TEMPERATURE_FAILURE); } - if (metadata.batteryLevel <= config->alertBatteryLevel1 && !bitRead(_alerts, ALERT_BATTERY_LEVEL_1)) { + if (metadata.batteryLevel <= config->alertBatteryLevel1 && !bitRead(config->activeAlerts, ALERT_BATTERY_LEVEL_1)) { bitSet(result, ALERT_BATTERY_LEVEL_1); } - if (metadata.batteryLevel <= config->alertBatteryLevel2 && !bitRead(_alerts, ALERT_BATTERY_LEVEL_2)) { + if (metadata.batteryLevel <= config->alertBatteryLevel2 && !bitRead(config->activeAlerts, ALERT_BATTERY_LEVEL_2)) { bitSet(result, ALERT_BATTERY_LEVEL_2); } return result; } + void add(uint8_t mask) { + if (!mask) return; //save a write to eeprom if there is no change + + config_t* config = &config::main::value; + config->activeAlerts |= mask; + config::main::save(); + } + void clear(PositionEntryMetadata &metadata) { config_t* config = &config::main::value; uint8_t clearMask = 0; - if (bitRead(_alerts, ALERT_RTC_FAILURE) && metadata.temperature != ALERT_SUSPICIOUS_RTC_TEMPERATURE) { - bitSet(clearMask, ALERT_RTC_FAILURE); + if (bitRead(config->activeAlerts, ALERT_RTC_CLOCK_FAILURE) && rtc::isAccurate()) { + bitSet(clearMask, ALERT_RTC_CLOCK_FAILURE); + } + + if (bitRead(config->activeAlerts, ALERT_RTC_TEMPERATURE_FAILURE) && metadata.temperature != ALERT_SUSPICIOUS_RTC_TEMPERATURE) { + bitSet(clearMask, ALERT_RTC_TEMPERATURE_FAILURE); } - if (_alerts & (_BV(ALERT_BATTERY_LEVEL_1) | _BV(ALERT_BATTERY_LEVEL_2) && metadata.temperature >= config->alertBatteryLevelClear)) { + if (config->activeAlerts & (_BV(ALERT_BATTERY_LEVEL_1) | _BV(ALERT_BATTERY_LEVEL_2) && metadata.temperature >= config->alertBatteryLevelClear)) { clearMask |= _BV(ALERT_BATTERY_LEVEL_1) | _BV(ALERT_BATTERY_LEVEL_2); } - _alerts &= ~clearMask; + if (!clearMask) return; //save a write to eeprom if there is no change + config->activeAlerts &= ~clearMask; + config::main::save(); } } diff --git a/GpsTracker/Alerts.h b/GpsTracker/Alerts.h index db24595..8c7e825 100644 --- a/GpsTracker/Alerts.h +++ b/GpsTracker/Alerts.h @@ -2,15 +2,14 @@ #include "Positions.h" -#define ALERT_BATTERY_LEVEL_1 1 -#define ALERT_BATTERY_LEVEL_2 2 -#define ALERT_RTC_FAILURE 3 +#define ALERT_BATTERY_LEVEL_1 1 +#define ALERT_BATTERY_LEVEL_2 2 +#define ALERT_RTC_TEMPERATURE_FAILURE 3 +#define ALERT_RTC_CLOCK_FAILURE 4 namespace alerts { - extern uint8_t _alerts; - uint8_t getTriggered(PositionEntryMetadata &metadata); - inline void add(uint8_t mask) { _alerts |= mask; } //TODO : save to EEPROM to survive reset + void add(uint8_t mask); void clear(PositionEntryMetadata &metadata); } diff --git a/GpsTracker/Config.cpp b/GpsTracker/Config.cpp index f231d9f..f2b20f2 100644 --- a/GpsTracker/Config.cpp +++ b/GpsTracker/Config.cpp @@ -19,7 +19,7 @@ namespace config { if (CONFIG_SEED != value.seed) reset(); //todo : reset network if seed for network is not right hardware::i2c::powerOff(); - NOTICE_FORMAT("read", "%d, %s, %d, %d, %d, %d, %d, %s", value.seed, value.version, value.firstEntry, value.lastEntry, value.alertBatteryLevel1, value.alertBatteryLevel2, value.alertBatteryLevelClear, value.contactPhone); + NOTICE_FORMAT("read", "%d, %s, %d, %d, %d, %d, %d, %d, %s", value.seed, value.version, value.firstEntry, value.lastEntry, value.alertBatteryLevel1, value.alertBatteryLevel2, value.alertBatteryLevelClear, value.activeAlerts, value.contactPhone); #if BACKUP_ENABLE_NETWORK NOTICE_FORMAT("read", "%d, %d, %s, %s", value.network.saveThreshold, value.network.lastSavedEntry, value.network.apn, value.network.url); //networkConfig_t c = { @@ -33,12 +33,13 @@ namespace config { value.alertBatteryLevel1 = CONFIG_DEFAULT_BATTERY_ALERT_LEVEL1; value.alertBatteryLevel2 = CONFIG_DEFAULT_BATTERY_ALERT_LEVEL2; value.alertBatteryLevelClear = CONFIG_DEFAULT_BATTERY_ALERT_CLEAR; + value.activeAlerts = 0; strcpy(value.contactPhone, CONFIG_DEFAULT_CONTACT_PHONE); #endif } void write() { - NOTICE_FORMAT("write", "%d, %s, %d, %d, %d, %d, %d, %s", value.seed, value.version, value.firstEntry, value.lastEntry, value.alertBatteryLevel1, value.alertBatteryLevel2, value.alertBatteryLevelClear, value.contactPhone); + NOTICE_FORMAT("write", "%d, %s, %d, %d, %d, %d, %d, %d, %s", value.seed, value.version, value.firstEntry, value.lastEntry, value.activeAlerts, value.alertBatteryLevel1, value.alertBatteryLevel2, value.alertBatteryLevelClear, value.activeAlerts, value.contactPhone); #if BACKUP_ENABLE_NETWORK NOTICE_FORMAT("write", "%d, %d, %s, %s", value.network.saveThreshold, value.network.lastSavedEntry, value.network.apn, value.network.url); #endif @@ -75,6 +76,7 @@ namespace config { CONFIG_DEFAULT_BATTERY_ALERT_LEVEL1, CONFIG_DEFAULT_BATTERY_ALERT_LEVEL2, CONFIG_DEFAULT_BATTERY_ALERT_CLEAR, + 0, CONFIG_DEFAULT_CONTACT_PHONE #endif }; diff --git a/GpsTracker/Config.h b/GpsTracker/Config.h index f4c689c..561fd4e 100644 --- a/GpsTracker/Config.h +++ b/GpsTracker/Config.h @@ -69,8 +69,9 @@ struct config_t { uint8_t alertBatteryLevel1; //sizeof = 1 uint8_t alertBatteryLevel2; //sizeof = 1 uint8_t alertBatteryLevelClear; //sizeof = 1 + uint8_t activeAlerts; //sizeof = 1 char contactPhone[15]; //sizeof = 15 -}; //sizeof = 28 + 73 = 101 +}; //sizeof = 29 + 73 = 102 namespace config { diff --git a/GpsTracker/Core.cpp b/GpsTracker/Core.cpp index 95064c6..49f5231 100644 --- a/GpsTracker/Core.cpp +++ b/GpsTracker/Core.cpp @@ -23,7 +23,7 @@ namespace core { if (acquired) { positions::appendLast(metadata); - + forceBackup = updateSleepTime(); gps::preserveCurrentCoordinates(); } @@ -51,8 +51,12 @@ namespace core { if (bitRead(triggered, ALERT_BATTERY_LEVEL_1) || bitRead(triggered, ALERT_BATTERY_LEVEL_2)) { sprintf_P(buffer + strlen(buffer), PSTR(" - Battery at %d%%.\n"), metadata.batteryLevel); } - - if (bitRead(triggered, ALERT_RTC_FAILURE)) { + + if (bitRead(triggered, ALERT_RTC_CLOCK_FAILURE)) { + sprintf_P(buffer + strlen(buffer), PSTR(" - RTC was stopped. Bakup battery failure ?\n")); + } + + if (bitRead(triggered, ALERT_RTC_TEMPERATURE_FAILURE)) { sprintf_P(buffer + strlen(buffer), PSTR(" - Temperature is %dC. Backup battery failure ?\n"), static_cast(metadata.temperature * 100)); }