From 472c8172fb00330d41d34738f1fbf9ac4bd242c7 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Mon, 21 Sep 2026 05:12:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BF=9C=E7=AB=AF=E6=8E=A8?= =?UTF-8?q?=E6=B5=81=E6=95=B4=E5=B8=A7=E7=BA=AF=E7=99=BD:MCU=E7=AB=AF?= =?UTF-8?q?=E8=A1=A5dark=20mono=E4=B8=BB=E9=A2=98=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E4=B8=8EI1=E8=B0=83=E8=89=B2=E6=9D=BF,net=E5=8F=91=E9=80=81?= =?UTF-8?q?=E4=BE=A7=E5=8A=A0=E5=81=9C=E9=A1=BF/=E7=9F=AD=E5=86=99?= =?UTF-8?q?=E8=AF=8A=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Drivers/BSP/NET/net_socket.c | 12 ++++++++++++ Drivers/BSP/UI/ui_port.c | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/Drivers/BSP/NET/net_socket.c b/Drivers/BSP/NET/net_socket.c index 988a9d09..8078f59d 100644 --- a/Drivers/BSP/NET/net_socket.c +++ b/Drivers/BSP/NET/net_socket.c @@ -961,6 +961,7 @@ static int net_send_locked(net_sock_t *p_sock, const void *buf, int len) { if (!p_sock->send_ready) { if (NET_SEND_TIMEOUT_MS > 0 && (HAL_GetTick() - tick_start) >= NET_SEND_TIMEOUT_MS) { + DBG_ERROR("sock%d send stall: send_ready not set (%d/%d)", sockfd, sent, len); s_net_errno = NET_ERR_TIMEDOUT; break; } @@ -983,6 +984,11 @@ static int net_send_locked(net_sock_t *p_sock, const void *buf, int len) { } } + if (sent < len) { + /* 短写告警:调用方必须检查返回值。静默截断会让对端永久等待剩余字节 + * (2026-09-21 实证:UI 推流应答被截断 → 客户端反复判定"全程无字节"失联)。 */ + DBG_ERROR("sock%d short send %d/%d (errno=%d)", sockfd, sent, len, s_net_errno); + } return sent; } @@ -1395,6 +1401,7 @@ int net_sendto(int sockfd, const void *buf, int len, int flags, if (!p_sock->send_ready) { if (NET_SEND_TIMEOUT_MS > 0 && (HAL_GetTick() - tick_start) >= NET_SEND_TIMEOUT_MS) { + DBG_ERROR("sock%d send stall: send_ready not set (%d/%d)", sockfd, sent, len); s_net_errno = NET_ERR_TIMEDOUT; break; } @@ -1418,6 +1425,11 @@ int net_sendto(int sockfd, const void *buf, int len, int flags, } } + if (sent < len) { + /* 短写告警:调用方必须检查返回值。静默截断会让对端永久等待剩余字节 + * (2026-09-21 实证:UI 推流应答被截断 → 客户端反复判定"全程无字节"失联)。 */ + DBG_ERROR("sock%d short send %d/%d (errno=%d)", sockfd, sent, len, s_net_errno); + } return sent; } /* diff --git a/Drivers/BSP/UI/ui_port.c b/Drivers/BSP/UI/ui_port.c index dd1e1fa8..a69318d0 100644 --- a/Drivers/BSP/UI/ui_port.c +++ b/Drivers/BSP/UI/ui_port.c @@ -12,6 +12,9 @@ #include #include "lvgl.h" +#define DBG_TAG "[UI_PORT]" +#include "dbg_log.h" + /* 160x160 1bpp 帧 = 3200 字节 */ static uint8_t g_ui_fbuf[UI_FB_SIZE]; @@ -99,7 +102,27 @@ int ui_port_init(void) { if (disp == NULL) { return -1; } +#if LV_USE_THEME_MONO + /* mono 主题显式取 dark_bg=true(黑底白字),这是远端画面"纯白"的根因修复: + * UI 内容恒以 lv_color_white() 绘制(ui_standby / ui_menu_view / ui_deco / + * ui_content_page),若底色是 LVGL 类默认浅灰 F5F5F5,白色内容在白底上完全 + * 不可见,整帧近乎全白(实测 99% 像素为亮)。两步缺一不可: + * 1) lv_theme_mono_init(disp, true) 重建单例主题样式(create 时已按 false 初始化); + * 2) lv_display_set_theme() 只重应用到 screens[0](底层),活动屏幕必须再显式 + * lv_theme_apply(),否则活动屏幕仍保持类默认底色(实测 bg_before=F5F5F5)。 */ + lv_theme_t *th = lv_theme_mono_init(disp, true, LV_FONT_DEFAULT); + lv_display_set_theme(disp, th); + lv_theme_apply(lv_display_get_screen_active(disp)); + DBG_INFO("theme: mono dark_bg=true applied"); +#else + DBG_ERROR("theme: LV_USE_THEME_MONO=0 (no mono theme)"); +#endif lv_display_set_color_format(disp, LV_COLOR_FORMAT_I1); + /* I1 绘制缓冲头 8 字节是调色板(两个 lv_color32_t,内存序 B,G,R,A)。LVGL 不会替 + * 调用方初始化它,实测上电后为全 0(两项都是透明黑)。显式写成 [0]=黑 [1]=白: + * 远端推流按"位=1 即亮"取用(见 ui_net_sink / DTU-RemoteLCD),语义必须确定。 */ + g_ui_draw_buf[0] = 0x00u; g_ui_draw_buf[1] = 0x00u; g_ui_draw_buf[2] = 0x00u; g_ui_draw_buf[3] = 0xFFu; + g_ui_draw_buf[4] = 0xFFu; g_ui_draw_buf[5] = 0xFFu; g_ui_draw_buf[6] = 0xFFu; g_ui_draw_buf[7] = 0xFFu; lv_display_set_buffers(disp, g_ui_draw_buf, NULL, UI_DRAW_BUF_SIZE, LV_DISPLAY_RENDER_MODE_FULL); lv_display_set_flush_cb(disp, ui_flush_cb);