286 lines
6.8 KiB
C
286 lines
6.8 KiB
C
#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;
|
||
}
|
||
|
||
|