#ifndef PCCU_SYSTEM_DATA_H #define PCCU_SYSTEM_DATA_H #include #include #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 lock(m_mutex); m_fcStatus = v; m_fcStatusCount++; } FcStatusValue fcStatus() const { std::lock_guard lock(m_mutex); return m_fcStatus; } unsigned long fcStatusCount() const { std::lock_guard lock(m_mutex); return m_fcStatusCount; } // 更新/获取最新 PM 操控指令(用于转发到 FC) void updatePmControl(const PmControlValue& v) { std::lock_guard lock(m_mutex); m_pmControl = v; m_pmControlCount++; } PmControlValue pmControl() const { std::lock_guard lock(m_mutex); return m_pmControl; } unsigned long pmControlCount() const { std::lock_guard lock(m_mutex); return m_pmControlCount; } // 更新/获取最新 PM 参数设定(预留,用于未来转发/应用) void updatePmParamSet(const PmParamSetValue& v) { std::lock_guard lock(m_mutex); m_pmParamSet = v; } PmParamSetValue pmParamSet() const { std::lock_guard lock(m_mutex); return m_pmParamSet; } // 更新/获取最新转发给 FC 的控制指令 void updateFcControl(const FcControlValue& v) { std::lock_guard lock(m_mutex); m_fcControl = v; m_fcControlCount++; } FcControlValue fcControl() const { std::lock_guard lock(m_mutex); return m_fcControl; } unsigned long fcControlCount() const { std::lock_guard lock(m_mutex); return m_fcControlCount; } // 更新/获取最新发送给 PM 的状态报文(整合后的) void updatePmStatus(const PmStatusValue& v) { std::lock_guard lock(m_mutex); m_pmStatus = v; m_pmStatusCount++; } PmStatusValue pmStatus() const { std::lock_guard lock(m_mutex); return m_pmStatus; } unsigned long pmStatusCount() const { std::lock_guard lock(m_mutex); return m_pmStatusCount; } // 更新/获取最新发送给 PM 的参数反馈 void updatePmParamFb(const PmParamSetFbValue& v) { std::lock_guard lock(m_mutex); m_pmParamFb = v; } PmParamSetFbValue pmParamFb() const { std::lock_guard lock(m_mutex); return m_pmParamFb; } //-------- 锂电池 BCU 节点(CAN 总线,经 pCanBridge 透传) -------- // 更新单个 BCU 节点状态(每帧部分更新,由调用方先取出快照再合并) void updateBcuNode(uint8_t addr, const BcuNodeStatus& v) { std::lock_guard 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 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 lock(m_mutex); for (int i = 0; i < kBcuNodeCount; ++i) out[i] = m_bcuNodes[i]; } unsigned long bmsStatusCount() const { std::lock_guard lock(m_mutex); return m_bmsStatusCount; } // CAN 链路收帧计数(含非 BMS 报文,用于链路状态展示) void incCanFrameCount() { std::lock_guard lock(m_mutex); m_canFrameCount++; } unsigned long canFrameCount() const { std::lock_guard lock(m_mutex); return m_canFrameCount; } //-------- 真实 CCU 桥接数据(配电协议,RCU 链路) -------- // 整体更新真实CCU 快照(DisBridge 在接收线程先取副本->修改->写回) void updateRealCcu(const RealCcuState& v) { std::lock_guard lock(m_mutex); m_realCcu = v; } RealCcuState realCcu() const { std::lock_guard 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