添加对话超时退出,故事结束退出逻辑
authorxue <2144439972@qq.com>
Thu, 13 Nov 2025 09:19:18 +0000 (17:19 +0800)
committerxue <2144439972@qq.com>
Thu, 13 Nov 2025 09:19:18 +0000 (17:19 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp

index 151a06a..faee7d0 100644 (file)
     void ThunderBirdModel::HandleSleepModeEnd()
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleSleepModeEnd");
+        // 重置故事模式finished标志
+        m_storyModeFinished = false;
+        
         if (ThunderBirdMainView::GetInstance()) {
             int currentView = ThunderBirdMainView::GetInstance()->GetCurrentView(); //获取当前视图
             ln_ws_audio_deinit();//功耗优化
             //直接退出到状态显示界面
             AI_ForceInterrupt();
             ln_ws_send_voice_chat_interrupt("退出哄睡");
+            //推送结束故事消息
+            do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_STORY_FINISH, NULL, 0);
             ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
         } else {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView instance is null, cannot end sleep mode");
         }
     }
+    
+    void ThunderBirdModel::HandleStoryResponseFinished(bool finished)
+    {
+        if (finished) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleStoryResponseFinished: 收到故事模式finished=true");
+            m_storyModeFinished = true;
+        }
+    }
+    
+    void ThunderBirdModel::HandleDialogueResponseFinished(bool finished)
+    {
+        if (finished) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleDialogueResponseFinished: 收到对话模式finished=true");
+            m_dialogueModeFinished = true;
+        }
+    }
 
     void ThunderBirdModel::HandleBindAndUnbind(int is_bind)
     {
     void ThunderBirdModel::HandleAudioPlaybackEnd()
     {
         //return;//确保稳定性该版本不使用音频播放结束处理
+        int currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
         int currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
-        if(ThunderBirdDialogueView::GetInstance() && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)
+        
+        // 检查是否是对话模式且已finished
+        if (currentView == THUNDERBIRD_DIALOGUEVIEW && 
+            currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING &&
+            m_dialogueModeFinished)
         {
-            
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioPlaybackEnd: 对话模式finished且音频播放结束,结束对话");
+            // 重置标志
+            m_dialogueModeFinished = false;
+            // 结束对话
+             
             ThunderBirdDialogueView::GetInstance()->AudioPlaybackEnd();
             //增加30秒定时器
             ThunderBirdModel::GetInstance()->StartCountUpTimer(120);
+            // ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
+            // ln_ws_end_audio_chat();//结束对话
+            // // 退出对话模式时恢复表情
+            // AI_ForceInterrupt();
+            // ln_ws_send_voice_chat_interrupt("退出对话");
+            // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
+            // ThunderBirdPresenter::GetInstance()->SetDialogueing(false);
+            // ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); // 关闭屏幕常亮
+            // ThunderBirdModel::GetInstance()->HighFrequence();//恢复视频帧率
+            // ThunderBirdModel::GetInstance()->OnExitDialogueMode();
+            return;
+        }
+        
+        // 检查是否是故事模式且已finished
+        if (currentView == THUNDERBIRD_LULLABYVIEW && 
+            currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4 &&
+            m_storyModeFinished)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioPlaybackEnd: 故事模式finished且音频播放结束,结束故事模式");
+            // 重置标志
+            m_storyModeFinished = false;
+            // 结束故事模式
+            HandleSleepModeEnd();
+            return;
         }
+        
     }
     
     // 录音开始处理函数
         else if (emotionStr == "speechless") return "Speechless";
         else if (emotionStr == "dizzy") return "Dizzy";
         else if (emotionStr == "thinking") return "Think";
-        else if (emotionStr == "sleeppy") return "Sleepy";
+        else if (emotionStr == "sleepy") return "Sleepy";
+        else if (emotionStr == "sleeping") return "Sleepy";
         else if (emotionStr == "working") return "WorkStudy";
         else if (emotionStr == "exercising") return "Exercise";
         else if (emotionStr == "playing") return "Play";
     // 进入对话模式时记录当前表情
     void ThunderBirdModel::OnEnterDialogueMode()
     {
+        // 重置对话模式finished标志
+        m_dialogueModeFinished = false;
         // 记录进入对话模式前的表情,不改变当前表情
         m_dialogueExpression = m_currentExpression;
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnEnterDialogueMode: 记录进入对话模式前的表情: %s", m_currentExpression.c_str());
     // 退出对话模式时恢复表情
     void ThunderBirdModel::OnExitDialogueMode()
     {
+        // 重置对话模式finished标志
+        m_dialogueModeFinished = false;
         // 恢复到进入对话模式前记录的表情
         if (!m_currentExpression.empty()) {
             SetCurrentExpression(m_currentExpression);
                 std::string emotionFileName = MapEmotionToFileName(m_currentExpression.c_str());
                 expressionPath = "/user/res/video/Default/"+ emotionFileName + ".mp4";
                 SwitchExpressionVideo(expressionPath.c_str());
+                HandleHairIconChange(m_currentExpression);
             }
             else//非默认表情
             {
                 if(access(expressionPath.c_str(), F_OK) != -1)
                 {
                     SwitchExpressionVideo(expressionPath.c_str());
+                    HandleHairIconChange(m_currentExpression);
                 }
                 else
                 {
             expressionPath.c_str(), m_currentStatusText.c_str());
         }
     }
-    
+    //根据表情切换头发图标
+    void ThunderBirdModel::HandleHairIconChange(const std::string& expression)
+    {
+        if(expression == "sleeping")
+        {
+            ThunderBirdMainView::GetInstance()->SwitchHairIcon("/user/res/hair/hairicon/Sleeping.bin");
+        }else if(expression == "angry")
+        {
+            ThunderBirdMainView::GetInstance()->SwitchHairIcon("/user/res/hair/hairicon/Angry.bin");
+        }else if(expression == "confused")
+        {
+            ThunderBirdMainView::GetInstance()->SwitchHairIcon("/user/res/hair/hairicon/Confused.bin");
+        }else if(expression == "shocked")
+        {
+            ThunderBirdMainView::GetInstance()->SwitchHairIcon("/user/res/hair/hairicon/Shocked.bin");
+        }else if(expression == "speechless")
+        {
+            ThunderBirdMainView::GetInstance()->SwitchHairIcon("/user/res/hair/hairicon/Speechless.bin");
+        }
+        else
+        {
+            ThunderBirdMainView::GetInstance()->StopHairIcon();//默认不显示头发图标
+        }
+    }
     // 获取当前表情状态
     std::string ThunderBirdModel::GetCurrentExpression() const
     {