|
- #pragma once
-
- #include "Alerts.h"
- #include "Config.h"
- #include "Rtc.h"
-
- 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);
- }
-
- 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(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 (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 (!clearMask) return; //save a write to eeprom if there is no change
- config->activeAlerts &= ~clearMask;
- config::main::save();
- }
- }
|