252 lines
6.7 KiB
C
252 lines
6.7 KiB
C
#include "system/includes.h"
|
|
#include "media/includes.h"
|
|
#include "app_config.h"
|
|
#include "app_action.h"
|
|
#include "tone_player.h"
|
|
#include "asm/charge.h"
|
|
#include "app_charge.h"
|
|
#include "app_main.h"
|
|
#include "ui_manage.h"
|
|
#include "vm.h"
|
|
#include "app_chargestore.h"
|
|
#include "app_umidigi_chargestore.h"
|
|
#include "app_testbox.h"
|
|
#include "user_cfg.h"
|
|
#include "default_event_handler.h"
|
|
|
|
#if TCFG_ANC_BOX_ENABLE
|
|
#include "app_ancbox.h"
|
|
#endif
|
|
|
|
#define LOG_TAG_CONST APP_IDLE
|
|
#define LOG_TAG "[APP_IDLE]"
|
|
#define LOG_ERROR_ENABLE
|
|
#define LOG_DEBUG_ENABLE
|
|
#define LOG_INFO_ENABLE
|
|
/* #define LOG_DUMP_ENABLE */
|
|
#define LOG_CLI_ENABLE
|
|
#include "debug.h"
|
|
|
|
#if CHARGING_CLEAN_PHONE_INFO
|
|
#include "key_event_deal.h"
|
|
#include "btstack/btstack_typedef.h"
|
|
#endif
|
|
|
|
#ifdef CONFIG_MEDIA_DEVELOP_ENABLE
|
|
#define AUDIO_PLAY_EVENT_END AUDIO_DEC_EVENT_END
|
|
#endif /* #ifdef CONFIG_MEDIA_DEVELOP_ENABLE */
|
|
|
|
static void app_idle_enter_softoff(void)
|
|
{
|
|
//ui_update_status(STATUS_POWEROFF);
|
|
while (get_ui_busy_status()) {
|
|
log_info("ui_status:%d\n", get_ui_busy_status());
|
|
}
|
|
#if TCFG_CHARGE_ENABLE
|
|
if (get_lvcmp_det() && (0 == get_charge_full_flag())) {
|
|
log_info("charge inset, system reset!\n");
|
|
cpu_reset();
|
|
}
|
|
#endif
|
|
|
|
#if TCFG_SMART_VOICE_ENABLE
|
|
extern void audio_smart_voice_detect_close(void);
|
|
audio_smart_voice_detect_close();
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_BOARD_AISPEECH_VAD_ASR
|
|
extern void ais_platform_asr_close(void);
|
|
ais_platform_asr_close();
|
|
#endif /*CONFIG_BOARD_AISPEECH_VAD_ASR*/
|
|
|
|
extern void dac_power_off(void);
|
|
dac_power_off(); // 关机前先关dac
|
|
|
|
power_set_soft_poweroff();
|
|
}
|
|
|
|
static int app_idle_tone_event_handler(struct device_event *dev)
|
|
{
|
|
int ret = false;
|
|
|
|
switch (dev->event) {
|
|
case AUDIO_PLAY_EVENT_END:
|
|
if (app_var.goto_poweroff_flag) {
|
|
log_info("audio_play_event_end,enter soft poweroff");
|
|
app_idle_enter_softoff();
|
|
}
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
#if CHARGING_CLEAN_PHONE_INFO
|
|
|
|
#define IDLE_CLEAN_INFO_CNT 20
|
|
|
|
static u8 idle_key_table[KEY_NUM_MAX][KEY_EVENT_MAX] = {
|
|
//SHORT LONG HOLD UP DOUBLE TRIPLE
|
|
{KEY_NULL, KEY_CLEAN_PHONE_INFO, KEY_CLEAN_PHONE_INFO_HOLD, KEY_CLEAN_PHONE_INFO_UP, KEY_NULL, KEY_NULL}, //KEY_0
|
|
};
|
|
int app_idle_key_event_handler(struct sys_event *event)
|
|
{
|
|
int ret = false;
|
|
struct key_event *key = &event->u.key;
|
|
u8 key_event = idle_key_table[key->value][key->event];
|
|
static u16 key_hold_cnt = 0;
|
|
static u8 key_press_flag = 0;
|
|
|
|
switch (key_event) {
|
|
case KEY_CLEAN_PHONE_INFO:
|
|
log_info("KEY_CLEAN_PHONE_INFO");
|
|
key_hold_cnt = 0;
|
|
key_press_flag = 1;
|
|
P33_CON_SET(P3_PINR_CON, 0, 1, 0);
|
|
break;
|
|
case KEY_CLEAN_PHONE_INFO_HOLD:
|
|
key_hold_cnt++;
|
|
if (key_press_flag) {
|
|
if (key_hold_cnt == IDLE_CLEAN_INFO_CNT) {
|
|
log_info("KEY_CLEAN_PHONE_INFO_HOLD");
|
|
extern void delete_link_key_for_app(bd_addr_t *bd_addr, u8 id);
|
|
delete_link_key_for_app(NULL, 0);
|
|
tone_play(TONE_SIN_NORMAL, 1);
|
|
key_press_flag = 0;
|
|
}
|
|
}
|
|
break;
|
|
case KEY_CLEAN_PHONE_INFO_UP:
|
|
log_info("KEY_CLEAN_PHONE_INFO_UP");
|
|
key_hold_cnt = 0;
|
|
key_press_flag = 0;
|
|
P33_CON_SET(P3_PINR_CON, 0, 1, 1);
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
#endif
|
|
|
|
static int idle_event_handler(struct application *app, struct sys_event *event)
|
|
{
|
|
switch (event->type) {
|
|
case SYS_KEY_EVENT:
|
|
#if CHARGING_CLEAN_PHONE_INFO
|
|
/* log_info("idle_event_handler:SYS_KEY_EVENT\n"); */
|
|
app_idle_key_event_handler(event);
|
|
#endif
|
|
return 0;
|
|
case SYS_BT_EVENT:
|
|
return 0;
|
|
case SYS_DEVICE_EVENT:
|
|
if ((u32)event->arg == DEVICE_EVENT_FROM_CHARGE) {
|
|
#if TCFG_CHARGE_ENABLE
|
|
return app_charge_event_handler(&event->u.dev);
|
|
#endif
|
|
}
|
|
if ((u32)event->arg == DEVICE_EVENT_FROM_TONE) {
|
|
return app_idle_tone_event_handler(&event->u.dev);
|
|
}
|
|
#if TCFG_CHARGESTORE_ENABLE
|
|
if ((u32)event->arg == DEVICE_EVENT_CHARGE_STORE) {
|
|
app_chargestore_event_handler(&event->u.chargestore);
|
|
}
|
|
#endif
|
|
#if TCFG_UMIDIGI_BOX_ENABLE
|
|
else if ((u32)event->arg == DEVICE_EVENT_UMIDIGI_CHARGE_STORE) {
|
|
app_umidigi_chargestore_event_handler(&event->u.umidigi_chargestore);
|
|
}
|
|
#endif
|
|
#if TCFG_TEST_BOX_ENABLE
|
|
if ((u32)event->arg == DEVICE_EVENT_TEST_BOX) {
|
|
app_testbox_event_handler(&event->u.testbox);
|
|
}
|
|
#endif
|
|
#if TCFG_ANC_BOX_ENABLE
|
|
if ((u32)event->arg == DEVICE_EVENT_FROM_ANC) {
|
|
return app_ancbox_event_handler(&event->u.ancbox);
|
|
}
|
|
#endif
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
#if (CONFIG_BT_BACKGROUND_ENABLE || TCFG_PC_ENABLE)
|
|
#if(!TCFG_ONLY_PC_ENABLE)
|
|
default_event_handler(event);
|
|
#endif
|
|
#endif
|
|
|
|
return false;
|
|
}
|
|
|
|
static int idle_state_machine(struct application *app, enum app_state state,
|
|
struct intent *it)
|
|
{
|
|
int ret;
|
|
switch (state) {
|
|
case APP_STA_CREATE:
|
|
break;
|
|
case APP_STA_START:
|
|
if (!it) {
|
|
break;
|
|
}
|
|
switch (it->action) {
|
|
case ACTION_IDLE_MAIN:
|
|
log_info("ACTION_IDLE_MAIN\n");
|
|
if (app_var.goto_poweroff_flag) {
|
|
syscfg_write(CFG_MUSIC_VOL, &app_var.music_volume, 1);
|
|
/* tone_play(TONE_POWER_OFF); */
|
|
os_taskq_flush();
|
|
STATUS *p_tone = get_tone_config();
|
|
ret = tone_play_index(p_tone->power_off, 1);
|
|
printf("power_off tone play ret:%d", ret);
|
|
if (ret) {
|
|
if (app_var.goto_poweroff_flag) {
|
|
log_info("power_off tone play err,enter soft poweroff");
|
|
app_idle_enter_softoff();
|
|
}
|
|
}
|
|
}
|
|
#if CHARGING_CLEAN_PHONE_INFO
|
|
else {
|
|
sys_key_event_enable();
|
|
}
|
|
#endif
|
|
break;
|
|
case ACTION_IDLE_POWER_OFF:
|
|
os_taskq_flush();
|
|
syscfg_write(CFG_MUSIC_VOL, &app_var.music_volume, 1);
|
|
break;
|
|
}
|
|
break;
|
|
case APP_STA_PAUSE:
|
|
break;
|
|
case APP_STA_RESUME:
|
|
break;
|
|
case APP_STA_STOP:
|
|
break;
|
|
case APP_STA_DESTROY:
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct application_operation app_idle_ops = {
|
|
.state_machine = idle_state_machine,
|
|
.event_handler = idle_event_handler,
|
|
};
|
|
|
|
REGISTER_APPLICATION(app_app_idle) = {
|
|
.name = "idle",
|
|
.action = ACTION_IDLE_MAIN,
|
|
.ops = &app_idle_ops,
|
|
.state = APP_STA_DESTROY,
|
|
};
|
|
|
|
|