蓝牙耳机连接功能优化
authordxy <1731678236qq.com>
Fri, 22 Aug 2025 11:05:46 +0000 (19:05 +0800)
committerdxy <1731678236qq.com>
Fri, 22 Aug 2025 11:05:46 +0000 (19:05 +0800)
2.code/1.sdk/apps/BK_app/BK_drive/bk_audio.c
2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.c
2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.h
2.code/1.sdk/apps/BK_app/bk_app.c
2.code/1.sdk/apps/BK_app/bk_app.h
2.code/1.sdk/apps/common/third_party_profile/jieli/trans_data_demo/le_trans_data.c
2.code/1.sdk/apps/watch/task_manager/bt/bt.c
2.code/1.sdk/apps/watch/task_manager/bt/bt_event_fun.c

index 7e04cba..b73849b 100644 (file)
@@ -250,8 +250,8 @@ static void bk_iis_tx_cb(void *priv, void *buf, int len)
     } else {
         //memccpy(buf)
         //memset(buf, 0, 1024);
-        printf("bk_iis_tx_cb:数据不够!!!!!!!!!!!");
-        printf("bk_iis_tx_cb:wlen:%d,len:%d",wlen,len);
+        // printf("bk_iis_tx_cb:数据不够!!!!!!!!!!!");
+        // printf("bk_iis_tx_cb:wlen:%d,len:%d",wlen,len);
         alink_set_shn(&iis->alink_parm.ch_cfg[iis->alink_tx_ch], 256);
     }
 
@@ -470,17 +470,36 @@ int read_iis_play_data(char *data, int len)
 }
 
 
-
+extern u8 esco_flag;//=1开启了通话,=0关闭了通话
 void open_bt_audio(void)//打开蓝牙通话
 {
+    BT_state=1;
+    printf("open_bt_audio");
     __set_bt_esco_by_watch(1);
     user_emitter_cmd_prepare(USER_CTRL_CONN_SCO,0,NULL);
     user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_LAST_NO,0,NULL);
     gpio_direction_output(TCFG_AUDIO_DAC_PA_PORT, 0); //
+    int count =100;
+    while(count --)//等待打开完成
+    {
+
+        if(esco_flag == 1  )
+            break;
+        os_time_dly(1);
+    }
 }
 void close_bt_audio(void)
 {
+    printf("close_bt_audio");
     user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
+    int count =100;
+    while(count --)//等待打开完成
+    {
+
+        if(esco_flag == 0  )
+            break;
+        os_time_dly(1);
+    }
 }
 
 //extern void uart_demo();
@@ -490,7 +509,7 @@ void bk_audio_open()
     
     int err = 0;
     //return;
-    printf("audio_link_demo_open");
+    printf("audio_link_demo_open:%d",bt_connect);
     
     printf("audio_link_demo_open:!!!!!!!!!!!!!\r\n");
     printf("audio_link_demo_open:!!!!!!!!!!!!!\r\n");
@@ -498,9 +517,11 @@ void bk_audio_open()
     printf("audio_link_demo_open:!!!!!!!!!!!!!\r\n");
 
     bk_iis_open();
-    if(bt_connect){//蓝牙耳机
+
+    if(bt_connect == 2){//蓝牙耳机
         if(local_audio_state == 1)//如果连了蓝牙,而且本地录音和音频已经打开,就关闭一次
         {
+            printf("关闭本地通道!!!!!!!!!!");
             close_local_audio();
             local_audio_state = 0;
         }
@@ -512,9 +533,10 @@ void bk_audio_open()
             printf("打开蓝牙通道!!!!!!!!!");
             printf("打开蓝牙通道!!!!!!!!!");
             //sys_timeout_add(NULL,emitter_hfp_call_answer,2000);   
-            }else{
-                BT_state = 0;
-            }
+        }else{
+            BT_state = 0;
+
+        }
         
     }else{
         if(BT_state == 1)//如果打开了蓝牙耳机通道,关一次通话
@@ -546,6 +568,7 @@ void bk_audio_close()
         local_audio_state = 0;
         close_local_audio();
     }
+
     //close_local_audio();
    //audio_adc_mic_close_demo();
 }
index 9eee113..1e5e5ba 100644 (file)
@@ -13,6 +13,7 @@
 #include "bk_app.h"
 #include "bk_uart.h"
 #include "BK_versions.h"
+#include "btstack/avctp_user.h"
 int ut=0;
 OS_SEM uart_callback;
 char read_ack_flag= 0;
@@ -481,11 +482,21 @@ int uart_send_single_bt_mac(u8 *name,u8 *mac,u8 connect)
         return -1;
     }
     printf("JSON数据: %s\n", json_string);
