160 lines
4.0 KiB
C++
160 lines
4.0 KiB
C++
|
|
#ifndef HSM_SENSOR_SIMULATOR_HPP
|
|||
|
|
#define HSM_SENSOR_SIMULATOR_HPP
|
|||
|
|
|
|||
|
|
#include <cstdint>
|
|||
|
|
#include <random>
|
|||
|
|
#include <memory>
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 传感器原始数据结构
|
|||
|
|
*/
|
|||
|
|
struct SensorRawData {
|
|||
|
|
float pressure; // 气压值(hPa)
|
|||
|
|
uint32_t timestamp_ms; // 毫秒级时间戳
|
|||
|
|
uint8_t flags; // 状态标志位
|
|||
|
|
|
|||
|
|
SensorRawData() : pressure(0.0f), timestamp_ms(0), flags(0) {}
|
|||
|
|
SensorRawData(float p, uint32_t ts, uint8_t f = 0)
|
|||
|
|
: pressure(p), timestamp_ms(ts), flags(f) {}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 传感器模拟器类
|
|||
|
|
*
|
|||
|
|
* 模拟气压传感器硬件,提供:
|
|||
|
|
* 1. 模拟气压数据生成
|
|||
|
|
* 2. 环形缓冲区管理(100个采样点)
|
|||
|
|
* 3. 传感器状态模拟(正常/异常)
|
|||
|
|
* 4. 噪声和漂移模拟
|
|||
|
|
*/
|
|||
|
|
class SensorSimulator {
|
|||
|
|
public:
|
|||
|
|
/**
|
|||
|
|
* @brief 构造函数
|
|||
|
|
* @param base_pressure 基础气压值(hPa)
|
|||
|
|
* @param noise_level 噪声水平
|
|||
|
|
*/
|
|||
|
|
explicit SensorSimulator(float base_pressure = 1013.25f, float noise_level = 0.5f);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 析构函数
|
|||
|
|
*/
|
|||
|
|
~SensorSimulator();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 初始化传感器
|
|||
|
|
* @return 初始化是否成功
|
|||
|
|
*/
|
|||
|
|
bool initialize();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 读取一次传感器数据
|
|||
|
|
* @return 传感器原始数据
|
|||
|
|
*/
|
|||
|
|
SensorRawData readSensor();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取当前气压值
|
|||
|
|
* @return 当前气压值(hPa)
|
|||
|
|
*/
|
|||
|
|
float getCurrentPressure() const;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取缓冲区中的数据
|
|||
|
|
* @param count 要获取的数据点数
|
|||
|
|
* @return 数据向量
|
|||
|
|
*/
|
|||
|
|
std::vector<SensorRawData> getBufferData(size_t count) const;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 清空缓冲区
|
|||
|
|
*/
|
|||
|
|
void clearBuffer();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置传感器状态
|
|||
|
|
* @param normal 是否正常(true=正常,false=异常)
|
|||
|
|
*/
|
|||
|
|
void setSensorStatus(bool normal);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取传感器状态
|
|||
|
|
* @return 是否正常
|
|||
|
|
*/
|
|||
|
|
bool isSensorNormal() const { return sensor_normal_; }
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置基础气压值
|
|||
|
|
* @param pressure 基础气压值
|
|||
|
|
*/
|
|||
|
|
void setBasePressure(float pressure);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置噪声水平
|
|||
|
|
* @param noise_level 噪声水平
|
|||
|
|
*/
|
|||
|
|
void setNoiseLevel(float noise_level);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 模拟高度变化
|
|||
|
|
* @param delta_height 高度变化量(米)
|
|||
|
|
*/
|
|||
|
|
void simulateHeightChange(float delta_height);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取缓冲区大小
|
|||
|
|
* @return 缓冲区容量
|
|||
|
|
*/
|
|||
|
|
size_t getBufferSize() const { return BUFFER_SIZE; }
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取缓冲区中的数据点数
|
|||
|
|
* @return 当前数据点数
|
|||
|
|
*/
|
|||
|
|
size_t getDataCount() const { return buffer_count_; }
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
static const size_t BUFFER_SIZE = 100; // 环形缓冲区容量
|
|||
|
|
|
|||
|
|
std::unique_ptr<SensorRawData[]> buffer_; // 环形缓冲区
|
|||
|
|
size_t buffer_head_; // 缓冲区头指针
|
|||
|
|
size_t buffer_tail_; // 缓冲区尾指针
|
|||
|
|
size_t buffer_count_; // 当前数据点数
|
|||
|
|
|
|||
|
|
float base_pressure_; // 基础气压值
|
|||
|
|
float current_pressure_; // 当前气压值
|
|||
|
|
float noise_level_; // 噪声水平
|
|||
|
|
bool sensor_normal_; // 传感器状态
|
|||
|
|
|
|||
|
|
// 随机数生成器
|
|||
|
|
std::mt19937 rng_;
|
|||
|
|
std::normal_distribution<float> noise_dist_;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 生成模拟气压值
|
|||
|
|
* @return 模拟的气压值
|
|||
|
|
*/
|
|||
|
|
float generatePressure();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 向缓冲区添加数据
|
|||
|
|
* @param data 要添加的数据
|
|||
|
|
*/
|
|||
|
|
void addToBuffer(const SensorRawData& data);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取下一个缓冲区索引
|
|||
|
|
* @param current 当前索引
|
|||
|
|
* @return 下一个索引
|
|||
|
|
*/
|
|||
|
|
size_t nextBufferIndex(size_t current) const;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 气压随高度变化公式
|
|||
|
|
* @param height 高度变化(米)
|
|||
|
|
* @return 气压变化量
|
|||
|
|
*/
|
|||
|
|
float pressureChangeForHeight(float height) const;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif // HSM_SENSOR_SIMULATOR_HPP
|