KT24-1110_65E-HA-651B/apps/soundbox/task_manager/bt/bt_key_fun.c

651 lines
19 KiB
C
Raw Permalink Normal View History

2024-11-10 10:44:17 +00:00
/*************************************************************
**************************************************************/
#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