const transport = require('../../utils/ble-transport') const syncService = require('../../utils/sync-service') const { createPageToast } = require('../../utils/page-toast') const DEFAULT_DEVICE_FILTER = 'all' const DEVICE_FILTER_OPTIONS = [ { key: 'all', label: '全部' }, { key: 'target', label: '目标' } ] function isTargetDevice(device) { return !!(device && (device.isTargetDevice || device.isTargetAdvertised)) } function filterDevices(devices, filterMode) { if (filterMode === 'target') return devices.filter(isTargetDevice) return devices } function getPageState(transportState = transport.getState(), deviceFilterMode = DEFAULT_DEVICE_FILTER, syncState = syncService.getState()) { const { connectedDevice } = transportState const filteredDevices = filterDevices(transportState.devices, deviceFilterMode) const allDeviceCount = transportState.devices.length const filteredDeviceCount = filteredDevices.length const connectionStatusText = connectedDevice ? '已连接' : (transportState.isConnecting ? '连接中' : '未连接') return { ...transportState, allDeviceCount, canClearDevices: !!allDeviceCount && !transportState.isConnecting, canDisconnectDevice: !!connectedDevice, canStartScan: !transportState.isConnecting, canSyncRegisters: !!connectedDevice && !transportState.isConnecting && !syncState.isSyncing, connectionCharacteristicText: connectedDevice ? transportState.characteristicText : '--', connectionDeviceId: connectedDevice ? connectedDevice.deviceId : '--', connectionName: connectedDevice ? connectedDevice.displayName : '', connectionServiceCount: connectedDevice ? transportState.connectedServiceCount : '--', connectionSignalText: connectedDevice ? connectedDevice.signalText : '--', connectionStatusText, devices: transportState.isDiscovering ? filteredDevices : [], deviceCountText: allDeviceCount ? (deviceFilterMode === 'target' ? `(${filteredDeviceCount}/${allDeviceCount})` : `(${allDeviceCount})`) : '', deviceFilterMode, deviceFilterOptions: DEVICE_FILTER_OPTIONS, isSyncing: syncState.isSyncing, scanButtonText: transportState.isDiscovering ? '停止' : '扫描', showDeviceSection: transportState.isDiscovering, emptyDeviceText: allDeviceCount && deviceFilterMode === 'target' ? '当前扫描结果中没有广播目标 UUID 的设备,可切回全部后连接确认特征值。' : '请确认设备已上电并处于可广播或配网状态。', emptyDeviceTitle: allDeviceCount && deviceFilterMode === 'target' ? '没有匹配目标特征的设备' : '还没有发现设备' } } Page({ data: getPageState(), onLoad() { this.pageToast = createPageToast(this, this.data) transport.init() this.unsubscribeTransport = transport.subscribe((transportState) => { const nextState = getPageState(transportState, this.data.deviceFilterMode, syncService.getState()) this.setData(nextState) this.pageToast.showFromState(nextState) }) this.unsubscribeSync = syncService.subscribe((syncState) => { this.setData(getPageState(transport.getState(), this.data.deviceFilterMode, syncState)) }) }, onShow() { if (this.pageToast) { this.pageToast.setActive(true) } }, onHide() { if (this.pageToast) { this.pageToast.setActive(false) } }, onUnload() { if (this.pageToast) { this.pageToast.destroy() this.pageToast = null } if (this.unsubscribeTransport) { this.unsubscribeTransport() this.unsubscribeTransport = null } if (this.unsubscribeSync) { this.unsubscribeSync() this.unsubscribeSync = null } }, onCommandChange(event) { transport.setCommandIndex(event.detail.value) }, onSlaveAddressInput(event) { transport.setProtocolInput({ slaveAddress: event.detail.value }) }, onRegisterAddressInput(event) { transport.setProtocolInput({ registerAddress: event.detail.value }) }, onCommandValueInput(event) { transport.setProtocolInput({ commandValue: event.detail.value }) }, onCoilValueChange(event) { transport.setProtocolInput({ coilEnabled: !!event.detail.value }) }, sendGeneratedFrame() { if (!this.data.connectedDevice || !this.data.generatedHex) return transport.sendGeneratedFrame() }, onHexInput(event) { transport.setSendHex(event.detail.value) }, clearInput() { transport.clearInput() }, sendHexFrame() { if (!this.data.connectedDevice) return transport.sendHexFrame() }, openSetting() { transport.openSetting() }, startScan() { if (!this.data.canStartScan) return if (this.data.isDiscovering) { transport.stopScan() return } transport.startScan() }, syncRegisters() { if (!this.data.canSyncRegisters) return syncService.syncAllRegisters() }, clearDevices() { if (!this.data.canClearDevices) return transport.clearDevices() }, onDeviceFilterTap(event) { const deviceFilterMode = event.currentTarget.dataset.filter || DEFAULT_DEVICE_FILTER this.setData(getPageState(transport.getState(), deviceFilterMode)) }, connectDevice(event) { transport.connectDeviceById(event.currentTarget.dataset.deviceId) }, disconnectDevice() { if (!this.data.canDisconnectDevice) return transport.disconnectDevice() }, clearLogs() { transport.clearLogs() } })