1.AI超时界面UI优化 1196/1 1196/head
authorluozheng <1732036298@qq.com>
Wed, 16 Oct 2024 08:18:12 +0000 (16:18 +0800)
committerluozheng <1732036298@qq.com>
Wed, 16 Oct 2024 08:18:12 +0000 (16:18 +0800)
2.添加AI回应直接结束,返回结果为空弹窗
3.进入AI界面动态更改连接参数,减少发送语音数据错误率
4.发送AI准备和取消当前AI对话指令,使用蓝牙的线程,与UI线程解耦

code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceConnectTimeoutView.cpp
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleService.c
code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c

index 3f7f047..1ef125c 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-20 15:14:50
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-10-15 19:02:09
+ * @LastEditTime: 2024-10-16 10:46:11
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp
  */
 #include "aivoice/include/AiVoiceModel.h"
@@ -515,7 +515,7 @@ namespace OHOS
     {
         AIResponseType = type;
         errnote = str;
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AIResponseType = %d,errnote = %s\n", AIResponseType, errnote.c_str());
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AIResponseType = %d,errnote = %s\n", AIResponseType, errnote.c_str());
         //如果是:AI录音解析错误或AI 回应错误 ,或者重传多次录音数据->跳转AI回应错误界面
         if (AIResponseType == AiVoiceModel::AI_RECORDING_PARSING_ERROR || AIResponseType == AiVoiceModel::AI_RESPONSE_ERROR 
             || AIResponseType == AiVoiceModel::AI_BLE_ERROR)
@@ -523,6 +523,17 @@ namespace OHOS
             SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)errnote.c_str(), errnote.length());
             return;
         }
+        else if(AiVoiceModel::AI_RESPONSE_END) //如果是AI 回应结束
+        {
+            if(errnote.empty()) //如果没有回应数据
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceModel::GetErrnote is empty!!");
+                AiVoiceModel::GetInstance().SetErrnote("response data is empty");
+                std::string str = AiVoiceModel::GetInstance().GetErrnote();
+                SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)str.c_str(), str.length());
+                return;
+            }
+        }
         aiAnswerStr += str;
         SendMsgToUIService(UI_UPDATE_AI_ANSWER_STR, 0, nullptr, 0);
     }
index 4fd9b91..f9428d0 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-20 15:11:17
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-09-26 16:16:49
+ * @LastEditTime: 2024-10-16 15:13:54
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp
  */
 #include "AppViewIDs.h"
@@ -22,6 +22,7 @@
 #include <unistd.h>
 
 #include "gfx_utils/mem_check.h"
+#include "bleService.h"
 
 namespace OHOS
 {
@@ -58,6 +59,8 @@ namespace OHOS
         ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);
         // 开启一个60s取消长亮屏timer
         model->ai_start_screen60s_timer();
+
+        uapi_ble_connect_param_update(10);
     }
 
     // 页面已经展示后的调用逻辑
@@ -87,6 +90,8 @@ namespace OHOS
         model->StatusResume();
         model->ai_stop_screen60s_timer();
         model->stop_listening_timer();
+
+        uapi_ble_connect_param_update(50);
     }
 
     /*调转到返回结果界面*/
@@ -351,6 +356,11 @@ namespace OHOS
         auto it = viewIdMap.find(viewId);
         if (it != viewIdMap.end())
         {
+            if(it->first == AIVOICERETURNRESULTTEXT_CONTINUECHAT_BUTTON_VIEW_ID) //点击继续对话按钮要发取消当前对话指令,避免AI回应中途按继续对话按钮没有取消上一次对话问题
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CancelCurAIChat");
+                AiVoiceModel::GetInstance().CancelCurAIChat();
+            }
             ChangeViewAndLogicOperator(it->second.first, it->second.second);
             return true;
         }
index 35557fc..00962b6 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-05-07 11:25:58
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-10-05 10:20:37
+ * @LastEditTime: 2024-10-16 11:37:43
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/AiVoice/src/AivoiceConnectTimeoutView.cpp
  */
 #include "aivoice/include/AiVoicePresenter.h"
