121 lines
4.2 KiB
C++
121 lines
4.2 KiB
C++
/**
|
|
* @file alarm_manager.h
|
|
* @brief 报警管理器 - 多类型分优先级报警 (本地判定 + 服务端指令)
|
|
*
|
|
* 优先级: 跌倒 > 水浸 > 心率异常 > 呼吸异常 > 温湿度异常 > 传感器故障
|
|
*
|
|
* 本地模式: 离线也能用, 全部类型本地判定触发
|
|
* 服务端模式: 收到 cmd/{gateid}/alarm, alarm/restore 执行联动
|
|
* 防抖: 传感器故障需连续 N 次确认才触发, 避免误报
|
|
*/
|
|
|
|
#ifndef ALARM_MANAGER_H
|
|
#define ALARM_MANAGER_H
|
|
|
|
#include <Arduino.h>
|
|
#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
|