AI—V2蓝牙修改提交 1687/1 1687/head 1688/target/1
authorhcj <1224667075@qq.com>
Wed, 5 Mar 2025 10:30:30 +0000 (18:30 +0800)
committerhcj <1224667075@qq.com>
Wed, 5 Mar 2025 10:30:30 +0000 (18:30 +0800)
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp
code/sdk/application/wearable/service/ble_service/bleservice/CMakeLists.txt
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h
code/sdk/application/wearable/service/ble_service/bleservice/bleService.c
code/sdk/application/wearable/service/ble_service/bleservice/bleService.h
code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp

index 9f95366..2fb86b3 100755 (executable)
@@ -492,7 +492,7 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG);
     /*蓝牙接收数据处理服务*/\r
     uapi_blesrv_service_init();\r
     \r
-    // uapi_Ai_send_service_init();\r
+    uapi_Ai_send_service_init();\r
     \r
 #ifdef ENABLE_CUSTOM_I2C\r
     errcode_t result = custom_iic_init();\r
index 5f7eaf8..e89e1aa 100644 (file)
@@ -506,7 +506,7 @@ namespace OHOS
 #endif
         int32_t AudioCaptureSample(int32_t argc, const char *argv[]);
         int32_t streamingRecordAndSend_AI(void);
-        #define IS_SUPPORT_REALTIME_RECORD_SEND_AI 0
+        #define IS_SUPPORT_REALTIME_RECORD_SEND_AI 1
 #ifdef __cplusplus
     };
 #endif
@@ -628,7 +628,7 @@ namespace OHOS
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AIVoice_TimerCallbackProc,Time = %d", Time);
         if (Time == 30) // 等待一秒,确保录音停止,发送录音准备就绪指令
         {
-            AiVoiceModel::GetInstance().CheckFileAndSendAIIsReady();
+            // AiVoiceModel::GetInstance().CheckFileAndSendAIIsReady();
         }
         if (Time < 0) // 如果思考时间超时30s,进入连接超时界面
         {
index dbecef2..0b7d849 100644 (file)
@@ -308,6 +308,7 @@ namespace OHOS
             if (it->first == AIVOICERETURNRESULTTEXT_CONTINUECHAT_BUTTON_VIEW_ID) // 点击继续对话按钮要发取消当前对话指令,避免AI回应中途按继续对话按钮没有取消上一次对话问题
             {
                 WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CancelCurAIChat");
+                AiVoiceModel::GetInstance().ClearQuestionAndAiAnswerStr(); // 清空上次用户问题和Ai回答字符串
                 AiVoiceModel::GetInstance().CancelCurAIChat();
                 PlayersModel::GetInstance()->HandPausePhoneMusic(); // 暂停手机音乐
                 PlayersModel::GetInstance()->PlayerPause();         // 暂停手机音乐
index 8741904..e88bfcf 100644 (file)
@@ -29,6 +29,20 @@ set(COMPONENT_PUBLIC_CCFLAGS
 )
 
 set(COMPONENT_CCFLAGS
+    # -std=c++11
+    -Wno-error
+    -Wno-unused-parameter
+    -fno-exceptions
+    -fno-unwind-tables
+    -fno-asynchronous-unwind-tables
+    -Wno-undef
+    -Wno-bitwise-op-parentheses
+    -Wno-shift-op-parentheses
+    -nostdlibinc
+    -nostdinc
+    -nostdlib
+    # -Wno-c++11-narrowing
+    -Wno-error=unused-function
 )
 
 set(WHOLE_LINK
index 7dd3c49..9c92114 100644 (file)
@@ -5656,6 +5656,22 @@ static void GetSynDataEndCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to
         sendBleData(value,19);\r
     }\r
 }\r
+static uint8_t AI_interval=5;\r
+\r
+void set_AI_interval(uint8_t data)\r
+{\r
+    AI_interval=data;\r
+}\r
+\r
+void send_Ai_record(uint16_t len,uint8_t *data)\r
+{\r
+    svr_ble_bt_gatts_noyify_AI(data,len);\r
+    LOS_Msleep(AI_interval+get_ble_interval());\r
+}\r
+\r
+\r
+\r
+\r
 \r
 //同步基础训练历史数据 training history data\r
 static void Send_json_Data_Cmd(uint8_t day,uint16_t pack_size,uint8_t id)\r
index 8e72c8d..2b9da97 100644 (file)
@@ -848,6 +848,11 @@ void reply_APP_OpenSportModeCmd(bool falg);
 
 void watch_synchronization_time(void);
 
+void send_Ai_record(uint16_t len,uint8_t *data);
+
+void set_AI_interval(uint8_t data);
+
+
 ///////////////////////////自定义文件传输协议/////////////////////////////
 #define OTA_FILE_MSG_CMD  0x0601 
 #define OTA_FILE_DATA_CMD 0x0602
@@ -864,6 +869,12 @@ void watch_synchronization_time(void);
 #define FILE_SUCC_TRANSFER      0x060A
 #define FILE_CANCEL_TRANSFER    0x060B
 
+#define AI_START_RECORD 0x0801
+#define AI_START_SEND_RECORD       0x0802
+#define AI_SEND_QUERY     0x0804
+#define AI_SEND_RECORD_STOP    0x0805
+
+
 #ifdef __cplusplus
 }
 #endif
