101 lines
2.9 KiB
C++
101 lines
2.9 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
|
|
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
|