154 lines
4.0 KiB
C++
154 lines
4.0 KiB
C++
#ifndef HSM_DATA_LOGGER_HPP
|
||
#define HSM_DATA_LOGGER_HPP
|
||
|
||
#include <cstdint>
|
||
#include <string>
|
||
#include <vector>
|
||
#include <memory>
|
||
|
||
/**
|
||
* @brief 历史数据记录结构体(模拟GJB需求)
|
||
*/
|
||
struct HSM_Record_t {
|
||
uint32_t timestamp; // UTC时间戳(秒)
|
||
float altitude; // 测量高度(单位:米)
|
||
char unit; // 单位标识符:'m' 表示米,'f' 表示英尺
|
||
uint8_t status; // 状态码:0=正常, 1=异常, 2=校准中
|
||
|
||
HSM_Record_t() : timestamp(0), altitude(0.0f), unit('m'), status(0) {}
|
||
HSM_Record_t(uint32_t ts, float alt, char u = 'm', uint8_t s = 0)
|
||
: timestamp(ts), altitude(alt), unit(u), status(s) {}
|
||
};
|
||
|
||
/**
|
||
* @brief 数据记录器类
|
||
*
|
||
* 负责历史数据的存储、管理和导出,功能包括:
|
||
* 1. 环形缓冲区管理(模拟硬件环形缓冲区)
|
||
* 2. 数据记录和查询
|
||
* 3. CSV/JSON格式导出
|
||
* 4. 数据回放支持
|
||
*/
|
||
class DataLogger {
|
||
public:
|
||
/**
|
||
* @brief 构造函数
|
||
* @param max_records 最大记录数(默认100000,对应24小时数据)
|
||
*/
|
||
explicit DataLogger(size_t max_records = 100000);
|
||
|
||
/**
|
||
* @brief 析构函数
|
||
*/
|
||
~DataLogger();
|
||
|
||
/**
|
||
* @brief 添加一条记录
|
||
* @param record 要添加的记录
|
||
* @return 添加是否成功
|
||
*/
|
||
bool addRecord(const HSM_Record_t& record);
|
||
|
||
/**
|
||
* @brief 添加一条记录(简化版本)
|
||
* @param timestamp 时间戳
|
||
* @param altitude 高度
|
||
* @param unit 单位
|
||
* @param status 状态
|
||
* @return 添加是否成功
|
||
*/
|
||
bool addRecord(uint32_t timestamp, float altitude, char unit = 'm', uint8_t status = 0);
|
||
|
||
/**
|
||
* @brief 获取记录数量
|
||
* @return 当前记录数
|
||
*/
|
||
size_t getRecordCount() const;
|
||
|
||
/**
|
||
* @brief 获取指定索引的记录
|
||
* @param index 记录索引
|
||
* @return 记录指针,如果索引无效返回nullptr
|
||
*/
|
||
const HSM_Record_t* getRecord(size_t index) const;
|
||
|
||
/**
|
||
* @brief 获取最近的记录
|
||
* @param count 要获取的记录数
|
||
* @return 记录向量
|
||
*/
|
||
std::vector<HSM_Record_t> getRecentRecords(size_t count) const;
|
||
|
||
/**
|
||
* @brief 按时间范围获取记录
|
||
* @param start_time 开始时间戳
|
||
* @param end_time 结束时间戳
|
||
* @return 符合条件的记录向量
|
||
*/
|
||
std::vector<HSM_Record_t> getRecordsByTimeRange(uint32_t start_time, uint32_t end_time) const;
|
||
|
||
/**
|
||
* @brief 导出数据到CSV文件
|
||
* @param filename 输出文件名
|
||
* @return 导出是否成功
|
||
*/
|
||
bool exportToCSV(const std::string& filename) const;
|
||
|
||
/**
|
||
* @brief 导出数据到JSON文件
|
||
* @param filename 输出文件名
|
||
* @return 导出是否成功
|
||
*/
|
||
bool exportToJSON(const std::string& filename) const;
|
||
|
||
/**
|
||
* @brief 清空所有记录
|
||
*/
|
||
void clear();
|
||
|
||
/**
|
||
* @brief 检查存储是否已满
|
||
* @return 是否已满
|
||
*/
|
||
bool isFull() const;
|
||
|
||
/**
|
||
* @brief 获取可用存储空间
|
||
* @return 可用记录数
|
||
*/
|
||
size_t getAvailableSpace() const;
|
||
|
||
/**
|
||
* @brief 获取存储容量
|
||
* @return 最大记录数
|
||
*/
|
||
size_t getCapacity() const { return capacity_; }
|
||
|
||
private:
|
||
std::unique_ptr<HSM_Record_t[]> buffer_; // 数据缓冲区
|
||
size_t capacity_; // 缓冲区容量
|
||
size_t count_; // 当前记录数
|
||
size_t head_; // 环形缓冲区头指针
|
||
size_t tail_; // 环形缓冲区尾指针
|
||
|
||
/**
|
||
* @brief 获取下一个索引
|
||
* @param current 当前索引
|
||
* @return 下一个索引
|
||
*/
|
||
size_t nextIndex(size_t current) const;
|
||
|
||
/**
|
||
* @brief 生成CSV内容
|
||
* @return CSV格式字符串
|
||
*/
|
||
std::string generateCSV() const;
|
||
|
||
/**
|
||
* @brief 生成JSON内容
|
||
* @return JSON格式字符串
|
||
*/
|
||
std::string generateJSON() const;
|
||
};
|
||
|
||
#endif // HSM_DATA_LOGGER_HPP
|