index 83881d3..012e136 100644 (file)
@@ -59,6 +59,8 @@ extern "C" {
 #define BLE_ZHIHUI_OTA_ID 0x2ae6\r
 #define BLE_ZHIHUI_OTA_REPLY_ID 0x2ae7\r
 \r
+#define BLE_ZHIHUI_AI_ID 0x2ae8\r
+\r
 #define BLE_CHARACTERISTIC_RECV_ID 0x2ae5\r
 #define BLE_CHARACTERISTIC_SNED_SHORT_ID 0x2ae3\r
 \r
@@ -134,7 +136,7 @@ uint16_t data2ae1Cmd = 0;//安卓消息来电
 uint16_t data2ae0Cmd = 0;//OTA\r
 uint16_t data2ae6Cmd = 0;//自定义OTA \r
 uint16_t data2ae7Cmd = 0;//自定义OTA \r
-\r
+uint16_t data2ae8Cmd = 0;//AI\r
 \r
 #define handle_max_len 40\r
 \r
@@ -225,7 +227,7 @@ enum{
     BLE_CHARACTERISTIC_SNED_ANDRIOD_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
     BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_READ|GATT_CHARACTER_PROPERTY_BIT_NOTIFY,\r
     BLE_ZHIHUI_OTA_ID_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
-\r
+    BLE_ZHIHUI_AI_ID_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_NOTIFY|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_READ,\r
     BLE_ZHIHUI_OTA_REPLY_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_NOTIFY|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_READ,\r
 };\r
 static uint8_t ble_adv_falg = 0;\r
@@ -860,6 +862,45 @@ static void srv_ble_add_chart_decr_Zhihui_ota(uint8_t server_id,uint16_t srv_han
     }\r
 }\r
 \r
+static void srv_ble_add_Zhihui_AI(uint8_t server_id,uint16_t srv_handle)\r
+{\r
+    errcode_t ret = 0;\r
+    static uint8_t battery_point_val[] = {0x00, 0x00};\r
+    gatts_add_chara_info_t character;\r
+    gatts_add_desc_info_t descriptor;\r
+\r
+    bts_data_to_uuid_len2(BLE_ZHIHUI_AI_ID, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    character.properties = BLE_ZHIHUI_AI_ID_ID_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(battery_point_val);\r
+    character.value = battery_point_val;\r
+\r
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+    }\r
+    bts_data_to_uuid_len2(BLE_UUID_CLIENT_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
+    descriptor.value = battery_point_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+\r
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;;\r
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
+    descriptor.value = battery_point_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+}\r
+\r
+\r
 //用于adnriod发送消息添加特征值和描述符\r
 static void srv_ble_add_chart_decr_andriod(uint8_t server_id,uint16_t srv_handle)\r
 {   \r
@@ -1245,6 +1286,9 @@ static void svr_ble_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid,
         srv_ble_add_chart_decr_long_cmd(server_id,srv_handle);\r
         srv_ble_add_chart_decr_recv_cmd(server_id,srv_handle);\r
         srv_ble_add_chart_decr_Zhihui_ota(server_id,srv_handle);\r
+        srv_ble_add_Zhihui_AI(server_id,srv_handle);\r
+        \r
+        // srv_ble_add_chart_decr_Zhihui_AI(server_id,srv_handle);\r
         srv_ble_add_ZHIHUIOTA_REPLY_chart_decr_recv_cmd(server_id,srv_handle);\r
         gatts_start_service(server_id, srv_handle);\r
     }\r
@@ -1316,11 +1360,25 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
     bt_uuid_t chara_uuid_data_2ae7 = {0};\r
     bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_REPLY_ID, &chara_uuid_data_2ae7);\r
 \r
