#include "cJSON.h"
#include "font/ui_font.h"
#include "ln_api.h"
+#include <unistd.h>
+#include "vibrator_service.h"
#define JUHEPINGTAI 0
#if JUHEPINGTAI
#include "websocket_server_manager.h"
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "设置对话文本: textId is null");
return;
}
- // 添加文本内容
- m_currentTimeStr = textId;
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "设置对话文本: %s", m_currentTimeStr.c_str());
- int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
- int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
- if(ThunderBirdDialogueView::GetInstance() && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)
- ThunderBirdDialogueView::GetInstance()->UpdateDialogueText(m_currentTimeStr.c_str());
- if(ThunderBirdLullabyView::GetInstance() && currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4)
- ThunderBirdLullabyView::GetInstance()->UpdateLullabyText(m_currentTimeStr.c_str());
- //清除录音内容
- ClearTextStr();
+
+ // 检查是否有文本正在处理中
+ if (!m_hasTextProcessing) {
+ // 第一个文本:直接显示,设置处理标志
+ m_hasTextProcessing = true;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "第一个文本直接显示: %s", textId);
+
+ // 获取当前视图状态
+ int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
+ int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
+
+ // 直接推送到对话界面
+ if(ThunderBirdDialogueView::GetInstance() && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)
+ {
+ ThunderBirdDialogueView::GetInstance()->UpdateDialogueText(textId);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "第一个文本直接显示在对话界面: %s", textId);
+ }
+
+ // 不入队,避免重复显示
+ } else {
+ // 非第一个文本,加入队列等待音频开始播放时同步出队
+ EnqueueAudioText(textId);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "文本入队,等待音频开始播放: %s", textId);
+ }
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleScheduleReminder");
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title: %s", title ? title : "NULL");
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Content: %s", content ? content : "NULL");
-
+ // 震动提醒
+ custom_VibratorFunc_int(0);
// 示例:通过图形服务显示提醒
if (title && content) {
// 可以在这里调用UI相关的显示逻辑
if (ThunderBirdMainView::GetInstance()) {
int currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
- ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_REMINDERVIEW, ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER);
+ int currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
+ //如果当前界面是事项提醒界面,则不进行切换,防止返回原任务进入循环
+ if(currentView != THUNDERBIRD_REMINDERVIEW && currentSubView != ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER)
+ {
+ ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_REMINDERVIEW, ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER);
+ }
+
// 更新任务提醒的文本内容
if (ThunderBirdReminderView::GetInstance()) {
uapi_set_screen_on_api(); // 亮屏
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleTaskReminder");
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ScheduleName: %s", scheduleName ? scheduleName : "NULL");
-
+ // 震动提醒
+ custom_VibratorFunc_int(0);
// 这里可以添加具体的任务提醒处理逻辑
// 例如:显示任务提醒界面、播放提醒音、更新任务列表等
// 可以在这里调用UI相关的显示逻辑
if (ThunderBirdMainView::GetInstance()) {
int currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
- ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_REMINDERVIEW, ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER);
-
+ int currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
+ //如果当前界面是事项提醒界面,则不进行切换,防止返回原任务进入循环
+ if(currentView != THUNDERBIRD_REMINDERVIEW && currentSubView != ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER)
+ {
+ ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_REMINDERVIEW, ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER);
+ }
// 更新任务提醒的文本内容
if (ThunderBirdReminderView::GetInstance()) {
ThunderBirdReminderView::GetInstance()->UpdateTaskReminderText(scheduleName,nullptr);
NativeAbility::GetInstance().ChangeSlice(VIEW_OTA);
}
+ void ThunderBirdModel::HandleAudioPlaybackStart()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioPlaybackStart");
+ // 音频开始播放时,从队列中取出对应的文本并推送
+ DequeueAndPushAudioText();
+ }
+
void ThunderBirdModel::HandleAudioPlaybackEnd()
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioPlaybackEnd");
{
ThunderBirdDialogueView::GetInstance()->AudioPlaybackEnd();
}
+
+ // 重置文本处理标志,允许下一轮对话的第一个文本直接显示
+ m_hasTextProcessing = false;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "音频播放结束,重置文本处理标志");
+ }
+
+ // NPC表情变化处理函数
+ void ThunderBirdModel::HandleNpcEmotionChange(const char* emotion)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleNpcEmotionChange: %s", emotion ? emotion : "NULL");
+
+ if (emotion == nullptr || strlen(emotion) == 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleNpcEmotionChange: emotion is null or empty");
+ return;
+ }
+
+ //判断对话界面当前表情
+
+ // 获取当前视图状态
+ int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
+ int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
+
+ // 如果当前在对话界面,更新表情显示
+ if(ThunderBirdDialogueView::GetInstance() && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)
+ {
+ // 这里可以调用对话界面的表情更新函数
+ // 更新当前表情状态
+ //ThunderBirdMainView::SwitchVideo(emotion);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情已更新: %s", emotion);
+ }
}
// 设置当前表情状态
if(screenImageAsEmoji_ == false)
{
//获取当前角色配置
+ //为默认表情
+ if(eyesColor_.empty() == true || eyesShape_.empty() == true)
+ {
+ std::string expressionPath = "/user/res/video/Default/"+ m_currentExpression + ".mp4";
+ SwitchExpressionVideo(expressionPath.c_str());
+ }
+ else
+ {
+ std::string expressionPath = "/user/userdata/leiniao/emoji/" + eyesShape_ + "/" + eyesColor_ + "/" + m_currentExpression + ".mp4";
+ //判断表情文件是否存在
+ if(access(expressionPath.c_str(), F_OK) != -1)
+ {
+ SwitchExpressionVideo(expressionPath.c_str());
+ }
+ else
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::not find expression file %s", m_currentExpression.c_str());
+ }
+ }
- std::string expressionPath = "/user/res/video/Default/" + eyesShape_ + "/" + eyesColor_ + "/" + m_currentExpression + ".mp4";
- //std::string expressionPath = "/user/res/video/Default/" + m_currentExpression + ".mp4";
- SwitchExpressionVideo(expressionPath.c_str());
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SetCurrentExpressionAndStatus: expression=%s, statusText=%s",
m_currentExpression.c_str(), m_currentStatusText.c_str());
return m_currentFps;
}
+ // 将文本加入队列
+ void ThunderBirdModel::EnqueueAudioText(const std::string& text)
+ {
+ std::lock_guard<std::mutex> lock(m_textQueueMutex);
+ m_audioTextQueue.push(text);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::EnqueueAudioText: 文本入队: %s, 队列大小: %zu",
+ text.c_str(), m_audioTextQueue.size());
+ }
+
+ // 从队列中取出文本并推送
+ void ThunderBirdModel::DequeueAndPushAudioText()
+ {
+ std::lock_guard<std::mutex> lock(m_textQueueMutex);
+
+ if (m_audioTextQueue.empty()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::DequeueAndPushAudioText: 队列为空,没有文本可推送");
+ return;
+ }
+
+ std::string text = m_audioTextQueue.front();
+ m_audioTextQueue.pop();
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::DequeueAndPushAudioText: 推送文本: %s, 剩余队列大小: %zu",
+ text.c_str(), m_audioTextQueue.size());
+
+ // 获取当前视图状态
+ int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
+ int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
+
+ // 推送到对话界面
+ if(ThunderBirdDialogueView::GetInstance() && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)
+ {
+ ThunderBirdDialogueView::GetInstance()->UpdateDialogueText(text.c_str());
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "音频开始播放,显示对话文本: %s", text.c_str());
+ }
+
+ // 推送到哄睡界面
+ if(ThunderBirdLullabyView::GetInstance() && currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4)
+ {
+ ThunderBirdLullabyView::GetInstance()->UpdateLullabyText(text.c_str());
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "音频开始播放,显示哄睡文本: %s", text.c_str());
+ }
+ }
+
+ // 检查队列中是否有文本
+ bool ThunderBirdModel::HasAudioTextInQueue()
+ {
+ std::lock_guard<std::mutex> lock(m_textQueueMutex);
+ return !m_audioTextQueue.empty();
+ }
+
+ // 清空音频文本队列
+ void ThunderBirdModel::ClearAudioTextQueue()
+ {
+ std::lock_guard<std::mutex> lock(m_textQueueMutex);
+ while (!m_audioTextQueue.empty()) {
+ m_audioTextQueue.pop();
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::ClearAudioTextQueue: 音频文本队列已清空");
+ }
+
}
\ No newline at end of file
#include "graphic_service.h"
#include "ln_api.h"
#include "power_display_service.h"
+#include "ai_media.h"
#ifdef __cplusplus
extern "C"
{
ThunderBirdModel::GetInstance()->StopCountUpTimer();
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING);
ln_ws_end_audio_chat();
+ //清空音频文本队列
+ ThunderBirdModel::GetInstance()->ClearAudioTextQueue();
} else {
// 开始录音
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
*/
void ThunderBirdPresenter::HandleFuncKeyLongPress(void)
{
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdPresenter::HandleFuncKeyLongPress - FUNC key long press detected");
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdPresenter::HandleFuncKeyLongPress - FUNC key long press detected");
// 长按FUNC键2秒的处理逻辑
// 触发对话模式切换
if (ThunderBirdMainView::GetInstance()) {
int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
- if(currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW)
+ if(currentView == THUNDERBIRD_DIALOGUEVIEW && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW)
{
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
isDialogueing = true;
ln_ws_start_audio_chat(LN_AUDIO_CHAT_VOICE_CHAT_REQUEST);//开始对话
}
- else
+ else if(currentView == THUNDERBIRD_DIALOGUEVIEW)
{
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
if(currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING)
{
ThunderBirdModel::GetInstance()->StopCountUpTimer();
}
+ // 停止实际的音频播放
+ ai_media_play_stop();
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdDialogueView::AudioPlaybackEnd: Stopped audio playback");
ln_ws_end_audio_chat();//结束对话
isDialogueing = false;
}
+ //当为故事模式
+ else if(currentView = THUNDERBIRD_LULLABYVIEW && currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdPresenter::HandleFuncKeyLongPress");
+ ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_5);
+ }
}
}