+    read_ack_flag = 0;
     bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string));
     // (ut, json_string, strlen(json_string), 20);
     // 释放内存
     cJSON_free(json_string);
     cJSON_Delete(root);
+    int count = 50;
+    while(count--)
+    {
+        if(read_ack_flag == 1)
+        {
+            break;
+        }
+        os_time_dly(1);
+    }
     return 0;
 }
 extern char userremote_name[32]; //当前连接或者断开的蓝牙名称
@@ -534,6 +545,7 @@ void send_bt_connect_state(void){
             return;
         }
         printf("JSON数据1: %s\n", json_string);
+        read_ack_flag=0;
         bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string));
         //(ut, json_string, strlen(json_string), 20);
         // 释放内存
@@ -552,11 +564,21 @@ void send_bt_connect_state(void){
         
         printf("JSON数据2: %s\n", json_string);
         // uart_send_blocking(ut, json_string, strlen(json_string), 20);
+        read_ack_flag=0;
         bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string));
         // 释放内存
         cJSON_free(json_string);
         cJSON_Delete(root);
     }
+    int count = 50;
+    while(count--)
+    {
+        if(read_ack_flag == 1)
+        {
+            break;
+        }
+        os_time_dly(1);
+    }
 }
 int uart_send_bt_list(u8 *data)
 {
@@ -827,15 +849,17 @@ void get_ble_switch_imei_timer_init(void)
     }
         
 }
+static u16 auto_call_timerout_id = 0;
 extern u8 maddr[6];
-int uart_send_bt_state(u8 bt_state) //蓝牙向4G发送蓝牙耳机的状态
+void auto_switch_local_mic(void) //蓝牙耳机断开和进入通话后自动切换到本地麦克风输出音频播放
 {
-    if(bt_state == 0){ //断开蓝牙耳机连接
-        bk_app_send_smg(AI_CLOSE,NULL,0);
-        bk_app_send_smg(AI_OPEN,NULL,0);
-    }
-   
+    printf("auto_switch_local_mic!!!!!!!!");
+    bk_app_send_smg(BT_State_Change_CB,NULL,0);
     
+}
+#include "key_event_deal.h"
+int uart_send_bt_state(u8 bt_state) //蓝牙向4G发送蓝牙耳机的状态
+{
     printf("uart_send_bt_state:%d %d\n",bt_state,is_need_send_bt_state);
     if(!is_need_send_bt_state)
     {
@@ -898,11 +922,21 @@ int uart_send_bt_state(u8 bt_state) //蓝牙向4G发送蓝牙耳机的状态
     }
     // 打印JSON字符串
     printf("uart_send_bt_state JSON数据: %s\n", json_string);
+    read_ack_flag=0;
     bk_uart_send_smg(BK_UART_WRITE_DATA, json_string,strlen(json_string));
     // uart_send_blocking(ut, json_string, strlen(json_string), 20);
     // 释放内存
     cJSON_free(json_string);
     cJSON_Delete(root);
+    int count = 50;
+    while(count--)
+    {
+        if(read_ack_flag == 1)
+        {
+            break;
+        }
+        os_time_dly(1);
+    }
     return 0;
 }
 int uart_send_error(void)
index 4872507..4202aac 100644 (file)
@@ -22,4 +22,5 @@ void get_ble_switch_imei_timer_init(void);
 void UART_event(void);
 int uart_send_bt_state(u8 bt_state);
 int uart_send_kws(void);
+void auto_switch_local_mic(void);
 #endif
index 5b62d00..6f256e2 100644 (file)
@@ -17,6 +17,7 @@ static char AI_start_flag = 0;
 #endif
 #include "bk_app.h"
 #include "BK_versions.h"
+void BT_State_Change_cb(void);
 //获取运行状态,返回0代表在休眠,返回1代表在运行
 char get_ai_state(void)
 {
@@ -212,6 +213,16 @@ void bk_app_task(void *p)
             break;    
         case AI_VC_1S_EVENT:
             AI_VC_1S_event();
+            break;
+        case OPEN_CALL:
+            open_bt_audio();
+            break;  
+        case CLOSE_BT_AUDIO_EVENT:
+            close_bt_audio();
+            break;
+        case BT_State_Change_CB:
+            BT_State_Change_cb();
+            break;
         default:
             break;
         }
@@ -241,6 +252,17 @@ void bk_ALG_send_smg(bk_ALG_msg_event event,char *data,int data_len)
         
         os_taskq_post_msg("bk_ALG_task", 3, event,(int)data_tmp, data_len);
 }
