wangfq
de2e70fd89
feat(vd960DBN): MQTT ssc_net_set / iot_net_set / iot_topic_set 实现
...
- ssc_net_set: 解析 dev_ip/subnet_mask/route_ip/lssc_ip/dns/port,调用 write_net_config
- iot_net_set: 解析 host/port/client_id/username/password,调用 write_net_config
- iot_topic_set: 解析 client_id_enable/topic_pub/topic_sub,调用 write_net_config
- 三个 SET 命令均写入 flash 并在完成后返回 code=0 success
2026-07-07 21:15:55 +08:00
wangfq
2bbe388738
fix: iot_mqtt_srv.c 添加缺失的 tcp_json_srv.h include
2026-07-07 18:47:05 +08:00
wangfq
a7de4dfcde
feat(vd960DBN): MQTT/TCP report_config 支持完整7参数配置
...
- 新增 ReportConfig 结构体 (sensor_type/enable/once/env_eval/interval/ack_required/timeout)
- net_srv.c: MQTT report_config handler — 查询/设置均返回完整配置JSON
- tcp_json_srv.c: TCP JSON handle_report_config 同步升级,兼容旧 active_report
- iot_mqtt_srv.c: g_report_active → g_report_cfg.enable
- g_report_active 全局变量替换为 g_report_cfg 结构体
2026-07-07 18:39:45 +08:00
wangfq
cd92f3e0c3
feat(DBNMQTTool): 查询响应自动回填输入框 + 主动上报配置
...
- _on_message 中 ssc_net/iot_net/iot_topic/report_config 查询结果
不再仅显示 JSON,改为调用 _apply_* 方法回填到对应输入框
- 新增「主动上报配置」GroupBox(sensor_type / interval / timeout
+ 4 开关),支持查询/设置 CMD_REPORT_CONFIG
- import 增加 CMD_REPORT_CONFIG / data_report_config
2026-07-07 18:22:39 +08:00
wangfq
b932dd7c6f
feat: DBNMQTTool 日志增强 — 收发打印 topic + payload 详情
...
新增 _log_send() / _log_recv() 两个统一日志方法:
- 发送: 标签 + → topic + PASTE:{精简payload}
- 接收: ← topic + summary + RECV:{精简payload}
- payload >200/300 字符自动截断
覆盖所有收发路径:
- [模拟]/[协议]/[自定义]/[命令] 发送
- 响应/loop_data/event_report/heartbeat/Initialize 接收
- mqtt_client.py 自动订阅事件日志
2026-07-07 17:47:58 +08:00
wangfq
5e4e1b1ec7
fix: DeviceManager 死锁 — threading.Lock 改为 RLock
...
根因: update_from_dev_info/update_loop_data/update_event/update_heartbeat
在 with self._lock 块内调用 get_or_create(), 后者再次 with self._lock.
Python threading.Lock 不可重入 → 永久阻塞 → GUI 无响应.
修复: self._lock = threading.RLock() (可重入锁)
清理: mqtt_client.py 移除 debug print 和未使用的 sys import
2026-07-07 17:36:35 +08:00
wangfq
c98aa5b0bb
fix: MqttClient 回退信号方案,添加 publish debug 日志追踪阻塞点
...
- 移除 QObject 基类和 QueuedConnection 信号方案
- publish() 直接调用 self._client.publish() 并打印前后日志
- 添加 print(flush=True) 确保 Windows 终端实时输出
目的是确认阻塞发生在:
[MqttClient] publish topic=... qos=1 ← 打印后消失?
[MqttClient] publish done mid=... ← 这行能否出现?
2026-07-07 17:27:15 +08:00
wangfq
baa82c895d
fix: MqttClient 重构为 QObject — publish 通过 Qt 信号排队避免 C 层崩溃
...
问题: paho-mqtt publish() C 扩展在 Windows 上从 GUI 线程调用时静默崩溃。
修复:
- MqttClient 改为 QObject 子类
- publish() 通过 Qt Signal(Qt.QueuedConnection) 排队,_do_publish()
始终在主线程事件循环中执行 paho 调用
- 状态/消息通知改用 Qt Signal 跨线程传递
- 新增 subscribe()/unsubscribe() 公开 API,消除 main.py 直接
访问 _client 的脆弱代码
- 移除 MainWindow 中已不再需要的中间信号 _mqtt_status/_mqtt_msg
2026-07-07 14:25:49 +08:00
wangfq
6eb93637c7
fix: DBNMQTTool — 所有 publish 路径增加通用异常捕获
...
问题: _custom_publish / _proto_publish / _sim_publish 只 catch
json.JSONDecodeError, MqttClient.publish() 抛出的 ConnectionError
等异常未被捕获, 在 Qt 信号槽中导致静默崩溃(Windows 无 traceback).
修复:
- _custom_publish: +except Exception, 避免 toPlainText() 重复调用
- _proto_publish: +except Exception, 避免 toPlainText() 重复调用
- _sim_publish: +except Exception
- _custom_subscribe/_custom_unsubscribe: +except Exception, +_client 空检查
2026-07-07 14:15:36 +08:00
wangfq
5a2ef0be5d
fix: DBNMQTTool — right 局部变量改为 self._notebook
...
_build_ui() 中 right = QTabWidget() 是局部变量,导致
_proto_publish_item() 中 self._notebook.setCurrentWidget() 报
AttributeError: 'MainWindow' object has no attribute '_notebook'
2026-07-07 14:07:52 +08:00
wangfq
90d723517e
feat: manage_mqtt_recv_message 实现 V1.01 协议命令分发
...
net_srv.c: manage_mqtt_recv_message() 从占位打印升级为完整命令分发器:
已实现(8条):
- dev_info_query: 返回设备信息(序列码/版本/子码)
- ssc_net_query: 返回 SSC 网络配置
- iot_net_query: 返回 IoT 网络配置(MQTT broker)
- iot_topic_query: 返回 topic 配置
- pwd_verify: 验证设备密码
- factory_reset: 出厂初始化+重启
- device_reset: 设备复位
未实现(返回 code=4):
- dev_serial_set, pwd_set, ssc_net_set 等 SET 类命令
所有响应通过 g_iot_topic.topic_pub (dld960/{sn}/dev) 发布
2026-07-07 13:58:27 +08:00
wangfq
3cdc5b6286
fix: MQTT PUBLISH 接收修复 — topic 过滤 + cmd/Method 双格式支持
...
问题: mqtt_data_manage() 的 PUBLISH 分支直接调用 manage_mqtt_recv_message(),
跳过了 mqtt_deserialize_publish() 的 topic 过滤, 且只支持旧 Method 格式.
修复:
- mqtt_data_manage: PUBLISH 改为走 mqtt_deserialize_publish 做 topic 匹配
- mqtt_deserialize_publish: topic 过滤已改用 g_iot_topic.topic_sub
- manage_mqtt_recv_message: 优先解析 cmd, 兼容旧 Method 字段
2026-07-07 12:09:07 +08:00
wangfq
ab3a4cea0a
fix: 出厂默认 topic 使用真实设备序列号 + PRINT 修正
...
- cfig_flash.c: factory_dev_info() 用 gMacAddr 生成真实主题 dld960/{SN}/srv + dld960/{SN}/dev
- net_srv.h: TOPIC_DEFAULT 加注释标明为格式模板
- net_srv.c: 修复上次提交的 PRINT 宏转义异常
2026-07-07 10:57:20 +08:00
wangfq
b707241429
feat: MQTT 双主题同步到 vd960DBN 固件 + DBNMQTTool devlog
...
vd960DBN 固件改动:
- net_srv.h: 默认 topic 改为 dld960/{sn}/srv + dld960/{sn}/dev
- net_srv.c: dg_subscribe_display_topic() 直接用 topic_sub 订阅(不再追加 client_id/sn 后缀)
- net_srv.c: mqtt_deserialize_publish() topic 过滤改用 g_iot_topic.topic_sub(不再硬编码 TOPIC_DEFAULT_SUBSCRIBE)
DBNMQTTool 文档:
- devlog.md: 清理过期 topic 引用语义
2026-07-07 09:46:54 +08:00
wangfq
770d67346f
refactor: MQTT 主题方向 down→srv, up→dev
...
- dld960/{sn}/down → dld960/{sn}/srv
- dld960/{sn}/up → dld960/{sn}/dev
- 通配符 dld960/+/up → dld960/+/dev
2026-07-07 09:42:35 +08:00
wangfq
213716033c
feat: MQTT 协议 V1.01 — Topic 压缩为双主题 (up/down)
...
- 7个主题压缩为2个: dld960/{sn}/down + dld960/{sn}/up
- 消息类型由 JSON cmd 字段区分,不再依赖 topic 路径
- protocol.py: topic_up()/topic_down() 替代旧7个函数
- mqtt_client.py: 4个通配符订阅→1个 dld960/+/up
- main.py: 消息路由改为 cmd 匹配,协议Topic树简化
- 文档更新 V1.01
2026-07-07 09:18:29 +08:00
wangfq
d29e16acc8
docs(DBNMQTTool): 开发日志 — 初始化到模拟上报全记录
2026-07-06 23:27:40 +08:00
wangfq
c19e465284
feat(DBNMQTTool): 模拟上报 + 协议Topic + 自定义Topic
...
新增三个 Tab:
1. 模拟上报 — 可编辑 loop_data/event_report/heartbeat JSON,
支持单次发送和周期上报(间隔可调)
2. 协议Topic — 按协议文档列出所有 dld960/{sn}/srv/... 和 dev/... topic,
双击填充到发布区,支持编辑 JSON 载荷
3. 自定义Topic — 自由输入 topic 发布,支持订阅/取消订阅,
接收消息实时展示
新增:
- QComboBox, QSpinBox, QPlainTextEdit 控件
- paho.mqtt.client 导入(topic_matches_sub 通配符匹配)
- 自定义订阅消息自动路由到接收区
2026-07-06 21:40:26 +08:00
wangfq
5210051f19
chore(DBNMQTTool): 删除误提交的 vim swap 文件
2026-07-06 21:32:30 +08:00
wangfq
213c0ddc2d
fix(DBNMQTTool): paho-mqtt disconnect 回调签名兼容 v1/v2
...
- _on_disconnect: 用 *args 兼容 v1(3参数) 和 v2(5参数)
- Client 构造加 callback_api_version=VERSION2
- _on_connect 签名保持不变 (v2)
2026-07-06 21:32:24 +08:00
wangfq
e1bf3dcfca
refactor(DBNMQTTool): tkinter → PySide6
...
- main.py: 完整重写为 PySide6 (Qt for Python)
- requirements.txt: 加 PySide6>=6.6.0
- 使用 Qt 信号/槽替代 tkinter 回调
- 界面更现代化,Fusion 风格
- 分组框 (QGroupBox) 布局,QSplitter 分栏
2026-07-06 21:19:55 +08:00
wangfq
a2cfe4602c
feat: DBNMQTTool — DLD960 IoT MQTT 设备管理工具 (Python/tkinter 跨平台)
...
基于《DLD960_IoT_MQTT协议.md》V1.00 实现
功能:
- MQTT Broker 连接管理
- 设备自动发现(订阅 dld960/+/dev/# 通配符)
- 设备信息查询(dev_info_query)
- 网络配置(SSC/IoT TCP)+ Topic 配置
- 实时线圈数据监控(loop_data)+ 事件上报(event_report)
- 心跳监控(heartbeat)
- 控制命令:密码验证/设置、出厂初始化、设备复位
项目结构:
- main.py 主窗口 (tkinter GUI)
- dbn_mqtt_tool/
- protocol.py DLD960 IoT MQTT 协议定义
- mqtt_client.py MQTT 客户端封装 (paho-mqtt)
- device_manager.py 设备发现与状态管理
2026-07-06 18:14:38 +08:00
wangfq
220f778117
fix(vd960DBN): 删除重复 poll_mqtt 定义 + 加头文件声明
2026-07-06 17:30:28 +08:00
wangfq
c17b67d185
refactor(vd960DBN): MQTT 重构,对标 DBN101GA 参考项目
...
net_srv.c 改动:
- WCHNET_HandleSockInt IoT 分支:SINT_STAT_CONNECT 直接调 mqtt_connect(),
SINT_STAT_RECV 调 mqtt_data_manage() — 复用已有的 SocketId_TCP/mqttBuf/mqttData
- 新增 mqtt_data_manage(): 处理 CONNACK/SUBACK/PUBLISH/PINGRESP
- 新增 poll_mqtt(): 心跳 PINGREQ (~9s)
peripheral_main.c 改动:
- IoT 模式下 poll_mqtt() 替代 iot_mqtt_poll()
对标 DBN101GA 的关键差异:
- net_srv.c 已有完整 mqtt_connect/mqtt_publish/MQTT_Subscribe/MQTT_Pingreq
- SocketId_TCP 由 WCHNET_CreateTcpMqttSocket 创建,不再自建 socket
- SINT_STAT_CONNECT 直接发 MQTT CONNECT,不延迟
2026-07-06 17:21:48 +08:00
wangfq
0c8402d726
fix(vd960DBN): MQTT socket 复用 SocketId_TCP,对标官方 WCHNET MQTT 例程
...
根因分析:iot_connect_broker 自建 socket 与 WCHNET_CreateTcpMqttSocket
创建的 SocketId_TCP 冲突(重复创建),且自建 socket 的 WCHNET_SocketSend
崩溃。官方 MQTT 例程使用统一的 SocketId/SocketId_TCP 模式。
改动:
- peripheral_main.c: 恢复 WCHNET_CreateTcpMqttSocket() 调用
- iot_connect_broker: 不再创建新 socket,直接复用 SocketId_TCP
- 全链路(SocketSend/HandleSockInt/poll)通过 g_iot_socket=SocketId_TCP 统一
2026-07-06 16:09:22 +08:00
wangfq
46091639cd
fix(vd960DBN): iot_connect_broker 加 SourPort + iot_mqtt_send 加 hex dump
...
- SourPort 参考 WCHNET_CreateTcpMqttSocket 设为 port_dev_udp+1
- iot_mqtt_send 打印前64字节 hex 内容
2026-07-06 15:44:22 +08:00
wangfq
88526158d0
fix(vd960DBN): MQTT CONNECT 改为 poll 内延迟发送,避免中断内 WCHNET_SocketSend 崩溃
...
1. 参考 net_srv.c mqtt_connect 模式重写 iot_mqtt_send_connect:
- clientID 用 g_dev_number_str(全局),不用 g_iot_dev_serial
- username/password 直接赋值,不用 strlen 检查
- memset 手动初始化,不用 brace-initializer 赋值
2. SINT_STAT_CONNECT 中断内不再调 iot_mqtt_send_connect,
改为标记 TCP_CONNECTED,由 iot_mqtt_poll 下一轮发送 —
参考 tcp_json_handle_sock_int 不立即发送数据的模式
2026-07-06 15:16:24 +08:00
wangfq
884a622cab
refactor(vd960DBN): 缓冲区 2048→1024,单次交互不超 1KB
...
- IOT_MQTT_RECV_BUF_LEN: 2048 → 1024
- IOT_MQTT_SEND_BUF_LEN: 2048 → 1024
- data_json 改用宏
- iot_handle_publish 的 json[] 改 static 防栈溢出
2026-07-06 13:47:10 +08:00
wangfq
7459c0fa80
fix(vd960DBN): iot_mqtt_publish_sensor 栈溢出 — data_json[2KB] + payload[2KB] = 4KB 远超 2KB 栈
...
每次主循环调 iot_mqtt_publish_sensor 都分配 4KB 栈变量,
直接栈溢出踩烂全局变量(含 g_iot_dev_serial→clientId=空),
最终在 iot_mqtt_send_connect→WCHNET_SocketSend 时 hard fault。
改为 static 彻底消除栈压力。
另加 iot_mqtt_send 调试日志。
2026-07-06 13:40:25 +08:00
wangfq
de3a7c197e
fix(vd960DBN): MQTTPacket_connectData_initializer 不能用于赋值,用临时变量中转
2026-07-06 11:31:12 +08:00
wangfq
dfadc26717
fix(vd960DBN): MQTT buffer 从栈改为 static,防止栈溢出 (栈仅 2KB)
...
iot_mqtt_send_connect: opts(~85B) + buf[256] → static (~340B 省)
iot_mqtt_send_subscribe: buf[256] → static (256B 省)
iot_mqtt_publish: buf[2048] → static (2KB 省)
调用链 WCHNET_HandleGlobalInt → iot_mqtt_handle_sock_int
→ iot_mqtt_send_connect 会叠加 WCHNET 协议栈内部开销,
2048B 栈极易溢出导致 hard fault(现象:乱码+truncated日志+重启)
2026-07-06 11:27:08 +08:00
wangfq
c0220c1d37
fix(vd960DBN): IoT socket 重复创建 + broker IP 解析错误
...
- iot_connect_broker: 删除 memcpy,get_ipstr_to_array 已正确解析 IP
之前 memcpy 把原始 ASCII 字节覆写到 broker_ip,导致 IP 变成 49.50.49.46
- peripheral_main.c: IoT 模式下跳过 WCHNET_CreateTcpMqttSocket,
由 iot_connect_broker() 统一管理 socket 生命周期,避免重复创建
2026-07-06 10:46:51 +08:00
wangfq
e6dbdb5296
fix(vd960DBN): 修复无法设置 IoT 模式的 bug
2026-07-06 10:24:15 +08:00
wangfq
39bda6067f
fix(vd960DBN): add missing closing brace for case PUBLISH block in iot_process_recv
...
case PUBLISH: { ... } was missing its closing }, causing ARMCC to think
iot_send_heartbeat and iot_connect_broker were declared inside a function body.
2026-07-03 18:28:40 +08:00
wangfq
122c36bb9d
fix(vd960DBN): iot_make_topic missing 5th arg for "srv"/"ctrl" topic
2026-07-03 18:18:38 +08:00
wangfq
6f5effae8c
fix(vd960DBN): iot_mqtt_srv compilation errors
...
- Add extern g_report_active (from tcp_json_srv.h)
- Fix iot_make_topic call: 4-arg -> 5-arg (add NULL for 'status' sub)
- Fix SOCK_INF field names: DestPort->DesPort, DestAddr->IPAddr
- Fix struct _WCHNET_IPAddr -> uint8_t broker_ip[4] (type not available)
2026-07-03 18:12:55 +08:00
wangfq
5333fe40de
refactor(vd960DBN): replace compile-time NET_SSC/NET_JSON/NET_IOT macros with runtime g_sub_code_enable.iot_enable
...
- Remove NET_SSC_ENABLE, NET_JSON_ENABLE, NET_IOT_ENABLE from net_config.h
- Socket config always allocates max: 1 UDP + 2 TCP + 1 TCP_LISTEN
- All #if guards in net_srv.c/h and peripheral_main.c replaced with
runtime g_sub_code_enable.iot_enable checks
- iot_enable=0 -> SSC mode (UDP + TCP client + JSON server)
- iot_enable=1 -> IoT MQTT mode (MQTT client via iot_mqtt_srv)
2026-07-03 18:07:32 +08:00
wangfq
9629729dc9
feat: IoT MQTT 客户端实现 — NET_SSC_ENABLE=0 时启用
...
新增文件:
- iot_mqtt_srv.h/c: MQTT 客户端 (TCP→CONNECT→SUBSCRIBE→READY)
支持: dev_info_query, pwd_verify (其他命令框架预留)
上报: loop_data (传感器), heartbeat (心跳 60s)
断线重连: 指数退避 5s~60s
协议: DLD960 IoT MQTT V1.00 (dld960/{sn}/...)
修改:
- net_config.h: 新增 NET_IOT_ENABLE = !NET_SSC_ENABLE,
IoT 模式分配 1 TCP socket (MQTT client)
- net_srv.c: IoT 初始化 + socket 中断路由
- peripheral_main.c: IoT poll + sensor publish 调用
模式:
NET_SSC_ENABLE=1 → SCC + TCP JSON Server (原有行为)
NET_SSC_ENABLE=0 → IoT MQTT Client (新增)
2026-07-03 17:36:22 +08:00
wangfq
a73a9392bd
docs: 补充 V2.8~V3.1 开发日志 (编译修复/车间距/misc_counter/上电抑制)
2026-07-03 17:01:09 +08:00
wangfq
acb999a881
fix: 放弃 close+recreate listen socket, 改为只关数据socket
...
根因: WCHNET ERR_ISCONN(0x1D), listen socket 关闭后端口5960仍被占用,
无法在同端口立即重建. WCHNET_MainTask 循环也未能释放.
新方案: tcp_json_restart 只关数据 socket(N+1) 断开客户端,
listen socket(N) 保持不动, 仅重置应用层状态.
新客户端连接时 CONNECT 事件照常触发.
2026-07-03 16:10:52 +08:00
wangfq
c181839694
fix: SocketCreat 0x1D — close后先跑WCHNET回收资源再creat
...
根因: WCHNET_SocketClose 异步, 资源在 WCHNET_MainTask 中释放.
tcp_json_restart() close后立刻creat, 旧socket未回收→0x1D.
修复: close后循环5次 WCHNET_MainTask+HandleGlobalInt+Delay(10ms)
确保资源释放后再 WCHNET_SocketCreat
2026-07-03 15:51:16 +08:00
wangfq
b97afe22d5
refactor: 去掉 60s Auth timeout, 改为 3次失败即重启
...
- 删除 tcp_json_poll 中的 Auth timeout 60s 超时检查
- Auth 失败逻辑已在 handle_pwd_verify: 3次失败→tcp_json_restart()
- 连接后无交互场景由 5min 空闲检查覆盖
2026-07-03 15:28:00 +08:00
wangfq
fe69855dc9
fix: Auth timeout 耗尽重启限额导致冷却期阻断连接
...
根因: auth timeout(60s) 走 do_restart 计数, 上电后 4 分钟就耗尽 3 次限额,
进入 10min 冷却期, 客户端无法连接.
修复: auth timeout 直接调 tcp_json_restart() 绕开 do_restart,
不消耗重启计数器. 只保留 5min 空闲/无连接作为限额保护目标.
2026-07-03 15:18:54 +08:00
wangfq
d7951b1056
feat: 上电3秒内抑制主动上报, 等线圈稳定
...
- uart_report_packet_loop_acs 开头检查 misc_counter < 60 (3s@50ms)
- 抑制期内清零 report_counter 防止出抑制后立即触发上报
- 利用 misc_counter 自由运行特性, 无需额外静态变量
2026-07-03 14:14:56 +08:00
wangfq
1ce2e783ae
fix: Auth timeout 死循环打印 — 改用 do_restart 而非手工 close
...
根因: WCHNET_SocketClose 后 g_json_socket_listen 未归 0xFF,
g_json_auth_timer 未重置, 下次 poll 条件仍满足 → 无限打印.
修复: auth timeout 直接 goto do_restart, 走完整的 close→recreate 流程
2026-07-03 13:49:10 +08:00
wangfq
5966eb8657
feat: TCP Server 自动重启机制 — 3种超时条件
...
触发条件(任一满足即重启):
1. 5分钟无任何连接 (从未连或上次连接后超时)
2. 5分钟无数据交互 (已连接但静默)
3. Auth 密码错误3次
重启流程: 关闭socket→清状态→重新SocketCreat+SocketListen
保护机制: 最多连续重启3次, 超限后进入10分钟冷却期
其他改动:
- tcp_json_srv_init 去掉 _init_done 限制, 支持重新初始化
- 新增 tcp_json_restart() 函数
- 新增 g_json_last_comm_ts / g_json_last_connect_ts 追踪
- CONNECT 时清零 restart_count (正常连接重置计数器)
2026-07-03 11:46:17 +08:00
wangfq
d9059fac92
rename: passtime_ms5 → passtime_ms
2026-07-03 11:08:53 +08:00
wangfq
5aa8edc1ea
refactor: 新增 misc_counter 替代 report_counter 做时间戳
...
- Loop154_States 新增 misc_counter (50ms 自由运行不复位)
- 7处时间戳操作改用 misc_counter: passtime_start/last_exit_tick/misc_value
- report_counter 还原原始清零逻辑, 仅管上报间隔
- 删除 last_report_tick
这样 report_counter 只管上报调度, misc_counter 只管时间戳,
互不干扰, 即使 report_counter 清零也不影响车间距/通过时间计算
2026-07-03 10:33:48 +08:00
wangfq
b49797ecc6
fix: report_counter 清零导致车间距/通过时间下溢 (0xFFFFFFxx)
...
根因: report_counter 清零后 last_exit_tick/passtime_start 存旧值,
再次进场时差值下溢 uint32_t → 0xFFFFFFF7
修复:
- Loop154_States 新增 last_report_tick, report_counter 自由运行不复位
- report_misc: 增量判断 (report_counter - last_report_tick) >= _interval
- TMR6 ISR: 用 last_report_tick 实现 UART 期间推迟上报, 不再清零
- 删掉所有 g_loop_states.report_counter = 0
2026-07-03 10:27:56 +08:00
wangfq
85a4fa7910
change: 时间量上报单位 10ms→50ms, report_counter 入 50ms tick
...
- report_counter++ 从 5ms ISR 外层移入 if(TM1cnt>=10) 50ms 块
- 3处 misc_value 去掉 /2, 直接差值即可
- REPORT_IDLE_TICKS 120→12, REPORT_EVENT_TICKS 30→3
- 更新 TaskLoop.h/main.c/devlog 注释
2026-07-03 10:01:30 +08:00
wangfq
3c243ea792
change: 时间量上报单位 5ms→10ms
...
- 进场车间距 / 离场通过时间: misc_value = (差值)/2
- 内部时间戳保持 5ms 精度, 仅上报值转为 10ms
- 更新注释和 devlog (V2.6)
2026-07-03 09:36:28 +08:00
wangfq
9fae087fed
feat: 主动上报时间量 — 补齐车间距时间 (gap time)
...
- Loop154_Unit 新增 last_exit_tick 字段,记录上次离场时间戳
- 进场: misc_value = 车间距 (report_counter - last_exit_tick), 首车为0
- 离场 (flatness/cnt_release): 记录 last_exit_tick, misc_value = 通过时间
- 有限存在超时: 也记录 last_exit_tick, 确保下一辆车车间距正确
四通道独立计算, 单位 5ms tick
2026-07-03 09:13:39 +08:00
wangfq
67a54bded3
fix: 修复 ARMCC 编译错误和警告 — 多余大括号/未引用变量/枚举类型混用
...
- #991 : g_loop_states 初始化去多余括号 {{0}, {{{0}}}} → {0}
- #177-D: 删除未引用的 _counter1_init
- #188-D: 7处 at32_led_* 调用加 (led_type) 强转
2026-07-03 08:29:30 +08:00
wangfq
9e125f953c
feat(vd960Loop): 0xC0 主动上报 — 4种杂项类型轮转 + 事件优先级
...
杂项类型轮转:
- 0b00 时间量: 进场=车间距, 离开=通过时间, 空闲=0
- 0b01 线圈断开次数
- 0b10 车流量累计
- 0b11 继电器动作次数
上报间隔:
- 空闲稳定: 600ms, 轮流上报 0→1→2→3
- 进场/离开事件: 150ms, 强制时间量, 最高优先级
TaskLoop.h: 新增 MISC_TYPE_* / REPORT_*_TICKS 宏
Loop154_Unit 新增 flow_count/relay_count/passtime_start/misc_value
Loop154_States 新增 report_misc_round
TaskLoop.c: 进场时记录时间戳+累计; 离开时计算通过时间
main.c: 重写 uart_report_packet_loop_acs
2026-07-02 18:18:16 +08:00
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