multiple-registers.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. const {
  2. DATA_TYPE_OPTIONS,
  3. getDataType,
  4. getRegisterEncodedWords,
  5. isByteRegister,
  6. isTextRegister,
  7. normalizeRegister,
  8. validateRegisterValue
  9. } = require('../../domain/parameter-groups/model.js')
  10. function normalizeManualMultipleQuantity(value) {
  11. const text = String(value === undefined || value === null ? '' : value).trim()
  12. if (!text) return 1
  13. if (/^[0-9a-fA-F]+$/.test(text)) return Math.max(1, Math.min(parseInt(text, 16), 0x007B))
  14. const numberValue = Number(text)
  15. return Number.isFinite(numberValue) ? Math.max(1, Math.min(Math.round(numberValue), 0x007B)) : 1
  16. }
  17. function formatManualMultipleQuantity(quantity) {
  18. return Number(quantity || 1).toString(16).toUpperCase().padStart(4, '0')
  19. }
  20. function createManualMultipleRegister(index, value = {}) {
  21. const dataType = getDataType(value.dataType || 'hex')
  22. const register = normalizeRegister({
  23. dataType: dataType.key,
  24. inputValue: value.inputValue === undefined ? '' : value.inputValue,
  25. name: `寄存器 ${index + 1}`,
  26. textByteLength: value.textByteLength || (isTextRegister(dataType.key) ? '32' : '')
  27. }, {
  28. registerType: 'holding'
  29. }, index, Number(value.address || 0), 0)
  30. return {
  31. ...register,
  32. dataTypeIndex: DATA_TYPE_OPTIONS.findIndex((item) => item.key === register.dataType),
  33. inputValue: value.inputValue === undefined ? '' : value.inputValue
  34. }
  35. }
  36. function getManualRegisterWordCount(register) {
  37. return Math.max(1, Number(register && register.registerCount) || 1)
  38. }
  39. function normalizeManualMultipleValues(wordQuantity, values = [], startAddress = 0) {
  40. const result = []
  41. let address = Number(startAddress) || 0
  42. const endAddress = address + Math.max(1, Number(wordQuantity) || 1)
  43. let sourceIndex = 0
  44. while (address < endAddress) {
  45. const current = values[sourceIndex] || {}
  46. let register = createManualMultipleRegister(result.length, {
  47. ...current,
  48. address
  49. })
  50. const remainingWords = endAddress - address
  51. if (getManualRegisterWordCount(register) > remainingWords) {
  52. register = createManualMultipleRegister(result.length, {
  53. ...current,
  54. address,
  55. dataType: 'hex',
  56. inputValue: ''
  57. })
  58. }
  59. result.push(register)
  60. address += getManualRegisterWordCount(register)
  61. sourceIndex += 1
  62. }
  63. return result
  64. }
  65. function getManualMultipleWords(values = []) {
  66. const words = []
  67. values.forEach((register) => {
  68. if (isByteRegister(register.dataType)) {
  69. const registerWords = getRegisterEncodedWords(register)
  70. if (!Array.isArray(registerWords) || !registerWords.length) throw new Error(`${register.name} 输入值无效`)
  71. words.push(Number(registerWords[0]) & 0x00FF)
  72. return
  73. }
  74. const registerWords = getRegisterEncodedWords(register)
  75. if (!Array.isArray(registerWords) || !registerWords.length) throw new Error(`${register.name} 输入值无效`)
  76. registerWords.forEach((word) => words.push(Number(word) & 0xFFFF))
  77. })
  78. return words
  79. }
  80. function getManualMultipleValueText(values = []) {
  81. try {
  82. return getManualMultipleWords(values).map((word) => word.toString(16).toUpperCase().padStart(4, '0')).join(' ')
  83. } catch (error) {
  84. return ''
  85. }
  86. }
  87. function getManualMultipleDataType(dataTypeIndex) {
  88. return DATA_TYPE_OPTIONS[Number(dataTypeIndex)] || DATA_TYPE_OPTIONS[0]
  89. }
  90. function updateManualMultipleValue(values = [], index, value) {
  91. const registerIndex = Number(index)
  92. return values.map((register, currentIndex) => (
  93. currentIndex === registerIndex
  94. ? {
  95. ...register,
  96. inputValue: value
  97. }
  98. : register
  99. ))
  100. }
  101. function updateManualMultipleType(values = [], index, dataTypeIndex) {
  102. const registerIndex = Number(index)
  103. const dataType = getManualMultipleDataType(dataTypeIndex)
  104. return values.map((register, currentIndex) => (
  105. currentIndex === registerIndex
  106. ? createManualMultipleRegister(currentIndex, {
  107. ...register,
  108. dataType: dataType.key,
  109. inputValue: '',
  110. textByteLength: isTextRegister(dataType.key) ? (register.textByteLength || '32') : ''
  111. })
  112. : register
  113. ))
  114. }
  115. function updateManualMultipleTextLength(values = [], index, value) {
  116. const registerIndex = Number(index)
  117. return values.map((register, currentIndex) => (
  118. currentIndex === registerIndex
  119. ? createManualMultipleRegister(currentIndex, {
  120. ...register,
  121. textByteLength: value
  122. })
  123. : register
  124. ))
  125. }
  126. function validateManualMultipleValue(values = [], index, value) {
  127. const register = values[Number(index)]
  128. if (!register) return false
  129. return validateRegisterValue(register, value)
  130. }
  131. module.exports = {
  132. DATA_TYPE_OPTIONS,
  133. createManualMultipleRegister,
  134. formatManualMultipleQuantity,
  135. getManualMultipleDataType,
  136. getManualMultipleValueText,
  137. getManualMultipleWords,
  138. normalizeManualMultipleQuantity,
  139. normalizeManualMultipleValues,
  140. updateManualMultipleTextLength,
  141. updateManualMultipleType,
  142. updateManualMultipleValue,
  143. validateManualMultipleValue
  144. }