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