@@ -1,23 +1,18 @@ | |||
#pragma once | |||
#include "Debug.h" | |||
#include "Alerts.h" | |||
#include "Config.h" | |||
#include "Rtc.h" | |||
#define LOGGER_NAME "Alerts" | |||
namespace alerts { | |||
uint8_t getTriggered(PositionEntryMetadata &metadata) { | |||
config_t* config = &config::main::value; | |||
uint8_t result = 0; | |||
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(config->activeAlerts, ALERT_BATTERY_LEVEL_1)) { | |||
bitSet(result, ALERT_BATTERY_LEVEL_1); | |||
} | |||
@@ -26,6 +21,14 @@ namespace alerts { | |||
bitSet(result, ALERT_BATTERY_LEVEL_2); | |||
} | |||
if (metadata.temperature == ALERT_SUSPICIOUS_RTC_TEMPERATURE && !bitRead(config->activeAlerts, ALERT_RTC_TEMPERATURE_FAILURE)) { | |||
bitSet(result, ALERT_RTC_TEMPERATURE_FAILURE); | |||
} | |||
if (!rtc::isAccurate() && !bitRead(config->activeAlerts, ALERT_RTC_CLOCK_FAILURE)) { | |||
bitSet(result, ALERT_RTC_CLOCK_FAILURE); | |||
} | |||
return result; | |||
} | |||
@@ -41,16 +44,16 @@ namespace alerts { | |||
config_t* config = &config::main::value; | |||
uint8_t clearMask = 0; | |||
if (bitRead(config->activeAlerts, ALERT_RTC_CLOCK_FAILURE) && rtc::isAccurate()) { | |||
bitSet(clearMask, ALERT_RTC_CLOCK_FAILURE); | |||
if ((config->activeAlerts & (_BV(ALERT_BATTERY_LEVEL_1) | _BV(ALERT_BATTERY_LEVEL_2))) && metadata.batteryLevel >= config->alertBatteryLevelClear) { | |||
clearMask |= _BV(ALERT_BATTERY_LEVEL_1) | _BV(ALERT_BATTERY_LEVEL_2); | |||
} | |||
if (bitRead(config->activeAlerts, ALERT_RTC_TEMPERATURE_FAILURE) && metadata.temperature != ALERT_SUSPICIOUS_RTC_TEMPERATURE) { | |||
bitSet(clearMask, ALERT_RTC_TEMPERATURE_FAILURE); | |||
} | |||
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); | |||
if (bitRead(config->activeAlerts, ALERT_RTC_CLOCK_FAILURE) && rtc::isAccurate()) { | |||
bitSet(clearMask, ALERT_RTC_CLOCK_FAILURE); | |||
} | |||
if (!clearMask) return; //save a write to eeprom if there is no change | |||
@@ -2,10 +2,10 @@ | |||
#include "Positions.h" | |||
#define ALERT_BATTERY_LEVEL_1 1 | |||
#define ALERT_BATTERY_LEVEL_2 2 | |||
#define ALERT_RTC_TEMPERATURE_FAILURE 3 | |||
#define ALERT_RTC_CLOCK_FAILURE 4 | |||
#define ALERT_BATTERY_LEVEL_1 0 | |||
#define ALERT_BATTERY_LEVEL_2 1 | |||
#define ALERT_RTC_TEMPERATURE_FAILURE 2 | |||
#define ALERT_RTC_CLOCK_FAILURE 3 | |||
namespace alerts { | |||
@@ -55,27 +55,29 @@ namespace core { | |||
uint8_t notifyFailures(PositionEntryMetadata &metadata) { | |||
SIM808RegistrationStatus networkStatus; | |||
char buffer[SMS_BUFFER_SIZE]; | |||
const __FlashStringHelper * backupFailureString = F(" Backup battery failure ?\n"); | |||
const __FlashStringHelper * backupFailureString = F(" Backup battery failure ?"); | |||
uint8_t triggered = alerts::getTriggered(metadata); | |||
if (!triggered) return NO_ALERTS_NOTIFIED; | |||
NOTICE_FORMAT("notifyFailures", "triggered : %B", triggered); | |||
network::powerOn(); | |||
networkStatus = network::waitForRegistered(NETWORK_DEFAULT_TOTAL_TIMEOUT_MS); | |||
if (!network::isAvailable(networkStatus.stat)) return NO_ALERTS_NOTIFIED; | |||
details::appendToSmsBuffer(buffer, PSTR("Alerts !\n")); | |||
strncpy_P(buffer, PSTR("Alerts !"), SMS_BUFFER_SIZE); | |||
if (bitRead(triggered, ALERT_BATTERY_LEVEL_1) || bitRead(triggered, ALERT_BATTERY_LEVEL_2)) { | |||
details::appendToSmsBuffer(buffer, PSTR("- Battery at %d%%.\n"), metadata.batteryLevel); | |||
details::appendToSmsBuffer(buffer, PSTR("\n- Battery at %d%%."), metadata.batteryLevel); | |||
} | |||
if (bitRead(triggered, ALERT_RTC_CLOCK_FAILURE)) { | |||
details::appendToSmsBuffer(buffer, PSTR("-RTC was stopped. %S"), backupFailureString); | |||
if (bitRead(triggered, ALERT_RTC_TEMPERATURE_FAILURE)) { | |||
details::appendToSmsBuffer(buffer, PSTR("\n- Temperature is %dC.%S"), static_cast<uint16_t>(metadata.temperature * 100), backupFailureString); | |||
} | |||
if (bitRead(triggered, ALERT_RTC_TEMPERATURE_FAILURE)) { | |||
details::appendToSmsBuffer(buffer, PSTR("- Temperature is %dC. %S"), static_cast<uint16_t>(metadata.temperature * 100), backupFailureString); | |||
if (bitRead(triggered, ALERT_RTC_CLOCK_FAILURE)) { | |||
details::appendToSmsBuffer(buffer, PSTR("\n- RTC was stopped.%S"), backupFailureString); | |||
} | |||
bool notified = network::sendSms(buffer); | |||
@@ -192,7 +192,7 @@ namespace debug { | |||
tmElements_t time; | |||
rtc::getTime(time); | |||
NOTICE_FORMAT("getAndDisplayRtcTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second); | |||
NOTICE_FORMAT("getAndDisplayRtcTime", "%d/%d/%d %d:%d:%d %t", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second, rtc::isAccurate()); | |||
} | |||
void setRtcTime() { | |||
@@ -271,19 +271,21 @@ namespace debug { | |||
void notifyFailures() { | |||
PositionEntryMetadata metadata = { | |||
1, //all battery alert should goes on with this | |||
1, //all battery alerts should goes on with this | |||
3800, //doesn't matter | |||
ALERT_SUSPICIOUS_RTC_TEMPERATURE, | |||
0, | |||
SIM808_GPS_STATUS::OFF | |||
}; | |||
core::notifyFailures(metadata); | |||
uint8_t alerts = core::notifyFailures(metadata); | |||
NOTICE_FORMAT("notifyFailures", "result : %B", alerts); | |||
alerts::add(alerts); | |||
} | |||
void clearAlerts() { | |||
PositionEntryMetadata metadata = { | |||
100, //all battery alert should goes off with this | |||
100, //all battery alerts should goes off with this | |||
3800, //doesn't matter | |||
10, | |||
0, | |||
@@ -64,7 +64,7 @@ namespace hardware { | |||
void gpsPowerOff() { | |||
if (!device.powered()) { | |||
networkPoweredCount = gpsPoweredCount = 0; | |||
networkPoweredCount = gpsPoweredCount = 0; //just to be sure counts == 0 | |||
return; | |||
} | |||
@@ -74,7 +74,7 @@ namespace hardware { | |||
powerOffIfUnused(); | |||
} | |||
gpsPoweredCount--; | |||
if (gpsPoweredCount) gpsPoweredCount--; //avoid 255 if 0-- | |||
} | |||
void networkPowerOn() { | |||
@@ -89,10 +89,11 @@ namespace hardware { | |||
void networkPowerOff() { | |||
if (!device.powered()) { | |||
networkPoweredCount = gpsPoweredCount = 0; | |||
networkPoweredCount = gpsPoweredCount = 0; //just to be sure counts == 0 | |||
return; | |||
} | |||
if (networkPoweredCount == 1) { | |||
VERBOSE("networkPowerOff"); | |||
device.disableGprs(); | |||
@@ -101,7 +102,7 @@ namespace hardware { | |||
powerOffIfUnused(); | |||
} | |||
networkPoweredCount--; | |||
if (networkPoweredCount) networkPoweredCount--; //avoid 255 if 0-- | |||
} | |||
} | |||
@@ -43,10 +43,10 @@ namespace positions { | |||
buffer, | |||
buffer, | |||
BUFFER_SIZE | |||
) == POSITIONS_CONFIG_NET_DEFAULT_EXPECTED_RESPONSE; | |||
); | |||
NOTICE_FORMAT("appendPosition", "Response : %d", responseCode); | |||
return responseCode; | |||
return responseCode == POSITIONS_CONFIG_NET_DEFAULT_EXPECTED_RESPONSE; | |||
} | |||
//__attribute__((__optimize__("O2"))) | |||