1
0

service.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. const transport = require('../../transport/ble-core.js')
  2. const themeService = require('../../store/theme-store.js')
  3. const DEFAULT_DEVICE_FILTER = 'all'
  4. const DEVICE_FILTER_OPTIONS = [
  5. { key: 'all', label: '全部' },
  6. { key: 'target', label: '目标' }
  7. ]
  8. let initScheduled = false
  9. function isTargetDevice(device) {
  10. return !!(device && (device.isTargetDevice || device.isTargetAdvertised))
  11. }
  12. function filterDevices(devices, filterMode) {
  13. if (filterMode === 'target') return devices.filter(isTargetDevice)
  14. return devices
  15. }
  16. function getHomePageState(
  17. transportState = transport.getState(),
  18. deviceFilterMode = DEFAULT_DEVICE_FILTER,
  19. themeState = themeService.getState()
  20. ) {
  21. const { connectedDevice } = transportState
  22. const filteredDevices = filterDevices(transportState.devices, deviceFilterMode)
  23. const allDeviceCount = transportState.devices.length
  24. const filteredDeviceCount = filteredDevices.length
  25. const connectionStatusText = connectedDevice
  26. ? '已连接'
  27. : (transportState.isConnecting ? '连接中' : '未连接')
  28. return {
  29. ...transportState,
  30. ...themeState,
  31. allDeviceCount,
  32. canClearDevices: !!allDeviceCount && !transportState.isConnecting,
  33. canDisconnectDevice: !!connectedDevice,
  34. canStartScan: !transportState.isConnecting,
  35. connectionCharacteristicText: connectedDevice ? transportState.characteristicText : '--',
  36. connectionDeviceId: connectedDevice ? connectedDevice.deviceId : '--',
  37. connectionName: connectedDevice ? connectedDevice.displayName : '',
  38. connectionServiceCount: connectedDevice ? transportState.connectedServiceCount : '--',
  39. connectionSignalText: connectedDevice
  40. ? (transportState.signalText || connectedDevice.signalText || '--')
  41. : '--',
  42. connectionStatusText,
  43. devices: filteredDevices,
  44. deviceCountText: allDeviceCount
  45. ? (deviceFilterMode === 'target' ? `(${filteredDeviceCount}/${allDeviceCount})` : `(${allDeviceCount})`)
  46. : '',
  47. deviceFilterMode,
  48. deviceFilterOptions: DEVICE_FILTER_OPTIONS,
  49. emptyDeviceText: allDeviceCount && deviceFilterMode === 'target'
  50. ? '当前扫描结果中没有广播目标 UUID 的设备,可切回全部后连接确认特征值。'
  51. : '请确认设备已上电并处于可广播或配网状态。',
  52. emptyDeviceTitle: allDeviceCount && deviceFilterMode === 'target'
  53. ? '没有匹配目标特征的设备'
  54. : '还没有发现设备',
  55. scanButtonText: transportState.isDiscovering ? '停止' : '扫描',
  56. showDeviceSection: true
  57. }
  58. }
  59. function deferStartupWork(task) {
  60. if (typeof task !== 'function') return
  61. if (typeof setTimeout === 'function') {
  62. setTimeout(task, 120)
  63. return
  64. }
  65. task()
  66. }
  67. function init() {
  68. if (initScheduled) return
  69. initScheduled = true
  70. deferStartupWork(() => {
  71. try {
  72. transport.init()
  73. themeService.init()
  74. } catch (error) {}
  75. })
  76. }
  77. function getState(deviceFilterMode = DEFAULT_DEVICE_FILTER) {
  78. return getHomePageState(
  79. transport.getState(),
  80. deviceFilterMode,
  81. themeService.getState()
  82. )
  83. }
  84. function subscribeState(getDeviceFilterMode, subscriber) {
  85. if (typeof subscriber !== 'function') return () => {}
  86. const getFilterMode = typeof getDeviceFilterMode === 'function'
  87. ? getDeviceFilterMode
  88. : () => DEFAULT_DEVICE_FILTER
  89. const emit = () => subscriber(getState(getFilterMode()))
  90. const unsubscribers = [
  91. transport.subscribe(emit),
  92. themeService.subscribe(emit)
  93. ]
  94. return () => {
  95. unsubscribers.forEach((unsubscribe) => {
  96. if (typeof unsubscribe === 'function') unsubscribe()
  97. })
  98. }
  99. }
  100. function toggleScan(isDiscovering) {
  101. return isDiscovering ? transport.stopScan() : transport.startScan()
  102. }
  103. module.exports = {
  104. DEFAULT_DEVICE_FILTER,
  105. DEVICE_FILTER_OPTIONS,
  106. clearDevices: transport.clearDevices,
  107. connectDeviceById: transport.connectDeviceById,
  108. disconnectDevice: transport.disconnectDevice,
  109. filterDevices,
  110. getHomePageState,
  111. getState,
  112. init,
  113. isTargetDevice,
  114. subscribeState,
  115. toggleScan
  116. }