/** * @file alarm_manager.h * @brief 报警管理器 - 多类型分优先级报警 (本地判定 + 服务端指令) * * 优先级: 跌倒 > 水浸 > 心率异常 > 呼吸异常 > 温湿度异常 > 传感器故障 * * 本地模式: 离线也能用, 全部类型本地判定触发 * 服务端模式: 收到 cmd/{gateid}/alarm, alarm/restore 执行联动 * 防抖: 传感器故障需连续 N 次确认才触发, 避免误报 */ #ifndef ALARM_MANAGER_H #define ALARM_MANAGER_H #include #include "config.h" // 报警回调 — 通知外部 (如 MQTT 上报) typedef void (*AlarmCallback)(uint8_t type, bool triggered, const char* desc); class AlarmManager { public: // 告警类型 (按优先级从高到低) enum AlarmType : uint8_t { ALARM_NONE = 0, ALARM_FALL, // 跌倒 (本地 + 服务端) ★★★★★ ALARM_WATER_LEAK, // 水浸 (本地 + 服务端) ★★★★ ALARM_HEART_ABNORMAL, // 心率异常 (本地) ★★★ ALARM_BREATH_ABNORMAL, // 呼吸异常 (本地) ★★★ ALARM_TEMP_ABNORMAL, // 温度异常 (本地) ★★ ALARM_HUMI_ABNORMAL, // 湿度异常 (本地) ★★ ALARM_SENSOR_FAULT, // 传感器故障 (本地) ★ ALARM_SERVER, // 服务端下发 (通用) ALARM_COUNT }; AlarmManager(); ~AlarmManager(); bool begin(); void loop(); // ============================================================ // 本地报警接口 (离线可用) // ============================================================ /** 触发本地报警 (防抖由调用方处理) */ void triggerLocal(AlarmType type, const char* detail = nullptr); /** 清除本地报警 */ void clearLocal(AlarmType type); /** 清除所有本地报警 (含防抖计数器) */ void clearAllLocal(); // ============================================================ // 服务端指令接口 (协议规范 §5.1, §5.2) // ============================================================ /** 执行服务端告警指令 */ void executeAlarm(const AlarmCommand& cmd); /** 执行服务端恢复指令 */ void executeRestore(const AlarmCommand& cmd); /** 蜂鸣器测试 */ void buzzerTest(uint32_t durationSec); // ============================================================ // 回调注册 // ============================================================ /** 报警状态变化回调 (触发/清除时调用, 用于MQTT上报) */ void onAlarmChange(AlarmCallback cb) { _alarmCb = cb; } // ============================================================ // 状态查询 // ============================================================ bool isBuzzerOn() const { return _buzzerOn; } bool hasActiveAlarm() const { return _activeCount > 0; } uint8_t getActiveCount() const { return _activeCount; } AlarmType getHighestAlarm() const; const char* getAlarmName(AlarmType type) const; const char* getActiveAlarmStr() const; private: // 报警优先级 (越小越紧急) static uint8_t _priority(AlarmType t); void _setBuzzer(bool on); void _setLED(bool on); void _updateBuzzer(); void _updateLED(); uint32_t _buzzerIntervalFor(AlarmType type); // 蜂鸣器/LED 状态 bool _buzzerOn; bool _ledOn; uint32_t _buzzerOffTime; // 定时关闭时刻 (0=手动/无限) uint32_t _buzzerToggleTime; // 间歇切换时刻 bool _buzzerBeepState; // 间歇状态 (响/停) uint8_t _beepCount; // 当前周期哔了几声 uint8_t _beepsPerCycle; // 当前报警类型每周期几声 uint32_t _beepOnMs; // 每声持续 ms uint32_t _beepOffMs; // 每声间隔 ms uint32_t _cyclePauseMs; // 周期间停顿 ms // 活动报警列表 (最多 5 个同时) static const uint8_t MAX_ACTIVE = 5; AlarmType _activeAlarms[MAX_ACTIVE]; uint8_t _activeCount; // 当前详情 (用于上报) char _activeDetail[64]; // LED 闪烁 uint32_t _lastLEDToggle; // 回调 AlarmCallback _alarmCb; }; #endif // ALARM_MANAGER_H