net_env_project/include/app.hpp

240 lines
8.8 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 AVIONICS_NETWORK_ENV_APP_HPP
#define AVIONICS_NETWORK_ENV_APP_HPP
#include <cstdint>
#include <string>
#include <vector>
#include <ctime>
// ═══════════════════════════════════════════════════════════════
// 公共类型定义
// ═══════════════════════════════════════════════════════════════
/// @brief 总线类型枚举
enum class BusType {
Ethernet,
RS422,
CAN,
CANFD,
Analog,
Discrete
};
/// @brief 存储状态枚举
enum class StorageStatus {
Healthy,
Warning,
Full,
DiskFailure,
PathSwitched
};
/// @brief CAN 报文结构体864 字节 Hex 编码)
struct CanFrame {
uint32_t id; ///< CAN ID标准帧 11 位 / 扩展帧 29 位)
bool isExtended; ///< true=扩展帧, false=标准帧
bool isCanFd; ///< true=CANFD, false=CAN2.0
uint8_t dataLen; ///< 数据长度0-64
uint8_t data[64]; ///< 数据域
time_t timestamp; ///< 时间戳
};
/// @brief 原始数据帧064 字节)
struct RawDataFrame {
BusType busType;
uint8_t len;
uint8_t data[64];
time_t timestamp;
};
/// @brief 过滤后的有效数据(结构体形式输出)
struct ValidData {
uint32_t id;
uint8_t dataLen;
uint8_t data[64];
time_t timestamp;
BusType sourceBus;
};
/// @brief 兼容格式帧PPU 转换后的输出)
struct CompatibleFrame {
uint32_t id;
bool isExtended;
uint8_t dataLen;
uint8_t data[64];
time_t timestamp;
};
/// @brief 查询条件结构体
struct QueryCondition {
time_t startTime;
time_t endTime;
uint32_t channelId;
uint32_t maxResults;
};
// ═══════════════════════════════════════════════════════════════
// DAU — 数据采集单元Data Acquisition Unit
// 职责:接收多总线原始数据,完成 ID 过滤、波特率适配、错误帧
// 处理、睡眠/唤醒管理及总线负载监控。
// ═══════════════════════════════════════════════════════════════
namespace dau {
/**
* @brief 接收原始数据帧,执行 ID 过滤、波特率适配和基础校验。
*
* 根据 BusType 识别输入总线类型,对数据帧进行合法性检查与 ID 过滤,
* 输出有效数据。遇到错误帧时记录错误日志。
*
* @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
* 接收以太网、RS422、CAN、模拟量和离散量的基本通讯数据进行 ID 过滤、
* 波特率适配、错误帧处理、睡眠/唤醒管理及总线负载监控。
*
* @param input 原始输入数据帧
* @param output [out] 过滤后的有效数据
* @param errorLog [out] 错误日志信息
* @return true 处理成功且数据有效
* @return false 数据被过滤或发生错误
*/
bool DAU_Process(const RawDataFrame& input, ValidData& output, std::string& errorLog);
/**
* @brief 设置睡眠/唤醒状态。
*
* @param sleep true 进入睡眠模式false 唤醒。
*/
void DAU_SetSleep(bool sleep);
/**
* @brief 查询当前总线负载率(百分比 0-100
*
* @return uint32_t 总线负载百分比。
*/
uint32_t DAU_GetBusLoad();
} // namespace dau
// ═══════════════════════════════════════════════════════════════
// PPU — 协议处理单元Protocol Processing Unit
// 职责:实现 CAN2.0 ↔ CANFD 协议识别与转换,遵循 ARINC825 标准,
// 兼容标准帧与扩展帧格式;不支持格式记录日志并丢弃。
// ═══════════════════════════════════════════════════════════════
namespace ppu {
/**
* @brief 将输入 CAN 帧转换为兼容格式CAN2.0 ↔ CANFD
*
* 根据 ARINC825 标准进行协议转换。若输入帧格式不被支持,
* 函数返回 false 并在日志中记录详细原因。
*
* @requirement(name="协议兼容与互通信功能", id="SRS-F-01-002")
* 支持 CAN2.0 与 CANFD 设备间的互通信,依据 ARINC825 标准进行协议转换
* 或适配,兼容标准帧与扩展帧格式;若格式不支持,则记录日志并丢弃。
*
* @param input 输入 CAN/CANFD 帧
* @param output [out] 转换后的兼容格式帧
* @param log [out] 转换日志或错误说明
* @return true 转换成功
* @return false 格式不支持,已丢弃
*/
bool PPU_Convert(const CanFrame& input, CompatibleFrame& output, std::string& log);
/**
* @brief 检查 CAN 帧格式是否被当前协议栈支持。
*
* 对输入帧的 ID、扩展标识、数据长度及协议类型进行综合检查。
*
* @requirement(name="协议兼容与互通信功能", id="SRS-F-01-002")
* 兼容标准帧与扩展帧格式;若格式不支持,则记录日志并丢弃。
*
* @param frame 待检查的 CAN 帧
* @param reason [out] 若不支持,返回具体原因
* @return true 格式支持
* @return false 格式不支持
*/
bool PPU_Check(const CanFrame& frame, std::string& reason);
} // namespace ppu
// ═══════════════════════════════════════════════════════════════
// DSU — 数据存储单元Data Storage Unit
// 职责:实时总线数据流缓冲预处理、持久化写入、磁盘故障告警与
// 路径切换、数据查询检索按时序回放。
// ═══════════════════════════════════════════════════════════════
namespace dsu {
/**
* @brief 将数据流写入持久化存储。
*
* 接收实时数据流进行缓冲预处理,按时间戳+通道ID分类
* 批量写入高速存储介质。
*
* @requirement(name="数据存储功能", id="SRS-F-02-001")
* 将总线数据持久化保存,接收实时数据流并进行缓冲预处理,
* 按时间戳或事件索引写入存储介质。
*
* @param dataStream 待存储的原始字节流
* @param channelId 通道标识
* @param timestamp 数据时间戳
* @return true 写入成功
* @return false 写入失败
*/
bool DSU_Write(const std::vector<uint8_t>& dataStream, uint32_t channelId, time_t timestamp);
/**
* @brief 检查磁盘健康状态,故障时告警并尝试切换存储路径。
*
* 定期检查当前存储介质的可用空间与健康状态。
* 若检测到磁盘故障,发出告警日志并尝试切换至备用路径。
*
* @requirement(name="数据存储功能", id="SRS-F-02-001")
* 当发生磁盘故障时,应发出告警并尝试切换至备用存储路径。
*
* @return StorageStatus 当前存储状态
*/
StorageStatus DSU_CheckDisk();
/**
* @brief 根据查询条件检索已存储的数据。
*
* 支持按时间戳范围或事件索引进行数据检索。
*
* @requirement(name="数据管理与回放功能", id="SRS-F-02-002")
* 支持对已存储数据的查询、检索,并能够按照原始时序精确回放;
* 若数据损坏,应跳过坏块并记录日志。
*
* @param condition 查询条件
* @param results [out] 检索结果列表(每个元素为一个数据块)
* @param log [out] 操作日志(含损坏数据跳过记录)
* @return true 查询成功
* @return false 查询失败
*/
bool DSU_Query(const QueryCondition& condition,
std::vector<std::vector<uint8_t>>& results,
std::string& log);
/**
* @brief 按原始时序精确回放数据流。
*
* 从已存储的数据中按时间戳排序输出字节流,回放间隔保持原始时间戳间隔。
*
* @requirement(name="数据管理与回放功能", id="SRS-F-02-002")
* 能够按照原始时序精确回放;回放过程需保持原始时间戳间隔。
*
* @param condition 查询条件(指定回放范围)
* @param replayOutput [out] 回放字节流,按原始时间戳排序
* @param log [out] 操作日志
* @return true 回放成功
* @return false 回放失败或无数据
*/
bool DSU_Replay(const QueryCondition& condition,
std::vector<uint8_t>& replayOutput,
std::string& log);
} // namespace dsu
#endif // AVIONICS_NETWORK_ENV_APP_HPP