优化对话逻辑
authorxue <2144439972@qq.com>
Wed, 26 Nov 2025 02:10:24 +0000 (10:10 +0800)
committerxue <2144439972@qq.com>
Wed, 26 Nov 2025 02:10:24 +0000 (10:10 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdPresenter.h
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdReminderView.h
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdReminderView.cpp

index 96b6c10..5dc0913 100644 (file)
@@ -230,6 +230,9 @@ namespace OHOS
         void LowFrequence();
         // 恢复视频帧率
         void HighFrequence();
+        
+        // VAD 后台认证任务(静态函数,可以在线程中调用)
+        static void VadAuthBackgroundTask(void *arg);
 
         // 音频播放开始处理函数
         void HandleAudioPlaybackStart();
@@ -242,7 +245,9 @@ namespace OHOS
         void HandleAudioRecordingStart();
         // 录音结束处理函数
         void HandleAudioRecordingEnd();
-        
+
+        // VAD初始化完成处理函数
+        void HandleVadInitialized();
         // 将英文表情映射到英文文件名
         std::string MapEmotionToFileName(const char* emotion);
         
index 1da019c..11fb99c 100644 (file)
@@ -39,6 +39,7 @@ namespace OHOS
         bool powerKeyPressed{false};//电源键按下标志位,防止重复触发
         bool screenOnFromOff{false};//从息屏状态亮屏的标志位,防止松开时立即息屏
         bool pendingDialogueJump{false};//等待音频初始化完成后跳转对话界面的标志位
+        bool vadFirstSuccess{false};//VAD服务器第一次认证成功标志位
 
         void SetDialogueing(bool dialogueing);//设置对话模式标志位
 
index 8a657a5..ba5773c 100644 (file)
@@ -34,10 +34,12 @@ namespace OHOS
 
         void IsIcon(bool flag);
         void dialogue_unnetwork();
+        void dialogue_vad_initializing();
         enum : int16_t {
             THUNDERBIRD_REMINDERVIEW_VOLUME = 0,      // 音量调节
             THUNDERBIRD_REMINDERVIEW_TASK_REMINDER,   // 事项提醒
             THUNDERBIRD_REMINDERVIEW_NETWORK_DISCONNECT, // 网络断开
+            THUNDERBIRD_REMINDERVIEW_VAD_INITIALIZING, // 等待语音初始化
             THUNDERBIRD_REMINDERVIEW_LOW_BATTERY,     // 电量不足
             THUNDERBIRD_REMINDERVIEW_CHARGING,        // 充电中
             THUNDERBIRD_REMINDERVIEW_CHARGE_COMPLETE, // 充电完成
index 75d6b9f..29592cd 100644 (file)
@@ -267,6 +267,10 @@ namespace OHOS
         if (keyState == InputDevice::STATE_LONG_PRESS) {
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandlePowerKey: 长按关机键,进入关机界面");
             powerKeyPressed = false; // 重置标志位
+            // 退出对话模式时恢复表情
+            AI_ForceInterrupt();
+            ln_ws_send_voice_chat_interrupt("退出哄睡");
+            do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
             NativeAbility::GetInstance().SwitchSlice(VIEW_REBOOT);
             return true;
         }
@@ -274,18 +278,19 @@ namespace OHOS
         // 按下电源键
         if (keyState == InputDevice::STATE_PRESS) {
             powerKeyPressed = true; // 设置按下标志位
-            
+            #if defined(SUPPORT_CAT1_SERVICE) || defined(SUPPORT_PPP_SERVICE)
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandlePowerKey: restart_time_sync");
+            restart_time_sync();
+            #endif
             if (screenState == 1) {
                 // 息屏状态下按下:亮屏(由系统自动处理)
                 // 亮屏时触发时间同步
-                #ifdef SUPPORT_CAT1_SERVICE
-                restart_time_sync();
-                #endif
                 screenOnFromOff = true; // 标记是从息屏状态亮屏的
                 WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandlePowerKey: Screen on from off, trigger time sync");
                 return true;
             } else {
                 // 亮屏状态下按下,清除标志位
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandlePowerKey: screenState == 2");
                 screenOnFromOff = false;
             }
         }
@@ -378,8 +383,8 @@ namespace OHOS
         
         // FUNC键松开时,如果没有进入对话模式则关闭音频初始化
         if (keyState == InputDevice::STATE_RELEASE && screenState == 0 && !isDialogueing && currentView != THUNDERBIRD_LULLABYVIEW) {
-            // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FUNC键松开,未进入对话模式,关闭音频初始化");
-            // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FUNC键松开,未进入对话模式,关闭音频初始化");
+            do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
         }
         
         return true;
@@ -468,7 +473,7 @@ namespace OHOS
             ln_ws_end_audio_chat();
             //清空音频文本队列
             ThunderBirdModel::GetInstance()->ClearAudioTextQueue();
-        } else {
+        } else if(currentView == THUNDERBIRD_DIALOGUEVIEW && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING) {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始录音,跳转到聆听状态");
             // 开始录音
             ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
@@ -829,46 +834,63 @@ namespace OHOS
             || (currentView == THUNDERBIRD_GUIDEVIEW))
             {
                 do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_INIT, NULL, 0);
-                ThunderBirdModel::GetInstance()->LowFrequence();//减低视频帧率
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "进入对话模式");
-                // 检查WebSocket连接状态
+                // 检查WebSocket连接状态和VAD认证状态
                 int wsState = ln_ws_get_connection_state();
                 bool wsConnected = (wsState == 2); // WS_STATE_CONNECTED = 2
