@zwave-js/nvmedit 15.1.1 → 15.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/build/cjs/cli.d.ts +1 -1
  2. package/build/cjs/cli.js +1 -2
  3. package/build/cjs/cli.js.map +2 -2
  4. package/build/cjs/convert.d.ts +3 -3
  5. package/build/cjs/convert.js +45 -45
  6. package/build/cjs/convert.js.map +3 -3
  7. package/build/cjs/lib/NVM3.js +17 -17
  8. package/build/cjs/lib/NVM3.js.map +3 -3
  9. package/build/cjs/lib/NVM500.js +54 -54
  10. package/build/cjs/lib/NVM500.js.map +3 -3
  11. package/build/cjs/lib/common/definitions.d.ts +5 -5
  12. package/build/cjs/lib/common/definitions.js.map +1 -1
  13. package/build/cjs/lib/common/routeCache.d.ts +2 -2
  14. package/build/cjs/lib/common/routeCache.js +10 -10
  15. package/build/cjs/lib/common/routeCache.js.map +3 -3
  16. package/build/cjs/lib/common/sucUpdateEntry.d.ts +1 -1
  17. package/build/cjs/lib/common/sucUpdateEntry.js +4 -4
  18. package/build/cjs/lib/common/sucUpdateEntry.js.map +1 -1
  19. package/build/cjs/lib/common/utils.js +6 -6
  20. package/build/cjs/lib/common/utils.js.map +2 -2
  21. package/build/cjs/lib/io/BufferedNVMReader.d.ts +1 -1
  22. package/build/cjs/lib/io/BufferedNVMReader.js +2 -2
  23. package/build/cjs/lib/io/BufferedNVMReader.js.map +2 -2
  24. package/build/cjs/lib/nvm3/adapter.d.ts +2 -2
  25. package/build/cjs/lib/nvm3/adapter.js +6 -6
  26. package/build/cjs/lib/nvm3/adapter.js.map +3 -3
  27. package/build/cjs/lib/nvm3/files/ApplicationCCsFile.d.ts +2 -2
  28. package/build/cjs/lib/nvm3/files/ApplicationCCsFile.js +6 -6
  29. package/build/cjs/lib/nvm3/files/ApplicationCCsFile.js.map +3 -3
  30. package/build/cjs/lib/nvm3/files/ApplicationDataFile.d.ts +1 -1
  31. package/build/cjs/lib/nvm3/files/ApplicationDataFile.js.map +1 -1
  32. package/build/cjs/lib/nvm3/files/ApplicationNameFile.d.ts +1 -1
  33. package/build/cjs/lib/nvm3/files/ApplicationNameFile.js.map +1 -1
  34. package/build/cjs/lib/nvm3/files/ApplicationRFConfigFile.d.ts +2 -2
  35. package/build/cjs/lib/nvm3/files/ApplicationRFConfigFile.js +9 -9
  36. package/build/cjs/lib/nvm3/files/ApplicationRFConfigFile.js.map +3 -3
  37. package/build/cjs/lib/nvm3/files/ApplicationTypeFile.d.ts +1 -1
  38. package/build/cjs/lib/nvm3/files/ApplicationTypeFile.js +2 -2
  39. package/build/cjs/lib/nvm3/files/ApplicationTypeFile.js.map +2 -2
  40. package/build/cjs/lib/nvm3/files/ControllerInfoFile.js +3 -3
  41. package/build/cjs/lib/nvm3/files/ControllerInfoFile.js.map +2 -2
  42. package/build/cjs/lib/nvm3/files/NVMFile.js +4 -4
  43. package/build/cjs/lib/nvm3/files/NVMFile.js.map +2 -2
  44. package/build/cjs/lib/nvm3/files/NodeInfoFiles.d.ts +2 -2
  45. package/build/cjs/lib/nvm3/files/NodeInfoFiles.js +18 -18
  46. package/build/cjs/lib/nvm3/files/NodeInfoFiles.js.map +3 -3
  47. package/build/cjs/lib/nvm3/files/ProtocolNodeMaskFiles.d.ts +1 -1
  48. package/build/cjs/lib/nvm3/files/ProtocolNodeMaskFiles.js +5 -5
  49. package/build/cjs/lib/nvm3/files/ProtocolNodeMaskFiles.js.map +1 -1
  50. package/build/cjs/lib/nvm3/files/RouteCacheFiles.d.ts +1 -1
  51. package/build/cjs/lib/nvm3/files/RouteCacheFiles.js +11 -11
  52. package/build/cjs/lib/nvm3/files/RouteCacheFiles.js.map +3 -3
  53. package/build/cjs/lib/nvm3/files/SUCUpdateEntriesFile.d.ts +1 -1
  54. package/build/cjs/lib/nvm3/files/SUCUpdateEntriesFile.js +3 -3
  55. package/build/cjs/lib/nvm3/files/SUCUpdateEntriesFile.js.map +2 -2
  56. package/build/cjs/lib/nvm3/files/index.d.ts +0 -1
  57. package/build/cjs/lib/nvm3/files/index.js +0 -1
  58. package/build/cjs/lib/nvm3/files/index.js.map +2 -2
  59. package/build/cjs/lib/nvm3/page.d.ts +1 -1
  60. package/build/cjs/lib/nvm3/page.js.map +1 -1
  61. package/build/cjs/lib/nvm3/utils.d.ts +1 -1
  62. package/build/cjs/lib/nvm3/utils.js +3 -3
  63. package/build/cjs/lib/nvm3/utils.js.map +1 -1
  64. package/build/cjs/lib/nvm500/EntryParsers.d.ts +2 -2
  65. package/build/cjs/lib/nvm500/EntryParsers.js +10 -10
  66. package/build/cjs/lib/nvm500/EntryParsers.js.map +3 -3
  67. package/build/cjs/lib/nvm500/adapter.d.ts +2 -2
  68. package/build/cjs/lib/nvm500/adapter.js.map +1 -1
  69. package/build/cjs/lib/nvm500/impls/Bridge_6_6x.d.ts +1 -1
  70. package/build/cjs/lib/nvm500/impls/Bridge_6_6x.js +7 -7
  71. package/build/cjs/lib/nvm500/impls/Bridge_6_6x.js.map +2 -2
  72. package/build/cjs/lib/nvm500/impls/Bridge_6_7x.d.ts +1 -1
  73. package/build/cjs/lib/nvm500/impls/Bridge_6_7x.js +7 -7
  74. package/build/cjs/lib/nvm500/impls/Bridge_6_7x.js.map +2 -2
  75. package/build/cjs/lib/nvm500/impls/Bridge_6_8x.d.ts +1 -1
  76. package/build/cjs/lib/nvm500/impls/Bridge_6_8x.js +7 -7
  77. package/build/cjs/lib/nvm500/impls/Bridge_6_8x.js.map +2 -2
  78. package/build/cjs/lib/nvm500/impls/Static_6_6x.d.ts +1 -1
  79. package/build/cjs/lib/nvm500/impls/Static_6_6x.js +7 -7
  80. package/build/cjs/lib/nvm500/impls/Static_6_6x.js.map +2 -2
  81. package/build/cjs/lib/nvm500/impls/Static_6_7x.d.ts +1 -1
  82. package/build/cjs/lib/nvm500/impls/Static_6_7x.js +7 -7
  83. package/build/cjs/lib/nvm500/impls/Static_6_7x.js.map +2 -2
  84. package/build/cjs/lib/nvm500/impls/Static_6_8x.d.ts +1 -1
  85. package/build/cjs/lib/nvm500/impls/Static_6_8x.js +7 -7
  86. package/build/cjs/lib/nvm500/impls/Static_6_8x.js.map +2 -2
  87. package/build/cjs/lib/nvm500/shared.d.ts +2 -2
  88. package/build/cjs/lib/nvm500/shared.js +2 -2
  89. package/build/cjs/lib/nvm500/shared.js.map +1 -1
  90. package/build/cjs/nvm500/NVMParser.d.ts +5 -5
  91. package/build/cjs/package.json +2 -1
  92. package/build/esm/cli.d.ts +1 -1
  93. package/build/esm/cli.d.ts.map +1 -1
  94. package/build/esm/cli.js +1 -2
  95. package/build/esm/cli.js.map +1 -1
  96. package/build/esm/convert.d.ts +3 -3
  97. package/build/esm/convert.d.ts.map +1 -1
  98. package/build/esm/convert.js +2 -2
  99. package/build/esm/convert.js.map +1 -1
  100. package/build/esm/lib/NVM3.js +2 -2
  101. package/build/esm/lib/NVM3.js.map +1 -1
  102. package/build/esm/lib/NVM500.js +1 -1
  103. package/build/esm/lib/NVM500.js.map +1 -1
  104. package/build/esm/lib/common/definitions.d.ts +5 -5
  105. package/build/esm/lib/common/definitions.d.ts.map +1 -1
  106. package/build/esm/lib/common/routeCache.d.ts +2 -2
  107. package/build/esm/lib/common/routeCache.d.ts.map +1 -1
  108. package/build/esm/lib/common/routeCache.js +2 -2
  109. package/build/esm/lib/common/routeCache.js.map +1 -1
  110. package/build/esm/lib/common/sucUpdateEntry.d.ts +1 -1
  111. package/build/esm/lib/common/sucUpdateEntry.d.ts.map +1 -1
  112. package/build/esm/lib/common/sucUpdateEntry.js +1 -1
  113. package/build/esm/lib/common/sucUpdateEntry.js.map +1 -1
  114. package/build/esm/lib/common/utils.js +1 -1
  115. package/build/esm/lib/common/utils.js.map +1 -1
  116. package/build/esm/lib/io/BufferedNVMReader.d.ts +1 -1
  117. package/build/esm/lib/io/BufferedNVMReader.d.ts.map +1 -1
  118. package/build/esm/lib/io/BufferedNVMReader.js +1 -1
  119. package/build/esm/lib/io/BufferedNVMReader.js.map +1 -1
  120. package/build/esm/lib/nvm3/adapter.d.ts +2 -2
  121. package/build/esm/lib/nvm3/adapter.d.ts.map +1 -1
  122. package/build/esm/lib/nvm3/adapter.js +2 -2
  123. package/build/esm/lib/nvm3/adapter.js.map +1 -1
  124. package/build/esm/lib/nvm3/files/ApplicationCCsFile.d.ts +2 -2
  125. package/build/esm/lib/nvm3/files/ApplicationCCsFile.d.ts.map +1 -1
  126. package/build/esm/lib/nvm3/files/ApplicationCCsFile.js +2 -2
  127. package/build/esm/lib/nvm3/files/ApplicationCCsFile.js.map +1 -1
  128. package/build/esm/lib/nvm3/files/ApplicationDataFile.d.ts +1 -1
  129. package/build/esm/lib/nvm3/files/ApplicationDataFile.d.ts.map +1 -1
  130. package/build/esm/lib/nvm3/files/ApplicationNameFile.d.ts +1 -1
  131. package/build/esm/lib/nvm3/files/ApplicationNameFile.d.ts.map +1 -1
  132. package/build/esm/lib/nvm3/files/ApplicationRFConfigFile.d.ts +2 -2
  133. package/build/esm/lib/nvm3/files/ApplicationRFConfigFile.d.ts.map +1 -1
  134. package/build/esm/lib/nvm3/files/ApplicationRFConfigFile.js +2 -2
  135. package/build/esm/lib/nvm3/files/ApplicationRFConfigFile.js.map +1 -1
  136. package/build/esm/lib/nvm3/files/ApplicationTypeFile.d.ts +1 -1
  137. package/build/esm/lib/nvm3/files/ApplicationTypeFile.d.ts.map +1 -1
  138. package/build/esm/lib/nvm3/files/ApplicationTypeFile.js +1 -1
  139. package/build/esm/lib/nvm3/files/ApplicationTypeFile.js.map +1 -1
  140. package/build/esm/lib/nvm3/files/ControllerInfoFile.d.ts.map +1 -1
  141. package/build/esm/lib/nvm3/files/ControllerInfoFile.js +1 -1
  142. package/build/esm/lib/nvm3/files/ControllerInfoFile.js.map +1 -1
  143. package/build/esm/lib/nvm3/files/NVMFile.js +1 -1
  144. package/build/esm/lib/nvm3/files/NVMFile.js.map +1 -1
  145. package/build/esm/lib/nvm3/files/NodeInfoFiles.d.ts +2 -2
  146. package/build/esm/lib/nvm3/files/NodeInfoFiles.d.ts.map +1 -1
  147. package/build/esm/lib/nvm3/files/NodeInfoFiles.js +2 -2
  148. package/build/esm/lib/nvm3/files/NodeInfoFiles.js.map +1 -1
  149. package/build/esm/lib/nvm3/files/ProtocolNodeMaskFiles.d.ts +1 -1
  150. package/build/esm/lib/nvm3/files/ProtocolNodeMaskFiles.d.ts.map +1 -1
  151. package/build/esm/lib/nvm3/files/ProtocolNodeMaskFiles.js +1 -1
  152. package/build/esm/lib/nvm3/files/ProtocolNodeMaskFiles.js.map +1 -1
  153. package/build/esm/lib/nvm3/files/RouteCacheFiles.d.ts +1 -1
  154. package/build/esm/lib/nvm3/files/RouteCacheFiles.d.ts.map +1 -1
  155. package/build/esm/lib/nvm3/files/RouteCacheFiles.js +2 -2
  156. package/build/esm/lib/nvm3/files/RouteCacheFiles.js.map +1 -1
  157. package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.d.ts +1 -1
  158. package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.d.ts.map +1 -1
  159. package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.js +1 -1
  160. package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.js.map +1 -1
  161. package/build/esm/lib/nvm3/files/index.d.ts +0 -1
  162. package/build/esm/lib/nvm3/files/index.d.ts.map +1 -1
  163. package/build/esm/lib/nvm3/files/index.js +0 -1
  164. package/build/esm/lib/nvm3/files/index.js.map +1 -1
  165. package/build/esm/lib/nvm3/page.d.ts +1 -1
  166. package/build/esm/lib/nvm3/page.d.ts.map +1 -1
  167. package/build/esm/lib/nvm3/utils.d.ts +1 -1
  168. package/build/esm/lib/nvm3/utils.d.ts.map +1 -1
  169. package/build/esm/lib/nvm3/utils.js +1 -1
  170. package/build/esm/lib/nvm3/utils.js.map +1 -1
  171. package/build/esm/lib/nvm500/EntryParsers.d.ts +2 -2
  172. package/build/esm/lib/nvm500/EntryParsers.d.ts.map +1 -1
  173. package/build/esm/lib/nvm500/EntryParsers.js +2 -2
  174. package/build/esm/lib/nvm500/EntryParsers.js.map +1 -1
  175. package/build/esm/lib/nvm500/adapter.d.ts +2 -2
  176. package/build/esm/lib/nvm500/adapter.d.ts.map +1 -1
  177. package/build/esm/lib/nvm500/impls/Bridge_6_6x.d.ts +1 -1
  178. package/build/esm/lib/nvm500/impls/Bridge_6_6x.d.ts.map +1 -1
  179. package/build/esm/lib/nvm500/impls/Bridge_6_6x.js +1 -1
  180. package/build/esm/lib/nvm500/impls/Bridge_6_6x.js.map +1 -1
  181. package/build/esm/lib/nvm500/impls/Bridge_6_7x.d.ts +1 -1
  182. package/build/esm/lib/nvm500/impls/Bridge_6_7x.d.ts.map +1 -1
  183. package/build/esm/lib/nvm500/impls/Bridge_6_7x.js +1 -1
  184. package/build/esm/lib/nvm500/impls/Bridge_6_7x.js.map +1 -1
  185. package/build/esm/lib/nvm500/impls/Bridge_6_8x.d.ts +1 -1
  186. package/build/esm/lib/nvm500/impls/Bridge_6_8x.d.ts.map +1 -1
  187. package/build/esm/lib/nvm500/impls/Bridge_6_8x.js +1 -1
  188. package/build/esm/lib/nvm500/impls/Bridge_6_8x.js.map +1 -1
  189. package/build/esm/lib/nvm500/impls/Static_6_6x.d.ts +1 -1
  190. package/build/esm/lib/nvm500/impls/Static_6_6x.d.ts.map +1 -1
  191. package/build/esm/lib/nvm500/impls/Static_6_6x.js +1 -1
  192. package/build/esm/lib/nvm500/impls/Static_6_6x.js.map +1 -1
  193. package/build/esm/lib/nvm500/impls/Static_6_7x.d.ts +1 -1
  194. package/build/esm/lib/nvm500/impls/Static_6_7x.d.ts.map +1 -1
  195. package/build/esm/lib/nvm500/impls/Static_6_7x.js +1 -1
  196. package/build/esm/lib/nvm500/impls/Static_6_7x.js.map +1 -1
  197. package/build/esm/lib/nvm500/impls/Static_6_8x.d.ts +1 -1
  198. package/build/esm/lib/nvm500/impls/Static_6_8x.d.ts.map +1 -1
  199. package/build/esm/lib/nvm500/impls/Static_6_8x.js +1 -1
  200. package/build/esm/lib/nvm500/impls/Static_6_8x.js.map +1 -1
  201. package/build/esm/lib/nvm500/shared.d.ts +2 -2
  202. package/build/esm/lib/nvm500/shared.d.ts.map +1 -1
  203. package/build/esm/lib/nvm500/shared.js +1 -1
  204. package/build/esm/lib/nvm500/shared.js.map +1 -1
  205. package/build/esm/nvm500/NVMParser.d.ts +5 -5
  206. package/build/esm/nvm500/NVMParser.d.ts.map +1 -1
  207. package/build/esm/package.json +2 -1
  208. package/package.json +4 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/NVM3.ts"],
