From e3dfeb98c12b7b4dc74cce3a1a22ff05aade4952 Mon Sep 17 00:00:00 2001 From: xue <2144439972@qq.com> Date: Wed, 29 Apr 2026 16:14:22 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=964G=E6=A8=A1=E7=BB=84=E5=8D=87?= =?utf8?q?=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeapp/nativeui/ota/src/OtaModel.cpp | 7 ++ .../ln/nativeapp/nativeui/ota/src/OtaView.cpp | 7 +- .../thunderbird/include/ThunderBirdModel.h | 8 ++ .../thunderbird/src/ThunderBirdMainView.cpp | 13 ++- .../thunderbird/src/ThunderBirdModel.cpp | 94 ++++++++++++++++++- 5 files changed, 123 insertions(+), 6 deletions(-) diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/ota/src/OtaModel.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/ota/src/OtaModel.cpp index dec09246a..f146a37ca 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/ota/src/OtaModel.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/ota/src/OtaModel.cpp @@ -310,6 +310,13 @@ namespace OHOS } SetOtaStatus(OTA_UI_STATUS_NOT_START); ThunderBirdModel::GetInstance()->ResetOtaStatus(); +#ifdef SUPPORT_CAT1_SERVICE + if (status == 4) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "CheckOtaResult: Cat1 success, re-query IS_CAT1 OTA task"); + do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_IS_CAT1_OTA_UPGRADE, NULL, 0); + } +#endif return; } diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/ota/src/OtaView.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/ota/src/OtaView.cpp index fd523e5eb..3a95f3d71 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/ota/src/OtaView.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/ota/src/OtaView.cpp @@ -103,7 +103,12 @@ namespace OHOS else if(m_otaStatus == OTA_UI_STATUS_FORCE_START || m_otaStatus == OTA_UI_STATUS_CAT1_START)//强制升级 { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "强制升级"); - ChangeView(MAX_OTA_VIEW, OTA_VIEW_UPDATE_NOW); + if (m_otaStatus == OTA_UI_STATUS_CAT1_START && + ThunderBirdModel::GetInstance()->IsBootCat1OtaFromVer47()) { + ChangeView(MAX_OTA_VIEW, OTA_VIEW_UPDATING); + } else { + ChangeView(MAX_OTA_VIEW, OTA_VIEW_UPDATE_NOW); + } } else //下载界面,需要根据文件下载类型判断 { diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h index d1c526b0c..ef9a9096d 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h @@ -86,6 +86,9 @@ namespace OHOS // 开机操作函数 int StartBootOperation(); int ota_update_boot(); + /** 软件版本 1.0.47:直接进入 Cat1 模组升级中界面,联网后再拉包并升级 */ + void TryEnterBootCat1OtaSliceIfNeeded(); + bool IsBootCat1OtaFromVer47() const { return m_bootCat1OtaFromVer47; } // 恢复出厂设置相关函数 bool restore_factory_settings(); // OTA升级进度 @@ -510,6 +513,11 @@ namespace OHOS bool m_stressTestDialogueActive = false; // 是否处于压测对话模式 time_t m_stressTestStartTime = 0; // 压测开始时间戳 + /** 开机软件 1.0.47:先进「模组升级中」,联网后再 IS_CAT1 与 Cat1OtaUpgrade */ + bool m_bootCat1OtaFromVer47 = false; + bool m_bootCat1OtaAwaitNetwork = false; + bool m_bootCat1OtaUrlsPending = false; + }; } diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp index ecf9c2466..8fca11b0d 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp @@ -260,7 +260,13 @@ namespace OHOS g_pThunderBirdMainView = nullptr; //ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); // 关闭屏幕常亮 ThunderBirdModel::GetInstance()->StopTimeDisplayTimer(); - ThunderBirdModel::GetInstance()->StopStatusTimer(); + /* 软件 1.0.47 开机直进 OTA:slice 切换会析构主页,需暂时保留状态定时器以联网、IS_CAT1、轮询 URL;真正开始 Cat1 时在 Cat1OtaUpgrade() 里 StopStatusTimer */ + if (!ThunderBirdModel::GetInstance()->IsBootCat1OtaFromVer47()) { + ThunderBirdModel::GetInstance()->StopStatusTimer(); + } else { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "ThunderBirdMainView::~ThunderBirdMainView: keep status timer for boot Cat1 (sw1.0.47)"); + } } ThunderBirdMainView *ThunderBirdMainView::GetInstance() @@ -483,6 +489,11 @@ namespace OHOS { ThunderBirdModel::GetInstance()->HandleDownloadFile(ThunderBirdModel::GetInstance()->GetDownloadFile()); } +#ifdef SUPPORT_CAT1_SERVICE + else { + ThunderBirdModel::GetInstance()->TryEnterBootCat1OtaSliceIfNeeded(); + } +#endif WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::OnStart"); 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 0261aa81a..15f67ba2e 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 @@ -15,6 +15,7 @@ */ #include "thunderbird/include/ThunderBirdModel.h" + #include "ota/include/OtaModel.h" #include "thunderbird/include/ThunderBirdReminderView.h" #include "thunderbird/include/ThunderBirdLullabyView.h" #include "thunderbird/include/ThunderBirdDialogueView.h" @@ -54,6 +55,8 @@ #include "ai_media.h" #include "ConfigModelC.h" #include "ConfigModel.h" +#include "build_version.h" +#include #include "cmsis_os2.h" #include "los_task.h" #include "custom_runtime.h" @@ -88,6 +91,36 @@ extern "C" { #define LOW_FREQUENCE 18 //最高视频帧率 #define HIGH_FREQUENCE 30 + +namespace { + +/** 当前手表软件版本是否为 1.0.47(与 OTA 侧 ln_ota_target_is_1047 语义一致) */ +static bool IsSoftwareVersion_1_0_47(void) +{ + uint8_t major = 0; + uint8_t mid = 0; + uint8_t minor = 0; + if (uapi_get_fw_version(&major, &mid, &minor) == ERRCODE_SUCC && major == 1 && mid == 0 && minor == 47) { + return true; + } + const char *v = get_version_string(); + if (v == nullptr || v[0] == '\0') { + return false; + } + if (strcmp(v, "1.0.47") == 0 || strcmp(v, "V1.0.47") == 0) { + return true; + } + if (strncmp(v, "1.0.47", 6) == 0 && (v[6] == '\0' || v[6] == '_')) { + return true; + } + if (strncmp(v, "V1.0.47", 7) == 0 && (v[7] == '\0' || v[7] == '_')) { + return true; + } + return false; +} + +} // namespace + namespace OHOS { enum OTA_STATUS @@ -768,6 +801,26 @@ extern "C" { return -1; } + void ThunderBirdModel::TryEnterBootCat1OtaSliceIfNeeded() + { +#ifdef SUPPORT_CAT1_SERVICE + if (!IsSoftwareVersion_1_0_47()) { + return; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "TryEnterBootCat1OtaSliceIfNeeded: sw=1.0.47, enter OTA updating (Cat1), wait for network then upgrade"); + m_bootCat1OtaFromVer47 = true; + m_bootCat1OtaAwaitNetwork = true; + (void)memset(g_ln_last_package_url_new1, 0, sizeof(g_ln_last_package_url_new1)); + (void)memset(g_ln_last_package_url_new2, 0, sizeof(g_ln_last_package_url_new2)); + m_otaStatus = OTA_UI_STATUS_CAT1_START; + OtaModel::GetInstance()->SetOtaStatus(OTA_UI_STATUS_CAT1_START); + ln_ws_send_voice_chat_interrupt("进入OTA"); + do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0); + NativeAbility::GetInstance().ChangeSlice(VIEW_OTA); +#endif + } + /*************************OTA升级进度*************************/ void ThunderBirdModel::UpdateOtaProgress(int progress) { @@ -805,6 +858,9 @@ extern "C" { { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::ResetOtaStatus: resetting OTA status to 0"); m_otaStatus = 0; + m_bootCat1OtaFromVer47 = false; + m_bootCat1OtaAwaitNetwork = false; + m_bootCat1OtaUrlsPending = false; } @@ -2121,6 +2177,9 @@ extern "C" { */ void ThunderBirdModel::Cat1OtaUpgrade() { + m_bootCat1OtaFromVer47 = false; + /* 已确认需 Cat1 并开始写模组:关闭 1.0.47 开机进 OTA 时为保活而未停的状态定时器 */ + StopStatusTimer(); WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cat1模组升级"); // LOS_Msleep(1000); // uint32_t ret = 0; @@ -2161,15 +2220,32 @@ extern "C" { */ void ThunderBirdModel::StatusCallback() { - // 更新网络状态 - UpdateNetworkStatus(); + // 更新网络状态 + UpdateNetworkStatus(); // 检查网络状态是否有网 if(HasNetwork()) { if(get_is_ln_get_device_network_success()) { - if (init_falg == false) + if (m_bootCat1OtaAwaitNetwork) { + m_bootCat1OtaAwaitNetwork = false; + m_bootCat1OtaUrlsPending = true; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Boot Cat1(sw1.0.47): network ok, request CAT1 OTA URL check"); + do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_IS_CAT1_OTA_UPGRADE, NULL, 0); + } + if (m_bootCat1OtaUrlsPending) { + if (strlen(g_ln_last_package_url_new1) > 0 && strlen(g_ln_last_package_url_new2) > 0) { + m_bootCat1OtaUrlsPending = false; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Boot Cat1(sw1.0.47): package URLs ready, start Cat1OtaUpgrade"); + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(&OHOS::ThunderBirdModel::Cat1OtaUpgrade, + OHOS::ThunderBirdModel::GetInstance())); + } + } + if (init_falg == false && !m_bootCat1OtaFromVer47) { //发送获取绑定用户ID do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_GET_USER_ID, NULL, 0); @@ -2178,7 +2254,12 @@ extern "C" { { ThunderBirdGuideView::GetInstance()->OnWsConnected(); } - do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_IS_CAT1_OTA_UPGRADE, NULL, 0); + if (!(m_bootCat1OtaUrlsPending && m_bootCat1OtaFromVer47)) { + do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_IS_CAT1_OTA_UPGRADE, NULL, 0); + } else { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "Skip duplicate IS_CAT1 (boot sw1.0.47 already requested)"); + } #if JUHEPINGTAI uapi_init_all_websocket_servers(); @@ -2208,6 +2289,11 @@ extern "C" { } } + + /* OTA 独立 slice:雷鸟主页已析构,避免 CountUp/换页/视频恢复/Presenter 定时器等在无 MainView 或错误上下文下运行 */ + if (NativeAbility::GetInstance().GetCurSliceId() == VIEW_OTA) { + return; + } // #if JUHEPINGTAI // if(is_all_services_ready == false) -- 2.17.1