+    bt_uuid_t chara_uuid_data_2ae8 = {0};\r
+    bts_data_to_uuid_len2(BLE_ZHIHUI_AI_ID, &chara_uuid_data_2ae8);\r
+\r
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae8))\r
+    {\r
+        if(data2ae8Cmd==0)\r
+        {\r
+            data2ae8Cmd=result->value_handle;\r
+        }\r
+        Is_value_handle[handle_num]=result->value_handle;\r
+        handle_num++;\r
+    }\r
+\r
     if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae7))\r
     {\r
         if(data2ae7Cmd==0)\r
         {\r
             data2ae7Cmd=result->value_handle;\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "data2ae7Cmd");\r
         }\r
         Is_value_handle[handle_num]=result->value_handle;\r
         handle_num++;\r
@@ -1515,9 +1573,10 @@ errcode_t svr_ble_bt_gatts_noyify(uint8_t *data, uint16_t data_len)//这里是
 \r
             if(ret!=ERRCODE_SUCC)\r
             {\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
                 g_ble_conn_id, g_ble_server_handle,data_len);\r
-                ble_set_ai_Answer_str("BLE NOTIF ERROR",5);\r
+\r
+                // ble_set_ai_Answer_str("BLE NOTIF ERROR",5);\r
             }\r
        \r
         }\r
@@ -1533,7 +1592,41 @@ errcode_t svr_ble_bt_gatts_noyify_zhihui(uint8_t *data, uint16_t data_len)//这
     data_info.value = data;\r
     data_info.value_len = data_len;\r
      if (g_ble_conn_id == 0)\r
-      return 0;\r
+     {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id");\r
+        // return 0;\r
+     }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id %d g_ble_conn_id %d",g_ble_server_id,g_ble_conn_id);\r
+    errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
+    if(ret!=ERRCODE_SUCC)\r
+    {\r
+        msleep(50);\r
+        ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
+        if(ret!=ERRCODE_SUCC)\r
+        {\r
+            msleep(100);\r
+            ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
+\r
+            if(ret!=ERRCODE_SUCC)\r
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
+                    g_ble_conn_id, g_ble_server_handle,data_len);\r
+        }\r
+    }\r
+    return ret;  \r
+}\r
+\r
+errcode_t svr_ble_bt_gatts_noyify_AI(uint8_t *data, uint16_t data_len)//这里是设备数据上报给app手机端\r
+{\r
+    gatts_ntf_ind_t data_info;\r
+    data_info.attr_handle = data2ae8Cmd;\r
+    data_info.value = data;\r
+    data_info.value_len = data_len;\r
+     if (g_ble_conn_id == 0)\r
+     {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id");\r
+        // return 0;\r
+     }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id %d g_ble_conn_id %d",g_ble_server_id,g_ble_conn_id);\r
     errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
     if(ret!=ERRCODE_SUCC)\r
     {\r
@@ -1545,7 +1638,7 @@ errcode_t svr_ble_bt_gatts_noyify_zhihui(uint8_t *data, uint16_t data_len)//这
             ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
 \r
             if(ret!=ERRCODE_SUCC)\r
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
                     g_ble_conn_id, g_ble_server_handle,data_len);\r
         }\r
     }\r
@@ -2134,7 +2227,7 @@ static void blesrv_service_check_task(void const *arg)
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n");\r
     }\r
 }\r
-#define BLESRV_APP_BOARD_MSG_COUNT 50\r
+#define BLESRV_APP_BOARD_MSG_COUNT 500\r
 #define BLESRV_APP_BOARD_TASK_SIZE 0x2000\r
 #define BLESRV_BOARD_TASK_PRIO 7\r
 void create_blesrv_queue(void)\r
