#ifndef PCCU_MESSAGE_H #define PCCU_MESSAGE_H #include #include #include #include #include "ChecksumPolicy.h" #include "Frame.h" namespace ccu { //============================================================================ // Message:协议消息抽象接口。 // // 每条协议消息实现该接口。协议变更时只需: // 1. 修改实现类的字段偏移/长度定义 // 2. 修改 encode()/decode() 中字段取值逻辑 // 无需改动上层(Comm / Web / DB / 主流程)。 // // 提供统一的: // - id()/name() :消息标识与显示名 // - checksum() :该校验策略 // - payloadLength() :数据域长度(不含 6 字节帧头与校验和) // - encode()/decode() :业务值 <-> 完整帧 //============================================================================ class Message { public: virtual ~Message() = default; virtual uint16_t id() const = 0; virtual const char* name() const = 0; virtual const ChecksumPolicy& checksum() const = 0; // 数据域长度(不含 6 字节帧头与校验和) virtual size_t payloadLength() const = 0; // 整个协议包长度 = 6 + payloadLength + checksum.size() size_t totalLength() const { return FRAME_HEADER_LEN + payloadLength() + checksum().size(); } // 业务值编码为完整帧(含帧头+数据域+校验和) // obj 为具体业务对象指针(如 FcStatusValue*) virtual std::vector encode(const void* obj) const = 0; // 从完整帧解析业务值;成功返回 true 并填充 obj virtual bool decode(const std::vector& frame, void* obj) const = 0; // 供实现类解码前做通用校验:起始符 / id / 总长度 / 校验和 static bool validateFrame(const std::vector& frame, uint16_t expectId, const ChecksumPolicy& policy, size_t expectTotalLen); }; } // namespace ccu #endif // PCCU_MESSAGE_H