KT24-1110_65E-HA-651B/apps/soundbox/task_manager/bt/bt_key_fun.c
2024-11-10 18:44:17 +08:00

651 lines
19 KiB
C
Raw Permalink 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 "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