doubao_chat/apps/common/rf_fcc_tool/bt.c

398 lines
13 KiB
C
Raw 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 "rf_fcc_main.h"
#if (defined(RF_FCC_TEST_ENABLE) && defined(CONFIG_BT_ENABLE))
#include "btstack/avctp_user.h"
#include "btcontroller_modules.h"
#include "btstack/bluetooth.h"
#include "btstack/btstack_error.h"
#include "event/bt_event.h"
extern void bredr_set_dut_enble(u8 en, u8 phone);
extern void bredr_close_all_scan(void);
extern void __set_a2dp_auto_play_flag(u8 auto_en);
extern void __set_simple_pair_flag(bool flag);
extern void lmp_private_free_esco_packet(void *packet);
extern void *lmp_private_get_esco_packet(int *len, u32 *hash);
extern u32 esco_media_get_packet_num(void);
/*开关可发现可连接的函数接口*/
static void bt_wait_phone_connect_control(u8 enable)
{
if (enable) {
log_i("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)*/
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);
}
}
static void bt_read_remote_name(u8 status, u8 *addr, u8 *name)
{
if (status) {
printf("remote_name fail \n");
} else {
printf("remote_name : %s \n", name);
}
put_buf(addr, 6);
}
static int bt_get_battery_value()
{
//取消默认蓝牙定时发送电量给手机,需要更新电量给手机使用USER_CTRL_HFP_CMD_UPDATE_BATTARY命令
/*电量协议的是0-9个等级,请比例换算*/
return 9;
}
static void bt_dut_api(u8 value)
{
log_i("bt in dut\n");
bredr_close_all_scan();
}
static void bredr_handle_register(void)
{
#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
///被测试盒链接上进入快速测试回调
/* bt_fast_test_handle_register(bt_fast_test_api); */
///样机进入dut被测试仪器链接上回调
bt_dut_test_handle_register(bt_dut_api);
///获取远端设备蓝牙名字回调
read_remote_name_handle_register(bt_read_remote_name);
}
static void bt_function_select_init(void)
{
__set_a2dp_auto_play_flag(1); /* 连接高级音频后自动播放歌曲 */
__set_support_msbc_flag(1);
#if BT_SUPPORT_DISPLAY_BAT
__bt_set_update_battery_time(60);
#else
__bt_set_update_battery_time(0);
#endif
__set_page_timeout_value(8000); /*回连搜索时间长度设置,可使用该函数注册使用,ms单位,u16*/
__set_super_timeout_value(8000); /*回连时超时参数设置。ms单位。做主机有效*/
__set_simple_pair_flag(1); //是否打开简易配对功能,打开后不需要输入pincode
////设置蓝牙加密的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);
void lmp_set_sniff_disable(void);
lmp_set_sniff_disable();
}
static void a2dp_drop_frame(void *p)
{
int len;
u8 *frame;
int num = a2dp_media_get_packet_num();
if (num > 1) {
for (int i = 0; i < (num - 1); i++) {
len = a2dp_media_get_packet(&frame);
if (len <= 0) {
break;
}
/* log_i("a2dp_drop_frame: %d\n", len); */
a2dp_media_free_packet(frame);
}
}
}
static void esco_drop_frame(void *p)
{
u32 hash = 0;
int len;
void *frame;
int num = esco_media_get_packet_num();
if (num > 1) {
for (int i = 0; i < (num - 1); i++) {
frame = (u8 *)lmp_private_get_esco_packet(&len, &hash);
if (len <= 0) {
break;
}
/* log_i("a2dp_drop_frame: %d\n", len); */
lmp_private_free_esco_packet(frame);
}
}
}
void fcc_bt_ble_module_init(void)
{
bt_function_select_init();
bredr_handle_register();
btstack_init();
}
static int bt_connction_status_event_handler(struct bt_event *bt)
{
static u16 a2dp_drop_frame_timer = 0;
static u16 esco_drop_frame_timer = 0;
log_i("-----------------------bt_connction_status_event_handler %d\n", bt->event);
switch (bt->event) {
case BT_STATUS_INIT_OK:
/*
* 蓝牙初始化完成
*/
log_i("===================BT_STATUS_INIT_OK\n");
//extern u8 get_rf_analog_gain(void);
//extern void wifi_set_pwr(unsigned char pwr_sel);
//wifi_set_pwr(get_rf_analog_gain());
if (BT_MODE_IS(BT_BQB) || BT_MODE_IS(BT_NORMAL)) {
ble_bqb_test_thread_init();
}
bt_wait_phone_connect_control(1);
break;
case BT_STATUS_START_CONNECTED:
log_i(" BT_STATUS_START_CONNECTED\n");
break;
case BT_STATUS_ENCRY_COMPLETE:
log_i(" BT_STATUS_ENCRY_COMPLETE\n");
break;
case BT_STATUS_SECOND_CONNECTED:
clear_current_poweron_memory_search_index(0);
case BT_STATUS_FIRST_CONNECTED:
//蓝牙连接成功
log_i("BT_STATUS_CONNECTED\n");
break;
case BT_STATUS_FIRST_DISCONNECT:
case BT_STATUS_SECOND_DISCONNECT:
//蓝牙连接断开
log_i("BT_STATUS_DISCONNECT\n");
break;
//phone status deal
case BT_STATUS_PHONE_INCOME:
//接到来电
log_i("BT_STATUS_PHONE_INCOME\n");
user_send_cmd_prepare(USER_CTRL_HFP_CALL_ANSWER, 0, NULL);
/* lmp_private_esco_suspend_resume(3); */
break;
case BT_STATUS_PHONE_OUT:
//通话打出
log_i("BT_STATUS_PHONE_OUT\n");
lmp_private_esco_suspend_resume(4);
break;
case BT_STATUS_PHONE_ACTIVE:
//通话接通
log_i("BT_STATUS_PHONE_ACTIVE\n");
lmp_private_esco_suspend_resume(4);
break;
case BT_STATUS_PHONE_HANGUP:
//通话挂断
log_i("phone_handup\n");
lmp_private_esco_suspend_resume(4);
break;
case BT_STATUS_PHONE_NUMBER:
log_i("BT_STATUS_PHONE_NUMBER\n");
break;
case BT_STATUS_INBAND_RINGTONE:
log_i("BT_STATUS_INBAND_RINGTONE\n");
break;
case BT_STATUS_BEGIN_AUTO_CON:
log_i("BT_STATUS_BEGIN_AUTO_CON\n");
break;
case BT_STATUS_A2DP_MEDIA_START:
log_i(" BT_STATUS_A2DP_MEDIA_START");
a2dp_drop_frame_timer = sys_timer_add(NULL, a2dp_drop_frame, 100);
break;
case BT_STATUS_A2DP_MEDIA_STOP:
log_i(" BT_STATUS_A2DP_MEDIA_STOP");
if (a2dp_drop_frame_timer) {
sys_timer_del(a2dp_drop_frame_timer);
a2dp_drop_frame_timer = 0;
}
break;
case BT_STATUS_SCO_STATUS_CHANGE:
log_i(" BT_STATUS_SCO_STATUS_CHANGE len:%d ,type:%d", (bt->value >> 16), (bt->value & 0x0000ffff));
if (bt->value != 0xff) {
esco_drop_frame_timer = sys_timer_add(NULL, esco_drop_frame, 100);
} else {
if (esco_drop_frame_timer) {
sys_timer_del(esco_drop_frame_timer);
esco_drop_frame_timer = 0;
}
}
break;
case BT_STATUS_CALL_VOL_CHANGE:
break;
case BT_STATUS_SNIFF_STATE_UPDATE:
log_i(" BT_STATUS_SNIFF_STATE_UPDATE %d\n", bt->value); //0退出SNIFF
break;
case BT_STATUS_LAST_CALL_TYPE_CHANGE:
break;
case BT_STATUS_CONN_A2DP_CH:
break;
case BT_STATUS_CONN_HFP_CH:
break;
default:
break;
}
return 0;
}
static void bt_send_pair(u8 en)
{
user_send_cmd_prepare(USER_CTRL_PAIR, 1, &en);
}
static u8 bt_hci_event_filter(struct bt_event *bt)
{
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;
}
}
if ((bt->event != HCI_EVENT_CONNECTION_COMPLETE) ||
((bt->event == HCI_EVENT_CONNECTION_COMPLETE) && (bt->value != ERROR_CODE_SUCCESS))) {
if (get_remote_test_flag() \
&& !(HCI_EVENT_DISCONNECTION_COMPLETE == bt->event) \
&& !(HCI_EVENT_VENDOR_REMOTE_TEST == bt->event)) {
log_i("cpu reset\n");
/* cpu_reset(); */
}
}
return 1;
}
static int bt_hci_event_handler(struct bt_event *bt)
{
//对应原来的蓝牙连接上断开处理函数 ,bt->value=reason
log_i("------------------------bt_hci_event_handler reason %x", bt->event);
if (bt_hci_event_filter(bt) == 0) {
return 0;
}
switch (bt->event) {
case HCI_EVENT_INQUIRY_COMPLETE:
log_i(" HCI_EVENT_INQUIRY_COMPLETE \n");
break;
case HCI_EVENT_IO_CAPABILITY_REQUEST:
log_i(" HCI_EVENT_IO_CAPABILITY_REQUEST \n");
break;
case HCI_EVENT_USER_CONFIRMATION_REQUEST:
log_i(" HCI_EVENT_USER_CONFIRMATION_REQUEST \n");
///<可通过按键来确认是否配对 1:配对 0:取消
bt_send_pair(1);
break;
case HCI_EVENT_USER_PASSKEY_REQUEST:
log_i(" HCI_EVENT_USER_PASSKEY_REQUEST \n");
///<可以开始输入6位passkey
break;
case HCI_EVENT_USER_PRESSKEY_NOTIFICATION:
log_i(" HCI_EVENT_USER_PRESSKEY_NOTIFICATION %x\n", bt->value);
///<可用于显示输入passkey位置 value 0:start 1:enrer 2:earse 3:clear 4:complete
break;
case HCI_EVENT_PIN_CODE_REQUEST :
log_i("HCI_EVENT_PIN_CODE_REQUEST \n");
bt_send_pair(1);
break;
case HCI_EVENT_VENDOR_NO_RECONN_ADDR :
log_i("HCI_EVENT_VENDOR_NO_RECONN_ADDR \n");
case HCI_EVENT_DISCONNECTION_COMPLETE :
log_i("HCI_EVENT_DISCONNECTION_COMPLETE \n");
bt_wait_phone_connect_control(1);
break;
case BTSTACK_EVENT_HCI_CONNECTIONS_DELETE:
case HCI_EVENT_CONNECTION_COMPLETE:
log_i(" HCI_EVENT_CONNECTION_COMPLETE \n");
switch (bt->value) {
case ERROR_CODE_SUCCESS :
log_i("ERROR_CODE_SUCCESS \n");
bt_wait_phone_connect_control(0);
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
break;
case ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION :
case ERROR_CODE_PIN_OR_KEY_MISSING:
log_i(" ERROR_CODE_PIN_OR_KEY_MISSING \n");
case ERROR_CODE_SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED :
case ERROR_CODE_CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES:
case ERROR_CODE_CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR:
case ERROR_CODE_CONNECTION_ACCEPT_TIMEOUT_EXCEEDED :
case ERROR_CODE_CONNECTION_TERMINATED_BY_LOCAL_HOST :
case ERROR_CODE_AUTHENTICATION_FAILURE :
case CUSTOM_BB_AUTO_CANCEL_PAGE:
bt_wait_phone_connect_control(1);
break;
case ERROR_CODE_PAGE_TIMEOUT:
log_i(" ERROR_CODE_PAGE_TIMEOUT \n");
bt_wait_phone_connect_control(1);
break;
case ERROR_CODE_CONNECTION_TIMEOUT:
log_i(" ERROR_CODE_CONNECTION_TIMEOUT \n");
bt_wait_phone_connect_control(1);
break;
case ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS :
log_i("ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS \n");
bt_wait_phone_connect_control(1);
break;
default:
break;
}
break;
default:
break;
}
return 0;
}
static s32 bt_event_handler(struct sys_event *event)
{
if (event->from == BT_EVENT_FROM_CON) {
return bt_connction_status_event_handler((struct bt_event *)event->payload);
} else if (event->from == BT_EVENT_FROM_HCI) {
return bt_hci_event_handler((struct bt_event *)event->payload);
}
return false;
}
SYS_EVENT_STATIC_HANDLER_REGISTER(fcc_bt_event) = {
.event_type = SYS_BT_EVENT,
.prob_handler = bt_event_handler,
.post_handler = NULL,
};
#endif