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

2411 lines
70 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 "soundbox.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"
#include "audio_recorder_mix.h"
#include "bt_vartual_fast_connect.h"
#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
#define __this (&app_bt_hdl)
static int bt_switch_back_timer = 0;
/*************************************************************
**************************************************************/
u8 get_bt_init_status()
{
return __this->init_ok;
}
u8 get_bt_back_flag()
{
return __this->bt_back_flag;
}
void set_bt_back_flag(u8 flag)
{
__this->bt_back_flag = flag;
}
void clr_tws_local_back_role(void)
{
__this->tws_local_back_role = 0;
}
void bt_reverb_status_change(struct bt_event *bt)
{
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式切换等待解码停止
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static int bt_switch_back(void *p)
{
if (!__this->call_flag) {
return 0;
}
if (bt_switch_back_timer) {
sys_timeout_del(bt_switch_back_timer);
bt_switch_back_timer = 0;
}
if (bt_must_work()) {
bt_switch_back_timer = sys_timeout_add(NULL, bt_switch_back, 500);
return 0;
}
if (bt_phone_dec_is_running()) {
bt_switch_back_timer = sys_timeout_add(NULL, bt_switch_back, 500);
return 0;
}
/* __this->call_flag = 0; */
__this->bt_back_flag = 2;
app_task_switch_back();
return 0;
}
u8 get_a2dp_start_flag()
{
return __this->a2dp_start_flag;
}
u8 bt_sco_state(void)
{
return bt_user_priv_var.phone_call_dec_begin;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙eir信息追加数据
@param
@return
@note add_data_2_eir函数就不追加数据
150byte
*/
/*----------------------------------------------------------------------------*/
u8 const eir_more_data_uuid[] = {
0x0F, 0x03, 0x00, 0x12, 0x1F, 0x11, 0x2F,
0x11, 0x0A, 0x11, 0x0C, 0x11, 0x32, 0x11, 0x01, 0x18
};
/* u8 add_data_2_eir(u8 *eir)
{
u8 len = sizeof(eir_more_data_uuid);
memcpy(eir,eir_more_data_uuid,len);
return len;
} */
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙电话本获取回调函数
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void phonebook_packet_handler(u8 type, const u8 *name, const u8 *number, const u8 *date)
{
static u16 number_cnt = 0;
log_debug("NO.%d:", number_cnt);
number_cnt++;
log_debug("type:%d ", type);
if (type == 0xff) {
number_cnt = 0;
}
if (name) {
log_debug(" NAME:%s ", name);
}
if (number) {
log_debug("number:%s ", number);
}
if (date) {
log_debug("date:%s ", date);
}
/* putchar('\n'); */
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式led状态更新
@param
@return status :
@note
*/
/*----------------------------------------------------------------------------*/
void bt_set_led_status(u8 status)
{
static u8 bt_status = STATUS_BT_INIT_OK;
u8 app = app_get_curr_task();
if (status) {
bt_status = status;
}
if (app == APP_BT_TASK) { //蓝牙模式或者state_machine
pwm_led_mode_set(PWM_LED_ALL_OFF);
ui_update_status(bt_status);
}
}
/*************************************************************
**************************************************************/
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙可发现可连接使能
@param enable 1: 0
@return
@note tws后该函数不起作用
12
*/
/*----------------------------------------------------------------------------*/
void bt_wait_phone_connect_control(u8 enable)
{
#if TCFG_USER_TWS_ENABLE
return;
#endif
if (enable && app_var.goto_poweroff_flag && (__this->exiting)) {
return;
}
if (enable) {
log_debug("is_1t2_connection:%d \t total_conn_dev:%d\n", is_1t2_connection(), get_total_connect_dev());
if (is_1t2_connection()) {
/*达到最大连接数,可发现(0)可连接(0)*/
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_DISABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_DISABLE, 0, NULL);
} else {
if (get_total_connect_dev() == 1) {
/*支持连接2台只连接一台的情况下可发现(0)可连接(1)*/
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_DISABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
} else {
/*可发现(1)可连接(1)*/
BT_STATE_SET_PAGE_SCAN_ENABLE();
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
}
}
} else {
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_DISABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_DISABLE, 0, NULL);
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙可发现可连接\回链轮询使能
@param p 1: 0,
@return
@note auto_connection_counter:
*/
/*----------------------------------------------------------------------------*/
int bt_wait_connect_and_phone_connect_switch(void *p)
{
int ret = 0;
int timeout = 0;
s32 wait_timeout;
if (__this->exiting) {
return 0;
}
log_debug("connect_switch: %d, %d\n", (int)p, bt_user_priv_var.auto_connection_counter);
if (bt_user_priv_var.auto_connection_timer) {
sys_timeout_del(bt_user_priv_var.auto_connection_timer);
bt_user_priv_var.auto_connection_timer = 0;
}
if (bt_user_priv_var.auto_connection_counter <= 0) {
bt_user_priv_var.auto_connection_timer = 0;
bt_user_priv_var.auto_connection_counter = 0;
BT_STATE_CANCEL_PAGE_SCAN();
user_send_cmd_prepare(USER_CTRL_PAGE_CANCEL, 0, NULL);
if (get_current_poweron_memory_search_index(NULL)) {
bt_init_ok_search_index();
return bt_wait_connect_and_phone_connect_switch(0);
} else {
bt_wait_phone_connect_control(1);
return 0;
}
}
/* log_info(">>>phone_connect_switch=%d\n",bt_user_priv_var.auto_connection_counter ); */
if ((int)p == 0) { //// 根据地址回链
if (bt_user_priv_var.auto_connection_counter) {
timeout = 6000; ////设置回链6s
bt_wait_phone_connect_control(0);
user_send_cmd_prepare(USER_CTRL_START_CONNEC_VIA_ADDR, 6, bt_user_priv_var.auto_connection_addr);
ret = 1;
bt_user_priv_var.auto_connection_counter -= timeout ;
}
} else {
timeout = 2000; ////设置开始被发现被连接2s
user_send_cmd_prepare(USER_CTRL_PAGE_CANCEL, 0, NULL);
bt_wait_phone_connect_control(1);
}
/* if (bt_user_priv_var.auto_connection_counter) { */
/* bt_user_priv_var.auto_connection_counter -= timeout ; */
/* #<{(| log_info("do=%d\n", bt_user_priv_var.auto_connection_counter); |)}># */
/* } */
bt_user_priv_var.auto_connection_timer = sys_timeout_add((void *)(!(int)p),
bt_wait_connect_and_phone_connect_switch, timeout);
return ret;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙关闭可发现可连接
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_close_page_scan(void *p)
{
/* log_info(">>>%s\n", __func__); */
bt_wait_phone_connect_control(0);
sys_timer_del(app_var.auto_stop_page_scan_timer);
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙通话时候设置不让系统进入idle状态,不让系统进powerdown
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static u8 check_phone_income_idle(void)
{
if (bt_user_priv_var.phone_ring_flag) {
return 0;
}
return 1;
}
REGISTER_LP_TARGET(phone_incom_lp_target) = {
.name = "phone_check",
.is_idle = check_phone_income_idle,
};
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙连接配置提供app层用户可以输入配对鉴定key
@param key :
@return
@note 6
*/
/*----------------------------------------------------------------------------*/
void bt_send_keypress(u8 key)
{
user_send_cmd_prepare(USER_CTRL_KEYPRESS, 1, &key);
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙连接配置提供app层用户可以输入确定或者否定
@param en 0: 1:
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_send_pair(u8 en)
{
user_send_cmd_prepare(USER_CTRL_PAIR, 1, &en);
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙获取vm连接记录信息
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_init_ok_search_index(void)
{
if (!bt_user_priv_var.auto_connection_counter && get_current_poweron_memory_search_index(bt_user_priv_var.auto_connection_addr)) {
/* log_info("bt_wait_connect_and_phone_connect_switch\n"); */
clear_current_poweron_memory_search_index(1);
bt_user_priv_var.auto_connection_counter = POWERON_AUTO_CONN_TIME * 1000; //8000ms
BT_STATE_GET_CONNECT_MAC_ADDR();
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙获取样机当前电量
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int bt_get_battery_value()
{
//取消默认蓝牙定时发送电量给手机需要更新电量给手机使用USER_CTRL_HFP_CMD_UPDATE_BATTARY命令
/*电量协议的是0-9个等级请比例换算*/
return get_cur_battery_level();
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙spp 协议数据 回调
@param packet_type:
ch :
packet :
size
@return
@note
*/
/*----------------------------------------------------------------------------*/
void spp_data_handler(u8 packet_type, u16 ch, u8 *packet, u16 size)
{
switch (packet_type) {
case 1:
log_debug("spp connect\n");
break;
case 2:
log_debug("spp disconnect\n");
break;
case 7:
//log_info("spp_rx:");
//put_buf(packet,size);
#if AEC_DEBUG_ONLINE
aec_debug_online(packet, size);
#endif
break;
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙音乐同步,设置音量
@param volume :
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_set_music_device_volume(int volume)
{
#if (SMART_BOX_EN)
extern bool smartbox_set_device_volume(int volume);
if (smartbox_set_device_volume(volume)) {
return;
}
#endif
if (true == app_check_curr_task(APP_BT_TASK)) {
set_music_device_volume(volume);
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙通话音量同步,设置音量
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void phone_sync_vol(void *priv)
{
log_debug("phone_sync_vol\n");
bt_user_priv_var.phone_vol = 14;
user_send_cmd_prepare(USER_CTRL_HFP_CALL_SET_VOLUME, 1, &bt_user_priv_var.phone_vol);
user_send_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
bt_user_priv_var.phone_vol = 15;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙获取在连接设备名字回调
@param status : 1 0
addr :
name :
@return
@note USER_CTRL_READ_REMOTE_NAME
*/
/*----------------------------------------------------------------------------*/
void bt_read_remote_name(u8 status, u8 *addr, u8 *name)
{
if (status) {
log_debug("remote_name fail \n");
} else {
log_debug("remote_name : %s \n", name);
}
log_debug_hexdump(addr, 6);
#if TCFG_USER_EMITTER_ENABLE
emitter_search_noname(status, addr, name);
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙歌词信息获取回调
@param
@return
@note
const u8 more_avctp_cmd_support = 1;1
void bredr_handle_register()
USER_CTRL_AVCTP_OPID_GET_PLAY_TIME命令就可以了
1
*/
/*----------------------------------------------------------------------------*/
void user_get_bt_music_info(u8 type, u32 time, u8 *info, u16 len)
{
//profile define type: 1-title 2-artist name 3-album names 4-track number 5-total number of tracks 6-genre 7-playing time
//JL define 0x10-total time , 0x11 current play position
u8 min, sec;
//printf("type %d\n", type );
if ((info != NULL) && (len != 0)) {
log_debug(" %s \n", info);
}
if (time != 0) {
min = time / 1000 / 60;
sec = time / 1000 - (min * 60);
log_debug(" time %d %d\n ", min, sec);
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙通话开始丢包数
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
#if ESCO_DUMP_PACKET_ADJUST
u8 get_esco_packet_dump(void)
{
//log_info("esco_dump_packet:%d\n", esco_dump_packet);
return __this->esco_dump_packet;
}
#endif
/*************************************************************
**************************************************************/
static u32 bt_timer = 0;
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙丢音频数据包
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void bt_a2dp_drop_frame(void *p)
{
int len;
u8 *frame;
/* putchar('@'); */
#if TCFG_DEC2TWS_ENABLE
if (tone_get_status() || localtws_dec_is_open()) {
#else
if (tone_get_status()) {
#endif
bt_timer = sys_timeout_add(NULL, bt_a2dp_drop_frame, 100);
__a2dp_drop_frame(NULL);
} else {
local_irq_disable();
bt_timer = 0;
local_irq_enable();
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙启动音频数据包
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_drop_a2dp_frame_start(void)
{
log_debug("bt_drop_frame_start %d\n", bt_timer);
local_irq_disable();
if (bt_timer == 0) {
bt_timer = sys_timeout_add(NULL, bt_a2dp_drop_frame, 100);
}
local_irq_enable();
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙停止音频数据包
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_drop_a2dp_frame_stop()
{
log_debug("bt_drop_frame_stop %d\n", bt_timer);
local_irq_disable();
if (bt_timer) {
sys_timeout_del(bt_timer);
bt_timer = 0;
}
extern void bt_stop_a2dp_slience_detect();
bt_stop_a2dp_slience_detect();
local_irq_enable();
}
/*************************************************************
app层检测空闲是否可以进入sniff模式
**************************************************************/
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙退出sniff模式
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_check_exit_sniff()
{
sys_timeout_del(__this->exit_sniff_timer);
__this->exit_sniff_timer = 0;
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
return;
}
#endif
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙检测是否空闲空闲就发起sniff
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_check_enter_sniff()
{
struct sniff_ctrl_config_t sniff_ctrl_config;
u8 addr[12];
u8 conn_cnt = 0;
u8 i = 0;
/*putchar('H');*/
conn_cnt = bt_api_enter_sniff_status_check(SNIFF_CNT_TIME, addr);
ASSERT(conn_cnt <= 2);
for (i = 0; i < conn_cnt; i++) {
log_debug("-----USER SEND SNIFF IN %d %d\n", i, conn_cnt);
sniff_ctrl_config.sniff_max_interval = SNIFF_MAX_INTERVALSLOT;
sniff_ctrl_config.sniff_mix_interval = SNIFF_MIN_INTERVALSLOT;
sniff_ctrl_config.sniff_attemp = SNIFF_ATTEMPT_SLOT;
sniff_ctrl_config.sniff_timeout = SNIFF_TIMEOUT_SLOT;
memcpy(sniff_ctrl_config.sniff_addr, addr + i * 6, 6);
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
return;
}
#endif
user_send_cmd_prepare(USER_CTRL_SNIFF_IN, sizeof(struct sniff_ctrl_config_t), (u8 *)&sniff_ctrl_config);
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙启动 检测空闲 发起sniff
@param enable : 1 0:
addr:sniff
@return
@note
*/
/*----------------------------------------------------------------------------*/
bool bt_is_sniff_close(void)
{
#if TCFG_BT_SNIFF_ENABLE
return (bt_user_priv_var.sniff_timer == 0);
#else
return 0;
#endif
}
void sys_auto_sniff_controle(u8 enable, u8 *addr)
{
#if (TCFG_BT_SNIFF_ENABLE == 0)
return;
#endif
if (addr) {
if (bt_api_conn_mode_check(enable, addr) == 0) {
log_debug("sniff ctr not change\n");
return;
}
}
if (enable) {
if (get_total_connect_dev() == 0) {
return;
}
if (addr) {
log_debug("sniff cmd timer init\n");
user_cmd_timer_init();
}
if (bt_user_priv_var.sniff_timer == 0) {
log_debug("check_sniff_enable\n");
bt_user_priv_var.sniff_timer = sys_timer_add(NULL, bt_check_enter_sniff, 1000);
}
} else {
if (get_total_connect_dev() > 0) {
return;
}
if (addr) {
log_debug("sniff cmd timer remove\n");
remove_user_cmd_timer();
}
if (bt_user_priv_var.sniff_timer) {
log_info("check_sniff_disable\n");
sys_timeout_del(bt_user_priv_var.sniff_timer);
bt_user_priv_var.sniff_timer = 0;
if (__this->exit_sniff_timer == 0) {
/* exit_sniff_timer = sys_timer_add(NULL, bt_check_exit_sniff, 5000); */
}
}
}
}
void soft_poweroff_mode(u8 mode)
{
__this->force_poweroff = mode;
}
/*************************************************************
**************************************************************/
/*----------------------------------------------------------------------------*/
/**@brief 软关机蓝牙模式处理
@param
@return
@note \
*/
/*----------------------------------------------------------------------------*/
void sys_enter_soft_poweroff(void *priv)
{
int detach_phone = 1;
struct sys_event clear_key_event = {.type = SYS_KEY_EVENT, .arg = "key"};
log_info("%s", __func__);
bt_user_priv_var.emitter_or_receiver = 0;
if (app_var.goto_poweroff_flag) {
return;
}
#if TCFG_BLUETOOTH_BACK_MODE
if (__this->exit_flag == 1 && __this->init_ok == 1) {
__this->cmd_flag = 1;
app_task_switch_to(APP_BT_TASK);
}
#endif
ui_update_status(STATUS_POWEROFF);
app_var.goto_poweroff_flag = 1;
app_var.goto_poweroff_cnt = 0;
#if 0
sys_key_event_disable();
sys_event_clear(&clear_key_event);
sys_auto_shut_down_disable();
sys_auto_sniff_controle(0, NULL);
BT_STATE_ENTER_SOFT_POWEROFF();
#if TCFG_CHARGESTORE_ENABLE
if (chargestore_get_earphone_online() != 2)
#else
if (1)
#endif
{
#if TCFG_USER_TWS_ENABLE
detach_phone = bt_tws_poweroff();
#endif
}
/* log_debug("detach_phone = %d\n", detach_phone); */
if (detach_phone) {
user_send_cmd_prepare(USER_CTRL_POWER_OFF, 0, NULL);
}
#endif
if (app_var.wait_exit_timer == 0) {
app_var.wait_exit_timer = sys_timer_add(priv, wait_exit_btstack_flag, 50);
}
}
/*----------------------------------------------------------------------------*/
/**@brief 自动关机开关
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void sys_auto_shut_down_enable(void)
{
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_TRANS_DATA)
extern u16 bt_ble_is_connected(void);
if (bt_ble_is_connected()) {
return;
}
#endif
#if TCFG_AUTO_SHUT_DOWN_TIME
log_debug("sys_auto_shut_down_enable\n");
if (app_var.auto_shut_down_timer == 0) {
u8 app = app_get_curr_task();
if (app == APP_BT_TASK) {
app_var.auto_shut_down_timer = sys_timeout_add(NULL, sys_enter_soft_poweroff, (app_var.auto_off_time * 1000));
} else {
/* log_debug("cur_app:%s, return", app->name); */
}
} else {//在切换到蓝牙任务APP_STA_START中current_app为空
sys_auto_shut_down_disable();
app_var.auto_shut_down_timer = sys_timeout_add(NULL, sys_enter_soft_poweroff, (app_var.auto_off_time * 1000));
}
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 关闭自动关机
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void sys_auto_shut_down_disable(void)
{
#if TCFG_AUTO_SHUT_DOWN_TIME
log_debug("sys_auto_shut_down_disable\n");
if (app_var.auto_shut_down_timer) {
sys_timeout_del(app_var.auto_shut_down_timer);
app_var.auto_shut_down_timer = 0;
}
#endif
}
/*************************************************************
**************************************************************/
static const u32 num0_9[] = {
(u32)TONE_NUM_0,
(u32)TONE_NUM_1,
(u32)TONE_NUM_2,
(u32)TONE_NUM_3,
(u32)TONE_NUM_4,
(u32)TONE_NUM_5,
(u32)TONE_NUM_6,
(u32)TONE_NUM_7,
(u32)TONE_NUM_8,
(u32)TONE_NUM_9,
} ;
static void number_to_play_list(char *num, u32 *lst)
{
u8 i = 0;
if (num) {
for (; i < strlen(num); i++) {
lst[i] = num0_9[num[i] - '0'] ;
}
}
lst[i++] = (u32)TONE_REPEAT_BEGIN(-1);
lst[i++] = (u32)TONE_RING;
lst[i++] = (u32)TONE_REPEAT_END();
lst[i++] = (u32)NULL;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙来电报号
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void phone_num_play_timer(void *priv)
{
char *len_lst[34];
if (get_call_status() == BT_CALL_HANGUP) {
/* log_debug("hangup,--phone num play return\n"); */
return;
}
log_info("%s\n", __FUNCTION__);
if (bt_user_priv_var.phone_num_flag) {
tone_play_stop();
number_to_play_list((char *)(bt_user_priv_var.income_phone_num), len_lst);
tone_file_list_play(len_lst, 1);
} else {
/*电话号码还没有获取到,定时查询*/
bt_user_priv_var.phone_timer_id = sys_timeout_add(NULL, phone_num_play_timer, 200);
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙来电报号启动
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void phone_num_play_start(void)
{
/* check if support inband ringtone */
if (!bt_user_priv_var.inband_ringtone) {
bt_user_priv_var.phone_num_flag = 0;
bt_user_priv_var.phone_timer_id = sys_timeout_add(NULL, phone_num_play_timer, 500);
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙来电铃声播放
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
u8 phone_ring_play_start(void)
{
char *len_lst[34];
if (get_call_status() == BT_CALL_HANGUP) {
/* log_debug("hangup,--phone ring play return\n"); */
return 0;
}
log_info("%s\n", __FUNCTION__);
/* check if support inband ringtone */
if (!bt_user_priv_var.inband_ringtone) {
tone_play_stop();
number_to_play_list(NULL, len_lst);
tone_file_list_play(len_lst, 1);
return 1;
}
return 0;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙提示音播放统一接口
@param index:
preemption/1:0
priv :
@return
@note
a2dp
a2dp buff .
*/
/*----------------------------------------------------------------------------*/
int bt_tone_play_index(u8 index, u8 preemption, void *priv)
{
bt_drop_a2dp_frame_start();
return tone_play_with_callback_by_name(tone_table[index], preemption, NULL, priv);
}
__attribute__((weak))
int earphone_a2dp_codec_get_low_latency_mode()
{
return 0;
}
__attribute__((weak))
void earphone_a2dp_codec_set_low_latency_mode(int enable)
{
return;
}
int bt_get_low_latency_mode()
{
return earphone_a2dp_codec_get_low_latency_mode();
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙tws 低电处理
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_set_low_latency_mode(int enable)
{
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_MASTER) {
if (tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED) {
if (enable) {
bt_tws_api_push_cmd(SYNC_CMD_LOW_LATENCY_ENABLE, 300);
} else {
bt_tws_api_push_cmd(SYNC_CMD_LOW_LATENCY_DISABLE, 300);
}
} else {
earphone_a2dp_codec_set_low_latency_mode(enable);
}
}
#else
earphone_a2dp_codec_set_low_latency_mode(enable);
#endif
}
/*************************************************************
**************************************************************/
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 事件过滤
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
u8 bt_status_event_filter(struct bt_event *bt)
{
if (__this->init_ok && app_var.goto_poweroff_flag) {
if (bt->event != BT_STATUS_A2DP_MEDIA_STOP) {
return false;
}
}
#if (RECORDER_MIX_EN)
recorder_mix_bt_status_event(bt);
#endif//RECORDER_MIX_EN
#if SOUNDCARD_ENABLE
soundcard_bt_connect_status_event(bt);
#endif//SOUNDCARD_ENABLE
UI_MSG_POST("bt_status:event=%4", bt->event);
return true;
}
void bt_status_init_ok(struct bt_event *bt)
{
__this->init_ok = 1;
if (__this->init_ok_time == 0) {
__this->init_ok_time = timer_get_ms();
__this->auto_exit_limit_time = POWERON_AUTO_CONN_TIME * 1000;
/* tone_dec_wait_stop(3000); */
}
#if TCFG_USER_BLE_ENABLE
if (BT_MODE_IS(BT_BQB)) {
ble_bqb_test_thread_init();
} else {
bt_ble_init();
}
#endif
#if TCFG_USER_EMITTER_ENABLE
////发射器设置回调等
void bt_emitter_init() ;
bt_emitter_init();
extern u8 emitter_search_result(char *name, u8 name_len, u8 * addr, u32 dev_class, char rssi);
inquiry_result_handle_register(emitter_search_result);
extern void emitter_or_receiver_switch(u8 flag);
emitter_or_receiver_switch(BT_EMITTER_EN);
return;
#endif
bt_init_ok_search_index();
bt_set_led_status(STATUS_BT_INIT_OK);
#if TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE
chargestore_set_bt_init_ok(1);
#endif
#if ((CONFIG_BT_MODE == BT_BQB)||(CONFIG_BT_MODE == BT_PER))
bt_wait_phone_connect_control(1);
#else
#if TCFG_USER_TWS_ENABLE
bt_tws_poweron();
#elif TCFG_VIRTUAL_FAST_CONNECT_FOR_EMITTER
bt_virtual_fast_connect_poweron(BT_RECEIVER_EN);
#else
bt_wait_connect_and_phone_connect_switch(0);
#endif
#endif
}
void bt_status_init_ok_background(struct bt_event *bt)
{
__this->init_ok = 1;
#if TCFG_USER_BLE_ENABLE
if (BT_MODE_IS(BT_BQB)) {
ble_bqb_test_thread_init();
} else {
bt_ble_init();
}
#endif
#if TCFG_USER_EMITTER_ENABLE
////发射器设置回调等
void bt_emitter_init() ;
bt_emitter_init();
extern u8 emitter_search_result(char *name, u8 name_len, u8 * addr, u32 dev_class, char rssi);
inquiry_result_handle_register(emitter_search_result);
extern void emitter_or_receiver_switch(u8 flag);
emitter_or_receiver_switch(BT_EMITTER_EN);
/* bt_user_priv_var.emitter_or_receiver = BT_EMITTER_EN; */
return;
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 设备连接上状态
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_connect(struct bt_event *bt)
{
sys_auto_sniff_controle(1, NULL);
sys_auto_shut_down_disable();
#if SMART_BOX_EN
memcpy(__this->last_connecting_addr, bt->args, 6);
extern void smartbox_update_bt_emitter_connect_state(u8 state, u8 * addr);
smartbox_update_bt_emitter_connect_state(1, __this->last_connecting_addr);
#endif
/* UI_MSG_POST("bt_status:n=%4", 1); */
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
{
u8 connet_type;
if (get_auto_connect_state(bt->args)) {
connet_type = ICON_TYPE_RECONNECT;
} else {
connet_type = ICON_TYPE_CONNECTED;
}
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_MASTER) {
bt_ble_icon_open(connet_type);
} else {
//maybe slave already open
bt_ble_icon_close(0);
}
#else
bt_ble_icon_open(connet_type);
#endif
}
#endif
#if (TCFG_BD_NUM == 2)
if (get_current_poweron_memory_search_index(NULL) == 0) {
#if USER_SUPPORT_DUAL_A2DP_SOURCE
extern void bt_emitter_dev_search();
bt_emitter_dev_search();
#else
bt_wait_phone_connect_control(1);
#endif
}
#endif
#if TCFG_USER_TWS_ENABLE
if (!get_bt_tws_connect_status()) { //如果对耳还未连接就连上手机,要切换闪灯状态
bt_set_led_status(STATUS_BT_CONN);
}
if (bt_tws_phone_connected()) {
return ;
}
#else
bt_set_led_status(STATUS_BT_CONN); //单台在此处设置连接状态,对耳的连接状态需要同步在bt_tws.c中去设置
#if (TCFG_AUTO_STOP_PAGE_SCAN_TIME && TCFG_BD_NUM == 2)
if (get_total_connect_dev() == 1) { //当前有一台连接上了
if (app_var.auto_stop_page_scan_timer == 0) {
app_var.auto_stop_page_scan_timer = sys_timeout_add(NULL, bt_close_page_scan, (TCFG_AUTO_STOP_PAGE_SCAN_TIME * 1000)); //2
}
} else {
if (app_var.auto_stop_page_scan_timer) {
sys_timeout_del(app_var.auto_stop_page_scan_timer);
app_var.auto_stop_page_scan_timer = 0;
}
}
#endif //endif AUTO_STOP_PAGE_SCAN_TIME
#endif
/* log_debug("tone status:%d\n", tone_get_status()); */
if (get_call_status() == BT_CALL_HANGUP) {
bt_tone_play_index(IDEX_TONE_BT_CONN, 1, NULL);
}
}
void bt_status_connect_background(struct bt_event *bt)
{
sys_auto_sniff_controle(1, NULL);
sys_auto_shut_down_disable();
#if SMART_BOX_EN
memcpy(__this->last_connecting_addr, bt->args, 6);
extern void smartbox_update_bt_emitter_connect_state(u8 state, u8 * addr);
smartbox_update_bt_emitter_connect_state(1, __this->last_connecting_addr);
#endif
static u8 mac_addr[6];
memcpy(mac_addr, bt->args, 6);
UI_MSG_POST("bt_connect_info:mac=%4", mac_addr);
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
{
u8 connet_type;
if (get_auto_connect_state(bt->args)) {
connet_type = ICON_TYPE_RECONNECT;
} else {
connet_type = ICON_TYPE_CONNECTED;
}
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_MASTER) {
bt_ble_icon_open(connet_type);
} else {
//maybe slave already open
bt_ble_icon_close(0);
}
#else
bt_ble_icon_open(connet_type);
#endif
}
#endif
#if (TCFG_BD_NUM == 2)
if ((get_total_connect_dev() == 1) && bt->value) { //当前有一台连接上了,并且连接的是sink设备
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
}
/* if (get_current_poweron_memory_search_index(NULL) == 0) { */
/* bt_wait_phone_connect_control(1); */
/* } */
#endif
#if TCFG_USER_TWS_ENABLE
if (!get_bt_tws_connect_status()) { //如果对耳还未连接就连上手机,要切换闪灯状态
bt_set_led_status(STATUS_BT_CONN);
}
if (bt_tws_phone_connected()) {
return ;
}
#else
bt_set_led_status(STATUS_BT_CONN); //单台在此处设置连接状态,对耳的连接状态需要同步在bt_tws.c中去设置
#if (TCFG_AUTO_STOP_PAGE_SCAN_TIME && TCFG_BD_NUM == 2)
if ((get_total_connect_dev() == 1) && bt->value) { //当前有一台连接上了,并且连接的是sink设备
if (app_var.auto_stop_page_scan_timer == 0) {
app_var.auto_stop_page_scan_timer = sys_timeout_add(NULL, bt_close_page_scan, (TCFG_AUTO_STOP_PAGE_SCAN_TIME * 1000)); //2
}
} else {
if (app_var.auto_stop_page_scan_timer) {
sys_timeout_del(app_var.auto_stop_page_scan_timer);
app_var.auto_stop_page_scan_timer = 0;
}
}
#endif //endif AUTO_STOP_PAGE_SCAN_TIME
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 设备断开连接
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_disconnect(struct bt_event *bt)
{
sys_auto_sniff_controle(0, NULL);
__this->call_flag = 0;
/* log_info("BT_STATUS_DISCONNECT\n"); */
#if (SMART_BOX_EN)
smartbox_update_bt_emitter_connect_state(0, __this->last_connecting_addr);
#endif
/* UI_MSG_POST("bt_status:n=%4", 0); */
#if (AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_BT)
#if USER_SUPPORT_DUAL_A2DP_SOURCE
bt_emitter_stu_set(bt->args, 0);
#else
bt_emitter_stu_set(NULL, 0);
#endif
#endif
bt_set_led_status(STATUS_BT_DISCONN);
#if(TCFG_BD_NUM == 2) //对耳在bt_tws同步播放提示音
if (!app_var.goto_poweroff_flag) { /*关机不播断开提示音*/
if (!__this->ignore_discon_tone) {
tone_play_by_path(tone_table[IDEX_TONE_BT_DISCONN], 1);
}
}
#else
#if TCFG_USER_TWS_ENABLE
if (!get_bt_tws_connect_status())
#endif
{
if (!app_var.goto_poweroff_flag) { /*关机不播断开提示音*/
if (!__this->ignore_discon_tone) {
bt_tone_play_index(IDEX_TONE_BT_DISCONN, 1, NULL);
}
}
}
#endif
#if TCFG_USER_TWS_ENABLE
STATUS *p_led = get_led_config();
if (get_bt_tws_connect_status()) {
#if TCFG_CHARGESTORE_ENABLE
chargestore_set_phone_disconnect();
#endif
if (tws_api_get_role() == TWS_ROLE_MASTER) {
bt_tws_api_push_cmd(SYNC_CMD_LED_PHONE_DISCONN_STATUS, 400);
}
} else {
//断开手机时如果对耳未连接要把LED时钟切到RC因为单台会进SNIFF
if (!app_var.goto_poweroff_flag) { /*关机时不改UI*/
pwm_led_clk_set(PWM_LED_CLK_RC32K);
bt_set_led_status(STATUS_BT_DISCONN);
}
}
__this->tws_local_back_role = 0;
#else
if (get_total_connect_dev() == 0) { //已经没有设备连接
if (!app_var.goto_poweroff_flag) { /*关机时不改UI*/
bt_set_led_status(STATUS_BT_DISCONN);
}
sys_auto_shut_down_enable();
}
#endif
}
void bt_status_disconnect_background(struct bt_event *bt)
{
sys_auto_sniff_controle(0, NULL);
__this->call_flag = 0;
/* log_info("BT_STATUS_DISCONNECT\n"); */
#if (AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_BT)
if (bt->value) {
emitter_close(1);
}
#endif
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_MASTER) {
bt_tws_api_push_cmd(SYNC_CMD_LED_PHONE_DISCONN_STATUS, 400);
}
__this->tws_local_back_role = 0;
#endif
}
//来电响铃声过程,不允许打开混响,
//若已打开,会关闭,待接通或者挂断后,重新开启混响
void dis_mic_eff(void *p)
{
#if (TCFG_MIC_EFFECT_ENABLE)
static u8 re_active = 0;
static u16 active_timer = 0;
if (get_call_status() == BT_CALL_INCOMING) {
if (mic_effect_get_status()) {
mic_effect_stop();
re_active = 1;
if (active_timer) {
sys_timer_del(active_timer);
active_timer = 0;
}
active_timer = sys_timer_add(NULL, dis_mic_eff, 100);
}
} else {
if (re_active) {
re_active = 0;
//notify msg
struct sys_event e = {0};
e.type = SYS_KEY_EVENT;
e.u.key.init = 1;
e.u.key.type = KEY_DRIVER_TYPE_SOFTKEY;
e.u.key.event = KEY_REVERB_OPEN;
sys_event_notify(&e);//重启mic effect
puts("re_active mic effect\n");
if (active_timer) {
sys_timer_del(active_timer);
active_timer = 0;
}
}
}
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机来电
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_phone_income(struct bt_event *bt)
{
dis_mic_eff(NULL);
__this->esco_dump_packet = ESCO_DUMP_PACKET_CALL;
ui_update_status(STATUS_PHONE_INCOME);
u8 tmp_bd_addr[6];
memcpy(tmp_bd_addr, bt->args, 6);
if (bt_switch_back_timer) {
sys_timeout_del(bt_switch_back_timer);
bt_switch_back_timer = 0;
}
/*
*(1)1t2有一台通话的时候
*(2)1t2两台同时来电
*/
if ((check_esco_state_via_addr(tmp_bd_addr) != BD_ESCO_BUSY_OTHER) && (bt_user_priv_var.phone_ring_flag == 0)) {
#if BT_INBAND_RINGTONE
extern u8 get_device_inband_ringtone_flag(void);
bt_user_priv_var.inband_ringtone = get_device_inband_ringtone_flag();
#else
bt_user_priv_var.inband_ringtone = 0 ;
lmp_private_esco_suspend_resume(3);
#endif
bt_user_priv_var.phone_ring_flag = 1;
bt_user_priv_var.phone_income_flag = 1;
#if TCFG_USER_TWS_ENABLE
#if BT_SYNC_PHONE_RING
if (!bt_tws_sync_phone_num(NULL))
#else
if (tws_api_get_role() == TWS_ROLE_MASTER)
#endif
#endif
{
#if BT_PHONE_NUMBER
phone_num_play_start();
#else
phone_ring_play_start();
#endif
}
user_send_cmd_prepare(USER_CTRL_HFP_CALL_CURRENT, 0, NULL); //发命令获取电话号码
} else {
/* log_debug("SCO busy now:%d,%d\n", check_esco_state_via_addr(tmp_bd_addr), bt_user_priv_var.phone_ring_flag); */
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机打出电话
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_phone_out(struct bt_event *bt)
{
if (bt_switch_back_timer) {
sys_timeout_del(bt_switch_back_timer);
bt_switch_back_timer = 0;
}
lmp_private_esco_suspend_resume(4);
__this->esco_dump_packet = ESCO_DUMP_PACKET_CALL;
ui_update_status(STATUS_PHONE_OUT);
bt_user_priv_var.phone_income_flag = 0;
user_send_cmd_prepare(USER_CTRL_HFP_CALL_CURRENT, 0, NULL); //发命令获取电话号码
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机接通电话
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_phone_active(struct bt_event *bt)
{
ui_update_status(STATUS_PHONE_ACTIV);
if (bt_user_priv_var.phone_call_dec_begin) {
/* log_debug("call_active,dump_packet clear\n"); */
__this->esco_dump_packet = ESCO_DUMP_PACKET_DEFAULT;
}
if (bt_user_priv_var.phone_ring_flag) {
bt_user_priv_var.phone_ring_flag = 0;
tone_play_stop();
if (bt_user_priv_var.phone_timer_id) {
sys_timeout_del(bt_user_priv_var.phone_timer_id);
bt_user_priv_var.phone_timer_id = 0;
}
}
lmp_private_esco_suspend_resume(4);
bt_user_priv_var.phone_income_flag = 0;
bt_user_priv_var.phone_num_flag = 0;
bt_user_priv_var.phone_con_sync_num_ring = 0;
bt_user_priv_var.phone_con_sync_ring = 0;
bt_user_priv_var.phone_vol = 15;
/* log_debug("phone_active:%d\n", app_var.call_volume); */
#ifdef PHONE_CALL_DEFAULT_MAX_VOL
bt_user_priv_var.set_call_vol_flag |= BIT(1);
if ((BIT(1) | BIT(2)) == bt_user_priv_var.set_call_vol_flag) {
app_audio_set_volume(APP_AUDIO_STATE_CALL, 15, 1);
sys_timeout_add(NULL, phone_sync_vol, 1200);
}
#else
app_audio_set_volume(APP_AUDIO_STATE_CALL, app_var.call_volume, 1);
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机挂断电话
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_phone_hangup(struct bt_event *bt)
{
__this->esco_dump_packet = ESCO_DUMP_PACKET_CALL;
/* log_info("phone_handup\n"); */
if (bt_user_priv_var.phone_ring_flag) {
bt_user_priv_var.phone_ring_flag = 0;
tone_play_stop();
if (bt_user_priv_var.phone_timer_id) {
sys_timeout_del(bt_user_priv_var.phone_timer_id);
bt_user_priv_var.phone_timer_id = 0;
}
}
lmp_private_esco_suspend_resume(4);
bt_user_priv_var.phone_num_flag = 0;
bt_user_priv_var.phone_con_sync_num_ring = 0;
bt_user_priv_var.phone_con_sync_ring = 0;
__this->call_back_flag &= ~BIT(0);
if ((__this->call_back_flag == 0) && __this->call_flag) {
if (bt_switch_back_timer == 0) {
r_printf("timerout_add:bt_switch_back_timer");
bt_switch_back_timer = sys_timeout_add(NULL, bt_switch_back, 500);
}
}
if (get_call_status() == BT_CALL_HANGUP) {
//call handup
bt_user_priv_var.set_call_vol_flag = 0;
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机来电号码
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_phone_number(struct bt_event *bt)
{
u8 *phone_number = NULL;
phone_number = (u8 *)bt->value;
//put_buf(phone_number, strlen((const char *)phone_number));
if (bt_user_priv_var.phone_num_flag == 1) {
return ;
}
bt_user_priv_var.income_phone_len = 0;
memset(bt_user_priv_var.income_phone_num, '\0', sizeof(bt_user_priv_var.income_phone_num));
for (int i = 0; i < strlen((const char *)phone_number); i++) {
if (phone_number[i] >= '0' && phone_number[i] <= '9') {
//过滤,只有数字才能报号
bt_user_priv_var.income_phone_num[bt_user_priv_var.income_phone_len++] = phone_number[i];
if (bt_user_priv_var.income_phone_len >= sizeof(bt_user_priv_var.income_phone_num)) {
return; /*buffer 空间不够,后面不要了*/
}
}
}
if (bt_user_priv_var.income_phone_len > 0) {
bt_user_priv_var.phone_num_flag = 1;
} else {
log_debug("PHONE_NUMBER len err\n");
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机来电铃声
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_inband_ringtone(struct bt_event *bt)
{
#if BT_INBAND_RINGTONE
bt_user_priv_var.inband_ringtone = bt->value;
#else
bt_user_priv_var.inband_ringtone = 0;
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙停止正在播放的模式提示音
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
#if (TCFG_DEC2TWS_ENABLE)
void bt_mode_stop_other_mode_tone(void)
{
log_i("bt_mode_stop_other_mode_tone \n");
#if (TCFG_APP_MUSIC_EN)
tone_play_stop_by_path(tone_table[IDEX_TONE_MUSIC]);
tone_play_stop_by_path(tone_table[IDEX_TONE_SD]);
tone_play_stop_by_path(tone_table[IDEX_TONE_UDISK]);
#endif
#if (TCFG_APP_LINEIN_EN)
tone_play_stop_by_path(tone_table[IDEX_TONE_LINEIN]);
#endif
#if (TCFG_APP_FM_EN)
tone_play_stop_by_path(tone_table[IDEX_TONE_FM]);
#endif
#if (TCFG_APP_PC_EN)
tone_play_stop_by_path(tone_table[IDEX_TONE_PC]);
#endif
#if (TCFG_APP_RTC_EN)
tone_play_stop_by_path(tone_table[IDEX_TONE_RTC]);
#endif
#if (TCFG_APP_RECORD_EN)
tone_play_stop_by_path(tone_table[IDEX_TONE_RECORD]);
#endif
}
#endif
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机高级音频开始播放
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_a2dp_media_start(struct bt_event *bt)
{
__this->call_flag = 0;
__this->a2dp_start_flag = 1;
#if (TCFG_DEC2TWS_ENABLE)
bt_drop_a2dp_frame_stop();
a2dp_media_clear_packet_before_seqn(0);
if (bt_media_is_running()) {
log_debug("is_a2dp_dec_open break\n");
return ;
}
if (localtws_dec_is_open()) {
// 先发命令再关闭解码减少tws两边结束的时间差异
bt_a2dp_drop_frame(NULL);
tws_user_sync_box(TWS_BOX_NOTICE_A2DP_BACK_TO_BT_MODE, 0);
os_time_dly(2);
localtws_dec_close(1);
}
// 停止其他模式提示音
bt_mode_stop_other_mode_tone();
#endif
a2dp_dec_open(bt->value);
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机高级音频停止播放
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_a2dp_media_stop(struct bt_event *bt)
{
__this->a2dp_start_flag = 0;
bt_drop_a2dp_frame_stop();
a2dp_dec_close();
#if (TCFG_DEC2TWS_ENABLE)
if (is_tws_active_device()) {
return ;
}
#endif
#if TCFG_USER_TWS_ENABLE
if (get_bt_tws_connect_status()) {
}
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机通话链路切换
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_sco_change(struct bt_event *bt)
{
void mem_stats(void);
mem_stats();
/* log_info(" BT_STATUS_SCO_STATUS_CHANGE len:%d ,type:%d", (bt->value >> 16), (bt->value & 0x0000ffff)); */
if (bt->value != 0xff) {
#ifdef PHONE_CALL_DEFAULT_MAX_VOL
bt_user_priv_var.set_call_vol_flag |= BIT(2);
if ((BIT(1) | BIT(2)) == bt_user_priv_var.set_call_vol_flag) {
/* app_audio_set_volume(APP_AUDIO_STATE_CALL, app_var.aec_dac_gain, 1); */
app_audio_set_volume(APP_AUDIO_STATE_CALL, 15, 1);
sys_timeout_add(NULL, phone_sync_vol, 1200);
}
/* log_debug("--test printfjjj --%x\n", bt_user_priv_var.set_call_vol_flag); */
#endif
log_info("<<<<<<<<<<<esco_dec_stat\n");
__this->call_back_flag |= BIT(1);
app_reset_vddiom_lev(VDDIOM_VOL_32V);
#if 0 //debug
void mic_capless_feedback_toggle(u8 toggle);
mic_capless_feedback_toggle(0);
#endif
#if CALLING_MIC_EFFECT_DISABLE
if (mic_effect_get_status()) {
mic_effect_stop();
}
audio_adc_set_irq_point_unit(256);
set_fixed_dac_output_rate16K(1);
#endif
#if PHONE_CALL_USE_LDO15
if ((get_chip_version() & 0xff) <= 0x04) { //F版芯片以下的通话需要使用LDO模式
power_set_mode(PWR_LDO15);
}
#endif
#if (TCFG_DEC2TWS_ENABLE)
if (localtws_dec_close(1)) {
bt_a2dp_drop_frame(NULL);
}
// 停止其他模式提示音
bt_mode_stop_other_mode_tone();
#endif
#if TCFG_USER_TWS_ENABLE
#if TCFG_USER_ESCO_SLAVE_MUTE
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
esco_dec_open(&bt->value, 1);
} else
#endif
#endif
{
esco_dec_open(&bt->value, 0);
}
bt_user_priv_var.phone_call_dec_begin = 1;
if (get_call_status() == BT_CALL_ACTIVE) {
log_debug("dec_begin,dump_packet clear\n");
__this->esco_dump_packet = ESCO_DUMP_PACKET_DEFAULT;
}
#if TCFG_USER_TWS_ENABLE
tws_page_scan_deal_by_esco(1);
#endif
#if (RECORDER_MIX_EN)
recorder_mix_call_status_change(1);
#endif/*RECORDER_MIX_EN*/
} else {
log_info("<<<<<<<<<<<esco_dec_stop\n");
__this->call_back_flag &= ~BIT(1);
app_reset_vddiom_lev(VDDIOM_VOL_34V);
bt_user_priv_var.set_call_vol_flag &= ~BIT(2);
bt_user_priv_var.phone_call_dec_begin = 0;
__this->esco_dump_packet = ESCO_DUMP_PACKET_CALL;
esco_dec_close();
#if CALLING_MIC_EFFECT_DISABLE
audio_adc_set_irq_point_unit(0);
set_fixed_dac_output_rate16K(0);
#endif // CALLING_MIC_EFFECT_DISABLE
#if (RECORDER_MIX_EN)
recorder_mix_call_status_change(0);
#endif/*RECORDER_MIX_EN*/
#if TCFG_USER_TWS_ENABLE
tws_page_scan_deal_by_esco(0);
#endif
#if PHONE_CALL_USE_LDO15
if ((get_chip_version() & 0xff) <= 0x04) { //F版芯片以下的通话需要使用LDO模式
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
}
#endif
#if (TCFG_DEC2TWS_ENABLE)
if (is_tws_active_device()) {
return ;
}
#endif
if ((__this->call_back_flag == 0) && __this->call_flag) {
if (bt_switch_back_timer == 0) {
g_printf("timerout_add:bt_switch_back_timer");
bt_switch_back_timer = sys_timeout_add(NULL, bt_switch_back, 500);
}
}
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机通话过程中设置音量产生状态
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_call_vol_change(struct bt_event *bt)
{
u8 volume = bt->value; //app_audio_get_max_volume() * bt->value / 15;
u8 call_status = get_call_status();
bt_user_priv_var.phone_vol = bt->value;
if ((call_status == BT_CALL_ACTIVE) || (call_status == BT_CALL_OUTGOING) || app_var.siri_stu) {
app_audio_set_volume(APP_AUDIO_STATE_CALL, volume, 1);
} else if (call_status != BT_CALL_HANGUP) {
/*只保存不设置到dac*/
app_var.call_volume = volume;
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 样机和链接设备进入sniff模式后返回来的状态
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_sniff_state_update(struct bt_event *bt)
{
if (bt->value == 0) {
#if (TCFG_USER_TWS_ENABLE == 1)
pwm_led_clk_set(PWM_LED_CLK_BTOSC_24M);
#endif
sys_auto_sniff_controle(1, bt->args);
} else {
#if (TCFG_USER_TWS_ENABLE == 1)
pwm_led_clk_set(PWM_LED_CLK_RC32K);
#endif
sys_auto_sniff_controle(0, bt->args);
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 最后拨打电话类型
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_last_call_type_change(struct bt_event *bt)
{
__this->call_back_flag |= BIT(0);
bt_user_priv_var.last_call_type = bt->value;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 高级音频链接上
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_conn_a2dp_ch(struct bt_event *bt)
{
#if TCFG_USER_EMITTER_ENABLE
if (bt_user_priv_var.emitter_or_receiver == BT_EMITTER_EN) {
/* extern int music_player_get_play_status(void); */
/* if (bt->value && (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)) { */
/* emitter_open(1); */
/* } */
#if USER_SUPPORT_DUAL_A2DP_SOURCE
if (get_total_connect_dev() == 2) {
__emitter_send_media_toggle(bt->args, 1);
} else {
app_task_put_key_msg(KEY_BT_EMITTER_SW, 0);
}
#else
app_task_put_key_msg(KEY_BT_EMITTER_SW, 0);
#endif
}
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 手机音频链接上
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_conn_hfp_ch(struct bt_event *bt)
{
#if !TCFG_USER_EMITTER_ENABLE
if ((!is_1t2_connection()) && (get_current_poweron_memory_search_index(NULL))) { //回连下一个device
if (get_esco_coder_busy_flag()) {
clear_current_poweron_memory_search_index(0);
} else {
user_send_cmd_prepare(USER_CTRL_START_CONNECTION, 0, NULL);
}
}
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 获取手机厂商
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_phone_menufactuer(struct bt_event *bt)
{
extern const u8 hid_conn_depend_on_dev_company;
app_var.remote_dev_company = bt->value;
if (hid_conn_depend_on_dev_company) {
if (bt->value) {
//user_send_cmd_prepare(USER_CTRL_HID_CONN, 0, NULL);
} else {
user_send_cmd_prepare(USER_CTRL_HID_DISCONNECT, 0, NULL);
}
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 语音识别
@param
@return
@note bt->value 0-siri关闭状态
1-siri开启状态
2-siri成功状态.
3-
*/
/*----------------------------------------------------------------------------*/
void bt_status_voice_recognition(struct bt_event *bt)
{
__this->esco_dump_packet = ESCO_DUMP_PACKET_DEFAULT;
/* put_buf(bt, sizeof(struct bt_event)); */
app_var.siri_stu = bt->value;
if (__this->call_flag && ((app_var.siri_stu == 0) || (app_var.siri_stu == 3))) {
if (bt_switch_back_timer == 0) {
bt_switch_back_timer = sys_timeout_add(NULL, bt_switch_back, 500);
}
}
//#if (RECORDER_MIX_EN)
// if (app_var.siri_stu) {
// recorder_mix_stop();
// }
//#endif/*RECORDER_MIX_EN*/
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙status 接收远端设备发过来的avrcp命令
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_status_avrcp_income_opid(struct bt_event *bt)
{
#define AVC_VOLUME_UP 0x41
#define AVC_VOLUME_DOWN 0x42
log_debug("BT_STATUS_AVRCP_INCOME_OPID:%d\n", bt->value);
if (bt->value == AVC_VOLUME_UP) {
}
if (bt->value == AVC_VOLUME_DOWN) {
}
}
/*************************************************************
**************************************************************/
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙event 蓝牙协议栈事件过滤
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
u8 bt_hci_event_filter(struct bt_event *bt)
{
if (bt->event == HCI_EVENT_VENDOR_REMOTE_TEST) {
if (VENDOR_TEST_DISCONNECTED == bt->value) {
#if TCFG_TEST_BOX_ENABLE
if (chargestore_get_testbox_status()) {
if (get_remote_test_flag()) {
chargestore_clear_connect_status();
}
}
#endif
set_remote_test_flag(0);
log_info("clear_test_box_flag");
cpu_reset();
return 0;
} else {
#if TCFG_USER_BLE_ENABLE
#if (CONFIG_BT_MODE == BT_NORMAL)
//1:edr con;2:ble con;
if (VENDOR_TEST_LEGACY_CONNECTED_BY_BT_CLASSIC == bt->value) {
extern void bt_ble_adv_enable(u8 enable);
bt_ble_adv_enable(0);
}
#endif
#endif
#if TCFG_USER_TWS_ENABLE
if (VENDOR_TEST_CONNECTED_WITH_TWS != bt->value) {
bt_tws_poweroff();
}
#endif
}
}
/* if (bt->event == HCI_EVENT_VENDOR_REMOTE_TEST) { */
/* if (0 == bt->value) { */
/* set_remote_test_flag(0); */
/* #<{(| log_debug("clear_test_box_flag"); |)}># */
/* return 0; */
/* } else { */
/* */
/* #if TCFG_USER_BLE_ENABLE */
/* //1:edr con;2:ble con; */
/* if (1 == bt->value) { */
/* extern void bt_ble_adv_enable(u8 enable); */
/* bt_ble_adv_enable(0); */
/* } */
/* #endif */
/* */
/* #if TCFG_USER_TWS_ENABLE */
/* bt_tws_poweroff(); */
/* #endif */
/* } */
/* } */
/* if ((bt->event != HCI_EVENT_CONNECTION_COMPLETE) || */
/* ((bt->event == HCI_EVENT_CONNECTION_COMPLETE) && (bt->value != ERROR_CODE_SUCCESS))) { */
/* #if TCFG_TEST_BOX_ENABLE */
/* if (chargestore_get_testbox_status()) { */
/* if (get_remote_test_flag()) { */
/* chargestore_clear_connect_status(); */
/* } */
/* //return 0; */
/* } */
/* #endif */
/* #<{(| if (get_remote_test_flag() \ |)}># */
/* #<{(| && !(HCI_EVENT_DISCONNECTION_COMPLETE == bt->event) \ |)}># */
/* #<{(| && !(HCI_EVENT_VENDOR_REMOTE_TEST == bt->event) \ |)}># */
/* #<{(| && !get_total_connect_dev()) { |)}># */
/* #<{(| log_info("cpu reset\n"); |)}># */
/* #<{(| cpu_reset(); |)}># */
/* #<{(| } |)}># */
/* } */
if (__this->bt_close_bredr) {
return 0;
}
#if CONFIG_TWS_DISCONN_NO_RECONN
extern u8 tws_detach_by_remove_key;
if (tws_detach_by_remove_key) {
return 0;
}
#endif
return 1;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙event 搜索结束
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_hci_event_inquiry(struct bt_event *bt)
{
#if TCFG_USER_EMITTER_ENABLE
if (bt_user_priv_var.emitter_or_receiver == BT_EMITTER_EN) {
extern void emitter_search_stop(u8 result);
emitter_search_stop(bt->value);
}
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙event 链接成功
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_hci_event_connection(struct bt_event *bt)
{
/* log_debug("tws_conn_state=%d\n", bt_user_priv_var.tws_conn_state); */
#if TCFG_USER_TWS_ENABLE
bt_tws_hci_event_connect();
#ifndef CONFIG_NEW_BREDR_ENABLE
tws_try_connect_disable();
#endif
#else
if (bt_user_priv_var.auto_connection_timer) {
sys_timeout_del(bt_user_priv_var.auto_connection_timer);
bt_user_priv_var.auto_connection_timer = 0;
}
bt_user_priv_var.auto_connection_counter = 0;
bt_wait_phone_connect_control(0);
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙event 链接断开
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_hci_event_disconnect(struct bt_event *bt)
{
u8 local_addr[6];
if (app_var.goto_poweroff_flag || __this->exiting) {
return;
}
if (get_total_connect_dev() == 0) { //已经没有设备连接
sys_auto_shut_down_enable();
}
#if TCFG_TEST_BOX_ENABLE
if (chargestore_get_testbox_status()) {
/* log_info("<<<<<<<<<<<<<<<<<wait bt discon,then page_scan>>>>>>>>>>>>>\n"); */
bt_get_vm_mac_addr(local_addr);
//log_info("local_adr\n");
//put_buf(local_addr,6);
lmp_hci_write_local_address(local_addr);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
return;
}
#endif
#if (TCFG_AUTO_STOP_PAGE_SCAN_TIME && TCFG_BD_NUM == 2)
if (get_total_connect_dev() == 1) { //当前有一台连接上了
if (app_var.auto_stop_page_scan_timer == 0) {
app_var.auto_stop_page_scan_timer = sys_timeout_add(NULL, bt_close_page_scan, (TCFG_AUTO_STOP_PAGE_SCAN_TIME * 1000)); //2
}
} else {
if (app_var.auto_stop_page_scan_timer) {
sys_timeout_del(app_var.auto_stop_page_scan_timer);
app_var.auto_stop_page_scan_timer = 0;
}
}
#endif //endif AUTO_STOP_PAGE_SCAN_TIME
#if (TCFG_BD_NUM == 2)
if ((bt->value == ERROR_CODE_CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR) ||
(bt->value == ERROR_CODE_CONNECTION_ACCEPT_TIMEOUT_EXCEEDED)) {
/*
*
*1t2
*/
if (get_current_poweron_memory_search_index(NULL)) {
user_send_cmd_prepare(USER_CTRL_START_CONNECTION, 0, NULL);
return;
}
}
#endif
#if TCFG_USER_TWS_ENABLE
/* bt_tws_phone_disconnected(); */
if (bt->value == ERROR_CODE_CONNECTION_TIMEOUT) {
bt_tws_phone_connect_timeout();
} else {
bt_and_tws_phone_disconnected();
}
#else
if (bt_user_priv_var.emitter_or_receiver != BT_EMITTER_EN) {
bt_wait_phone_connect_control(1);
} else {
#if (TCFG_SPI_LCD_ENABLE)
//彩屏方案又ui 控制
/* if (bt_search_status()) { */
/* return; */
/* } */
u8 search_index = 0;
search_index = get_current_poweron_memory_search_index(NULL);
if (search_index) {
/* log_debug(">>>>>>>>> search_index =%d \n", search_index); */
user_send_cmd_prepare(USER_CTRL_START_CONNECTION, 0, NULL);
return;
}
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
#else
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
#endif
}
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙event 链接link key 错误
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_hci_event_linkkey_missing(struct bt_event *bt)
{
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
#if (CONFIG_NO_DISPLAY_BUTTON_ICON && TCFG_CHARGESTORE_ENABLE)
//已取消配对了
if (bt_ble_icon_get_adv_state() == ADV_ST_RECONN) {
//切换广播
/* log_info("switch_INQ\n"); */
bt_ble_icon_open(ICON_TYPE_INQUIRY);
}
#endif
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙event 回链超时
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_hci_event_page_timeout(struct bt_event *bt)
{
log_info("-----------HCI_EVENT_PAGE_TIMEOUT conuter %d", bt_user_priv_var.auto_connection_counter);
#if TCFG_USER_TWS_ENABLE
bt_tws_phone_page_timeout();
#else
/* if (!bt_user_priv_var.auto_connection_counter) { */
if (bt_user_priv_var.auto_connection_timer) {
sys_timer_del(bt_user_priv_var.auto_connection_timer);
bt_user_priv_var.auto_connection_timer = 0;
}
#if (TCFG_BD_NUM == 2)
if (get_current_poweron_memory_search_index(NULL)) {
user_send_cmd_prepare(USER_CTRL_START_CONNECTION, 0, NULL);
return;
}
#endif
/* if (bt_user_priv_var.emitter_or_receiver != BT_EMITTER_EN) { */
bt_wait_phone_connect_control(1);
/* } else { */
/* user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL); */
/* } */
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙event 链接超时
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_hci_event_connection_timeout(struct bt_event *bt)
{
if (!get_remote_test_flag() && !get_esco_busy_flag()) {
bt_user_priv_var.auto_connection_counter = (TIMEOUT_CONN_TIME * 1000);
memcpy(bt_user_priv_var.auto_connection_addr, bt->args, 6);
#if TCFG_USER_TWS_ENABLE
bt_tws_phone_connect_timeout();
#else
#if ((CONFIG_BT_MODE == BT_BQB)||(CONFIG_BT_MODE == BT_PER))
bt_wait_phone_connect_control(1);
#else
user_send_cmd_prepare(USER_CTRL_PAGE_CANCEL, 0, NULL);
bt_wait_connect_and_phone_connect_switch(0);
#endif
//user_send_cmd_prepare(USER_CTRL_START_CONNEC_VIA_ADDR, 6, bt->args);
#endif
} else {
#if TCFG_USER_TWS_ENABLE
bt_tws_phone_disconnected();
#else
bt_wait_phone_connect_control(1);
#endif
}
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙event 链接已经存在
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_hci_event_connection_exist(struct bt_event *bt)
{
if (!get_remote_test_flag() && !get_esco_busy_flag()) {
bt_user_priv_var.auto_connection_counter = (8 * 1000);
memcpy(bt_user_priv_var.auto_connection_addr, bt->args, 6);
#if TCFG_USER_TWS_ENABLE
bt_tws_phone_connect_timeout();
#else
if (bt_user_priv_var.auto_connection_timer) {
sys_timer_del(bt_user_priv_var.auto_connection_timer);
bt_user_priv_var.auto_connection_timer = 0;
}
bt_wait_connect_and_phone_connect_switch(0);
#endif
} else {
#if TCFG_USER_TWS_ENABLE
bt_tws_phone_disconnected();
#else
bt_wait_phone_connect_control(1);
#endif
}
}
u8 is_call_now()
{
if (get_call_status() != BT_CALL_HANGUP) {
return 1;
}
return 0;
}
#else
void sys_enter_soft_poweroff(void *priv)
{
if (priv == NULL) {
app_task_switch_to(APP_POWEROFF_TASK);
} else if (priv == (void *)1) {
log_info("cpu_reset!!!\n");
cpu_reset();
}
}
#endif