feat: auto-scan receives 4 sequential ADC sets for multi-spectrum scan
Firmware does R→UV→Y→IR sequential scan autonomously. Miniprogram now listens for 4 consecutive ADC notifications, storing each as a separate spectrum group. Also listens for run_state=IDLE as scan completion signal. Displays all 4 spectrum groups with PD1-PD7 bars. Stores full scan data in globalData.lastScanData for diagnosis phase.
这个提交包含在:
@@ -1,6 +1,7 @@
|
||||
var ble = require('../../services/ble')
|
||||
var SCAN_BRIGHTNESS = 128
|
||||
var SCAN_TIMEOUT = 12000
|
||||
var SCAN_TIMEOUT = 15000
|
||||
var SPECTRUM_NAMES = ['红光', '紫外光', '黄光', '红外光']
|
||||
var SPECTRUM_COUNT = 4
|
||||
|
||||
Page({
|
||||
data: {
|
||||
@@ -8,8 +9,8 @@ Page({
|
||||
scanning: true,
|
||||
scanProgress: 0,
|
||||
regions: 0x1F,
|
||||
pdValues: [],
|
||||
pdRaw: [],
|
||||
spectrumIndex: 0,
|
||||
spectrumData: [],
|
||||
vbat: 0,
|
||||
battery: 0,
|
||||
error: ''
|
||||
@@ -36,41 +37,65 @@ Page({
|
||||
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 }
|
||||
if (this._onRunState) { ble.off('run_state', this._onRunState); this._onRunState = null }
|
||||
},
|
||||
|
||||
startScan: function () {
|
||||
var self = this
|
||||
self._scanResults = []
|
||||
|
||||
if (!ble.isConnected()) {
|
||||
self.setData({ scanning: false, error: '设备未连接,请先连接设备' })
|
||||
return
|
||||
}
|
||||
|
||||
self.setData({ scanning: true, scanProgress: 0, error: '', pdValues: [] })
|
||||
self.setData({ scanning: true, scanProgress: 0, error: '', spectrumData: [], spectrumIndex: 0 })
|
||||
|
||||
this._progressTimer = setInterval(function () {
|
||||
var p = self.data.scanProgress + 1
|
||||
var target = ((self._scanResults.length + 1) / SPECTRUM_COUNT) * 90
|
||||
var p = self.data.scanProgress
|
||||
if (p < target) p += 1
|
||||
if (p > 90) p = 90
|
||||
self.setData({ scanProgress: p })
|
||||
}, 80)
|
||||
}, 100)
|
||||
|
||||
this._onAdc = function (data) {
|
||||
console.log('[SCAN] 收到ADC数据:', JSON.stringify(data))
|
||||
self._cleanup()
|
||||
self.setData({ scanning: false, scanProgress: 100 })
|
||||
self._handleAdcData(data)
|
||||
if (!self.data.scanning) return
|
||||
var idx = self._scanResults.length
|
||||
if (idx >= SPECTRUM_COUNT) return
|
||||
|
||||
console.log('[SCAN] 收到第' + (idx + 1) + '组ADC (' + SPECTRUM_NAMES[idx] + '):', data.pd)
|
||||
self._scanResults.push({
|
||||
spectrum: SPECTRUM_NAMES[idx],
|
||||
pd: data.pd.slice(0),
|
||||
vbat: data.vbat,
|
||||
battery: data.battery
|
||||
})
|
||||
self.setData({ spectrumIndex: idx + 1 })
|
||||
|
||||
if (self._scanResults.length >= SPECTRUM_COUNT) {
|
||||
self._scanComplete()
|
||||
}
|
||||
}
|
||||
ble.on('adc', this._onAdc)
|
||||
|
||||
console.log('[SCAN] 下发扫描指令: 全域亮度', SCAN_BRIGHTNESS)
|
||||
this._onRunState = function (data) {
|
||||
if (data.run_state === 0x00 && self._scanResults.length > 0 && self.data.scanning) {
|
||||
console.log('[SCAN] 设备进入IDLE,扫描结束')
|
||||
self._scanComplete()
|
||||
}
|
||||
}
|
||||
ble.on('run_state', this._onRunState)
|
||||
|
||||
console.log('[SCAN] 下发扫描指令,等待固件序贯扫描 R→UV→Y→IR')
|
||||
ble.setParams({
|
||||
region_mask: 0x1F,
|
||||
region_mask: self.data.regions,
|
||||
wavelength: 2,
|
||||
brightness: SCAN_BRIGHTNESS,
|
||||
brightness: 128,
|
||||
hold_time: 10,
|
||||
control: 0x01
|
||||
}).then(function () {
|
||||
console.log('[SCAN] 扫描指令发送成功,等待ADC回传...')
|
||||
console.log('[SCAN] 扫描指令发送成功')
|
||||
}).catch(function (err) {
|
||||
console.error('[SCAN] 扫描指令发送失败:', err)
|
||||
self._cleanup()
|
||||
@@ -79,35 +104,45 @@ Page({
|
||||
|
||||
this._timeoutTimer = setTimeout(function () {
|
||||
if (!self.data.scanning) return
|
||||
console.log('[SCAN] 等待ADC超时,使用默认值')
|
||||
self._cleanup()
|
||||
self.setData({ scanning: false, scanProgress: 100 })
|
||||
self._handleAdcData(null)
|
||||
console.log('[SCAN] 超时,已收到' + self._scanResults.length + '组数据')
|
||||
self._scanComplete()
|
||||
}, SCAN_TIMEOUT)
|
||||
},
|
||||
|
||||
_handleAdcData: function (data) {
|
||||
var regionNames = ['右区(IO1)', '左区(IO2)', '上区(IO3)', '中区(IO4)', '下区(IO5)']
|
||||
var pdValues = []
|
||||
_scanComplete: function () {
|
||||
this._cleanup()
|
||||
this.setData({ scanning: false, scanProgress: 100 })
|
||||
this._buildDisplay()
|
||||
},
|
||||
|
||||
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)) })
|
||||
_buildDisplay: function () {
|
||||
var results = this._scanResults || []
|
||||
var spectrumData = []
|
||||
|
||||
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 })
|
||||
for (var s = 0; s < results.length; s++) {
|
||||
var r = results[s]
|
||||
var items = []
|
||||
for (var i = 0; i < 7; i++) {
|
||||
var val = r.pd[i] || 0
|
||||
items.push({
|
||||
label: 'PD' + (i + 1),
|
||||
value: val,
|
||||
barWidth: Math.min(100, Math.round(val / 40.95))
|
||||
})
|
||||
}
|
||||
spectrumData.push({ name: r.spectrum, items: items })
|
||||
}
|
||||
|
||||
this.setData({ pdValues: pdValues })
|
||||
if (results.length > 0) {
|
||||
var last = results[results.length - 1]
|
||||
this.setData({
|
||||
vbat: last.vbat || 0,
|
||||
battery: last.battery || 0
|
||||
})
|
||||
}
|
||||
|
||||
getApp().globalData.lastScanData = results
|
||||
this.setData({ spectrumData: spectrumData })
|
||||
},
|
||||
|
||||
onUnload: function () {
|
||||
@@ -117,10 +152,10 @@ Page({
|
||||
|
||||
onNext: function () {
|
||||
var mask = this.data.regions || 0x1F
|
||||
var pdRaw = this.data.pdRaw
|
||||
var pdParam = pdRaw.length > 0 ? '&pd=' + encodeURIComponent(JSON.stringify(pdRaw)) : ''
|
||||
var scanData = this._scanResults || []
|
||||
var param = scanData.length > 0 ? '&scan=' + encodeURIComponent(JSON.stringify(scanData)) : ''
|
||||
wx.redirectTo({
|
||||
url: '/pages/treatment-setup/treatment-setup?regions=' + mask + pdParam
|
||||
url: '/pages/treatment-setup/treatment-setup?regions=' + mask + param
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
在新工单中引用
屏蔽一个用户