From 9792bbef813e5d948e5f0c4465c051b2e91ccc4a Mon Sep 17 00:00:00 2001 From: xue <2144439972@qq.com> Date: Thu, 13 Nov 2025 17:19:18 +0800 Subject: [PATCH] =?utf8?q?=E6=B7=BB=E5=8A=A0=E5=AF=B9=E8=AF=9D=E8=B6=85?= =?utf8?q?=E6=97=B6=E9=80=80=E5=87=BA=EF=BC=8C=E6=95=85=E4=BA=8B=E7=BB=93?= =?utf8?q?=E6=9D=9F=E9=80=80=E5=87=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../thunderbird/src/ThunderBirdModel.cpp | 93 ++++++++++++++++++- 1 file changed, 89 insertions(+), 4 deletions(-) diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp index 151a06a66..faee7d0ae 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp @@ -2340,17 +2340,38 @@ 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) { @@ -2467,14 +2488,48 @@ 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; } + } // 录音开始处理函数 @@ -2565,7 +2620,8 @@ 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"; @@ -2665,6 +2721,8 @@ // 进入对话模式时记录当前表情 void ThunderBirdModel::OnEnterDialogueMode() { + // 重置对话模式finished标志 + m_dialogueModeFinished = false; // 记录进入对话模式前的表情,不改变当前表情 m_dialogueExpression = m_currentExpression; WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnEnterDialogueMode: 记录进入对话模式前的表情: %s", m_currentExpression.c_str()); @@ -2673,6 +2731,8 @@ // 退出对话模式时恢复表情 void ThunderBirdModel::OnExitDialogueMode() { + // 重置对话模式finished标志 + m_dialogueModeFinished = false; // 恢复到进入对话模式前记录的表情 if (!m_currentExpression.empty()) { SetCurrentExpression(m_currentExpression); @@ -2718,6 +2778,7 @@ std::string emotionFileName = MapEmotionToFileName(m_currentExpression.c_str()); expressionPath = "/user/res/video/Default/"+ emotionFileName + ".mp4"; SwitchExpressionVideo(expressionPath.c_str()); + HandleHairIconChange(m_currentExpression); } else//非默认表情 { @@ -2733,6 +2794,7 @@ if(access(expressionPath.c_str(), F_OK) != -1) { SwitchExpressionVideo(expressionPath.c_str()); + HandleHairIconChange(m_currentExpression); } else { @@ -2746,7 +2808,30 @@ 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 { -- 2.17.1