@@ -2211,6 +2304,331 @@ void Check_ble_adv_status(void)
     return;\r
 }\r
 \r
+static unsigned long g_ble_Ai_record_queue = 0xFFFFFFFF;\r
+static uint8_t g_ble_Ai_record_queue_created = 0;\r
+\r
+void create_Ai_record_queue(void)\r
+{\r
+    if (osal_msg_queue_create("Ai_record_queue", BLESRV_APP_BOARD_MSG_COUNT, &g_ble_Ai_record_queue,\r
+                              0, MAX_BUF_LEN) != ERRCODE_SUCC)\r
+    {\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail fail g_blesrv_queue:%d\n",g_ble_Ai_record_queue);\r
+        g_ble_Ai_record_queue_created = 0;\r
+    }else{\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail success g_blesrv_queue:%d\n",g_ble_Ai_record_queue);\r
+        g_ble_Ai_record_queue_created = 1;\r
+    }\r
+\r
+}\r
+\r
+\r
+#define Ai_TEST 0\r
+static void blesrvAi_send_service_task(void const *arg)\r
+{\r
+    unused(arg);\r
+    int32_t ret;\r
+    blesrv_custom_cmd_t mail={0};\r
+    uint32_t msgsize = MAX_BUF_LEN;\r
+\r
+    #if Ai_TEST\r
+        FILE* fp= fopen("user/airecord.pcm","wb+");\r
+    #endif\r
+    while (1)\r
+    {\r
+        ret = osal_msg_queue_read_copy(g_ble_Ai_record_queue, (void *)&mail, &msgsize,\r
+                                       OSAL_MSGQ_WAIT_FOREVER);\r
+        if (ret != OSAL_SUCCESS)\r
+        {\r
+            continue;\r
+        }\r
+        \r
+\r
+        uint8_t *p_msgbuf = (mail.msg_data);\r
+        uint16_t server_handle = mail.service_handle;\r
+        uint32_t msg_len = mail.msg_len;\r
+\r
+        #if Ai_TEST\r
+            fwrite(fp,1,mail.msg_len,mail.msg_data);\r
+        #endif\r
+        // if(get_ble_connect())\r
+        send_Ai_record(mail.msg_len,mail.msg_data);\r
+        \r
+        if(mail.msg_data)\r
+        {\r
+            free(mail.msg_data);\r
+            mail.msg_data = NULL;\r
+        }\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n");\r
+    }\r
+}\r
+\r
+\r
+static blesrv_custom_cmd_t g_blesrv_mail={0};\r
+\r
+errcode_t uapi_Ai_send_service_init(void)\r
+{\r
+\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"uapi_blesrv_service_init !\r\n");\r
+    app_task_definition_t taskcfg = {0};\r
+    taskcfg.create_queue_handle = create_Ai_record_queue;\r
+    taskcfg.attr.name = "Ai_record_queue_service";\r
+    taskcfg.attr.priority = osPriorityNormal;\r
+    taskcfg.attr.stack_size = BLESRV_APP_BOARD_TASK_SIZE;\r
+    taskcfg.func = blesrvAi_send_service_task;\r
+    taskcfg.use_mem = USE_EXTEND_MEM;\r
+\r
+    g_blesrv_mail.msg_len=0;\r
+    g_blesrv_mail.msg_data=NULL;\r
+\r
+\r
+    errcode_t ret = uapi_create_osThread_custom(&taskcfg);\r
+    if (ret != ERRCODE_SUCC)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create blesrv_service failed %d!\r\n", ret);\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+\r
+uint32_t send_msg_data_into_Ai_msg_queue_count=0;\r
+\r
+\r
+void AI_data_assembly(uint8_t type,uint8_t *buf)\r
+{\r
+   \r
+    memset_s(buf,ble_nus_max_data_len,0,19);\r
+    // 设置消息头部信息\r
+    buf[0] = 0x72; // 消息头\r
+    buf[1] = 0x08; // 类型\r
+    if(type)\r
+    buf[2] = 0x01; // 类型ID\r
+    else\r
+    buf[2] = 0x02; // 类型ID\r
+    uint32_t temp_data=1;\r
+    memcpy(buf + 3, &temp_data, 4); // 总包数\r
+    memcpy(buf + 7, &temp_data, 4); // 总数据长度\r
+    memcpy(buf + 11, &temp_data, 4); // 数据包ID\r
+    memcpy(buf + 15, &temp_data, 2); // 包数据长度\r
+    \r
+    buf[18] = 0; // 计算CRC\r
+}\r
+\r
+static uint8_t g_blesrv_mail_flag=0;\r
+\r
+\r
+\r
+int send_msg_data_into_Ai_msg_queue(void *buff,uint16_t len,uint8_t type)\r
+{\r
+    blesrv_custom_cmd_t blesrv_mail={0};\r
+     uint32_t ret ;\r
+    if( g_blesrv_queue_created == 0) return ERRCODE_FAIL;\r
+    if (buff == NULL) return ERRCODE_FAIL;\r
+\r
+    uint32_t sendlen = sizeof(blesrv_custom_cmd_t);\r
+    uint32_t singlebuflen= ble_nus_max_data_len-20;\r
+\r
+\r
+    if(len<=singlebuflen)\r
+    {\r
+        if(type==1)\r
+        {\r
+            blesrv_mail.service_handle = 0;\r
+            blesrv_mail.msg_len = len;\r
+            blesrv_mail.msg_data = (uint8_t*)malloc(len);\r
+\r
+            if(blesrv_mail.msg_data==NULL)\r
+            {\r
+                return  ERRCODE_FAIL;\r
+            }\r
+            memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len);\r
+\r
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
+            if (ret != OSAL_SUCCESS)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
+            }\r
+            return OSAL_SUCCESS;\r
+\r
+        }\r
+        else if(type==2)\r
+        {\r
+\r
+             blesrv_custom_cmd_t blesrv_mail_end={0};\r
+\r
+            blesrv_mail_end.msg_len=g_blesrv_mail.msg_len;\r
+            blesrv_mail_end.msg_data=malloc(g_blesrv_mail.msg_len);\r
+            if(blesrv_mail_end.msg_data==NULL)\r
+            {\r
+                return  ERRCODE_FAIL;\r
+            }\r
+\r
+            memcpy_s( blesrv_mail_end.msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);\r
+            free(g_blesrv_mail.msg_data);\r
+            g_blesrv_mail.msg_data=NULL;\r
+            g_blesrv_mail.msg_len=0;\r
+\r
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail_end, sendlen , 0);\r
+            if (ret != OSAL_SUCCESS)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
+            }\r
+\r
+            blesrv_mail.service_handle = 0;\r
+            blesrv_mail.msg_len = len;\r
+            blesrv_mail.msg_data = (uint8_t*)malloc(len);\r
+\r
+            if(blesrv_mail.msg_data==NULL)\r
+            {\r
+                return  ERRCODE_FAIL;\r
+            }\r
+            memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len);\r
+\r
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
+            if (ret != OSAL_SUCCESS)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
+            }\r
+            return OSAL_SUCCESS;\r
+        }\r
+        //以下为文件数据处理\r
+        if(g_blesrv_mail.msg_len+len<singlebuflen)\r
+        {\r
+           if (g_blesrv_mail.msg_len!=0 || g_blesrv_mail.msg_data!=NULL)\r
+           {\r
+                g_blesrv_mail.msg_data=realloc( g_blesrv_mail.msg_data,g_blesrv_mail.msg_len+len);\r
+                if(g_blesrv_mail.msg_data==NULL)\r
+                {\r
+                    return  ERRCODE_FAIL;\r
+                }\r
+                memcpy_s(g_blesrv_mail.msg_data+ g_blesrv_mail.msg_len,singlebuflen,buff,len);\r
+                g_blesrv_mail.msg_len+=len;\r
+           }\r
+           else\r
+           {\r
+                g_blesrv_mail.msg_data=malloc(len);\r
+                if(g_blesrv_mail.msg_data==NULL)\r
+                {\r
+                    return  ERRCODE_FAIL;\r
+                }\r
+\r
+                memcpy_s(g_blesrv_mail.msg_data+ g_blesrv_mail.msg_len,singlebuflen,buff,len);\r
+                g_blesrv_mail.msg_len+=len;\r
+           }\r
+           \r
+            \r
+            return OSAL_SUCCESS;\r
+        }\r
+        else if(g_blesrv_mail.msg_len+len==singlebuflen)\r
+        {\r
+            // g_blesrv_mail.msg_data=realloc( g_blesrv_mail.msg_data,g_blesrv_mail.msg_len+len);\r
+\r
+            blesrv_mail.msg_len = singlebuflen;\r
+            blesrv_mail.msg_data = (uint8_t*)malloc(singlebuflen);\r
+             if(blesrv_mail.msg_data==NULL)\r
+            {\r
+                return  ERRCODE_FAIL;\r
+            }\r
+\r
+            memcpy_s( blesrv_mail.msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);\r
+            memcpy_s( blesrv_mail.msg_data+ g_blesrv_mail.msg_len,singlebuflen,buff,len);\r
+\r
+            g_blesrv_mail.msg_len=0;\r
+            free( g_blesrv_mail.msg_data);\r
+            g_blesrv_mail.msg_data=NULL;\r
+\r
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
+            if (ret != OSAL_SUCCESS)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
+            }\r
+            return OSAL_SUCCESS; \r
+\r
+        }\r
+        else\r
+        {\r
+            blesrv_mail.msg_len=g_blesrv_mail.msg_len;\r
+            blesrv_mail.msg_data=malloc(g_blesrv_mail.msg_len);\r
+            if(blesrv_mail.msg_data==NULL)\r
+            {\r
+                return  ERRCODE_FAIL;\r
+            }\r
+            memcpy_s( blesrv_mail.msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);\r
+            free(g_blesrv_mail.msg_data);\r
+\r
+            g_blesrv_mail.msg_len=len;\r
+            g_blesrv_mail.msg_data=malloc(len);\r
+            memcpy_s( blesrv_mail.msg_data,singlebuflen,buff,len);\r
+     \r
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
+            if (ret != OSAL_SUCCESS)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
+            }\r
+            return OSAL_SUCCESS; \r
+        }\r
+\r
+    }\r
+    else\r
+    {\r
+        uint8_t count=len/singlebuflen;\r
+        if(len%singlebuflen)\r
+        {\r
+            count++;\r
+        }\r
+        uint16_t residue_len=len;\r
+        for(int i=0;i<count;i++)\r
+        {\r
+            blesrv_mail.service_handle = 0;\r
+            if(residue_len>=singlebuflen)\r
+            {\r
+                blesrv_mail.msg_len = singlebuflen;\r
+                blesrv_mail.msg_data = (uint8_t*)malloc(singlebuflen);\r
+                \r
+                if(blesrv_mail.msg_data==NULL)\r
+                {\r
+                    return ERRCODE_FAIL;\r
+                }\r
+                memcpy_s((void *)(blesrv_mail.msg_data),singlebuflen,buff+i*singlebuflen,singlebuflen);\r
+                residue_len-=singlebuflen;\r
+            }\r
+            else if(len%singlebuflen)\r
+            {\r
+                blesrv_mail.msg_len = len%singlebuflen;\r
+                blesrv_mail.msg_data = (uint8_t*)malloc( len%singlebuflen);\r
+                \r
+                if(blesrv_mail.msg_data==NULL)\r
+                {\r
+                    return ERRCODE_FAIL;\r
+                }\r
+                memcpy_s((void *)(blesrv_mail.msg_data),len%singlebuflen,buff+i*singlebuflen,len%singlebuflen);\r
+            }\r
+          \r
+\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"g_blesrv_queue:%d ble_recv:mail.msg_data %X %02X %02X %02X msg_data:%02X %02X %02X\r\n",\r
+                g_ble_Ai_record_queue,\r
+                blesrv_mail.msg_data,\r
+                blesrv_mail.msg_data[0],\r
+                blesrv_mail.msg_data[1],\r
+                blesrv_mail.msg_data[2],\r
+                msg_data[0],\r
+                msg_data[1],\r
+                msg_data[2]\r
+                );\r
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
+            if (ret != OSAL_SUCCESS)\r
+            {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"else Error blesrv Check send failed! err=0x%X %d %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count,len);\r
+            }\r
+        }\r
+    }\r
+  \r
+   \r
+    return ret;\r
+}\r
+\r
+\r
 \r
 #ifdef __cplusplus\r
 }\r
