Files
99_7018_lmx/apps/earphone/app_task_switch.c
2025-10-29 13:10:02 +08:00

286 lines
6.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "system/includes.h"
#include "app_config.h"
#include "app_task.h"
#include "app_music.h"
#include "app_action.h"
#include "earphone.h"
#include "bt_background.h"
u8 app_curr_task = 0;
u8 app_next_task = 0;
u8 app_prev_task = 0;
extern int pc_app_check(void);
const u8 app_task_list[] = {
APP_BT_TASK,
#if TCFG_APP_MUSIC_EN
APP_MUSIC_TASK,
#endif
#if TCFG_PC_ENABLE
APP_PC_TASK,
#endif
#if TCFG_APP_AUX_EN
APP_AUX_TASK,
#endif
};
const u8 app_task_action_tab[] = {
ACTION_EARPHONE_MAIN,
#if TCFG_APP_MUSIC_EN
ACTION_MUSIC_MAIN,
#endif
#if TCFG_PC_ENABLE
ACTION_PC_MAIN,
#endif
#if TCFG_APP_AUX_EN
ACTION_AUX_MAIN,
#endif
};
const char *app_task_name_tab[] = {
APP_NAME_BT,
#if TCFG_APP_MUSIC_EN
APP_NAME_MUSIC,
#endif
#if TCFG_PC_ENABLE
APP_NAME_PC,
#endif
#if TCFG_APP_AUX_EN
APP_NAME_AUX,
#endif
};
//*----------------------------------------------------------------------------*/
/**@brief 模式进入检查
@param app_task:目标模式
@return TRUE可以进入 FALSE不可以进入
@note 例如一些需要设备在线的任务(music)
如果设备在线可以进入, 没有设备在线不进入可以在这里处理
*/
/*----------------------------------------------------------------------------*/
int app_task_switch_check(u8 app_task)
{
int ret = false;
printf("app_task %x\n", app_task);
switch (app_task) {
case APP_BT_TASK:
ret = true;
break;
#if TCFG_APP_MUSIC_EN
case APP_MUSIC_TASK:
ret = music_app_check();
break;
#endif
#if TCFG_PC_ENABLE
case APP_PC_TASK:
ret = pc_app_check();
break;
#endif
#if TCFG_APP_AUX_EN
case APP_AUX_TASK:
ret = true;
break;
#endif
default:
ret = false;
break;
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief app_core_back_to_prev_app后检查
@param void
@return TRUE:当前模式对应的设备在线, FALSE:当前模式的设备不在线却进入了模式
@note 用于app_core_back_to_prev_app后的检查
*/
/*----------------------------------------------------------------------------*/
int app_core_back_to_prev_app_over_check(void)
{
int ret = false;
struct application *app = get_current_app();
if (app && app->state == APP_STA_START) {
if (app->name == APP_NAME_BT) {
} else if (app->name == APP_NAME_BT) {
ret = true;
} else if (app->name == APP_NAME_MUSIC) {
#if TCFG_APP_MUSIC_EN
ret = music_app_check();
#endif
} else if (app->name == APP_NAME_PC) {
#if TCFG_PC_ENABLE
ret = pc_app_check();
#endif
} else if (app->name == APP_NAME_AUX) {
#if TCFG_APP_AUX_EN
ret = true;
#endif
} else {
ret = false;
}
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief 模式退出检查
@param curr_task:当前模式
@return TRUE可以退出 FALSE不可以退出
@note
*/
/*----------------------------------------------------------------------------*/
static int app_task_switch_exit_check(u8 curr_task)
{
int ret = false;
switch (curr_task) {
case APP_BT_TASK:
ret = bt_app_exit_check();
break;
default:
ret = TRUE;
break;
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief 切换到指定模式
@param app_task:指定模式
@return
@note
*/
/*----------------------------------------------------------------------------*/
int app_task_switch_to(u8 app_task, int priv)
{
struct intent it;
//相同模式不切
if (app_curr_task == app_task) {
return false;
}
//不在线不切
if (!app_task_switch_check(app_task)) {
return false;
}
//上一个模式不允许退出不切
if (!app_task_switch_exit_check(app_curr_task)) {
return false;
}
printf("cur --- %x \n", app_curr_task);
printf("new +++ %x \n", app_task);
app_prev_task = app_curr_task;
app_curr_task = app_task;
#if CONFIG_BT_BACKGROUND_ENABLE
//bt_in_background()为0时切到蓝牙模式需要初始化(关机插pc切模式的情况)
if ((app_task == APP_BT_TASK) && bt_in_background()) {
if (priv == ACTION_A2DP_START) {
bt_switch_to_foreground(ACTION_A2DP_START, 1);
} else if (priv == ACTION_DO_NOTHING) {
bt_switch_to_foreground(ACTION_DO_NOTHING, 1);
} else {
bt_switch_to_foreground(ACTION_TONE_PLAY, 1);
}
return true; //切到蓝牙前台
}
#endif
#if CONFIG_BT_BACKGROUND_ENABLE
if (app_prev_task != APP_BT_TASK)
#endif
{
init_intent(&it);
it.action = ACTION_BACK;
start_app(&it);
}
init_intent(&it);
it.name = app_task_name_tab[app_task];
it.action = app_task_action_tab[app_task];
start_app(&it);
return true;
}
//*----------------------------------------------------------------------------*/
/**@brief 切换到下一个模式
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void app_task_switch_next(void)
{
int i = 0;
int cur_index = 0;
for (cur_index = 0; cur_index < ARRAY_SIZE(app_task_list); cur_index++) {
if (app_curr_task == app_task_list[cur_index]) {//遍历当前索引
break;
}
}
for (i = cur_index ;;) { //遍历一圈
if (++i >= ARRAY_SIZE(app_task_list)) {
i = 0;
}
if (i == cur_index) {
return;
}
if (app_task_switch_to(app_task_list[i], NULL_VALUE)) {
return;
}
}
}
//*----------------------------------------------------------------------------*/
/**@brief 切换到上一个模式
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void app_task_switch_prev(void)
{
int i = 0;
int cur_index = 0;
for (cur_index = 0; cur_index < ARRAY_SIZE(app_task_list); cur_index++) {
if (app_curr_task == app_task_list[cur_index]) {//遍历当前索引
break;
}
}
for (i = cur_index; ;) { //遍历一圈
if (i-- == 0) {
i = ARRAY_SIZE(app_task_list) - 1;
}
if (i == cur_index) {
return;
}
if (app_task_switch_to(app_task_list[i], NULL_VALUE)) {
return;
}
}
}
//*----------------------------------------------------------------------------*/
/**@brief 获取当前模式
@param
@return 当前模式id
@note
*/
/*----------------------------------------------------------------------------*/
u8 app_get_curr_task(void)
{
return app_curr_task;
}