var ble = require('../../services/ble') var SCAN_BRIGHTNESS = 128 var SCAN_TIMEOUT = 12000 Page({ data: { statusBarHeight: 44, scanning: true, scanProgress: 0, regions: 0x1F, pdValues: [], pdRaw: [], vbat: 0, battery: 0, error: '' }, onBack: function () { wx.navigateBack({ fail: function () { wx.reLaunch({ url: '/pages/index/index' }) } }) }, onLoad: function (options) { var app = getApp() this.setData({ statusBarHeight: app.globalData.statusBarHeight, regions: parseInt(options.regions) || 0x1F }) this.startScan() }, _cleanup: function () { if (this._progressTimer) { clearInterval(this._progressTimer); this._progressTimer = null } if (this._timeoutTimer) { clearTimeout(this._timeoutTimer); this._timeoutTimer = null } if (this._onAdc) { ble.off('adc', this._onAdc); this._onAdc = null } }, startScan: function () { var self = this if (!ble.isConnected()) { self.setData({ scanning: false, error: '设备未连接,请先连接设备' }) return } self.setData({ scanning: true, scanProgress: 0, error: '', pdValues: [] }) this._progressTimer = setInterval(function () { var p = self.data.scanProgress + 1 if (p > 90) p = 90 self.setData({ scanProgress: p }) }, 80) this._onAdc = function (data) { console.log('[SCAN] 收到ADC数据:', JSON.stringify(data)) self._cleanup() self.setData({ scanning: false, scanProgress: 100 }) self._handleAdcData(data) } ble.on('adc', this._onAdc) console.log('[SCAN] 下发扫描指令: 全域亮度', SCAN_BRIGHTNESS) ble.setParams({ region_mask: 0x1F, wavelength: 2, brightness: SCAN_BRIGHTNESS, hold_time: 10, control: 0x01 }).then(function () { console.log('[SCAN] 扫描指令发送成功,等待ADC回传...') }).catch(function (err) { console.error('[SCAN] 扫描指令发送失败:', err) self._cleanup() self.setData({ scanning: false, scanProgress: 0, error: '扫描指令发送失败' }) }) this._timeoutTimer = setTimeout(function () { if (!self.data.scanning) return console.log('[SCAN] 等待ADC超时,使用默认值') self._cleanup() self.setData({ scanning: false, scanProgress: 100 }) self._handleAdcData(null) }, SCAN_TIMEOUT) }, _handleAdcData: function (data) { var regionNames = ['右区(IO1)', '左区(IO2)', '上区(IO3)', '中区(IO4)', '下区(IO5)'] var pdValues = [] if (data && data.pd && data.pd.length >= 7) { this.setData({ pdRaw: data.pd, vbat: data.vbat || 0, battery: data.battery || 0 }) for (var i = 0; i < 5; i++) { var barW = Math.min(100, Math.round(data.pd[i] / 40.95)) pdValues.push({ region: regionNames[i], pd: data.pd[i], pdText: String(data.pd[i]), barWidth: barW }) } pdValues.push({ region: 'PD6', pd: data.pd[5], pdText: String(data.pd[5]), barWidth: Math.min(100, Math.round(data.pd[5] / 40.95)) }) pdValues.push({ region: 'PD7', pd: data.pd[6], pdText: String(data.pd[6]), barWidth: Math.min(100, Math.round(data.pd[6] / 40.95)) }) getApp().globalData.lastScanPd = data.pd getApp().globalData.lastScanVbat = data.vbat } else { for (var j = 0; j < 5; j++) { pdValues.push({ region: regionNames[j], pd: 0, pdText: '未采集', barWidth: 0 }) } } this.setData({ pdValues: pdValues }) }, onUnload: function () { this._cleanup() ble.stopTreatment().catch(function () {}) }, onNext: function () { var mask = this.data.regions || 0x1F var pdRaw = this.data.pdRaw var pdParam = pdRaw.length > 0 ? '&pd=' + encodeURIComponent(JSON.stringify(pdRaw)) : '' wx.redirectTo({ url: '/pages/treatment-setup/treatment-setup?regions=' + mask + pdParam }) } })