params-view-model.js 9.3 KB

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