- 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项);集成测试新增桥接字节一致+不误转发用例
52 lines
1.7 KiB
C++
52 lines
1.7 KiB
C++
#include "Frame.h"
|
|
#include "FieldCodec.h"
|
|
|
|
namespace ccu {
|
|
|
|
bool Frame::parseId(const std::vector<uint8_t>& buf, uint16_t& outId) {
|
|
if (buf.size() < FRAME_HEADER_LEN) return false;
|
|
if (buf[0] != FRAME_START1 || buf[1] != FRAME_START2) return false;
|
|
outId = FieldCodec::getU16(buf, 2);
|
|
return true;
|
|
}
|
|
|
|
bool Frame::parseHeader(const std::vector<uint8_t>& buf, FrameHeader& h) {
|
|
if (buf.size() < FRAME_HEADER_LEN) return false;
|
|
if (buf[0] != FRAME_START1 || buf[1] != FRAME_START2) return false;
|
|
h.start1 = buf[0];
|
|
h.start2 = buf[1];
|
|
h.id = FieldCodec::getU16(buf, 2);
|
|
h.length = FieldCodec::getU16(buf, 4);
|
|
return true;
|
|
}
|
|
|
|
std::vector<uint8_t> Frame::build(
|
|
uint16_t id,
|
|
const std::vector<uint8_t>& payload,
|
|
const ChecksumPolicy& checksum) {
|
|
|
|
size_t csSize = checksum.size();
|
|
size_t total = FRAME_HEADER_LEN + payload.size() + csSize;
|
|
|
|
std::vector<uint8_t> frame(total, 0);
|
|
frame[0] = FRAME_START1;
|
|
frame[1] = FRAME_START2;
|
|
FieldCodec::putU16(frame, 2, id);
|
|
FieldCodec::putU16(frame, 4, static_cast<uint16_t>(total)); // 域字节数=整个包长度
|
|
|
|
std::copy(payload.begin(), payload.end(), frame.begin() + FRAME_HEADER_LEN);
|
|
|
|
if (csSize > 0) {
|
|
// 校验和:对起始符到校验和之前所有字节求和
|
|
std::vector<uint8_t> body(frame.begin(), frame.end() - csSize);
|
|
uint32_t sum = checksum.compute(body);
|
|
size_t off = frame.size() - csSize;
|
|
if (csSize == 4) FieldCodec::putU32(frame, off, sum);
|
|
else if (csSize == 1) frame[off] = static_cast<uint8_t>(sum & 0xFF);
|
|
else FieldCodec::putU16(frame, off, static_cast<uint16_t>(sum));
|
|
}
|
|
return frame;
|
|
}
|
|
|
|
} // namespace ccu
|