@@ -275,10 +275,11 @@ namespace OHOS
     {
         if (NoteLabel)
         {
-            NoteLabel->SetText("");
+            // NoteLabel->SetText("");
             std::string text = AiVoiceModel::GetInstance().GetErrnote();
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "text = %s", text.c_str());
             NoteLabel->SetText(text.c_str());
+            NoteLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
             NoteLabel->Invalidate();
         }
     }
index 3f3b687..9abf637 100644 (file)
@@ -473,35 +473,7 @@ void sendtraningdata(msg_get_train_data_info_t *data)
 }\r
 \r
 static uint8_t AI_is_end_state=0;\r
-//发送AI录音准备就绪国内/\r
-/*使用模型:\r
-0:文心一言\r
-1:ChatGPT\r
-2:KIMI\r
-3:豆包*/\r
-bool send_AI_is_ready(uint8_t type)\r
-{\r
-    \r
-    if(AI_is_end_state==0)\r
-    {  \r
-        printf("发送AI准备就绪\r\n");\r
-        ble_data_type type_={0x05,0x05,1,1,1};\r
-        send_big_data(type_,(char *)&type,1);\r
-        AI_is_end_state=1;\r
-        return true;\r
 \r
-    }\r
-    else\r
-    {\r
-        printf("发送AI准备就绪失败,没有正确回复结束\r\n");\r
-        return false;\r
-    }\r
-  \r
-\r
-\r
-\r
-    //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5);\r
-}\r
 //查询AI 模型是否可用,结果通过2AE4返回\r
 /*使用模型:\r
 0:文心一言\r
@@ -517,25 +489,7 @@ void inquire_AI_is_ready(uint8_t type)
     //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x06, 5);\r
 }\r
 \r
-void cancel_AI_cur_chat(void)\r
-{\r
-    if(AI_is_end_state)\r
-    {\r
-        printf("取消当前AI对话\r\n");\r
-        uint8_t data=1;\r
-        ble_data_type type_={0x05,0x07,data_len,1,1};\r
-        send_big_data(type_,(char *)&data,data_len);\r
-        AI_is_end_state=0;\r
-        \r
-    }\r
-    else\r
-    {\r
-        printf("已经取消当前AI对话无需再次取消\r\n");\r
-    }\r
-    \r
 \r
-    //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);\r
-}\r
 \r
 \r
 //发送ble数据\r
@@ -8276,6 +8230,13 @@ void free_ble_data(void)//以防断开蓝牙没有释放数据类型
 }\r
 \r
 \r
+void cancel_AI_cur_chat(void)\r
+{\r
+    blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_cancel_AI",13);\r
+    return;\r
+    //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);\r
+}\r
+\r
 void free_ble_data_Event(void)//以防断开蓝牙没有释放数据类型\r
 {\r
    \r
@@ -8303,6 +8264,59 @@ void free_ble_data_Event(void)//以防断开蓝牙没有释放数据类型
     \r
 }\r
 \r
+//发送AI录音准备就绪国内/\r
+/*使用模型:\r
+0:文心一言\r
+1:ChatGPT\r
+2:KIMI\r
+3:豆包*/\r
+bool send_AI_is_ready_(uint8_t type)\r
+{\r
+    \r
+    if(AI_is_end_state==0)\r
+    {  \r
+        printf("发送AI准备就绪\r\n");\r
+        ble_data_type type_={0x05,0x05,1,1,1};\r
+        send_big_data(type_,(char *)&type,1);\r
+        AI_is_end_state=1;\r
+        return true;\r
+    }\r
+    else\r
+    {\r
+        printf("发送AI准备就绪失败,没有正确回复结束\r\n");\r
+        return false;\r
+    }\r
+    //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5);\r
+}\r
+\r
+static uint8_t AI_is_ready_type=0;\r
+\r
+bool send_AI_is_ready(uint8_t type)\r
+{\r
+    AI_is_ready_type=type;\r
+    blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_is_ready",12);\r
+    return true;\r
+}\r
+\r
+void cancel_AI_cur_chat_(void)\r
+{\r
+    if(AI_is_end_state)\r
+    {\r
+        printf("取消当前AI对话\r\n");\r
+        uint8_t data=1;\r
+        ble_data_type type_={0x05,0x07,data_len,1,1};\r
+        send_big_data(type_,(char *)&data,data_len);\r
+        AI_is_end_state=0;\r
+        \r
+    }\r
+    else\r
+    {\r
+        printf("已经取消当前AI对话无需再次取消\r\n");\r
+    }\r
+    \r
+\r
+    //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);\r
+}\r
 \r
 //接收app下发的原始数据 \r
 void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小\r
