240 lines
8.8 KiB
C++
240 lines
8.8 KiB
C++
#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 报文结构体(8–64 字节 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 原始数据帧(0–64 字节)
|
||
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
|