修复远端推流整帧纯白:MCU端补dark mono主题应用与I1调色板,net发送侧加停顿/短写诊断

This commit is contained in:
2026-09-21 05:12:18 +08:00
parent 96855f6b6b
commit 472c8172fb
2 changed files with 35 additions and 0 deletions
+12
View File
@@ -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;
}
/*
+23
View File
@@ -12,6 +12,9 @@
#include <string.h>
#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);