From f1a2523cb48f7d6dc5c867941e4241833980ae58 Mon Sep 17 00:00:00 2001 From: Guoguo Date: Tue, 19 May 2026 03:57:47 -0700 Subject: [PATCH] fix: ADC notifications no longer emit 'status' (prevents timer jump) - ADC (17-byte) now emits 'adc' + 'battery' events, not 'status' - Fixes CRITICAL timer jump: remaining_ms:0 was resetting countdown - Drop ADC packets with bad XOR checksum - treating.js + index.js subscribe to 'battery' for live battery updates - onStatus only updates remaining_ms when > 0 --- miniprogram/pages/index/index.js | 10 ++++++++++ miniprogram/pages/treating/treating.js | 16 ++++++++++++---- miniprogram/services/ble/connection.js | 20 ++++++-------------- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/miniprogram/pages/index/index.js b/miniprogram/pages/index/index.js index 07d5009..0206702 100644 --- a/miniprogram/pages/index/index.js +++ b/miniprogram/pages/index/index.js @@ -21,7 +21,9 @@ Page({ this.setData({ devMode: config.__DEV__ || false }) this.checkState() this._onStatus = this.onBleStatus.bind(this) + this._onBattery = this.onBleBattery.bind(this) ble.on('status', this._onStatus) + ble.on('battery', this._onBattery) }, _cleanup: function () { @@ -29,6 +31,10 @@ Page({ ble.off('status', this._onStatus) this._onStatus = null } + if (this._onBattery) { + ble.off('battery', this._onBattery) + this._onBattery = null + } }, onHide: function () { @@ -78,6 +84,10 @@ Page({ }) }, + onBleBattery: function (info) { + this.setData({ battery: info.battery, connected: true }) + }, + onConnectBle: function () { var self = this self.setData({ bleState: 'scanning' }) diff --git a/miniprogram/pages/treating/treating.js b/miniprogram/pages/treating/treating.js index 71d1e55..33c1f8c 100644 --- a/miniprogram/pages/treating/treating.js +++ b/miniprogram/pages/treating/treating.js @@ -55,7 +55,9 @@ Page({ this._onReconnectFailed = this.onReconnectFailed.bind(this) this._sessionId = 'SESS_' + Date.now() + this._onBattery = this.onBattery.bind(this) ble.on('status', this._onStatus) + ble.on('battery', this._onBattery) ble.on('treatment_complete', this._onComplete) ble.on('exception', this._onException) ble.on('disconnected', this._onDisconnect) @@ -68,6 +70,7 @@ Page({ onUnload: function () { if (this._onStatus) ble.off('status', this._onStatus) + if (this._onBattery) ble.off('battery', this._onBattery) if (this._onComplete) ble.off('treatment_complete', this._onComplete) if (this._onException) ble.off('exception', this._onException) if (this._onDisconnect) ble.off('disconnected', this._onDisconnect) @@ -104,16 +107,21 @@ Page({ }, onStatus: function (status) { - var remaining = status.remaining_ms || 0 - this.updateProgress(remaining) + if (status.remaining_ms > 0) { + this.updateProgress(status.remaining_ms) + } this.setData({ - battery: status.battery, - temperature: status.temperature, + battery: status.battery || this.data.battery, + temperature: status.temperature || this.data.temperature, paused: status.mode_state === 0x03 }) this.syncCommands() }, + onBattery: function (info) { + this.setData({ battery: info.battery }) + }, + syncCommands: function () { var app = getApp() var device = app.globalData.currentDevice || {} diff --git a/miniprogram/services/ble/connection.js b/miniprogram/services/ble/connection.js index 7a81081..23c1c81 100644 --- a/miniprogram/services/ble/connection.js +++ b/miniprogram/services/ble/connection.js @@ -94,20 +94,12 @@ function handleValueChange(res) { if (parsed.type === 'adc') { var vbatMv = parsed.vbat var batteryPct = Math.min(100, Math.max(0, Math.round((vbatMv - 3000) / (4200 - 3000) * 100))) - emit('status', { - mode_state: protocol.MODE_STATE.ACTIVE, - region_mask: protocol.REGION.FULL_FACE, - wavelength: 0, - brightness: 0, - remaining_ms: 0, - error_code: 0, - battery: batteryPct, - temperature: 0, - bind_status: 1, - subscription: 1, - pd: parsed.pd, - vbat: vbatMv - }) + if (!parsed.checksum_ok) { + console.warn('[BLE] ADC checksum mismatch, dropping') + return + } + emit('adc', { pd: parsed.pd, vbat: vbatMv, battery: batteryPct }) + emit('battery', { battery: batteryPct, vbat: vbatMv }) return }