From e8a27bb203fe2aff70390a5eca002d7438da9b0f Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期三, 22 十月 2025 14:24:34 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang

---
 SourceCode/Bond/DAQBridge/proto/Protocol.h |  168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 168 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/DAQBridge/proto/Protocol.h b/SourceCode/Bond/DAQBridge/proto/Protocol.h
new file mode 100644
index 0000000..ce98f98
--- /dev/null
+++ b/SourceCode/Bond/DAQBridge/proto/Protocol.h
@@ -0,0 +1,168 @@
+#pragma once
+#include <cstdint>
+#include <string>
+#include <vector>
+
+namespace Proto {
+
+    // 固定帧
+    inline constexpr uint8_t kHead[4] = { 0x11, 0x88, 0x11, 0x88 };
+    inline constexpr uint8_t kTail = 0x88;
+
+    // 指令码
+    enum : uint16_t {
+        // 握手
+        CMD_REQ_VERSION = 0x0001,
+        CMD_RSP_VERSION = 0xF001,
+
+        // 单通道增量拉取
+        CMD_REQ_SINCE = 0x0101,
+        CMD_RSP_SINCE = 0xF101,
+
+        // 统计/通道列表
+        CMD_REQ_STATS = 0x0103,
+        CMD_RSP_STATS = 0xF103,
+
+        // 机台列表
+        CMD_REQ_MACHINES = 0x0104,
+        CMD_RSP_MACHINES = 0xF104,
+
+        // 整机多通道增量拉取
+        CMD_REQ_SINCE_ALL = 0x0105,
+        CMD_RSP_SINCE_ALL = 0xF105,
+
+        // 批次信息
+        CMD_REQ_BATCH_INFO = 0x0120,
+        CMD_RSP_BATCH_INFO = 0xF120,
+
+        // 错误
+        CMD_RSP_ERROR = 0xE100,
+    };
+
+    // === since* 请求里附加 batchId 的标志位 ===
+    inline constexpr uint16_t SINCE_FLAG_HAS_BATCH = 0x0001;
+
+    // ===== 数据结构(两端共用) =====
+
+    // 0x0001 / 0xF001
+    struct ReqVersion {
+        uint32_t dataId = 0;
+    };
+    struct RspVersion {
+        uint32_t   dataId = 0;
+        std::string version;   // UTF-8,例如 "1.0.1"
+    };
+
+    // 0x0104 / 0xF104
+    struct MachineInfo {
+        uint32_t    id = 0;
+        std::string name;
+    };
+    struct ReqMachines {
+        uint32_t dataId = 0;
+    };
+    struct RspMachines {
+        uint32_t                dataId = 0;
+        std::vector<MachineInfo> machines;
+    };
+
+    // 0x0103 / 0xF103
+    struct ReqStats {
+        uint32_t dataId = 0;
+        uint32_t machineId = 0;
+        uint16_t flags = 0;
+    };
+    struct ChannelStatInfo {
+        uint32_t    channelId = 0;
+        uint64_t    earliestTs = 0;
+        uint64_t    latestTs = 0;
+        uint32_t    size = 0;
+        std::string name;      // UTF-8
+    };
+    struct RspStats {
+        uint32_t dataId = 0;
+        uint32_t machineId = 0;
+        std::vector<ChannelStatInfo> channels;
+    };
+
+    // 0x0101 / 0xF101(单通道增量)
+    struct ReqSince {
+        uint32_t dataId = 0;
+        uint32_t machineId = 0;
+        uint32_t channelId = 0;
+        uint64_t sinceTsExclusive = 0;     // ms
+        uint16_t maxCount = 1024;
+        uint16_t flags = 0;     // 按位,见 SINCE_FLAG_HAS_BATCH
+        std::string batchId;               // flags & SINCE_FLAG_HAS_BATCH 时有效
+    };
+    struct SamplePair {
+        uint64_t ts_ms = 0;
+        double   value = 0.0;
+    };
+    struct RspSince {
+        uint32_t dataId = 0;
+        uint32_t machineId = 0;
+        uint32_t channelId = 0;
+        uint64_t lastTsSent = 0;
+        uint8_t  more = 0;           // 该通道是否还有未发
+        std::vector<SamplePair> samples;
+    };
+
+    // 0x0105 / 0xF105(整机多通道增量)
+    struct ChannelBlock {
+        uint32_t channelId = 0;
+        uint64_t lastTsSent = 0;          // 该通道本次最后样本时间戳
+        uint8_t  more = 0;          // 该通道是否还有未发
+        std::vector<SamplePair> samples;
+    };
+    struct ReqSinceAll {
+        uint32_t dataId = 0;
+        uint32_t machineId = 0;
+        uint64_t sinceTsExclusive = 0;     // 对所有通道统一 since
+        uint16_t maxPerChannel = 1024;  // 每条曲线上限
+        uint16_t flags = 0;     // 按位,见 SINCE_FLAG_HAS_BATCH
+        std::string batchId;               // flags & SINCE_FLAG_HAS_BATCH 时有效
+    };
+    struct RspSinceAll {
+        uint32_t dataId = 0;
+        uint32_t machineId = 0;
+        uint8_t  moreAny = 0;            // 是否还有任意通道有剩余
+        std::vector<ChannelBlock> blocks;  // 多个通道的增量
+    };
+
+    // === 批次状态 ===
+    enum class BatchState : uint8_t {
+        Idle = 0,  // 无活动批次:activeBatchId="", activeStartTs=0, expectedEndTs=0
+        Active = 1,
+    };
+
+    // === 错误码 ===
+    enum class ErrCode : uint16_t {
+        NoActiveBatch = 0x0001, // 当前无活动批次
+        BatchMismatch = 0x0002, // 请求携带的 batchId 与当前活动批次不一致
+    };
+
+    // 0x0120 / 0xF120(批次信息)
+    struct ReqBatchInfo {
+        uint32_t dataId = 0;
+        uint32_t machineId = 0;
+    };
+    struct RspBatchInfo {
+        uint32_t   dataId = 0;
+        uint32_t   machineId = 0;
+        BatchState state = BatchState::Idle;
+        std::string activeBatchId;         // state=Idle 时应为空
+        uint64_t   activeStartTs = 0;
+        uint64_t   expectedEndTs = 0;      // =0 表示未知/Idle
+    };
+
+    // 0xE100 错误帧
+    struct RspError {
+        uint32_t   dataId = 0;
+        uint16_t   refCmd = 0;          // 出错请求的指令:如 0x0101/0x0105/0x0120...
+        uint32_t   machineId = 0;
+        ErrCode    code = ErrCode::NoActiveBatch;
+        std::string message;               // 简短文本
+    };
+
+} // namespace Proto

--
Gitblit v1.9.3