diff --git a/APP/app_adc.c b/APP/app_adc.c index b4667e3..d83d0c2 100644 --- a/APP/app_adc.c +++ b/APP/app_adc.c @@ -214,6 +214,16 @@ static void app_adc_key_process(uint8_t idx) } /* ==================== ADC1 in4 ==================== */ +/* 快速探测 Type-C / USB 是否接入(关机开机路径共用) */ +bool app_adc_usb_is_plugged(void) +{ + uint16_t val; + BSP_SelectAdcChannel(4); /* E_ADC1_FUNCTION_USB_CHECK */ + Delay_us(20); + val = ADC_ReadChannel(ADC_CHANNEL_1) >> 5; + return (val > 80) ? true : false; +} + static void app_adc_charge_process(void) { uint16_t val = ADC_ReadChannel(ADC_CHANNEL_1) >> 5; @@ -224,11 +234,17 @@ static void app_adc_charge_process(void) if (usb_charging_state != 1) { usb_charging_state = 1; + usb_charging_laststate = 1; if (powon) { MainTask_Sendmsg(MSG_ID_CHARG, usb_charging_state, usb_charging_laststate, 0); } - usb_charging_laststate = 1; + else + { + /* 关机态插电:立即进全屏充电页,勿走开机 Logo */ + LOG_I("CHG", "usb plug while soft-off → charge UI"); + MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, usb_charging_state, 0); + } } } /* 拔掉充电:阈值40,迟滞防抖,仅状态跳变时执行一次 */ @@ -237,19 +253,18 @@ static void app_adc_charge_process(void) if (usb_charging_state != 0) { usb_charging_state = 0; - - // 开机场景:发送状态消息 + usb_charging_laststate = 0; + if (powon) { - MainTask_Sendmsg(MSG_ID_CHARG, usb_charging_state, usb_charging_laststate, 0); + MainTask_Sendmsg(MSG_ID_CHARG, usb_charging_state, 1, 0); } - // 关机场景:直接切断主电源 else { + /* 通知 UI 熄灭充电页并关主电 */ + MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 0, 0); BSP_MainPowerEnable(0); } - - usb_charging_laststate = 0; } } } diff --git a/APP/app_adc.h b/APP/app_adc.h index abb03b1..9a7fda1 100644 --- a/APP/app_adc.h +++ b/APP/app_adc.h @@ -24,4 +24,5 @@ extern bool usb_charging_laststate; extern uint8_t percentage; void app_adc_scan_all(void); void app_adc_in1_scan_part(uint8_t channel); +bool app_adc_usb_is_plugged(void); #endif \ No newline at end of file diff --git a/Global/Global.c b/Global/Global.c index 219467c..40ea37e 100644 --- a/Global/Global.c +++ b/Global/Global.c @@ -228,6 +228,25 @@ static void PowerOff(void) CurrUIProcress = IdleProcess; MainTask_Sendmsg(MSG_ID_POWER_OFF, 0, 0, 0); LOG_I("PWR", "power_off done (soft-off, no reset)"); + + /* 关机时若已插着 Type-C,立刻进充电画面 */ + { + uint8_t i; + for (i = 0; i < 4; i++) + { + app_adc_in1_scan_part(4); + if (usb_charging_state || app_adc_usb_is_plugged()) + break; + rt_thread_mdelay(5); + } + if (usb_charging_state || app_adc_usb_is_plugged()) + { + usb_charging_state = 1; + usb_charging_laststate = 1; + LOG_I("PWR", "soft-off with USB → charge UI"); + MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 1, 0); + } + } } void Power_Key_Scan() @@ -236,13 +255,32 @@ void Power_Key_Scan() uint32_t now = rt_tick_get(); uint32_t holdtick = 0; - /* 复位/烧录后自动开机一次,避免黑屏干等长按;正常关机后下电再上电仍走此路径 */ + /* 复位/烧录后:无 USB 则自动开机一次;有 Type-C 则进关机充电画面(勿进 Logo) */ if (powon == false && pwr_key_state == KEY_STATE_IDLE && pwr_press_tick == 0) { static uint8_t s_auto_poweron_pending = 1; if (s_auto_poweron_pending) { + uint8_t i; s_auto_poweron_pending = 0; + /* 多采几次 USB 检测,避免上电瞬间误判 */ + for (i = 0; i < 8; i++) + { + app_adc_in1_scan_part(4); + if (usb_charging_state || app_adc_usb_is_plugged()) + break; + rt_thread_mdelay(5); + } + if (usb_charging_state || app_adc_usb_is_plugged()) + { + usb_charging_state = 1; + usb_charging_laststate = 1; + LOG_I("PWR", "boot with USB → charge UI (no logo)"); + CurrUIProcress = IdleProcess; + MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 1, 0); + pwr_key_state = KEY_STATE_NONE; + return; + } LOG_I("PWR", "auto power_on"); PowerOn(); pwr_key_state = KEY_STATE_NONE; /* 忽略开机瞬间可能残留的按键电平 */ diff --git a/UI/UI_Idle.c b/UI/UI_Idle.c index dda0187..72e24a0 100644 --- a/UI/UI_Idle.c +++ b/UI/UI_Idle.c @@ -253,8 +253,8 @@ void IdleProcess(DisplayTaskMessage_Type msg) case MSG_ID_POWOFF_CHARG: { - static bool flag = 0; - if(flag == 0) + static bool s_charge_ui_drawn = false; + if(!s_charge_ui_drawn) { BSP_MainPowerEnable(1); LCD_WR_REG(0x29); //Display on @@ -263,7 +263,7 @@ void IdleProcess(DisplayTaskMessage_Type msg) LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_CHARGE_SCREEN_W, UI0902_CHARGE_SCREEN_H, UI0902_CHARGE_SCREEN_ADDR); LCD_BLK_Set(); - flag = 1; + s_charge_ui_drawn = true; } if(usb_charging_state) { @@ -274,8 +274,14 @@ void IdleProcess(DisplayTaskMessage_Type msg) LCD_ShowString_AutoAlign(0, 240, 270, Info, LCD_ALIGN_CENTER, WHITE, UI0902_BG_COLOR, 0, 28); } - //else - //BSP_MainPowerEnable(0); + else + { + /* 关机充电中拔掉:熄屏,允许下次再进充电页 */ + LCD_BLK_Clr(); + LCD_FillByColor(0, 0, 240, 320, BLACK); + BSP_MainPowerEnable(0); + s_charge_ui_drawn = false; + } } break;