From 88a2b7f1b4cec8010bae3f5c850e0fd82c92ac9f Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Wed, 5 Mar 2025 18:30:30 +0800 Subject: [PATCH] =?utf8?q?AI=E2=80=94V2=E8=93=9D=E7=89=99=E4=BF=AE?= =?utf8?q?=E6=94=B9=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../brandy/brandy_standard/thread_pri_init.c | 2 +- .../nativeui/aivoice/src/AiVoiceModel.cpp | 4 +- .../nativeui/aivoice/src/AiVoicePresenter.cpp | 1 + .../ble_service/bleservice/CMakeLists.txt | 14 + .../service/ble_service/bleservice/bleEvent.c | 16 + .../service/ble_service/bleservice/bleEvent.h | 11 + .../ble_service/bleservice/bleService.c | 432 +++++++++++++++++- .../ble_service/bleservice/bleService.h | 6 + .../sample/wrapper/audio_capture_wrapper.cpp | 20 +- 9 files changed, 495 insertions(+), 11 deletions(-) diff --git a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c index 9f95366ad..2fb86b3a5 100755 --- a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c +++ b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c @@ -492,7 +492,7 @@ uapi_pm_remove_sleep_veto(PM_ID_DEBUG); /*蓝牙接收数据处理服务*/ uapi_blesrv_service_init(); - // uapi_Ai_send_service_init(); + uapi_Ai_send_service_init(); #ifdef ENABLE_CUSTOM_I2C errcode_t result = custom_iic_init(); diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp index 5f7eaf86e..e89e1aaaa 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp @@ -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,进入连接超时界面 { diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp index dbecef250..0b7d84912 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp @@ -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(); // 暂停手机音乐 diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/CMakeLists.txt b/code/sdk/application/wearable/service/ble_service/bleservice/CMakeLists.txt index 874190416..e88bfcf53 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/CMakeLists.txt +++ b/code/sdk/application/wearable/service/ble_service/bleservice/CMakeLists.txt @@ -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 diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c index 7dd3c492a..9c9211459 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c @@ -5656,6 +5656,22 @@ static void GetSynDataEndCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to sendBleData(value,19); } } +static uint8_t AI_interval=5; + +void set_AI_interval(uint8_t data) +{ + AI_interval=data; +} + +void send_Ai_record(uint16_t len,uint8_t *data) +{ + svr_ble_bt_gatts_noyify_AI(data,len); + LOS_Msleep(AI_interval+get_ble_interval()); +} + + + + //同步基础训练历史数据 training history data static void Send_json_Data_Cmd(uint8_t day,uint16_t pack_size,uint8_t id) diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h index 8e72c8dae..2b9da97b5 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h @@ -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 diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c b/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c index 83881d330..012e13640 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c @@ -59,6 +59,8 @@ extern "C" { #define BLE_ZHIHUI_OTA_ID 0x2ae6 #define BLE_ZHIHUI_OTA_REPLY_ID 0x2ae7 +#define BLE_ZHIHUI_AI_ID 0x2ae8 + #define BLE_CHARACTERISTIC_RECV_ID 0x2ae5 #define BLE_CHARACTERISTIC_SNED_SHORT_ID 0x2ae3 @@ -134,7 +136,7 @@ uint16_t data2ae1Cmd = 0;//安卓消息来电 uint16_t data2ae0Cmd = 0;//OTA uint16_t data2ae6Cmd = 0;//自定义OTA uint16_t data2ae7Cmd = 0;//自定义OTA - +uint16_t data2ae8Cmd = 0;//AI #define handle_max_len 40 @@ -225,7 +227,7 @@ enum{ BLE_CHARACTERISTIC_SNED_ANDRIOD_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP, BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_READ|GATT_CHARACTER_PROPERTY_BIT_NOTIFY, BLE_ZHIHUI_OTA_ID_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP, - + 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, 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, }; static uint8_t ble_adv_falg = 0; @@ -860,6 +862,45 @@ static void srv_ble_add_chart_decr_Zhihui_ota(uint8_t server_id,uint16_t srv_han } } +static void srv_ble_add_Zhihui_AI(uint8_t server_id,uint16_t srv_handle) +{ + errcode_t ret = 0; + static uint8_t battery_point_val[] = {0x00, 0x00}; + gatts_add_chara_info_t character; + gatts_add_desc_info_t descriptor; + + bts_data_to_uuid_len2(BLE_ZHIHUI_AI_ID, &character.chara_uuid); + character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE; + character.properties = BLE_ZHIHUI_AI_ID_ID_PROPERTIES; + character.value_len = (uint16_t)sizeof(battery_point_val); + character.value = battery_point_val; + + ret = gatts_add_characteristic(server_id, srv_handle, &character); + if (ret != ERRCODE_SUCC) { + // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret); + } + bts_data_to_uuid_len2(BLE_UUID_CLIENT_CHARACTERISTIC_CONF, &descriptor.desc_uuid); + descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE; + descriptor.value_len = (uint16_t)sizeof(battery_point_val); + descriptor.value = battery_point_val; + + ret = gatts_add_descriptor(server_id, srv_handle, &descriptor); + if (ret != ERRCODE_SUCC) { + // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret); + } + + bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid); + descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;; + descriptor.value_len = (uint16_t)sizeof(battery_point_val); + descriptor.value = battery_point_val; + + ret = gatts_add_descriptor(server_id, srv_handle, &descriptor); + if (ret != ERRCODE_SUCC) { + // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret); + } +} + + //用于adnriod发送消息添加特征值和描述符 static void srv_ble_add_chart_decr_andriod(uint8_t server_id,uint16_t srv_handle) { @@ -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); srv_ble_add_chart_decr_recv_cmd(server_id,srv_handle); srv_ble_add_chart_decr_Zhihui_ota(server_id,srv_handle); + srv_ble_add_Zhihui_AI(server_id,srv_handle); + + // srv_ble_add_chart_decr_Zhihui_AI(server_id,srv_handle); srv_ble_add_ZHIHUIOTA_REPLY_chart_decr_recv_cmd(server_id,srv_handle); gatts_start_service(server_id, srv_handle); } @@ -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}; bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_REPLY_ID, &chara_uuid_data_2ae7); + bt_uuid_t chara_uuid_data_2ae8 = {0}; + bts_data_to_uuid_len2(BLE_ZHIHUI_AI_ID, &chara_uuid_data_2ae8); + + if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae8)) + { + if(data2ae8Cmd==0) + { + data2ae8Cmd=result->value_handle; + } + Is_value_handle[handle_num]=result->value_handle; + handle_num++; + } + if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae7)) { if(data2ae7Cmd==0) { data2ae7Cmd=result->value_handle; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "data2ae7Cmd"); } Is_value_handle[handle_num]=result->value_handle; handle_num++; @@ -1515,9 +1573,10 @@ errcode_t svr_ble_bt_gatts_noyify(uint8_t *data, uint16_t data_len)//这里是 if(ret!=ERRCODE_SUCC) { - 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, + 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, g_ble_conn_id, g_ble_server_handle,data_len); - ble_set_ai_Answer_str("BLE NOTIF ERROR",5); + + // ble_set_ai_Answer_str("BLE NOTIF ERROR",5); } } @@ -1533,7 +1592,41 @@ errcode_t svr_ble_bt_gatts_noyify_zhihui(uint8_t *data, uint16_t data_len)//这 data_info.value = data; data_info.value_len = data_len; if (g_ble_conn_id == 0) - return 0; + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id"); + // return 0; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id %d g_ble_conn_id %d",g_ble_server_id,g_ble_conn_id); + errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info); + if(ret!=ERRCODE_SUCC) + { + msleep(50); + ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info); + if(ret!=ERRCODE_SUCC) + { + msleep(100); + ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info); + + if(ret!=ERRCODE_SUCC) + 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, + g_ble_conn_id, g_ble_server_handle,data_len); + } + } + return ret; +} + +errcode_t svr_ble_bt_gatts_noyify_AI(uint8_t *data, uint16_t data_len)//这里是设备数据上报给app手机端 +{ + gatts_ntf_ind_t data_info; + data_info.attr_handle = data2ae8Cmd; + data_info.value = data; + data_info.value_len = data_len; + if (g_ble_conn_id == 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id"); + // return 0; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id %d g_ble_conn_id %d",g_ble_server_id,g_ble_conn_id); errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info); if(ret!=ERRCODE_SUCC) { @@ -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); if(ret!=ERRCODE_SUCC) - 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, + 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, g_ble_conn_id, g_ble_server_handle,data_len); } } @@ -2134,7 +2227,7 @@ static void blesrv_service_check_task(void const *arg) WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n"); } } -#define BLESRV_APP_BOARD_MSG_COUNT 50 +#define BLESRV_APP_BOARD_MSG_COUNT 500 #define BLESRV_APP_BOARD_TASK_SIZE 0x2000 #define BLESRV_BOARD_TASK_PRIO 7 void create_blesrv_queue(void) @@ -2211,6 +2304,331 @@ void Check_ble_adv_status(void) return; } +static unsigned long g_ble_Ai_record_queue = 0xFFFFFFFF; +static uint8_t g_ble_Ai_record_queue_created = 0; + +void create_Ai_record_queue(void) +{ + if (osal_msg_queue_create("Ai_record_queue", BLESRV_APP_BOARD_MSG_COUNT, &g_ble_Ai_record_queue, + 0, MAX_BUF_LEN) != ERRCODE_SUCC) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail fail g_blesrv_queue:%d\n",g_ble_Ai_record_queue); + g_ble_Ai_record_queue_created = 0; + }else{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail success g_blesrv_queue:%d\n",g_ble_Ai_record_queue); + g_ble_Ai_record_queue_created = 1; + } + +} + + +#define Ai_TEST 0 +static void blesrvAi_send_service_task(void const *arg) +{ + unused(arg); + int32_t ret; + blesrv_custom_cmd_t mail={0}; + uint32_t msgsize = MAX_BUF_LEN; + + #if Ai_TEST + FILE* fp= fopen("user/airecord.pcm","wb+"); + #endif + while (1) + { + ret = osal_msg_queue_read_copy(g_ble_Ai_record_queue, (void *)&mail, &msgsize, + OSAL_MSGQ_WAIT_FOREVER); + if (ret != OSAL_SUCCESS) + { + continue; + } + + + uint8_t *p_msgbuf = (mail.msg_data); + uint16_t server_handle = mail.service_handle; + uint32_t msg_len = mail.msg_len; + + #if Ai_TEST + fwrite(fp,1,mail.msg_len,mail.msg_data); + #endif + // if(get_ble_connect()) + send_Ai_record(mail.msg_len,mail.msg_data); + + if(mail.msg_data) + { + free(mail.msg_data); + mail.msg_data = NULL; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n"); + } +} + + +static blesrv_custom_cmd_t g_blesrv_mail={0}; + +errcode_t uapi_Ai_send_service_init(void) +{ + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"uapi_blesrv_service_init !\r\n"); + app_task_definition_t taskcfg = {0}; + taskcfg.create_queue_handle = create_Ai_record_queue; + taskcfg.attr.name = "Ai_record_queue_service"; + taskcfg.attr.priority = osPriorityNormal; + taskcfg.attr.stack_size = BLESRV_APP_BOARD_TASK_SIZE; + taskcfg.func = blesrvAi_send_service_task; + taskcfg.use_mem = USE_EXTEND_MEM; + + g_blesrv_mail.msg_len=0; + g_blesrv_mail.msg_data=NULL; + + + errcode_t ret = uapi_create_osThread_custom(&taskcfg); + if (ret != ERRCODE_SUCC) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create blesrv_service failed %d!\r\n", ret); + return ERRCODE_FAIL; + } + + return ERRCODE_SUCC; +} + + +uint32_t send_msg_data_into_Ai_msg_queue_count=0; + + +void AI_data_assembly(uint8_t type,uint8_t *buf) +{ + + memset_s(buf,ble_nus_max_data_len,0,19); + // 设置消息头部信息 + buf[0] = 0x72; // 消息头 + buf[1] = 0x08; // 类型 + if(type) + buf[2] = 0x01; // 类型ID + else + buf[2] = 0x02; // 类型ID + uint32_t temp_data=1; + memcpy(buf + 3, &temp_data, 4); // 总包数 + memcpy(buf + 7, &temp_data, 4); // 总数据长度 + memcpy(buf + 11, &temp_data, 4); // 数据包ID + memcpy(buf + 15, &temp_data, 2); // 包数据长度 + + buf[18] = 0; // 计算CRC +} + +static uint8_t g_blesrv_mail_flag=0; + + + +int send_msg_data_into_Ai_msg_queue(void *buff,uint16_t len,uint8_t type) +{ + blesrv_custom_cmd_t blesrv_mail={0}; + uint32_t ret ; + if( g_blesrv_queue_created == 0) return ERRCODE_FAIL; + if (buff == NULL) return ERRCODE_FAIL; + + uint32_t sendlen = sizeof(blesrv_custom_cmd_t); + uint32_t singlebuflen= ble_nus_max_data_len-20; + + + if(len<=singlebuflen) + { + if(type==1) + { + blesrv_mail.service_handle = 0; + blesrv_mail.msg_len = len; + blesrv_mail.msg_data = (uint8_t*)malloc(len); + + if(blesrv_mail.msg_data==NULL) + { + return ERRCODE_FAIL; + } + memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len); + + ret = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0); + if (ret != OSAL_SUCCESS) + { + 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); + } + return OSAL_SUCCESS; + + } + else if(type==2) + { + + blesrv_custom_cmd_t blesrv_mail_end={0}; + + blesrv_mail_end.msg_len=g_blesrv_mail.msg_len; + blesrv_mail_end.msg_data=malloc(g_blesrv_mail.msg_len); + if(blesrv_mail_end.msg_data==NULL) + { + return ERRCODE_FAIL; + } + + memcpy_s( blesrv_mail_end.msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len); + free(g_blesrv_mail.msg_data); + g_blesrv_mail.msg_data=NULL; + g_blesrv_mail.msg_len=0; + + ret = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail_end, sendlen , 0); + if (ret != OSAL_SUCCESS) + { + 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); + } + + blesrv_mail.service_handle = 0; + blesrv_mail.msg_len = len; + blesrv_mail.msg_data = (uint8_t*)malloc(len); + + if(blesrv_mail.msg_data==NULL) + { + return ERRCODE_FAIL; + } + memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len); + + ret = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0); + if (ret != OSAL_SUCCESS) + { + 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); + } + return OSAL_SUCCESS; + } + //以下为文件数据处理 + if(g_blesrv_mail.msg_len+len=singlebuflen) + { + blesrv_mail.msg_len = singlebuflen; + blesrv_mail.msg_data = (uint8_t*)malloc(singlebuflen); + + if(blesrv_mail.msg_data==NULL) + { + return ERRCODE_FAIL; + } + memcpy_s((void *)(blesrv_mail.msg_data),singlebuflen,buff+i*singlebuflen,singlebuflen); + residue_len-=singlebuflen; + } + else if(len%singlebuflen) + { + blesrv_mail.msg_len = len%singlebuflen; + blesrv_mail.msg_data = (uint8_t*)malloc( len%singlebuflen); + + if(blesrv_mail.msg_data==NULL) + { + return ERRCODE_FAIL; + } + memcpy_s((void *)(blesrv_mail.msg_data),len%singlebuflen,buff+i*singlebuflen,len%singlebuflen); + } + + + 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", + g_ble_Ai_record_queue, + blesrv_mail.msg_data, + blesrv_mail.msg_data[0], + blesrv_mail.msg_data[1], + blesrv_mail.msg_data[2], + msg_data[0], + msg_data[1], + msg_data[2] + ); + ret = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0); + if (ret != OSAL_SUCCESS) + { + 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); + } + } + } + + + return ret; +} + + #ifdef __cplusplus } diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleService.h b/code/sdk/application/wearable/service/ble_service/bleservice/bleService.h index 8cf27f501..4837c6745 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleService.h +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleService.h @@ -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 } diff --git a/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp b/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp index f1aff0569..b1e778462 100755 --- a/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp +++ b/code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp @@ -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); -- 2.17.1