1
0

params-view-model.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. const controlService = require('./control-service.js')
  2. const genericModbusService = require('../generic-modbus/service.js')
  3. const paramsPageState = require('../../domain/motor-control/params-state.js')
  4. const settingsService = require('../../store/settings-store.js')
  5. const syncService = require('./sync-service.js')
  6. const {
  7. getStatusPageState
  8. } = require('../../domain/motor-control/status-state.js')
  9. const themeService = require('../../store/theme-store.js')
  10. const GROUP_LABELS = {
  11. dq: 'DQ轴电流环参数',
  12. estimator: '估算器参数',
  13. oil: '上油参数',
  14. preposition: '预定位配置',
  15. protection: '保护',
  16. speedLoop: '速度环路',
  17. tailwind: '顺逆风配置',
  18. vsp: 'VSP曲线'
  19. }
  20. const COMBINED_GROUPS = {
  21. speed: ['speedLoop', 'vsp', 'oil'],
  22. startup: ['tailwind', 'preposition']
  23. }
  24. const COMBINED_GROUP_LABELS = {
  25. speed: '速度管理',
  26. startup: '启动位置管理'
  27. }
  28. const PARAM_VIEWS = [
  29. 'driver',
  30. 'protection',
  31. 'estimator',
  32. 'dq',
  33. 'startup',
  34. 'speed',
  35. 'genericModbus',
  36. 'genericModbusGroup',
  37. 'status'
  38. ]
  39. function getGroupLabel(groupKey) {
  40. return GROUP_LABELS[groupKey] || '参数'
  41. }
  42. function getCombinedGroupKeys(viewKey) {
  43. return COMBINED_GROUPS[viewKey] || []
  44. }
  45. function getCombinedGroupLabel(viewKey) {
  46. return COMBINED_GROUP_LABELS[viewKey] || '参数'
  47. }
  48. function hasDirtyItem(items = []) {
  49. return items.some((item) => !!item && !!item.isDirty)
  50. }
  51. function hasWritableGroupChanges(data, groupKey) {
  52. if (groupKey === 'tailwind') {
  53. return hasDirtyItem(data.tailwindSwitchRegisters) || hasDirtyItem(data.tailwindAtoBandwidthDisplayRegisters)
  54. }
  55. if (groupKey === 'preposition') {
  56. return hasDirtyItem(data.prepositionSwitchRegisters) || hasDirtyItem(data.prepositionParameterDisplayRegisters)
  57. }
  58. if (groupKey === 'speedLoop') {
  59. return hasDirtyItem(data.speedLoopInputDisplayRegisters) || hasDirtyItem(data.speedLoopExtraDisplayRegisters)
  60. }
  61. if (groupKey === 'vsp') {
  62. return hasDirtyItem(data.vspCurveRegisters) || !!(data.speedSlopeRegister && data.speedSlopeRegister.isDirty)
  63. }
  64. if (groupKey === 'oil') return hasDirtyItem(data.oilParameterInputRegisters)
  65. return false
  66. }
  67. function getControlViewState(controlState = controlService.getState()) {
  68. return {
  69. ...controlState,
  70. ...getStatusPageState(controlState.userStatusCount),
  71. canReadStatus: !!controlState.connectedDevice
  72. }
  73. }
  74. function getProtocolFlags(settingsState = settingsService.getState()) {
  75. return {
  76. isGenericProtocol: settingsState.modbusProtocolFilter === 'generic',
  77. isMotorControlProtocol: settingsState.modbusProtocolFilter !== 'generic'
  78. }
  79. }
  80. function getPageState(
  81. paramsState = syncService.getParamsSnapshot(),
  82. controlState = controlService.getState()
  83. ) {
  84. const settingsState = settingsService.getState()
  85. return {
  86. ...paramsPageState.refreshState(paramsState),
  87. ...getControlViewState(controlState),
  88. ...genericModbusService.getState(),
  89. ...themeService.getState(),
  90. ...settingsState,
  91. ...getProtocolFlags(settingsState)
  92. }
  93. }
  94. function resolveActiveParamView(currentView, settingsState) {
  95. if (settingsState.modbusProtocolFilter === 'generic') {
  96. return currentView === 'genericModbus' || currentView === 'genericModbusGroup' ? currentView : 'genericModbus'
  97. }
  98. return PARAM_VIEWS.includes(currentView) && currentView !== 'genericModbus' && currentView !== 'genericModbusGroup' ? currentView : ''
  99. }
  100. function getSettingsPageState(currentData, settingsState) {
  101. const activeParamView = resolveActiveParamView(currentData.activeParamView, settingsState)
  102. return {
  103. ...settingsState,
  104. activeParamView,
  105. ...getProtocolFlags(settingsState)
  106. }
  107. }
  108. function getVisiblePageState(currentData) {
  109. const snapshot = syncService.getParamsSnapshot()
  110. const nextParamsState = snapshot.syncVersion && snapshot.syncVersion !== currentData.syncVersion
  111. ? paramsPageState.refreshState(snapshot)
  112. : paramsPageState.refreshState(currentData)
  113. const pageState = {
  114. ...nextParamsState,
  115. ...getControlViewState(),
  116. ...genericModbusService.getState(),
  117. ...themeService.getState(),
  118. ...settingsService.getState()
  119. }
  120. return {
  121. ...pageState,
  122. activeParamView: resolveActiveParamView(currentData.activeParamView, pageState),
  123. ...getProtocolFlags(pageState)
  124. }
  125. }
  126. function getGenericOption(options, index) {
  127. return options[Number(index)] || options[0] || {}
  128. }
  129. function createGenericModbusDialogState(overrides = {}) {
  130. const registerType = getGenericOption(genericModbusService.REGISTER_TYPE_OPTIONS, 0)
  131. const dataType = getGenericOption(genericModbusService.DATA_TYPE_OPTIONS, 0)
  132. return {
  133. cancelText: '取消',
  134. confirmText: '确认',
  135. dataTypeIndex: 0,
  136. dataTypeText: dataType.label || '',
  137. groupId: '',
  138. groupName: '',
  139. mode: '',
  140. name: '',
  141. quantity: '1',
  142. registerIndex: -1,
  143. registerTypeIndex: 0,
  144. registerTypeText: registerType.label || '',
  145. remark: '',
  146. startAddress: '0000',
  147. title: '',
  148. textByteLength: '32',
  149. showTextLength: false,
  150. unit: '',
  151. visible: false,
  152. maxValue: '',
  153. minValue: '',
  154. addressText: '',
  155. displayValue: '',
  156. rawValueText: '',
  157. showDataType: false,
  158. showRange: false,
  159. showUnit: false,
  160. readOnly: false,
  161. parsedStructRegisters: [],
  162. structDefinition: '',
  163. structParsedSummary: '',
  164. ...overrides
  165. }
  166. }
  167. function createGenericGroupDialogState(group) {
  168. const isEdit = !!group
  169. const registerTypeIndex = isEdit ? (group.registerTypeIndex || 0) : 0
  170. const registerType = getGenericOption(genericModbusService.REGISTER_TYPE_OPTIONS, registerTypeIndex)
  171. return createGenericModbusDialogState({
  172. confirmText: isEdit ? '保存' : '确认',
  173. groupId: isEdit ? group.id : '',
  174. groupName: isEdit ? group.name : '寄存器组',
  175. layout: isEdit ? (group.layout || 'register') : 'register',
  176. mode: isEdit ? 'editGroup' : 'createGroup',
  177. quantity: isEdit ? String(group.quantity || 1) : '1',
  178. registerTypeIndex,
  179. registerTypeText: registerType.label || '',
  180. startAddress: isEdit && group.startAddressText ? group.startAddressText.replace(/^0x/i, '') : '0000',
  181. title: isEdit ? '编辑寄存器组' : '添加寄存器组',
  182. visible: true
  183. })
  184. }
  185. function createGenericRegisterDialogState(mode, group, register, registerIndex) {
  186. const isView = mode === 'viewRegister'
  187. const dataTypeIndex = register.dataTypeIndex || 0
  188. const dataType = getGenericOption(genericModbusService.DATA_TYPE_OPTIONS, dataTypeIndex)
  189. return createGenericModbusDialogState({
  190. cancelText: isView ? '关闭' : '取消',
  191. confirmText: isView ? '' : '保存',
  192. dataTypeIndex,
  193. dataTypeText: register.dataTypeText || dataType.label || '',
  194. groupId: group.id,
  195. groupName: group.name,
  196. mode,
  197. name: register.name,
  198. registerIndex,
  199. registerTypeIndex: group.registerTypeIndex || 0,
  200. remark: register.remark || '',
  201. startAddress: group.startAddressText ? group.startAddressText.replace(/^0x/i, '') : '0000',
  202. title: isView ? '寄存器信息' : '寄存器配置',
  203. textByteLength: String(register.textByteLength || '32'),
  204. showTextLength: !!register.showTextLength,
  205. unit: register.unit || '',
  206. visible: true,
  207. maxValue: register.maxValue || '',
  208. minValue: register.minValue || '',
  209. addressText: register.addressRangeText || register.addressText || '',
  210. displayValue: register.displayValue || '',
  211. rawValueText: register.rawValueText || '--',
  212. showDataType: !!register.showDataType,
  213. showRange: !!register.showRange,
  214. showUnit: !!register.showUnit,
  215. readOnly: isView
  216. })
  217. }
  218. function getGenericDialogDataTypeState(dialog, dataTypeOptions, dataTypeIndex) {
  219. const dataType = getGenericOption(dataTypeOptions, dataTypeIndex)
  220. const isTextType = dataType.kind === 'text'
  221. const showUnit = dataType.kind === 'number' && dataType.key !== 'hex'
  222. return {
  223. dataTypeIndex,
  224. dataTypeText: dataType.label || '',
  225. maxValue: isTextType ? '' : dialog.maxValue,
  226. minValue: isTextType ? '' : dialog.minValue,
  227. showRange: !isTextType,
  228. showTextLength: isTextType,
  229. showUnit,
  230. textByteLength: isTextType ? (dialog.textByteLength || '32') : dialog.textByteLength,
  231. unit: showUnit ? dialog.unit : ''
  232. }
  233. }
  234. function createGenericGroupConfig(dialog) {
  235. const registers = Array.isArray(dialog.parsedStructRegisters)
  236. ? dialog.parsedStructRegisters
  237. : []
  238. return {
  239. groupName: dialog.groupName,
  240. layout: registers.length ? 'struct' : (dialog.layout || 'register'),
  241. quantity: registers.length ? String(registers.length) : dialog.quantity,
  242. registerTypeIndex: dialog.registerTypeIndex,
  243. startAddress: dialog.startAddress,
  244. ...(registers.length ? {
  245. registers: registers.map((register) => ({
  246. dataType: register.dataType,
  247. isStructField: true,
  248. name: register.name,
  249. textByteLength: register.textByteLength
  250. }))
  251. } : {})
  252. }
  253. }
  254. function createGenericRegisterChangedData(dialog, dataTypeOptions) {
  255. const dataType = getGenericOption(dataTypeOptions, dialog.dataTypeIndex)
  256. const isTextType = dataType.kind === 'text'
  257. const showUnit = dataType.kind === 'number' && dataType.key !== 'hex'
  258. return {
  259. name: dialog.name,
  260. dataType: dataType.key,
  261. maxValue: isTextType ? '' : dialog.maxValue,
  262. minValue: isTextType ? '' : dialog.minValue,
  263. remark: dialog.remark,
  264. textByteLength: isTextType ? dialog.textByteLength : '',
  265. unit: showUnit ? dialog.unit : ''
  266. }
  267. }
  268. function findGenericGroup(groups, groupId) {
  269. return (groups || []).find((item) => item.id === groupId) || null
  270. }
  271. function findGenericRegister(groups, groupId, registerIndex) {
  272. const group = findGenericGroup(groups, groupId)
  273. const register = group && group.registers ? group.registers[registerIndex] : null
  274. return {
  275. group,
  276. register
  277. }
  278. }
  279. function getActiveGenericGroup(groups, groupId) {
  280. return findGenericGroup(groups, groupId) || null
  281. }
  282. module.exports = {
  283. createGenericGroupConfig,
  284. createGenericGroupDialogState,
  285. createGenericModbusDialogState,
  286. createGenericRegisterChangedData,
  287. createGenericRegisterDialogState,
  288. findGenericGroup,
  289. findGenericRegister,
  290. getActiveGenericGroup,
  291. getCombinedGroupKeys,
  292. getCombinedGroupLabel,
  293. getControlViewState,
  294. getGenericDialogDataTypeState,
  295. getGenericOption,
  296. getGroupLabel,
  297. getPageState,
  298. getSettingsPageState,
  299. getVisiblePageState,
  300. hasWritableGroupChanges,
  301. resolveActiveParamView
  302. }