view-model.js 8.6 KB

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