4
- "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core/safe\";\nimport { Bytes, getEnumMemberName, num2hex } from \"@zwave-js/shared/safe\";\nimport { type NVM, NVMAccess, type NVMIO } from \"./common/definitions.js\";\nimport {\n\tnvmReadBuffer,\n\tnvmReadUInt32LE,\n\tnvmWriteBuffer,\n} from \"./common/utils.js\";\nimport {\n\tFLASH_MAX_PAGE_SIZE_700,\n\tFLASH_MAX_PAGE_SIZE_800,\n\tFragmentType,\n\tNVM3_CODE_LARGE_SHIFT,\n\tNVM3_CODE_SMALL_SHIFT,\n\tNVM3_COUNTER_SIZE,\n\tNVM3_MAX_OBJ_SIZE_SMALL,\n\tNVM3_OBJ_FRAGTYPE_MASK,\n\tNVM3_OBJ_FRAGTYPE_SHIFT,\n\tNVM3_OBJ_HEADER_SIZE_LARGE,\n\tNVM3_OBJ_KEY_MASK,\n\tNVM3_OBJ_KEY_SHIFT,\n\tNVM3_OBJ_LARGE_LEN_MASK,\n\tNVM3_OBJ_TYPE_MASK,\n\tNVM3_PAGE_COUNTER_MASK,\n\tNVM3_PAGE_COUNTER_SIZE,\n\tNVM3_PAGE_HEADER_SIZE,\n\tNVM3_PAGE_MAGIC,\n\tObjectType,\n\tPageStatus,\n\tPageWriteSize,\n\tZWAVE_APPLICATION_NVM_SIZE,\n} from \"./nvm3/consts.js\";\nimport {\n\tApplicationVersionFile800ID,\n\ttype NVMSection,\n\tgetNVMSectionByFileID,\n} from \"./nvm3/files/index.js\";\nimport {\n\ttype NVM3Object,\n\ttype NVM3ObjectHeader,\n\tfragmentLargeObject,\n\tgetAlignedSize,\n\tgetObjectHeader,\n\tgetRequiredSpace,\n\tserializeObject,\n} from \"./nvm3/object.js\";\nimport {\n\ttype NVM3PageHeader,\n\tpageSizeFromBits,\n\tserializePageHeader,\n} from \"./nvm3/page.js\";\nimport { validateBergerCode, validateBergerCodeMulti } from \"./nvm3/utils.js\";\n\n// TODO: Possible optimizations:\n// Investigate if there is a better way to determine whether the NVM\n// uses a shared FS or not. The current implementation scans all objects\n// to find the 800 series application version file.\n// Alternatively, we could simply check if each page starts with an object header.\n// If yes, read the objects lazily when needed. If not, remember that the page is empty.\n\nexport type NVM3PageInfo = NVM3PageHeader & {\n\tobjects: NVM3ObjectHeader[];\n};\n\nexport interface NVM3SectionInfo {\n\tpages: NVM3PageInfo[];\n\t/** The index of the current page */\n\tcurrentPage: number;\n\t/** The next byte to write in the current page */\n\toffsetInPage: number;\n\t/** A map of file IDs and page indizes in which their last copy resides */\n\tobjectLocations: Map<number, number>;\n}\n\nexport type NVM3FileSystemInfo = {\n\tisSharedFileSystem: true;\n\tsections: Record<\"all\", NVM3SectionInfo>;\n} | {\n\tisSharedFileSystem: false;\n\tsections: Record<NVMSection, NVM3SectionInfo>;\n};\n\nexport interface NVM3Meta {\n\tsharedFileSystem: boolean;\n\tpageSize: number;\n\tdeviceFamily: number;\n\twriteSize: PageWriteSize;\n\tmemoryMapped: boolean;\n}\n\nexport type NVM3EraseOptions = Partial<NVM3Meta>;\n\nexport class NVM3 implements NVM<number, Uint8Array> {\n\tpublic constructor(io: NVMIO) {\n\t\tthis._io = io;\n\t}\n\n\tprivate _io: NVMIO;\n\tprivate _access: NVMAccess = NVMAccess.None;\n\n\tprivate _info: NVM3FileSystemInfo | undefined;\n\tpublic get info(): NVM3FileSystemInfo | undefined {\n\t\treturn this._info;\n\t}\n\n\tprivate async ensureReadable(): Promise<void> {\n\t\tif (\n\t\t\tthis._access === NVMAccess.Read\n\t\t\t|| this._access === NVMAccess.ReadWrite\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._access === NVMAccess.Write) {\n\t\t\tawait this._io.close();\n\t\t}\n\t\tthis._access = await this._io.open(NVMAccess.Read);\n\t}\n\n\tprivate async ensureWritable(): Promise<void> {\n\t\tif (\n\t\t\tthis._access === NVMAccess.Write\n\t\t\t|| this._access === NVMAccess.ReadWrite\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._access === NVMAccess.Read) {\n\t\t\tawait this._io.close();\n\t\t}\n\t\tthis._access = await this._io.open(NVMAccess.Write);\n\t}\n\n\tpublic async init(): Promise<NVM3FileSystemInfo> {\n\t\tawait this.ensureReadable();\n\n\t\tlet pageOffset = 0;\n\t\t// Determine NVM size, scan pages\n\t\tconst pages: NVM3PageInfo[] = [];\n\t\tlet isSharedFileSystem = false;\n\t\twhile (pageOffset < this._io.size) {\n\t\t\t// console.debug(\n\t\t\t// \t`NVM3 init() - reading page header at offset ${\n\t\t\t// \t\tnum2hex(pageOffset)\n\t\t\t// \t}`,\n\t\t\t// );\n\t\t\tconst header = await readPageHeader(this._io, pageOffset);\n\t\t\tpages.push({\n\t\t\t\t...header,\n\t\t\t\tobjects: [],\n\t\t\t});\n\t\t\tpageOffset += header.pageSize;\n\t\t}\n\n\t\t// Scan each page for objects\n\t\tfor (const page of pages) {\n\t\t\t// Scan objects in this page\n\t\t\tlet objectOffset = page.offset + NVM3_PAGE_HEADER_SIZE;\n\t\t\tconst nextPageOffset = page.offset + page.pageSize;\n\t\t\twhile (objectOffset < nextPageOffset) {\n\t\t\t\t// console.debug(\n\t\t\t\t// \t`NVM3 init() - reading object header. page offset ${\n\t\t\t\t// \t\tnum2hex(page.offset)\n\t\t\t\t// \t}, object offset ${num2hex(objectOffset)}`,\n\t\t\t\t// );\n\t\t\t\tconst objectHeader = await readObjectHeader(\n\t\t\t\t\tthis._io,\n\t\t\t\t\tobjectOffset,\n\t\t\t\t);\n\t\t\t\tif (objectHeader) {\n\t\t\t\t\tpage.objects.push(objectHeader);\n\t\t\t\t\tobjectOffset += objectHeader.alignedSize;\n\n\t\t\t\t\t// Detect the 800 series shared protocol & application NVM file system\n\t\t\t\t\t// by looking for the 800 series application version file\n\t\t\t\t\tif (objectHeader.key === ApplicationVersionFile800ID) {\n\t\t\t\t\t\tisSharedFileSystem = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Reached the end of the data in this page\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// By convention, we only use the applicationPages in that case\n\t\tlet applicationPages: NVM3PageInfo[];\n\t\tlet protocolPages: NVM3PageInfo[];\n\n\t\tif (isSharedFileSystem) {\n\t\t\tapplicationPages = pages;\n\t\t\tprotocolPages = [];\n\t\t} else {\n\t\t\tapplicationPages = pages.filter(\n\t\t\t\t(p) => p.offset < ZWAVE_APPLICATION_NVM_SIZE,\n\t\t\t);\n\t\t\tprotocolPages = pages.filter(\n\t\t\t\t(p) => p.offset >= ZWAVE_APPLICATION_NVM_SIZE,\n\t\t\t);\n\t\t}\n\n\t\t// NVM3 layouts pages in a ring buffer. Pages are written from front to back, then occupied pages\n\t\t// are erased and overwritten. Pages at the start of the memory section may have an erase count that's 1 higher\n\t\t// than the pages at the end.\n\t\tconst pageInfoToSectionInfo = (\n\t\t\tpages: NVM3PageInfo[],\n\t\t): NVM3SectionInfo => {\n\t\t\t// Find the current page, which is either:\n\t\t\t// - The last page with the high erase count that contains an object\n\t\t\tconst maxEraseCount = Math.max(...pages.map((p) => p.eraseCount));\n\t\t\tlet currentPageIndex = pages.findLastIndex((p) =>\n\t\t\t\tp.eraseCount === maxEraseCount && p.objects.length > 0\n\t\t\t);\n\t\t\t// - or if there is none, the last page with the lower erase count that contains an object\n\t\t\tif (currentPageIndex === -1) {\n\t\t\t\tcurrentPageIndex = pages.findLastIndex((p) =>\n\t\t\t\t\tp.objects.length > 0\n\t\t\t\t);\n\t\t\t}\n\t\t\t// - Or if no objects exist at all, the beginning of the section\n\t\t\tif (currentPageIndex === -1) currentPageIndex = 0;\n\n\t\t\t// Find the next free byte of the current page\n\t\t\tconst currentPage = pages[currentPageIndex];\n\t\t\tlet offset = NVM3_PAGE_HEADER_SIZE;\n\t\t\tfor (const object of currentPage.objects) {\n\t\t\t\toffset += object.alignedSize;\n\t\t\t}\n\n\t\t\tconst objectLocations = new Map<number, number>();\n\t\t\tfor (let i = 0; i < pages.length; i++) {\n\t\t\t\tconst page = pages[i];\n\t\t\t\tfor (const object of page.objects) {\n\t\t\t\t\tconst location = objectLocations.get(object.key);\n\t\t\t\t\tif (location == undefined) {\n\t\t\t\t\t\t// Object seen for the first time, remember the page it is in\n\t\t\t\t\t\tobjectLocations.set(object.key, i);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\t(object.fragmentType === FragmentType.None\n\t\t\t\t\t\t\t|| object.fragmentType === FragmentType.First)\n\t\t\t\t\t\t&& (page.eraseCount >= pages[location].eraseCount)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Object was seen before. Only remember it if it is the only\n\t\t\t\t\t\t// or first fragment and the object appears in a later location\n\t\t\t\t\t\t// of the ring buffer\n\t\t\t\t\t\tobjectLocations.set(object.key, i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tpages,\n\t\t\t\toffsetInPage: offset,\n\t\t\t\tcurrentPage: currentPageIndex,\n\t\t\t\tobjectLocations,\n\t\t\t};\n\t\t};\n\n\t\tif (isSharedFileSystem) {\n\t\t\tthis._info = {\n\t\t\t\tisSharedFileSystem: true,\n\t\t\t\tsections: {\n\t\t\t\t\tall: pageInfoToSectionInfo(applicationPages),\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tthis._info = {\n\t\t\t\tisSharedFileSystem: false,\n\t\t\t\tsections: {\n\t\t\t\t\tapplication: pageInfoToSectionInfo(applicationPages),\n\t\t\t\t\tprotocol: pageInfoToSectionInfo(protocolPages),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this._info;\n\t}\n\n\tprivate getNVMSectionForFile(fileId: number): NVM3SectionInfo {\n\t\t// Determine which ring buffer to read in\n\t\treturn this._info!.isSharedFileSystem\n\t\t\t? this._info!.sections.all\n\t\t\t: this._info!.sections[getNVMSectionByFileID(fileId)];\n\t}\n\n\tpublic async has(fileId: number): Promise<boolean> {\n\t\tthis._info ??= await this.init();\n\n\t\t// Determine which ring buffer to read in\n\t\tconst section = this.getNVMSectionForFile(fileId);\n\n\t\treturn section.objectLocations.has(fileId);\n\t}\n\n\tpublic readObjectData(object: NVM3ObjectHeader): Promise<Uint8Array> {\n\t\treturn nvmReadBuffer(\n\t\t\tthis._io,\n\t\t\tobject.offset + object.headerSize,\n\t\t\tobject.fragmentSize,\n\t\t);\n\t}\n\n\tpublic async get(fileId: number): Promise<Uint8Array | undefined> {\n\t\tthis._info ??= await this.init();\n\n\t\t// Determine which ring buffer to read in\n\t\tconst section = this.getNVMSectionForFile(fileId);\n\n\t\tconst pages = section.pages;\n\n\t\t// TODO: There should be no need for scanning, since we know the object locations after init().\n\n\t\t// Start scanning backwards through the pages ring buffer, starting with the current page\n\t\tlet parts: Uint8Array[] | undefined;\n\t\tlet complete = false;\n\t\tlet objType: ObjectType | undefined;\n\t\tconst resetFragments = () => {\n\t\t\t// if (parts?.length) {\n\t\t\t// \tconsole.debug(\"Resetting fragmented object\");\n\t\t\t// }\n\t\t\tparts = undefined;\n\t\t\tcomplete = false;\n\t\t};\n\t\tpages: for (let offset = 0; offset < pages.length; offset++) {\n\t\t\tconst index = (section.currentPage - offset + pages.length)\n\t\t\t\t% pages.length;\n\t\t\tconst page = pages[index];\n\t\t\t// console.debug(\n\t\t\t// \t`NVM3.get(${fileId}): scanning page ${index} at offset ${\n\t\t\t// \t\tnum2hex(page.offset)\n\t\t\t// \t}`,\n\t\t\t// );\n\t\t\t// Scan objects in this page, read backwards.\n\t\t\t// The last non-deleted object wins\n\t\t\tobjects: for (let j = page.objects.length - 1; j >= 0; j--) {\n\t\t\t\tconst object = page.objects[j];\n\n\t\t\t\tconst readObject = () => this.readObjectData(object);\n\n\t\t\t\tif (object.key !== fileId) {\n\t\t\t\t\t// Reset any fragmented objects when encountering a different key\n\t\t\t\t\tresetFragments();\n\t\t\t\t\tcontinue objects;\n\t\t\t\t}\n\n\t\t\t\tif (object.type === ObjectType.Deleted) {\n\t\t\t\t\t// Last action for this object was a deletion. There is no data.\n\t\t\t\t\treturn;\n\t\t\t\t} else if (object.fragmentType === FragmentType.None) {\n\t\t\t\t\t// console.debug(\n\t\t\t\t\t// \t`NVM3.get(${fileId}): found complete object - header offset ${\n\t\t\t\t\t// \t\tnum2hex(object.offset)\n\t\t\t\t\t// \t}, content offset ${\n\t\t\t\t\t// \t\tnum2hex(object.offset + object.headerSize)\n\t\t\t\t\t// \t}, length ${object.fragmentSize}`,\n\t\t\t\t\t// );\n\t\t\t\t\t// This is a complete object\n\t\t\t\t\tparts = [await readObject()];\n\t\t\t\t\tobjType = object.type;\n\t\t\t\t\tcomplete = true;\n\t\t\t\t\tbreak pages;\n\t\t\t\t} else if (object.fragmentType === FragmentType.Last) {\n\t\t\t\t\t// console.debug(\n\t\t\t\t\t// \t`NVM3.get(${fileId}): found LAST fragment - header offset ${\n\t\t\t\t\t// \t\tnum2hex(object.offset)\n\t\t\t\t\t// \t}, content offset ${\n\t\t\t\t\t// \t\tnum2hex(object.offset + object.headerSize)\n\t\t\t\t\t// \t}, length ${object.fragmentSize}`,\n\t\t\t\t\t// );\n\t\t\t\t\tparts = [await readObject()];\n\t\t\t\t\tobjType = object.type;\n\t\t\t\t\tcomplete = false;\n\t\t\t\t} else if (object.fragmentType === FragmentType.Next) {\n\t\t\t\t\tif (parts?.length && objType === object.type) {\n\t\t\t\t\t\t// console.debug(\n\t\t\t\t\t\t// \t`NVM3.get(${fileId}): found NEXT fragment - header offset ${\n\t\t\t\t\t\t// \t\tnum2hex(object.offset)\n\t\t\t\t\t\t// \t}, content offset ${\n\t\t\t\t\t\t// \t\tnum2hex(object.offset + object.headerSize)\n\t\t\t\t\t\t// \t}, length ${object.fragmentSize}`,\n\t\t\t\t\t\t// );\n\t\t\t\t\t\tparts.unshift(await readObject());\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This shouldn't be here\n\t\t\t\t\t\tresetFragments();\n\t\t\t\t\t}\n\t\t\t\t} else if (object.fragmentType === FragmentType.First) {\n\t\t\t\t\tif (parts?.length && objType === object.type) {\n\t\t\t\t\t\t// console.debug(\n\t\t\t\t\t\t// \t`NVM3.get(${fileId}): found FIRST fragment - header offset ${\n\t\t\t\t\t\t// \t\tnum2hex(object.offset)\n\t\t\t\t\t\t// \t}, content offset ${\n\t\t\t\t\t\t// \t\tnum2hex(object.offset + object.headerSize)\n\t\t\t\t\t\t// \t}, length ${object.fragmentSize}`,\n\t\t\t\t\t\t// );\n\t\t\t\t\t\tparts.unshift(await readObject());\n\t\t\t\t\t\tcomplete = true;\n\t\t\t\t\t\tbreak pages;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This shouldn't be here\n\t\t\t\t\t\tresetFragments();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!parts?.length || !complete || objType == undefined) return;\n\n\t\treturn Bytes.concat(parts);\n\t}\n\n\tprivate async writeObjects(objects: NVM3Object[]): Promise<void> {\n\t\tconst section = this.getNVMSectionForFile(objects[0].key);\n\n\t\tlet page = section.pages[section.currentPage];\n\t\tlet remainingSpace = page.pageSize\n\t\t\t- NVM3_PAGE_HEADER_SIZE\n\t\t\t- section.offsetInPage;\n\n\t\t// TODO: See if we can avoid double writes on a page change\n\n\t\t/** Moves to the next page and erases it if necessary */\n\t\tconst nextPage = async () => {\n\t\t\tsection.currentPage = (section.currentPage + 1)\n\t\t\t\t% section.pages.length;\n\t\t\tpage = section.pages[section.currentPage];\n\n\t\t\t// Find headers of objects that need to be preserved\n\t\t\tconst toPreserve = [...section.objectLocations].filter((\n\t\t\t\t[, pageIndex],\n\t\t\t) => pageIndex === section.currentPage)\n\t\t\t\t.map(([fileID]) =>\n\t\t\t\t\tpage.objects.findLast((h) => h.key === fileID)\n\t\t\t\t)\n\t\t\t\t.filter((h) => h != undefined)\n\t\t\t\t.filter((h) => h.type !== ObjectType.Deleted);\n\t\t\t// And add the objects to the TODO list\n\t\t\tfor (const header of toPreserve) {\n\t\t\t\tconst data = await this.get(header.key);\n\t\t\t\tconsole.error(`Need to preserve object ${num2hex(header.key)}\n page index: ${section.currentPage}\n object type: ${getEnumMemberName(ObjectType, header.type)}\n data: ${data != undefined ? `${data.length} bytes` : \"(no data)\"}`);\n\t\t\t\tobjects.push({\n\t\t\t\t\tkey: header.key,\n\t\t\t\t\ttype: header.type,\n\t\t\t\t\tfragmentType: FragmentType.None,\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (page.objects.length > 0) {\n\t\t\t\t// The page needs to be erased\n\t\t\t\tpage.eraseCount++;\n\t\t\t\tpage.objects = [];\n\n\t\t\t\tconst pageHeaderBuffer = serializePageHeader(page);\n\t\t\t\tconst pageBuffer = new Uint8Array(page.pageSize).fill(0xff);\n\t\t\t\tpageBuffer.set(pageHeaderBuffer, 0);\n\n\t\t\t\tawait nvmWriteBuffer(this._io, page.offset, pageBuffer);\n\t\t\t}\n\n\t\t\tsection.offsetInPage = NVM3_PAGE_HEADER_SIZE;\n\t\t\tremainingSpace = page.pageSize - NVM3_PAGE_HEADER_SIZE;\n\t\t};\n\n\t\t// Go through the list of objects and write all of them to the NVM\n\t\tfor (const object of objects) {\n\t\t\tconst isLargeObject = object.type === ObjectType.DataLarge\n\t\t\t\t|| object.type === ObjectType.CounterLarge;\n\n\t\t\tlet fragments: NVM3Object[] | undefined;\n\n\t\t\tif (isLargeObject) {\n\t\t\t\t// Large objects may be fragmented\n\n\t\t\t\t// We need to start a new page, if the remaining space is not enough for\n\t\t\t\t// the object header plus additional data\n\t\t\t\tif (remainingSpace <= NVM3_OBJ_HEADER_SIZE_LARGE) {\n\t\t\t\t\tawait nextPage();\n\t\t\t\t}\n\n\t\t\t\tfragments = fragmentLargeObject(\n\t\t\t\t\tobject as any,\n\t\t\t\t\tremainingSpace,\n\t\t\t\t\tpage.pageSize - NVM3_PAGE_HEADER_SIZE,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Small objects cannot be fragmented. If they don't fit,\n\t\t\t\t// they need to go on the next page.\n\t\t\t\tconst requiredSpace = getRequiredSpace(object);\n\t\t\t\tif (requiredSpace > remainingSpace) {\n\t\t\t\t\tawait nextPage();\n\t\t\t\t}\n\t\t\t\tfragments = [object];\n\t\t\t}\n\n\t\t\t// Write each fragment to the NVM. If there are multiple fragments,\n\t\t\t// each one but the first needs to be written at the beginning of a new page\n\t\t\tfor (let i = 0; i < fragments.length; i++) {\n\t\t\t\tif (i > 0) await nextPage();\n\t\t\t\tconst fragment = fragments[i];\n\n\t\t\t\tconst objBuffer = serializeObject(fragment);\n\t\t\t\tconst objOffset = page.offset + section.offsetInPage;\n\t\t\t\tawait this._io.write(objOffset, objBuffer);\n\t\t\t\tconst requiredSpace = getRequiredSpace(fragment);\n\t\t\t\tsection.offsetInPage += requiredSpace;\n\t\t\t\tremainingSpace -= requiredSpace;\n\n\t\t\t\t// Remember which objects exist in this page\n\t\t\t\tpage.objects.push(getObjectHeader(object, objOffset));\n\n\t\t\t\t// And remember where this object lives\n\t\t\t\tif (object.type === ObjectType.Deleted) {\n\t\t\t\t\tsection.objectLocations.delete(object.key);\n\t\t\t\t} else if (\n\t\t\t\t\tfragment.fragmentType === FragmentType.None\n\t\t\t\t\t|| fragment.fragmentType === FragmentType.First\n\t\t\t\t) {\n\t\t\t\t\tsection.objectLocations.set(\n\t\t\t\t\t\tfragment.key,\n\t\t\t\t\t\tsection.currentPage,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async set(property: number, value: Uint8Array): Promise<void> {\n\t\tif (!this._info) await this.init();\n\t\tawait this.ensureWritable();\n\n\t\tawait this.writeObjects([{\n\t\t\tkey: property,\n\t\t\ttype: value.length <= NVM3_MAX_OBJ_SIZE_SMALL\n\t\t\t\t? ObjectType.DataSmall\n\t\t\t\t: ObjectType.DataLarge,\n\t\t\t// writeObject deals with fragmentation\n\t\t\tfragmentType: FragmentType.None,\n\t\t\tdata: value,\n\t\t}]);\n\t}\n\n\t/** Writes multiple values to the NVM at once. `null` / `undefined` cause the value to be deleted */\n\tpublic async setMany(\n\t\tvalues: [number, Uint8Array | null | undefined][],\n\t): Promise<void> {\n\t\tif (!this._info) await this.init();\n\t\tawait this.ensureWritable();\n\n\t\t// Group objects by their NVM section\n\t\tconst objectsBySection = new Map<\n\t\t\tnumber, /* offset */\n\t\t\t[number, Uint8Array | null | undefined][]\n\t\t>();\n\t\tfor (const [key, value] of values) {\n\t\t\tconst sectionOffset =\n\t\t\t\tthis.getNVMSectionForFile(key).pages[0].offset;\n\t\t\tif (!objectsBySection.has(sectionOffset)) {\n\t\t\t\tobjectsBySection.set(sectionOffset, []);\n\t\t\t}\n\t\t\tobjectsBySection.get(sectionOffset)!.push([key, value]);\n\t\t}\n\n\t\t// And call writeObjects for each group\n\t\tfor (const objectGroups of objectsBySection.values()) {\n\t\t\tawait this.writeObjects(\n\t\t\t\tobjectGroups.map(([key, value]) => (value\n\t\t\t\t\t? {\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\ttype: value.length <= NVM3_MAX_OBJ_SIZE_SMALL\n\t\t\t\t\t\t\t? ObjectType.DataSmall\n\t\t\t\t\t\t\t: ObjectType.DataLarge,\n\t\t\t\t\t\t// writeObject deals with fragmentation\n\t\t\t\t\t\tfragmentType: FragmentType.None,\n\t\t\t\t\t\tdata: value,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\ttype: ObjectType.Deleted,\n\t\t\t\t\t\tfragmentType: FragmentType.None,\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic async delete(property: number): Promise<void> {\n\t\tif (!this._info) await this.init();\n\t\tawait this.ensureWritable();\n\n\t\tawait this.writeObjects([{\n\t\t\tkey: property,\n\t\t\ttype: ObjectType.Deleted,\n\t\t\tfragmentType: FragmentType.None,\n\t\t}]);\n\t}\n\n\tpublic async erase(options?: NVM3EraseOptions): Promise<void> {\n\t\tconst {\n\t\t\tdeviceFamily = 2047,\n\t\t\twriteSize = PageWriteSize.WRITE_SIZE_16,\n\t\t\tmemoryMapped = true,\n\t\t\tsharedFileSystem = false,\n\t\t} = options ?? {};\n\t\tconst maxPageSize = sharedFileSystem\n\t\t\t? FLASH_MAX_PAGE_SIZE_800\n\t\t\t: FLASH_MAX_PAGE_SIZE_700;\n\t\tconst pageSize = Math.min(\n\t\t\toptions?.pageSize ?? maxPageSize,\n\t\t\tmaxPageSize,\n\t\t);\n\n\t\t// Make sure we won't be writing incomplete pages\n\t\tif (this._io.size % pageSize !== 0) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Invalid page size. NVM size ${this._io.size} must be a multiple of the page size ${pageSize}.`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t} else if (\n\t\t\t!sharedFileSystem && ZWAVE_APPLICATION_NVM_SIZE % pageSize !== 0\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Invalid page size. The application NVM size ${ZWAVE_APPLICATION_NVM_SIZE} must be a multiple of the page size ${pageSize}.`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t} else if (\n\t\t\t!sharedFileSystem\n\t\t\t&& (this._io.size - ZWAVE_APPLICATION_NVM_SIZE) % pageSize !== 0\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Invalid page size. The protocol NVM size ${\n\t\t\t\t\tthis._io.size\n\t\t\t\t\t- ZWAVE_APPLICATION_NVM_SIZE\n\t\t\t\t} must be a multiple of the page size ${pageSize}.`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\tawait this.ensureWritable();\n\n\t\t// Create empty pages, write them to the NVM\n\t\tconst applicationPages: NVM3PageInfo[] = [];\n\t\tconst protocolPages: NVM3PageInfo[] = [];\n\n\t\tconst numPages = this._io.size / pageSize;\n\t\tfor (let i = 0; i < numPages; i++) {\n\t\t\tconst offset = i * pageSize;\n\t\t\tconst pageBuffer = new Uint8Array(pageSize).fill(0xff);\n\t\t\tconst pageHeader: NVM3PageHeader = {\n\t\t\t\toffset,\n\t\t\t\tversion: 0x01,\n\t\t\t\teraseCount: 0,\n\t\t\t\tencrypted: false,\n\t\t\t\tdeviceFamily,\n\t\t\t\tmemoryMapped,\n\t\t\t\tpageSize,\n\t\t\t\tstatus: PageStatus.OK,\n\t\t\t\twriteSize,\n\t\t\t};\n\t\t\tpageBuffer.set(serializePageHeader(pageHeader), 0);\n\t\t\tawait nvmWriteBuffer(this._io, offset, pageBuffer);\n\n\t\t\tif (sharedFileSystem || offset < ZWAVE_APPLICATION_NVM_SIZE) {\n\t\t\t\tapplicationPages.push({ ...pageHeader, objects: [] });\n\t\t\t} else {\n\t\t\t\tprotocolPages.push({ ...pageHeader, objects: [] });\n\t\t\t}\n\t\t}\n\n\t\t// Remember the pages we just created for further use\n\t\tthis._info = sharedFileSystem\n\t\t\t? {\n\t\t\t\tisSharedFileSystem: true,\n\t\t\t\tsections: {\n\t\t\t\t\tall: {\n\t\t\t\t\t\tcurrentPage: 0,\n\t\t\t\t\t\tobjectLocations: new Map(),\n\t\t\t\t\t\toffsetInPage: NVM3_PAGE_HEADER_SIZE,\n\t\t\t\t\t\tpages: applicationPages,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\t: {\n\t\t\t\tisSharedFileSystem: false,\n\t\t\t\tsections: {\n\t\t\t\t\tapplication: {\n\t\t\t\t\t\tcurrentPage: 0,\n\t\t\t\t\t\tobjectLocations: new Map(),\n\t\t\t\t\t\toffsetInPage: NVM3_PAGE_HEADER_SIZE,\n\t\t\t\t\t\tpages: applicationPages,\n\t\t\t\t\t},\n\t\t\t\t\tprotocol: {\n\t\t\t\t\t\tcurrentPage: 0,\n\t\t\t\t\t\tobjectLocations: new Map(),\n\t\t\t\t\t\toffsetInPage: NVM3_PAGE_HEADER_SIZE,\n\t\t\t\t\t\tpages: protocolPages,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\nasync function readPageHeader(\n\tio: NVMIO,\n\toffset: number,\n): Promise<NVM3PageHeader> {\n\tif (offset > io.size - NVM3_PAGE_HEADER_SIZE) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Incomplete page in buffer!\",\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\n\tconst buffer = Bytes.view(\n\t\t(await io.read(offset, NVM3_PAGE_HEADER_SIZE)).buffer,\n\t);\n\n\tconst { version, eraseCount } = tryGetVersionAndEraseCount(buffer);\n\n\t// Page status\n\tconst status = buffer.readUInt32LE(12);\n\n\tconst devInfo = buffer.readUInt16LE(16);\n\tconst deviceFamily = devInfo & 0x7ff;\n\tconst writeSize = (devInfo >> 11) & 0b1;\n\tconst memoryMapped = !!((devInfo >> 12) & 0b1);\n\tlet pageSize = pageSizeFromBits((devInfo >> 13) & 0b111);\n\n\tif (pageSize > 0xffff) {\n\t\t// Some controllers have no valid info in the page size bits, resulting\n\t\t// in an impossibly large page size. To try and figure out the actual page\n\t\t// size without knowing the hardware, we scan the buffer for the next valid\n\t\t// page start.\n\t\tfor (let exponent = 0; exponent < 0b111; exponent++) {\n\t\t\tconst testPageSize = pageSizeFromBits(exponent);\n\t\t\tconst nextOffset = offset + testPageSize;\n\t\t\tif (\n\t\t\t\t// exactly end of NVM OR\n\t\t\t\tio.size === nextOffset\n\t\t\t\t// next page\n\t\t\t\t|| await isValidPageHeaderAtOffset(io, nextOffset)\n\t\t\t) {\n\t\t\t\tpageSize = testPageSize;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (pageSize > 0xffff) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Could not determine page size!\",\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\n\tif (io.size < offset + pageSize) {\n\t\tthrow new ZWaveError(\n\t\t\t`NVM contains incomplete page at offset ${num2hex(offset)}!`,\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\n\tconst formatInfo = buffer.readUInt16LE(18);\n\tconst encrypted = !(formatInfo & 0b1);\n\n\treturn {\n\t\toffset,\n\t\tversion,\n\t\teraseCount,\n\t\tstatus,\n\t\tencrypted,\n\t\tpageSize,\n\t\twriteSize,\n\t\tmemoryMapped,\n\t\tdeviceFamily,\n\t};\n}\n\nfunction tryGetVersionAndEraseCount(\n\theader: Uint8Array,\n): { version: number; eraseCount: number } {\n\tconst buffer = Bytes.view(header);\n\tconst version = buffer.readUInt16LE(0);\n\tconst magic = buffer.readUInt16LE(2);\n\tif (magic !== NVM3_PAGE_MAGIC) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Not a valid NVM3 page!\",\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\tif (version !== 0x01) {\n\t\tthrow new ZWaveError(\n\t\t\t`Unsupported NVM3 page version: ${version}`,\n\t\t\tZWaveErrorCodes.NVM_NotSupported,\n\t\t);\n\t}\n\n\t// The erase counter is saved twice, once normally, once inverted\n\tlet eraseCount = buffer.readUInt32LE(4);\n\tconst eraseCountCode = eraseCount >>> NVM3_PAGE_COUNTER_SIZE;\n\teraseCount &= NVM3_PAGE_COUNTER_MASK;\n\tvalidateBergerCode(eraseCount, eraseCountCode, NVM3_PAGE_COUNTER_SIZE);\n\n\tlet eraseCountInv = buffer.readUInt32LE(8);\n\tconst eraseCountInvCode = eraseCountInv >>> NVM3_PAGE_COUNTER_SIZE;\n\teraseCountInv &= NVM3_PAGE_COUNTER_MASK;\n\tvalidateBergerCode(\n\t\teraseCountInv,\n\t\teraseCountInvCode,\n\t\tNVM3_PAGE_COUNTER_SIZE,\n\t);\n\n\tif (eraseCount !== (~eraseCountInv & NVM3_PAGE_COUNTER_MASK)) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Invalid erase count!\",\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\n\treturn { version, eraseCount };\n}\n\nasync function isValidPageHeaderAtOffset(\n\tio: NVMIO,\n\toffset: number,\n): Promise<boolean> {\n\tif (offset > io.size - NVM3_PAGE_HEADER_SIZE) {\n\t\treturn false;\n\t}\n\n\tconst { buffer } = await io.read(offset, NVM3_PAGE_HEADER_SIZE);\n\n\ttry {\n\t\ttryGetVersionAndEraseCount(buffer);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function readObjectHeader(\n\tio: NVMIO,\n\toffset: number,\n): Promise<NVM3ObjectHeader | undefined> {\n\tlet headerSize = 4;\n\tconst hdr1 = await nvmReadUInt32LE(io, offset);\n\n\t// Skip over blank page areas\n\tif (hdr1 === 0xffffffff) return;\n\n\tconst key = (hdr1 >> NVM3_OBJ_KEY_SHIFT) & NVM3_OBJ_KEY_MASK;\n\tlet objType: ObjectType = hdr1 & NVM3_OBJ_TYPE_MASK;\n\tlet fragmentSize = 0;\n\tlet hdr2: number | undefined;\n\tconst isLarge = objType === ObjectType.DataLarge\n\t\t|| objType === ObjectType.CounterLarge;\n\tif (isLarge) {\n\t\thdr2 = await nvmReadUInt32LE(io, offset + 4);\n\t\theaderSize += 4;\n\t\tfragmentSize = hdr2 & NVM3_OBJ_LARGE_LEN_MASK;\n\t} else if (objType > ObjectType.DataSmall) {\n\t\t// In small objects with data, the length and object type are stored in the same value\n\t\tfragmentSize = objType - ObjectType.DataSmall;\n\t\tobjType = ObjectType.DataSmall;\n\t} else if (objType === ObjectType.CounterSmall) {\n\t\tfragmentSize = NVM3_COUNTER_SIZE;\n\t}\n\n\tconst fragmentType: FragmentType = isLarge\n\t\t? (hdr1 >>> NVM3_OBJ_FRAGTYPE_SHIFT) & NVM3_OBJ_FRAGTYPE_MASK\n\t\t: FragmentType.None;\n\n\tif (isLarge) {\n\t\tvalidateBergerCodeMulti([hdr1, hdr2!], 32 + NVM3_CODE_LARGE_SHIFT);\n\t} else {\n\t\tvalidateBergerCodeMulti([hdr1], NVM3_CODE_SMALL_SHIFT);\n\t}\n\n\tif (io.size < offset + headerSize + fragmentSize) {\n\t\tthrow new ZWaveError(\n\t\t\t`NVM contains incomplete object at offset ${num2hex(offset)}!`,\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\n\tconst alignedFragmentSize = getAlignedSize(fragmentSize);\n\tconst alignedSize = headerSize + alignedFragmentSize;\n\n\treturn {\n\t\tkey,\n\t\toffset,\n\t\ttype: objType,\n\t\tfragmentType,\n\t\theaderSize,\n\t\tfragmentSize,\n\t\talignedSize,\n\t};\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_safe", "import_utils", "pages"]
4
+ "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport { Bytes, getEnumMemberName, num2hex } from \"@zwave-js/shared\";\nimport { type NVM, NVMAccess, type NVMIO } from \"./common/definitions.js\";\nimport {\n\tnvmReadBuffer,\n\tnvmReadUInt32LE,\n\tnvmWriteBuffer,\n} from \"./common/utils.js\";\nimport {\n\tFLASH_MAX_PAGE_SIZE_700,\n\tFLASH_MAX_PAGE_SIZE_800,\n\tFragmentType,\n\tNVM3_CODE_LARGE_SHIFT,\n\tNVM3_CODE_SMALL_SHIFT,\n\tNVM3_COUNTER_SIZE,\n\tNVM3_MAX_OBJ_SIZE_SMALL,\n\tNVM3_OBJ_FRAGTYPE_MASK,\n\tNVM3_OBJ_FRAGTYPE_SHIFT,\n\tNVM3_OBJ_HEADER_SIZE_LARGE,\n\tNVM3_OBJ_KEY_MASK,\n\tNVM3_OBJ_KEY_SHIFT,\n\tNVM3_OBJ_LARGE_LEN_MASK,\n\tNVM3_OBJ_TYPE_MASK,\n\tNVM3_PAGE_COUNTER_MASK,\n\tNVM3_PAGE_COUNTER_SIZE,\n\tNVM3_PAGE_HEADER_SIZE,\n\tNVM3_PAGE_MAGIC,\n\tObjectType,\n\tPageStatus,\n\tPageWriteSize,\n\tZWAVE_APPLICATION_NVM_SIZE,\n} from \"./nvm3/consts.js\";\nimport {\n\tApplicationVersionFile800ID,\n\ttype NVMSection,\n\tgetNVMSectionByFileID,\n} from \"./nvm3/files/index.js\";\nimport {\n\ttype NVM3Object,\n\ttype NVM3ObjectHeader,\n\tfragmentLargeObject,\n\tgetAlignedSize,\n\tgetObjectHeader,\n\tgetRequiredSpace,\n\tserializeObject,\n} from \"./nvm3/object.js\";\nimport {\n\ttype NVM3PageHeader,\n\tpageSizeFromBits,\n\tserializePageHeader,\n} from \"./nvm3/page.js\";\nimport { validateBergerCode, validateBergerCodeMulti } from \"./nvm3/utils.js\";\n\n// TODO: Possible optimizations:\n// Investigate if there is a better way to determine whether the NVM\n// uses a shared FS or not. The current implementation scans all objects\n// to find the 800 series application version file.\n// Alternatively, we could simply check if each page starts with an object header.\n// If yes, read the objects lazily when needed. If not, remember that the page is empty.\n\nexport type NVM3PageInfo = NVM3PageHeader & {\n\tobjects: NVM3ObjectHeader[];\n};\n\nexport interface NVM3SectionInfo {\n\tpages: NVM3PageInfo[];\n\t/** The index of the current page */\n\tcurrentPage: number;\n\t/** The next byte to write in the current page */\n\toffsetInPage: number;\n\t/** A map of file IDs and page indizes in which their last copy resides */\n\tobjectLocations: Map<number, number>;\n}\n\nexport type NVM3FileSystemInfo = {\n\tisSharedFileSystem: true;\n\tsections: Record<\"all\", NVM3SectionInfo>;\n} | {\n\tisSharedFileSystem: false;\n\tsections: Record<NVMSection, NVM3SectionInfo>;\n};\n\nexport interface NVM3Meta {\n\tsharedFileSystem: boolean;\n\tpageSize: number;\n\tdeviceFamily: number;\n\twriteSize: PageWriteSize;\n\tmemoryMapped: boolean;\n}\n\nexport type NVM3EraseOptions = Partial<NVM3Meta>;\n\nexport class NVM3 implements NVM<number, Uint8Array> {\n\tpublic constructor(io: NVMIO) {\n\t\tthis._io = io;\n\t}\n\n\tprivate _io: NVMIO;\n\tprivate _access: NVMAccess = NVMAccess.None;\n\n\tprivate _info: NVM3FileSystemInfo | undefined;\n\tpublic get info(): NVM3FileSystemInfo | undefined {\n\t\treturn this._info;\n\t}\n\n\tprivate async ensureReadable(): Promise<void> {\n\t\tif (\n\t\t\tthis._access === NVMAccess.Read\n\t\t\t|| this._access === NVMAccess.ReadWrite\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._access === NVMAccess.Write) {\n\t\t\tawait this._io.close();\n\t\t}\n\t\tthis._access = await this._io.open(NVMAccess.Read);\n\t}\n\n\tprivate async ensureWritable(): Promise<void> {\n\t\tif (\n\t\t\tthis._access === NVMAccess.Write\n\t\t\t|| this._access === NVMAccess.ReadWrite\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._access === NVMAccess.Read) {\n\t\t\tawait this._io.close();\n\t\t}\n\t\tthis._access = await this._io.open(NVMAccess.Write);\n\t}\n\n\tpublic async init(): Promise<NVM3FileSystemInfo> {\n\t\tawait this.ensureReadable();\n\n\t\tlet pageOffset = 0;\n\t\t// Determine NVM size, scan pages\n\t\tconst pages: NVM3PageInfo[] = [];\n\t\tlet isSharedFileSystem = false;\n\t\twhile (pageOffset < this._io.size) {\n\t\t\t// console.debug(\n\t\t\t// \t`NVM3 init() - reading page header at offset ${\n\t\t\t// \t\tnum2hex(pageOffset)\n\t\t\t// \t}`,\n\t\t\t// );\n\t\t\tconst header = await readPageHeader(this._io, pageOffset);\n\t\t\tpages.push({\n\t\t\t\t...header,\n\t\t\t\tobjects: [],\n\t\t\t});\n\t\t\tpageOffset += header.pageSize;\n\t\t}\n\n\t\t// Scan each page for objects\n\t\tfor (const page of pages) {\n\t\t\t// Scan objects in this page\n\t\t\tlet objectOffset = page.offset + NVM3_PAGE_HEADER_SIZE;\n\t\t\tconst nextPageOffset = page.offset + page.pageSize;\n\t\t\twhile (objectOffset < nextPageOffset) {\n\t\t\t\t// console.debug(\n\t\t\t\t// \t`NVM3 init() - reading object header. page offset ${\n\t\t\t\t// \t\tnum2hex(page.offset)\n\t\t\t\t// \t}, object offset ${num2hex(objectOffset)}`,\n\t\t\t\t// );\n\t\t\t\tconst objectHeader = await readObjectHeader(\n\t\t\t\t\tthis._io,\n\t\t\t\t\tobjectOffset,\n\t\t\t\t);\n\t\t\t\tif (objectHeader) {\n\t\t\t\t\tpage.objects.push(objectHeader);\n\t\t\t\t\tobjectOffset += objectHeader.alignedSize;\n\n\t\t\t\t\t// Detect the 800 series shared protocol & application NVM file system\n\t\t\t\t\t// by looking for the 800 series application version file\n\t\t\t\t\tif (objectHeader.key === ApplicationVersionFile800ID) {\n\t\t\t\t\t\tisSharedFileSystem = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Reached the end of the data in this page\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// By convention, we only use the applicationPages in that case\n\t\tlet applicationPages: NVM3PageInfo[];\n\t\tlet protocolPages: NVM3PageInfo[];\n\n\t\tif (isSharedFileSystem) {\n\t\t\tapplicationPages = pages;\n\t\t\tprotocolPages = [];\n\t\t} else {\n\t\t\tapplicationPages = pages.filter(\n\t\t\t\t(p) => p.offset < ZWAVE_APPLICATION_NVM_SIZE,\n\t\t\t);\n\t\t\tprotocolPages = pages.filter(\n\t\t\t\t(p) => p.offset >= ZWAVE_APPLICATION_NVM_SIZE,\n\t\t\t);\n\t\t}\n\n\t\t// NVM3 layouts pages in a ring buffer. Pages are written from front to back, then occupied pages\n\t\t// are erased and overwritten. Pages at the start of the memory section may have an erase count that's 1 higher\n\t\t// than the pages at the end.\n\t\tconst pageInfoToSectionInfo = (\n\t\t\tpages: NVM3PageInfo[],\n\t\t): NVM3SectionInfo => {\n\t\t\t// Find the current page, which is either:\n\t\t\t// - The last page with the high erase count that contains an object\n\t\t\tconst maxEraseCount = Math.max(...pages.map((p) => p.eraseCount));\n\t\t\tlet currentPageIndex = pages.findLastIndex((p) =>\n\t\t\t\tp.eraseCount === maxEraseCount && p.objects.length > 0\n\t\t\t);\n\t\t\t// - or if there is none, the last page with the lower erase count that contains an object\n\t\t\tif (currentPageIndex === -1) {\n\t\t\t\tcurrentPageIndex = pages.findLastIndex((p) =>\n\t\t\t\t\tp.objects.length > 0\n\t\t\t\t);\n\t\t\t}\n\t\t\t// - Or if no objects exist at all, the beginning of the section\n\t\t\tif (currentPageIndex === -1) currentPageIndex = 0;\n\n\t\t\t// Find the next free byte of the current page\n\t\t\tconst currentPage = pages[currentPageIndex];\n\t\t\tlet offset = NVM3_PAGE_HEADER_SIZE;\n\t\t\tfor (const object of currentPage.objects) {\n\t\t\t\toffset += object.alignedSize;\n\t\t\t}\n\n\t\t\tconst objectLocations = new Map<number, number>();\n\t\t\tfor (let i = 0; i < pages.length; i++) {\n\t\t\t\tconst page = pages[i];\n\t\t\t\tfor (const object of page.objects) {\n\t\t\t\t\tconst location = objectLocations.get(object.key);\n\t\t\t\t\tif (location == undefined) {\n\t\t\t\t\t\t// Object seen for the first time, remember the page it is in\n\t\t\t\t\t\tobjectLocations.set(object.key, i);\n\t\t\t\t\t} else if (\n\t\t\t\t\t\t(object.fragmentType === FragmentType.None\n\t\t\t\t\t\t\t|| object.fragmentType === FragmentType.First)\n\t\t\t\t\t\t&& (page.eraseCount >= pages[location].eraseCount)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Object was seen before. Only remember it if it is the only\n\t\t\t\t\t\t// or first fragment and the object appears in a later location\n\t\t\t\t\t\t// of the ring buffer\n\t\t\t\t\t\tobjectLocations.set(object.key, i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tpages,\n\t\t\t\toffsetInPage: offset,\n\t\t\t\tcurrentPage: currentPageIndex,\n\t\t\t\tobjectLocations,\n\t\t\t};\n\t\t};\n\n\t\tif (isSharedFileSystem) {\n\t\t\tthis._info = {\n\t\t\t\tisSharedFileSystem: true,\n\t\t\t\tsections: {\n\t\t\t\t\tall: pageInfoToSectionInfo(applicationPages),\n\t\t\t\t},\n\t\t\t};\n\t\t} else {\n\t\t\tthis._info = {\n\t\t\t\tisSharedFileSystem: false,\n\t\t\t\tsections: {\n\t\t\t\t\tapplication: pageInfoToSectionInfo(applicationPages),\n\t\t\t\t\tprotocol: pageInfoToSectionInfo(protocolPages),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this._info;\n\t}\n\n\tprivate getNVMSectionForFile(fileId: number): NVM3SectionInfo {\n\t\t// Determine which ring buffer to read in\n\t\treturn this._info!.isSharedFileSystem\n\t\t\t? this._info!.sections.all\n\t\t\t: this._info!.sections[getNVMSectionByFileID(fileId)];\n\t}\n\n\tpublic async has(fileId: number): Promise<boolean> {\n\t\tthis._info ??= await this.init();\n\n\t\t// Determine which ring buffer to read in\n\t\tconst section = this.getNVMSectionForFile(fileId);\n\n\t\treturn section.objectLocations.has(fileId);\n\t}\n\n\tpublic readObjectData(object: NVM3ObjectHeader): Promise<Uint8Array> {\n\t\treturn nvmReadBuffer(\n\t\t\tthis._io,\n\t\t\tobject.offset + object.headerSize,\n\t\t\tobject.fragmentSize,\n\t\t);\n\t}\n\n\tpublic async get(fileId: number): Promise<Uint8Array | undefined> {\n\t\tthis._info ??= await this.init();\n\n\t\t// Determine which ring buffer to read in\n\t\tconst section = this.getNVMSectionForFile(fileId);\n\n\t\tconst pages = section.pages;\n\n\t\t// TODO: There should be no need for scanning, since we know the object locations after init().\n\n\t\t// Start scanning backwards through the pages ring buffer, starting with the current page\n\t\tlet parts: Uint8Array[] | undefined;\n\t\tlet complete = false;\n\t\tlet objType: ObjectType | undefined;\n\t\tconst resetFragments = () => {\n\t\t\t// if (parts?.length) {\n\t\t\t// \tconsole.debug(\"Resetting fragmented object\");\n\t\t\t// }\n\t\t\tparts = undefined;\n\t\t\tcomplete = false;\n\t\t};\n\t\tpages: for (let offset = 0; offset < pages.length; offset++) {\n\t\t\tconst index = (section.currentPage - offset + pages.length)\n\t\t\t\t% pages.length;\n\t\t\tconst page = pages[index];\n\t\t\t// console.debug(\n\t\t\t// \t`NVM3.get(${fileId}): scanning page ${index} at offset ${\n\t\t\t// \t\tnum2hex(page.offset)\n\t\t\t// \t}`,\n\t\t\t// );\n\t\t\t// Scan objects in this page, read backwards.\n\t\t\t// The last non-deleted object wins\n\t\t\tobjects: for (let j = page.objects.length - 1; j >= 0; j--) {\n\t\t\t\tconst object = page.objects[j];\n\n\t\t\t\tconst readObject = () => this.readObjectData(object);\n\n\t\t\t\tif (object.key !== fileId) {\n\t\t\t\t\t// Reset any fragmented objects when encountering a different key\n\t\t\t\t\tresetFragments();\n\t\t\t\t\tcontinue objects;\n\t\t\t\t}\n\n\t\t\t\tif (object.type === ObjectType.Deleted) {\n\t\t\t\t\t// Last action for this object was a deletion. There is no data.\n\t\t\t\t\treturn;\n\t\t\t\t} else if (object.fragmentType === FragmentType.None) {\n\t\t\t\t\t// console.debug(\n\t\t\t\t\t// \t`NVM3.get(${fileId}): found complete object - header offset ${\n\t\t\t\t\t// \t\tnum2hex(object.offset)\n\t\t\t\t\t// \t}, content offset ${\n\t\t\t\t\t// \t\tnum2hex(object.offset + object.headerSize)\n\t\t\t\t\t// \t}, length ${object.fragmentSize}`,\n\t\t\t\t\t// );\n\t\t\t\t\t// This is a complete object\n\t\t\t\t\tparts = [await readObject()];\n\t\t\t\t\tobjType = object.type;\n\t\t\t\t\tcomplete = true;\n\t\t\t\t\tbreak pages;\n\t\t\t\t} else if (object.fragmentType === FragmentType.Last) {\n\t\t\t\t\t// console.debug(\n\t\t\t\t\t// \t`NVM3.get(${fileId}): found LAST fragment - header offset ${\n\t\t\t\t\t// \t\tnum2hex(object.offset)\n\t\t\t\t\t// \t}, content offset ${\n\t\t\t\t\t// \t\tnum2hex(object.offset + object.headerSize)\n\t\t\t\t\t// \t}, length ${object.fragmentSize}`,\n\t\t\t\t\t// );\n\t\t\t\t\tparts = [await readObject()];\n\t\t\t\t\tobjType = object.type;\n\t\t\t\t\tcomplete = false;\n\t\t\t\t} else if (object.fragmentType === FragmentType.Next) {\n\t\t\t\t\tif (parts?.length && objType === object.type) {\n\t\t\t\t\t\t// console.debug(\n\t\t\t\t\t\t// \t`NVM3.get(${fileId}): found NEXT fragment - header offset ${\n\t\t\t\t\t\t// \t\tnum2hex(object.offset)\n\t\t\t\t\t\t// \t}, content offset ${\n\t\t\t\t\t\t// \t\tnum2hex(object.offset + object.headerSize)\n\t\t\t\t\t\t// \t}, length ${object.fragmentSize}`,\n\t\t\t\t\t\t// );\n\t\t\t\t\t\tparts.unshift(await readObject());\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This shouldn't be here\n\t\t\t\t\t\tresetFragments();\n\t\t\t\t\t}\n\t\t\t\t} else if (object.fragmentType === FragmentType.First) {\n\t\t\t\t\tif (parts?.length && objType === object.type) {\n\t\t\t\t\t\t// console.debug(\n\t\t\t\t\t\t// \t`NVM3.get(${fileId}): found FIRST fragment - header offset ${\n\t\t\t\t\t\t// \t\tnum2hex(object.offset)\n\t\t\t\t\t\t// \t}, content offset ${\n\t\t\t\t\t\t// \t\tnum2hex(object.offset + object.headerSize)\n\t\t\t\t\t\t// \t}, length ${object.fragmentSize}`,\n\t\t\t\t\t\t// );\n\t\t\t\t\t\tparts.unshift(await readObject());\n\t\t\t\t\t\tcomplete = true;\n\t\t\t\t\t\tbreak pages;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// This shouldn't be here\n\t\t\t\t\t\tresetFragments();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!parts?.length || !complete || objType == undefined) return;\n\n\t\treturn Bytes.concat(parts);\n\t}\n\n\tprivate async writeObjects(objects: NVM3Object[]): Promise<void> {\n\t\tconst section = this.getNVMSectionForFile(objects[0].key);\n\n\t\tlet page = section.pages[section.currentPage];\n\t\tlet remainingSpace = page.pageSize\n\t\t\t- NVM3_PAGE_HEADER_SIZE\n\t\t\t- section.offsetInPage;\n\n\t\t// TODO: See if we can avoid double writes on a page change\n\n\t\t/** Moves to the next page and erases it if necessary */\n\t\tconst nextPage = async () => {\n\t\t\tsection.currentPage = (section.currentPage + 1)\n\t\t\t\t% section.pages.length;\n\t\t\tpage = section.pages[section.currentPage];\n\n\t\t\t// Find headers of objects that need to be preserved\n\t\t\tconst toPreserve = [...section.objectLocations].filter((\n\t\t\t\t[, pageIndex],\n\t\t\t) => pageIndex === section.currentPage)\n\t\t\t\t.map(([fileID]) =>\n\t\t\t\t\tpage.objects.findLast((h) => h.key === fileID)\n\t\t\t\t)\n\t\t\t\t.filter((h) => h != undefined)\n\t\t\t\t.filter((h) => h.type !== ObjectType.Deleted);\n\t\t\t// And add the objects to the TODO list\n\t\t\tfor (const header of toPreserve) {\n\t\t\t\tconst data = await this.get(header.key);\n\t\t\t\tconsole.error(`Need to preserve object ${num2hex(header.key)}\n page index: ${section.currentPage}\n object type: ${getEnumMemberName(ObjectType, header.type)}\n data: ${data != undefined ? `${data.length} bytes` : \"(no data)\"}`);\n\t\t\t\tobjects.push({\n\t\t\t\t\tkey: header.key,\n\t\t\t\t\ttype: header.type,\n\t\t\t\t\tfragmentType: FragmentType.None,\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (page.objects.length > 0) {\n\t\t\t\t// The page needs to be erased\n\t\t\t\tpage.eraseCount++;\n\t\t\t\tpage.objects = [];\n\n\t\t\t\tconst pageHeaderBuffer = serializePageHeader(page);\n\t\t\t\tconst pageBuffer = new Uint8Array(page.pageSize).fill(0xff);\n\t\t\t\tpageBuffer.set(pageHeaderBuffer, 0);\n\n\t\t\t\tawait nvmWriteBuffer(this._io, page.offset, pageBuffer);\n\t\t\t}\n\n\t\t\tsection.offsetInPage = NVM3_PAGE_HEADER_SIZE;\n\t\t\tremainingSpace = page.pageSize - NVM3_PAGE_HEADER_SIZE;\n\t\t};\n\n\t\t// Go through the list of objects and write all of them to the NVM\n\t\tfor (const object of objects) {\n\t\t\tconst isLargeObject = object.type === ObjectType.DataLarge\n\t\t\t\t|| object.type === ObjectType.CounterLarge;\n\n\t\t\tlet fragments: NVM3Object[] | undefined;\n\n\t\t\tif (isLargeObject) {\n\t\t\t\t// Large objects may be fragmented\n\n\t\t\t\t// We need to start a new page, if the remaining space is not enough for\n\t\t\t\t// the object header plus additional data\n\t\t\t\tif (remainingSpace <= NVM3_OBJ_HEADER_SIZE_LARGE) {\n\t\t\t\t\tawait nextPage();\n\t\t\t\t}\n\n\t\t\t\tfragments = fragmentLargeObject(\n\t\t\t\t\tobject as any,\n\t\t\t\t\tremainingSpace,\n\t\t\t\t\tpage.pageSize - NVM3_PAGE_HEADER_SIZE,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Small objects cannot be fragmented. If they don't fit,\n\t\t\t\t// they need to go on the next page.\n\t\t\t\tconst requiredSpace = getRequiredSpace(object);\n\t\t\t\tif (requiredSpace > remainingSpace) {\n\t\t\t\t\tawait nextPage();\n\t\t\t\t}\n\t\t\t\tfragments = [object];\n\t\t\t}\n\n\t\t\t// Write each fragment to the NVM. If there are multiple fragments,\n\t\t\t// each one but the first needs to be written at the beginning of a new page\n\t\t\tfor (let i = 0; i < fragments.length; i++) {\n\t\t\t\tif (i > 0) await nextPage();\n\t\t\t\tconst fragment = fragments[i];\n\n\t\t\t\tconst objBuffer = serializeObject(fragment);\n\t\t\t\tconst objOffset = page.offset + section.offsetInPage;\n\t\t\t\tawait this._io.write(objOffset, objBuffer);\n\t\t\t\tconst requiredSpace = getRequiredSpace(fragment);\n\t\t\t\tsection.offsetInPage += requiredSpace;\n\t\t\t\tremainingSpace -= requiredSpace;\n\n\t\t\t\t// Remember which objects exist in this page\n\t\t\t\tpage.objects.push(getObjectHeader(object, objOffset));\n\n\t\t\t\t// And remember where this object lives\n\t\t\t\tif (object.type === ObjectType.Deleted) {\n\t\t\t\t\tsection.objectLocations.delete(object.key);\n\t\t\t\t} else if (\n\t\t\t\t\tfragment.fragmentType === FragmentType.None\n\t\t\t\t\t|| fragment.fragmentType === FragmentType.First\n\t\t\t\t) {\n\t\t\t\t\tsection.objectLocations.set(\n\t\t\t\t\t\tfragment.key,\n\t\t\t\t\t\tsection.currentPage,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic async set(property: number, value: Uint8Array): Promise<void> {\n\t\tif (!this._info) await this.init();\n\t\tawait this.ensureWritable();\n\n\t\tawait this.writeObjects([{\n\t\t\tkey: property,\n\t\t\ttype: value.length <= NVM3_MAX_OBJ_SIZE_SMALL\n\t\t\t\t? ObjectType.DataSmall\n\t\t\t\t: ObjectType.DataLarge,\n\t\t\t// writeObject deals with fragmentation\n\t\t\tfragmentType: FragmentType.None,\n\t\t\tdata: value,\n\t\t}]);\n\t}\n\n\t/** Writes multiple values to the NVM at once. `null` / `undefined` cause the value to be deleted */\n\tpublic async setMany(\n\t\tvalues: [number, Uint8Array | null | undefined][],\n\t): Promise<void> {\n\t\tif (!this._info) await this.init();\n\t\tawait this.ensureWritable();\n\n\t\t// Group objects by their NVM section\n\t\tconst objectsBySection = new Map<\n\t\t\tnumber, /* offset */\n\t\t\t[number, Uint8Array | null | undefined][]\n\t\t>();\n\t\tfor (const [key, value] of values) {\n\t\t\tconst sectionOffset =\n\t\t\t\tthis.getNVMSectionForFile(key).pages[0].offset;\n\t\t\tif (!objectsBySection.has(sectionOffset)) {\n\t\t\t\tobjectsBySection.set(sectionOffset, []);\n\t\t\t}\n\t\t\tobjectsBySection.get(sectionOffset)!.push([key, value]);\n\t\t}\n\n\t\t// And call writeObjects for each group\n\t\tfor (const objectGroups of objectsBySection.values()) {\n\t\t\tawait this.writeObjects(\n\t\t\t\tobjectGroups.map(([key, value]) => (value\n\t\t\t\t\t? {\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\ttype: value.length <= NVM3_MAX_OBJ_SIZE_SMALL\n\t\t\t\t\t\t\t? ObjectType.DataSmall\n\t\t\t\t\t\t\t: ObjectType.DataLarge,\n\t\t\t\t\t\t// writeObject deals with fragmentation\n\t\t\t\t\t\tfragmentType: FragmentType.None,\n\t\t\t\t\t\tdata: value,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\ttype: ObjectType.Deleted,\n\t\t\t\t\t\tfragmentType: FragmentType.None,\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic async delete(property: number): Promise<void> {\n\t\tif (!this._info) await this.init();\n\t\tawait this.ensureWritable();\n\n\t\tawait this.writeObjects([{\n\t\t\tkey: property,\n\t\t\ttype: ObjectType.Deleted,\n\t\t\tfragmentType: FragmentType.None,\n\t\t}]);\n\t}\n\n\tpublic async erase(options?: NVM3EraseOptions): Promise<void> {\n\t\tconst {\n\t\t\tdeviceFamily = 2047,\n\t\t\twriteSize = PageWriteSize.WRITE_SIZE_16,\n\t\t\tmemoryMapped = true,\n\t\t\tsharedFileSystem = false,\n\t\t} = options ?? {};\n\t\tconst maxPageSize = sharedFileSystem\n\t\t\t? FLASH_MAX_PAGE_SIZE_800\n\t\t\t: FLASH_MAX_PAGE_SIZE_700;\n\t\tconst pageSize = Math.min(\n\t\t\toptions?.pageSize ?? maxPageSize,\n\t\t\tmaxPageSize,\n\t\t);\n\n\t\t// Make sure we won't be writing incomplete pages\n\t\tif (this._io.size % pageSize !== 0) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Invalid page size. NVM size ${this._io.size} must be a multiple of the page size ${pageSize}.`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t} else if (\n\t\t\t!sharedFileSystem && ZWAVE_APPLICATION_NVM_SIZE % pageSize !== 0\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Invalid page size. The application NVM size ${ZWAVE_APPLICATION_NVM_SIZE} must be a multiple of the page size ${pageSize}.`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t} else if (\n\t\t\t!sharedFileSystem\n\t\t\t&& (this._io.size - ZWAVE_APPLICATION_NVM_SIZE) % pageSize !== 0\n\t\t) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Invalid page size. The protocol NVM size ${\n\t\t\t\t\tthis._io.size\n\t\t\t\t\t- ZWAVE_APPLICATION_NVM_SIZE\n\t\t\t\t} must be a multiple of the page size ${pageSize}.`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\n\t\tawait this.ensureWritable();\n\n\t\t// Create empty pages, write them to the NVM\n\t\tconst applicationPages: NVM3PageInfo[] = [];\n\t\tconst protocolPages: NVM3PageInfo[] = [];\n\n\t\tconst numPages = this._io.size / pageSize;\n\t\tfor (let i = 0; i < numPages; i++) {\n\t\t\tconst offset = i * pageSize;\n\t\t\tconst pageBuffer = new Uint8Array(pageSize).fill(0xff);\n\t\t\tconst pageHeader: NVM3PageHeader = {\n\t\t\t\toffset,\n\t\t\t\tversion: 0x01,\n\t\t\t\teraseCount: 0,\n\t\t\t\tencrypted: false,\n\t\t\t\tdeviceFamily,\n\t\t\t\tmemoryMapped,\n\t\t\t\tpageSize,\n\t\t\t\tstatus: PageStatus.OK,\n\t\t\t\twriteSize,\n\t\t\t};\n\t\t\tpageBuffer.set(serializePageHeader(pageHeader), 0);\n\t\t\tawait nvmWriteBuffer(this._io, offset, pageBuffer);\n\n\t\t\tif (sharedFileSystem || offset < ZWAVE_APPLICATION_NVM_SIZE) {\n\t\t\t\tapplicationPages.push({ ...pageHeader, objects: [] });\n\t\t\t} else {\n\t\t\t\tprotocolPages.push({ ...pageHeader, objects: [] });\n\t\t\t}\n\t\t}\n\n\t\t// Remember the pages we just created for further use\n\t\tthis._info = sharedFileSystem\n\t\t\t? {\n\t\t\t\tisSharedFileSystem: true,\n\t\t\t\tsections: {\n\t\t\t\t\tall: {\n\t\t\t\t\t\tcurrentPage: 0,\n\t\t\t\t\t\tobjectLocations: new Map(),\n\t\t\t\t\t\toffsetInPage: NVM3_PAGE_HEADER_SIZE,\n\t\t\t\t\t\tpages: applicationPages,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\t: {\n\t\t\t\tisSharedFileSystem: false,\n\t\t\t\tsections: {\n\t\t\t\t\tapplication: {\n\t\t\t\t\t\tcurrentPage: 0,\n\t\t\t\t\t\tobjectLocations: new Map(),\n\t\t\t\t\t\toffsetInPage: NVM3_PAGE_HEADER_SIZE,\n\t\t\t\t\t\tpages: applicationPages,\n\t\t\t\t\t},\n\t\t\t\t\tprotocol: {\n\t\t\t\t\t\tcurrentPage: 0,\n\t\t\t\t\t\tobjectLocations: new Map(),\n\t\t\t\t\t\toffsetInPage: NVM3_PAGE_HEADER_SIZE,\n\t\t\t\t\t\tpages: protocolPages,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\nasync function readPageHeader(\n\tio: NVMIO,\n\toffset: number,\n): Promise<NVM3PageHeader> {\n\tif (offset > io.size - NVM3_PAGE_HEADER_SIZE) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Incomplete page in buffer!\",\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\n\tconst buffer = Bytes.view(\n\t\t(await io.read(offset, NVM3_PAGE_HEADER_SIZE)).buffer,\n\t);\n\n\tconst { version, eraseCount } = tryGetVersionAndEraseCount(buffer);\n\n\t// Page status\n\tconst status = buffer.readUInt32LE(12);\n\n\tconst devInfo = buffer.readUInt16LE(16);\n\tconst deviceFamily = devInfo & 0x7ff;\n\tconst writeSize = (devInfo >> 11) & 0b1;\n\tconst memoryMapped = !!((devInfo >> 12) & 0b1);\n\tlet pageSize = pageSizeFromBits((devInfo >> 13) & 0b111);\n\n\tif (pageSize > 0xffff) {\n\t\t// Some controllers have no valid info in the page size bits, resulting\n\t\t// in an impossibly large page size. To try and figure out the actual page\n\t\t// size without knowing the hardware, we scan the buffer for the next valid\n\t\t// page start.\n\t\tfor (let exponent = 0; exponent < 0b111; exponent++) {\n\t\t\tconst testPageSize = pageSizeFromBits(exponent);\n\t\t\tconst nextOffset = offset + testPageSize;\n\t\t\tif (\n\t\t\t\t// exactly end of NVM OR\n\t\t\t\tio.size === nextOffset\n\t\t\t\t// next page\n\t\t\t\t|| await isValidPageHeaderAtOffset(io, nextOffset)\n\t\t\t) {\n\t\t\t\tpageSize = testPageSize;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (pageSize > 0xffff) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Could not determine page size!\",\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\n\tif (io.size < offset + pageSize) {\n\t\tthrow new ZWaveError(\n\t\t\t`NVM contains incomplete page at offset ${num2hex(offset)}!`,\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\n\tconst formatInfo = buffer.readUInt16LE(18);\n\tconst encrypted = !(formatInfo & 0b1);\n\n\treturn {\n\t\toffset,\n\t\tversion,\n\t\teraseCount,\n\t\tstatus,\n\t\tencrypted,\n\t\tpageSize,\n\t\twriteSize,\n\t\tmemoryMapped,\n\t\tdeviceFamily,\n\t};\n}\n\nfunction tryGetVersionAndEraseCount(\n\theader: Uint8Array,\n): { version: number; eraseCount: number } {\n\tconst buffer = Bytes.view(header);\n\tconst version = buffer.readUInt16LE(0);\n\tconst magic = buffer.readUInt16LE(2);\n\tif (magic !== NVM3_PAGE_MAGIC) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Not a valid NVM3 page!\",\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\tif (version !== 0x01) {\n\t\tthrow new ZWaveError(\n\t\t\t`Unsupported NVM3 page version: ${version}`,\n\t\t\tZWaveErrorCodes.NVM_NotSupported,\n\t\t);\n\t}\n\n\t// The erase counter is saved twice, once normally, once inverted\n\tlet eraseCount = buffer.readUInt32LE(4);\n\tconst eraseCountCode = eraseCount >>> NVM3_PAGE_COUNTER_SIZE;\n\teraseCount &= NVM3_PAGE_COUNTER_MASK;\n\tvalidateBergerCode(eraseCount, eraseCountCode, NVM3_PAGE_COUNTER_SIZE);\n\n\tlet eraseCountInv = buffer.readUInt32LE(8);\n\tconst eraseCountInvCode = eraseCountInv >>> NVM3_PAGE_COUNTER_SIZE;\n\teraseCountInv &= NVM3_PAGE_COUNTER_MASK;\n\tvalidateBergerCode(\n\t\teraseCountInv,\n\t\teraseCountInvCode,\n\t\tNVM3_PAGE_COUNTER_SIZE,\n\t);\n\n\tif (eraseCount !== (~eraseCountInv & NVM3_PAGE_COUNTER_MASK)) {\n\t\tthrow new ZWaveError(\n\t\t\t\"Invalid erase count!\",\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\n\treturn { version, eraseCount };\n}\n\nasync function isValidPageHeaderAtOffset(\n\tio: NVMIO,\n\toffset: number,\n): Promise<boolean> {\n\tif (offset > io.size - NVM3_PAGE_HEADER_SIZE) {\n\t\treturn false;\n\t}\n\n\tconst { buffer } = await io.read(offset, NVM3_PAGE_HEADER_SIZE);\n\n\ttry {\n\t\ttryGetVersionAndEraseCount(buffer);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function readObjectHeader(\n\tio: NVMIO,\n\toffset: number,\n): Promise<NVM3ObjectHeader | undefined> {\n\tlet headerSize = 4;\n\tconst hdr1 = await nvmReadUInt32LE(io, offset);\n\n\t// Skip over blank page areas\n\tif (hdr1 === 0xffffffff) return;\n\n\tconst key = (hdr1 >> NVM3_OBJ_KEY_SHIFT) & NVM3_OBJ_KEY_MASK;\n\tlet objType: ObjectType = hdr1 & NVM3_OBJ_TYPE_MASK;\n\tlet fragmentSize = 0;\n\tlet hdr2: number | undefined;\n\tconst isLarge = objType === ObjectType.DataLarge\n\t\t|| objType === ObjectType.CounterLarge;\n\tif (isLarge) {\n\t\thdr2 = await nvmReadUInt32LE(io, offset + 4);\n\t\theaderSize += 4;\n\t\tfragmentSize = hdr2 & NVM3_OBJ_LARGE_LEN_MASK;\n\t} else if (objType > ObjectType.DataSmall) {\n\t\t// In small objects with data, the length and object type are stored in the same value\n\t\tfragmentSize = objType - ObjectType.DataSmall;\n\t\tobjType = ObjectType.DataSmall;\n\t} else if (objType === ObjectType.CounterSmall) {\n\t\tfragmentSize = NVM3_COUNTER_SIZE;\n\t}\n\n\tconst fragmentType: FragmentType = isLarge\n\t\t? (hdr1 >>> NVM3_OBJ_FRAGTYPE_SHIFT) & NVM3_OBJ_FRAGTYPE_MASK\n\t\t: FragmentType.None;\n\n\tif (isLarge) {\n\t\tvalidateBergerCodeMulti([hdr1, hdr2!], 32 + NVM3_CODE_LARGE_SHIFT);\n\t} else {\n\t\tvalidateBergerCodeMulti([hdr1], NVM3_CODE_SMALL_SHIFT);\n\t}\n\n\tif (io.size < offset + headerSize + fragmentSize) {\n\t\tthrow new ZWaveError(\n\t\t\t`NVM contains incomplete object at offset ${num2hex(offset)}!`,\n\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t);\n\t}\n\n\tconst alignedFragmentSize = getAlignedSize(fragmentSize);\n\tconst alignedSize = headerSize + alignedFragmentSize;\n\n\treturn {\n\t\tkey,\n\t\toffset,\n\t\ttype: objType,\n\t\tfragmentType,\n\t\theaderSize,\n\t\tfragmentSize,\n\t\talignedSize,\n\t};\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_utils", "pages"]
7
7
  }
