修复远端推流整帧纯白:MCU端补dark mono主题应用与I1调色板,net发送侧加停顿/短写诊断
This commit is contained in:
@@ -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;
|
||||
}
|
||||
/*
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user