/************************************************************* 此文件函数主要是蓝牙模式按键处理 **************************************************************/ #include "system/includes.h" #include "media/includes.h" #include "app_config.h" #include "app_task.h" #include "btstack/avctp_user.h" #include "btstack/btstack_task.h" #include "btstack/bluetooth.h" #include "btstack/btstack_error.h" #include "btctrler/btctrler_task.h" #include "classic/hci_lmp.h" #include "bt/bt_tws.h" #include "bt/bt_ble.h" #include "bt/bt.h" #include "bt/vol_sync.h" #include "bt/bt_emitter.h" #include "bt_common.h" #include "aec_user.h" #include "math.h" #include "spp_user.h" #include "app_chargestore.h" #include "app_charge.h" #include "app_main.h" #include "app_power_manage.h" #include "user_cfg.h" #include "asm/pwm_led.h" #include "asm/timer.h" #include "asm/hwi.h" #include "cpu.h" #include "ui/ui_api.h" #include "ui_manage.h" #include "ui/ui_style.h" #include "key_event_deal.h" #include "clock_cfg.h" #include "gSensor/gSensor_manage.h" #include "soundcard/soundcard.h" #include "audio_dec.h" #include "tone_player.h" #include "dac.h" #define __this (&app_bt_hdl) #define LOG_TAG_CONST BT #define LOG_TAG "[BT]" #define LOG_ERROR_ENABLE #define LOG_DEBUG_ENABLE #define LOG_INFO_ENABLE #define LOG_DUMP_ENABLE #define LOG_CLI_ENABLE #include "debug.h" #if TCFG_APP_BT_EN #if TCFG_USER_TWS_ENABLE static void max_tone_timer(void *priv) { if (!tone_get_status()) { __this->max_tone_timer_hdl = 0; __this->replay_tone_flag = 1; } else { __this->max_tone_timer_hdl = sys_timeout_add(NULL, max_tone_timer, TWS_SYNC_TIME_DO + 100); } } #endif /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式获取按键事件前的过滤 @param @return @note */ /*----------------------------------------------------------------------------*/ u8 bt_key_event_filter_before() { #if TCFG_APP_FM_EMITTER_EN #if TCFG_UI_ENABLE if (ui_get_app_menu(GRT_CUR_MENU) == MENU_FM_SET_FRE) { return false; } #endif #endif if (key_is_ui_takeover()) { return false; } return true; } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式获取按键事件后的过滤 @param @return @note */ /*----------------------------------------------------------------------------*/ u8 bt_key_event_filter_after(int key_event) { #if (TCFG_DEC2TWS_ENABLE) u8 is_tws_all_in_bt(); if ((key_event != KEY_POWEROFF) && \ (key_event != KEY_POWEROFF_HOLD) && \ (key_event != KEY_CHANGE_MODE) && \ (key_event != KEY_REVERB_OPEN)) { if (!is_tws_all_in_bt()) { return true; } } #endif return false; } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 tws 区分左右耳加音量 @param @return @note */ /*----------------------------------------------------------------------------*/ void volume_up(void) { u8 test_box_vol_up = 0x41; s8 cur_vol = 0; u8 call_status = get_call_status(); if (tone_get_status()) { if (get_call_status() == BT_CALL_INCOMING) { app_audio_volume_up(1); } return; } /*打电话出去彩铃要可以调音量大小*/ if ((call_status == BT_CALL_ACTIVE) || (call_status == BT_CALL_OUTGOING)) { cur_vol = app_audio_get_volume(APP_AUDIO_STATE_CALL); } else { cur_vol = app_audio_get_volume(APP_AUDIO_STATE_MUSIC); } if (get_remote_test_flag()) { user_send_cmd_prepare(USER_CTRL_TEST_KEY, 1, &test_box_vol_up); //音量加 } if (cur_vol >= app_audio_get_max_volume()) { #if TCFG_USER_TWS_ENABLE if (get_tws_sibling_connect_state()) { if (tws_api_get_role() == TWS_ROLE_MASTER && __this->replay_tone_flag) { __this->replay_tone_flag = 0; //防止提示音被打断标志 tws_api_sync_call_by_uuid('T', SYNC_CMD_MAX_VOL, TWS_SYNC_TIME_DO); __this->max_tone_timer_hdl = sys_timeout_add(NULL, max_tone_timer, TWS_SYNC_TIME_DO + 100); //同步在TWS_SYNC_TIME_DO之后才会播放提示音,所以timer需要在这个时间之后才去检测提示音状态 } } else #endif { #if TCFG_MAX_VOL_PROMPT tone_play_by_path(tone_table[IDEX_TONE_MAX_VOL], 0); #endif } if (get_call_status() != BT_CALL_HANGUP) { /*本地音量最大,如果手机音量还没最大,继续加,以防显示不同步*/ if (bt_user_priv_var.phone_vol < 15) { if (get_curr_channel_state() & HID_CH) { user_send_cmd_prepare(USER_CTRL_HID_VOL_UP, 0, NULL); //使用HID调音量 } else { user_send_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL); } } return; } #if BT_SUPPORT_MUSIC_VOL_SYNC #if (TCFG_DEC2TWS_ENABLE) if (!is_tws_all_in_bt()) { log_debug(">>>>>>>tws is not all in bt mode !!!\n"); } else #endif { opid_play_vol_sync_fun(&app_var.music_volume, 1); user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL); } #endif/*BT_SUPPORT_MUSIC_VOL_SYNC*/ return; } #if BT_SUPPORT_MUSIC_VOL_SYNC #if (TCFG_BD_NUM == 2) if ((APP_AUDIO_STATE_MUSIC == app_audio_get_state()) || (a2dp_get_status() == BT_MUSIC_STATUS_STARTING)) { #else if (APP_AUDIO_STATE_MUSIC == app_audio_get_state()) { #endif opid_play_vol_sync_fun(&app_var.music_volume, 1); app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1); } else { app_audio_volume_up(1); } #else app_audio_volume_up(1); #endif/*BT_SUPPORT_MUSIC_VOL_SYNC*/ log_info("vol+: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE)); if (get_call_status() != BT_CALL_HANGUP) { if (get_curr_channel_state() & HID_CH) { user_send_cmd_prepare(USER_CTRL_HID_VOL_UP, 0, NULL); //使用HID调音量 } else { user_send_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL); } } else { #if BT_SUPPORT_MUSIC_VOL_SYNC #if (TCFG_DEC2TWS_ENABLE) if (!is_tws_all_in_bt()) { log_debug(">>>>>>>tws is not all in bt mode !!!\n"); } else #endif { /* opid_play_vol_sync_fun(&app_var.music_volume, 0); */ #if TCFG_USER_TWS_ENABLE user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL); //使用HID调音量 //user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_SEND_VOL, 0, NULL); #else user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL); #endif/*TCFG_USER_TWS_ENABLE*/ } #endif/*BT_SUPPORT_MUSIC_VOL_SYNC*/ } } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 tws 区分左右耳减音量 @param @return @note */ /*----------------------------------------------------------------------------*/ void volume_down(void) { u8 test_box_vol_down = 0x42; if (tone_get_status()) { if (get_call_status() == BT_CALL_INCOMING) { app_audio_volume_down(1); } return; } if (get_remote_test_flag()) { user_send_cmd_prepare(USER_CTRL_TEST_KEY, 1, &test_box_vol_down); //音量减 } if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) <= 0) { if (get_call_status() != BT_CALL_HANGUP) { /* *本地音量最小,如果手机音量还没最小,继续减 *注意:有些手机通话最小音量是1(GREE G0245D) */ if (bt_user_priv_var.phone_vol > 1) { if (get_curr_channel_state() & HID_CH) { user_send_cmd_prepare(USER_CTRL_HID_VOL_DOWN, 0, NULL); //使用HID调音量 } else { user_send_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL); } } return; } #if BT_SUPPORT_MUSIC_VOL_SYNC #if (TCFG_DEC2TWS_ENABLE) if (!is_tws_all_in_bt()) { log_debug(">>>>>>>tws is not all in bt mode !!!\n"); } else #endif { opid_play_vol_sync_fun(&app_var.music_volume, 0); user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL); } #endif return; } #if BT_SUPPORT_MUSIC_VOL_SYNC #if (TCFG_BD_NUM == 2) if ((APP_AUDIO_STATE_MUSIC == app_audio_get_state()) || (a2dp_get_status() == BT_MUSIC_STATUS_STARTING)) { #else if (APP_AUDIO_STATE_MUSIC == app_audio_get_state()) { #endif opid_play_vol_sync_fun(&app_var.music_volume, 0); app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1); } else { app_audio_volume_down(1); } #else app_audio_volume_down(1); #endif/*BT_SUPPORT_MUSIC_VOL_SYNC*/ log_info("vol-: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE)); if (get_call_status() != BT_CALL_HANGUP) { if (get_curr_channel_state() & HID_CH) { user_send_cmd_prepare(USER_CTRL_HID_VOL_DOWN, 0, NULL); //使用HID调音量 } else { user_send_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL); } } else { #if BT_SUPPORT_MUSIC_VOL_SYNC #if (TCFG_DEC2TWS_ENABLE) if (!is_tws_all_in_bt()) { log_debug(">>>>>>>tws is not all in bt mode !!!\n"); } else #endif { /* opid_play_vol_sync_fun(&app_var.music_volume, 0); */ if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) == 0) { app_audio_volume_down(0); } #if TCFG_USER_TWS_ENABLE user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL); //user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_SEND_VOL, 0, NULL); #else user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL); #endif } #endif } } #if ONE_KEY_CTL_DIFF_FUNC /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 tws 左右耳区分按键功能 @param @return @note 左耳:下一曲、音量加 右耳:上一曲、音量减 */ /*----------------------------------------------------------------------------*/ static void lr_diff_otp_deal(u8 opt, char channel) { /* log_info("lr_diff_otp_deal:%d", opt); */ switch (opt) { case ONE_KEY_CTL_NEXT_PREV: if (channel == 'L') { user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_NEXT, 0, NULL); } else if (channel == 'R') { user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PREV, 0, NULL); } else { user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_NEXT, 0, NULL); } break; case ONE_KEY_CTL_VOL_UP_DOWN: if (channel == 'L') { volume_up(); } else if (channel == 'R') { volume_down(); } break; default: break; } } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 tws 左右耳区分按键功能 @param @return @note 左耳:下一曲、音量加 右耳:上一曲、音量减 */ /*----------------------------------------------------------------------------*/ void key_tws_lr_diff_deal(struct sys_event *event, u8 opt) { u8 channel = 'U'; if (get_bt_tws_connect_status()) { channel = tws_api_get_local_channel(); if ('L' == channel) { channel = (u32)event->arg == KEY_EVENT_FROM_TWS ? 'R' : 'L'; } else { channel = (u32)event->arg == KEY_EVENT_FROM_TWS ? 'L' : 'R'; } } lr_diff_otp_deal(opt, channel); } #else void key_tws_lr_diff_deal(struct sys_event *event, u8 opt) { } #endif /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式切换设备类型 @param @return @note */ /*----------------------------------------------------------------------------*/ #if (USER_SUPPORT_PROFILE_HID==1) void user_change_profile_mode(u8 flag) { user_send_cmd_prepare(USER_CTRL_POWER_OFF, 0, NULL); while (hci_standard_connect_check() != 0) { //wait disconnect; os_time_dly(10); } __bt_set_hid_independent_flag(flag); if (flag) { __change_hci_class_type(0x002570); } else { __change_hci_class_type(BD_CLASS_WEARABLE_HEADSET); } user_send_cmd_prepare(USER_CTRL_CMD_CHANGE_PROFILE_MODE, 0, NULL); if (connect_last_device_from_vm()) { /* log_debug("start connect vm addr phone \n"); */ } else { user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE, 0, NULL); user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL); } } #endif /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 pp 按键处理 @param @return @note 播放音乐、通话接听挂断 */ /*----------------------------------------------------------------------------*/ void bt_key_music_pp() { if ((get_call_status() == BT_CALL_OUTGOING) || (get_call_status() == BT_CALL_ALERT)) { user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL); } else if (get_call_status() == BT_CALL_INCOMING) { user_send_cmd_prepare(USER_CTRL_HFP_CALL_ANSWER, 0, NULL); } else if (get_call_status() == BT_CALL_ACTIVE) { user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL); } else { user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PLAY, 0, NULL); } } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 prev 按键处理 @param @return @note 播放音乐上一曲 */ /*----------------------------------------------------------------------------*/ void bt_key_music_prev() { user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PREV, 0, NULL); } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 next 按键处理 @param @return @note 播放音乐下一曲 */ /*----------------------------------------------------------------------------*/ void bt_key_music_next() { #ifdef CONFIG_BOARD_AC6933B_LIGHTING if (get_call_status() == BT_CALL_INCOMING) { user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL); break; } #endif user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_NEXT, 0, NULL); } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 vol up 按键处理 @param @return @note 加音量 */ /*----------------------------------------------------------------------------*/ void bt_key_vol_up() { u8 vol; if (get_call_status() == BT_CALL_ACTIVE && bt_sco_state() == 0) { return; } volume_up(); vol = app_audio_get_volume(APP_AUDIO_CURRENT_STATE); UI_SHOW_MENU(MENU_MAIN_VOL, 1000, vol, NULL); UI_MSG_POST("music_vol:vol=%4", vol); } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 vol down 按键处理 @param @return @note 减音量 */ /*----------------------------------------------------------------------------*/ void bt_key_vol_down() { u8 vol; if (get_call_status() == BT_CALL_ACTIVE && bt_sco_state() == 0) { return; } volume_down(); vol = app_audio_get_volume(APP_AUDIO_CURRENT_STATE); UI_SHOW_MENU(MENU_MAIN_VOL, 1000, vol, NULL); UI_MSG_POST("music_vol:vol=%4", vol); } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 回拨最后一个号码 来电拒听 @param @return @note */ /*----------------------------------------------------------------------------*/ void bt_key_call_last_on() { if (get_call_status() == BT_CALL_INCOMING) { user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL); return; } if ((get_call_status() == BT_CALL_ACTIVE) || (get_call_status() == BT_CALL_OUTGOING) || (get_call_status() == BT_CALL_ALERT) || (get_call_status() == BT_CALL_INCOMING)) { return;//通话过程不允许回拨 } if (bt_user_priv_var.last_call_type == BT_STATUS_PHONE_INCOME) { user_send_cmd_prepare(USER_CTRL_DIAL_NUMBER, bt_user_priv_var.income_phone_len, bt_user_priv_var.income_phone_num); } else { user_send_cmd_prepare(USER_CTRL_HFP_CALL_LAST_NO, 0, NULL); } } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 通话挂断 @param @return @note */ /*----------------------------------------------------------------------------*/ void bt_key_call_hand_up() { user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL); } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 @param @return @note */ /*----------------------------------------------------------------------------*/ void bt_key_call_answer() { } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 siri开启 @param @return @note */ /*----------------------------------------------------------------------------*/ void bt_key_call_siri() { user_send_cmd_prepare(USER_CTRL_HFP_GET_SIRI_OPEN, 0, NULL); } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 hid 发起拍照命令 @param @return @note */ /*----------------------------------------------------------------------------*/ void bt_key_hid_control() { /* log_info("get_curr_channel_state:%x\n", get_curr_channel_state()); */ if (get_curr_channel_state() & HID_CH) { log_info("KEY_HID_CONTROL\n"); user_send_cmd_prepare(USER_CTRL_HID_IOS, 0, NULL); } } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 tws 分开左右耳的按键功能 @param @return @note */ /*----------------------------------------------------------------------------*/ void bt_key_third_click(struct sys_event *event) { key_tws_lr_diff_deal(event, ONE_KEY_CTL_NEXT_PREV); } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙tws 低电处理 @param @return @note 电量高的做主机,电量低的做从机 **/ /*----------------------------------------------------------------------------*/ void bt_key_low_lantecy() { bt_set_low_latency_mode(!bt_get_low_latency_mode()); } /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式 混响按键不处理 @param @return @note */ /*----------------------------------------------------------------------------*/ u8 bt_key_reverb_open() { if ((get_call_status() == BT_CALL_ACTIVE) || (get_call_status() == BT_CALL_OUTGOING) || (get_call_status() == BT_CALL_ALERT) || (get_call_status() == BT_CALL_INCOMING)) { //通话过程不允许开/关混响 return 1; } return 0; } #endif