#ifndef HSM_SENSOR_SIMULATOR_HPP #define HSM_SENSOR_SIMULATOR_HPP #include #include #include /** * @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 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 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 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