@@ -8310,7 +8324,19 @@ void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的
     printf("handle :%d %s event_size %d\r\n",handle,getHandlname(handle),event_size);\r
     if(handle==0xff)\r
     {\r
-        free_ble_data_Event();\r
+        if(strcmp("AI_cancel_AI",(char *)buf)==0)\r
+        {\r
+            cancel_AI_cur_chat_();\r
+        }\r
+        else if(strcmp("AI_is_ready",(char *)buf)==0)\r
+        {\r
+           send_AI_is_ready_(AI_is_ready_type);\r
+        }\r
+        else\r
+        {\r
+            free_ble_data_Event();\r
+        }\r
+       \r
         return;\r
     }\r
 \r
index 032c645..d034565 100644 (file)
@@ -492,16 +492,7 @@ void svr_ble_connstate_change_cb(unsigned short conn_id, bd_addr_t *addr, gap_bl
 \r
 \r
         Bleconnect = GAP_BLE_STATE_CONNECTED;//蓝牙已连接\r
-        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GAP_BLE_STATE_CONNECTED!!! 0x%x\r\n",pair_state);  \r
-\r
-        // gap_conn_param_update_t conn_param = { 0 };\r
-        // conn_param.conn_handle = conn_id;    /* param 0: conn_handle */\r
-        // conn_param.interval_min =50;    /* param 1: interval_min */\r
-        // conn_param.interval_max = 50;    /* param 2: interval_max */\r
-        // conn_param.slave_latency = 6;    /* param 3: slave_latency */\r
-        // conn_param.timeout_multiplier = 700;    /* param 4: timeout_multiplier */\r
-        // ret = gap_ble_connect_param_update(&conn_param);\r
-        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"gap ble update connection parameters ret: %X\n", ret);   \r
+       \r
 \r
     }\r
 \r
@@ -512,7 +503,7 @@ void uapi_ble_connect_param_update(uint16_t data)
 {\r
     gap_conn_param_update_t conn_param = { 0 };\r
     conn_param.conn_handle = g_ble_conn_id;    /* param 0: conn_handle */\r
-    conn_param.interval_min =data;    /* param 1: interval_min */\r
+    conn_param.interval_min =data;    /* param 1: interval_min 10ms */\r
     conn_param.interval_max = data;    /* param 2: interval_max */\r
     conn_param.slave_latency = 6;    /* param 3: slave_latency */\r
     conn_param.timeout_multiplier = 700;    /* param 4: timeout_multiplier */\r
@@ -565,14 +556,6 @@ void svr_pair_result_cbt_cb(uint16_t conn_id, const bd_addr_t *addr, errcode_t s
         hand_watch_first_time_Paired();\r
         svr_ble_adv_stop();\r
 \r
-        gap_conn_param_update_t conn_param = { 0 };\r
-        conn_param.conn_handle = conn_id;    /* param 0: conn_handle */\r
-        conn_param.interval_min =150;    /* param 1: interval_min */\r
-        conn_param.interval_max = 150;    /* param 2: interval_max */\r
-        conn_param.slave_latency = 20;    /* param 3: slave_latency */\r
-        conn_param.timeout_multiplier = 160*32;    /* param 4: timeout_multiplier */\r
-        errcode_t ret = gap_ble_connect_param_update(&conn_param);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"gap ble update connection parameters ret: %u\n", ret);    \r
     }\r
 }\r
     // uint16_t interval;          /*!< @if Eng interval\r
@@ -1240,8 +1223,16 @@ errcode_t svr_ble_bt_gatts_noyify(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_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
+                msleep(200);\r
+                ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
+                if(ret!=ERRCODE_SUCC)\r
+                {\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
+            }\r
         }\r
     }\r
     return ret;  \r
index 1b2b38d..1e62501 100644 (file)
@@ -1122,6 +1122,9 @@ static uint32_t BLE_TEST(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
      case 18:
         test_paly(type_2);
         break;
+    case 19:
+        uapi_ble_connect_param_update(type_2);
+        break;
 
     default:
         break;