CppGenerate/include/sensor_simulator.hpp

160 lines
4.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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