增加断网自动重连操作
authorxue <2144439972@qq.com>
Thu, 18 Dec 2025 10:05:59 +0000 (18:05 +0800)
committerxue <2144439972@qq.com>
Thu, 18 Dec 2025 10:05:59 +0000 (18:05 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdAdjustView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdDialogueView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp
code/sdk/zhihui/utils/custom_cmd_service.c
code/sdk/zhihui/utils/custom_utils.h

index e66853c..334d674 100644 (file)
@@ -311,6 +311,7 @@ namespace OHOS
         void RegisterAllKeyEvents(void);
 
         bool init_falg = false;
+        bool m_otaCheckDone = false;  // OTA检查是否已完成,确保只执行一次
         
         // 睡眠模式激活标志位
         bool g_sleep_mode_active = false;
@@ -371,6 +372,9 @@ namespace OHOS
         int m_networkType;             // 网络类型
         bool m_hasNetwork;             // 网络连接标志位
         bool m_networkStatusChanged;   // 网络状态变化标志位
+        bool m_cat1RestartInProgress;  // Cat1重启进行中标志位,避免重复触发
+        time_t m_bootTime;             // 开机时间戳(用于判断是否已开机30秒)
+        time_t m_lastCat1RestartTime;  // 上次Cat1重启时间戳(用于防抖,避免短时间内重复重启)
 
         bool is_all_services_ready = false;
         bool bind_status = false;
index de9647d..3391119 100644 (file)
@@ -4,6 +4,13 @@
 #include "common/image_cache_manager.h"
 #include "custom_utils.h"
 #include "vibrator_service.h"
+#include "ln_api.h"
+#include "graphic_service.h"
+#include "cat1_pub_api.h"
+#ifdef SUPPORT_CAT1_SERVICE
+#include "cat1_server.h"
+#endif
+
 
 
 namespace OHOS
@@ -235,6 +242,15 @@ namespace OHOS
                 TextLabel->SetVisible(true);
             } 
             if (netAnimator) { netAnimator->SetVisible(true); netAnimator->Start(); }
+
+            // 启动6秒定时器,超时后自动跳转到状态界面
+            ThunderBirdModel::GetInstance()->StartCountUpTimer(6);
+
+            // 通过命令服务线程执行Cat1重启,避免阻塞UI线程
+            do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_CAT1_RESTART, NULL, 0);
+            cat1_gettime();        
+            // 执行VAD认证
+            do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_VAD_AUTH, NULL, 0);
             break;
         }
         default:
index a9ce8e1..87b3cba 100644 (file)
@@ -220,6 +220,7 @@ namespace OHOS
         case THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW:
         {
             ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);
+            ThunderBirdModel::GetInstance()->HighFrequence();//恢复视频帧率
             // uapi_set_sleep_mode_active(false);//睡眠模式激活标志位
             //如果仍在对话,取消对话
             if(ThunderBirdPresenter::GetInstance()->isDialogueing)
@@ -228,7 +229,6 @@ namespace OHOS
                 ln_ws_send_voice_chat_interrupt("退出对话");
                 do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
                 ln_ws_end_audio_chat();//结束对话
-                ThunderBirdModel::GetInstance()->HighFrequence();
                 ThunderBirdModel::GetInstance()->OnExitDialogueMode();
                 ThunderBirdPresenter::GetInstance()->SetDialogueing(false);
             }
index 14500f5..a583be8 100644 (file)
@@ -21,6 +21,7 @@
  #include "thunderbird/include/ThunderBirdMainView.h"
  #include "thunderbird/include/ThunderBirdBlueView.h"
  #include "thunderbird/include/ThunderBirdPresenter.h"
+ #include "thunderbird/include/ThunderBirdAdjustView.h"
  #include "bluetooth/BluetoothModel.h"
  #include "wearable_log.h"
  #include <sys/time.h>
