CppGenerate/include/data_logger.hpp

154 lines
4.0 KiB
C++
Raw Permalink 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_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