/** * @file radar_manager.h * @brief R60ABD1 毫米波雷达管理模块 */ #ifndef RADAR_MANAGER_H #define RADAR_MANAGER_H #include #include "config.h" #include "radar_protocol.h" // 雷达原始数据结构 struct RadarRawData { bool presence; // 有人/无人 bool motion; // 运动 (false=静止) bool fall; // 跌倒 bool resident; // 驻留 uint8_t heartRate; // 心率 uint8_t breathRate; // 呼吸 uint8_t body; // 体动/能量值 uint16_t distance; // 距离 cm uint8_t sleepState; // 睡眠状态: 0=清醒 1=浅睡 2=深睡 uint8_t sleepScore; // 睡眠评分: 0~100 bool radarValid; // 雷达有效性 bool vitalValid; // 生命体征有效性 uint32_t lastUpdate; }; typedef void (*RadarCallback)(const RadarRawData& data); class RadarManager { public: RadarManager(); ~RadarManager(); bool begin(); void loop(); /** 获取最新数据 */ RadarRawData getData() const; /** 数据更新回调 */ void onDataUpdate(RadarCallback cb); /** 发送命令 */ void sendCommand(uint8_t control, uint8_t command, const uint8_t* data = nullptr, uint16_t len = 0); void queryInitStatus(); void queryDetectRange(); bool isInitialized() const { return _initialized; } /** 检查雷达是否超时未收到数据 (>5秒无有效帧) */ bool isTimeout() const { return (_frameCount > 0) && (millis() - _data.lastUpdate > 5000); } /** 雷达数据是否有效 */ bool isDataValid() const { return _data.radarValid; } private: void _parseByte(uint8_t byte); void _resetParser(); bool _validateChecksum(); void _processCompleteFrame(); void _extractPresence(const RadarFrame& frame); void _extractBreathing(const RadarFrame& frame); void _extractHeartRate(const RadarFrame& frame); void _extractFall(const RadarFrame& frame); // AFD1 跌倒 void _extractSleep(const RadarFrame& frame); void _extractWorkStatus(const RadarFrame& frame); void _extractDetectRange(const RadarFrame& frame); uint8_t _calcChecksum(const uint8_t* data, uint16_t len); void _notifyUpdate(); HardwareSerial* _serial; FrameState _state; RadarFrame _currentFrame; uint16_t _dataIndex; RadarRawData _data; bool _initialized; RadarCallback _callback; uint32_t _frameCount; uint32_t _errorCount; uint32_t _lastHeartBeat; // 上次心率数据时间 uint32_t _lastBreathBeat; // 上次呼吸数据时间 // 有人无人防抖 (PCB 信号不稳定时过滤跳变) bool _stablePresence; // 防抖后的稳定有人/无人 uint8_t _presenceCnt; // 连续一致计数 bool _lastRawPresence; // 上一次原始值 }; #endif // RADAR_MANAGER_H