/* * 模块名称:UI Task * 模块功能:UI 主任务,等待网络就绪后初始化显示/菜单/推流并周期刷新 * 适用平台:STM32F407 系列(LVGL + CH395F 以太网) * 作者:王建锋 * 创建日期:2026-08-30 * 修改记录: * v1.1 2026-09-14 王建锋 新增待机显示页初始化(ui_standby_init,空闲 60s 切入) */ #include "ui_task.h" #include #include "cmsis_os.h" #include "sys_events.h" #include "ui_port.h" #include "ui_menu.h" #include "ui_net_sink.h" #include "ui_standby.h" #include "sys_clock.h" /* * 函数功能:待机屏底部时钟提供回调(平台差异:MCU = sys_clock_get_str) * 入口参数:buf - 时间串输出缓冲 char * * len - buf 容量 size_t * 返回值:无 */ static void ui_task_time_cb(char *buf, size_t len) { if (sys_clock_get_str(buf, len) == NULL && len > 0u) { buf[0] = '\0'; /* 墙钟无效:空串(待机屏时钟行留白) */ } } #define DBG_TAG "[UI_TASK]" #include "dbg_log.h" /* * 函数功能:等待网络就绪事件 * 入口参数:无 * 返回值:无 * 限定条件:sys_evtHandle 为 NULL 时直接返回 * 函数说明:无限期等待 SYS_EVT_NET_READY 标志 */ static void ui_task_wait_net_ready(void) { if (sys_evtHandle != NULL) { /* osFlagsNoClear:就绪位是状态,不能被本任务消费掉(否则其它等待者永不唤醒) */ osEventFlagsWait(sys_evtHandle, SYS_EVT_NET_READY, osFlagsWaitAny | osFlagsNoClear, osWaitForever); } } /* * 函数功能:UI 主任务入口,初始化显示/菜单/推流并进入刷新主循环 * 入口参数:argument - FreeRTOS 任务参数(未使用) void * * 返回值:无 * 限定条件:FreeRTOS 已启动 * 函数说明:1. 等待 SYS_EVT_NET_READY 后依次初始化 ui_port/ui_menu/ui_net_sink * 2. 主循环周期调用 ui_port_step 与 ui_net_sink_poll 刷新界面 */ void ui_task_func(void *argument) { (void)argument; DBG_INFO("UI task: started, wait net ready"); ui_task_wait_net_ready(); DBG_INFO("UI task: net ready, init port"); DBG_INFO("UI task: ui_port_init enter"); if (ui_port_init() != 0) { DBG_ERROR("UI port init: FAIL"); for (;;) { osDelay(1000); } } DBG_INFO("UI port init: OK"); DBG_INFO("UI task: ui_menu_init enter"); if (ui_menu_init() != 0) { DBG_ERROR("UI menu init: FAIL"); for (;;) { osDelay(1000); } } DBG_INFO("UI menu init: OK"); if (ui_standby_init(60000u, ui_task_time_cb) != 0) { DBG_ERROR("UI standby init: FAIL"); } else { DBG_INFO("UI standby: ready (idle=60s)"); } if (ui_net_sink_start(UI_NET_SINK_PORT) != 0) { DBG_ERROR("UI net sink: start FAIL"); } DBG_INFO("UI net sink: started (port %u)", (unsigned)UI_NET_SINK_PORT); while (1) { ui_port_step(10); ui_net_sink_poll(); osDelay(10); } }