Align mode-select and status bar with 0902/0819 design.
Fill three mode rows to the screen bottom without a nav bar, and fix the status bar to one volume meter, centered Bluetooth, and battery percentage. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
e62c2270af
commit
41052d334d
30
UI/UI_Idle.c
30
UI/UI_Idle.c
|
|
@ -24,12 +24,12 @@ static uint8_t s_mode_select_focus = 0;
|
||||||
|
|
||||||
extern bool InModeFlag;
|
extern bool InModeFlag;
|
||||||
|
|
||||||
/* 0902 设计稿:整行位图(背景+图标+文字+箭头)存外部 Flash,222x84 */
|
/* 0902/0819:三行模式撑满状态栏下方至底边(无底栏),222x88 @ y=43/135/225 */
|
||||||
#define UI0902_MODE_ROW_X 9
|
#define UI0902_MODE_ROW_X 9
|
||||||
#define UI0902_MODE_ROW_W 222
|
#define UI0902_MODE_ROW_W 222
|
||||||
#define UI0902_MODE_ROW_H 84
|
#define UI0902_MODE_ROW_H 88
|
||||||
#define UI0902_MODE_ROW_Y0 30
|
#define UI0902_MODE_ROW_Y0 43
|
||||||
#define UI0902_MODE_ROW_DY 86
|
#define UI0902_MODE_ROW_DY 92
|
||||||
|
|
||||||
static const uint32_t s_mode_row_addr[3][2] = {
|
static const uint32_t s_mode_row_addr[3][2] = {
|
||||||
{ UI0902_ROW_UNIVERSAL_NOT_ADDR, UI0902_ROW_UNIVERSAL_SEL_ADDR }, /* 0 万能 */
|
{ UI0902_ROW_UNIVERSAL_NOT_ADDR, UI0902_ROW_UNIVERSAL_SEL_ADDR }, /* 0 万能 */
|
||||||
|
|
@ -89,17 +89,14 @@ void UI_DrawModeSelectScreen(void)
|
||||||
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
|
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
|
||||||
label_top();
|
label_top();
|
||||||
UI_ModeSelect_DrawButtons();
|
UI_ModeSelect_DrawButtons();
|
||||||
Draw_Bottom_Bar(UI0902_NAV_MODE, 0);
|
/* 设计稿 0902-01:模式选择页无底部三栏导航,仅三行模式按钮 */
|
||||||
}
|
}
|
||||||
|
|
||||||
const Touch_AreaTypeDef Touch_ModeSelect_Areas[] = {
|
const Touch_AreaTypeDef Touch_ModeSelect_Areas[] = {
|
||||||
/* Flag=按钮序号(0万能/1普通/2专业);ID=进入 TAB */
|
/* Flag=按钮序号(0万能/1普通/2专业);ID=进入 TAB。三行撑满,无底栏 */
|
||||||
{ 9, 231, 30, 114, 0, 0, 0, NULL },
|
{ 9, 231, 43, 130, 0, 0, 0, NULL },
|
||||||
{ 9, 231, 116, 200, 1, 0, 2, NULL },
|
{ 9, 231, 135, 222, 1, 0, 2, NULL },
|
||||||
{ 9, 231, 202, 286, 2, 0, 1, NULL },
|
{ 9, 231, 225, 312, 2, 0, 1, NULL },
|
||||||
/* 底栏导航:设置 / 调音台(模式选择即本页) */
|
|
||||||
{ 0, 79, 287, 319, 0, UI0902_NAV_SETTING, GUI_NAV_BAR, NULL },
|
|
||||||
{ 80, 159, 287, 319, 0, UI0902_NAV_MIXER, GUI_NAV_BAR, NULL },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TOUCH_AREA_MODE_SELECT_NUM (sizeof(Touch_ModeSelect_Areas)/sizeof(Touch_AreaTypeDef))
|
#define TOUCH_AREA_MODE_SELECT_NUM (sizeof(Touch_ModeSelect_Areas)/sizeof(Touch_AreaTypeDef))
|
||||||
|
|
@ -229,13 +226,6 @@ void IdleProcess(DisplayTaskMessage_Type msg)
|
||||||
msg.LoByte >= Touch_ModeSelect_Areas[k].y_min && msg.LoByte <= Touch_ModeSelect_Areas[k].y_max )
|
msg.LoByte >= Touch_ModeSelect_Areas[k].y_min && msg.LoByte <= Touch_ModeSelect_Areas[k].y_max )
|
||||||
{
|
{
|
||||||
hit = 1U;
|
hit = 1U;
|
||||||
if (Touch_ModeSelect_Areas[k].ID == GUI_NAV_BAR) {
|
|
||||||
if (Touch_ModeSelect_Areas[k].Value == UI0902_NAV_SETTING)
|
|
||||||
MenuPage_Setting_Proc();
|
|
||||||
else if (Touch_ModeSelect_Areas[k].Value == UI0902_NAV_MIXER)
|
|
||||||
MenuPage_Mixer_Proc();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
uint8_t row = (uint8_t)Touch_ModeSelect_Areas[k].Flag;
|
uint8_t row = (uint8_t)Touch_ModeSelect_Areas[k].Flag;
|
||||||
LOG_I("UI", "mode_select hit area=%u row=%u focus=%u x=%u y=%u",
|
LOG_I("UI", "mode_select hit area=%u row=%u focus=%u x=%u y=%u",
|
||||||
(unsigned)k, (unsigned)row, (unsigned)s_mode_select_focus,
|
(unsigned)k, (unsigned)row, (unsigned)s_mode_select_focus,
|
||||||
|
|
@ -301,7 +291,7 @@ void IdleProcess(DisplayTaskMessage_Type msg)
|
||||||
else if (vol <= 95) level = 3;
|
else if (vol <= 95) level = 3;
|
||||||
else if (vol <= 115) level = 4;
|
else if (vol <= 115) level = 4;
|
||||||
else level = 5;
|
else level = 5;
|
||||||
Draw_Volume_Bar(55, 3, level, 1, WHITE, GRAY);
|
Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, level, 1, WHITE, GRAY);
|
||||||
uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7};
|
uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7};
|
||||||
memset(mMasterSysExVolume+8,msg.ID,1);
|
memset(mMasterSysExVolume+8,msg.ID,1);
|
||||||
SendMidiDataToDreamDSP(mMasterSysExVolume,12);
|
SendMidiDataToDreamDSP(mMasterSysExVolume,12);
|
||||||
|
|
|
||||||
|
|
@ -418,7 +418,7 @@ void UI_SongMode_Process(DisplayTaskMessage_Type msg)
|
||||||
|
|
||||||
case MSG_ID_EC_VOL:
|
case MSG_ID_EC_VOL:
|
||||||
Send_volume(msg.ID);
|
Send_volume(msg.ID);
|
||||||
Draw_Volume_Bar(55, 3, msg.HiByte, 1, WHITE, GRAY);
|
Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, msg.HiByte, 1, WHITE, GRAY);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_ID_TAP_SPEED:
|
case MSG_ID_TAP_SPEED:
|
||||||
|
|
|
||||||
|
|
@ -175,11 +175,10 @@ uint8_t UI_SetFocus(uint8_t widget_id)
|
||||||
|
|
||||||
void label_top()
|
void label_top()
|
||||||
{
|
{
|
||||||
const uint16_t btn_color = /*DARKLGRAY*/0x2988; // 深灰<E6B7B1>?????
|
const uint16_t btn_color = /*DARKLGRAY*/0x2988;
|
||||||
//LCD_FillByColor(0,0,240,25,BLACK);
|
|
||||||
LCD_FillByColor(0, 0, 240, UI_STATUS_BAR_H, UI0902_BG_COLOR);
|
LCD_FillByColor(0, 0, 240, UI_STATUS_BAR_H, UI0902_BG_COLOR);
|
||||||
LCD_WR_PIC_Trans(8, 6, 20, 15, gImage_UI0902_Volume_20x15, BLACK);
|
/* 仅一组动态音量条(音量图标素材本身也是竖条,不再叠绘以免双图标) */
|
||||||
Draw_Volume_Bar(55, 3, level, 1, WHITE, GRAY);
|
Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, level, 1, WHITE, GRAY);
|
||||||
LCD_DrawLine(0, 26, 240, 26, btn_color);
|
LCD_DrawLine(0, 26, 240, 26, btn_color);
|
||||||
Show_BL_Icon(mGuiData[GUI_BL_SW].Current);
|
Show_BL_Icon(mGuiData[GUI_BL_SW].Current);
|
||||||
Show_Battery_Icon(usb_charging_state);
|
Show_Battery_Icon(usb_charging_state);
|
||||||
|
|
@ -245,31 +244,49 @@ void UI_GotoCurrentModePage(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 蓝牙图标显示(占位) */
|
/* 蓝牙图标:设计稿居中 */
|
||||||
void Show_BL_Icon(uint8_t value)
|
void Show_BL_Icon(uint8_t value)
|
||||||
{
|
{
|
||||||
if(value)
|
LCD_FillByColor(UI0902_BT_X, UI0902_BT_Y,
|
||||||
|
UI0902_BT_X + UI0902_BT_W - 1,
|
||||||
|
UI0902_BT_Y + UI0902_BT_H - 1, UI0902_BG_COLOR);
|
||||||
|
if (value)
|
||||||
{
|
{
|
||||||
LCD_WR_PIC_Trans(36, 5, 11, 17, gImage_UI0902_Bluetooth_11x17, BLACK);
|
LCD_WR_PIC_Trans(UI0902_BT_X, UI0902_BT_Y, UI0902_BT_W, UI0902_BT_H,
|
||||||
|
gImage_UI0902_Bluetooth_11x17, BLACK);
|
||||||
}
|
}
|
||||||
else
|
BSP_BlueToothPowerEnable(value);
|
||||||
{
|
|
||||||
LCD_FillByColor(36, 5, 47, 22, UI0902_BG_COLOR);
|
|
||||||
}
|
|
||||||
BSP_BlueToothPowerEnable (value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Draw_Status_Battery_Icon(uint8_t battery_percent)
|
void Draw_Status_Battery_Icon(uint8_t battery_percent)
|
||||||
{
|
{
|
||||||
|
uint8_t Info[8];
|
||||||
uint16_t fill_w;
|
uint16_t fill_w;
|
||||||
if (battery_percent > 100) battery_percent = 100;
|
uint16_t text_w;
|
||||||
LCD_FillByColor(UI0902_BATTERY_X, UI0902_BATTERY_Y,
|
uint16_t bat_x;
|
||||||
UI0902_BATTERY_X + 29, UI0902_BATTERY_Y + 12, UI0902_BG_COLOR);
|
uint16_t text_x;
|
||||||
|
uint16_t text_y;
|
||||||
|
|
||||||
|
if (battery_percent > 100)
|
||||||
|
battery_percent = 100;
|
||||||
|
|
||||||
|
sprintf((char *)Info, "%d%%", battery_percent);
|
||||||
|
text_w = (uint16_t)(strlen((char *)Info) * (UI0902_BATTERY_TEXT_SIZE / 2));
|
||||||
|
bat_x = (uint16_t)(240 - UI0902_BATTERY_RIGHT_MARGIN - text_w
|
||||||
|
- UI0902_BATTERY_TEXT_GAP - UI0902_BATTERY_W);
|
||||||
|
text_x = (uint16_t)(bat_x + UI0902_BATTERY_W + UI0902_BATTERY_TEXT_GAP);
|
||||||
|
text_y = (uint16_t)((UI_STATUS_BAR_H - UI0902_BATTERY_TEXT_SIZE) / 2);
|
||||||
|
|
||||||
|
LCD_FillByColor(bat_x > 2 ? (uint16_t)(bat_x - 2) : 0, 0, 240, UI_STATUS_BAR_H,
|
||||||
|
UI0902_BG_COLOR);
|
||||||
|
|
||||||
fill_w = (uint16_t)((22UL * battery_percent) / 100);
|
fill_w = (uint16_t)((22UL * battery_percent) / 100);
|
||||||
LCD_WR_PIC_ClipX(UI0902_BATTERY_X + 3, UI0902_BATTERY_Y + 2, 22, 9, fill_w,
|
LCD_WR_PIC_ClipX(bat_x + 3, UI0902_BATTERY_Y + 2, 22, 9, fill_w,
|
||||||
gImage_UI0902_BatteryFill_22x9);
|
gImage_UI0902_BatteryFill_22x9);
|
||||||
LCD_WR_PIC_Trans(UI0902_BATTERY_X, UI0902_BATTERY_Y, 29, 12,
|
LCD_WR_PIC_Trans(bat_x, UI0902_BATTERY_Y, UI0902_BATTERY_W, UI0902_BATTERY_H,
|
||||||
gImage_UI0902_BatteryOutline_29x12, BLACK);
|
gImage_UI0902_BatteryOutline_29x12, BLACK);
|
||||||
|
LCD_ShowString(text_x, text_y, Info, WHITE, UI0902_BG_COLOR,
|
||||||
|
UI0902_BATTERY_TEXT_SIZE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Show_Battery_Icon(uint8_t flag)
|
void Show_Battery_Icon(uint8_t flag)
|
||||||
|
|
|
||||||
|
|
@ -31,13 +31,24 @@ void CallUI_RestoreSelect(void);
|
||||||
/* 0902 设计稿配色与底栏导航 */
|
/* 0902 设计稿配色与底栏导航 */
|
||||||
#define UI0902_BG_COLOR 0x0042 /* #000813 页面背景 */
|
#define UI0902_BG_COLOR 0x0042 /* #000813 页面背景 */
|
||||||
#define UI0902_ROW_BG 0x2147 /* #242B3A 列表行背景 */
|
#define UI0902_ROW_BG 0x2147 /* #242B3A 列表行背景 */
|
||||||
#define UI0902_BATTERY_X 203
|
/* 0902 状态栏:左音量条 / 中蓝牙 / 右电池+百分比(对齐屏幕参考 0902-01) */
|
||||||
|
#define UI0902_VOL_X 8
|
||||||
|
#define UI0902_VOL_Y 3
|
||||||
|
#define UI0902_BT_W 11
|
||||||
|
#define UI0902_BT_H 17
|
||||||
|
#define UI0902_BT_X ((240 - UI0902_BT_W) / 2) /* 居中 */
|
||||||
|
#define UI0902_BT_Y 5
|
||||||
|
#define UI0902_BATTERY_W 29
|
||||||
|
#define UI0902_BATTERY_H 12
|
||||||
#define UI0902_BATTERY_Y 7
|
#define UI0902_BATTERY_Y 7
|
||||||
|
#define UI0902_BATTERY_RIGHT_MARGIN 8
|
||||||
|
#define UI0902_BATTERY_TEXT_GAP 4
|
||||||
|
#define UI0902_BATTERY_TEXT_SIZE 16
|
||||||
#define UI0902_NAV_SETTING 0 /* 底栏位0:设置(设置页内为返回) */
|
#define UI0902_NAV_SETTING 0 /* 底栏位0:设置(设置页内为返回) */
|
||||||
#define UI0902_NAV_MIXER 1 /* 底栏位1:调音台 */
|
#define UI0902_NAV_MIXER 1 /* 底栏位1:调音台 */
|
||||||
#define UI0902_NAV_MODE 2 /* 底栏位2:模式选择 */
|
#define UI0902_NAV_MODE 2 /* 底栏位2:模式选择 */
|
||||||
#define UI0902_NAV_NONE 0xFF
|
#define UI0902_NAV_NONE 0xFF
|
||||||
/* 电量组在 Draw_Battery_Icon 内按右对齐重算;此值为允许的最左起点 */
|
/* 旧几何电池(Draw_Battery_Icon)最左起点;0902 图电池用 Draw_Status_Battery_Icon */
|
||||||
#define UI_STATUS_BATTERY_X 150
|
#define UI_STATUS_BATTERY_X 150
|
||||||
#define UI_STATUS_BATTERY_H 11
|
#define UI_STATUS_BATTERY_H 11
|
||||||
#define UI_STATUS_BATTERY_Y ((UI_STATUS_BAR_H - UI_STATUS_BATTERY_H) / 2)
|
#define UI_STATUS_BATTERY_Y ((UI_STATUS_BAR_H - UI_STATUS_BATTERY_H) / 2)
|
||||||
|
|
|
||||||
|
|
@ -1780,7 +1780,7 @@ void Draw_Volume_Bar(uint16_t x, uint16_t y, uint8_t volume_level,uint8_t scale,
|
||||||
}
|
}
|
||||||
|
|
||||||
clear_w = (uint16_t)(w + gap) * bar_count - gap;
|
clear_w = (uint16_t)(w + gap) * bar_count - gap;
|
||||||
LCD_FillByColor(x, y, x + clear_w, y + max_h * scale, BLACK);
|
LCD_FillByColor(x, y, x + clear_w, y + max_h * scale, UI0902_BG_COLOR);
|
||||||
|
|
||||||
if(volume_level == 0)
|
if(volume_level == 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -4,29 +4,29 @@
|
||||||
/* Auto-generated by tools/gen_ui0902_assets.py. W25Q128 resource map. */
|
/* Auto-generated by tools/gen_ui0902_assets.py. W25Q128 resource map. */
|
||||||
#define UI0902_RES_BASE 0x00100000UL
|
#define UI0902_RES_BASE 0x00100000UL
|
||||||
|
|
||||||
#define UI0902_ROW_UNIVERSAL_NOT_ADDR (UI0902_RES_BASE + 0x000000UL) /* 37296 bytes */
|
#define UI0902_ROW_UNIVERSAL_NOT_ADDR (UI0902_RES_BASE + 0x000000UL) /* 39072 bytes */
|
||||||
#define UI0902_ROW_UNIVERSAL_NOT_W 222
|
#define UI0902_ROW_UNIVERSAL_NOT_W 222
|
||||||
#define UI0902_ROW_UNIVERSAL_NOT_H 84
|
#define UI0902_ROW_UNIVERSAL_NOT_H 88
|
||||||
|
|
||||||
#define UI0902_ROW_UNIVERSAL_SEL_ADDR (UI0902_RES_BASE + 0x00A000UL) /* 37296 bytes */
|
#define UI0902_ROW_UNIVERSAL_SEL_ADDR (UI0902_RES_BASE + 0x00A000UL) /* 39072 bytes */
|
||||||
#define UI0902_ROW_UNIVERSAL_SEL_W 222
|
#define UI0902_ROW_UNIVERSAL_SEL_W 222
|
||||||
#define UI0902_ROW_UNIVERSAL_SEL_H 84
|
#define UI0902_ROW_UNIVERSAL_SEL_H 88
|
||||||
|
|
||||||
#define UI0902_ROW_NORMAL_NOT_ADDR (UI0902_RES_BASE + 0x014000UL) /* 37296 bytes */
|
#define UI0902_ROW_NORMAL_NOT_ADDR (UI0902_RES_BASE + 0x014000UL) /* 39072 bytes */
|
||||||
#define UI0902_ROW_NORMAL_NOT_W 222
|
#define UI0902_ROW_NORMAL_NOT_W 222
|
||||||
#define UI0902_ROW_NORMAL_NOT_H 84
|
#define UI0902_ROW_NORMAL_NOT_H 88
|
||||||
|
|
||||||
#define UI0902_ROW_NORMAL_SEL_ADDR (UI0902_RES_BASE + 0x01E000UL) /* 37296 bytes */
|
#define UI0902_ROW_NORMAL_SEL_ADDR (UI0902_RES_BASE + 0x01E000UL) /* 39072 bytes */
|
||||||
#define UI0902_ROW_NORMAL_SEL_W 222
|
#define UI0902_ROW_NORMAL_SEL_W 222
|
||||||
#define UI0902_ROW_NORMAL_SEL_H 84
|
#define UI0902_ROW_NORMAL_SEL_H 88
|
||||||
|
|
||||||
#define UI0902_ROW_EXPERT_NOT_ADDR (UI0902_RES_BASE + 0x028000UL) /* 37296 bytes */
|
#define UI0902_ROW_EXPERT_NOT_ADDR (UI0902_RES_BASE + 0x028000UL) /* 39072 bytes */
|
||||||
#define UI0902_ROW_EXPERT_NOT_W 222
|
#define UI0902_ROW_EXPERT_NOT_W 222
|
||||||
#define UI0902_ROW_EXPERT_NOT_H 84
|
#define UI0902_ROW_EXPERT_NOT_H 88
|
||||||
|
|
||||||
#define UI0902_ROW_EXPERT_SEL_ADDR (UI0902_RES_BASE + 0x032000UL) /* 37296 bytes */
|
#define UI0902_ROW_EXPERT_SEL_ADDR (UI0902_RES_BASE + 0x032000UL) /* 39072 bytes */
|
||||||
#define UI0902_ROW_EXPERT_SEL_W 222
|
#define UI0902_ROW_EXPERT_SEL_W 222
|
||||||
#define UI0902_ROW_EXPERT_SEL_H 84
|
#define UI0902_ROW_EXPERT_SEL_H 88
|
||||||
|
|
||||||
#define UI0902_ICON_UNIVERSAL_SEL_ADDR (UI0902_RES_BASE + 0x03C000UL) /* 2730 bytes */
|
#define UI0902_ICON_UNIVERSAL_SEL_ADDR (UI0902_RES_BASE + 0x03C000UL) /* 2730 bytes */
|
||||||
#define UI0902_ICON_UNIVERSAL_SEL_W 39
|
#define UI0902_ICON_UNIVERSAL_SEL_W 39
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,8 @@ def main() -> None:
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("--bin", default=DEFAULT_BIN)
|
parser.add_argument("--bin", default=DEFAULT_BIN)
|
||||||
parser.add_argument("--device", default="Cortex-M4")
|
parser.add_argument("--device", default="Cortex-M4")
|
||||||
|
parser.add_argument("--no-reset", action="store_true",
|
||||||
|
help="Skip hardware reset (device must already be running)")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if not os.path.isfile(args.bin):
|
if not os.path.isfile(args.bin):
|
||||||
|
|
@ -121,45 +123,47 @@ def main() -> None:
|
||||||
time.sleep(0.3)
|
time.sleep(0.3)
|
||||||
_ = rtt_read_text(jlink, 0.3)
|
_ = rtt_read_text(jlink, 0.3)
|
||||||
|
|
||||||
# Hardware reset clears any stuck flash_mode from a previous attempt
|
if not args.no_reset:
|
||||||
print("hardware reset...")
|
# Hardware reset clears any stuck flash_mode from a previous attempt
|
||||||
jlink.reset(halt=False)
|
print("hardware reset...")
|
||||||
time.sleep(3.5)
|
jlink.reset(halt=False)
|
||||||
# RTT CB may move after reboot — re-find
|
time.sleep(3.5)
|
||||||
try:
|
# RTT CB may move after reboot — re-find
|
||||||
jlink.rtt_stop()
|
try:
|
||||||
except Exception:
|
jlink.rtt_stop()
|
||||||
pass
|
except Exception:
|
||||||
cb = find_rtt_control_block(jlink)
|
pass
|
||||||
if cb is None:
|
cb = find_rtt_control_block(jlink)
|
||||||
raise SystemExit("RTT CB missing after reset")
|
if cb is None:
|
||||||
print(f"RTT CB @ 0x{cb:08X}")
|
raise SystemExit("RTT CB missing after reset")
|
||||||
jlink.rtt_start(cb)
|
print(f"RTT CB @ 0x{cb:08X}")
|
||||||
time.sleep(0.5)
|
jlink.rtt_start(cb)
|
||||||
_ = rtt_read_text(jlink, 0.5)
|
time.sleep(0.5)
|
||||||
|
_ = rtt_read_text(jlink, 0.5)
|
||||||
|
|
||||||
cmd = f"flash ui0902 {size}\n".encode("ascii")
|
cmd = f"flash ui0902 {size}\n".encode("ascii")
|
||||||
send_bytes(jlink, cmd)
|
send_bytes(jlink, cmd)
|
||||||
print("sent flash command, waiting GO...")
|
print("sent flash command, waiting GO...")
|
||||||
log = wait_for(jlink, "FLASH_UI0902_GO", 15.0)
|
log = wait_for(jlink, "FLASH_UI0902_GO", 20.0)
|
||||||
print(log.strip().splitlines()[-1])
|
print(log.strip().splitlines()[-1])
|
||||||
time.sleep(0.2)
|
time.sleep(0.2)
|
||||||
|
|
||||||
# wait for first byte confirmation after starting transfer
|
# Smaller chunks + brief pause so erase/write can keep up with RTT down-buffer
|
||||||
chunk = 256
|
chunk = 128
|
||||||
sent = 0
|
sent = 0
|
||||||
t0 = time.time()
|
t0 = time.time()
|
||||||
# prime first page then expect FLASH_RX
|
|
||||||
send_bytes(jlink, data[0:256])
|
send_bytes(jlink, data[0:256])
|
||||||
sent = 256
|
sent = 256
|
||||||
wait_for(jlink, "FLASH_RX", 15.0)
|
wait_for(jlink, "FLASH_RX", 20.0)
|
||||||
print("device receiving...")
|
print("device receiving...")
|
||||||
while sent < size:
|
while sent < size:
|
||||||
end = min(sent + chunk, size)
|
end = min(sent + chunk, size)
|
||||||
send_bytes(jlink, data[sent:end])
|
send_bytes(jlink, data[sent:end])
|
||||||
sent = end
|
sent = end
|
||||||
|
if sent % 256 == 0:
|
||||||
|
time.sleep(0.002)
|
||||||
if sent % 4096 == 0 or sent == size:
|
if sent % 4096 == 0 or sent == size:
|
||||||
log = wait_for(jlink, "FLASH_ACK", 30.0)
|
log = wait_for(jlink, "FLASH_ACK", 60.0)
|
||||||
if "FLASH_UI0902_OK" in log:
|
if "FLASH_UI0902_OK" in log:
|
||||||
print(log.strip().splitlines()[-1])
|
print(log.strip().splitlines()[-1])
|
||||||
print("Done. Mode-select should redraw with new assets.")
|
print("Done. Mode-select should redraw with new assets.")
|
||||||
|
|
@ -168,7 +172,7 @@ def main() -> None:
|
||||||
elapsed = time.time() - t0
|
elapsed = time.time() - t0
|
||||||
print(f" {sent}/{size} ({100.0 * sent / size:.1f}%) {elapsed:.1f}s")
|
print(f" {sent}/{size} ({100.0 * sent / size:.1f}%) {elapsed:.1f}s")
|
||||||
|
|
||||||
log = wait_for(jlink, "FLASH_UI0902_OK", 30.0)
|
log = wait_for(jlink, "FLASH_UI0902_OK", 60.0)
|
||||||
print(log.strip().splitlines()[-1])
|
print(log.strip().splitlines()[-1])
|
||||||
print("Done. Mode-select should redraw with new assets.")
|
print("Done. Mode-select should redraw with new assets.")
|
||||||
finally:
|
finally:
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,8 @@ OUT_BIN = OUT / "ui0902_res.bin"
|
||||||
RES_BASE = 0x00100000 # W25Q128 offset; avoids logo(0x0)/charge(0xCB70)/preset(<~0xA8B60) regions
|
RES_BASE = 0x00100000 # W25Q128 offset; avoids logo(0x0)/charge(0xCB70)/preset(<~0xA8B60) regions
|
||||||
ALIGN = 0x1000
|
ALIGN = 0x1000
|
||||||
|
|
||||||
# 222x89 rows do not fit 3x between status bar (26) and bottom bar (285); squash to 84px
|
# 模式选择页无底栏:三行按设计稿 0902-01 撑满(约 y=43/135/225,高 88)
|
||||||
ROW_RESIZE = (222, 84)
|
ROW_RESIZE = (222, 88)
|
||||||
|
|
||||||
MISANS = r"c:\Users\qjyu\Documents\SoundWalker\一诺国际吉他\Doc\UI\MiSans\MiSans 字体\MiSans-Medium.ttf"
|
MISANS = r"c:\Users\qjyu\Documents\SoundWalker\一诺国际吉他\Doc\UI\MiSans\MiSans 字体\MiSans-Medium.ttf"
|
||||||
PAGE_BG = (0, 8, 19) # #000813
|
PAGE_BG = (0, 8, 19) # #000813
|
||||||
|
|
|
||||||
|
|
@ -64,12 +64,11 @@ def text_center(d, cx, y, s, size, color=(255, 255, 255)):
|
||||||
# ---------- 1. mode select ----------
|
# ---------- 1. mode select ----------
|
||||||
p, d = new_page()
|
p, d = new_page()
|
||||||
draw_status_bar(p, d)
|
draw_status_bar(p, d)
|
||||||
rows = [("04_模式图标/完整版/模式界面栏背景-17.png", 30),
|
rows = [("04_模式图标/完整版/模式界面栏背景-19.png", 43),
|
||||||
("04_模式图标/完整版/模式界面栏背景-18.png", 116),
|
("04_模式图标/完整版/模式界面栏背景-17.png", 135),
|
||||||
("04_模式图标/完整版/模式界面栏背景-20.png", 202)]
|
("04_模式图标/完整版/模式界面栏背景-18.png", 225)]
|
||||||
for rel, y in rows:
|
for rel, y in rows:
|
||||||
paste_trans(p, load(rel).resize((222, 84), Image.LANCZOS), 9, y)
|
paste_trans(p, load(rel).resize((222, 88), Image.LANCZOS), 9, y)
|
||||||
draw_bottom_bar(p, d, sel=2)
|
|
||||||
p.save(OUT / "preview_01_mode_select.png")
|
p.save(OUT / "preview_01_mode_select.png")
|
||||||
|
|
||||||
# ---------- 2. mixer ----------
|
# ---------- 2. mixer ----------
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue