fix(power): prevent charge-boot long-press from auto power-off
Consume the same power-key hold used for soft-off charge boot before setting powon, and ignore stale POWOFF_CHARG after power-on so mode select stays on screen. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
65b0a84c4a
commit
125eb00aa3
|
|
@ -263,6 +263,8 @@ static void app_adc_charge_process(void)
|
||||||
{
|
{
|
||||||
/* 通知 UI 熄灭充电页并关主电 */
|
/* 通知 UI 熄灭充电页并关主电 */
|
||||||
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 0, 0);
|
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 0, 0);
|
||||||
|
/* 发消息可能让出 CPU:关电前再确认仍未开机,避免切断开机主电 */
|
||||||
|
if (!powon)
|
||||||
BSP_MainPowerEnable(0);
|
BSP_MainPowerEnable(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -211,6 +211,8 @@ void System_PowerOn(void)
|
||||||
LOG_I("PWR", "power_on begin");
|
LOG_I("PWR", "power_on begin");
|
||||||
s_pwr_rails_cut = 0u;
|
s_pwr_rails_cut = 0u;
|
||||||
s_pwr_off_grace_ms = 0u;
|
s_pwr_off_grace_ms = 0u;
|
||||||
|
/* 本次长按已用于开机:先消耗,再置 powon,防止 TMR7 ISR 把同一按压力即判为关机 */
|
||||||
|
Power_Key_ConsumePress();
|
||||||
/* 控制电源硬件;蓝牙按 NVM/系统设置开关恢复,勿强制常开 */
|
/* 控制电源硬件;蓝牙按 NVM/系统设置开关恢复,勿强制常开 */
|
||||||
BSP_MainPowerEnable(1);
|
BSP_MainPowerEnable(1);
|
||||||
BSP_DreamCorePowerEnable(1);
|
BSP_DreamCorePowerEnable(1);
|
||||||
|
|
@ -317,10 +319,18 @@ void System_PowerOff_Poll(void)
|
||||||
* TMR7 1ms(优先级高于伴奏 TMR6):与主循环解耦的关机键扫描。
|
* TMR7 1ms(优先级高于伴奏 TMR6):与主循环解耦的关机键扫描。
|
||||||
* 正常:请求优雅关机;超时未切轨 → 紧急断电并复位。
|
* 正常:请求优雅关机;超时未切轨 → 紧急断电并复位。
|
||||||
*/
|
*/
|
||||||
|
static uint16_t s_isr_hold_ms = 0;
|
||||||
|
static uint8_t s_isr_fired = 0;
|
||||||
|
|
||||||
|
/* 开机时消耗本次按键:同一次长按已用于开机,须松开后重新长按 2s 才关机。
|
||||||
|
* 须在 powon 置 true 前调用,避免 ISR 在开机瞬间把本次长按误判为关机。 */
|
||||||
|
void Power_Key_ConsumePress(void)
|
||||||
|
{
|
||||||
|
s_isr_fired = 1;
|
||||||
|
}
|
||||||
|
|
||||||
void Power_Key_IsrTick(void)
|
void Power_Key_IsrTick(void)
|
||||||
{
|
{
|
||||||
static uint16_t isr_hold_ms = 0;
|
|
||||||
static uint8_t isr_fired = 0;
|
|
||||||
flag_status st;
|
flag_status st;
|
||||||
|
|
||||||
/* RTT/USB 烧 ExtFlash 期间禁止软关机,避免长按/粘键打断 FLASH_ACK */
|
/* RTT/USB 烧 ExtFlash 期间禁止软关机,避免长按/粘键打断 FLASH_ACK */
|
||||||
|
|
@ -331,19 +341,19 @@ void Power_Key_IsrTick(void)
|
||||||
|
|
||||||
if (st == KEY_PRESS_LEVEL)
|
if (st == KEY_PRESS_LEVEL)
|
||||||
{
|
{
|
||||||
if (isr_hold_ms < 60000u)
|
if (s_isr_hold_ms < 60000u)
|
||||||
isr_hold_ms++;
|
s_isr_hold_ms++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
isr_hold_ms = 0;
|
s_isr_hold_ms = 0;
|
||||||
isr_fired = 0;
|
s_isr_fired = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 仅处理「开机态关机」;开机仍由主循环负责(需完整外设初始化) */
|
/* 仅处理「开机态关机」;开机仍由主循环负责(需完整外设初始化) */
|
||||||
if (powon && !isr_fired && isr_hold_ms >= PWR_OFF_HOLD_MS)
|
if (powon && !s_isr_fired && s_isr_hold_ms >= PWR_OFF_HOLD_MS)
|
||||||
{
|
{
|
||||||
isr_fired = 1;
|
s_isr_fired = 1;
|
||||||
System_RequestPowerOff();
|
System_RequestPowerOff();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -169,6 +169,7 @@ void Power_Key_Scan(void);
|
||||||
void Power_Key_IsrTick(void);
|
void Power_Key_IsrTick(void);
|
||||||
void Power_Key_FaultLoop(void);
|
void Power_Key_FaultLoop(void);
|
||||||
void Power_Key_WatchdogInit(void);
|
void Power_Key_WatchdogInit(void);
|
||||||
|
void Power_Key_ConsumePress(void);
|
||||||
void PowerOff_CutRails(void);
|
void PowerOff_CutRails(void);
|
||||||
void AutoPowerOff_Scan(void);
|
void AutoPowerOff_Scan(void);
|
||||||
void System_PowerOn(void);
|
void System_PowerOn(void);
|
||||||
|
|
|
||||||
17
UI/UI_Idle.c
17
UI/UI_Idle.c
|
|
@ -141,22 +141,25 @@ void Touch_Mode_Select_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
extern uint8_t bat_init_done;
|
extern uint8_t bat_init_done;
|
||||||
|
/* 关机充电页已绘制标志:POWER_ON 需清除,以便再次软关机充电时重绘 */
|
||||||
|
static bool s_charge_ui_drawn = false;
|
||||||
void IdleProcess(DisplayTaskMessage_Type msg)
|
void IdleProcess(DisplayTaskMessage_Type msg)
|
||||||
{
|
{
|
||||||
uint8_t vol;
|
|
||||||
switch (msg.MessageType)
|
switch (msg.MessageType)
|
||||||
{
|
{
|
||||||
case MSG_ID_POWER_ON :
|
case MSG_ID_POWER_ON :
|
||||||
|
/* 充电软关机开机:滞后的拔电消息可能已切主电/关显示,强制恢复 */
|
||||||
|
BSP_MainPowerEnable(1);
|
||||||
|
LCD_WR_REG(0x29); /* Display ON */
|
||||||
|
s_charge_ui_drawn = false;
|
||||||
LCD_BLK_Set();
|
LCD_BLK_Set();
|
||||||
LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_BOOT_LOGO_W, UI0902_BOOT_LOGO_H,
|
LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_BOOT_LOGO_W, UI0902_BOOT_LOGO_H,
|
||||||
UI0902_BOOT_LOGO_ADDR);
|
UI0902_BOOT_LOGO_ADDR);
|
||||||
BSP_SelectAdcChannel(6);
|
|
||||||
/* 让出 CPU,避免忙等卡住触摸/主循环线程 */
|
/* 让出 CPU,避免忙等卡住触摸/主循环线程 */
|
||||||
rt_thread_mdelay(1000);
|
rt_thread_mdelay(1000);
|
||||||
LoadConfig();
|
LoadConfig();
|
||||||
vol = ADC_ReadChannel(ADC_CHANNEL_1)>>5;
|
/* 主音量不在此现场切通道读 ADC(会与扫描任务串通道):
|
||||||
app_adc_sync_volume(vol);
|
* 待 StartScanTask 后由 MasterVolume_Reapply 统一补发 */
|
||||||
Send_volume(vol);
|
|
||||||
|
|
||||||
UI_DrawModeSelectScreen();
|
UI_DrawModeSelectScreen();
|
||||||
TM1629D_AllLedOn(LED_COLOR_G);
|
TM1629D_AllLedOn(LED_COLOR_G);
|
||||||
|
|
@ -227,7 +230,9 @@ void IdleProcess(DisplayTaskMessage_Type msg)
|
||||||
|
|
||||||
case MSG_ID_POWOFF_CHARG:
|
case MSG_ID_POWOFF_CHARG:
|
||||||
{
|
{
|
||||||
static bool s_charge_ui_drawn = false;
|
/* 已开机:忽略滞后的关机充电消息,勿覆盖模式选择页或切断主电 */
|
||||||
|
if (powon)
|
||||||
|
break;
|
||||||
if(!s_charge_ui_drawn)
|
if(!s_charge_ui_drawn)
|
||||||
{
|
{
|
||||||
uint8_t peek[4];
|
uint8_t peek[4];
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue