#include "font/ui_font.h"
#include "ln_api.h"
#include <unistd.h>
+#include <sys/stat.h>
#include "vibrator_service.h"
#include "ai_media.h"
#define JUHEPINGTAI 0
ThunderBirdMainView *view = ThunderBirdMainView::GetInstance();
if (view) {
std::string currentTime = GetCurrentTimeStr();
- // 检查夜间更新状态(每天凌晨2点检查)
- if(currentTime == "2:00")
- {
- // 从KV存储中读取夜间更新状态
- char temp[10] = { 0 };
- (void)UtilsGetValue("night_update_enabled", temp, 10);
- if(strcmp(temp, "1") == 0)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测到夜间更新已启用,切换到OTA slice");
- // 切换到OTA slice
- //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_WS_ENTER_SLEEP, NULL, 0);
- AI_ForceInterrupt();
- ln_ws_send_voice_chat_interrupt("切换slice");
- NativeAbility::GetInstance().ChangeSlice(VIEW_OTA);
- }
- }
view->UpdateTimeText(currentTime.c_str());
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimeDisplayCallback: %s", currentTime.c_str());
}
return false;
}
+ // 检查文件大小,确保文件不为空
+ struct stat fileStat;
+ if (stat(videoPath, &fileStat) != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: cannot get file stat: %s", videoPath);
+ return false;
+ }
+
+ if (fileStat.st_size == 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: file is empty: %s", videoPath);
+ return false;
+ }
+
// 预处理文件路径,确保realpath能够成功
std::string normalizedPath = videoPath;
// 通过图形服务调用 ThunderBirdMainView 的 SwitchVideo 函数
// 注意:PostGraphicEvent 是异步的,这里直接返回 true 表示调用已提交
- GraphicService::GetInstance()->PostGraphicEvent(
- [normalizedPath]() {
+ //GraphicService::GetInstance()->PostGraphicEvent(
+ // [normalizedPath]() {
if (ThunderBirdMainView::GetInstance()) {
ThunderBirdMainView::GetInstance()->SwitchVideo(normalizedPath.c_str());
}
- });
+ //});
return true; // 异步调用,返回 true 表示调用已提交
}
if (ThunderBirdMainView::GetInstance()) {
int currentView = ThunderBirdMainView::GetInstance()->GetCurrentView(); //获取当前视图
ln_ws_audio_deinit();//功耗优化
- ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_5);
+ //直接退出到状态显示界面
+ AI_ForceInterrupt();
+ ln_ws_send_voice_chat_interrupt("退出哄睡");
+ 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");
}
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleDownloadFile");
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Download type: %d", type);
+ //跳转到OTA下载界
+ downloadFileType = type;
if(ThunderBirdModel::GetOtaStatus() != 0)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleDownloadFile: OTA正在升级,跳过下载");
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleDownloadFile: Unknown download type: %d", type);
break;
}
- //跳转到OTA下载界
- downloadFileType = type;
//do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_WS_ENTER_SLEEP, NULL, 0);
AI_ForceInterrupt();
ln_ws_send_voice_chat_interrupt("开始下载");
if(ThunderBirdDialogueView::GetInstance() && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)
{
// 检查传入的表情是否与当前对话界面表情不同
- if (m_dialogueExpression != emotion) {
+ if (m_dialogueExpression != emotion && emotion != m_currentExpression) {
// 记录新的对话界面表情
m_dialogueExpression = emotion;
// 切换表情
+ //if(emotion == "winking")
std::string expressionPath = "/user/userdata/leiniao/emoji/" + eyesShape_ + "/" + eyesColor_ + "/" + "thinking" + ".mp4";
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情: %s", expressionPath.c_str());
//判断表情文件是否存在
}
else
{
-
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情不存在: %s", expressionPath.c_str());
}
- } else {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情未变化,跳过更新: %s", emotion);
+ }
+ else
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情未变化,跳过更新: %s", emotion);
}
}
- else
+ else//其他界面,则为时间线的状态表情变化
{
- // 不在对话界面时,记录传入的表情但不切换
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "不在对话界面,记录表情: %s", emotion);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "不在对话界面,不处理NPC表情变化");
}
+ return;
}
// 时间线状态变化处理函数
}
// 处理时间线状态变化
- // 这里可以根据description和emotion进行相应的处理
- // 例如:更新UI显示、记录状态变化等
-
- // 如果emotion不为空,可以调用表情变化处理
- if (strlen(emotion) > 0) {
- HandleNpcEmotionChange(emotion);
- }
-
- // 可以根据description进行其他处理
- // 例如:更新状态文本、记录日志等
- if (strlen(description) > 0) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "时间线状态描述: %s", description);
- // 这里可以添加更多基于description的处理逻辑
+ if(strlen(description) > 0 && strlen(emotion) > 0)
+ {
+ SetCurrentStatusText(description);
+ SetCurrentExpression(emotion);
+ SetCurrentExpressionAndStatus(); //更新当前表情和状态文本
}
}
expressionPath = "/user/res/video/Default/"+ m_currentExpression + ".mp4";
SwitchExpressionVideo(expressionPath.c_str());
}
- else
+ else//非默认表情
{
if(m_currentExpression == "CloseEyes")//如果为眨眼表情,则在默认文件目录里面
{
return m_currentStatusText;
}
+ //获取下载文件类型
int ThunderBirdModel::GetDownloadFile()
{
return downloadFileType;
}
+ //清空下载文件类型
+ void ThunderBirdModel::ClearDownloadFile()
+ {
+ downloadFileType = -1;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::ClearDownloadFile: 下载文件类型已清空");
+ }
+
//减低视频帧率 开启对话调用开启
void ThunderBirdModel::LowFrequence()
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::ClearAudioTextQueue: 音频文本队列已清空");
}
+ //夜间更新处理
+ void ThunderBirdModel::HandleNightUpdate()
+ {
+ // 从KV存储中读取夜间更新状态
+ char temp[10] = { 0 };
+ (void)UtilsGetValue("night_update_enabled", temp, 10);
+ if(strcmp(temp, "1") == 0)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测到夜间更新已启用,切换到OTA slice");
+ AI_ForceInterrupt();
+ ln_ws_send_voice_chat_interrupt("切换slice");
+ NativeAbility::GetInstance().ChangeSlice(VIEW_OTA);
+ }
+ }
}
\ No newline at end of file