1
0

state-mappers.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. const storageAccessIo = require('./storage-access-io.js')
  2. const {
  3. decodeRegisterFromByteCache,
  4. decodeRegisterFromWordCache,
  5. decodeRegisterValue,
  6. formatCoilDisplayValue,
  7. formatRegisterValue,
  8. normalizeRegister,
  9. getRegisterBytesFromByteCache,
  10. getRegisterWordsFromByteCache,
  11. getRegisterWordsFromWordCache,
  12. registerTypeIsBit
  13. } = require('../../domain/parameter-groups/model.js')
  14. function normalizeNumericCache(source = {}) {
  15. const cache = {}
  16. Object.keys(source || {}).forEach((addressText) => {
  17. const numericAddress = Number(addressText)
  18. if (Number.isFinite(numericAddress)) {
  19. cache[numericAddress] = Number(source[addressText]) & 0xFFFF
  20. }
  21. })
  22. return cache
  23. }
  24. function createRegisterStateFromCache(group, register, wordCache) {
  25. const rawBytes = registerTypeIsBit(register)
  26. ? []
  27. : (storageAccessIo.isByteAddressedGroup(group) ? getRegisterBytesFromByteCache(register, wordCache) : [])
  28. const rawWords = registerTypeIsBit(register)
  29. ? []
  30. : (storageAccessIo.isByteAddressedGroup(group)
  31. ? getRegisterWordsFromByteCache(register, wordCache)
  32. : getRegisterWordsFromWordCache(register, wordCache))
  33. const rawValue = registerTypeIsBit(register)
  34. ? decodeRegisterFromWordCache(register, wordCache)
  35. : (storageAccessIo.isByteAddressedGroup(group)
  36. ? decodeRegisterFromByteCache(register, wordCache)
  37. : (rawWords ? decodeRegisterValue(register, rawWords) : null))
  38. const displayValue = rawValue === null || rawValue === undefined
  39. ? '--'
  40. : (registerTypeIsBit(register)
  41. ? formatCoilDisplayValue(rawValue)
  42. : formatRegisterValue(register, rawValue))
  43. const preNormalizedRegister = {
  44. ...register,
  45. displayValue,
  46. isDirty: false,
  47. rawBytes: rawBytes || [],
  48. rawValue,
  49. rawWords: rawWords || []
  50. }
  51. const nextRegister = normalizeRegister(preNormalizedRegister, group, 0, register.address, register.byteOffset)
  52. return {
  53. ...nextRegister,
  54. id: register.id,
  55. inputValue: group.writable ? displayValue : register.inputValue
  56. }
  57. }
  58. function applyReadCacheToGroup(group, wordCache) {
  59. return {
  60. ...group,
  61. registers: group.registers.map((register) => createRegisterStateFromCache(group, register, wordCache))
  62. }
  63. }
  64. function applyWrittenSnapshotToRegister(register, snapshot = {}) {
  65. const hasDisplayValue = Object.prototype.hasOwnProperty.call(snapshot, 'displayValue')
  66. const hasRawBytes = Object.prototype.hasOwnProperty.call(snapshot, 'rawBytes')
  67. const hasRawValue = Object.prototype.hasOwnProperty.call(snapshot, 'rawValue')
  68. const hasRawWords = Object.prototype.hasOwnProperty.call(snapshot, 'rawWords')
  69. const nextRegister = {
  70. ...register,
  71. displayValue: hasDisplayValue ? snapshot.displayValue : register.displayValue,
  72. inputValue: hasDisplayValue ? snapshot.displayValue : register.inputValue,
  73. isDirty: false,
  74. rawBytes: hasRawBytes ? snapshot.rawBytes : register.rawBytes,
  75. rawValue: hasRawValue ? snapshot.rawValue : register.rawValue,
  76. rawWords: hasRawWords ? snapshot.rawWords : register.rawWords
  77. }
  78. return nextRegister
  79. }
  80. function applyWrittenSnapshotsToGroup(group, snapshots = []) {
  81. let writtenIndex = 0
  82. return {
  83. ...group,
  84. registers: group.registers.map((register, index) => {
  85. const snapshot = snapshots[writtenIndex] || {}
  86. writtenIndex += 1
  87. const nextRegister = applyWrittenSnapshotToRegister(register, snapshot)
  88. const normalized = normalizeRegister(nextRegister, group, index, nextRegister.address, nextRegister.byteOffset)
  89. return {
  90. ...normalized,
  91. id: register.id,
  92. inputValue: group.writable ? nextRegister.displayValue : nextRegister.inputValue
  93. }
  94. })
  95. }
  96. }
  97. function applyWrittenSnapshotToGroupRegister(group, registerIndex, snapshot) {
  98. return {
  99. ...group,
  100. registers: group.registers.map((register, currentIndex) => (
  101. currentIndex === registerIndex
  102. ? (() => {
  103. const nextRegister = applyWrittenSnapshotToRegister(register, snapshot || {})
  104. const normalized = normalizeRegister(nextRegister, group, currentIndex, nextRegister.address, nextRegister.byteOffset)
  105. return {
  106. ...normalized,
  107. id: register.id,
  108. inputValue: group.writable ? nextRegister.displayValue : nextRegister.inputValue
  109. }
  110. })()
  111. : register
  112. ))
  113. }
  114. }
  115. module.exports = {
  116. applyReadCacheToGroup,
  117. applyWrittenSnapshotToGroupRegister,
  118. applyWrittenSnapshotsToGroup,
  119. normalizeNumericCache
  120. }