@@ -23,14 +23,14 @@ __export(NVM500_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(NVM500_exports);
25
25
  var import_core = require("@zwave-js/core");
26
- var import_safe = require("@zwave-js/shared/safe");
26
+ var import_shared = require("@zwave-js/shared");
27
27
  var import_definitions = require("./common/definitions.js");
28
28
  var import_routeCache = require("./common/routeCache.js");
29
29
  var import_sucUpdateEntry = require("./common/sucUpdateEntry.js");
30
30
  var import_utils = require("./common/utils.js");
31
31
  var import_EntryParsers = require("./nvm500/EntryParsers.js");
32
32
  var import_impls = require("./nvm500/impls/index.js");
33
- var import_shared = require("./nvm500/shared.js");
33
+ var import_shared2 = require("./nvm500/shared.js");
34
34
  class NVM500 {
35
35
  static {
36
36
  __name(this, "NVM500");
@@ -89,14 +89,14 @@ class NVM500 {
89
89
  let moduleSize = -1;
90
90
  const nvmEnd = await (0, import_utils.nvmReadUInt16BE)(this._io, 0);
91
91
  for (const entry of impl.layout) {
92
- const size = entry.size ?? import_shared.NVMEntrySizes[entry.type];
93
- if (entry.type === import_shared.NVMEntryType.NVMModuleSize) {
92
+ const size = entry.size ?? import_shared2.NVMEntrySizes[entry.type];
93
+ if (entry.type === import_shared2.NVMEntryType.NVMModuleSize) {
94
94
  if (moduleStart !== -1) {
95
95
  offset = moduleStart + moduleSize;
96
96
  }
97
97
  moduleStart = offset;
98
98
  moduleSize = await (0, import_utils.nvmReadUInt16BE)(this._io, offset);
99
- } else if (entry.type === import_shared.NVMEntryType.NVMModuleDescriptor) {
99
+ } else if (entry.type === import_shared2.NVMEntryType.NVMModuleDescriptor) {
100
100
  offset = moduleStart + moduleSize - size;
101
101
  }
102
102
  if (entry.offset != void 0 && entry.offset !== offset) {
@@ -107,10 +107,10 @@ class NVM500 {
107
107
  offset,
108
108
  size
109
109
  };
110
- if (entry.type === import_shared.NVMEntryType.NVMDescriptor) {
110
+ if (entry.type === import_shared2.NVMEntryType.NVMDescriptor) {
111
111
  const entryData = await this.readRawEntry(resolvedEntry);
112
112
  nvmDescriptor = (0, import_EntryParsers.parseNVMDescriptor)(entryData[0]);
113
- } else if (entry.type === import_shared.NVMEntryType.NVMModuleDescriptor) {
113
+ } else if (entry.type === import_shared2.NVMEntryType.NVMModuleDescriptor) {
114
114
  const entryData = await this.readRawEntry(resolvedEntry);
115
115
  const descriptor = (0, import_EntryParsers.parseNVMModuleDescriptor)(entryData[0]);
116
116
  if (descriptor.size !== moduleSize) {
@@ -154,7 +154,7 @@ class NVM500 {
154
154
  if (!endMarker_entry)
155
155
  return false;
156
156
  const endMarker = (await this.readEntry(endMarker_entry))[0];
157
- return eeoffset_magic === import_shared.MAGIC_VALUE && configuration_valid_0 === import_shared.CONFIGURATION_VALID_0 && configuration_valid_1 === import_shared.CONFIGURATION_VALID_1 && routecache_valid === import_shared.ROUTECACHE_VALID && protocolVersions.includes(info.nvmDescriptor.protocolVersion) && endMarker === 0;
157
+ return eeoffset_magic === import_shared2.MAGIC_VALUE && configuration_valid_0 === import_shared2.CONFIGURATION_VALID_0 && configuration_valid_1 === import_shared2.CONFIGURATION_VALID_1 && routecache_valid === import_shared2.ROUTECACHE_VALID && protocolVersions.includes(info.nvmDescriptor.protocolVersion) && endMarker === 0;
158
158
  }
159
159
  async has(property) {
160
160
  this._info ??= await this.init();
@@ -176,34 +176,34 @@ class NVM500 {
176
176
  }
177
177
  parseEntry(type, data) {
178
178
  switch (type) {
179
- case import_shared.NVMEntryType.Byte:
179
+ case import_shared2.NVMEntryType.Byte:
180
180
  return data.readUInt8(0);
181
- case import_shared.NVMEntryType.Word:
182
- case import_shared.NVMEntryType.NVMModuleSize:
181
+ case import_shared2.NVMEntryType.Word:
182
+ case import_shared2.NVMEntryType.NVMModuleSize:
183
183
  return data.readUInt16BE(0);
184
- case import_shared.NVMEntryType.DWord:
184
+ case import_shared2.NVMEntryType.DWord:
185
185
  return data.readUInt32BE(0);
186
- case import_shared.NVMEntryType.NodeInfo:
186
+ case import_shared2.NVMEntryType.NodeInfo:
187
187
  if (data.every((byte) => byte === 0)) {
188
188
  return void 0;
189
189
  }
190
190
  return (0, import_EntryParsers.parseNVM500NodeInfo)(data, 0);
191
- case import_shared.NVMEntryType.NodeMask:
191
+ case import_shared2.NVMEntryType.NodeMask:
192
192
  return (0, import_core.parseBitMask)(data);
193
- case import_shared.NVMEntryType.SUCUpdateEntry:
193
+ case import_shared2.NVMEntryType.SUCUpdateEntry:
194
194
  if (data.every((byte) => byte === 0)) {
195
195
  return void 0;
196
196
  }
197
197
  return (0, import_sucUpdateEntry.parseSUCUpdateEntry)(data, 0);
198
- case import_shared.NVMEntryType.Route:
198
+ case import_shared2.NVMEntryType.Route:
199
199
  if (data.every((byte) => byte === 0)) {
200
200
  return void 0;
201
201
  }
202
202
  return (0, import_routeCache.parseRoute)(data, 0);
203
- case import_shared.NVMEntryType.NVMModuleDescriptor: {
203
+ case import_shared2.NVMEntryType.NVMModuleDescriptor: {
204
204
  return (0, import_EntryParsers.parseNVMModuleDescriptor)(data);
205
205
  }
206
- case import_shared.NVMEntryType.NVMDescriptor:
206
+ case import_shared2.NVMEntryType.NVMDescriptor:
207
207
  return (0, import_EntryParsers.parseNVMDescriptor)(data);
208
208
  default:
209
209
  return data;
@@ -211,11 +211,11 @@ class NVM500 {
211
211
  }
212
212
  async readEntry(entry) {
213
213
  const data = await this.readRawEntry(entry);
214
- return data.map((buffer) => this.parseEntry(entry.type, import_safe.Bytes.view(buffer)));
214
+ return data.map((buffer) => this.parseEntry(entry.type, import_shared.Bytes.view(buffer)));
215
215
  }
216
216
  async readSingleEntry(entry, index) {
217
217
  const data = await this.readSingleRawEntry(entry, index);
218
- return this.parseEntry(entry.type, import_safe.Bytes.view(data));
218
+ return this.parseEntry(entry.type, import_shared.Bytes.view(data));
219
219
  }
220
220
  async get(property) {
221
221
  this._info ??= await this.init();
@@ -234,39 +234,39 @@ class NVM500 {
234
234
  return this.readSingleEntry(entry, index);
235
235
  }
236
236
  encodeEntry(type, data, entrySize) {
237
- const size = entrySize ?? import_shared.NVMEntrySizes[type];
237
+ const size = entrySize ?? import_shared2.NVMEntrySizes[type];
238
238
  switch (type) {
239
- case import_shared.NVMEntryType.Byte:
240
- return import_safe.Bytes.from([data]);
241
- case import_shared.NVMEntryType.Word:
242
- case import_shared.NVMEntryType.NVMModuleSize: {
243
- const ret = new import_safe.Bytes(2);
239
+ case import_shared2.NVMEntryType.Byte:
240
+ return import_shared.Bytes.from([data]);
241
+ case import_shared2.NVMEntryType.Word:
242
+ case import_shared2.NVMEntryType.NVMModuleSize: {
243
+ const ret = new import_shared.Bytes(2);
244
244
  ret.writeUInt16BE(data, 0);
245
245
  return ret;
246
246
  }
247
- case import_shared.NVMEntryType.DWord: {
248
- const ret = new import_safe.Bytes(4);
247
+ case import_shared2.NVMEntryType.DWord: {
248
+ const ret = new import_shared.Bytes(4);
249
249
  ret.writeUInt32BE(data, 0);
250
250
  return ret;
251
251
  }
252
- case import_shared.NVMEntryType.NodeInfo:
253
- return data ? (0, import_EntryParsers.encodeNVM500NodeInfo)(data) : new import_safe.Bytes(size).fill(0);
254
- case import_shared.NVMEntryType.NodeMask: {
255
- const ret = new import_safe.Bytes(size).fill(0);
252
+ case import_shared2.NVMEntryType.NodeInfo:
253
+ return data ? (0, import_EntryParsers.encodeNVM500NodeInfo)(data) : new import_shared.Bytes(size).fill(0);
254
+ case import_shared2.NVMEntryType.NodeMask: {
255
+ const ret = new import_shared.Bytes(size).fill(0);
256
256
  if (data) {
257
257
  ret.set((0, import_core.encodeBitMask)(data, import_core.MAX_NODES, 1), 0);
258
258
  }
259
259
  return ret;
260
260
  }
261
- case import_shared.NVMEntryType.SUCUpdateEntry:
261
+ case import_shared2.NVMEntryType.SUCUpdateEntry:
262
262
  return (0, import_sucUpdateEntry.encodeSUCUpdateEntry)(data);
263
- case import_shared.NVMEntryType.Route:
263
+ case import_shared2.NVMEntryType.Route:
264
264
  return (0, import_routeCache.encodeRoute)(data);
265
- case import_shared.NVMEntryType.NVMModuleDescriptor:
265
+ case import_shared2.NVMEntryType.NVMModuleDescriptor:
266
266
  return (0, import_EntryParsers.encodeNVMModuleDescriptor)(data);
267
- case import_shared.NVMEntryType.NVMDescriptor:
267
+ case import_shared2.NVMEntryType.NVMDescriptor:
268
268
  return (0, import_EntryParsers.encodeNVMDescriptor)(data);
269
- case import_shared.NVMEntryType.Buffer:
269
+ case import_shared2.NVMEntryType.Buffer:
270
270
  return data;
271
271
  }
272
272
  }
@@ -277,7 +277,7 @@ class NVM500 {
277
277
  return (0, import_utils.nvmWriteBuffer)(this._io, entry.offset + index * entry.size, data);
278
278
  }
279
279
  async writeRawEntry(entry, data) {
280
- await (0, import_utils.nvmWriteBuffer)(this._io, entry.offset, import_safe.Bytes.concat(data));
280
+ await (0, import_utils.nvmWriteBuffer)(this._io, entry.offset, import_shared.Bytes.concat(data));
281
281
  }
282
282
  async writeEntry(entry, data) {
283
283
  const buffers = data.map((d) => this.encodeEntry(entry.type, d, entry.size));
@@ -309,27 +309,27 @@ class NVM500 {
309
309
  const entry = this._info.layout.get(key);
310
310
  if (!entry)
311
311
  return;
312
- const size = entry.size ?? import_shared.NVMEntrySizes[entry.type];
312
+ const size = entry.size ?? import_shared2.NVMEntrySizes[entry.type];
313
313
  const data = [];
314
314
  for (let i = 1; i <= entry.count; i++) {
315
315
  switch (entry.type) {
316
- case import_shared.NVMEntryType.Byte:
317
- case import_shared.NVMEntryType.Word:
318
- case import_shared.NVMEntryType.DWord:
316
+ case import_shared2.NVMEntryType.Byte:
317
+ case import_shared2.NVMEntryType.Word:
318
+ case import_shared2.NVMEntryType.DWord:
319
319
  data.push(value);
320
320
  break;
321
- case import_shared.NVMEntryType.Buffer:
321
+ case import_shared2.NVMEntryType.Buffer:
322
322
  data.push(new Uint8Array(size).fill(value));
323
323
  break;
324
- case import_shared.NVMEntryType.NodeMask:
324
+ case import_shared2.NVMEntryType.NodeMask:
325
325
  data.push(new Array(size).fill(value));
326
326
  break;
327
- case import_shared.NVMEntryType.NodeInfo:
328
- case import_shared.NVMEntryType.Route:
327
+ case import_shared2.NVMEntryType.NodeInfo:
328
+ case import_shared2.NVMEntryType.Route:
329
329
  data.push(void 0);
330
330
  break;
331
331
  default:
332
- throw new Error(`Cannot fill entry of type ${import_shared.NVMEntryType[entry.type]}`);
332
+ throw new Error(`Cannot fill entry of type ${import_shared2.NVMEntryType[entry.type]}`);
333
333
  }
334
334
  }
335
335
  await this.writeEntry(entry, data);
@@ -341,15 +341,15 @@ class NVM500 {
341
341
  async erase(options) {
342
342
  await (0, import_utils.nvmWriteBuffer)(this._io, 0, new Uint8Array(options.nvmSize).fill(255));
343
343
  const layoutEntries = Array.from(options.layout.values());
344
- const moduleSizeEntries = layoutEntries.filter((entry) => entry.type === import_shared.NVMEntryType.NVMModuleSize);
345
- const moduleDescriptorEntries = layoutEntries.filter((entry) => entry.type === import_shared.NVMEntryType.NVMModuleDescriptor);
344
+ const moduleSizeEntries = layoutEntries.filter((entry) => entry.type === import_shared2.NVMEntryType.NVMModuleSize);
345
+ const moduleDescriptorEntries = layoutEntries.filter((entry) => entry.type === import_shared2.NVMEntryType.NVMModuleDescriptor);
346
346
  const moduleDescriptors = /* @__PURE__ */ new Map();
347
347
  for (let i = 0; i < moduleSizeEntries.length; i++) {
348
348
  const sizeEntry = moduleSizeEntries[i];
349
349
  const descriptorEntry = moduleDescriptorEntries[i];
350
350
  const size = descriptorEntry.offset + descriptorEntry.size - sizeEntry.offset;
351
351
  await this.writeEntry(sizeEntry, [size]);
352
- const moduleType = descriptorEntry.name === "nvmZWlibraryDescriptor" ? import_shared.NVMModuleType.ZW_LIBRARY : descriptorEntry.name === "nvmApplicationDescriptor" ? import_shared.NVMModuleType.APPLICATION : descriptorEntry.name === "nvmHostApplicationDescriptor" ? import_shared.NVMModuleType.HOST_APPLICATION : descriptorEntry.name === "nvmDescriptorDescriptor" ? import_shared.NVMModuleType.NVM_DESCRIPTOR : 0;
352
+ const moduleType = descriptorEntry.name === "nvmZWlibraryDescriptor" ? import_shared2.NVMModuleType.ZW_LIBRARY : descriptorEntry.name === "nvmApplicationDescriptor" ? import_shared2.NVMModuleType.APPLICATION : descriptorEntry.name === "nvmHostApplicationDescriptor" ? import_shared2.NVMModuleType.HOST_APPLICATION : descriptorEntry.name === "nvmDescriptorDescriptor" ? import_shared2.NVMModuleType.NVM_DESCRIPTOR : 0;
353
353
  const moduleDescriptor = {
354
354
  size,
355
355
  type: moduleType,
@@ -363,12 +363,12 @@ class NVM500 {
363
363
  moduleDescriptors
364
364
  };
365
365
  await this.set("nvmTotalEnd", [options.nvmSize - 1]);
366
- await this.set("NVM_CONFIGURATION_VALID_far", [import_shared.CONFIGURATION_VALID_0]);
366
+ await this.set("NVM_CONFIGURATION_VALID_far", [import_shared2.CONFIGURATION_VALID_0]);
367
367
  await this.set("NVM_CONFIGURATION_REALLYVALID_far", [
368
- import_shared.CONFIGURATION_VALID_1
368
+ import_shared2.CONFIGURATION_VALID_1
369
369
  ]);
370
- await this.set("EEOFFSET_MAGIC_far", [import_shared.MAGIC_VALUE]);
371
- await this.set("EX_NVM_ROUTECACHE_MAGIC_far", [import_shared.ROUTECACHE_VALID]);
370
+ await this.set("EEOFFSET_MAGIC_far", [import_shared2.MAGIC_VALUE]);
371
+ await this.set("EX_NVM_ROUTECACHE_MAGIC_far", [import_shared2.ROUTECACHE_VALID]);
372
372
  await this.set("nvmModuleSizeEndMarker", [0]);
373
373
  await this.set("nvmDescriptor", [options.nvmDescriptor]);
374
374
  await this.fill("NVM_INTERNAL_RESERVED_1_far", 0);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/NVM500.ts"],
4
- "sourcesContent": ["import {\n\tMAX_NODES,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tencodeBitMask,\n\tparseBitMask,\n} from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport { type NVM, NVMAccess, type NVMIO } from \"./common/definitions.js\";\nimport { type Route, encodeRoute, parseRoute } from \"./common/routeCache.js\";\nimport {\n\ttype SUCUpdateEntry,\n\tencodeSUCUpdateEntry,\n\tparseSUCUpdateEntry,\n} from \"./common/sucUpdateEntry.js\";\nimport {\n\tnvmReadBuffer,\n\tnvmReadUInt16BE,\n\tnvmWriteBuffer,\n} from \"./common/utils.js\";\nimport {\n\ttype NVM500NodeInfo,\n\ttype NVMDescriptor,\n\ttype NVMModuleDescriptor,\n\tencodeNVM500NodeInfo,\n\tencodeNVMDescriptor,\n\tencodeNVMModuleDescriptor,\n\tparseNVM500NodeInfo,\n\tparseNVMDescriptor,\n\tparseNVMModuleDescriptor,\n} from \"./nvm500/EntryParsers.js\";\nimport { nvm500Impls } from \"./nvm500/impls/index.js\";\nimport {\n\tCONFIGURATION_VALID_0,\n\tCONFIGURATION_VALID_1,\n\tMAGIC_VALUE,\n\ttype NVM500Impl,\n\ttype NVMData,\n\ttype NVMEntryName,\n\tNVMEntrySizes,\n\tNVMEntryType,\n\tNVMModuleType,\n\tROUTECACHE_VALID,\n\ttype ResolvedNVMEntry,\n\ttype ResolvedNVMLayout,\n} from \"./nvm500/shared.js\";\n\nexport interface NVM500Info {\n\tlayout: ResolvedNVMLayout;\n\tlibrary: NVM500Impl[\"library\"];\n\tmoduleDescriptors: Map<NVMEntryName, NVMModuleDescriptor>;\n\tnvmDescriptor: NVMDescriptor;\n}\n\nexport type NVM500EraseOptions = {\n\tlayout: ResolvedNVMLayout;\n\tnvmSize: number;\n\tlibrary: NVM500Impl[\"library\"];\n\tnvmDescriptor: NVMDescriptor;\n};\n\nexport class NVM500 implements NVM<NVMEntryName, NVMData[]> {\n\tpublic constructor(io: NVMIO) {\n\t\tthis._io = io;\n\t}\n\n\tprivate _io: NVMIO;\n\tprivate _access: NVMAccess = NVMAccess.None;\n\n\tprivate _info: NVM500Info | undefined;\n\tpublic get info(): NVM500Info | undefined {\n\t\treturn this._info;\n\t}\n\n\tprivate async ensureReadable(): Promise<void> {\n\t\tif (\n\t\t\tthis._access === NVMAccess.Read\n\t\t\t|| this._access === NVMAccess.ReadWrite\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._access === NVMAccess.Write) {\n\t\t\tawait this._io.close();\n\t\t}\n\t\tthis._access = await this._io.open(NVMAccess.Read);\n\t}\n\n\tprivate async ensureWritable(): Promise<void> {\n\t\tif (\n\t\t\tthis._access === NVMAccess.Write\n\t\t\t|| this._access === NVMAccess.ReadWrite\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._access === NVMAccess.Read) {\n\t\t\tawait this._io.close();\n\t\t}\n\t\tthis._access = await this._io.open(NVMAccess.Write);\n\t}\n\n\tpublic async init(): Promise<NVM500Info> {\n\t\tawait this.ensureReadable();\n\n\t\t// Try the different known layouts to find one that works\n\t\tfor (const impl of nvm500Impls) {\n\t\t\ttry {\n\t\t\t\tconst info = await this.resolveLayout(impl);\n\t\t\t\tif (await this.isLayoutValid(info, impl.protocolVersions)) {\n\t\t\t\t\tthis._info = info;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (!this._info) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Did not find a matching NVM 500 parser implementation! Make sure that the NVM data belongs to a controller with Z-Wave SDK 6.61 or higher.\",\n\t\t\t\tZWaveErrorCodes.NVM_NotSupported,\n\t\t\t);\n\t\t}\n\n\t\treturn this._info;\n\t}\n\n\tprivate async resolveLayout(impl: NVM500Impl): Promise<NVM500Info> {\n\t\tconst resolvedLayout = new Map<NVMEntryName, ResolvedNVMEntry>();\n\t\tlet nvmDescriptor: NVMDescriptor | undefined;\n\t\tconst moduleDescriptors = new Map<NVMEntryName, NVMModuleDescriptor>();\n\n\t\tlet offset = 0;\n\t\tlet moduleStart = -1;\n\t\tlet moduleSize = -1;\n\t\tconst nvmEnd = await nvmReadUInt16BE(this._io, 0);\n\n\t\tfor (const entry of impl.layout) {\n\t\t\tconst size = entry.size ?? NVMEntrySizes[entry.type];\n\n\t\t\tif (entry.type === NVMEntryType.NVMModuleSize) {\n\t\t\t\tif (moduleStart !== -1) {\n\t\t\t\t\t// All following NVM modules must start at the last module's end\n\t\t\t\t\toffset = moduleStart + moduleSize;\n\t\t\t\t}\n\n\t\t\t\tmoduleStart = offset;\n\t\t\t\tmoduleSize = await nvmReadUInt16BE(this._io, offset);\n\t\t\t} else if (entry.type === NVMEntryType.NVMModuleDescriptor) {\n\t\t\t\t// The module descriptor is always at the end of the module\n\t\t\t\toffset = moduleStart + moduleSize - size;\n\t\t\t}\n\n\t\t\tif (entry.offset != undefined && entry.offset !== offset) {\n\t\t\t\t// The entry has a defined offset but is at the wrong location\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`${entry.name} is at wrong location in NVM buffer!`,\n\t\t\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst resolvedEntry: ResolvedNVMEntry = {\n\t\t\t\t...entry,\n\t\t\t\toffset,\n\t\t\t\tsize,\n\t\t\t};\n\n\t\t\tif (entry.type === NVMEntryType.NVMDescriptor) {\n\t\t\t\tconst entryData = await this.readRawEntry(resolvedEntry);\n\t\t\t\t// NVMDescriptor is always a single entry\n\t\t\t\tnvmDescriptor = parseNVMDescriptor(entryData[0]);\n\t\t\t} else if (entry.type === NVMEntryType.NVMModuleDescriptor) {\n\t\t\t\tconst entryData = await this.readRawEntry(resolvedEntry);\n\t\t\t\t// NVMModuleDescriptor is always a single entry\n\t\t\t\tconst descriptor = parseNVMModuleDescriptor(\n\t\t\t\t\tentryData[0],\n\t\t\t\t);\n\t\t\t\tif (descriptor.size !== moduleSize) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\"NVM module descriptor size does not match module size!\",\n\t\t\t\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tmoduleDescriptors.set(entry.name, descriptor);\n\t\t\t}\n\n\t\t\tresolvedLayout.set(entry.name, resolvedEntry);\n\n\t\t\t// Skip forward\n\t\t\toffset += size * entry.count;\n\t\t\tif (offset >= nvmEnd) break;\n\t\t}\n\n\t\tif (!nvmDescriptor) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"NVM descriptor not found in NVM!\",\n\t\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tlayout: resolvedLayout,\n\t\t\tlibrary: impl.library,\n\t\t\tmoduleDescriptors,\n\t\t\tnvmDescriptor,\n\t\t};\n\t}\n\n\tprivate async isLayoutValid(\n\t\tinfo: NVM500Info,\n\t\tprotocolVersions: string[],\n\t): Promise<boolean> {\n\t\t// Checking if an NVM is valid requires checking multiple bytes at different locations\n\t\tconst eeoffset_magic_entry = info.layout.get(\"EEOFFSET_MAGIC_far\");\n\t\tif (!eeoffset_magic_entry) return false;\n\t\tconst eeoffset_magic =\n\t\t\t(await this.readEntry(eeoffset_magic_entry))[0] as number;\n\n\t\tconst configuration_valid_0_entry = info.layout.get(\n\t\t\t\"NVM_CONFIGURATION_VALID_far\",\n\t\t);\n\t\tif (!configuration_valid_0_entry) return false;\n\t\tconst configuration_valid_0 =\n\t\t\t(await this.readEntry(configuration_valid_0_entry))[0] as number;\n\n\t\tconst configuration_valid_1_entry = info.layout.get(\n\t\t\t\"NVM_CONFIGURATION_REALLYVALID_far\",\n\t\t);\n\t\tif (!configuration_valid_1_entry) return false;\n\t\tconst configuration_valid_1 =\n\t\t\t(await this.readEntry(configuration_valid_1_entry))[0] as number;\n\n\t\tconst routecache_valid_entry = info.layout.get(\n\t\t\t\"EX_NVM_ROUTECACHE_MAGIC_far\",\n\t\t);\n\t\tif (!routecache_valid_entry) return false;\n\t\tconst routecache_valid =\n\t\t\t(await this.readEntry(routecache_valid_entry))[0] as number;\n\n\t\tconst endMarker_entry = info.layout.get(\"nvmModuleSizeEndMarker\");\n\t\tif (!endMarker_entry) return false;\n\t\tconst endMarker = (await this.readEntry(endMarker_entry))[0] as number;\n\n\t\treturn (\n\t\t\teeoffset_magic === MAGIC_VALUE\n\t\t\t&& configuration_valid_0 === CONFIGURATION_VALID_0\n\t\t\t&& configuration_valid_1 === CONFIGURATION_VALID_1\n\t\t\t&& routecache_valid === ROUTECACHE_VALID\n\t\t\t&& protocolVersions.includes(info.nvmDescriptor.protocolVersion)\n\t\t\t&& endMarker === 0\n\t\t);\n\t}\n\n\tasync has(property: NVMEntryName): Promise<boolean> {\n\t\tthis._info ??= await this.init();\n\t\treturn this._info.layout.has(property);\n\t}\n\n\tprivate async readSingleRawEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tindex: number,\n\t): Promise<Uint8Array> {\n\t\tif (index >= entry.count) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Index out of range. Tried to read entry ${index} of ${entry.count}.`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\t\treturn nvmReadBuffer(\n\t\t\tthis._io,\n\t\t\tentry.offset + index * entry.size,\n\t\t\tentry.size,\n\t\t);\n\t}\n\n\tprivate async readRawEntry(\n\t\tentry: ResolvedNVMEntry,\n\t): Promise<Uint8Array[]> {\n\t\tconst ret: Uint8Array[] = [];\n\t\tconst nvmData = await nvmReadBuffer(\n\t\t\tthis._io,\n\t\t\tentry.offset,\n\t\t\tentry.count * entry.size,\n\t\t);\n\t\tfor (let i = 0; i < entry.count; i++) {\n\t\t\tret.push(\n\t\t\t\tnvmData.subarray(i * entry.size, (i + 1) * entry.size),\n\t\t\t);\n\t\t}\n\t\treturn ret;\n\t}\n\n\tprivate parseEntry(type: NVMEntryType, data: Bytes): NVMData {\n\t\tswitch (type) {\n\t\t\tcase NVMEntryType.Byte:\n\t\t\t\treturn data.readUInt8(0);\n\t\t\tcase NVMEntryType.Word:\n\t\t\tcase NVMEntryType.NVMModuleSize:\n\t\t\t\treturn data.readUInt16BE(0);\n\t\t\tcase NVMEntryType.DWord:\n\t\t\t\treturn data.readUInt32BE(0);\n\t\t\tcase NVMEntryType.NodeInfo:\n\t\t\t\tif (data.every((byte) => byte === 0)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn parseNVM500NodeInfo(data, 0);\n\t\t\tcase NVMEntryType.NodeMask:\n\t\t\t\treturn parseBitMask(data);\n\t\t\tcase NVMEntryType.SUCUpdateEntry:\n\t\t\t\tif (data.every((byte) => byte === 0)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn parseSUCUpdateEntry(data, 0);\n\t\t\tcase NVMEntryType.Route:\n\t\t\t\tif (data.every((byte) => byte === 0)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn parseRoute(data, 0);\n\t\t\tcase NVMEntryType.NVMModuleDescriptor: {\n\t\t\t\treturn parseNVMModuleDescriptor(data);\n\t\t\t}\n\t\t\tcase NVMEntryType.NVMDescriptor:\n\t\t\t\treturn parseNVMDescriptor(data);\n\t\t\tdefault:\n\t\t\t\t// This includes NVMEntryType.BUFFER\n\t\t\t\treturn data;\n\t\t}\n\t}\n\n\tprivate async readEntry(\n\t\tentry: ResolvedNVMEntry,\n\t): Promise<NVMData[]> {\n\t\tconst data: Uint8Array[] = await this.readRawEntry(entry);\n\t\treturn data.map((buffer) =>\n\t\t\tthis.parseEntry(entry.type, Bytes.view(buffer))\n\t\t);\n\t}\n\n\tprivate async readSingleEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tindex: number,\n\t): Promise<NVMData> {\n\t\tconst data = await this.readSingleRawEntry(entry, index);\n\t\treturn this.parseEntry(entry.type, Bytes.view(data));\n\t}\n\n\tpublic async get(property: NVMEntryName): Promise<NVMData[] | undefined> {\n\t\tthis._info ??= await this.init();\n\t\tawait this.ensureReadable();\n\n\t\tconst entry = this._info.layout.get(property);\n\t\tif (!entry) return undefined;\n\n\t\treturn this.readEntry(entry);\n\t}\n\n\tpublic async getSingle(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t): Promise<NVMData | undefined> {\n\t\tthis._info ??= await this.init();\n\t\tawait this.ensureReadable();\n\n\t\tconst entry = this._info.layout.get(property);\n\t\tif (!entry) return undefined;\n\n\t\treturn this.readSingleEntry(entry, index);\n\t}\n\n\tprivate encodeEntry(\n\t\ttype: NVMEntryType,\n\t\tdata: NVMData,\n\t\tentrySize?: number,\n\t): Bytes {\n\t\tconst size = entrySize ?? NVMEntrySizes[type];\n\n\t\tswitch (type) {\n\t\t\tcase NVMEntryType.Byte:\n\t\t\t\treturn Bytes.from([data as number]);\n\t\t\tcase NVMEntryType.Word:\n\t\t\tcase NVMEntryType.NVMModuleSize: {\n\t\t\t\tconst ret = new Bytes(2);\n\t\t\t\tret.writeUInt16BE(data as number, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tcase NVMEntryType.DWord: {\n\t\t\t\tconst ret = new Bytes(4);\n\t\t\t\tret.writeUInt32BE(data as number, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tcase NVMEntryType.NodeInfo:\n\t\t\t\treturn data\n\t\t\t\t\t? encodeNVM500NodeInfo(data as NVM500NodeInfo)\n\t\t\t\t\t: new Bytes(size).fill(0);\n\t\t\tcase NVMEntryType.NodeMask: {\n\t\t\t\tconst ret = new Bytes(size).fill(0);\n\t\t\t\tif (data) {\n\t\t\t\t\tret.set(encodeBitMask(data as number[], MAX_NODES, 1), 0);\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tcase NVMEntryType.SUCUpdateEntry:\n\t\t\t\treturn encodeSUCUpdateEntry(data as SUCUpdateEntry);\n\t\t\tcase NVMEntryType.Route:\n\t\t\t\treturn encodeRoute(data as Route);\n\t\t\tcase NVMEntryType.NVMModuleDescriptor:\n\t\t\t\treturn encodeNVMModuleDescriptor(\n\t\t\t\t\tdata as NVMModuleDescriptor,\n\t\t\t\t);\n\t\t\tcase NVMEntryType.NVMDescriptor:\n\t\t\t\treturn encodeNVMDescriptor(data as NVMDescriptor);\n\t\t\tcase NVMEntryType.Buffer:\n\t\t\t\treturn data as Bytes;\n\t\t}\n\t}\n\n\tprivate async writeSingleRawEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tindex: number,\n\t\tdata: Uint8Array,\n\t): Promise<void> {\n\t\tif (index >= entry.count) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Index out of range. Tried to write entry ${index} of ${entry.count}.`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\t\treturn nvmWriteBuffer(\n\t\t\tthis._io,\n\t\t\tentry.offset + index * entry.size,\n\t\t\tdata,\n\t\t);\n\t}\n\n\tprivate async writeRawEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tdata: Uint8Array[],\n\t): Promise<void> {\n\t\tawait nvmWriteBuffer(\n\t\t\tthis._io,\n\t\t\tentry.offset,\n\t\t\tBytes.concat(data),\n\t\t);\n\t}\n\n\tprivate async writeEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tdata: NVMData[],\n\t): Promise<void> {\n\t\tconst buffers = data.map((d) =>\n\t\t\tthis.encodeEntry(entry.type, d, entry.size)\n\t\t);\n\t\tawait this.writeRawEntry(entry, buffers);\n\t}\n\n\tprivate async writeSingleEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tindex: number,\n\t\tdata: NVMData,\n\t): Promise<void> {\n\t\tconst buffer = this.encodeEntry(entry.type, data, entry.size);\n\t\tawait this.writeSingleRawEntry(entry, index, buffer);\n\t}\n\n\tpublic async set(property: NVMEntryName, value: NVMData[]): Promise<void> {\n\t\tthis._info ??= await this.init();\n\t\tawait this.ensureWritable();\n\n\t\tconst entry = this._info.layout.get(property);\n\t\tif (!entry) return;\n\n\t\tawait this.writeEntry(entry, value);\n\t}\n\n\tpublic async setSingle(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t\tvalue: NVMData,\n\t): Promise<void> {\n\t\tthis._info ??= await this.init();\n\t\tawait this.ensureWritable();\n\n\t\tconst entry = this._info.layout.get(property);\n\t\tif (!entry) return undefined;\n\n\t\tawait this.writeSingleEntry(entry, index, value);\n\t}\n\n\tprivate async fill(key: NVMEntryName, value: number) {\n\t\tthis._info ??= await this.init();\n\t\tawait this.ensureWritable();\n\n\t\tconst entry = this._info.layout.get(key);\n\t\t// Skip entries not present in this layout\n\t\tif (!entry) return;\n\n\t\tconst size = entry.size ?? NVMEntrySizes[entry.type];\n\n\t\tconst data: NVMData[] = [];\n\t\tfor (let i = 1; i <= entry.count; i++) {\n\t\t\tswitch (entry.type) {\n\t\t\t\tcase NVMEntryType.Byte:\n\t\t\t\tcase NVMEntryType.Word:\n\t\t\t\tcase NVMEntryType.DWord:\n\t\t\t\t\tdata.push(value);\n\t\t\t\t\tbreak;\n\t\t\t\tcase NVMEntryType.Buffer:\n\t\t\t\t\tdata.push(new Uint8Array(size).fill(value));\n\t\t\t\t\tbreak;\n\t\t\t\tcase NVMEntryType.NodeMask:\n\t\t\t\t\tdata.push(new Array(size).fill(value));\n\t\t\t\t\tbreak;\n\t\t\t\tcase NVMEntryType.NodeInfo:\n\t\t\t\tcase NVMEntryType.Route:\n\t\t\t\t\tdata.push(undefined);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Cannot fill entry of type ${NVMEntryType[entry.type]}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tawait this.writeEntry(entry, data);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tpublic async delete(_property: NVMEntryName): Promise<void> {\n\t\tthrow new Error(\n\t\t\t\"Deleting entries is not supported for 500 series NVMs\",\n\t\t);\n\t}\n\n\tpublic async erase(\n\t\toptions: NVM500EraseOptions,\n\t): Promise<void> {\n\t\t// Blank NVM with 0xff\n\t\tawait nvmWriteBuffer(\n\t\t\tthis._io,\n\t\t\t0,\n\t\t\tnew Uint8Array(options.nvmSize).fill(0xff),\n\t\t);\n\n\t\t// Compute module sizes\n\t\tconst layoutEntries = Array.from(options.layout.values());\n\t\tconst moduleSizeEntries = layoutEntries\n\t\t\t.filter((entry) => entry.type === NVMEntryType.NVMModuleSize);\n\t\tconst moduleDescriptorEntries = layoutEntries\n\t\t\t.filter((entry) => entry.type === NVMEntryType.NVMModuleDescriptor);\n\t\tconst moduleDescriptors = new Map<NVMEntryName, NVMModuleDescriptor>();\n\t\t// Each module starts with a size marker and ends with a descriptor\n\t\tfor (let i = 0; i < moduleSizeEntries.length; i++) {\n\t\t\tconst sizeEntry = moduleSizeEntries[i];\n\t\t\tconst descriptorEntry = moduleDescriptorEntries[i];\n\t\t\tconst size = descriptorEntry.offset\n\t\t\t\t+ descriptorEntry.size\n\t\t\t\t- sizeEntry.offset;\n\n\t\t\t// Write each module size to their NVMModuleSize marker\n\t\t\tawait this.writeEntry(sizeEntry, [size]);\n\n\t\t\t// Write each module size, type and version to the NVMModuleDescriptor at the end\n\t\t\tconst moduleType = descriptorEntry.name === \"nvmZWlibraryDescriptor\"\n\t\t\t\t? NVMModuleType.ZW_LIBRARY\n\t\t\t\t: descriptorEntry.name === \"nvmApplicationDescriptor\"\n\t\t\t\t? NVMModuleType.APPLICATION\n\t\t\t\t: descriptorEntry.name === \"nvmHostApplicationDescriptor\"\n\t\t\t\t? NVMModuleType.HOST_APPLICATION\n\t\t\t\t: descriptorEntry.name === \"nvmDescriptorDescriptor\"\n\t\t\t\t? NVMModuleType.NVM_DESCRIPTOR\n\t\t\t\t: 0;\n\n\t\t\tconst moduleDescriptor: NVMModuleDescriptor = {\n\t\t\t\tsize,\n\t\t\t\ttype: moduleType,\n\t\t\t\tversion: descriptorEntry.name === \"nvmZWlibraryDescriptor\"\n\t\t\t\t\t? options.nvmDescriptor.protocolVersion\n\t\t\t\t\t: options.nvmDescriptor.firmwareVersion,\n\t\t\t};\n\t\t\tmoduleDescriptors.set(descriptorEntry.name, moduleDescriptor);\n\t\t\tawait this.writeEntry(descriptorEntry, [moduleDescriptor]);\n\t\t}\n\n\t\t// Initialize this._info, so the following works\n\t\tthis._info = {\n\t\t\t...options,\n\t\t\tmoduleDescriptors,\n\t\t};\n\n\t\t// Write NVM size to nvmTotalEnd\n\t\t// the value points to the last byte, therefore subtract 1\n\t\tawait this.set(\"nvmTotalEnd\", [options.nvmSize - 1]);\n\n\t\t// Set some entries that are always identical\n\t\tawait this.set(\"NVM_CONFIGURATION_VALID_far\", [CONFIGURATION_VALID_0]);\n\t\tawait this.set(\"NVM_CONFIGURATION_REALLYVALID_far\", [\n\t\t\tCONFIGURATION_VALID_1,\n\t\t]);\n\t\tawait this.set(\"EEOFFSET_MAGIC_far\", [MAGIC_VALUE]);\n\t\tawait this.set(\"EX_NVM_ROUTECACHE_MAGIC_far\", [ROUTECACHE_VALID]);\n\t\tawait this.set(\"nvmModuleSizeEndMarker\", [0]);\n\n\t\t// Set NVM descriptor\n\t\tawait this.set(\"nvmDescriptor\", [options.nvmDescriptor]);\n\n\t\t// Set dummy entries we're never going to fill\n\t\tawait this.fill(\"NVM_INTERNAL_RESERVED_1_far\", 0);\n\t\tawait this.fill(\"NVM_INTERNAL_RESERVED_2_far\", 0xff);\n\t\tawait this.fill(\"NVM_INTERNAL_RESERVED_3_far\", 0);\n\t\tawait this.fill(\"NVM_RTC_TIMERS_far\", 0);\n\t\tawait this.fill(\"EX_NVM_SUC_ACTIVE_START_far\", 0);\n\t\tawait this.fill(\"EX_NVM_ZENSOR_TABLE_START_far\", 0);\n\t\tawait this.fill(\"NVM_SECURITY0_KEY_far\", 0);\n\n\t\t// And blank fields that are not supposed to be filled with 0xff\n\t\tawait this.fill(\"EX_NVM_SUC_CONTROLLER_LIST_START_far\", 0xfe);\n\t\tawait this.fill(\"EX_NVM_NODE_TABLE_START_far\", 0);\n\t\tawait this.fill(\"EX_NVM_ROUTING_TABLE_START_far\", 0);\n\t\t// For routes the value does not matter\n\t\tawait this.fill(\"EX_NVM_ROUTECACHE_START_far\", 0);\n\t\tawait this.fill(\"EX_NVM_ROUTECACHE_NLWR_SR_START_far\", 0);\n\t}\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["import {\n\tMAX_NODES,\n\tZWaveError,\n\tZWaveErrorCodes,\n\tencodeBitMask,\n\tparseBitMask,\n} from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport { type NVM, NVMAccess, type NVMIO } from \"./common/definitions.js\";\nimport { type Route, encodeRoute, parseRoute } from \"./common/routeCache.js\";\nimport {\n\ttype SUCUpdateEntry,\n\tencodeSUCUpdateEntry,\n\tparseSUCUpdateEntry,\n} from \"./common/sucUpdateEntry.js\";\nimport {\n\tnvmReadBuffer,\n\tnvmReadUInt16BE,\n\tnvmWriteBuffer,\n} from \"./common/utils.js\";\nimport {\n\ttype NVM500NodeInfo,\n\ttype NVMDescriptor,\n\ttype NVMModuleDescriptor,\n\tencodeNVM500NodeInfo,\n\tencodeNVMDescriptor,\n\tencodeNVMModuleDescriptor,\n\tparseNVM500NodeInfo,\n\tparseNVMDescriptor,\n\tparseNVMModuleDescriptor,\n} from \"./nvm500/EntryParsers.js\";\nimport { nvm500Impls } from \"./nvm500/impls/index.js\";\nimport {\n\tCONFIGURATION_VALID_0,\n\tCONFIGURATION_VALID_1,\n\tMAGIC_VALUE,\n\ttype NVM500Impl,\n\ttype NVMData,\n\ttype NVMEntryName,\n\tNVMEntrySizes,\n\tNVMEntryType,\n\tNVMModuleType,\n\tROUTECACHE_VALID,\n\ttype ResolvedNVMEntry,\n\ttype ResolvedNVMLayout,\n} from \"./nvm500/shared.js\";\n\nexport interface NVM500Info {\n\tlayout: ResolvedNVMLayout;\n\tlibrary: NVM500Impl[\"library\"];\n\tmoduleDescriptors: Map<NVMEntryName, NVMModuleDescriptor>;\n\tnvmDescriptor: NVMDescriptor;\n}\n\nexport type NVM500EraseOptions = {\n\tlayout: ResolvedNVMLayout;\n\tnvmSize: number;\n\tlibrary: NVM500Impl[\"library\"];\n\tnvmDescriptor: NVMDescriptor;\n};\n\nexport class NVM500 implements NVM<NVMEntryName, NVMData[]> {\n\tpublic constructor(io: NVMIO) {\n\t\tthis._io = io;\n\t}\n\n\tprivate _io: NVMIO;\n\tprivate _access: NVMAccess = NVMAccess.None;\n\n\tprivate _info: NVM500Info | undefined;\n\tpublic get info(): NVM500Info | undefined {\n\t\treturn this._info;\n\t}\n\n\tprivate async ensureReadable(): Promise<void> {\n\t\tif (\n\t\t\tthis._access === NVMAccess.Read\n\t\t\t|| this._access === NVMAccess.ReadWrite\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._access === NVMAccess.Write) {\n\t\t\tawait this._io.close();\n\t\t}\n\t\tthis._access = await this._io.open(NVMAccess.Read);\n\t}\n\n\tprivate async ensureWritable(): Promise<void> {\n\t\tif (\n\t\t\tthis._access === NVMAccess.Write\n\t\t\t|| this._access === NVMAccess.ReadWrite\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._access === NVMAccess.Read) {\n\t\t\tawait this._io.close();\n\t\t}\n\t\tthis._access = await this._io.open(NVMAccess.Write);\n\t}\n\n\tpublic async init(): Promise<NVM500Info> {\n\t\tawait this.ensureReadable();\n\n\t\t// Try the different known layouts to find one that works\n\t\tfor (const impl of nvm500Impls) {\n\t\t\ttry {\n\t\t\t\tconst info = await this.resolveLayout(impl);\n\t\t\t\tif (await this.isLayoutValid(info, impl.protocolVersions)) {\n\t\t\t\t\tthis._info = info;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (!this._info) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Did not find a matching NVM 500 parser implementation! Make sure that the NVM data belongs to a controller with Z-Wave SDK 6.61 or higher.\",\n\t\t\t\tZWaveErrorCodes.NVM_NotSupported,\n\t\t\t);\n\t\t}\n\n\t\treturn this._info;\n\t}\n\n\tprivate async resolveLayout(impl: NVM500Impl): Promise<NVM500Info> {\n\t\tconst resolvedLayout = new Map<NVMEntryName, ResolvedNVMEntry>();\n\t\tlet nvmDescriptor: NVMDescriptor | undefined;\n\t\tconst moduleDescriptors = new Map<NVMEntryName, NVMModuleDescriptor>();\n\n\t\tlet offset = 0;\n\t\tlet moduleStart = -1;\n\t\tlet moduleSize = -1;\n\t\tconst nvmEnd = await nvmReadUInt16BE(this._io, 0);\n\n\t\tfor (const entry of impl.layout) {\n\t\t\tconst size = entry.size ?? NVMEntrySizes[entry.type];\n\n\t\t\tif (entry.type === NVMEntryType.NVMModuleSize) {\n\t\t\t\tif (moduleStart !== -1) {\n\t\t\t\t\t// All following NVM modules must start at the last module's end\n\t\t\t\t\toffset = moduleStart + moduleSize;\n\t\t\t\t}\n\n\t\t\t\tmoduleStart = offset;\n\t\t\t\tmoduleSize = await nvmReadUInt16BE(this._io, offset);\n\t\t\t} else if (entry.type === NVMEntryType.NVMModuleDescriptor) {\n\t\t\t\t// The module descriptor is always at the end of the module\n\t\t\t\toffset = moduleStart + moduleSize - size;\n\t\t\t}\n\n\t\t\tif (entry.offset != undefined && entry.offset !== offset) {\n\t\t\t\t// The entry has a defined offset but is at the wrong location\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`${entry.name} is at wrong location in NVM buffer!`,\n\t\t\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst resolvedEntry: ResolvedNVMEntry = {\n\t\t\t\t...entry,\n\t\t\t\toffset,\n\t\t\t\tsize,\n\t\t\t};\n\n\t\t\tif (entry.type === NVMEntryType.NVMDescriptor) {\n\t\t\t\tconst entryData = await this.readRawEntry(resolvedEntry);\n\t\t\t\t// NVMDescriptor is always a single entry\n\t\t\t\tnvmDescriptor = parseNVMDescriptor(entryData[0]);\n\t\t\t} else if (entry.type === NVMEntryType.NVMModuleDescriptor) {\n\t\t\t\tconst entryData = await this.readRawEntry(resolvedEntry);\n\t\t\t\t// NVMModuleDescriptor is always a single entry\n\t\t\t\tconst descriptor = parseNVMModuleDescriptor(\n\t\t\t\t\tentryData[0],\n\t\t\t\t);\n\t\t\t\tif (descriptor.size !== moduleSize) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\"NVM module descriptor size does not match module size!\",\n\t\t\t\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tmoduleDescriptors.set(entry.name, descriptor);\n\t\t\t}\n\n\t\t\tresolvedLayout.set(entry.name, resolvedEntry);\n\n\t\t\t// Skip forward\n\t\t\toffset += size * entry.count;\n\t\t\tif (offset >= nvmEnd) break;\n\t\t}\n\n\t\tif (!nvmDescriptor) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"NVM descriptor not found in NVM!\",\n\t\t\t\tZWaveErrorCodes.NVM_InvalidFormat,\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tlayout: resolvedLayout,\n\t\t\tlibrary: impl.library,\n\t\t\tmoduleDescriptors,\n\t\t\tnvmDescriptor,\n\t\t};\n\t}\n\n\tprivate async isLayoutValid(\n\t\tinfo: NVM500Info,\n\t\tprotocolVersions: string[],\n\t): Promise<boolean> {\n\t\t// Checking if an NVM is valid requires checking multiple bytes at different locations\n\t\tconst eeoffset_magic_entry = info.layout.get(\"EEOFFSET_MAGIC_far\");\n\t\tif (!eeoffset_magic_entry) return false;\n\t\tconst eeoffset_magic =\n\t\t\t(await this.readEntry(eeoffset_magic_entry))[0] as number;\n\n\t\tconst configuration_valid_0_entry = info.layout.get(\n\t\t\t\"NVM_CONFIGURATION_VALID_far\",\n\t\t);\n\t\tif (!configuration_valid_0_entry) return false;\n\t\tconst configuration_valid_0 =\n\t\t\t(await this.readEntry(configuration_valid_0_entry))[0] as number;\n\n\t\tconst configuration_valid_1_entry = info.layout.get(\n\t\t\t\"NVM_CONFIGURATION_REALLYVALID_far\",\n\t\t);\n\t\tif (!configuration_valid_1_entry) return false;\n\t\tconst configuration_valid_1 =\n\t\t\t(await this.readEntry(configuration_valid_1_entry))[0] as number;\n\n\t\tconst routecache_valid_entry = info.layout.get(\n\t\t\t\"EX_NVM_ROUTECACHE_MAGIC_far\",\n\t\t);\n\t\tif (!routecache_valid_entry) return false;\n\t\tconst routecache_valid =\n\t\t\t(await this.readEntry(routecache_valid_entry))[0] as number;\n\n\t\tconst endMarker_entry = info.layout.get(\"nvmModuleSizeEndMarker\");\n\t\tif (!endMarker_entry) return false;\n\t\tconst endMarker = (await this.readEntry(endMarker_entry))[0] as number;\n\n\t\treturn (\n\t\t\teeoffset_magic === MAGIC_VALUE\n\t\t\t&& configuration_valid_0 === CONFIGURATION_VALID_0\n\t\t\t&& configuration_valid_1 === CONFIGURATION_VALID_1\n\t\t\t&& routecache_valid === ROUTECACHE_VALID\n\t\t\t&& protocolVersions.includes(info.nvmDescriptor.protocolVersion)\n\t\t\t&& endMarker === 0\n\t\t);\n\t}\n\n\tasync has(property: NVMEntryName): Promise<boolean> {\n\t\tthis._info ??= await this.init();\n\t\treturn this._info.layout.has(property);\n\t}\n\n\tprivate async readSingleRawEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tindex: number,\n\t): Promise<Uint8Array> {\n\t\tif (index >= entry.count) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Index out of range. Tried to read entry ${index} of ${entry.count}.`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\t\treturn nvmReadBuffer(\n\t\t\tthis._io,\n\t\t\tentry.offset + index * entry.size,\n\t\t\tentry.size,\n\t\t);\n\t}\n\n\tprivate async readRawEntry(\n\t\tentry: ResolvedNVMEntry,\n\t): Promise<Uint8Array[]> {\n\t\tconst ret: Uint8Array[] = [];\n\t\tconst nvmData = await nvmReadBuffer(\n\t\t\tthis._io,\n\t\t\tentry.offset,\n\t\t\tentry.count * entry.size,\n\t\t);\n\t\tfor (let i = 0; i < entry.count; i++) {\n\t\t\tret.push(\n\t\t\t\tnvmData.subarray(i * entry.size, (i + 1) * entry.size),\n\t\t\t);\n\t\t}\n\t\treturn ret;\n\t}\n\n\tprivate parseEntry(type: NVMEntryType, data: Bytes): NVMData {\n\t\tswitch (type) {\n\t\t\tcase NVMEntryType.Byte:\n\t\t\t\treturn data.readUInt8(0);\n\t\t\tcase NVMEntryType.Word:\n\t\t\tcase NVMEntryType.NVMModuleSize:\n\t\t\t\treturn data.readUInt16BE(0);\n\t\t\tcase NVMEntryType.DWord:\n\t\t\t\treturn data.readUInt32BE(0);\n\t\t\tcase NVMEntryType.NodeInfo:\n\t\t\t\tif (data.every((byte) => byte === 0)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn parseNVM500NodeInfo(data, 0);\n\t\t\tcase NVMEntryType.NodeMask:\n\t\t\t\treturn parseBitMask(data);\n\t\t\tcase NVMEntryType.SUCUpdateEntry:\n\t\t\t\tif (data.every((byte) => byte === 0)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn parseSUCUpdateEntry(data, 0);\n\t\t\tcase NVMEntryType.Route:\n\t\t\t\tif (data.every((byte) => byte === 0)) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\treturn parseRoute(data, 0);\n\t\t\tcase NVMEntryType.NVMModuleDescriptor: {\n\t\t\t\treturn parseNVMModuleDescriptor(data);\n\t\t\t}\n\t\t\tcase NVMEntryType.NVMDescriptor:\n\t\t\t\treturn parseNVMDescriptor(data);\n\t\t\tdefault:\n\t\t\t\t// This includes NVMEntryType.BUFFER\n\t\t\t\treturn data;\n\t\t}\n\t}\n\n\tprivate async readEntry(\n\t\tentry: ResolvedNVMEntry,\n\t): Promise<NVMData[]> {\n\t\tconst data: Uint8Array[] = await this.readRawEntry(entry);\n\t\treturn data.map((buffer) =>\n\t\t\tthis.parseEntry(entry.type, Bytes.view(buffer))\n\t\t);\n\t}\n\n\tprivate async readSingleEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tindex: number,\n\t): Promise<NVMData> {\n\t\tconst data = await this.readSingleRawEntry(entry, index);\n\t\treturn this.parseEntry(entry.type, Bytes.view(data));\n\t}\n\n\tpublic async get(property: NVMEntryName): Promise<NVMData[] | undefined> {\n\t\tthis._info ??= await this.init();\n\t\tawait this.ensureReadable();\n\n\t\tconst entry = this._info.layout.get(property);\n\t\tif (!entry) return undefined;\n\n\t\treturn this.readEntry(entry);\n\t}\n\n\tpublic async getSingle(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t): Promise<NVMData | undefined> {\n\t\tthis._info ??= await this.init();\n\t\tawait this.ensureReadable();\n\n\t\tconst entry = this._info.layout.get(property);\n\t\tif (!entry) return undefined;\n\n\t\treturn this.readSingleEntry(entry, index);\n\t}\n\n\tprivate encodeEntry(\n\t\ttype: NVMEntryType,\n\t\tdata: NVMData,\n\t\tentrySize?: number,\n\t): Bytes {\n\t\tconst size = entrySize ?? NVMEntrySizes[type];\n\n\t\tswitch (type) {\n\t\t\tcase NVMEntryType.Byte:\n\t\t\t\treturn Bytes.from([data as number]);\n\t\t\tcase NVMEntryType.Word:\n\t\t\tcase NVMEntryType.NVMModuleSize: {\n\t\t\t\tconst ret = new Bytes(2);\n\t\t\t\tret.writeUInt16BE(data as number, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tcase NVMEntryType.DWord: {\n\t\t\t\tconst ret = new Bytes(4);\n\t\t\t\tret.writeUInt32BE(data as number, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tcase NVMEntryType.NodeInfo:\n\t\t\t\treturn data\n\t\t\t\t\t? encodeNVM500NodeInfo(data as NVM500NodeInfo)\n\t\t\t\t\t: new Bytes(size).fill(0);\n\t\t\tcase NVMEntryType.NodeMask: {\n\t\t\t\tconst ret = new Bytes(size).fill(0);\n\t\t\t\tif (data) {\n\t\t\t\t\tret.set(encodeBitMask(data as number[], MAX_NODES, 1), 0);\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t\tcase NVMEntryType.SUCUpdateEntry:\n\t\t\t\treturn encodeSUCUpdateEntry(data as SUCUpdateEntry);\n\t\t\tcase NVMEntryType.Route:\n\t\t\t\treturn encodeRoute(data as Route);\n\t\t\tcase NVMEntryType.NVMModuleDescriptor:\n\t\t\t\treturn encodeNVMModuleDescriptor(\n\t\t\t\t\tdata as NVMModuleDescriptor,\n\t\t\t\t);\n\t\t\tcase NVMEntryType.NVMDescriptor:\n\t\t\t\treturn encodeNVMDescriptor(data as NVMDescriptor);\n\t\t\tcase NVMEntryType.Buffer:\n\t\t\t\treturn data as Bytes;\n\t\t}\n\t}\n\n\tprivate async writeSingleRawEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tindex: number,\n\t\tdata: Uint8Array,\n\t): Promise<void> {\n\t\tif (index >= entry.count) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`Index out of range. Tried to write entry ${index} of ${entry.count}.`,\n\t\t\t\tZWaveErrorCodes.Argument_Invalid,\n\t\t\t);\n\t\t}\n\t\treturn nvmWriteBuffer(\n\t\t\tthis._io,\n\t\t\tentry.offset + index * entry.size,\n\t\t\tdata,\n\t\t);\n\t}\n\n\tprivate async writeRawEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tdata: Uint8Array[],\n\t): Promise<void> {\n\t\tawait nvmWriteBuffer(\n\t\t\tthis._io,\n\t\t\tentry.offset,\n\t\t\tBytes.concat(data),\n\t\t);\n\t}\n\n\tprivate async writeEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tdata: NVMData[],\n\t): Promise<void> {\n\t\tconst buffers = data.map((d) =>\n\t\t\tthis.encodeEntry(entry.type, d, entry.size)\n\t\t);\n\t\tawait this.writeRawEntry(entry, buffers);\n\t}\n\n\tprivate async writeSingleEntry(\n\t\tentry: ResolvedNVMEntry,\n\t\tindex: number,\n\t\tdata: NVMData,\n\t): Promise<void> {\n\t\tconst buffer = this.encodeEntry(entry.type, data, entry.size);\n\t\tawait this.writeSingleRawEntry(entry, index, buffer);\n\t}\n\n\tpublic async set(property: NVMEntryName, value: NVMData[]): Promise<void> {\n\t\tthis._info ??= await this.init();\n\t\tawait this.ensureWritable();\n\n\t\tconst entry = this._info.layout.get(property);\n\t\tif (!entry) return;\n\n\t\tawait this.writeEntry(entry, value);\n\t}\n\n\tpublic async setSingle(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t\tvalue: NVMData,\n\t): Promise<void> {\n\t\tthis._info ??= await this.init();\n\t\tawait this.ensureWritable();\n\n\t\tconst entry = this._info.layout.get(property);\n\t\tif (!entry) return undefined;\n\n\t\tawait this.writeSingleEntry(entry, index, value);\n\t}\n\n\tprivate async fill(key: NVMEntryName, value: number) {\n\t\tthis._info ??= await this.init();\n\t\tawait this.ensureWritable();\n\n\t\tconst entry = this._info.layout.get(key);\n\t\t// Skip entries not present in this layout\n\t\tif (!entry) return;\n\n\t\tconst size = entry.size ?? NVMEntrySizes[entry.type];\n\n\t\tconst data: NVMData[] = [];\n\t\tfor (let i = 1; i <= entry.count; i++) {\n\t\t\tswitch (entry.type) {\n\t\t\t\tcase NVMEntryType.Byte:\n\t\t\t\tcase NVMEntryType.Word:\n\t\t\t\tcase NVMEntryType.DWord:\n\t\t\t\t\tdata.push(value);\n\t\t\t\t\tbreak;\n\t\t\t\tcase NVMEntryType.Buffer:\n\t\t\t\t\tdata.push(new Uint8Array(size).fill(value));\n\t\t\t\t\tbreak;\n\t\t\t\tcase NVMEntryType.NodeMask:\n\t\t\t\t\tdata.push(new Array(size).fill(value));\n\t\t\t\t\tbreak;\n\t\t\t\tcase NVMEntryType.NodeInfo:\n\t\t\t\tcase NVMEntryType.Route:\n\t\t\t\t\tdata.push(undefined);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Cannot fill entry of type ${NVMEntryType[entry.type]}`,\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tawait this.writeEntry(entry, data);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tpublic async delete(_property: NVMEntryName): Promise<void> {\n\t\tthrow new Error(\n\t\t\t\"Deleting entries is not supported for 500 series NVMs\",\n\t\t);\n\t}\n\n\tpublic async erase(\n\t\toptions: NVM500EraseOptions,\n\t): Promise<void> {\n\t\t// Blank NVM with 0xff\n\t\tawait nvmWriteBuffer(\n\t\t\tthis._io,\n\t\t\t0,\n\t\t\tnew Uint8Array(options.nvmSize).fill(0xff),\n\t\t);\n\n\t\t// Compute module sizes\n\t\tconst layoutEntries = Array.from(options.layout.values());\n\t\tconst moduleSizeEntries = layoutEntries\n\t\t\t.filter((entry) => entry.type === NVMEntryType.NVMModuleSize);\n\t\tconst moduleDescriptorEntries = layoutEntries\n\t\t\t.filter((entry) => entry.type === NVMEntryType.NVMModuleDescriptor);\n\t\tconst moduleDescriptors = new Map<NVMEntryName, NVMModuleDescriptor>();\n\t\t// Each module starts with a size marker and ends with a descriptor\n\t\tfor (let i = 0; i < moduleSizeEntries.length; i++) {\n\t\t\tconst sizeEntry = moduleSizeEntries[i];\n\t\t\tconst descriptorEntry = moduleDescriptorEntries[i];\n\t\t\tconst size = descriptorEntry.offset\n\t\t\t\t+ descriptorEntry.size\n\t\t\t\t- sizeEntry.offset;\n\n\t\t\t// Write each module size to their NVMModuleSize marker\n\t\t\tawait this.writeEntry(sizeEntry, [size]);\n\n\t\t\t// Write each module size, type and version to the NVMModuleDescriptor at the end\n\t\t\tconst moduleType = descriptorEntry.name === \"nvmZWlibraryDescriptor\"\n\t\t\t\t? NVMModuleType.ZW_LIBRARY\n\t\t\t\t: descriptorEntry.name === \"nvmApplicationDescriptor\"\n\t\t\t\t? NVMModuleType.APPLICATION\n\t\t\t\t: descriptorEntry.name === \"nvmHostApplicationDescriptor\"\n\t\t\t\t? NVMModuleType.HOST_APPLICATION\n\t\t\t\t: descriptorEntry.name === \"nvmDescriptorDescriptor\"\n\t\t\t\t? NVMModuleType.NVM_DESCRIPTOR\n\t\t\t\t: 0;\n\n\t\t\tconst moduleDescriptor: NVMModuleDescriptor = {\n\t\t\t\tsize,\n\t\t\t\ttype: moduleType,\n\t\t\t\tversion: descriptorEntry.name === \"nvmZWlibraryDescriptor\"\n\t\t\t\t\t? options.nvmDescriptor.protocolVersion\n\t\t\t\t\t: options.nvmDescriptor.firmwareVersion,\n\t\t\t};\n\t\t\tmoduleDescriptors.set(descriptorEntry.name, moduleDescriptor);\n\t\t\tawait this.writeEntry(descriptorEntry, [moduleDescriptor]);\n\t\t}\n\n\t\t// Initialize this._info, so the following works\n\t\tthis._info = {\n\t\t\t...options,\n\t\t\tmoduleDescriptors,\n\t\t};\n\n\t\t// Write NVM size to nvmTotalEnd\n\t\t// the value points to the last byte, therefore subtract 1\n\t\tawait this.set(\"nvmTotalEnd\", [options.nvmSize - 1]);\n\n\t\t// Set some entries that are always identical\n\t\tawait this.set(\"NVM_CONFIGURATION_VALID_far\", [CONFIGURATION_VALID_0]);\n\t\tawait this.set(\"NVM_CONFIGURATION_REALLYVALID_far\", [\n\t\t\tCONFIGURATION_VALID_1,\n\t\t]);\n\t\tawait this.set(\"EEOFFSET_MAGIC_far\", [MAGIC_VALUE]);\n\t\tawait this.set(\"EX_NVM_ROUTECACHE_MAGIC_far\", [ROUTECACHE_VALID]);\n\t\tawait this.set(\"nvmModuleSizeEndMarker\", [0]);\n\n\t\t// Set NVM descriptor\n\t\tawait this.set(\"nvmDescriptor\", [options.nvmDescriptor]);\n\n\t\t// Set dummy entries we're never going to fill\n\t\tawait this.fill(\"NVM_INTERNAL_RESERVED_1_far\", 0);\n\t\tawait this.fill(\"NVM_INTERNAL_RESERVED_2_far\", 0xff);\n\t\tawait this.fill(\"NVM_INTERNAL_RESERVED_3_far\", 0);\n\t\tawait this.fill(\"NVM_RTC_TIMERS_far\", 0);\n\t\tawait this.fill(\"EX_NVM_SUC_ACTIVE_START_far\", 0);\n\t\tawait this.fill(\"EX_NVM_ZENSOR_TABLE_START_far\", 0);\n\t\tawait this.fill(\"NVM_SECURITY0_KEY_far\", 0);\n\n\t\t// And blank fields that are not supposed to be filled with 0xff\n\t\tawait this.fill(\"EX_NVM_SUC_CONTROLLER_LIST_START_far\", 0xfe);\n\t\tawait this.fill(\"EX_NVM_NODE_TABLE_START_far\", 0);\n\t\tawait this.fill(\"EX_NVM_ROUTING_TABLE_START_far\", 0);\n\t\t// For routes the value does not matter\n\t\tawait this.fill(\"EX_NVM_ROUTECACHE_START_far\", 0);\n\t\tawait this.fill(\"EX_NVM_ROUTECACHE_NLWR_SR_START_far\", 0);\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_shared"]
7
7
  }
@@ -1,8 +1,8 @@
1
- import { type CommandClasses } from "@zwave-js/core";
2
- import { type Expand } from "@zwave-js/shared";
3
- import { type ApplicationCCsFile, type ApplicationRFConfigFile, type ApplicationTypeFile, type ControllerInfoFile, type LRNodeInfo, type NodeInfo } from "../nvm3/files/index.js";
4
- import { type Route } from "./routeCache.js";
5
- import { type SUCUpdateEntry } from "./sucUpdateEntry.js";
1
+ import type { CommandClasses } from "@zwave-js/core";
2
+ import type { Expand } from "@zwave-js/shared";
3
+ import type { ApplicationCCsFile, ApplicationRFConfigFile, ApplicationTypeFile, ControllerInfoFile, LRNodeInfo, NodeInfo } from "../nvm3/files/index.js";
4
+ import type { Route } from "./routeCache.js";
5
+ import type { SUCUpdateEntry } from "./sucUpdateEntry.js";
6
6
  export declare enum NVMAccess {
7
7
  None = 0,
8
8
  Read = 1,