280 lines
8.0 KiB
C
280 lines
8.0 KiB
C
#include "include.h"
|
||
#include "api.h"
|
||
#include "app_variable.h"
|
||
#include "spirit_island_api.h"
|
||
|
||
#define BT_PROFILE (PROF_A2DP*BT_A2DP_EN) | (PROF_HFP*BT_HFP_EN) | (PROF_SPP*BT_SPP_EN) | (PROF_HID*BT_HID_EN) | (PROF_HSP*BT_HSP_EN)
|
||
#define BT_CODEC (CODEC_SBC) | (CODEC_MSBC * BT_HFP_MSBC_EN) | (CODEC_PLC * BT_PLC_EN)
|
||
#define HFP_FEATURE (HFP_BAT_REPORT*BT_HFP_BAT_REPORT_EN) | (HFP_INBAND_RING_RONE*BT_HFP_INBAND_RING_EN) | (HFP_CALL_PRIVATE*BT_HFP_CALL_PRIVATE_FORCE_EN) | (HFP_RING_NUMBER_EN*BT_HFP_RING_NUMBER_EN)
|
||
#define A2DP_FEATURE (A2DP_VOL_CTRL*BT_A2DP_VOL_CTRL_EN) | (A2DP_RESTORE_PLAYING) | (A2DP_AVDTP_DELAY_REPORT*BT_AVDTP_DELAY_REPORT_EN)
|
||
|
||
|
||
///baseband
|
||
uint8_t cfg_bt_rf_def_txpwr = 0; //降低预置参数RF发射功率,单位1dbm
|
||
uint8_t cfg_bt_page_inq_txpwr = 0; //降低回连和搜索RF发射功率,单位2dbm
|
||
uint8_t cfg_bt_sniff_clk_sel = 3; //2:31.25KHz 晶振, 3:31.25KHz RC
|
||
|
||
///stack
|
||
uint8_t cfg_bt_work_mode = WORK_MODE;
|
||
uint8_t cfg_bt_max_acl_link = BT_2ACL_EN+1;
|
||
|
||
bool cfg_bt_dual_mode = BT_DUAL_MODE_EN;
|
||
bool cfg_bt_scan_ctrl_mode = BT_DISCOVER_CTRL_EN;
|
||
bool cfg_bt_simple_pair_mode = BT_SIMPLE_PAIR_EN;
|
||
|
||
uint16_t cfg_bt_support_profile = BT_PROFILE;
|
||
uint16_t cfg_bt_support_codec = BT_CODEC;
|
||
|
||
uint8_t cfg_bt_a2dp_feature = A2DP_FEATURE;
|
||
uint8_t cfg_bt_hfp_feature = HFP_FEATURE;
|
||
uint8_t cfg_bt_hid_type = BT_HID_TYPE;
|
||
|
||
uint16_t cfg_bt_def_connect_times = BT_POWER_UP_RECONNECT_TIMES; //默认回连重试次数
|
||
uint16_t cfg_bt_sup_to_connect_times = BT_TIME_OUT_RECONNECT_TIMES; //超时断线回连重试次数
|
||
|
||
bool cfg_bt_voip_reject_en = BT_VOIP_REJECT_EN;
|
||
|
||
//自定义蓝牙类别图标,根据需要选择
|
||
u32 bt_get_class_of_device(void)
|
||
{
|
||
#if BT_HID_TYPE == 2
|
||
return 0x0025c0; //GamePad - 游戏手柄
|
||
#else
|
||
// return 0x002540; //Keyboard - 键盘图标,Android带显示电量,IOS不带电量显示。全部IOS均可连接HID拍照。
|
||
// return 0x240418; //HeadPhone - 耳机图标,Android和IOS均带电量显示。
|
||
// return 0x240404; //WearableHeadset - 耳机图标,Android和IOS均带电量显示。(默认使用)
|
||
return 0x240704; //WearablePager - 手表图标
|
||
#endif
|
||
}
|
||
|
||
//PIN配对码(最多16个字符),默认"0000"
|
||
//#if !BT_SIMPLE_PAIR_EN
|
||
//const char *bt_get_pin_code(void)
|
||
//{
|
||
// return "0000";
|
||
//}
|
||
//#endif
|
||
|
||
//回连间隔(N+3000)mS,间隔越大,下一次回连越慢,更容易被其他手机搜索连接,N应大于等于2000
|
||
//u32 bt_get_conn_fail_delay(void)
|
||
//{
|
||
// return 2000;
|
||
//}
|
||
|
||
//是否需要一直回连手机
|
||
//bool bt_is_always_reconn(void)
|
||
//{
|
||
// return false;
|
||
//}
|
||
|
||
//是否支持android & ios播放暂停快速切换,需要时定义该函数
|
||
//注意:打开后ios播放微信小视频会无声,播放器听音乐不影响
|
||
// 部分android4.0及之前系统打开多个播放器可能有兼容问题
|
||
//bool bt_force_super_fast_status(void)
|
||
//{
|
||
// return true;
|
||
//}
|
||
|
||
//是否支持ios播放暂停快速切换,需要时定义该函数,蓝牙后台建议打开
|
||
//注意:打开后ios播放微信小视频会无声,播放器听音乐不影响
|
||
//bool bt_support_ios_fast_status(void)
|
||
//{
|
||
// return true;
|
||
//}
|
||
|
||
//const bool cfg_bt_sniff_mode_dis = true; //true: 关闭蓝牙sniff功能
|
||
|
||
const char *bt_get_local_name(void)
|
||
{
|
||
return xcfg_cb.bt_name;
|
||
}
|
||
|
||
|
||
void bt_set_local_name(char *bt_name,bool restart)
|
||
{
|
||
if(strlen(bt_name) > 0)
|
||
{
|
||
memset(xcfg_cb.bt_name, 0, sizeof(xcfg_cb.bt_name));
|
||
memcpy(xcfg_cb.bt_name, bt_name, strlen(bt_name));
|
||
if(restart)
|
||
{
|
||
if (bt_is_connected()) {
|
||
bt_disconnect(0);
|
||
}
|
||
updata_bt_name(xcfg_cb.bt_name);
|
||
}
|
||
}
|
||
}
|
||
|
||
void bt_get_local_bd_addr(u8 *addr)
|
||
{
|
||
#if LE_SM_SC_EN
|
||
memcpy(addr, xcfg_cb.bt_addr, 6);
|
||
if (!SysVariable.deviceType) {
|
||
addr[5] ^= 0x55;
|
||
}
|
||
#elif BT_LOCAL_ADDR
|
||
param_random_key_read(&addr[2]);
|
||
addr[0] = 0x41;
|
||
addr[1] = 0x42;
|
||
#else
|
||
memcpy(addr, xcfg_cb.bt_addr, 6);
|
||
#endif
|
||
}
|
||
|
||
u32 bt_get_rand_seed(void)
|
||
{
|
||
return sys_cb.rand_seed;
|
||
}
|
||
|
||
bool auth_fail_is_del_link(void)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
void bt_get_link_info(void *buf, u16 addr, u16 size)
|
||
{
|
||
//printf("bt_read: %04x,%04x, %08lx\n", addr, size, BT_CM_PAGE(addr));
|
||
cm_read(buf, BT_CM_PAGE(addr), size);
|
||
//print_r(buf, size);
|
||
}
|
||
|
||
void bt_put_link_info(void *buf, u16 addr, u16 size)
|
||
{
|
||
//printf("bt_write: %04x,%04x, %08lx\n", addr, size, BT_CM_PAGE(addr));
|
||
//print_r(buf, size);
|
||
cm_write(buf, BT_CM_PAGE(addr), size);
|
||
}
|
||
|
||
void bt_get_ext_link_info(void *buf, u16 addr, u16 size)
|
||
{
|
||
//printf("bt_read: %04x,%04x, %08lx\n", addr, size, BT_CM_PAGE(addr));
|
||
cm_read(buf, EXT_CM_PAGE(addr), size);
|
||
//print_r(buf, size);
|
||
}
|
||
|
||
void bt_put_ext_link_info(void *buf, u16 addr, u16 size)
|
||
{
|
||
//printf("bt_write: %04x,%04x, %08lx\n", addr, size, BT_CM_PAGE(addr));
|
||
//print_r(buf, size);
|
||
cm_write(buf, EXT_CM_PAGE(addr), size);
|
||
}
|
||
|
||
void bt_sync_link_info(void)
|
||
{
|
||
cm_sync();
|
||
}
|
||
|
||
void bt_call_volume_change(u8 up_flag)
|
||
{
|
||
if ((up_flag) && (SysVariable.hfp_vol < 15)) {
|
||
SysVariable.hfp_vol++;
|
||
} else if ((!up_flag) && (SysVariable.hfp_vol > 0)) {
|
||
SysVariable.hfp_vol--;
|
||
} else {
|
||
return;
|
||
}
|
||
bt_ctrl_msg(BT_CTL_HFP_SPK_GAIN);
|
||
bsp_change_volume(bsp_bt_get_hfp_vol(SysVariable.hfp_vol));
|
||
// printf("hfp vol: %d\n", SysVariable.hfp_vol);
|
||
}
|
||
|
||
void bt_volume_up(void)
|
||
{
|
||
// printf("bt_volume_up vol: %d\n", SysVariable.vol);
|
||
if (sys_cb.incall_flag) {
|
||
bt_call_volume_change(1);
|
||
} else {
|
||
bsp_set_volume(bsp_volume_inc(SysVariable.vol));
|
||
bsp_bt_vol_change();
|
||
// printf("volume: %d\n", SysVariable.vol);
|
||
}
|
||
if (bt_cb.music_playing) {
|
||
dac_fade_in();
|
||
}
|
||
}
|
||
|
||
void bt_volume_down(void)
|
||
{
|
||
// printf("bt_volume_down vol: %d\n", SysVariable.vol);
|
||
if (sys_cb.incall_flag) {
|
||
bt_call_volume_change(0);
|
||
} else {
|
||
bsp_set_volume(bsp_volume_dec(SysVariable.vol));
|
||
bsp_bt_vol_change();
|
||
// printf("volume: %d\n", SysVariable.vol);
|
||
}
|
||
}
|
||
|
||
void bt_set_music_sta(u8 status)
|
||
{
|
||
if (status == 1) {
|
||
bt_cb.music_playing = true;
|
||
#ifdef TJD_GUI_SPIRIT_ISLAND_SHOW
|
||
SysVariable.SpiritIsland_New_Event = true;
|
||
si_activated_task(music,0);
|
||
#endif
|
||
} else {
|
||
bt_cb.music_playing = false;
|
||
#ifdef TJD_GUI_SPIRIT_ISLAND_SHOW
|
||
SysVariable.SpiritIsland_New_Event = true;
|
||
si_delet_task(music);
|
||
#endif
|
||
}
|
||
}
|
||
|
||
/**
|
||
设置手机音量大小
|
||
*/
|
||
void bt_volume_set(u8 vol)
|
||
{
|
||
|
||
// printf("bt_volume_set vol: %d\n", SysVariable.vol);
|
||
if(vol > VOL_MAX){
|
||
vol = VOL_MAX;
|
||
}
|
||
|
||
if (sys_cb.incall_flag) {
|
||
if(SysVariable.hfp_vol != vol){
|
||
SysVariable.hfp_vol = vol;
|
||
bt_ctrl_msg(BT_CTL_HFP_SPK_GAIN);
|
||
bsp_change_volume(bsp_bt_get_hfp_vol(SysVariable.hfp_vol));
|
||
}
|
||
} else {
|
||
if(SysVariable.vol != vol){
|
||
//bsp_set_volume(vol);
|
||
//bsp_bt_vol_change();
|
||
if(SysVariable.vol > vol)
|
||
bsp_set_volume(bsp_volume_dec(vol));
|
||
else
|
||
{
|
||
bsp_set_volume(bsp_volume_inc(vol));
|
||
if (bt_cb.music_playing){
|
||
dac_fade_in();
|
||
}
|
||
}
|
||
bsp_bt_vol_change();
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
#if BT_FCC_TEST_EN
|
||
ALIGNED(4)
|
||
u8 huart_buffer[256];
|
||
|
||
void huart_init(void)
|
||
{
|
||
#if LE_BQB_RF_EN
|
||
huart_init_do(HUART_TR_PB1, HUART_TR_PB3, 9600, huart_buffer, 256);
|
||
#else
|
||
huart_init_do(HUART_TR_PB3, HUART_TR_PB3, 1500000, huart_buffer, 256);
|
||
#endif
|
||
}
|
||
#endif
|
||
|
||
void bt_disconnect_callback(uint8_t *packet)
|
||
{
|
||
printf("%s:0x%02x\n",__func__,packet[5]);
|
||
}
|