/* * 模块名称:UI Network Sink (RemoDispBus 服务端) * 模块功能:实现 RemoDispBus 协议服务端,接收远端连接与导航按键,回送 1bpp 帧缓冲 * 适用平台:STM32F407ZGTx + CH395F 以太网 * 作者:王建锋 * 创建日期:2026-08-29 * 修改记录: * 2026-08-29 王建锋 创建初始版本 * 2026-08-29 王建锋 修正监听端口为 7003,与 DTU-RemoteLCD 客户端默认端口对齐 * 2026-10-25 DTU 项目组 F3:新增 ui_net_sink_set_beat_cb()(看门狗心跳 * 回调注入,往返返回点喂位;未注册 = 零行为变化) */ #ifndef UI_NET_SINK_H #define UI_NET_SINK_H #include #ifdef __cplusplus extern "C" { #endif /* RemoDispBus 标签与命令 */ #define UI_REMO_TAG_CLIENT 0xAA #define UI_REMO_TAG_DEVICE 0xBB #define UI_REMO_CMD_KEEP 0 #define UI_REMO_CMD_INIT 1 #define UI_REMO_CMD_KEY 2 #define UI_REMO_CMD_LCDMEM 3 /* UI 推流监听端口(须与 DTU-RemoteLCD 客户端默认端口 7003 一致) */ #define UI_NET_SINK_PORT 7003 /* * 函数功能:启动 UI 专用 TCP 监听 Socket * 入口参数:port - 监听端口号 uint16_t 1 - 65535 * 返回值:0 - 成功,其他 - 失败(socket 创建/绑定/监听失败) * 限定条件:net_init() 已完成,网络子系统就绪 * 函数说明:1. 创建流式 Socket 并绑定到指定端口与任意本地地址 * 2. 进入监听状态,等待远端客户端连接 * 3. 调用前需确保 CH395F 网络已初始化 */ int ui_net_sink_start(uint16_t port); /* * 函数功能:轮询 RemoDispBus 协议(接受连接、收帧、逐字节解析) * 入口参数:无 * 返回值:无 * 限定条件:ui_net_sink_start() 已成功调用 * 函数说明:1. 无客户端时先门控(net_listener_armed,纯 RAM 读)再尝试接受连接 * 2. 有客户端时先门控(net_can_read)再用 net_recv_nb 非阻塞收帧并解析 * (KEEPLIVE/INIT/KEY/LCDMEM);门控判为无数据时仍每 32 轮兜底收一次 * (DONTWAIT 已转正为具名 API;uiTask 受 IWDG 监控, * 非阻塞是契约义务——见 net_socket.h net_recv 文档契约) * 3. 对端关闭或异常时复位客户端,等待下次重监听 * ⚠ **不是"零成本非阻塞"**:门控只消除无谓往返;真有活时仍是 * "入队 + 等 netTask 回执"(osMessageQueuePut(osWaitForever) + * xTaskNotifyWait(portMAX_DELAY),均无上界;LCDMEM 应答 3204 B 最坏 ≈4 s) * → 会拖住宿主(uiTask)的刷新;"搬出 uiTask"已完整评估并**决定不做** * (实测刷新最坏周期 = LVGL 帧周期地板,与网络无关),见 * docs/UI设计/RemoDispBus协议与接收设计说明.md §3 */ void ui_net_sink_poll(void); /* * 函数功能:注册看门狗心跳回调钩子(F3,2026-10-25 大窗判读) * 入口参数:cb - 回调钩子(宿主轮询上下文调用);NULL = 注销 * 返回值:无 * 限定条件:宿主任务在首次 ui_net_sink_poll() 之前调用一次;注册者 = 推流 * 属主(MCU = uiTask,须保证钩子内只做置位类动作、不阻塞) * 函数说明:本模块在每次**可等待 net 往返**(accept / recv_nb / send / close / * 重建三件套)返回处调用钩子。动因:netTask 重建风暴期,单轮内多个 * 往返串行排队,把宿主(uiTask,IWDG 必需位)的心跳间隔拖过 800ms * (2026-10-25 台架实测 bit4 单任务 8 连击窗、uisn=154ms 仍在段内); * 往返时长本身不改(上界收口为登记簿批 3 事项),但心跳在每个 * 往返边界续命——单任务停摆判据(按位连击,docs/子系统设计/看门狗设计说明.md * §5.3)只应 * 抓真挂死,不该抓「多个都回来了但各自偏慢的往返之和」。 * 未注册(模拟器/黄金回归形态)= 行为与本特性引入前逐字一致。 * 为何回调注入而非直调 task_wd_beat():Drivers/BSP 不得 include * App 侧头(layer-deps 门禁,方向性铁律) */ void ui_net_sink_set_beat_cb(void (*cb)(void)); #ifdef __cplusplus } #endif #endif /* UI_NET_SINK_H */