index 8cf27f5..4837c67 100644 (file)
@@ -27,6 +27,7 @@ extern uint16_t data2ae5Cmd;
 extern uint16_t data2ae1Cmd;//安卓消息来电
 extern uint16_t data2ae0Cmd;//OTA
 extern uint16_t data2ae6Cmd;//自定义OTA
+extern uint16_t data2ae8Cmd;//AI
 extern uint16_t ble_nus_max_data_len;
 extern uint16_t alipay_handle;
 extern uint16_t g_ble_conn_id;
@@ -90,11 +91,16 @@ errcode_t svr_ble_read_data_value_updata_noyify_test(uint8_t test);
 
 errcode_t svr_ble_bt_gatts_noyify_zhihui(uint8_t *data, uint16_t data_len);
 
+errcode_t svr_ble_bt_gatts_noyify_AI(uint8_t *data, uint16_t data_len);
+
 uint16_t get_ble_interval(void);
 
 
 void Check_ble_adv_status(void);
 
+int send_msg_data_into_Ai_msg_queue(void *buff,uint16_t len,uint8_t type);
+
+void AI_data_assembly(uint8_t type,uint8_t *buf);
 
 #ifdef __cplusplus
 }
index f1aff05..b1e7784 100755 (executable)
@@ -418,6 +418,8 @@ EXIT:
 
 /* ------------------------------- AI录音数据上传接口 ------------------------------- */
 #define AI_RECORD_TEST 1 //若需要调试可以打开该宏
