KT24-1110_65E-HA-651B/apps/soundbox/task_manager/power_off/power_off.c

295 lines
8.2 KiB
C
Raw Permalink Normal View History

2024-11-10 10:44:17 +00:00
/*************************************************************
poweroff
power_set_soft_poweroff();
**************************************************************/
#include "common/power_off.h"
#include "bt_tws.h"
#include <stdlib.h>
#include "app_config.h"
#include "app_task.h"
#include "system/includes.h"
#include "media/includes.h"
#include "app_power_manage.h"
#include "app_chargestore.h"
#include "btstack/avctp_user.h"
#include "app_main.h"
#include "ui/ui_api.h"
#include "ui_manage.h"
#include "tone_player.h"
#include "user_cfg.h"
#include "bt_tws.h"
#include "bt.h"
#define LOG_TAG_CONST APP_ACTION
#define LOG_TAG "[APP_ACTION]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
#define POWER_OFF_CNT 10
static u8 goto_poweroff_cnt = 0;
u8 goto_poweroff_first_flag = 0;
static u8 goto_poweroff_flag = 0;
static u8 power_off_tone_play_flag = 0;
//*----------------------------------------------------------------------------*/
/**@brief poweroff 长按等待 关闭蓝牙
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void power_off_deal(struct sys_event *event, u8 step)
{
switch (step) {
case 0:
case 1:
if (goto_poweroff_first_flag == 0) {
goto_poweroff_first_flag = 1;
goto_poweroff_cnt = 0;
goto_poweroff_flag = 0;
#if TCFG_APP_BT_EN
if ((BT_STATUS_CONNECTING == get_bt_connect_status()) ||
(BT_STATUS_TAKEING_PHONE == get_bt_connect_status()) ||
(BT_STATUS_PLAYING_MUSIC == get_bt_connect_status())) {
/* if (get_call_status() != BT_CALL_HANGUP) {
log_info("call hangup\n");
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
goto_poweroff_first_flag = 0;
goto_poweroff_flag = 0;
break;
} */
if ((get_call_status() == BT_CALL_INCOMING) ||
(get_call_status() == BT_CALL_OUTGOING)) {
log_info("key call reject\n");
/* user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL); */
goto_poweroff_first_flag = 0;
goto_poweroff_flag = 0;
break;
} else if (get_call_status() == BT_CALL_ACTIVE) {
log_info("key call hangup\n");
/* user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL); */
goto_poweroff_first_flag = 0;
goto_poweroff_flag = 0;
break;
}
}
#if (TCFG_USER_TWS_ENABLE && CONFIG_TWS_POWEROFF_SAME_TIME == 0)
if ((u32)event->arg == KEY_EVENT_FROM_TWS) {
goto_poweroff_first_flag = 0;
break;
}
#endif
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
#endif
goto_poweroff_flag = 1;
break;
}
#if (TCFG_USER_TWS_ENABLE && CONFIG_TWS_POWEROFF_SAME_TIME == 0)
if ((u32)event->arg == KEY_EVENT_FROM_TWS) {
break;
}
#endif
log_info("poweroff flag:%d cnt:%d\n", goto_poweroff_flag, goto_poweroff_cnt);
if (goto_poweroff_flag) {
goto_poweroff_cnt++;
#if CONFIG_TWS_POWEROFF_SAME_TIME
if (goto_poweroff_cnt == POWER_OFF_CNT) {
if (get_tws_sibling_connect_state()) {
if ((u32)event->arg != KEY_EVENT_FROM_TWS) {
tws_api_sync_call_by_uuid('T', SYNC_CMD_POWER_OFF_TOGETHER, TWS_SYNC_TIME_DO);
}
} else {
power_off_tone_play_flag = 1;
sys_enter_soft_poweroff(NULL);
}
}
#else
if (goto_poweroff_cnt >= POWER_OFF_CNT) {
goto_poweroff_cnt = 0;
#if TCFG_APP_BT_EN
sys_enter_soft_poweroff(NULL);
#else
app_var.goto_poweroff_flag = 1;
app_task_switch_to(APP_POWEROFF_TASK);
#endif
}
#endif //CONFIG_TWS_POWEROFF_SAME_TIME
}
break;
}
}
//*----------------------------------------------------------------------------*/
/**@brief poweroff 流程消息事件处理
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static int poweroff_sys_event_handler(struct sys_event *event)
{
switch (event->type) {
case SYS_KEY_EVENT:
return true;
case SYS_BT_EVENT:
return true;
case SYS_DEVICE_EVENT:
return true;
default:
return true;
}
}
//*----------------------------------------------------------------------------*/
/**@brief poweroff 等待关机显示完毕
@param
@return
@note */
/*----------------------------------------------------------------------------*/
static inline void poweroff_wait_ui()
{
#if TCFG_UI_ENABLE
u8 count = 0;
__retry:
if (UI_GET_WINDOW_ID() != ID_WINDOW_POWER_OFF) {
os_time_dly(10);//增加延时防止没有关显示
if (count < 3) {
goto __retry;
}
count++;
}
UI_HIDE_CURR_WINDOW();
#if TCFG_SPI_LCD_ENABLE
extern void ui_backlight_close(void);
ui_backlight_close();
#endif
#endif
}
static void poweroff_done(void)
{
poweroff_wait_ui();//等待关机显示完毕
while (get_ui_busy_status()) {
}
#if (TCFG_CHARGE_ENABLE && TCFG_CHARGE_POWERON_ENABLE)
extern u8 get_charge_online_flag(void);
if (get_charge_online_flag()) {
cpu_reset();
} else {
power_set_soft_poweroff();
}
#else
power_set_soft_poweroff();
#endif
}
void poweroff_tone_end(void *priv, int flag)
{
if (app_var.goto_poweroff_flag) {
log_info("audio_play_event_end,enter soft poweroff");
poweroff_done();
}
}
//*----------------------------------------------------------------------------*/
/**@brief poweroff 流程启动
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void poweroff_app_start()
{
int ret = false;
if (app_var.goto_poweroff_flag) {
UI_SHOW_WINDOW(ID_WINDOW_POWER_OFF);
syscfg_write(CFG_MUSIC_VOL, &app_var.music_volume, 1);
os_taskq_flush();
#if (CONFIG_TWS_POWEROFF_SAME_TIME)
if (power_off_tone_play_flag == 0) {
//不在这里播放提示音
poweroff_done();
} else
#endif/*CONFIG_TWS_POWEROFF_SAME_TIME*/
{
ret = tone_play_with_callback_by_name(tone_table[IDEX_TONE_POWER_OFF], 1,
poweroff_tone_end, (void *)IDEX_TONE_POWER_OFF);
if (ret) {
y_printf("power_off tone play err,enter soft poweroff");
poweroff_done();
}
}
}
}
//*----------------------------------------------------------------------------*/
/**@brief poweroff 主任务
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void app_poweroff_task()
{
int res;
int msg[32];
poweroff_app_start();
while (1) {
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
switch (msg[0]) {
case APP_MSG_SYS_EVENT:
if (poweroff_sys_event_handler((struct sys_event *)(&msg[1])) == false) {
app_default_event_deal((struct sys_event *)(&msg[1])); //由common统一处理
}
break;
default:
break;
}
/* if (app_task_exitting()) {
poweroff_task_close();
return;
} */
}
}
extern void sdx_dev_entry_lowpower(const char *sdx_name);
u8 poweroff_entry_cbfun(void)
{
#if TCFG_SD0_ENABLE
sdx_dev_entry_lowpower("sd0");
#endif
#if TCFG_SD1_ENABLE
sdx_dev_entry_lowpower("sd1");
#endif
return 0;
}