1
0

service.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. const transport = require('../../transport/ble-core.js')
  2. const manualRtuService = require('../manual-rtu/service.js')
  3. const themeService = require('../../store/theme-store.js')
  4. const {
  5. DEFAULT_DEVICE_FILTER,
  6. getHomePageState
  7. } = require('./view-model.js')
  8. let syncService = null
  9. let initScheduled = false
  10. const syncSubscriptionHooks = []
  11. function deferStartupWork(task) {
  12. if (typeof task !== 'function') return
  13. if (typeof setTimeout === 'function') {
  14. setTimeout(task, 120)
  15. return
  16. }
  17. task()
  18. }
  19. function getSyncService() {
  20. if (!syncService) {
  21. syncService = require('../motor-control/sync-service.js')
  22. syncSubscriptionHooks.slice().forEach((hook) => {
  23. hook(syncService)
  24. })
  25. }
  26. return syncService
  27. }
  28. function getSyncState() {
  29. return syncService ? syncService.getState() : {
  30. isSyncing: false
  31. }
  32. }
  33. function init() {
  34. if (initScheduled) return
  35. initScheduled = true
  36. deferStartupWork(() => {
  37. try {
  38. themeService.init()
  39. } catch (error) {}
  40. })
  41. }
  42. function getState(deviceFilterMode = DEFAULT_DEVICE_FILTER) {
  43. return getHomePageState(
  44. transport.getState(),
  45. deviceFilterMode,
  46. getSyncState(),
  47. themeService.getState(),
  48. manualRtuService.getState()
  49. )
  50. }
  51. function subscribeState(getDeviceFilterMode, subscriber) {
  52. if (typeof subscriber !== 'function') return () => {}
  53. const getFilterMode = typeof getDeviceFilterMode === 'function'
  54. ? getDeviceFilterMode
  55. : () => DEFAULT_DEVICE_FILTER
  56. const emit = () => subscriber(getState(getFilterMode()))
  57. let syncUnsubscribe = null
  58. const syncHook = (service) => {
  59. if (!syncUnsubscribe) {
  60. syncUnsubscribe = service.subscribe(emit)
  61. }
  62. }
  63. syncSubscriptionHooks.push(syncHook)
  64. if (syncService) syncHook(syncService)
  65. const unsubscribers = [
  66. transport.subscribe(emit),
  67. manualRtuService.subscribe(emit),
  68. themeService.subscribe(emit)
  69. ]
  70. return () => {
  71. unsubscribers.forEach((unsubscribe) => {
  72. if (typeof unsubscribe === 'function') unsubscribe()
  73. })
  74. if (typeof syncUnsubscribe === 'function') syncUnsubscribe()
  75. const index = syncSubscriptionHooks.indexOf(syncHook)
  76. if (index >= 0) syncSubscriptionHooks.splice(index, 1)
  77. }
  78. }
  79. function toggleScan(isDiscovering) {
  80. return isDiscovering ? transport.stopScan() : transport.startScan()
  81. }
  82. module.exports = {
  83. DEFAULT_DEVICE_FILTER,
  84. clearDevices: transport.clearDevices,
  85. clearInput: transport.clearInput,
  86. clearLogs: transport.clearLogs,
  87. closeProtocolMultipleDialog: manualRtuService.closeProtocolMultipleDialog,
  88. connectDeviceById: transport.connectDeviceById,
  89. disconnectDevice: transport.disconnectDevice,
  90. getState,
  91. init,
  92. openProtocolMultipleDialog: manualRtuService.openProtocolMultipleDialog,
  93. sendGeneratedFrame: manualRtuService.sendGeneratedFrame,
  94. sendHexFrame: transport.sendHexFrame,
  95. setCommandIndex: manualRtuService.setCommandIndex,
  96. setProtocolInput: manualRtuService.setProtocolInput,
  97. setProtocolMultipleQuantity: manualRtuService.setProtocolMultipleQuantity,
  98. setProtocolMultipleTextLength: manualRtuService.setProtocolMultipleTextLength,
  99. setProtocolMultipleType: manualRtuService.setProtocolMultipleType,
  100. setProtocolMultipleValue: manualRtuService.setProtocolMultipleValue,
  101. setSendHex: transport.setSendHex,
  102. subscribeState,
  103. syncRegisters: () => getSyncService().syncAllRegisters(),
  104. toggleScan,
  105. validateProtocolMultipleValue: manualRtuService.validateProtocolMultipleValue
  106. }