From b43121d2ec9a55d29bcaf02e6ee23ae7d8d94d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9C=E8=99=9E=E6=B8=A0=E6=88=90=E2=80=9D?= <“yuqucheng2006@qq.com”> Date: Thu, 27 Aug 2026 14:18:31 +0800 Subject: [PATCH] =?UTF-8?q?refactor(FirmwareUpdatePage):=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E5=9B=BA=E4=BB=B6=E5=8D=87=E7=BA=A7=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 拆分同步和异步点击处理方法,优化防连点逻辑 2. 简化等待设备重启的流程,不再轮询设备版本 3. 调整升级状态的清理和恢复时机 --- .../DeviceInfoPage/FirmwareUpdatePage.cs | 85 +++++-------------- 1 file changed, 23 insertions(+), 62 deletions(-) diff --git a/Assets/Scripts/UI/Pages/DeviceInfoPage/FirmwareUpdatePage.cs b/Assets/Scripts/UI/Pages/DeviceInfoPage/FirmwareUpdatePage.cs index 05b33ca..394f69a 100644 --- a/Assets/Scripts/UI/Pages/DeviceInfoPage/FirmwareUpdatePage.cs +++ b/Assets/Scripts/UI/Pages/DeviceInfoPage/FirmwareUpdatePage.cs @@ -116,18 +116,25 @@ namespace Kill.UI.Pages Destroy(gameObject); Screen.sleepTimeout = SleepTimeout.SystemSetting; } - public async void OnUpdateButtonClick() + public void OnUpdateButtonClick() { // 防连点:升级流程进行中忽略重复触发,避免并发启动两个OTA if (isUpdating) return; isUpdating = true; + // 立刻隐藏更新按钮,防止连点期间按钮仍可点 + updateButton.gameObject.SetActive(false); Screen.sleepTimeout = SleepTimeout.NeverSleep; + OnUpdateButtonClickAsync(); + } + private async void OnUpdateButtonClickAsync() + { // 仅蓝牙连接:不支持直接OTA,提示先配置WiFi if (DataManager.Instance.hasBluetooth && !DataManager.Instance.hasWifi) { ToastUI.Show("100333"); isUpdating = false; + updateButton.gameObject.SetActive(true); return; } @@ -192,6 +199,7 @@ namespace Kill.UI.Pages { ToastUI.Show("100224"); isUpdating = false; + updateButton.gameObject.SetActive(true); return; } string md5 = NetworkCtrl.Instance.CalculateMD5(savePath); @@ -201,12 +209,14 @@ namespace Kill.UI.Pages Debug.LogError("下载的文件MD5校验失败"); File.Delete(savePath); isUpdating = false; + updateButton.gameObject.SetActive(true); return; } LoadFirmwareFile(savePath); if (_selectedFirmwareData == null) { isUpdating = false; + updateButton.gameObject.SetActive(true); return; } ToastUI.Show("100225"); @@ -381,70 +391,20 @@ namespace Kill.UI.Pages } /// - /// 传输完成后等待设备重启+重连:轮询设备列表直到当前设备以新版本号上线,否则按持久化的绝对截止时间超时退出。 - /// 期间保持 transferId 持久化、保留页内进度条显示「升级中」文案,重新进入页面也能继续等待(截止时间不会重置)。 + /// 传输完成后的过渡:等3s → 提示 100226 → 返回主页。 + /// 设备重启/版本号刷新由后台下次进入页面或下次 OTA 拉取时再处理。 /// private IEnumerator WaitDeviceRebootAndFinish(string transferId) { - const float pollInterval = 3f; // 轮询间隔 - long deadline = LoadWaitDeadline(); - // 兜底:若没设置过截止时间,立即设置一个 - if (deadline <= 0) - { - SetWaitDeadline(); - deadline = LoadWaitDeadline(); - } - // 已超过绝对截止时间:直接走超时分支并清掉 transferId,避免每次进入都重复提示 - if (DateTimeOffset.UtcNow.ToUnixTimeSeconds() >= deadline) - { - ClearTransferId(); - HideProgressPanel(); - updateButton.gameObject.SetActive(true); - ToastUI.Show("ota_update_failed"); - yield break; - } ShowProgressPanelWaitingForDevice(); - ToastUI.Show("100226"); // 传输完成提示 - string targetVersion = otaData != null ? otaData.version : ""; - bool rebooted = false; - while (DateTimeOffset.UtcNow.ToUnixTimeSeconds() < deadline) - { - yield return new WaitForSeconds(pollInterval); - if (gameObject == null) yield break; // 页面已销毁 - // 仅当持久化的还是同一个 transferId 时才继续等待(用户重新点击/切换设备会清掉) - if (LoadTransferId() != transferId) yield break; - string nowVersion = null; - yield return FetchDeviceFirmwareVersion(r => nowVersion = r); - if (!string.IsNullOrEmpty(nowVersion) && IsVersionGE(nowVersion, targetVersion)) - { - rebooted = true; - break; - } - // 期间截止时间可能被重置(用户重新点击升级等),以最新值为准 - long currentDeadline = LoadWaitDeadline(); - if (currentDeadline > 0 && currentDeadline != deadline) deadline = currentDeadline; - } + // 等3s 提示传输完成(给用户缓冲),然后返回主页 + yield return new WaitForSeconds(3f); if (gameObject == null) yield break; + // 仅当持久化的还是同一个 transferId 时再继续(用户可能已点过别的) if (LoadTransferId() != transferId) yield break; - if (rebooted) - { - // 设备已用新版本上线,更新本地版本并清理状态 - if (DataManager.Instance.selectedDevice != null && !string.IsNullOrEmpty(targetVersion)) - { - DataManager.Instance.selectedDevice.firmware_version = targetVersion; - } - ClearTransferId(); - HideProgressPanel(); - InitOtaUI(); // 重新判断:已是最新 / 又有新版本 - } - else - { - // 超时:升级失败,提示并清理 transferId(避免下次进入页面再触发) - ToastUI.Show("ota_update_failed"); - ClearTransferId(); - HideProgressPanel(); - updateButton.gameObject.SetActive(true); - } + ToastUI.Show("100226"); + // 返回主页:transferId 保留,下次进入页面仍能识别为「传输已完成、待重启确认」 + UIManager.Instance.OpenMainPage(UIManager.PageName.homePage); } /// @@ -551,11 +511,12 @@ namespace Kill.UI.Pages currentTransferId = savedId; currentTransferStatus = savedStatus; updateButton.gameObject.SetActive(false); - // 已经传输完成等待设备重启:直接走轮询分支,不重新订阅 SSE + // 已经传输完成等待设备重启:直接清理状态、恢复更新按钮(实际设备升级由下次进入主页/下次 OTA 拉取时确认) if (savedStatus == "waiting_reboot") { - ShowProgressPanelWaitingForDevice(); - StartCoroutine(WaitDeviceRebootAndFinish(savedId)); + ClearTransferId(); + HideProgressPanel(); + updateButton.gameObject.SetActive(true); return; } ShowProgressPanel(0);