- protocol/DisProtocol: 配电协议8条消息(指令0x0001~4/反馈0x0005~8, Sum8),复用pmSysvariable结构体+static_assert核对 - ChecksumPolicy 新增 Sum8;Frame 支持 1 字节校验和 - MessageRegistry 支持 (id+帧总长) 二维查找:配电指令与PM操控指令共用id按帧长区分(帧头length字段不可信) - LinkManager: 按实际帧长分发 + sendRaw原帧透传 + 非本协议帧头落库节流告警;UdpEndpoint sendTo 加锁 - comm/RcuLinkManager: 真实CCU链路;core/DisBridge: 配电桥接器(反馈转pPowerManger+解码显示,指令转真实CCU,0x0004仅显示不转发) - 网页新增"真实CCU"页签全字段展示;SnapshotBuilder realCcu 节 + rcu 链路描述 - h100.moos: 端口腾挪(真实CCU固定上报5001归pCCU,pPowerManger iport=5002),rcu_remote=192.168.0.140:7000 - 测试: pccuTest 新增配电/Sum8/长度分发/RCU注册表用例(176项);集成测试新增桥接字节一致+不误转发用例
212 lines
7.5 KiB
C++
212 lines
7.5 KiB
C++
#ifndef PCCU_SYSTEM_DATA_H
|
|
#define PCCU_SYSTEM_DATA_H
|
|
|
|
#include <mutex>
|
|
#include <atomic>
|
|
#include "../protocol/FcProtocol.h"
|
|
#include "../protocol/PmProtocol.h"
|
|
#include "../protocol/CanBms.h"
|
|
#include "../protocol/DisProtocol.h"
|
|
|
|
namespace ccu {
|
|
|
|
//============================================================================
|
|
// RealCcuState:真实 CCU 设备的桥接数据缓存(配电协议)。
|
|
//
|
|
// 数据来源:RCU 链路(真实CCU -> pCCU),由 DisBridge 在转发的同时
|
|
// 解码写入;网页快照读取展示。各 lastRx 时间由写入方更新(MOOSTime),
|
|
// 供在线判定与新鲜度展示。
|
|
//============================================================================
|
|
|
|
struct RealCcuState {
|
|
// 四条配电母线最新反馈(valid 表示收到过对应反馈帧)
|
|
disHighVolBusState hvBus{}; bool hvValid = false;
|
|
disHighAVolBusState hvaBus{}; bool hvaValid = false;
|
|
disLowMainBusState hvbBus{}; bool hvbValid = false;
|
|
disLowBusState lvBus{}; bool lvValid = false;
|
|
double hvLastRx = 0, hvaLastRx = 0, hvbLastRx = 0, lvLastRx = 0;
|
|
|
|
// 最近收到的配电指令(pPowerManger 下发、已转发真实CCU,用于展示)
|
|
disHighVolBusCmd lastHvCmd{};
|
|
disHighAVolBusCmd lastHvaCmd{};
|
|
disLowMainBusCmd lastHvbCmd{};
|
|
disLowBusCmd lastLvCmd{};
|
|
bool cmdValid = false;
|
|
double lastCmdRx = 0;
|
|
|
|
// 真实CCU 状态报文 0x0004(仅解码显示,不转发)
|
|
PmStatusValue ccuStatus{};
|
|
bool ccuStatusValid = false;
|
|
double ccuStatusLastRx = 0;
|
|
|
|
// 桥接统计
|
|
unsigned long fbCount = 0; // 收到配电反馈帧数
|
|
unsigned long fwdFbOk = 0; // 反馈转发 pPowerManger 成功帧数
|
|
unsigned long fwdFbErr = 0; // 反馈转发失败帧数
|
|
unsigned long cmdCount = 0; // 收到配电指令帧数
|
|
unsigned long fwdCmdOk = 0; // 指令转发真实CCU 成功帧数
|
|
unsigned long fwdCmdErr = 0; // 指令转发失败帧数
|
|
};
|
|
|
|
//============================================================================
|
|
// SystemData:跨线程共享的最新状态快照。
|
|
//
|
|
// - 接收线程(FC 链路)写 FcStatus 快照
|
|
// - MOOS 主线程(OnNewMail)写 BCU 节点快照(CAN 经 pCanBridge 透传)
|
|
// - CCU 主循环(Iterate)读快照并整合编码为 PM 状态报文发送
|
|
// - 网页线程读快照展示
|
|
// 通过互斥锁保护读写。
|
|
//============================================================================
|
|
|
|
class SystemData {
|
|
public:
|
|
// 更新/获取燃料电池最新状态
|
|
void updateFcStatus(const FcStatusValue& v) {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
m_fcStatus = v;
|
|
m_fcStatusCount++;
|
|
}
|
|
FcStatusValue fcStatus() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_fcStatus;
|
|
}
|
|
unsigned long fcStatusCount() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_fcStatusCount;
|
|
}
|
|
|
|
// 更新/获取最新 PM 操控指令(用于转发到 FC)
|
|
void updatePmControl(const PmControlValue& v) {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
m_pmControl = v;
|
|
m_pmControlCount++;
|
|
}
|
|
PmControlValue pmControl() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_pmControl;
|
|
}
|
|
unsigned long pmControlCount() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_pmControlCount;
|
|
}
|
|
|
|
// 更新/获取最新 PM 参数设定(预留,用于未来转发/应用)
|
|
void updatePmParamSet(const PmParamSetValue& v) {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
m_pmParamSet = v;
|
|
}
|
|
PmParamSetValue pmParamSet() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_pmParamSet;
|
|
}
|
|
|
|
// 更新/获取最新转发给 FC 的控制指令
|
|
void updateFcControl(const FcControlValue& v) {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
m_fcControl = v;
|
|
m_fcControlCount++;
|
|
}
|
|
FcControlValue fcControl() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_fcControl;
|
|
}
|
|
unsigned long fcControlCount() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_fcControlCount;
|
|
}
|
|
|
|
// 更新/获取最新发送给 PM 的状态报文(整合后的)
|
|
void updatePmStatus(const PmStatusValue& v) {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
m_pmStatus = v;
|
|
m_pmStatusCount++;
|
|
}
|
|
PmStatusValue pmStatus() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_pmStatus;
|
|
}
|
|
unsigned long pmStatusCount() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_pmStatusCount;
|
|
}
|
|
|
|
// 更新/获取最新发送给 PM 的参数反馈
|
|
void updatePmParamFb(const PmParamSetFbValue& v) {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
m_pmParamFb = v;
|
|
}
|
|
PmParamSetFbValue pmParamFb() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_pmParamFb;
|
|
}
|
|
|
|
//-------- 锂电池 BCU 节点(CAN 总线,经 pCanBridge 透传) --------
|
|
|
|
// 更新单个 BCU 节点状态(每帧部分更新,由调用方先取出快照再合并)
|
|
void updateBcuNode(uint8_t addr, const BcuNodeStatus& v) {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
if (addr >= kBcuAddrMin && addr <= kBcuAddrMax) {
|
|
m_bcuNodes[addr - kBcuAddrMin] = v;
|
|
m_bmsStatusCount++;
|
|
}
|
|
}
|
|
// 读取单个 BCU 节点快照(地址非法返回 valid=false 的空快照)
|
|
BcuNodeStatus bcuNode(uint8_t addr) const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
if (addr >= kBcuAddrMin && addr <= kBcuAddrMax)
|
|
return m_bcuNodes[addr - kBcuAddrMin];
|
|
return BcuNodeStatus();
|
|
}
|
|
// 读取全部节点快照(数组下标 = 地址-1)
|
|
void bcuNodes(BcuNodeStatus out[kBcuNodeCount]) const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
for (int i = 0; i < kBcuNodeCount; ++i) out[i] = m_bcuNodes[i];
|
|
}
|
|
unsigned long bmsStatusCount() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_bmsStatusCount;
|
|
}
|
|
|
|
// CAN 链路收帧计数(含非 BMS 报文,用于链路状态展示)
|
|
void incCanFrameCount() {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
m_canFrameCount++;
|
|
}
|
|
unsigned long canFrameCount() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_canFrameCount;
|
|
}
|
|
|
|
//-------- 真实 CCU 桥接数据(配电协议,RCU 链路) --------
|
|
|
|
// 整体更新真实CCU 快照(DisBridge 在接收线程先取副本->修改->写回)
|
|
void updateRealCcu(const RealCcuState& v) {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
m_realCcu = v;
|
|
}
|
|
RealCcuState realCcu() const {
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
return m_realCcu;
|
|
}
|
|
|
|
private:
|
|
mutable std::mutex m_mutex;
|
|
FcStatusValue m_fcStatus;
|
|
PmControlValue m_pmControl;
|
|
PmParamSetValue m_pmParamSet;
|
|
FcControlValue m_fcControl;
|
|
PmStatusValue m_pmStatus;
|
|
PmParamSetFbValue m_pmParamFb;
|
|
BcuNodeStatus m_bcuNodes[kBcuNodeCount]; // 下标 = 节点地址-1
|
|
RealCcuState m_realCcu;
|
|
unsigned long m_fcStatusCount = 0;
|
|
unsigned long m_pmControlCount = 0;
|
|
unsigned long m_fcControlCount = 0;
|
|
unsigned long m_pmStatusCount = 0;
|
|
unsigned long m_bmsStatusCount = 0;
|
|
unsigned long m_canFrameCount = 0;
|
|
};
|
|
|
|
} // namespace ccu
|
|
|
|
#endif // PCCU_SYSTEM_DATA_H
|