+#include "bleService.h"
+static uint32_t AI_audio_size=0;
 static void* AudioCaptureProcess_AI(void* arg)
 {
     #if AI_RECORD_TEST
@@ -426,6 +428,12 @@ static void* AudioCaptureProcess_AI(void* arg)
     int32_t readCnt = 0;
     Timestamp timeStamp;
     g_audioSourceProcessInput.bThreadRun = true;
+    uint8_t start_data[19]={0};
+    
+    AI_data_assembly(1,start_data);
+    send_msg_data_into_Ai_msg_queue((void *)start_data,19,1);
+    AI_audio_size=0;
+
     while (!g_sample.needStop && !g_interruptHintStop) {
         int32_t ret = g_audioCap->Read(g_audioSourceProcessInput.buffer, g_audioSourceProcessInput.framesize, false);
         if (ret == -1) {
@@ -443,7 +451,11 @@ static void* AudioCaptureProcess_AI(void* arg)
             break;
         }
         #endif
+        AI_audio_size+=ret;
+
+
         // 蓝牙接口发送实时录音数据
+        send_msg_data_into_Ai_msg_queue((void *)g_audioSourceProcessInput.buffer,(uint16_t)ret,0);
 
         if (readCnt++ > READ_COUNT_MAX) {
             break;
@@ -459,6 +471,12 @@ static void* AudioCaptureProcess_AI(void* arg)
     #if AI_RECORD_TEST
     fclose(pfd);
     #endif
+    MEDIA_ERR_LOG("AI_audio_size %d",AI_audio_size);
+    
+    AI_data_assembly(0,start_data);
+    send_msg_data_into_Ai_msg_queue((void *)start_data,19,2);
+
+
     AudioCaptureStop();
     MEDIA_INFO_LOG("AudioCaptureProcess end");
     return NULL;
@@ -466,7 +484,7 @@ static void* AudioCaptureProcess_AI(void* arg)
 
 int32_t streamingRecordAndSend_AI(void)
 {
-    const char *argv[] = {"01", "pcm", "16000", "1", "16", "/user/aiRecord.pcm"};
+    const char *argv[] = {"01", "sbc", "16000", "1", "16", "/user/aiRecord.scb"};
     int32_t argc = 6;
     if (g_audioSourceProcessInput.bThreadRun) {
         return HandleAudioCaptureCmd(argc, argv);