}
void ThunderBirdMainView::OnStart()//开机操作
{
- // 创建复杂操作线程(栈大小0x1000 = 4096字节)
- if (g_complex_operation_taskcfg.task_handle == nullptr)
- {
- g_complex_operation_taskcfg.create_queue_handle = create_complex_operation_queue;
- g_complex_operation_taskcfg.attr.name = "complex_operation_task";
- g_complex_operation_taskcfg.attr.priority = osPriorityNormal;
- g_complex_operation_taskcfg.attr.stack_size = 0x1000; // 4096字节
- g_complex_operation_taskcfg.func = complex_operation_task;
- g_complex_operation_taskcfg.use_mem = USE_EXTEND_MEM;
+ // // 创建复杂操作线程(栈大小0x1000 = 4096字节)
+ // if (g_complex_operation_taskcfg.task_handle == nullptr)
+ // {
+ // g_complex_operation_taskcfg.create_queue_handle = create_complex_operation_queue;
+ // g_complex_operation_taskcfg.attr.name = "complex_operation_task";
+ // g_complex_operation_taskcfg.attr.priority = osPriorityNormal;
+ // g_complex_operation_taskcfg.attr.stack_size = 0x1000; // 4096字节
+ // g_complex_operation_taskcfg.func = complex_operation_task;
+ // g_complex_operation_taskcfg.use_mem = USE_EXTEND_MEM;
- errcode_t ret = uapi_create_osThread_custom(&g_complex_operation_taskcfg);
- if (ret != ERRCODE_SUCC)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::OnStart: Failed to create complex operation thread, ret=%d", ret);
- }
- else
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::OnStart: Complex operation thread created successfully");
- }
- }
+ // errcode_t ret = uapi_create_osThread_custom(&g_complex_operation_taskcfg);
+ // if (ret != ERRCODE_SUCC)
+ // {
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::OnStart: Failed to create complex operation thread, ret=%d", ret);
+ // }
+ // else
+ // {
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::OnStart: Complex operation thread created successfully");
+ // }
+ // }
//下载文件被打断的恢复操作
if(ThunderBirdModel::GetInstance()->GetDownloadFile() != -1)
return -1;
}
- // 清空输出缓冲区
- memset(output_str, 0, strlen(output_str) > 0 ? strlen(output_str) : 16);
+ // 清空输出缓冲区(使用固定大小16字节,避免在未初始化缓冲区上使用strlen)
+ memset(output_str, 0, 16);
// 1. 提取字符串最后4位
char suffix_4[5] = {0}; // 存储最后4位(+1存结束符)
{
view->ChangeView(currentView, THUNDERBIRD_GUIDEVIEW, ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_5);
}
- ThunderBirdDialogueView::GetInstance()->DialogueFirst = true;
// 先设置退出标志,防止录音结束回调误判为正常录音结束
ThunderBirdPresenter::GetInstance()->SetDialogueing(false);
ln_ws_end_audio_chat();//结束对话
/**
* @brief 设置当前设备状态
*/
- void ThunderBirdModel::SetCurrentStatus(DeviceStatus status)
+ void ThunderBirdModel::SetCurrentStatus(DeviceStatus status)
{
if (m_currentStatus != status) {
DeviceStatus oldStatus = m_currentStatus;
m_currentStatus = status;
- m_statusChangeTime = uapi_get_timestampe_ss(nullptr) ? 0 : uapi_get_timestampe_ss(nullptr);
+ // 正确获取时间戳
+ uint32_t timestamp = 0;
+ if (uapi_get_timestampe_ss(×tamp) == ERRCODE_SUCC) {
+ m_statusChangeTime = timestamp;
+ } else {
+ m_statusChangeTime = 0;
+ }
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Status changed: %d -> %d",
static_cast<int>(oldStatus), static_cast<int>(status));
void ThunderBirdModel::UpdateDeviceStatus()
{
uint32_t currentTime = 0;
- uapi_get_timestampe_ss(¤tTime);
+ uapi_get_timestampe_ss(¤tTime);
m_lastStatusCheckTime = currentTime;
// 根据当前状态进行状态检查和转换
// 检查IMEI有效性
m_imeiValid = IsDeviceIdValid();
-
- return m_imeiValid;
- WEARABLE_LOGD("IMEI status checked: valid=%d", m_imeiValid);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "IMEI status checked: valid=%d", m_imeiValid);
+ return m_imeiValid;
}
// ==================== 网络状态管理函数实现 ====================
do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
ThunderBirdPresenter::GetInstance()->SetDialogueing(false);
ThunderBirdModel::GetInstance()->OnExitDialogueMode();
- ThunderBirdDialogueView::GetInstance()->DialogueFirst = true;
// 退出到发呆中界面(状态界面)
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_REMINDERVIEW, ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER);
}
// ChangeView 中会自动处理对话/哄睡界面的退出逻辑
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_BLUEVIEW, ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_ENTER);
//不管跳到什么界面都要先停止视频
- ThunderBirdMainView::GetInstance()->videoPlay_->PauseVideoPlay();
+ auto* mainView = ThunderBirdMainView::GetInstance();
+ if (mainView && mainView->videoPlay_) {
+ mainView->videoPlay_->PauseVideoPlay();
+ }
}
}
m_dialogueModeFinished = false;
// 停止动效
ThunderBirdDialogueView::GetInstance()->AudioPlaybackEnd();
- ThunderBirdDialogueView::GetInstance()->IsNormalEnd = true;
+ // ThunderBirdDialogueView::GetInstance()->IsNormalEnd = true;
//可以开始说话了,显示小绿点
if (ThunderBirdMainView::GetInstance() && ThunderBirdMainView::GetInstance()->listenIcon) {
ThunderBirdMainView::GetInstance()->listenIcon->SetVisible(true);
// 录音开始处理函数
void ThunderBirdModel::HandleAudioRecordingStart()
{
- // 检查 WebSocket 连接状态,如果正在重连,等待重连完成
- int wsState = ln_ws_get_connection_state();
- bool wsConnected = (wsState == 2); // WS_STATE_CONNECTED = 2
-
- if (!wsConnected) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleDialogueFunction: WebSocket未连接(状态=%d),等待连接完成", wsState);
- // WebSocket 未连接,不执行操作,避免状态混乱
- return;
- }
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioRecordingStart: 录音开始");
- if(ThunderBirdDialogueView::GetInstance()->IsNormalEnd == false)
- {
- //重连
- // ln_ws_send_voice_chat_interrupt("重连对话");
- }
// 取消退出对话的定时器(用户开始录音,说明要继续对话)
StopCountUpTimer();
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioRecordingStart: 取消退出对话定时器");
int16_t currentView = view->GetCurrentView();
int16_t currentSubView = view->GetCurrentSubView();
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioRecordingStart: currentView=%d, currentSubView=%d", currentView, currentSubView);
- // 如果当前在哄睡界面(包括故事选择界面和故事模式),则不进行处理
- // THUNDERBIRD_LULLABYVIEW_3: 故事选择界面(VAD已关闭)
- // THUNDERBIRD_LULLABYVIEW_4: 故事模式(VAD已关闭)
if(currentView == THUNDERBIRD_LULLABYVIEW &&
currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_3)
{
// isLullabyRecording = true;
- ThunderBirdLullabyView::GetInstance()->listenAnimator->Start();
+ auto* lullabyView = ThunderBirdLullabyView::GetInstance();
+ if (lullabyView && lullabyView->listenAnimator) {
+ lullabyView->listenAnimator->Start();
+ }
// ThunderBirdDialogueView::GetInstance()->listenIcon->SetVisible(true);
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioRecordingStart: 在哄睡界面(故事模式),忽略录音开始事件");
return;
}
if ((currentView == THUNDERBIRD_DIALOGUEVIEW &&
- currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)
- || ThunderBirdDialogueView::GetInstance()->DialogueFirst == false) {
+ currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING) ) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "录音开始,跳转到聆听状态");
view->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
- ThunderBirdDialogueView::GetInstance()->IsNormalEnd = false;
- // ThunderBirdDialogueView::GetInstance()->UpdateDialogueText("超认真聆听中");
+ // ThunderBirdDialogueView::GetInstance()->IsNormalEnd = false;
}
// 如果当前在哄睡界面,且不在故事选择状态,则跳转到故事选择状态
else {
// 录音结束处理函数
void ThunderBirdModel::HandleAudioRecordingEnd()
{
- // return ;//需要vad的时候在处理
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioRecordingEnd: 录音结束");
- // 检查 WebSocket 连接状态,如果正在重连,等待重连完成
- int wsState = ln_ws_get_connection_state();
- bool wsConnected = (wsState == 2); // WS_STATE_CONNECTED = 2
-
- if (!wsConnected) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleDialogueFunction: WebSocket未连接(状态=%d),等待连接完成", wsState);
- // WebSocket 未连接,不执行操作,避免状态混乱
- return;
- }
// 检查是否正在退出对话模式,如果是则不应该跳转到播放界面
ThunderBirdPresenter* presenter = ThunderBirdPresenter::GetInstance();
if (presenter != nullptr && !presenter->isDialogueing) {
}
else if (currentView == THUNDERBIRD_LULLABYVIEW &&
currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_3 ) {
- ThunderBirdLullabyView::GetInstance()->listenAnimator->Stop();
+ auto* lullabyView = ThunderBirdLullabyView::GetInstance();
+ if (lullabyView && lullabyView->listenAnimator) {
+ lullabyView->listenAnimator->Stop();
+ }
if (ThunderBirdMainView::GetInstance() && ThunderBirdMainView::GetInstance()->listenIcon) {
ThunderBirdMainView::GetInstance()->listenIcon->SetVisible(false);
}
// 设置标志位,表示在对话模式中
m_needGetTimelineExpression = true;
+ #ifdef SUPPORT_CAT1_SERVICE
+ // 进入对话模式时停止AT+CESQ命令,不获取4G信号
+ // cat_sync_timer_control(0);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnEnterDialogueMode: 停止cat1_getsignal和CESQ获取");
+ #endif
+
// 如果ReadlocalScreenImage() == 1(有屏保但不是作为对话表情),先关闭屏保
int screenImageMode = ReadlocalScreenImage();
if (screenImageMode == 1) {
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnExitDialogueMode: 开始退出对话模式");
+ #ifdef SUPPORT_CAT1_SERVICE
+ // 退出对话模式时恢复AT+CESQ命令,恢复获取4G信号
+ // cat_sync_timer_control(1);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnExitDialogueMode: 恢复cat1_getsignal和CESQ获取");
+ #endif
+
// 隐藏小绿点
ThunderBirdMainView* mainView = ThunderBirdMainView::GetInstance();
if (mainView != nullptr && mainView->listenIcon != nullptr) {
ln_ws_end_audio_chat();
//清空音频文本队列
ThunderBirdModel::GetInstance()->ClearAudioTextQueue();
+ //隐藏小绿点
+ auto* mainView = ThunderBirdMainView::GetInstance();
+ if (mainView && mainView->listenIcon) {
+ mainView->listenIcon->SetVisible(false);
+ }
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING);
} else if(currentView == THUNDERBIRD_DIALOGUEVIEW && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING) {
// 检查 WebSocket 连接状态,如果正在重连,等待重连完成
// WebSocket 未连接,不执行操作,避免状态混乱
return;
}
- ThunderBirdMainView::ComplexOperationThread(true);
- ThunderBirdDialogueView::GetInstance()->IsReconnect = true;
+ // 通过异步线程执行复杂操作,避免阻塞UI线程和栈溢出
+ #if 0
+ // ThunderBirdMainView::ComplexOperationThread(true);
+ #else
+ AI_ForceInterrupt();
+ int endRet = ln_ws_end_audio_chat();
+ // 只有在成功结束音频聊天时才发送打断请求(确保chat_id有效)
+ if (endRet == 0) {
+ ln_ws_send_voice_chat_interrupt("新对话开始");
+ } else {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "HandleDialogueFunction: ln_ws_end_audio_chat failed (ret=%d), skip sending interrupt", endRet);
+ }
+ #endif // 0
+ auto* dialogueView = ThunderBirdDialogueView::GetInstance();
+ if (dialogueView) {
+ dialogueView->IsReconnect = true;
+ }
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始录音,跳转到聆听状态");
+ //显示小绿点
+ auto* mainView = ThunderBirdMainView::GetInstance();
+ if (mainView && mainView->listenIcon) {
+ mainView->listenIcon->SetVisible(true);
+ }
// 开始录音
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
// ln_ws_start_audio_chat(LN_AUDIO_CHAT_VOICE_CHAT_REQUEST);
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始录音");
// ThunderBirdModel::GetInstance()->StartRecording();
isLullabyRecording = true;
- ThunderBirdLullabyView::GetInstance()->listenAnimator->Start();
+ auto* lullabyView = ThunderBirdLullabyView::GetInstance();
+ if (lullabyView && lullabyView->listenAnimator) {
+ lullabyView->listenAnimator->Start();
+ }
int ret = ln_ws_start_audio_chat(LN_AUDIO_CHAT_CHOOSE_STORY_REQUEST);
if (ret != 0) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleLullabyFunction: 启动音频聊天失败 (ret=%d),重置标志位", ret);
isLullabyRecording = false;
- ThunderBirdLullabyView::GetInstance()->listenAnimator->Stop();
+ if (lullabyView && lullabyView->listenAnimator) {
+ lullabyView->listenAnimator->Stop();
+ }
}
return;
}
// 停止录音并发送
// ThunderBirdModel::GetInstance()->StopRecording();
int ret = ln_ws_end_audio_chat();
+ auto* lullabyView2 = ThunderBirdLullabyView::GetInstance();
if (ret != 0) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleLullabyFunction: 结束音频聊天失败 (ret=%d),可能没有活动的音频聊天", ret);
// 即使失败也重置标志位,避免状态不一致
isLullabyRecording = false;
- ThunderBirdLullabyView::GetInstance()->listenAnimator->Stop();
+ if (lullabyView2 && lullabyView2->listenAnimator) {
+ lullabyView2->listenAnimator->Stop();
+ }
} else {
isLullabyRecording = false;
- ThunderBirdLullabyView::GetInstance()->listenAnimator->Stop();
+ if (lullabyView2 && lullabyView2->listenAnimator) {
+ lullabyView2->listenAnimator->Stop();
+ }
}
//跳转到故事界面
// 进入哄睡模式时切换为眨眼表情
if(networkCount > 2)
{
//关闭动画
- ThunderBirdGuideView::GetInstance()->bandAnimator->Stop();
+ auto* guideView = ThunderBirdGuideView::GetInstance();
+ if (guideView && guideView->bandAnimator) {
+ guideView->bandAnimator->Stop();
+ }
//重新连接网络
do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_CAT1_RESTART, NULL, 0);
// 设置标志位:网络未连接
return true; // 不满足条件,不进入对话模式
}
+ //降低帧率
+ ThunderBirdModel::GetInstance()->LowFrequence();
+ //常亮屏
+ ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);
ThunderBirdMainView::GetInstance()->ChangeView(THUNDERBIRD_GUIDEVIEW, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
isDialogueing = true;
//开启小绿点
}
// 音频已初始化,直接跳转界面
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
- if(ThunderBirdDialogueView::GetInstance()->DialogueFirst == true)
- {
- ThunderBirdDialogueView::GetInstance()->dialogue_first();
- }
if(currentView == THUNDERBIRD_GUIDEVIEW)
{
ThunderBirdDialogueView::GetInstance()->Isband(false);
ThunderBirdDialogueView::GetInstance()->Isband(true);
}
isDialogueing = true;
- ThunderBirdModel::GetInstance()->LowFrequence();//减低视频帧率
ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);
// 进入对话模式时记录当前表情
ThunderBirdModel::GetInstance()->OnEnterDialogueMode();
#endif
// 先停止定时器,避免在退出过程中继续触发
- if(currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING)
- {
- ThunderBirdModel::GetInstance()->StopCountUpTimer();
- }
+ ThunderBirdModel::GetInstance()->StopCountUpTimer();
+
ln_ws_end_audio_chat();//结束对话
// 停止实际的音频播放
// ai_media_play_stop();
- ThunderBirdDialogueView::GetInstance()->DialogueFirst = true;
// 退出对话模式时恢复表情
AI_ForceInterrupt();
ln_ws_send_voice_chat_interrupt("退出对话");