wangfq
|
9bab650c27
|
feat: 0xC0 时间量根据 car_state 区分通过时间/车间距
car_state=0(无车) → passtime_ms5 (通过时间)
car_state=1(有车) → gap_ms5 (车间距)
|
2026-07-02 17:48:05 +08:00 |
|
wangfq
|
f5b27b8f82
|
docs: 同步V1.04(杂项说明细化:通过时间/车间距区分解读)
|
2026-07-02 17:45:11 +08:00 |
|
wangfq
|
518f79022a
|
docs: 移动协议文档到 vd_960/docs/
|
2026-07-02 17:10:36 +08:00 |
|
wangfq
|
42b88de182
|
docs: 波特率修正为 192000
|
2026-07-02 16:52:32 +08:00 |
|
wangfq
|
2163b89d28
|
feat: 协议 V1.04 — 主动上报增加继电器输出次数 (misc_type=3)
- loop_uart_proto.h: LUP_CoilSensor.misc 联合体新增 relay_count
- tcp_json_srv.c: format_sensor_json 处理 misc_type=3 → relay_count
- docs: 更新协议文档至 V1.04
|
2026-07-02 16:50:06 +08:00 |
|
wangfq
|
8033bca949
|
feat(DBNetClient): 接收日志打印完整原始 JSON 数据
|
2026-07-02 14:45:11 +08:00 |
|
wangfq
|
43d815a4fe
|
fix: WCHNET_SocketSend 使用数据 socket (listen+1) 而非 listen socket
诊断日志确认: g_json_socket_listen=0, 数据中断走 sock=1
WCHNET TCP 模式下 listen=N, 收发数据必须走 socket N+1
修改: json_sensor_callback + tcp_json_push_sensor 两处
|
2026-07-02 14:40:31 +08:00 |
|
wangfq
|
ff17bbbc88
|
fix: 回调注册前置到 socket 操作之前 + 入口诊断日志
- lup_set_sensor_callback 移到 SocketCreat/SocketListen 之前
避免 socket 失败 return 导致回调漏注册
- json_sensor_callback 入口打印 socket/auth/report 三状态
各检查点分别打印 skip 原因
|
2026-07-02 14:35:56 +08:00 |
|
wangfq
|
c4a2b50ca5
|
fix: tcp_json_srv_init 加一次性守卫 + callback NULL 诊断
问题: NET_SSC_ENABLE 时 g_net_state.flag 保持 1, net_srv_init 反复调用
tcp_json_srv_init 第二次因 socket 已存在失败 → 过早 return
→ lup_set_sensor_callback 未执行 → 0xC0 回调永远 NULL
修复:
- tcp_json_srv_init: 加 static _init_done 守卫,防止重复执行
- lup_set_sensor_callback: 打印注册/清除日志
- lup_process_frame: 回调为 NULL 时打印诊断信息
|
2026-07-02 14:29:23 +08:00 |
|
wangfq
|
d559294359
|
fix: 添加 format_sensor_json 前置声明,修复 implicit declaration 编译错误
|
2026-07-02 14:21:06 +08:00 |
|
wangfq
|
6acd788d13
|
fix: 0xC0 帧通过回调直接驱动网络上报
loop_uart_proto:
- 新增 lup_sensor_cb_t 回调类型 + lup_set_sensor_callback
- lup_process_frame 收到 0xC0 → 调用注册的回调推送数据
tcp_json_srv:
- json_sensor_callback: 检查 g_report_active → 解析 → TCP 发送
- tcp_json_srv_init: 注册回调
usart_biz:
- uart_srv: 0xC0 由回调直接 TCP 推送,BLE 连接时也转发 BLE
- 移除旧的 _report_flag 轮询路径
数据流: ISR → lup_process_frame(校验) → json_sensor_callback → WCHNET_SocketSend
|
2026-07-02 14:15:28 +08:00 |
|
wangfq
|
7c2927d836
|
fix: 0xC0 帧必须经 lup_process_frame 校验后再分流
修改前: 0xC0 帧绕过 lup_process_frame,校验未执行
修改后: 所有 0x7F 帧先统一校验,0xC0 由校验后的数据分流处理
流程: ISR→lup_feed_byte→uart_srv→lup_process_frame(校验)→
0xC0→_report_flag→tcp_json_push_sensor→TCP推送
|
2026-07-02 13:56:45 +08:00 |
|
wangfq
|
8526023e06
|
feat: 实现 sensor_report 主动上报功能
vd960DBN:
- 新增 g_report_active 全局标志控制传感器数据主动上报
- handle_report_config: 解析 active_report JSON 字段,设置/清除标志
- tcp_json_push_sensor: 检查 g_report_active 开关,仅在启用时推送
DBNetClient:
- tcp_json_client.py: 新增 report_config(active_report) 方法
- main.py: 线圈标签页添加"启用主动上报"复选框
- main.py: 注册 sensor_report push 处理器,实时显示推送数据
|
2026-07-02 13:42:59 +08:00 |
|
wangfq
|
615b369690
|
fix: 同步协议文档 V1.03 — 0x8A 响应格式 + LEN 计算修正
协议变更(V1.02→V1.03):
- 0x8A 响应: Ret(0x10/0x11) + Amount + Amount*(SensIn+SensOut)
- 新增灵敏度响应例程 (7F 80 13 8A 10 04 ...)
- 波特率确认 192000
代码修正:
- lup_build_sensitivity_read: LEN=3 (was 4)
- lup_build_sensitivity_write: LEN=3+Amount*4 (was 2+Amount*2)
- lup_parse_sensitivity_resp: 解析 Ret 字节 + SensIn/SensOut 双值
- lup_build_set_param: LEN=3+5*Amount (was 2+5*Amount)
- tcp_json_srv: JSON 输出含 sens_in/sens_out 字段
|
2026-07-02 11:55:29 +08:00 |
|
wangfq
|
eb7419b3e8
|
fix: 修正 lup_append_checksum total_len 计算错误 (CMD 重复计数)
Bug: 1 + 3 + LEN + 2 把 CMD 计入两次 (Header(3) 和 Value(LEN) 各含一次)
Fix: 5 + LEN = Magic(1)+Addr(1)+LEN(1)+Value(LEN)+Check(2)
影响: 校验字节偏移1位,导致 XOR 写到错误位置,地感MCU 校验失败无响应
同时修正 lup_build_sensor_ack 的 padding 长度和返回值
|
2026-07-02 10:55:37 +08:00 |
|
wangfq
|
e9c24ae736
|
feat: DBNetClient Loop命令完善 + vd960DBN 发送调试打印
vd960DBN:
- loop_uart_proto.c: 所有发送函数添加 LUP Tx 调试打印
- tcp_json_srv.c: 新增 loop_version_query/loop_reset/loop_factory_init/
loop_sens_read/loop_sens_write 命令处理器 + 延迟响应解析
- 修复 loop_sens_write 未设置命令状态机和错误使用解析函数的问题
DBNetClient:
- tcp_json_client.py: 新增 full Loop MCU API (6 条命令)
- main.py: 线圈参数标签页增加版本/复位/出厂/灵敏度操作按钮
|
2026-07-02 10:33:11 +08:00 |
|
wangfq
|
e9b58a660e
|
fix: 修正 USART2 波特率为 192000 (与 Loop MCU 实际通信速率一致)
|
2026-07-02 10:09:47 +08:00 |
|
wangfq
|
4fbda96078
|
feat(vd960DBN): 实现 DLD960Loop 串口通信协议 (0x7F)
新增:
- docs/DLD960Loop_串口通信协议.md — 协议文档 V1.02
- loop_uart_proto.h/c — 协议实现: checksum/组包/解析/帧状态机/命令状态机
修改:
- usart_biz.c: 使用 lup_feed_byte() 帧解析器替代 timeout heuristic; 波特率修正为 115200
- tcp_json_srv.c/h: loop_param_set/query 真实实现(0x63/0x64), 0xC0 传感器推流, 延迟响应机制
- peripheral_main.c: 添加 tcp_json_push_sensor() 调用, 帧解析器超时保护
校验验证: 5个协议例程 XOR+SUM 全部通过
|
2026-07-02 09:26:34 +08:00 |
|
wangfq
|
4e75312a0f
|
fix: CONNECT 事件到达 TCP_LISTEN socket(1) 而非 TCP socket(0)
WCHNET 将 CONNECT 事件投递到 TCP_LISTEN 内部 socket (sock 1),
而非用户创建的 TCP socket (sock 0)。之前的路由只检查
socketid==g_json_socket_listen(0),遗漏了 sock 1。
修复:
- NET_SSC_ENABLE=1 时同时路由 sock N 和 sock N+1 到 JSON handler
- NET_SSC_ENABLE=0 时所有 socket 事件都路由到 JSON handler
- tcp_json_handle_sock_int 移除 socket 限定,处理任意 socket 事件
|
2026-07-01 14:09:34 +08:00 |
|
wangfq
|
32d613a54f
|
debug: 在 WCHNET_HandleGlobalInt 中打印 socket 中断信息
添加 SockInt: sock=%d stat=0x%02X 日志,用于诊断为何
client 连接成功后 CONNECT 事件未被处理
|
2026-07-01 14:02:10 +08:00 |
|
wangfq
|
157ff48835
|
fix: NET_SSC_ENABLE=0 时 g_net_state.flag 卡在 1 导致 tcp_json_srv_init 反复调用
WCHNET_CreateUdpSocket 原本会将 flag 推进到 2,被 #if 排除后
net_srv_init 每次主循环都重新执行,tcp_json_srv_init 首次成功后
后续 SocketCreat 都返回 0x1B(socket 已存在)
修复:SSC 禁用时在 tcp_json_srv_init 后手动设 flag=2
|
2026-07-01 13:47:09 +08:00 |
|
wangfq
|
131d767cc3
|
fix: mStopIfError/GetMacAddr/get_ipstr_to_array 误被 #if NET_SSC_ENABLE 排除
这些共享函数被包裹在 #if NET_SSC_ENABLE 中导致链接失败:
- mStopIfError — net_srv_init 调用
- GetMacAddr — peripheral_main 调用
- get_ipstr_to_array — tcp_json_srv 调用
修复:在 clear_mqtt_buf 后关闭 #if,mStopIfError 后重开;
在 poll_mqtt 后关闭 #if,get_ipstr_to_array 后重开
|
2026-07-01 13:35:14 +08:00 |
|
wangfq
|
e5c99069a0
|
refactor: 用 NET_SSC_ENABLE 宏隔离原有 TCP/UDP 代码,默认=0
net_config.h:
- 新增 NET_SSC_ENABLE=0, NET_JSON_ENABLE=1 功能开关
- WCHNET_NUM_UDP/TCP 根据开关条件编译
- 默认仅保留 JSON TCP server (1 TCP socket),SSC 全部禁用
net_srv.h:
- SocketId_TCP/UDP extern 放入 #if NET_SSC_ENABLE
- WCHNET_CreateTcpSocket/MqttSocket 原型放入 #if
net_srv.c:
- SSC/MQTT 变量和函数全部置入 #if NET_SSC_ENABLE
- WCHNET_HandleSockInt 中 SSC 处理分支置入 #if
- net_srv_init 中 WCHNET_CreateUdpSocket 和 memset(socket) 置入 #if
- JSON routing 保持无条件编译
peripheral_main.c:
- WCHNET_CreateTcpSocket/MqttSocket 调用置入 #if NET_SSC_ENABLE
tcp_json_srv.h:
- 移除 SocketId_TCP/UDP extern(JSON handler 不再引用)
影响:NET_SSC_ENABLE=0 时设备仅运行 TCP JSON server (port 5960),
原有 SSC UDP/TCP/MQTT 代码不参与编译,零干扰。
|
2026-07-01 11:33:32 +08:00 |
|
wangfq
|
ba35ea8ae3
|
refactor: 按 WCH 官方 TCPServer 例程重写 TCP JSON server
核心变更:去掉 g_json_socket_client,listen socket 直接承载收发数据。
参考 EVT/EXAM/ETH/TCPServer 例程:
- 创建 PROTO_TYPE_TCP socket → WCHNET_SocketListen
- 同一 socket 处理 CONNECT + RECV + DISCONNECT + TIMEOUT
- 不需要 'accepted socket' 检测
移除的复杂逻辑:
- g_json_socket_client 变量及所有 'newly accepted' 检测代码
- WCHNET_HandleSockInt 第二路由条件(socketid!=listen,!=TCP,!=UDP 那串)
- tcp_json_handle_sock_int 中 listen/client 分离处理
- listen==client overlap 的迂回保护
修改文件:
- tcp_json_srv.h: 移除 g_json_socket_client extern
- tcp_json_srv.c: 移除 g_json_socket_client,handler 简化为 4 个 if
- net_srv.c: 路由简化为仅 socketid==g_json_socket_listen
|
2026-07-01 11:18:43 +08:00 |
|
wangfq
|
7804d97a45
|
fix: listen socket CONNECT 不应触发 accepted 客户端逻辑
- WCHNET_HandleSockInt 第二路由条件增加 socketid!=g_json_socket_listen
- tcp_json_handle_sock_int 'Newly accepted' 检查增加 socketid!=g_json_socket_listen
- 防止 listen socket 的 CONNECT 事件误触发 WCHNET_ModifyRecvBuf 和 g_json_socket_client 覆写
根因:TCP_LISTEN socket 和 accepted client 是不同 socket ID(1 vs 3),
listen socket 的 CONNECT 不应穿透到 'newly accepted' 分支去配置 recv buffer,
否则会干扰 WCHNET 对 accepted socket 的数据路由
|
2026-07-01 09:52:28 +08:00 |
|
wangfq
|
be8c48688c
|
fix: tcp_json_handle_sock_int RECV 被 listen socket 分支拦截导致收不到鉴权数据
- RECV 处理移到函数最前面,优先于 listen socket 检查
- listen socket 分支增加 socketid!=g_json_socket_client 保护,
防止 listen 与 accepted client 为同一 socket ID 时
RECV 事件被 listen 分支 return 拦截
- WCHNET 某些版本可能将 TCP_LISTEN 和已 accept 的连接
共用同一 socket ID,此时旧代码在 listen 检查处直接 return
导致后续 client RECV 处理永远不被执行
|
2026-07-01 09:20:44 +08:00 |
|
wangfq
|
19b1d7b327
|
refactor: simple_parse_json 修复空指针崩溃和无\0结尾
- 修复纯数字/布尔/null 值时 strlen(NULL) 崩溃
- 修复对象缺闭合 } 时 strlen(NULL) 崩溃
- 修复 memcpy 后缺少 null terminator
- 修复 strlen(value_str) 对未初始化缓冲区调用
- 新增数组 [...] 值类型支持
- 用首字符分发替代 strlen 比大小判断优先级
- simple_json_getarray_item 同步修复
|
2026-07-01 08:55:22 +08:00 |
|
wangfq
|
735af8c0eb
|
fix: WCHNET 接收缓冲区与帧缓冲区重叠导致数据损坏
根因: WCHNET_ModifyRecvBuf 将 socket 内部缓冲区设为 g_json_recv_buf,
但 WCHNET_SocketRecv 又从同一缓冲区(偏移)拷贝到自身 — 源和目的重叠。
修复:
1. 新增独立的 g_json_wchnet_buf 作为 WCHNET 内部接收缓冲区
2. RECV 时从 g_json_wchnet_buf 读入临时 buffer, 再追加到 g_json_recv_buf
3. 两缓冲区完全隔离, 消除重叠拷贝
|
2026-06-30 19:04:11 +08:00 |
|
wangfq
|
3e00a352d3
|
debug: 在 json_process_frame + handle_pwd_verify 增加详细日志
添加关键路径诊断日志以定位鉴权失败根因:
- json_process_frame: msg_id/cmd/匹配结果/auth状态
- handle_pwd_verify: data提取/password值/dev_pwd对照
|
2026-06-30 19:03:00 +08:00 |
|
wangfq
|
6389271bfc
|
fix: simple_json 解析末尾对象值时 y 未赋值 + 缺少 '}' 兜底
两处修复 (simple_parse_json & simple_json_getarray_item):
1. if(y==NULL) strstr(q,"}\n") → if(y==NULL) y = strstr(q,"}\n")
(缺失 y = 导致 strlen(NULL) 崩溃)
2. 新增 if(y==NULL) y = strchr(q, '}')
(JSON 末尾对象值 "data":{...}} 只有 }} 无 }, \r\n 时需兜底)
|
2026-06-30 18:52:38 +08:00 |
|
wangfq
|
ae02e58a36
|
fix: json_get_cmd 未去除引号导致命令匹配失败
simple_parse_json 提取字符串值时保留双引号, json_get_cmd
直接用于 strcmp 匹配命令表, 因 "pwd_verify" != pwd_verify
导致所有命令都走进 'unsupported command' 分支。
改用 json_get_str_field (自动去引号) 修复。
|
2026-06-30 17:52:30 +08:00 |
|
wangfq
|
eb79c66763
|
fix: JSON TCP accept后未配置接收缓冲区导致无法收数据
根因: WCHNET TCP Server 模式下, accept后的socket需要调用
WCHNET_ModifyRecvBuf 配置接收缓冲区才能正常接收数据。
修复:
1. tcp_json_srv.c: accept时调用 WCHNET_ModifyRecvBuf 设置 recv buf
2. 去掉脆弱的scan逻辑, 改为收到CONNECT+socket不匹配已知socket时自动识别
3. net_srv.c: 同步更新路由条件
4. DBNetClient: 增加原始JSON发送日志
|
2026-06-30 17:38:45 +08:00 |
|
wangfq
|
8b4404d5b3
|
feat(DBNetClient): TCP JSON 协议桌面测试工具
- tcp_json_client.py: 协议客户端库 — 行分隔JSON, 请求-响应, 主动推送接收
- main.py: tkinter 跨平台 GUI — 7个标签页覆盖全部15条命令
- 虚拟环境: venv/, 无额外依赖(tkinter 标准库)
- 支持: 鉴权/设备信息/网络配置/IoT配置/线圈参数/系统操作/Raw JSON
|
2026-06-30 15:32:57 +08:00 |
|
wangfq
|
d2321fdec2
|
fix: tcp_json_srv 引用 SocketId_TCP 缺少 extern 声明
|
2026-06-30 15:00:53 +08:00 |
|
wangfq
|
af997a79fe
|
feat(vd960DBN): TCP JSON协议服务 — 端口5960, 鉴权+15条命令
- net_config.h: TCP_LISTEN=0→1, TCP=2 支持 JSON 监听
- 新增 tcp_json_srv.h/c: 行分隔 JSON, pwd_verify鉴权, 命令分发
- 实现15条协议命令: dev_info/ssc_net/iot_net/iot_topic/pwd_set/factory_reset等
- loop_param_set/query 接受命令返回stub(Loop MCU中继待实现)
- net_srv.c: 集成 JSON 中断路由 + init
- peripheral_main.c: 主循环 tcp_json_poll()
|
2026-06-30 14:53:53 +08:00 |
|
wangfq
|
ece82be6dd
|
docs: 环路车辆检测器验收标准 V1.0
|
2026-06-30 14:25:45 +08:00 |
|
wangfq
|
ecbb4852ca
|
docs: 更新开发日志 — 2026-06-29 M4优化移植 (V2.0~V2.5)
|
2026-06-30 11:17:27 +08:00 |
|
wangfq
|
c447bfa475
|
tune: 稳定期窗口 100 快速收敛 (同步 DLD154V4B)
|
2026-06-29 18:45:31 +08:00 |
|
wangfq
|
4d77ef8c71
|
refactor: 去掉快速 IIR,ALFA_CAP1=79 @10ms (同步 DLD154V4B)
|
2026-06-29 18:35:15 +08:00 |
|
wangfq
|
0a5a640195
|
fix: 快速 IIR 斜率限幅参考改为 CAPVD_fast (同步 DLD154V4B)
|
2026-06-29 17:56:40 +08:00 |
|
wangfq
|
2aad8782a7
|
fix: 快速 IIR 输入改为限幅后原始值 (同步 DLD154V4B)
|
2026-06-29 17:27:11 +08:00 |
|
wangfq
|
918287d9da
|
clean: 删除死代码 ALFA_FAST (同步 DLD154V4B)
|
2026-06-29 17:16:47 +08:00 |
|
wangfq
|
23f33d9af5
|
fix: update_moving_average window 参数 uint8_t→uint16_t (同步 DLD154V4B)
|
2026-06-29 15:55:59 +08:00 |
|
wangfq
|
1ca7f01cdf
|
tune: WINDOW_ORIGIN 100→500, 基线更新 1s→5s (同步 DLD154V4B)
|
2026-06-29 15:37:12 +08:00 |
|
wangfq
|
0b951768ec
|
feat(vd960Loop): 移植 DLD154V4B V2.0-V2.5 M4 优化 — 双路 IIR + 斜率限幅 + 进入确认 + 冻结超时
V2.0: 双路 IIR (慢速 α=18/256 τ=135ms + 快速 α=0.5 τ=28ms)
斜率限幅 MAX_SLOPE_RATE=5%
进入确认 ENTRY_CONFIRM=3
vTaskDelay 50→10ms (tick 加速 5×)
V2.1: CAPVD_fast 初始化修复 (==0 时首次锁定)
V2.2: 稳定期绕过 IIR 和斜率限幅,直接用 Value 收敛基线
V2.3: 基线冻结超时自动恢复 (FREEZE_TIMEOUT)
V2.4: 冻结稳定性检查 (FREEZE_STABILITY_RATE=2% 窗口)
V2.5: 冻结超时 10s (1000 tick @ 10ms)
结构体新增: loop_CAPVD_fast, loop_entry_cnt,
loop_freeze_cnt, loop_freeze_ref
每通道独立状态,四路并行运行
|
2026-06-29 11:25:44 +08:00 |
|
wangfq
|
5a12044c1a
|
fix: vTaskDelay 10→50ms 对齐 DLD154V4B 原始设计, 创建 docs/devlog.md
loop_task_function 主循环周期修正:
- 原值 10ms 是 FreeRTOS 移植时的疏忽
- 改为 50ms 对齐原始 TMR15 5ms×10 设计
- 基线更新: 100×10ms=1s → 100×50ms=5s (Origin 更稳定)
- CPU 占用降低 5×
创建 docs/devlog.md 记录 V2.0~V2.2 全部改动。
|
2026-06-26 14:30:51 +08:00 |
|
wangfq
|
eb9f21b08d
|
fix: 有限存在超时改为通道完整重启, 避免继电器立即重新吸合
原逻辑设 loop_FLAG_OUT=1 触发正常离车流程,
但线圈物理上仍有车, vd1_task 立刻重新检测到有车→继电器又吸合。
改为与安全复位一致的重启逻辑:
- LC_Reset=1, loop_INI_LOOP=1 → 强制重新初始化
- loop_stable=0, loop_LOOP_OK0=0 → 重建基线(含稳定期128样本)
- 清除所有标志位和计数器
- 移除 loop_VD_FLAG 前置条件 (set_loops_relay_off 无条件执行)
|
2026-06-26 12:02:00 +08:00 |
|
wangfq
|
995520164d
|
fix: 有车时根据 hold_time 启用有限存在计时
vd1_task_per_channel 判定有车 (loop_VD_FLAG=1) 时,
若 hold_time > 0 则设置 loop_VD_HOLD = 1,
使有限存在超时逻辑能够实际生效。
hold_time=0 (exist_mode=0) 时不设 VD_HOLD,保持无限制存在。
|
2026-06-26 11:55:43 +08:00 |
|
wangfq
|
56d8b77278
|
fix: 有限存在超时后完整恢复无车状态
set_loops_relay_off 之后补充:
- loop_VD_FLAG = 0 → 无车 → 绿灯灭 (poll_green_led 自动)
- loop_FLAG_OUT = 1 → 触发正常离开输出
- LC_HOLD = 0 → 清除安全保持
- loop_ORG_CNT/SUM=0 → 重置基线跟踪
|
2026-06-26 11:18:25 +08:00 |
|
wangfq
|
1831291d76
|
fix: 离开延时 OUT_DELAY 改为可配置 relay_delay
- Loop154_Unit 新增 relay_delay 字段
- storage.c 从 delay_time 计算: relay_delay = delay_time * 2
- TMR15_GLOBAL_IRQHandler 使用 unit->relay_delay 替代固定 OUT_DELAY
|
2026-06-26 10:31:53 +08:00 |
|