From 0e57fa452f265010090ccb2183d873bca89b8c42 Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Sat, 5 Sep 2026 20:39:11 +0800 Subject: [PATCH] Harden charge UI draw when ExtFlash asset missing. Fill dark background first, overlay % at size 24, and fall back if charge bitmap is erased. Co-authored-by: Cursor --- APP/app_log.c | 18 ++++++++++++++++++ UI/UI_Idle.c | 31 +++++++++++++++++++++++-------- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/APP/app_log.c b/APP/app_log.c index 137d25e..02fc1c3 100644 --- a/APP/app_log.c +++ b/APP/app_log.c @@ -279,6 +279,24 @@ uint8_t app_log_try_command(const char *cmd) SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "UI_BOOT_OK\n"); return 1U; } + if (strncmp(cmd, "ui charge", 9) == 0) { + uint8_t peek[4]; + LCD_BLK_Set(); + LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR); + W25Q128_Read(peek, UI0902_CHARGE_SCREEN_ADDR, 4); + if (peek[0] != 0xFF || peek[1] != 0xFF) { + LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_CHARGE_SCREEN_W, UI0902_CHARGE_SCREEN_H, + UI0902_CHARGE_SCREEN_ADDR); + SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "UI_CHARGE_OK\n"); + } else { + Draw_Charging_Icon(120, 150, 2, 0x3D7F); + SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "UI_CHARGE_EMPTY\n"); + } + LCD_FillByColor(40, 255, 200, 292, UI0902_BG_COLOR); + LCD_ShowString_AutoAlign(0, 240, 264, (uint8_t *)"50%", LCD_ALIGN_CENTER, + WHITE, UI0902_BG_COLOR, 0, 24); + return 1U; + } return 0U; } diff --git a/UI/UI_Idle.c b/UI/UI_Idle.c index 72e24a0..2b47da1 100644 --- a/UI/UI_Idle.c +++ b/UI/UI_Idle.c @@ -256,12 +256,27 @@ void IdleProcess(DisplayTaskMessage_Type msg) static bool s_charge_ui_drawn = false; if(!s_charge_ui_drawn) { + uint8_t peek[4]; BSP_MainPowerEnable(1); - LCD_WR_REG(0x29); //Display on + LCD_WR_REG(0x29); /* Display on */ - /* 0904 全屏充电画面(UI0902 资源包);旧 Charg.bin 160x190 仅作音色包占位 */ - LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_CHARGE_SCREEN_W, UI0902_CHARGE_SCREEN_H, - UI0902_CHARGE_SCREEN_ADDR); + /* 先铺设计底色,避免外置 Flash 未烧充电图时整屏 0xFF 灰底 */ + LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR); + + W25Q128_Read(peek, UI0902_CHARGE_SCREEN_ADDR, 4); + if (peek[0] != 0xFF || peek[1] != 0xFF) + { + /* 0904 全屏充电画面(UI0902 @ CHARGE_SCREEN);% 由固件叠画 */ + LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_CHARGE_SCREEN_W, UI0902_CHARGE_SCREEN_H, + UI0902_CHARGE_SCREEN_ADDR); + } + else + { + /* 资源未烧录时的兜底:圆环闪电(需稍后 flash ui0902) */ + Draw_Charging_Icon(120, 150, 2, 0x3D7F); + LOG_W("UI", "charge flash empty @0x%08lX — flash ui0902", + (unsigned long)UI0902_CHARGE_SCREEN_ADDR); + } LCD_BLK_Set(); s_charge_ui_drawn = true; } @@ -269,10 +284,10 @@ void IdleProcess(DisplayTaskMessage_Type msg) { uint8_t Info[10] = {0,}; sprintf ((char*)Info, "%d%%", msg.ID); - /* 设计稿百分比约 y270;清带避免 9%→100% 残影 */ - LCD_FillByColor(40, 265, 200, 298, UI0902_BG_COLOR); - LCD_ShowString_AutoAlign(0, 240, 270, Info, LCD_ALIGN_CENTER, - WHITE, UI0902_BG_COLOR, 0, 28); + /* 设计稿约 y270;字库仅有 16/24/28,用 24 贴近标注 20 */ + LCD_FillByColor(40, 255, 200, 292, UI0902_BG_COLOR); + LCD_ShowString_AutoAlign(0, 240, 264, Info, LCD_ALIGN_CENTER, + WHITE, UI0902_BG_COLOR, 0, 24); } else {