@@ -119,6 +120,9 @@ extern "C" {
                                            m_simStatus(0), m_cat1PowerStatus(0), m_signalStrength(0),
                                           m_networkStatus(0), m_networkType(0),
                                           m_hasNetwork(false), m_networkStatusChanged(false),
+                                          m_cat1RestartInProgress(false),
+                                          m_bootTime(0),
+                                          m_lastCat1RestartTime(0),
                                           m_storyModeTimeoutTimer(nullptr)
      {
         // 初始化时加载提醒数据
@@ -133,6 +137,9 @@ extern "C" {
          }
          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "目前绑定状态 %s", temp);
 
+         // 记录开机时间
+         time(&m_bootTime);
+
          uapi_setScreenDuration(30000);//自动息屏30秒
          Readlocalconfig();
 
@@ -1706,60 +1713,37 @@ extern "C" {
         {
             if(get_is_ln_get_device_network_success())
             {
+                //如果ws连接上了但还是没网
+                if (m_networkType == 0 && !m_cat1RestartInProgress)
+                {
+                    //    如果无网络,跳转到网络连接中界面
+                    ThunderBirdMainView *mainView = ThunderBirdMainView::GetInstance();
+                    if (mainView != nullptr)
+                    {
+                        int16_t currentView = mainView->GetCurrentView();
+                        mainView->ChangeView(currentView, THUNDERBIRD_ADJUSTVIEW, ThunderBirdAdjustView::THUNDERBIRD_ADJUSTVIEW_NETWORK_CONNECTING);
+                    }
+                    m_cat1RestartInProgress = true;
+                    return;
+                }
                 if (init_falg == false) 
                 {
-                    //发送获取绑定用户ID
+                    //发送获取绑定用户ID,异步执行,避免阻塞UI线程
+                    GraphicService::GetInstance()->PostGraphicEvent([]() {
                     do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_GET_USER_ID, NULL, 0);
+                    });
                     cat1_gettime();
                     if( ThunderBirdGuideView::GetInstance() != nullptr)
                     {
                         ThunderBirdGuideView::GetInstance()->OnWsConnected();
                     }
-                    // 网络连接成功,调用HTTP服务获取设备Token
-                    // 获取一下OTA 是否有最新版本
-
-                    // 需要是绑定状态才更新
-                    // if(bind_status == true)
-                    // {
-                    // OTA检查异步执行,避免阻塞状态回调(特别是在连网状态下,HTTP请求会阻塞)
-                    // 直接发送命令到后台线程执行,结果通过 push_ota_status 回调通知
                     do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_IS_CAT1_OTA_UPGRADE, NULL, 0);
-                    // }
-                    // }   
-                    //未绑定状态,联网隐藏网络断开提醒
-                    // if(bind_status == false)
-                    // {
-                    //     ThunderBirdMainView *view = ThunderBirdMainView::GetInstance();
-                    //     if (view) {
-                    //         int16_t currentView = view->GetCurrentView();
-                    //         int16_t currentSubView = view->GetCurrentSubView();
-                            
-                    //         // 检查是否在对话界面
-                    //         if (currentView == THUNDERBIRD_DIALOGUEVIEW && (currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING || currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)) {
-                    //             // 检查是否是在对话模式进入时因为WebSocket未连接而显示的提醒
-                    //             do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_INIT, NULL, 0);
-                    //             ThunderBirdPresenter *presenter = ThunderBirdPresenter::GetInstance();
-                    //             if (presenter && presenter->isDialogueing) {
-                    //                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[定时器] WebSocket连接成功,隐藏网络断开提醒,进入对话模式");
-                    //                 // 隐藏提醒界面
-                    //                 if(ThunderBirdReminderView::GetInstance())
-                    //                 {
-                    //                     ThunderBirdReminderView::GetInstance()->HideAll();
-                    //                 }
-                    //                 // 如果在对话界面,初始化音频
-                    //                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[定时器] WebSocket连接成功,在对话界面,初始化音频");  
-                    //             }
-                    //         }
-                    //     }
-                    // }
 
                     #if JUHEPINGTAI
                     uapi_init_all_websocket_servers();
                     uapi_start_all_websocket_servers(0); // 连接服务器
                     #endif
 
-
-
                     //上报一次耳机状态
                     if(ln_bt_report_earphone_connection_status() != 0)
                     {
@@ -1828,6 +1812,15 @@ extern "C" {
                         ThunderBirdModel::GetInstance()->OnExitDialogueMode();
                     }
                      
+                    // 检查是否是网络连接中界面,6秒后自动跳转到状态界面
+                    else if (currentView == THUNDERBIRD_ADJUSTVIEW && 
+                             currentSubView == ThunderBirdAdjustView::THUNDERBIRD_ADJUSTVIEW_NETWORK_CONNECTING) {
+                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "网络连接中界面6秒定时器到时,自动跳转到状态界面");
+                        // 重置Cat1重启标志位
+                        m_cat1RestartInProgress = false;
+                        // 跳转到对话状态界面
+                        view->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
+                    }
                     // 检查是否是绑定成功界面,需要跳转到对话界面
                     else if (currentView == THUNDERBIRD_ADJUSTVIEW && 
                              currentSubView == ThunderBirdAdjustView::THUNDERBIRD_ADJUSTVIEW_BIND_SUCCESS) {
@@ -2122,7 +2115,7 @@ extern "C" {
         m_cat1PowerStatus = uapi_dev_runtime_get_cat1_powerstat();   // CAT1电源状态
         m_signalStrength = cat1_api_runtime_get_cat1_signal_bars();       // 信号强度 (旧接口,保留兼容性)
         m_networkStatus = uapi_dev_runtime_get_cat1_networkstat();   // 网络连接状态
-        // m_networkType = uapi_dev_runtime_get_cat1_networtype();      // 网络类型
+        m_networkType = cat1_api_runtime_get_cat1_networktype();      // 网络类型
         
         // 更新网络连接标志位:m_networkStatus == 1表示有网络连接
         m_hasNetwork = (m_networkStatus == 1);
@@ -2228,11 +2221,12 @@ extern "C" {
                 int currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
                 int currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
                 
-                // 如果当前在对话界面,需要先打断语音并退出对话模式
+                
+                // 如果当前在对话界面,需要先打断语音并退出对话模式,然后跳转到发呆中界面
                 if (currentView == THUNDERBIRD_DIALOGUEVIEW && 
                     (currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING ||
                      currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING)) {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleScheduleReminder: 在对话界面,先打断语音并退出对话模式");
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleScheduleReminder: 在对话界面,先打断语音并退出对话模式,跳转到发呆中界面");
                     // 打断语音播放
                     AI_ForceInterrupt();
                     ln_ws_send_voice_chat_interrupt("日程提醒");
@@ -2242,17 +2236,14 @@ extern "C" {
                     ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); // 关闭屏幕常亮
                     ThunderBirdModel::GetInstance()->HighFrequence();//恢复视频帧率
                     ThunderBirdModel::GetInstance()->OnExitDialogueMode();
-                    // 退出到状态界面
-                    // ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
                     ThunderBirdDialogueView::GetInstance()->DialogueFirst = true;
-                    // 更新当前视图和子视图
-                    // currentView = THUNDERBIRD_DIALOGUEVIEW;
-                    // currentSubView = ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW;
+                    // 退出到发呆中界面(状态界面)
+                    ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_REMINDERVIEW, ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER);
                 }
-                // 如果当前在哄睡界面,需要先打断语音并退出哄睡模式
+                // 如果当前在故事界面,需要先打断语音并退出故事模式,然后跳转到发呆中界面
                 else if (currentView == THUNDERBIRD_LULLABYVIEW && 
                          currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4) {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleScheduleReminder: 在哄睡界面,先打断语音并退出哄睡模式");
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleScheduleReminder: 在故事界面,先打断语音并退出故事模式,跳转到发呆中界面");
                     // 打断语音播放
                     AI_ForceInterrupt();
                     ln_ws_send_voice_chat_interrupt("日程提醒");
@@ -2269,11 +2260,8 @@ extern "C" {
                     } else {
                         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "启用VAD失败: %d", vad_ret);
                     }
-                    // 退出到对话状态界面
-                    // ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
-                    // 更新当前视图和子视图
-                    // currentView = THUNDERBIRD_DIALOGUEVIEW;
-                    // currentSubView = ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW;
+                    // 退出到发呆中界面(状态界面)
+                    ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_REMINDERVIEW, ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER);
                 }
                 
                 // 蓝牙界面(搜索/连接过程)强制停止、上报,并跳转提醒
@@ -2287,8 +2275,9 @@ extern "C" {
                         ThunderBirdReminderView::GetInstance()->IsIcon(false);
                     }
                 }
-                //如果当前界面是事项提醒界面,则不进行切换,防止返回原任务进入循环
-                else if(currentView != THUNDERBIRD_REMINDERVIEW && currentSubView != ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER)
+                // 如果已经从对话界面或故事界面退出到状态界面,则不立即跳转到提醒界面,等待下载和播放完成
+                // 下载和播放会在 ln_parse_schedule_reminder 中异步进行
+                else if (currentView != THUNDERBIRD_REMINDERVIEW && currentSubView != ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER)
                 {
                     ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_REMINDERVIEW, ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER);
                     ThunderBirdReminderView::GetInstance()->IsIcon(false);               
index b88c38e..9857e8e 100644 (file)
 
 #include "custom_utils.h"
 
+#ifdef SUPPORT_CAT1_SERVICE
+#include "cat1_pub_api.h"
+#endif
+
 #ifdef SUPPORT_AI_SERVICE
 #include "asr_websocket_server.h"
 #endif
@@ -412,6 +416,21 @@ static void custom_cmd_service_check_task(void const *arg)
             uapi_check_mic(0);
             break;
 
+        case CUSTOM_CMD_MSG_TYPE_CAT1_RESTART:
+#ifdef SUPPORT_CAT1_SERVICE
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Executing Cat1 restart: AT^CAT1POWER=0, AT^CAT1POWER=1");
+            // 执行AT^CAT1POWER=0(关闭Cat1)
+            cat1_api_enable_cat1(false);
+            // 等待一小段时间确保关闭完成
+            LOS_Msleep(500);
+            // 执行AT^CAT1POWER=1(开启Cat1)
+            cat1_api_enable_cat1(true);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cat1 restart completed");
+#else
+            PRINT("Cat1 service not supported\n");
+#endif
+            break;
+
 case CUSTOM_CMD_MSG_START_AI_ASR:
 #ifdef SUPPORT_AI_SERVICE
             uapi_start_AI_asr_();
index cc50d32..5fbec6b 100644 (file)
@@ -266,6 +266,7 @@ uint32_t uapi_calendar_store_date(void);
 
 #define CUSTOM_CMD_MSG_STOP_SECOND_STREAM_IN 0x2C
 
+#define CUSTOM_CMD_MSG_TYPE_CAT1_RESTART 0x2D
 
 typedef enum {
     BR_HFP_CONNECT=1,