docs(devlog): 记录 variation 2B->3B有符号升级 (V1.05)
- vd960Loop/docs/devlog.md: 组包端改动(uint32->int32,方案B,饱和防回绕), 背景/影响范围/验证 - vd960DBN/docs/devlog.md: 接收端4处联动(结构体/解析步长/符号扩展/ fast_mode abs阈值), 缓冲核查 两端均标注必须同版本发布
This commit is contained in:
@@ -6,6 +6,48 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-07-14 — Loop 上报 variation 解析升级 2B→3B 有符号 (协议 V1.05)
|
||||
|
||||
### 背景
|
||||
|
||||
Loop MCU 上报的 `SENS_MULTI_LOOP_DYNAMIC (0xC0/0x0C)` 中变化量 `variation` 由 2B 无符号扩展为 **3B 有符号补码**(详见 Loop 侧 devlog 与协议 V1.05)。DBN 作为接收/转发端,解析逻辑须同步升级,否则每通道单元 12B 会被按旧的 11B 步长错位解析,**4 通道数据全错**。
|
||||
|
||||
### 改动 (4 处)
|
||||
|
||||
**1. `loop_uart_proto.h` — 结构体字段类型**
|
||||
```c
|
||||
// uint16_t variation; -> int32_t variation; // 3B有符号, = Origin-CAPVD
|
||||
```
|
||||
|
||||
**2. `loop_uart_proto.c` — 解析函数 `lup_parse_sensor_report`**
|
||||
- 每通道单元步长 `i*11` → `i*12`
|
||||
- 通道数计算 `data_len/11` → `data_len/12`
|
||||
- 频率仍 3B 无符号;**变化量 3B 解码 + bit23 符号扩展**:
|
||||
```c
|
||||
int32_t v = c[5] | ((int32_t)c[6] << 8) | ((int32_t)c[7] << 16);
|
||||
if (v & 0x800000) v |= (int32_t)0xFF000000; // 符号扩展, 漏了负值会变~1600万大正数
|
||||
cs->variation = v;
|
||||
```
|
||||
- 杂项偏移 `c[7..10]` → `c[8..11]`(整体右移 1B)
|
||||
|
||||
**3. `iot_mqtt_srv.c` — fast_mode 阈值判断(隐藏坑)**
|
||||
```c
|
||||
// variation 变有符号后, 车进入(正)/反向漂移(负) 都应触发加速上报
|
||||
int32_t av = (v >= 0) ? v : -v;
|
||||
if (av >= IOT_MQTT_VARIATION_THRESHOLD) fast_mode = 1; // 原 variation>=10 会漏掉负向
|
||||
```
|
||||
|
||||
**4. JSON 输出(`iot_mqtt_srv.c` / `tcp_json_srv.c`)**
|
||||
- `"diff":%d` / `"variation":%d` 格式符不变——CH32V208 上 `int32_t == int`,`%d` 天然正确输出负号,无需改动。
|
||||
|
||||
### 缓冲核查
|
||||
|
||||
整帧 52B→56B,DBN 侧 `g_pkg_uart_2.pkg[BUFF_STACK_SIZE=512]`、`LUP_MAX_PKG_LEN=70` 均远大于 56B,接收无截断;转发 MSS=576 不分片。
|
||||
|
||||
⚠️ **必须与 Loop 固件同版本发布**(步长死绑定)。
|
||||
|
||||
---
|
||||
|
||||
## 2026-06-26 — TCP JSON 协议框架搭建
|
||||
|
||||
### 1. TCP JSON Server 基础实现
|
||||
|
||||
@@ -4,6 +4,46 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-07-14 — variation 上报量 2B→3B 有符号 (协议 V1.05)
|
||||
|
||||
### 背景
|
||||
|
||||
`uart_report_packet_loop_acs` 上报的变化量 `variation` 用于**后台离线跟踪分析车检器算法**(判决裕量、基线跟踪行为)。原实现为 **2 字节无符号 + 取绝对值**,存在两个致命缺陷:
|
||||
|
||||
1. **回绕污染**:`variation` 是 CAPVD 域的量(量级 ~131072,非 Hz)。大车/大金属全覆盖时偏差可超 65535 → 2B 回绕成小值,后台看到"大信号突然变小"的假象,分析数据作废。
|
||||
2. **方向丢失**:`|Origin − CAPVD|` 抹掉符号,分不清"车/金属进入(CAPVD 掉到基线下)"与"反向漂移/异常抬升(CAPVD 升到基线上)",两者判决意义相反。
|
||||
|
||||
### 改动 (组包段)
|
||||
|
||||
```c
|
||||
// 旧: uint32_t variation = |Origin - CAPVD| (2B LE)
|
||||
// 新: 3B LE 有符号补码, 方案B定义
|
||||
int32_t variation = (int32_t)unit->loop_Origin - (int32_t)unit->loop_CAPVD;
|
||||
if (variation > 8388607) variation = 8388607; // +2^23-1 饱和防回绕
|
||||
if (variation < -8388608) variation = -8388608; // -2^23 饱和
|
||||
// 低字节在前, 发 3 字节
|
||||
```
|
||||
|
||||
- **方案B**:`variation = Origin − CAPVD`。**正值** = 当前值低于基线(车/裕量方向,与旧版语义连续);**负值** = 反向漂移。
|
||||
- **饱和限幅** ±2²³,彻底杜绝回绕。
|
||||
- 每通道单元 **11B → 12B**,整帧 52B → **56B**(仍 < `BUFF_STACK_SIZE=64`,缓冲安全)。
|
||||
|
||||
### 影响范围 & 联动
|
||||
|
||||
| 端 | 变更 |
|
||||
|------|------|
|
||||
| `main.c` 组包 | `uint32_t`→`int32_t`,3B LE + 饱和 |
|
||||
| 协议文档 | `DLD960Loop_串口通信协议.md` V1.05:字段表、Len 47→51、示例报文重算 |
|
||||
| **vd960DBN** | 解析步长 11→12、misc 偏移右移 1B、3B 解码 + **bit23 符号扩展**、fast_mode 改 `abs(variation)` |
|
||||
|
||||
⚠️ **Loop 固件与 DBN 固件必须同版本发布**——步长死绑定,任一端用旧固件则 4 通道数据整体错位。
|
||||
|
||||
### 验证
|
||||
|
||||
本地 gcc 隔离单测(编解码往返 / 符号扩展 / 双向饱和 / 方向语义 / fast_mode)全通过。关键:大车 diff=100000 旧版回绕成 34464,新版正确保留 100000。
|
||||
|
||||
---
|
||||
|
||||
## 2026-06-26 — 多项可配置化改造
|
||||
|
||||
### 1. 上报频率从 raw CAPVD 改为实际线圈频率
|
||||
|
||||
Reference in New Issue
Block a user