336 lines
8.1 KiB
C
336 lines
8.1 KiB
C
#include "app_config.h"
|
||
#include "app_task.h"
|
||
#include "app_msg.h"
|
||
#include "key_driver.h"
|
||
#include "key_event_deal.h"
|
||
#include "audio_recorder_mix.h"
|
||
|
||
///模式配置表,这里可以配置切换模式的顺序,方案根据需求定义
|
||
static const u8 app_task_list[] = {
|
||
#if TCFG_APP_BT_EN
|
||
APP_BT_TASK,
|
||
#endif
|
||
#if TCFG_APP_MUSIC_EN
|
||
APP_MUSIC_TASK,
|
||
#endif
|
||
#if TCFG_APP_FM_EN
|
||
APP_FM_TASK,
|
||
#endif
|
||
#if TCFG_APP_RECORD_EN
|
||
APP_RECORD_TASK,
|
||
#endif
|
||
#if TCFG_APP_LINEIN_EN
|
||
APP_LINEIN_TASK,
|
||
#endif
|
||
#if TCFG_APP_RTC_EN
|
||
APP_RTC_TASK,
|
||
#endif
|
||
#if TCFG_APP_SLEEP_EN
|
||
APP_SLEEP_TASK,
|
||
#endif
|
||
#if TCFG_APP_PC_EN
|
||
APP_PC_TASK,
|
||
#endif
|
||
#if TCFG_APP_SPDIF_EN
|
||
APP_SPDIF_TASK,
|
||
#endif
|
||
};
|
||
|
||
u8 app_prev_task = 0;
|
||
u8 app_curr_task = 0;
|
||
u8 app_next_task = 0;
|
||
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 模式按键映射处理
|
||
@param e:按键事件
|
||
@return
|
||
@note
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
|
||
int app_key_event_remap(struct sys_event *e)
|
||
{
|
||
struct key_event *key = &e->u.key;
|
||
int msg = KEY_NULL;
|
||
switch (key->type) {
|
||
case KEY_DRIVER_TYPE_IO:
|
||
#if TCFG_IOKEY_ENABLE
|
||
msg = iokey_event_to_msg(app_curr_task, key);
|
||
#endif
|
||
break;
|
||
case KEY_DRIVER_TYPE_AD:
|
||
case KEY_DRIVER_TYPE_RTCVDD_AD:
|
||
#if TCFG_ADKEY_ENABLE
|
||
msg = adkey_event_to_msg(app_curr_task, key);
|
||
#endif
|
||
break;
|
||
case KEY_DRIVER_TYPE_IR:
|
||
#if TCFG_IRKEY_ENABLE
|
||
msg = irkey_event_to_msg(app_curr_task, key);
|
||
#endif
|
||
break;
|
||
case KEY_DRIVER_TYPE_TOUCH:
|
||
#if TCFG_TOUCH_KEY_ENABLE
|
||
msg = touch_key_event_to_msg(app_curr_task, key);
|
||
#endif
|
||
break;
|
||
case KEY_DRIVER_TYPE_RDEC:
|
||
#if TCFG_RDEC_KEY_ENABLE
|
||
msg = rdec_key_event_to_msg(app_curr_task, key);
|
||
#endif
|
||
break;
|
||
|
||
case KEY_DRIVER_TYPE_SOFTKEY:
|
||
msg = key->event;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
if (msg == KEY_NULL) {
|
||
e->consumed = 1;//接管按键消息,app应用不会收到消息
|
||
return FALSE;
|
||
}
|
||
|
||
e->u.key.event = msg;
|
||
e->u.key.value = 0;//
|
||
return TRUE;//notify数据
|
||
}
|
||
SYS_EVENT_HANDLER(SYS_KEY_EVENT, app_key_event_remap, 3);
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@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 TRUE可以进入, FALSE不可以进入
|
||
@note 例如一些需要设备在线的任务(music/record/linein等),
|
||
如果设备在线可以进入, 没有设备在线不进入可以在这里处理
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
static int app_task_switch_check(u8 app_task)
|
||
{
|
||
int ret = false;
|
||
switch (app_task) {
|
||
#if TCFG_APP_MUSIC_EN
|
||
case APP_MUSIC_TASK:
|
||
ret = music_app_check();
|
||
break;
|
||
#endif
|
||
#if TCFG_APP_LINEIN_EN
|
||
case APP_LINEIN_TASK:
|
||
ret = linein_app_check();
|
||
break;
|
||
#endif
|
||
#if TCFG_APP_PC_EN
|
||
case APP_PC_TASK:
|
||
ret = pc_app_check();
|
||
break;
|
||
#endif
|
||
case APP_FM_TASK:
|
||
ret = TRUE;
|
||
break;
|
||
#if TCFG_APP_RECORD_EN
|
||
case APP_RECORD_TASK:
|
||
ret = record_app_check();
|
||
break;
|
||
#endif
|
||
default:
|
||
ret = TRUE;
|
||
break;
|
||
|
||
}
|
||
return ret;
|
||
}
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 切换到上一个模式
|
||
@param
|
||
@return
|
||
@note
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
void app_task_switch_prev()
|
||
{
|
||
int i = 0;
|
||
int cur_index = 0;
|
||
|
||
if (app_next_task) {
|
||
printf("app_task_switch_prev busy \n");
|
||
}
|
||
|
||
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])) {
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 切换到下一个模式
|
||
@param
|
||
@return
|
||
@note
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
void app_task_switch_next()
|
||
{
|
||
int i = 0;
|
||
int cur_index = 0;
|
||
|
||
if (app_next_task) {
|
||
printf("app_task_switch_next busy \n");
|
||
}
|
||
|
||
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])) {
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 切换到指定模式
|
||
@param app_task:指定模式
|
||
@return
|
||
@note
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
int app_task_switch_to(u8 app_task)
|
||
{
|
||
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);
|
||
|
||
/* if(app_next_task) */
|
||
/* printf("app_task_switch_to busy \n"); */
|
||
#if (defined SMART_BOX_EN) && (SMART_BOX_EN)
|
||
extern void function_change_inform(u8 app_mode, u8 ret);
|
||
function_change_inform(app_task, TRUE);
|
||
#endif
|
||
|
||
#if (RECORDER_MIX_EN)
|
||
recorder_mix_stop();
|
||
#endif/*RECORDER_MIX_EN*/
|
||
|
||
app_prev_task = app_curr_task;
|
||
app_next_task = app_task;
|
||
app_task_put_usr_msg(APP_MSG_SWITCH_TASK, 0);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 跳回到原来的模式
|
||
@param
|
||
@return
|
||
@note
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
int app_task_switch_back()
|
||
{
|
||
if (app_prev_task == 0) {
|
||
return -EINVAL;
|
||
}
|
||
return app_task_switch_to(app_prev_task);
|
||
}
|
||
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 模式切换退出检测
|
||
@param
|
||
@return 1:响应退出模式, 0:不响应
|
||
@note
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
u8 app_task_exitting()//
|
||
{
|
||
struct sys_event clear_key_event = {.type = SYS_KEY_EVENT, .arg = (void *)DEVICE_EVENT_FROM_KEY};
|
||
if (app_next_task != 0) {
|
||
app_curr_task = app_next_task;
|
||
app_next_task = 0;
|
||
sys_key_event_disable();
|
||
sys_event_clear(&clear_key_event);
|
||
return 1;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 获取当前模式
|
||
@param
|
||
@return 当前模式id
|
||
@note
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
u8 app_get_curr_task()
|
||
{
|
||
return app_curr_task;
|
||
}
|
||
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 通过指定id检查是否是当前模式
|
||
@param
|
||
@return true:是当前模式,false:不是当前模式
|
||
@note
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
u8 app_check_curr_task(u8 app)
|
||
{
|
||
if (app == app_curr_task) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
|