Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

64 рядки
1.9 KiB

  1. #pragma once
  2. #include "Debug.h"
  3. #include "Alerts.h"
  4. #include "Config.h"
  5. #include "Rtc.h"
  6. #define LOGGER_NAME "Alerts"
  7. namespace alerts {
  8. uint8_t getTriggered(PositionEntryMetadata &metadata) {
  9. config_t* config = &config::main::value;
  10. uint8_t result = 0;
  11. if (metadata.batteryLevel <= config->alertBatteryLevel1 && !bitRead(config->activeAlerts, ALERT_BATTERY_LEVEL_1)) {
  12. bitSet(result, ALERT_BATTERY_LEVEL_1);
  13. }
  14. if (metadata.batteryLevel <= config->alertBatteryLevel2 && !bitRead(config->activeAlerts, ALERT_BATTERY_LEVEL_2)) {
  15. bitSet(result, ALERT_BATTERY_LEVEL_2);
  16. }
  17. if (metadata.temperature == ALERT_SUSPICIOUS_RTC_TEMPERATURE && !bitRead(config->activeAlerts, ALERT_RTC_TEMPERATURE_FAILURE)) {
  18. bitSet(result, ALERT_RTC_TEMPERATURE_FAILURE);
  19. }
  20. if (!rtc::isAccurate() && !bitRead(config->activeAlerts, ALERT_RTC_CLOCK_FAILURE)) {
  21. bitSet(result, ALERT_RTC_CLOCK_FAILURE);
  22. }
  23. return result;
  24. }
  25. void add(uint8_t mask) {
  26. if (!mask) return; //save a write to eeprom if there is no change
  27. config_t* config = &config::main::value;
  28. config->activeAlerts |= mask;
  29. config::main::save();
  30. }
  31. void clear(PositionEntryMetadata &metadata) {
  32. config_t* config = &config::main::value;
  33. uint8_t clearMask = 0;
  34. if ((config->activeAlerts & (_BV(ALERT_BATTERY_LEVEL_1) | _BV(ALERT_BATTERY_LEVEL_2))) && metadata.temperature >= config->alertBatteryLevelClear) {
  35. clearMask |= _BV(ALERT_BATTERY_LEVEL_1) | _BV(ALERT_BATTERY_LEVEL_2);
  36. }
  37. if (bitRead(config->activeAlerts, ALERT_RTC_TEMPERATURE_FAILURE) && metadata.temperature != ALERT_SUSPICIOUS_RTC_TEMPERATURE) {
  38. bitSet(clearMask, ALERT_RTC_TEMPERATURE_FAILURE);
  39. }
  40. if (bitRead(config->activeAlerts, ALERT_RTC_CLOCK_FAILURE) && rtc::isAccurate()) {
  41. bitSet(clearMask, ALERT_RTC_CLOCK_FAILURE);
  42. }
  43. if (!clearMask) return; //save a write to eeprom if there is no change
  44. config->activeAlerts &= ~clearMask;
  45. config::main::save();
  46. }
  47. }