Files
health-wellness-device-2/include/radar_manager.h
2026-08-12 09:20:54 +08:00

99 lines
2.8 KiB
C++

/**
* @file radar_manager.h
* @brief R60ABD1 毫米波雷达管理模块
*/
#ifndef RADAR_MANAGER_H
#define RADAR_MANAGER_H
#include <Arduino.h>
#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
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