+extern u8 esco_flag;
+void BT_State_Change_cb(void)
+{
+    os_time_dly(100);
+    if(esco_flag){
+        bk_app_send_smg(CLOSE_BT_AUDIO_EVENT,NULL,0);
+    }
+    
+    bk_app_send_smg(AI_CLOSE,NULL,0);
+    bk_app_send_smg(AI_OPEN,NULL,0);
+}
 //#include "rtc.h"
 //void read_sys_time(struct sys_time *curr_time);
 //char vad_data_t[320];
index 63f8edd..9b97e34 100644 (file)
@@ -12,6 +12,9 @@ typedef enum
     VAD_RUN,
     UART_EVENT,
     AI_VC_1S_EVENT,
+    CLOSE_BT_AUDIO_EVENT,
+    BT_State_Change_CB,//蓝牙连接状态切换
+    OPEN_CALL
 
 }bk_app_msg_event;
 typedef enum 
index 3897168..8ef3927 100644 (file)
@@ -234,7 +234,10 @@ void start_scan_bt(void){
     if (scan_state){
         return;
     }
-    user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL); //
+    if(bt_connect){
+        user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
+        user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL);
+    }
     scan_state = 1;
     bt_emitter_start_search_device(); //开始扫描
 }
@@ -397,6 +400,7 @@ void connect_bt(char *json_data,u8 conect){
     //     }
     if(conect){ //断开连接
         if (bt_connect) { //搜索前断开已连接得蓝牙耳机
+            user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
             user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL);
         }
         return;
@@ -436,6 +440,7 @@ void connect_bt(char *json_data,u8 conect){
         if(bt_connect == 2) //已经连上了看看连接的地址是否一致
         {
             if (memcmp(bt_conn_addr, reversed_mac, 6) != 0){//如果连上了并且和小程序下发得mac地址是一致不需要重新连接
+                user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
                 user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL); //
                 emitter_bt_connect(reversed_mac);//连接地址
             }
index 89718c0..4454631 100644 (file)
@@ -439,7 +439,7 @@ void bt_updata_fix_rx_result()
 }
 /*定频测试的时候tx的mac_addr设置成rx的地址 */
 u8 fix_rx_mac_addr[6] = {0xC0, 0xFF, 0x68, 0x7D, 0x16, 0x00};
-
+u8 esco_flag = 0;
 /*----------------------------------------------------------------------------*/
 /**@brief    蓝牙模式协议栈对应状态处理函数
    @param    bt:事件
@@ -450,7 +450,7 @@ u8 fix_rx_mac_addr[6] = {0xC0, 0xFF, 0x68, 0x7D, 0x16, 0x00};
 static int bt_connction_status_event_handler(struct bt_event *bt)
 {
 
-    log_debug("-----------------------bt_connction_status_event_handler %d", bt->event);
+    log_debug("-----------------------bt_connction_status_event_handler %d %x", bt->event,bt->value);
 
     if (bt_status_event_filter(bt) == false) {
         return false;
@@ -576,6 +576,7 @@ static int bt_connction_status_event_handler(struct bt_event *bt)
 #endif
         bt_status_phone_hangup(bt);
         __set_bt_esco_by_watch(0);
+
 #if TCFG_UI_ENABLE
         if (UI_GET_WINDOW_ID() != ID_WINDOW_PHONE) {//判断手表在来电界面,退出界面
             break;
@@ -653,6 +654,13 @@ static int bt_connction_status_event_handler(struct bt_event *bt)
             watch_sco_dly_time_del();
         }
         bt_status_sco_change(bt);
+        if(bt->value != 0xff)
+        {
+            esco_flag = 1;
+        }else
+        {
+            esco_flag = 0;
+        }
         break;
     case BT_STATUS_CALL_VOL_CHANGE:
         log_info(" BT_STATUS_CALL_VOL_CHANGE ");
index ad856ff..c2d1cc6 100644 (file)
@@ -1259,7 +1259,7 @@ void bt_status_connect(struct bt_event *bt)
 {
     bt_connect = BT_CONN_STATE_CONNECTED;
     uart_send_bt_state(bt_connect);
-    // connect_bt_cb(bt_connect);
+    auto_switch_local_mic();
     sys_auto_sniff_controle(1, NULL);
     sys_auto_shut_down_disable();
 
@@ -1452,7 +1452,7 @@ void bt_status_disconnect(struct bt_event *bt)
 {
     bt_connect = BT_CONN_STATE_INIT; 
     uart_send_bt_state(bt_connect);
-    
+    auto_switch_local_mic();
     sys_auto_sniff_controle(0, NULL);
     __this->call_flag = 0;
     /* log_info("BT_STATUS_DISCONNECT\n"); */