+                bool vadEnabled = ln_ws_is_vad_server_enabled();
+
                 
-                //只要开机的时候检查
-                if (!wsConnected && ThunderBirdModel::GetInstance()->init_falg == false) {
-                    // WebSocket未连接,显示网络断开提醒界面,不设置定时器
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "进入对话模式时WebSocket未连接,显示网络断开提醒 (wsState=%d)", wsState);
-                    // 设置标志,表示用户想要进入对话模式但因为WebSocket未连接而显示提醒
-                    isDialogueing = true; // 设置标志,这样WebSocket连接成功时知道要进入对话模式
+                if (!wsConnected) {
+                    // 不满足条件,显示提示并设置2秒定时器自动隐藏
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "进入对话模式条件不满足: wsConnected=%d", wsConnected);
+                    // 先切换到提醒视图
+                    ThunderBirdModel::GetInstance()->StartReminderHideTimer(2000);
                     ThunderBirdMainView::GetInstance()->ChangeThunderBirdReminderView(THUNDERBIRD_REMINDERVIEW);
                     ThunderBirdReminderView *reminderView = ThunderBirdReminderView::GetInstance();
                     if (reminderView) {
-                        reminderView->Show(ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_NETWORK_DISCONNECT);
-                        reminderView->dialogue_unnetwork();
+                        if (!wsConnected) {
+                            // WebSocket未连接,显示网络断开提醒
+                            reminderView->Show(ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_NETWORK_DISCONNECT);
+                            reminderView->dialogue_unnetwork();
+                        }
+                        // 显示后再设置2秒定时器自动隐藏提示
+                    } else {
+                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdReminderView::GetInstance() returned NULL");
                     }
+                    return; // 不满足条件,不进入对话模式
                 }
                 
-                // 检查音频是否已初始化,如果未初始化则设置标志位等待定时器检查
-                // if(ln_ws_is_audio_initialized())
-                // {
-                    // 音频已初始化,直接跳转界面
-                    ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
-                    if(currentView == THUNDERBIRD_GUIDEVIEW)
-                    {
-                        ThunderBirdDialogueView::GetInstance()->Isband(false);
-                    }
-                    else
+                // 条件满足,进入对话模式
+                ThunderBirdModel::GetInstance()->LowFrequence();//减低视频帧率
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "进入对话模式");
+                
+                // 音频已初始化,直接跳转界面
+                ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
+                if(currentView == THUNDERBIRD_GUIDEVIEW)
+                {
+                    ThunderBirdDialogueView::GetInstance()->Isband(false);
+                }
+                else
+                {
+                    ThunderBirdDialogueView::GetInstance()->Isband(true);
+                }
+                bool vadInitialized = ln_ws_is_vad_server_initialized();
+                bool vadAuthSuccess = ln_ws_is_vad_server_auth_success();
+                if(vadAuthSuccess == true || vadInitialized == true)
+                {
+                    vadFirstSuccess = true;
+                }
+                if(vadFirstSuccess == false)
+                {
+                ThunderBirdModel::GetInstance()->StartReminderHideTimer(3000);
+                ThunderBirdMainView::GetInstance()->ChangeThunderBirdReminderView(THUNDERBIRD_REMINDERVIEW);
+                ThunderBirdReminderView *reminderView = ThunderBirdReminderView::GetInstance();
+                if (reminderView) 
                     {
-                        ThunderBirdDialogueView::GetInstance()->Isband(true);
+                        reminderView->Show(ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_VAD_INITIALIZING);
+                        reminderView->dialogue_vad_initializing();
                     }
-                // }
-                // else
-                // {
-                //     // 音频未初始化,设置标志位,等待定时器检查
-                //     pendingDialogueJump = true;
-                //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "音频未初始化,设置pendingDialogueJump=true,等待定时器检查");
-                // }
+                }
                 
                 isDialogueing = true;
                 ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 打开屏幕常亮
index 94a1887..a53de14 100644 (file)
@@ -200,6 +200,24 @@ namespace OHOS
             }
             break;
         }
+        case THUNDERBIRD_REMINDERVIEW_VAD_INITIALIZING:
+        {
+            if (RemindButton)
+            {
+                RemindButton->SetPosition(102, 114, 168, 40);
+                RemindButton->SetText("等待语音初始化");
+                RemindButton->SetLabelPosition(4, 2);
+                RemindButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 20);
+                RemindButton->SetVisible(true);
+            }
+            // if (RemindIcon)
+            // {
+            //     RemindIcon->SetPosition(115, 120, 47, 47);
+            //     RemindIcon->SetSrc("/user/res/no_network.bin");
+            //     RemindIcon->SetVisible(true);
+            // }
+            break;
+        }
         case THUNDERBIRD_REMINDERVIEW_LOW_BATTERY:
         {
             if (RemindButton)
@@ -513,6 +531,20 @@ namespace OHOS
             }
     }
 
+    void ThunderBirdReminderView::dialogue_vad_initializing()
+    {
+        if (RemindButton)
+        {
+            RemindButton->SetText("等待语音初始化");
+        }
+        // if (RemindIcon)
+        //     {
+        //         RemindIcon->SetPosition(105, 120, 47, 47);
+        //         RemindIcon->SetSrc("/user/res/no_network.bin");
+        //         RemindIcon->SetVisible(true);
+        //     }
+    }
+
 }