112 lines
3.4 KiB
JavaScript
112 lines
3.4 KiB
JavaScript
const app = getApp();
|
|
|
|
// OTA 超时时间:1 分钟
|
|
const OTA_TIMEOUT_MS = 1 * 60 * 1000;
|
|
|
|
Component({
|
|
data: {
|
|
otaProgress: 0,
|
|
otaStatus: '', // 'upgrading' | 'success' | 'failed' | ''
|
|
otaMessage: ''
|
|
},
|
|
|
|
lifetimes: {
|
|
attached() {
|
|
// OTA 升级由父页面在 activeProtocol 就绪后显式调用,此处不自动触发
|
|
},
|
|
detached() {
|
|
// 组件销毁时清除超时定时器,防止泄漏
|
|
this._clearOtaTimer();
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
// 完成按钮回调(成功或失败后展示)
|
|
bindOk() {
|
|
this.triggerEvent('deviceEvent', { status: true });
|
|
},
|
|
|
|
// 清除 OTA 超时定时器
|
|
_clearOtaTimer() {
|
|
if (this._otaTimer) {
|
|
clearTimeout(this._otaTimer);
|
|
this._otaTimer = null;
|
|
}
|
|
},
|
|
|
|
// 开始 OTA 升级
|
|
startOtaUpgrade() {
|
|
const activeProtocol = app.globalData.ppScale.activeProtocol;
|
|
|
|
if (!activeProtocol) {
|
|
wx.showToast({ title: '设备未连接,请重新连接', icon: 'none' });
|
|
return;
|
|
}
|
|
|
|
wx.showLoading({ title: '正在升级...', mask: true });
|
|
|
|
this.setData({
|
|
otaProgress: 0,
|
|
otaStatus: 'upgrading',
|
|
otaMessage: '升级初始化中...'
|
|
});
|
|
|
|
// 启动超时保护,3 分钟内未完成则视为失败
|
|
this._clearOtaTimer();
|
|
this._otaTimer = setTimeout(() => {
|
|
console.log('OTA 升级超时');
|
|
this.handleOtaFailed('升级超时,设备即将重启');
|
|
}, OTA_TIMEOUT_MS);
|
|
|
|
// 回调参数为 { progress, isFailed }
|
|
activeProtocol.codeOtaUpdate((res) => {
|
|
console.log('OTA 升级回调:', res);
|
|
|
|
if (res && res.progress !== undefined) {
|
|
this.setData({
|
|
otaProgress: res.progress,
|
|
otaMessage: `升级进度: ${res.progress}%`
|
|
});
|
|
}
|
|
|
|
if (res && res.isFailed === false) {
|
|
this._clearOtaTimer();
|
|
this.handleOtaSuccess();
|
|
} else if (res && res.isFailed === true) {
|
|
this._clearOtaTimer();
|
|
this.handleOtaFailed();
|
|
}
|
|
});
|
|
},
|
|
|
|
// OTA 升级成功处理
|
|
handleOtaSuccess() {
|
|
wx.hideLoading();
|
|
this.setData({
|
|
otaProgress: 100,
|
|
otaStatus: 'success',
|
|
otaMessage: '升级成功,设备即将重启'
|
|
});
|
|
wx.showToast({ title: 'OTA 升级成功', icon: 'success', duration: 2000 });
|
|
setTimeout(() => {
|
|
this.bindOk();
|
|
}, 2000);
|
|
},
|
|
|
|
// OTA 升级失败处理
|
|
handleOtaFailed(msg) {
|
|
wx.hideLoading();
|
|
const message = msg || '升级失败,设备即将重启';
|
|
this.setData({
|
|
otaProgress: 0,
|
|
otaStatus: 'failed',
|
|
otaMessage: message
|
|
});
|
|
wx.showToast({ title: message, icon: 'none', duration: 2000 });
|
|
setTimeout(() => {
|
|
this.bindOk();
|
|
}, 2000);
|
|
}
|
|
}
|
|
});
|