document_generate/include/app.hpp

657 lines
22 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 BNTVS_SW_APP_HPP
#define BNTVS_SW_APP_HPP
#include <cstdint>
#include <string>
#include <vector>
#include <chrono>
#include <functional>
/**
* @brief BNTVS_SW 命名空间,包含总线网络测试验证软件所有核心类型与函数。
*
* 该命名空间涵盖基础通信、协议兼容、数据存储、路由转发、总线分析、
* 故障注入、信号转换和总线测试等全部软件单元的功能声明与实现。
* 每个业务函数均通过 @requirement 标签关联对应的 CSCI 需求标识。
*/
namespace bntvs {
// ============================================================================
// 枚举类型定义
// ============================================================================
/// @brief 总线类型。
enum class BusType : uint8_t {
ETHERNET = 0, ///< 以太网总线
RS422 = 1, ///< RS422 串行总线
CAN = 2, ///< CAN 总线
ANALOG = 3, ///< 模拟量
DIGITAL = 4 ///< 离散量
};
/// @brief CAN 协议类型。
enum class CANProtocolType : uint8_t {
CAN2_0 = 0, ///< CAN 2.0 协议
CANFD = 1 ///< CAN FD 协议
};
/// @brief 帧格式类型。
enum class FrameFormat : uint8_t {
STANDARD = 0, ///< 标准帧 (11-bit ID)
EXTENDED = 1 ///< 扩展帧 (29-bit ID)
};
/// @brief 路由类型。
enum class RouteType : uint8_t {
STATIC = 0, ///< 静态路由
DYNAMIC = 1 ///< 动态路由
};
/// @brief 故障类型。
enum class FaultType : uint8_t {
SHORT_CIRCUIT = 0, ///< 短路
OPEN_CIRCUIT = 1, ///< 断路
EMI = 2, ///< 电磁干扰
ERROR_FRAME = 3, ///< 错误帧
NODE_OFFLINE = 4, ///< 节点离线
NODE_ABNORMAL = 5, ///< 节点异常接入
BAUD_RATE_ANOM = 6 ///< 波特率异常波动
};
// ============================================================================
// 数据结构定义
// ============================================================================
/**
* @brief 总线数据记录,对应数据库总线数据记录表结构。
*
* 用于存储从总线采集的原始通信数据包含时间戳、帧ID、
* 数据载荷及协议类型等信息。
*/
struct BusDataRecord {
int64_t record_id = 0; ///< 记录ID (数据库主键)
std::string bus_type; ///< 总线类型
std::chrono::system_clock::time_point timestamp; ///< 时间戳 (微秒精度)
uint32_t frame_id = 0; ///< 帧ID
uint32_t data_length = 0; ///< 数据长度
std::vector<uint8_t> data_content; ///< 数据内容
std::string protocol_type; ///< 协议类型
std::string node_id; ///< 采集节点标识
};
/**
* @brief 路由表条目,对应数据库路由表结构。
*/
struct RouteEntry {
int route_id = 0; ///< 路由ID
std::string dest_network; ///< 目标网络
std::string netmask; ///< 子网掩码
std::string next_hop; ///< 下一跳地址
std::string out_interface; ///< 出接口
int priority = 0; ///< 路由优先级
std::string route_type; ///< 路由类型 (Static/Dynamic)
};
/**
* @brief 网络状态信息,用于总线状态监视。
*/
struct NetworkStatus {
double bus_load = 0.0; ///< 总线负载率 (%)
uint64_t total_frames = 0; ///< 总帧数
uint64_t error_frames = 0; ///< 错误帧数
double capture_rate = 0.0; ///< 报文捕获速率 (帧/秒)
std::string last_update_time; ///< 最后更新时间
};
/**
* @brief 性能测试指标。
*/
struct PerformanceMetrics {
double avg_latency_us = 0.0; ///< 平均延迟 (微秒)
double max_latency_us = 0.0; ///< 最大延迟 (微秒)
double min_latency_us = 0.0; ///< 最小延迟 (微秒)
double throughput_mbps = 0.0; ///< 吞吐量 (Mbps)
double packet_loss_rate = 0.0; ///< 丢包率 (%)
uint64_t total_packets = 0; ///< 总报文数
uint64_t lost_packets = 0; ///< 丢失报文数
};
/**
* @brief 波形与时序分析结果。
*/
struct WaveformAnalysisResult {
double signal_frequency_hz = 0.0; ///< 信号频率 (Hz)
double signal_amplitude = 0.0; ///< 信号幅度
double rise_time_us = 0.0; ///< 上升时间 (微秒)
double fall_time_us = 0.0; ///< 下降时间 (微秒)
double duty_cycle = 0.0; ///< 占空比 (%)
uint64_t glitch_count = 0; ///< 毛刺计数
std::string analysis_summary; ///< 分析摘要
};
// ============================================================================
// 基础通用通信单元 (SU-COM) — 函数声明
// ============================================================================
/**
* @brief 初始化以太网通信接口。
*
* @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
* 实现以太网通信接口的初始化,支持 TCP/IP 和 UDP 协议,全双工千兆速率。
*
* @param ip_address 本机 IP 地址
* @param port 通信端口
* @return true 初始化成功
* @return false 初始化失败
*/
bool initEthernetComm(const std::string& ip_address, uint16_t port);
/**
* @brief 初始化 RS422 通信接口。
*
* @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
* 实现 RS422 异步串行通信接口的初始化,支持全双工和波特率自适应。
*
* @param port_name 串口名称 (如 COM1, /dev/ttyS0)
* @param baud_rate 波特率
* @return true 初始化成功
* @return false 初始化失败
*/
bool initRS422Comm(const std::string& port_name, uint32_t baud_rate);
/**
* @brief 初始化 CAN 通信接口。
*
* @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
* 实现 CAN 总线通信接口的初始化,支持 CAN2.0B/CANFD 协议,
* 波特率 5K~1Mbps 可调。
*
* @param interface_name 接口名称 (如 can0)
* @param baud_rate 波特率 (5K~1Mbps)
* @return true 初始化成功
* @return false 初始化失败
*/
bool initCANComm(const std::string& interface_name, uint32_t baud_rate);
/**
* @brief 初始化模拟量采集接口。
*
* @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
* 实现模拟量信号采集接口的初始化,支持 0~10V 输入范围12位精度。
*
* @param channel 采集通道编号
* @return true 初始化成功
* @return false 初始化失败
*/
bool initAnalogComm(uint8_t channel);
/**
* @brief 初始化离散量 I/O 接口。
*
* @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
* 实现离散量 TTL 电平信号采集接口的初始化,支持 48 路 I/O。
*
* @param io_pin I/O 引脚编号
* @return true 初始化成功
* @return false 初始化失败
*/
bool initDigitalComm(uint8_t io_pin);
// ============================================================================
// 协议兼容单元 (SU-PROT) — 函数声明
// ============================================================================
/**
* @brief 自动识别 CAN 帧采用的协议类型CAN2.0 或 CAN FD
*
* @requirement(name="协议兼容功能", id="SRS-F-01-002")
* 实现 CAN2.0 与 CANFD 协议的自动识别。
*
* @requirement(name="支持协议要求", id="SRS-F-09-007")
* 支持 CANFD 和 CAN2.0 协议识别。
*
* @param frame_data 原始 CAN 帧数据
* @return CANProtocolType 识别的协议类型
*/
CANProtocolType detectCANProtocol(const std::vector<uint8_t>& frame_data);
/**
* @brief 在 CAN2.0 和 CAN FD 帧格式之间进行兼容转换。
*
* @requirement(name="协议兼容功能", id="SRS-F-01-002")
* 实现 CAN2.0 与 CANFD 协议的切换适配和格式兼容转换,
* 确保数据转发一致性。
*
* @param source_type 源协议类型
* @param target_type 目标协议类型
* @param frame_data 待转换的帧数据
* @return std::vector<uint8_t> 转换后的帧数据
*/
std::vector<uint8_t> convertCANFrame(CANProtocolType source_type,
CANProtocolType target_type,
const std::vector<uint8_t>& frame_data);
// ============================================================================
// 数据存储单元 (SU-STOR) — 函数声明
// ============================================================================
/**
* @brief 存储一条总线数据记录到持久化存储。
*
* @requirement(name="数据存储功能", id="SRS-F-02-001")
* 实现通信数据的持久化存储,按时间顺序组织数据,
* 支持自动分段存储和磁盘容量监控。
*
* @param record 总线数据记录
* @return true 存储成功
* @return false 存储失败
*/
bool storeBusData(const BusDataRecord& record);
/**
* @brief 启动存储服务,包括磁盘容量监控。
*
* @requirement(name="数据存储功能", id="SRS-F-02-001")
* 监控磁盘容量,满时触发告警及覆盖最旧数据。
*
* @return true 启动成功
* @return false 启动失败
*/
bool startStorageService();
/**
* @brief 停止存储服务。
* @return true 停止成功
* @return false 停止失败
*/
bool stopStorageService();
// ============================================================================
// 数据管理与回放单元 (SU-REPLAY) — 函数声明
// ============================================================================
/**
* @brief 根据查询条件检索历史总线数据。
*
* @requirement(name="数据管理与数据回放功能", id="SRS-F-02-002")
* 提供历史数据的检索功能,支持按总线类型、时间范围等条件查询。
*
* @param bus_type 总线类型筛选(空字符串表示全部)
* @param start_time 起始时间
* @param end_time 结束时间
* @return std::vector<BusDataRecord> 匹配的记录列表
*/
std::vector<BusDataRecord> queryBusData(const std::string& bus_type,
const std::string& start_time,
const std::string& end_time);
/**
* @brief 按原始时序和可调速度回放指定总线数据。
*
* @requirement(name="数据管理与数据回放功能", id="SRS-F-02-002")
* 实现按原始时序、可调速度将存储数据回放。
*
* @requirement(name="数据统计回放功能", id="SRS-F-09-005")
* 实现数据统计回放,在回放过程中统计各项指标。
*
* @param records 待回放的数据记录列表
* @param speed_factor 回放速度倍数 (1.0 表示原始速度)
* @param callback 每帧回放时的回调函数
* @return uint64_t 实际回放的帧数
*/
uint64_t replayBusData(const std::vector<BusDataRecord>& records,
double speed_factor,
std::function<void(const BusDataRecord&)> callback);
/**
* @brief 删除指定 ID 的历史数据记录。
*
* @requirement(name="数据管理与数据回放功能", id="SRS-F-02-002")
* 支持历史数据的删除功能。
*
* @param record_id 要删除的记录 ID
* @return true 删除成功
* @return false 删除失败
*/
bool deleteBusData(int64_t record_id);
// ============================================================================
// 信号转换单元 (SU-CONV) — 函数声明
// ============================================================================
/**
* @brief 将模拟量电压值转换为 CAN 总线帧。
*
* @requirement(name="信号转换功能", id="SRS-F-06-001")
* 将模拟量信号进行数字化处理,转换为总线信号。
*
* @requirement(name="模拟量离散量转总线信号功能", id="SRS-F-06-005")
* 实现模拟量向总线信号的转换。
*
* @param voltage 模拟量电压值 (0~10V)
* @param can_id CAN 目标帧 ID
* @return BusDataRecord 转换后的总线数据记录
*/
BusDataRecord convertAnalogToBus(double voltage, uint32_t can_id);
/**
* @brief 将离散量电平值转换为 CAN 总线帧。
*
* @requirement(name="信号转换功能", id="SRS-F-06-001")
* 将离散量信号进行数字化处理,转换为总线信号。
*
* @requirement(name="模拟量离散量转总线信号功能", id="SRS-F-06-005")
* 实现离散量向总线信号的转换。
*
* @param level 离散量电平 (0 或 5V)
* @param can_id CAN 目标帧 ID
* @return BusDataRecord 转换后的总线数据记录
*/
BusDataRecord convertDigitalToBus(uint8_t level, uint32_t can_id);
// ============================================================================
// 总线路由单元 (SU-ROUTE) — 函数声明
// ============================================================================
/**
* @brief 执行数据帧的路由转发。
*
* @requirement(name="数据转发交换功能", id="SRS-F-07-001")
* 实现数据转发交换功能。
*
* @requirement(name="路由寻址功能", id="SRS-F-07-002")
* 实现路由寻址,根据路由表决定转发路径。
*
* @param frame 待转发的数据帧
* @return true 转发成功
* @return false 转发失败
*/
bool routeDataFrame(const BusDataRecord& frame);
/**
* @brief 将以太网数据帧转换为 CAN 总线帧。
*
* @requirement(name="以太网-CAN协议转换适配功能", id="SRS-F-07-003")
* 实现以太网与 CAN 协议间的转换适配。
*
* @param eth_frame 以太网帧数据
* @return BusDataRecord 转换后的 CAN 总线帧
*/
BusDataRecord convertEthernetToCAN(const BusDataRecord& eth_frame);
/**
* @brief 将 CAN 总线帧转换为以太网数据帧。
*
* @requirement(name="以太网-CAN协议转换适配功能", id="SRS-F-07-003")
* 实现 CAN 到以太网的协议转换。
*
* @param can_frame CAN 总线帧
* @return BusDataRecord 转换后的以太网帧
*/
BusDataRecord convertCANToEthernet(const BusDataRecord& can_frame);
/**
* @brief 添加一条静态路由。
*
* @requirement(name="路由功能要求", id="SRS-F-07-007")
* 支持静态路由配置。
*
* @param entry 路由条目
* @return true 添加成功
* @return false 添加失败
*/
bool addStaticRoute(const RouteEntry& entry);
/**
* @brief 添加一条动态路由(模拟 OSPF/RIP 协议行为)。
*
* @requirement(name="路由功能要求", id="SRS-F-07-007")
* 支持动态路由协议。
*
* @param entry 路由条目
* @return true 添加成功
* @return false 添加失败
*/
bool addDynamicRoute(const RouteEntry& entry);
// ============================================================================
// 总线分析单元 (SU-ANALY) — 函数声明
// ============================================================================
/**
* @brief 启动总线实时监听。
*
* @requirement(name="总线实时监听功能", id="SRS-F-09-001")
* 启动对指定类型总线的实时监听,通过回调传递接收的数据。
*
* @param bus_type 要监听的总线类型
* @param callback 接收数据时的回调
* @return true 启动成功
* @return false 启动失败
*/
bool startBusMonitoring(BusType bus_type,
std::function<void(const BusDataRecord&)> callback);
/**
* @brief 停止总线监听。
* @return true 停止成功
* @return false 停止失败
*/
bool stopBusMonitoring();
/**
* @brief 解析 CAN 帧数据,提取协议字段。
*
* @requirement(name="协议解析解码功能", id="SRS-F-09-002")
* 实现协议解析解码,支持 CAN2.0 和 CAN FD 协议格式。
*
* @param raw_data 原始 CAN 帧数据
* @return BusDataRecord 解析后的数据记录
*/
BusDataRecord parseCANFrame(const std::vector<uint8_t>& raw_data);
/**
* @brief 对数据帧进行故障诊断分析。
*
* @requirement(name="故障诊断分析功能", id="SRS-F-09-003")
* 实现故障诊断分析,检测各类总线错误。
*
* @requirement(name="错误帧识别要求", id="SRS-F-09-011")
* 识别位错误、CRC 错误等错误帧类型。
*
* @param frame 待检查的数据帧
* @return std::string 错误描述,空字符串表示无错误
*/
std::string diagnoseBusFault(const BusDataRecord& frame);
/**
* @brief 检查帧数据是否存在位错误或 CRC 错误。
*
* @requirement(name="错误帧识别要求", id="SRS-F-09-011")
* 要求识别位错误、CRC 错误等。
*
* @param frame_data 帧数据
* @return true 检测到错误
* @return false 无错误
*/
bool checkErrorFrame(const std::vector<uint8_t>& frame_data);
/**
* @brief 执行波形与时序分析。
*
* @requirement(name="波形与时序分析功能", id="SRS-F-09-004")
* 实现波形与时序分析,计算信号频率、幅度、占空比等参数。
*
* @param samples 采样数据序列
* @param sample_rate_hz 采样率 (Hz)
* @return WaveformAnalysisResult 分析结果
*/
WaveformAnalysisResult analyzeWaveform(const std::vector<double>& samples,
double sample_rate_hz);
/**
* @brief 获取当前网络状态信息。
*
* @requirement(name="网络状态监视功能", id="SRS-F-09-006")
* 实现网络状态监视,刷新率不低于 1Hz。
*
* @param bus_type 总线类型
* @return NetworkStatus 当前网络状态
*/
NetworkStatus getNetworkStatus(BusType bus_type);
// ============================================================================
// 故障注入单元 (SU-FAULT) — 函数声明
// ============================================================================
/**
* @brief 向目标总线注入短路故障。
*
* @requirement(name="总线短路/断路注入", id="SRS-F-12-001")
* 实现总线短路故障注入。
*
* @param bus_type 目标总线类型
* @param duration_ms 持续时间 (毫秒)
* @return true 注入成功
* @return false 注入失败
*/
bool injectShortCircuit(BusType bus_type, uint32_t duration_ms);
/**
* @brief 向目标总线注入断路故障。
*
* @requirement(name="总线短路/断路注入", id="SRS-F-12-001")
* 实现总线断路故障注入。
*
* @param bus_type 目标总线类型
* @param duration_ms 持续时间 (毫秒)
* @return true 注入成功
* @return false 注入失败
*/
bool injectOpenCircuit(BusType bus_type, uint32_t duration_ms);
/**
* @brief 向目标总线注入电磁干扰故障。
*
* @requirement(name="电磁干扰注入", id="SRS-F-12-002")
* 实现电磁干扰故障注入。
*
* @param bus_type 目标总线类型
* @param intensity 干扰强度 (0.0~1.0)
* @param duration_ms 持续时间 (毫秒)
* @return true 注入成功
* @return false 注入失败
*/
bool injectEMI(BusType bus_type, double intensity, uint32_t duration_ms);
/**
* @brief 向目标总线注入错误帧。
*
* @requirement(name="错误帧注入", id="SRS-F-12-003")
* 实现错误帧故障注入。
*
* @param bus_type 目标总线类型
* @param error_type 错误类型描述
* @return true 注入成功
* @return false 注入失败
*/
bool injectErrorFrame(BusType bus_type, const std::string& error_type);
/**
* @brief 模拟节点离线故障。
*
* @requirement(name="节点离线/异常接入", id="SRS-F-12-004")
* 实现节点离线故障注入。
*
* @param node_id 目标节点标识
* @param duration_ms 持续时间 (毫秒)
* @return true 注入成功
* @return false 注入失败
*/
bool injectNodeOffline(const std::string& node_id, uint32_t duration_ms);
/**
* @brief 模拟节点异常接入故障。
*
* @requirement(name="节点离线/异常接入", id="SRS-F-12-004")
* 实现节点异常接入故障注入。
*
* @param node_id 异常节点标识
* @return true 注入成功
* @return false 注入失败
*/
bool injectNodeAbnormal(const std::string& node_id);
/**
* @brief 向目标总线注入波特率异常波动故障。
*
* @requirement(name="波特率异常波动注入", id="SRS-F-12-005")
* 实现波特率异常波动故障注入。
*
* @param bus_type 目标总线类型
* @param abnormal_baud 异常波特率
* @param duration_ms 持续时间 (毫秒)
* @return true 注入成功
* @return false 注入失败
*/
bool injectBaudRateAnomaly(BusType bus_type, uint32_t abnormal_baud, uint32_t duration_ms);
// ============================================================================
// 总线测试分析单元 (SU-TEST) — 函数声明
// ============================================================================
/**
* @brief 执行 40m 以内短距离总线的传输性能测试。
*
* @requirement(name="40m内总线测试分析功能", id="SRS-F-10-001")
* 实现 40m 内总线传输延迟、吞吐量、丢包率等性能测试。
*
* @param bus_type 总线类型
* @param test_duration_sec 测试持续时间 (秒)
* @return PerformanceMetrics 测试结果指标
*/
PerformanceMetrics testShortBusPerformance(BusType bus_type, uint32_t test_duration_sec);
/**
* @brief 执行 40m 以上(含中继)总线的传输性能测试。
*
* @requirement(name="40m以上总线测试分析功能", id="SRS-F-10-002")
* 实现 40m 以上含中继总线的测试分析。
*
* @param bus_type 总线类型
* @param test_duration_sec 测试持续时间 (秒)
* @return PerformanceMetrics 测试结果指标
*/
PerformanceMetrics testLongBusPerformance(BusType bus_type, uint32_t test_duration_sec);
/**
* @brief 执行长时间满负荷稳定性测试≥24小时
*
* @requirement(name="长时间满负荷测试分析功能", id="SRS-F-10-003")
* 实现长时间满负荷运行、重复启停等测试分析。
*
* @param bus_type 总线类型
* @param duration_hours 测试持续时间 (小时)
* @return PerformanceMetrics 测试结果指标
*/
PerformanceMetrics testLongDurationStability(BusType bus_type, uint32_t duration_hours);
// ============================================================================
// 辅助函数
// ============================================================================
/**
* @brief 获取软件版本号。
* @return std::string 版本号字符串
*/
std::string getVersion();
/**
* @brief 打印命令行帮助信息。
*/
void printHelp();
} // namespace bntvs
#endif // BNTVS_SW_APP_HPP