1
0

params-view-model.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. const genericModbusService = require('../generic-modbus/service.js')
  2. const settingsService = require('../../store/settings-store.js')
  3. const themeService = require('../../store/theme-store.js')
  4. const transport = require('../../transport/ble-core.js')
  5. function getGenericOption(options, index) {
  6. return options[Number(index)] || options[0] || {}
  7. }
  8. function getPageState() {
  9. const settingsState = settingsService.getState()
  10. const transportState = transport.getState()
  11. const isPrivateProtocol = settingsState.modbusProtocolMode !== 'generic'
  12. return {
  13. ...genericModbusService.getState(),
  14. ...themeService.getState(),
  15. ...settingsState,
  16. connectedDevice: transportState.connectedDevice,
  17. isGenericProtocol: !isPrivateProtocol,
  18. isPrivateProtocol
  19. }
  20. }
  21. function resolveActiveParamView(currentView) {
  22. return currentView === 'genericModbusGroup' ? currentView : 'genericModbus'
  23. }
  24. function getSettingsPageState(currentData, settingsState) {
  25. const isPrivateProtocol = settingsState.modbusProtocolMode !== 'generic'
  26. return {
  27. ...settingsState,
  28. activeParamView: resolveActiveParamView(currentData.activeParamView),
  29. isGenericProtocol: !isPrivateProtocol,
  30. isPrivateProtocol
  31. }
  32. }
  33. function getVisiblePageState(currentData) {
  34. const settingsState = settingsService.getState()
  35. const transportState = transport.getState()
  36. const isPrivateProtocol = settingsState.modbusProtocolMode !== 'generic'
  37. const pageState = {
  38. ...genericModbusService.getState(),
  39. ...themeService.getState(),
  40. ...settingsState,
  41. connectedDevice: transportState.connectedDevice,
  42. isGenericProtocol: !isPrivateProtocol,
  43. isPrivateProtocol
  44. }
  45. return {
  46. ...pageState,
  47. activeParamView: resolveActiveParamView(currentData.activeParamView)
  48. }
  49. }
  50. function getTransportPageState(transportState = transport.getState()) {
  51. return {
  52. connectedDevice: transportState.connectedDevice
  53. }
  54. }
  55. function createGenericModbusDialogState(overrides = {}) {
  56. const registerType = getGenericOption(genericModbusService.REGISTER_TYPE_OPTIONS, 0)
  57. const dataType = getGenericOption(genericModbusService.DATA_TYPE_OPTIONS, 0)
  58. return {
  59. cancelText: '取消',
  60. confirmText: '确认',
  61. dataTypeIndex: 0,
  62. dataTypeText: dataType.label || '',
  63. groupId: '',
  64. groupName: '',
  65. mode: '',
  66. name: '',
  67. quantity: '1',
  68. registerIndex: -1,
  69. registerTypeIndex: 0,
  70. registerTypeText: registerType.label || '',
  71. remark: '',
  72. startAddress: '0000',
  73. title: '',
  74. textByteLength: '32',
  75. showTextLength: false,
  76. unit: '',
  77. visible: false,
  78. maxValue: '',
  79. minValue: '',
  80. addressText: '',
  81. displayValue: '',
  82. rawValueText: '',
  83. showDataType: false,
  84. showRange: false,
  85. showUnit: false,
  86. readOnly: false,
  87. parsedStructRegisters: [],
  88. structDefinition: '',
  89. structParsedSummary: '',
  90. ...overrides
  91. }
  92. }
  93. function createGenericGroupDialogState(group) {
  94. const isEdit = !!group
  95. const registerTypeIndex = isEdit ? (group.registerTypeIndex || 0) : 0
  96. const registerType = getGenericOption(genericModbusService.REGISTER_TYPE_OPTIONS, registerTypeIndex)
  97. return createGenericModbusDialogState({
  98. confirmText: isEdit ? '保存' : '确认',
  99. groupId: isEdit ? group.id : '',
  100. groupName: isEdit ? group.name : '寄存器组',
  101. layout: isEdit ? (group.layout || 'register') : 'register',
  102. mode: isEdit ? 'editGroup' : 'createGroup',
  103. quantity: isEdit ? String(group.quantity || 1) : '1',
  104. registerTypeIndex,
  105. registerTypeText: registerType.label || '',
  106. startAddress: isEdit && group.startAddressText ? group.startAddressText.replace(/^0x/i, '') : '0000',
  107. title: isEdit ? '编辑寄存器组' : '添加寄存器组',
  108. visible: true
  109. })
  110. }
  111. function createGenericRegisterDialogState(mode, group, register, registerIndex) {
  112. const isView = mode === 'viewRegister'
  113. const dataTypeIndex = register.dataTypeIndex || 0
  114. const dataType = getGenericOption(genericModbusService.DATA_TYPE_OPTIONS, dataTypeIndex)
  115. return createGenericModbusDialogState({
  116. cancelText: isView ? '关闭' : '取消',
  117. confirmText: isView ? '' : '保存',
  118. dataTypeIndex,
  119. dataTypeText: register.dataTypeText || dataType.label || '',
  120. groupId: group.id,
  121. groupName: group.name,
  122. mode,
  123. name: register.name,
  124. registerIndex,
  125. registerTypeIndex: group.registerTypeIndex || 0,
  126. remark: register.remark || '',
  127. startAddress: group.startAddressText ? group.startAddressText.replace(/^0x/i, '') : '0000',
  128. title: isView ? '寄存器信息' : '寄存器配置',
  129. textByteLength: String(register.textByteLength || '32'),
  130. showTextLength: !!register.showTextLength,
  131. unit: register.unit || '',
  132. visible: true,
  133. maxValue: register.maxValue || '',
  134. minValue: register.minValue || '',
  135. addressText: register.addressRangeText || register.addressText || '',
  136. displayValue: register.displayValue || '',
  137. rawValueText: register.rawValueText || '--',
  138. sourceMetaText: register.sourceMetaText || '',
  139. showDataType: !!register.showDataType,
  140. showRange: !!register.showRange,
  141. showUnit: !!register.showUnit,
  142. readOnly: isView
  143. })
  144. }
  145. function getGenericDialogDataTypeState(dialog, dataTypeOptions, dataTypeIndex) {
  146. const dataType = getGenericOption(dataTypeOptions, dataTypeIndex)
  147. const isTextType = dataType.kind === 'text'
  148. const showUnit = dataType.kind === 'number' && dataType.key !== 'hex'
  149. return {
  150. dataTypeIndex,
  151. dataTypeText: dataType.label || '',
  152. maxValue: isTextType ? '' : dialog.maxValue,
  153. minValue: isTextType ? '' : dialog.minValue,
  154. showRange: !isTextType,
  155. showTextLength: isTextType,
  156. showUnit,
  157. textByteLength: isTextType ? (dialog.textByteLength || '32') : dialog.textByteLength,
  158. unit: showUnit ? dialog.unit : ''
  159. }
  160. }
  161. function createGenericGroupConfig(dialog) {
  162. const registers = Array.isArray(dialog.parsedStructRegisters)
  163. ? dialog.parsedStructRegisters
  164. : []
  165. return {
  166. groupName: dialog.groupName,
  167. layout: registers.length ? 'struct' : (dialog.layout || 'register'),
  168. quantity: registers.length ? String(registers.length) : dialog.quantity,
  169. registerTypeIndex: dialog.registerTypeIndex,
  170. startAddress: dialog.startAddress,
  171. ...(registers.length ? {
  172. registers: registers.map((register) => ({
  173. bitOffset: register.bitOffset,
  174. bitWidth: register.bitWidth,
  175. byteStart: register.byteStart,
  176. dataType: register.dataType,
  177. isBitField: !!register.isBitField,
  178. isStructField: true,
  179. name: register.name,
  180. structByteLength: register.structByteLength,
  181. textByteLength: register.textByteLength
  182. }))
  183. } : {})
  184. }
  185. }
  186. function createGenericRegisterChangedData(dialog, dataTypeOptions) {
  187. const dataType = getGenericOption(dataTypeOptions, dialog.dataTypeIndex)
  188. const isTextType = dataType.kind === 'text'
  189. const showUnit = dataType.kind === 'number' && dataType.key !== 'hex'
  190. return {
  191. name: dialog.name,
  192. dataType: dataType.key,
  193. maxValue: isTextType ? '' : dialog.maxValue,
  194. minValue: isTextType ? '' : dialog.minValue,
  195. remark: dialog.remark,
  196. textByteLength: isTextType ? dialog.textByteLength : '',
  197. unit: showUnit ? dialog.unit : ''
  198. }
  199. }
  200. function findGenericGroup(groups, groupId) {
  201. return (groups || []).find((item) => item.id === groupId) || null
  202. }
  203. function findGenericRegister(groups, groupId, registerIndex) {
  204. const group = findGenericGroup(groups, groupId)
  205. const register = group && group.registers ? group.registers[registerIndex] : null
  206. return {
  207. group,
  208. register
  209. }
  210. }
  211. function getActiveGenericGroup(groups, groupId) {
  212. return findGenericGroup(groups, groupId) || null
  213. }
  214. module.exports = {
  215. createGenericGroupConfig,
  216. createGenericGroupDialogState,
  217. createGenericModbusDialogState,
  218. createGenericRegisterChangedData,
  219. createGenericRegisterDialogState,
  220. findGenericGroup,
  221. findGenericRegister,
  222. getActiveGenericGroup,
  223. getGenericDialogDataTypeState,
  224. getGenericOption,
  225. getPageState,
  226. getSettingsPageState,
  227. getTransportPageState,
  228. getVisiblePageState,
  229. resolveActiveParamView
  230. }