Files

454 lines
12 KiB
C

#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_ble.h"
#include "bt_common.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 "system/timer.h"
#include "asm/hwi.h"
#include "cpu.h"
#include "ui/ui_api.h"
#include "tone_player.h"
#include "bt_edr_fun.h"
#include "adapter_process.h"
//#include "adapter_decoder.h"
#include "aec_user.h"
#include "ui_manage.h"
#if TCFG_WIRELESS_MIC_ENABLE
#define LOG_TAG_CONST WIRELESSMIC
#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"
struct app_bt_opr app_bt_hdl = {
.exit_flag = 1,
.replay_tone_flag = 1,
.esco_dump_packet = ESCO_DUMP_PACKET_CALL,
.hid_mode = 0,
.wait_exit = 0,
};
#define __this (&app_bt_hdl)
extern BT_USER_PRIV_VAR bt_user_priv_var;
u8 get_bt_init_status(void)
{
return __this->init_ok;
}
u8 is_call_now(void)
{
if (get_call_status() != BT_CALL_HANGUP) {
return 1;
}
return 0;
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式led状态更新
@param
@return status : 蓝牙状态
@note
*/
/*----------------------------------------------------------------------------*/
void bt_set_led_status(u8 status)
{
#if 1
static u8 bt_status = STATUS_BT_INIT_OK;
if (status) {
bt_status = status;
}
pwm_led_mode_set(PWM_LED_ALL_OFF);
ui_update_status(bt_status);
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙spp 协议数据 回调
@param packet_type:数据类型
ch :
packet :数据缓存
size :数据长度
@return
@note
*/
/*----------------------------------------------------------------------------*/
static 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 status : 1:获取失败 0:获取成功
addr : 配对设备地址
name :配对设备名字
@return
@note 需要连接上设备后发起USER_CTRL_READ_REMOTE_NAME
命令来
*/
/*----------------------------------------------------------------------------*/
__attribute__((weak))
void remote_name_speciali_deal(u8 status, u8 *addr, u8 *name)
{
}
static 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);
remote_name_speciali_deal(status, addr, name);
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙歌词信息获取回调
@param
@return
@note
const u8 more_avctp_cmd_support = 1;置上1
需要在void bredr_handle_register()注册回调函数
要动态获取播放时间的,可以发送USER_CTRL_AVCTP_OPID_GET_PLAY_TIME命令就可以了
要半秒或者1秒获取就做个定时发这个命令
*/
/*----------------------------------------------------------------------------*/
static 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);
}
}
//音量同步
static void vol_sys_tab_init(void)
{
}
static void bt_set_music_device_volume(int volume)
{
r_printf("bt_set_music_device_volume : %d\n", volume);
}
static int phone_get_device_vol(void)
{
//音量同步最大是127,请计数比例
#if 0
return (app_var.sys_vol_l * get_max_sys_vol() / 127) ;
#else
return app_var.opid_play_vol_sync;
#endif
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式协议栈功能配置
@param 无
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
static void bt_function_select_init()
{
set_idle_period_slot(1600);
////设置协议栈支持设备数
__set_user_ctrl_conn_num(TCFG_BD_NUM);
////msbc功能使能
__set_support_msbc_flag(1);
#if TCFG_BT_SUPPORT_AAC
////AAC功能使能
__set_support_aac_flag(1);
#else
__set_support_aac_flag(0);
#endif
#if BT_SUPPORT_DISPLAY_BAT
////设置更新电池电量的时间间隔
__bt_set_update_battery_time(60);
#else
__bt_set_update_battery_time(0);
#endif
////回连搜索时间长度设置,可使用该函数注册使用,ms单位,u16
__set_page_timeout_value(8000);
////回连时超时参数设置。ms单位。做主机有效
__set_super_timeout_value(8000);
#if (TCFG_BD_NUM == 2)
////设置开机回链的设备个数
__set_auto_conn_device_num(2);
#endif
#if BT_SUPPORT_MUSIC_VOL_SYNC
////设置音乐音量同步的表
vol_sys_tab_init();
#endif
////设置蓝牙是否跑后台
__set_user_background_goback(BACKGROUND_GOBACK); // 后台链接是否跳回蓝牙 1:跳回
////设置蓝牙加密的level
//io_capabilities ; /*0: Display only 1: Display YesNo 2: KeyboardOnly 3: NoInputNoOutput*/
//authentication_requirements: 0:not protect 1 :protect
__set_simple_pair_param(3, 0, 2);
#if (USER_SUPPORT_PROFILE_PBAP==1)
////设置蓝牙设备类型
__change_hci_class_type(BD_CLASS_CAR_AUDIO);
#endif
#if (TCFG_BT_SNIFF_ENABLE == 0)
void lmp_set_sniff_disable(void);
lmp_set_sniff_disable();
#endif
/*
TX RX
AI800x PA13 PA12
AC692x PA13 PA12
AC693x PA8 PA9
AC695x PA9 PA10
AC696x PA9 PA10
AC694x PB1 PB2
AC697x PC2 PC3
AC631x PA7 PA8
*/
////设置蓝牙接收状态io输出,可以外接pa
/* bt_set_rxtx_status_enable(1); */
#if TCFG_USER_BLE_ENABLE
{
u8 tmp_ble_addr[6];
lib_make_ble_address(tmp_ble_addr, (void *)bt_get_mac_addr());
le_controller_set_mac((void *)tmp_ble_addr);
printf("\n-----edr + ble 's address-----");
printf_buf((void *)bt_get_mac_addr(), 6);
printf_buf((void *)tmp_ble_addr, 6);
}
#endif // TCFG_USER_BLE_ENABLE
#if (CONFIG_BT_MODE != BT_NORMAL)
set_bt_enhanced_power_control(1);
#endif
}
extern u8 get_cur_battery_level(void);
static int bt_get_battery_value()
{
//取消默认蓝牙定时发送电量给手机,需要更新电量给手机使用USER_CTRL_HFP_CMD_UPDATE_BATTARY命令
/*电量协议的是0-9个等级,请比例换算*/
return get_cur_battery_level();
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙模式协议栈回调函数
@param 无
@return 无
@note
*/
/*----------------------------------------------------------------------------*/
static void bredr_handle_register()
{
#if (USER_SUPPORT_PROFILE_SPP==1)
#if APP_ONLINE_DEBUG
extern void online_spp_init(void);
spp_data_deal_handle_register(user_spp_data_handler);
online_spp_init();
#else
spp_data_deal_handle_register(spp_data_handler);
#endif
#endif
#if BT_SUPPORT_MUSIC_VOL_SYNC
///蓝牙音乐和通话音量同步
music_vol_change_handle_register(bt_set_music_device_volume, phone_get_device_vol);
#endif
#if BT_SUPPORT_DISPLAY_BAT
///电量显示获取电量的接口
get_battery_value_register(bt_get_battery_value);
#endif
extern void bt_fast_test_api(void);
///被测试盒链接上进入快速测试回调
bt_fast_test_handle_register(bt_fast_test_api);
//extern void bt_dut_api(u8 value);
///样机进入dut被测试仪器链接上回调
//bt_dut_test_handle_register(bt_dut_api);
///获取远端设备蓝牙名字回调
read_remote_name_handle_register(bt_read_remote_name);
////获取歌曲信息回调
/* bt_music_info_handle_register(user_get_bt_music_info); */
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙直接开关
@param
@return
@note 如果想后台开机不需要进蓝牙,可以在poweron模式
直接调用这个函数初始化蓝牙
*/
/*----------------------------------------------------------------------------*/
extern void sys_auto_shut_down_enable(void);
extern void sys_auto_sniff_controle(u8 enable, u8 *addr);
void bt_init()
{
if (__this->bt_direct_init) {
return;
}
log_info(" bt_direct_init \n");
u32 sys_clk = clk_get("sys");
bt_pll_para(TCFG_CLOCK_OSC_HZ, sys_clk, 0, 0);
__this->ignore_discon_tone = 0;
__this->bt_direct_init = 1;
bt_function_select_init();
bredr_handle_register();
btstack_init();
/* 按键消息使能 */
sys_key_event_enable();
sys_auto_shut_down_enable();
sys_auto_sniff_controle(1, NULL);
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙 退出蓝牙等待蓝牙状态可以退出
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void bt_close_check(void *priv)
{
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 (__this->init_ok == 0) {
/* putchar('#'); */
return;
}
// if (bt_audio_is_running()) {
// /* putchar('$'); */
// return;
// }
#if TCFG_USER_BLE_ENABLE
bt_ble_exit();
#endif
btstack_exit();
log_info(" bt_direct_close_check ok\n");
sys_timer_del(__this->timer);
__this->init_ok = 0;
__this->init_start = 0;
__this->timer = 0;
__this->bt_direct_init = 0;
set_stack_exiting(0);
}
/*----------------------------------------------------------------------------*/
/**@brief 蓝牙后台直接关闭
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void bt_close(void)
{
if (__this->init_ok == 0) {
/* putchar('#'); */
return;
}
log_info(" bt_direct_close");
__this->ignore_discon_tone = 1;
sys_auto_shut_down_disable();
set_stack_exiting(1);
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_DISABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_DISABLE, 0, NULL);
user_send_cmd_prepare(USER_CTRL_PAGE_CANCEL, 0, NULL);
user_send_cmd_prepare(USER_CTRL_CONNECTION_CANCEL, 0, NULL);
user_send_cmd_prepare(USER_CTRL_POWER_OFF, 0, NULL);
if (__this->timer == 0) {
__this->tmr_cnt = 0;
__this->timer = sys_timer_add(NULL, bt_close_check, 10);
printf("set exit timer\n");
}
}
#endif