home.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. const transport = require('../../utils/ble-transport')
  2. const syncService = require('../../utils/sync-service')
  3. const {
  4. createPageToast
  5. } = require('../../utils/page-toast')
  6. const DEFAULT_DEVICE_FILTER = 'all'
  7. const DEVICE_FILTER_OPTIONS = [
  8. { key: 'all', label: '全部' },
  9. { key: 'target', label: '目标' }
  10. ]
  11. function isTargetDevice(device) {
  12. return !!(device && (device.isTargetDevice || device.isTargetAdvertised))
  13. }
  14. function filterDevices(devices, filterMode) {
  15. if (filterMode === 'target') return devices.filter(isTargetDevice)
  16. return devices
  17. }
  18. function getPageState(transportState = transport.getState(), deviceFilterMode = DEFAULT_DEVICE_FILTER, syncState = syncService.getState()) {
  19. const { connectedDevice } = transportState
  20. const filteredDevices = filterDevices(transportState.devices, deviceFilterMode)
  21. const allDeviceCount = transportState.devices.length
  22. const filteredDeviceCount = filteredDevices.length
  23. const connectionStatusText = connectedDevice
  24. ? '已连接'
  25. : (transportState.isConnecting ? '连接中' : '未连接')
  26. return {
  27. ...transportState,
  28. allDeviceCount,
  29. canClearDevices: !!allDeviceCount && !transportState.isConnecting,
  30. canDisconnectDevice: !!connectedDevice,
  31. canStartScan: !transportState.isConnecting,
  32. canSyncRegisters: !!connectedDevice
  33. && !transportState.isConnecting
  34. && !syncState.isSyncing,
  35. connectionCharacteristicText: connectedDevice ? transportState.characteristicText : '--',
  36. connectionDeviceId: connectedDevice ? connectedDevice.deviceId : '--',
  37. connectionName: connectedDevice ? connectedDevice.displayName : '',
  38. connectionServiceCount: connectedDevice ? transportState.connectedServiceCount : '--',
  39. connectionSignalText: connectedDevice ? connectedDevice.signalText : '--',
  40. connectionStatusText,
  41. devices: transportState.isDiscovering ? filteredDevices : [],
  42. deviceCountText: allDeviceCount
  43. ? (deviceFilterMode === 'target' ? `(${filteredDeviceCount}/${allDeviceCount})` : `(${allDeviceCount})`)
  44. : '',
  45. deviceFilterMode,
  46. deviceFilterOptions: DEVICE_FILTER_OPTIONS,
  47. isSyncing: syncState.isSyncing,
  48. scanButtonText: transportState.isDiscovering ? '停止' : '扫描',
  49. showDeviceSection: transportState.isDiscovering,
  50. emptyDeviceText: allDeviceCount && deviceFilterMode === 'target'
  51. ? '当前扫描结果中没有广播目标 UUID 的设备,可切回全部后连接确认特征值。'
  52. : '请确认设备已上电并处于可广播或配网状态。',
  53. emptyDeviceTitle: allDeviceCount && deviceFilterMode === 'target'
  54. ? '没有匹配目标特征的设备'
  55. : '还没有发现设备'
  56. }
  57. }
  58. Page({
  59. data: getPageState(),
  60. onLoad() {
  61. this.pageToast = createPageToast(this, this.data)
  62. transport.init()
  63. this.unsubscribeTransport = transport.subscribe((transportState) => {
  64. const nextState = getPageState(transportState, this.data.deviceFilterMode, syncService.getState())
  65. this.setData(nextState)
  66. this.pageToast.showFromState(nextState)
  67. })
  68. this.unsubscribeSync = syncService.subscribe((syncState) => {
  69. this.setData(getPageState(transport.getState(), this.data.deviceFilterMode, syncState))
  70. })
  71. },
  72. onShow() {
  73. if (this.pageToast) {
  74. this.pageToast.setActive(true)
  75. }
  76. },
  77. onHide() {
  78. if (this.pageToast) {
  79. this.pageToast.setActive(false)
  80. }
  81. },
  82. onUnload() {
  83. if (this.pageToast) {
  84. this.pageToast.destroy()
  85. this.pageToast = null
  86. }
  87. if (this.unsubscribeTransport) {
  88. this.unsubscribeTransport()
  89. this.unsubscribeTransport = null
  90. }
  91. if (this.unsubscribeSync) {
  92. this.unsubscribeSync()
  93. this.unsubscribeSync = null
  94. }
  95. },
  96. onCommandChange(event) {
  97. transport.setCommandIndex(event.detail.value)
  98. },
  99. onSlaveAddressInput(event) {
  100. transport.setProtocolInput({
  101. slaveAddress: event.detail.value
  102. })
  103. },
  104. onRegisterAddressInput(event) {
  105. transport.setProtocolInput({
  106. registerAddress: event.detail.value
  107. })
  108. },
  109. onCommandValueInput(event) {
  110. transport.setProtocolInput({
  111. commandValue: event.detail.value
  112. })
  113. },
  114. onCoilValueChange(event) {
  115. transport.setProtocolInput({
  116. coilEnabled: !!event.detail.value
  117. })
  118. },
  119. sendGeneratedFrame() {
  120. if (!this.data.connectedDevice || !this.data.generatedHex) return
  121. transport.sendGeneratedFrame()
  122. },
  123. onHexInput(event) {
  124. transport.setSendHex(event.detail.value)
  125. },
  126. clearInput() {
  127. transport.clearInput()
  128. },
  129. sendHexFrame() {
  130. if (!this.data.connectedDevice) return
  131. transport.sendHexFrame()
  132. },
  133. openSetting() {
  134. transport.openSetting()
  135. },
  136. startScan() {
  137. if (!this.data.canStartScan) return
  138. if (this.data.isDiscovering) {
  139. transport.stopScan()
  140. return
  141. }
  142. transport.startScan()
  143. },
  144. syncRegisters() {
  145. if (!this.data.canSyncRegisters) return
  146. syncService.syncAllRegisters()
  147. },
  148. clearDevices() {
  149. if (!this.data.canClearDevices) return
  150. transport.clearDevices()
  151. },
  152. onDeviceFilterTap(event) {
  153. const deviceFilterMode = event.currentTarget.dataset.filter || DEFAULT_DEVICE_FILTER
  154. this.setData(getPageState(transport.getState(), deviceFilterMode))
  155. },
  156. connectDevice(event) {
  157. transport.connectDeviceById(event.currentTarget.dataset.deviceId)
  158. },
  159. disconnectDevice() {
  160. if (!this.data.canDisconnectDevice) return
  161. transport.disconnectDevice()
  162. },
  163. clearLogs() {
  164. transport.clearLogs()
  165. }
  166. })