374 lines
10 KiB
C
374 lines
10 KiB
C
#include "default_event_handler.h"
|
||
#include "app_action.h"
|
||
#include "bt_background.h"
|
||
#include "earphone.h"
|
||
#include "dev_manager/dev_manager.h"
|
||
#include "app_config.h"
|
||
#include "btstack/avctp_user.h"
|
||
#include "bt_tws.h"
|
||
#include "app_main.h"
|
||
#include "app_music.h"
|
||
#include "key_event_deal.h"
|
||
#include "asm/charge.h"
|
||
#include "app_sd_music.h"
|
||
#include "usb/otg.h"
|
||
#include "update.h"
|
||
|
||
#if (TCFG_APP_MUSIC_EN || TCFG_PC_ENABLE)
|
||
#include "app_task.h"
|
||
|
||
#if TCFG_DEC2TWS_ENABLE
|
||
#include "audio_dec/audio_dec_file.h"
|
||
#endif
|
||
|
||
extern u8 key_table[KEY_NUM_MAX][KEY_EVENT_MAX];
|
||
extern int pc_device_event_handler(struct sys_event *event);
|
||
extern u32 timer_get_ms(void);
|
||
extern u16 dev_update_check(char *logo);
|
||
|
||
int switch_to_music_app(int action)
|
||
{
|
||
struct intent it;
|
||
|
||
if (action == ACTION_MUSIC_MAIN) {
|
||
/* 卡不在线不切到music模式,
|
||
* 防止TWS之间所处的模式不同导致A2DP播歌不同步
|
||
*/
|
||
#if TCFG_DEV_MANAGER_ENABLE
|
||
if (!music_app_check()) {
|
||
return -ENODEV;
|
||
}
|
||
#else
|
||
if (!dev_online("sd0")) {
|
||
return -ENODEV;
|
||
}
|
||
#endif
|
||
}
|
||
init_intent(&it);
|
||
it.name = "music";
|
||
it.action = action;
|
||
return start_app(&it);
|
||
}
|
||
|
||
void switch_to_prev_app()
|
||
{
|
||
struct intent it;
|
||
|
||
init_intent(&it);
|
||
it.action = ACTION_BACK;
|
||
start_app(&it);
|
||
}
|
||
|
||
void switch_to_earphone_app()
|
||
{
|
||
struct intent it;
|
||
|
||
init_intent(&it);
|
||
it.action = ACTION_BACK;
|
||
start_app(&it);
|
||
}
|
||
|
||
void switch_to_pc_app()
|
||
{
|
||
struct intent it;
|
||
|
||
/* 退出bt和music模式 */
|
||
if (bt_in_background()) {
|
||
init_intent(&it);
|
||
it.action = ACTION_BACK;
|
||
start_app(&it);
|
||
}
|
||
init_intent(&it);
|
||
it.action = ACTION_BACK;
|
||
start_app(&it);
|
||
|
||
|
||
/* 切到PC模式 */
|
||
init_intent(&it);
|
||
it.name = "pc";
|
||
it.action = ACTION_PC_MAIN;
|
||
start_app(&it);
|
||
}
|
||
|
||
static void sd_event_handler(struct device_event *evt)
|
||
{
|
||
//add 设备的返回值, 0成功
|
||
int err = 0;
|
||
if (evt->event == DEVICE_EVENT_IN) {
|
||
if (app_var.have_mass_storage == 0) {
|
||
app_var.have_mass_storage = 1;
|
||
syscfg_write(CFG_HAVE_MASS_STORAGE, &app_var.have_mass_storage, 1);
|
||
}
|
||
#if TCFG_DEC2TWS_ENABLE
|
||
if (bt_in_background()) {
|
||
switch_to_music_app(ACTION_MUSIC_MAIN);
|
||
}
|
||
#elif TWFG_APP_POWERON_IGNORE_DEV
|
||
err = dev_manager_add((char *)evt->value);
|
||
if ((err == 0) && (!get_charge_online_flag()) && (usb_otg_online(0) != SLAVE_MODE)) { //充电状态只add设备,不切模式
|
||
///检查设备升级
|
||
if (dev_update_check((char *)evt->value) == UPDATA_READY) {
|
||
return;
|
||
}
|
||
#if TCFG_APP_MUSIC_EN
|
||
if ((timer_get_ms() - app_var.start_time) > TWFG_APP_POWERON_IGNORE_DEV) {
|
||
app_task_switch_to(APP_MUSIC_TASK, NULL_VALUE);
|
||
}
|
||
#endif
|
||
}
|
||
|
||
#else
|
||
err = dev_manager_add((char *)evt->value);
|
||
if ((err == 0) && (!get_charge_online_flag()) && (usb_otg_online(0) != SLAVE_MODE)) { //充电状态只add设备,不切模式
|
||
///检查设备升级
|
||
if (dev_update_check((char *)evt->value) == UPDATA_READY) {
|
||
return;
|
||
}
|
||
#if TCFG_APP_MUSIC_EN
|
||
app_task_switch_to(APP_MUSIC_TASK, NULL_VALUE);
|
||
#endif
|
||
}
|
||
#endif
|
||
} else if (evt->event == DEVICE_EVENT_OUT) {
|
||
update_clear_result();
|
||
#if (!TCFG_DEC2TWS_ENABLE)
|
||
dev_manager_del((char *)evt->value);
|
||
#endif
|
||
}
|
||
}
|
||
|
||
static int default_earphone_key_event_handler(struct sys_event *event)
|
||
{
|
||
struct key_event *key = &event->u.key;
|
||
u8 key_event = key_table[key->value][key->event];
|
||
|
||
switch (key_event) {
|
||
case KEY_MODE_SWITCH:
|
||
puts("key_mode_switch\n");
|
||
app_task_switch_next();
|
||
break;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
#if ((TCFG_APP_MUSIC_EN || TCFG_APP_PC_EN) && TCFG_DEC2TWS_ENABLE)
|
||
void tws_loacl_media_channe_start(struct bt_event *evt)
|
||
{
|
||
int role = tws_api_get_role();
|
||
int state = tws_api_get_tws_state();
|
||
|
||
if (role == TWS_ROLE_MASTER) {
|
||
if (state & TWS_STA_PHONE_CONNECTED) {
|
||
tws_conn_switch_role();
|
||
}
|
||
if (state & (TWS_STA_ESCO_OPEN | TWS_STA_SBC_OPEN)) {
|
||
return;
|
||
}
|
||
}
|
||
|
||
if (file_dec_get_source() == FILE_FROM_LOCAL) {
|
||
if (role == TWS_ROLE_MASTER) {
|
||
return;
|
||
}
|
||
app_music_exit();
|
||
}
|
||
|
||
switch_to_music_app(ACTION_MUSIC_TWS_RX);
|
||
tws_local_media_dec_open(evt->args[0], evt->args + 2);
|
||
sys_auto_shut_down_disable();
|
||
}
|
||
|
||
void tws_loacl_media_channe_stop(struct bt_event *evt)
|
||
{
|
||
tws_local_media_dec_close(evt->args[0]);
|
||
|
||
sys_auto_shut_down_enable();
|
||
|
||
if (tws_api_get_tws_state() & TWS_STA_SIBLING_DISCONNECTED) {
|
||
struct application *app = get_current_app();
|
||
if (app && app->action != ACTION_PC_MAIN) {
|
||
bt_switch_to_foreground(ACTION_DO_NOTHING, 1);
|
||
}
|
||
}
|
||
}
|
||
|
||
static int default_tws_event_handler(struct bt_event *evt)
|
||
{
|
||
#if TCFG_DEC2TWS_ENABLE
|
||
int role = evt->args[0];
|
||
int phone_link_connection = evt->args[1];
|
||
int state = evt->args[2];
|
||
|
||
switch (evt->event) {
|
||
case TWS_EVENT_CONNECTED:
|
||
tws_api_auto_role_switch_disable();
|
||
if (state & (TWS_STA_ESCO_OPEN | TWS_STA_SBC_OPEN)) {
|
||
if (bt_in_background()) {
|
||
bt_switch_to_foreground(ACTION_DO_NOTHING, 1);
|
||
}
|
||
break;
|
||
}
|
||
if (file_dec_get_source() == FILE_FROM_LOCAL) {
|
||
send_local_media_dec_open_cmd();
|
||
} else {
|
||
if (role == TWS_ROLE_MASTER) {
|
||
if (switch_to_music_app(ACTION_MUSIC_MAIN) == 0) {
|
||
break;
|
||
}
|
||
}
|
||
if (bt_in_background()) {
|
||
bt_switch_to_foreground(ACTION_DO_NOTHING, 1);
|
||
}
|
||
}
|
||
break;
|
||
case TWS_EVENT_CONNECTION_TIMEOUT:
|
||
if (file_dec_get_source() == -EINVAL) {
|
||
switch_to_music_app(ACTION_MUSIC_MAIN);
|
||
}
|
||
break;
|
||
case TWS_EVENT_MONITOR_START:
|
||
if (role == TWS_ROLE_MASTER) {
|
||
if (!app_var.have_mass_storage || file_dec_get_source() == FILE_FROM_TWS) {
|
||
tws_conn_switch_role();
|
||
}
|
||
}
|
||
break;
|
||
case TWS_EVENT_CONNECTION_DETACH:
|
||
break;
|
||
case TWS_EVENT_DATA_TRANS_OPEN:
|
||
printf("TWS_EVENT_DATA_TRANS_OPEN: %d, %d\n", evt->args[0], evt->args[1]);
|
||
break;
|
||
case TWS_EVENT_DATA_TRANS_START:
|
||
printf("TWS_EVENT_DATA_TRANS_START: %d, %d\n", evt->args[0], evt->args[1]);
|
||
if (evt->args[1] == TWS_DTC_LOCAL_MEDIA) {
|
||
tws_loacl_media_channe_start(evt);
|
||
}
|
||
break;
|
||
case TWS_EVENT_DATA_TRANS_STOP:
|
||
printf("TWS_EVENT_DATA_TRANS_STOP: %d, %d\n", evt->args[0], evt->args[1]);
|
||
if (evt->args[1] == TWS_DTC_LOCAL_MEDIA) {
|
||
tws_loacl_media_channe_stop(evt);
|
||
}
|
||
break;
|
||
case TWS_EVENT_DATA_TRANS_CLOSE:
|
||
break;
|
||
default:
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
#endif
|
||
}
|
||
#endif/* #if ((TCFG_APP_MUSIC_EN || TCFG_APP_PC_EN) && TCFG_DEC2TWS_ENABLE) */
|
||
|
||
void default_event_handler(struct sys_event *event)
|
||
{
|
||
printf("@@@default_event_handler event->type = %d\n", event->type);
|
||
if (bt_in_background()) {
|
||
bt_in_background_event_handler(event);
|
||
}
|
||
switch (event->type) {
|
||
case SYS_KEY_EVENT:
|
||
if (!bt_in_background()) {
|
||
default_earphone_key_event_handler(event);
|
||
}
|
||
break;
|
||
case SYS_BT_EVENT:
|
||
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) {
|
||
struct bt_event *bt = &event->u.bt;
|
||
if (bt->event == BT_STATUS_PHONE_HANGUP || (bt->event == BT_STATUS_VOICE_RECOGNITION && !bt->value)) {
|
||
r_printf("BT_STATUS_SCO_STATUS_CHANGE");
|
||
/* if (bt->value == 0xff) */
|
||
{
|
||
app_core_back_to_prev_app();
|
||
if (!app_core_back_to_prev_app_over_check()) {
|
||
app_task_switch_to(APP_BT_TASK, ACTION_DO_NOTHING);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
#if TCFG_USER_TWS_ENABLE && TCFG_DEC2TWS_ENABLE
|
||
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS)) {
|
||
default_tws_event_handler(&event->u.bt);
|
||
}
|
||
#endif
|
||
break;
|
||
|
||
case SYS_DEVICE_EVENT:
|
||
/* 系统设备事件处理 */
|
||
#if (TCFG_ONLINE_ENABLE || TCFG_CFG_TOOL_ENABLE)
|
||
if ((u32)event->arg == DEVICE_EVENT_FROM_CFG_TOOL) {
|
||
extern int app_cfg_tool_event_handler(struct cfg_tool_event * cfg_tool_dev);
|
||
app_cfg_tool_event_handler(&event->u.cfg_tool);
|
||
break;
|
||
}
|
||
#endif
|
||
|
||
#if TCFG_APP_MUSIC_EN
|
||
if ((u32)event->arg == DRIVER_EVENT_FROM_SD0) {
|
||
sd_event_handler(&event->u.dev);
|
||
break;
|
||
}
|
||
#endif
|
||
|
||
#if TCFG_PC_ENABLE
|
||
int ret = pc_device_event_handler(event);
|
||
if (ret) {
|
||
if (event->u.dev.event == DEVICE_EVENT_IN) {
|
||
app_task_switch_to(APP_PC_TASK, NULL_VALUE);
|
||
}
|
||
}
|
||
#endif
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
#else
|
||
|
||
void default_event_handler(struct sys_event *event)
|
||
{
|
||
/*puts("default_event_handler\n");*/
|
||
struct intent it;
|
||
switch (event->type) {
|
||
case SYS_DEVICE_EVENT:
|
||
/* 系统设备事件处理 */
|
||
#if TCFG_PC_ENABLE
|
||
extern int pc_device_event_handler(struct sys_event * event);
|
||
int ret = pc_device_event_handler(event);
|
||
if (ret) {
|
||
if (event->u.dev.event == DEVICE_EVENT_IN) {
|
||
/* 退出bt和music模式 */
|
||
if (bt_in_background()) {
|
||
init_intent(&it);
|
||
it.action = ACTION_BACK;
|
||
start_app(&it);
|
||
}
|
||
init_intent(&it);
|
||
it.action = ACTION_BACK;
|
||
start_app(&it);
|
||
|
||
/* 切到PC模式 */
|
||
init_intent(&it);
|
||
it.name = "pc";
|
||
it.action = ACTION_PC_MAIN;
|
||
start_app(&it);
|
||
} else {
|
||
cpu_reset();
|
||
}
|
||
}
|
||
#endif
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
|
||
}
|
||
|
||
#endif
|
||
|