view-model.js 9.3 KB

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