@zwave-js/nvmedit 15.1.0 → 15.1.2
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.
- package/build/cjs/convert.d.ts +3 -3
- package/build/cjs/convert.js +45 -45
- package/build/cjs/convert.js.map +3 -3
- package/build/cjs/lib/NVM3.js +17 -17
- package/build/cjs/lib/NVM3.js.map +3 -3
- package/build/cjs/lib/NVM500.js +54 -54
- package/build/cjs/lib/NVM500.js.map +3 -3
- package/build/cjs/lib/common/definitions.d.ts +5 -5
- package/build/cjs/lib/common/definitions.js.map +1 -1
- package/build/cjs/lib/common/routeCache.d.ts +2 -2
- package/build/cjs/lib/common/routeCache.js +10 -10
- package/build/cjs/lib/common/routeCache.js.map +3 -3
- package/build/cjs/lib/common/sucUpdateEntry.d.ts +1 -1
- package/build/cjs/lib/common/sucUpdateEntry.js +4 -4
- package/build/cjs/lib/common/sucUpdateEntry.js.map +1 -1
- package/build/cjs/lib/common/utils.js +6 -6
- package/build/cjs/lib/common/utils.js.map +2 -2
- package/build/cjs/lib/io/BufferedNVMReader.d.ts +1 -1
- package/build/cjs/lib/io/BufferedNVMReader.js +2 -2
- package/build/cjs/lib/io/BufferedNVMReader.js.map +2 -2
- package/build/cjs/lib/nvm3/adapter.d.ts +2 -2
- package/build/cjs/lib/nvm3/adapter.js +6 -6
- package/build/cjs/lib/nvm3/adapter.js.map +3 -3
- package/build/cjs/lib/nvm3/files/ApplicationCCsFile.d.ts +2 -2
- package/build/cjs/lib/nvm3/files/ApplicationCCsFile.js +6 -6
- package/build/cjs/lib/nvm3/files/ApplicationCCsFile.js.map +3 -3
- package/build/cjs/lib/nvm3/files/ApplicationDataFile.d.ts +1 -1
- package/build/cjs/lib/nvm3/files/ApplicationDataFile.js.map +1 -1
- package/build/cjs/lib/nvm3/files/ApplicationNameFile.d.ts +1 -1
- package/build/cjs/lib/nvm3/files/ApplicationNameFile.js.map +1 -1
- package/build/cjs/lib/nvm3/files/ApplicationRFConfigFile.d.ts +2 -2
- package/build/cjs/lib/nvm3/files/ApplicationRFConfigFile.js +9 -9
- package/build/cjs/lib/nvm3/files/ApplicationRFConfigFile.js.map +3 -3
- package/build/cjs/lib/nvm3/files/ApplicationTypeFile.d.ts +1 -1
- package/build/cjs/lib/nvm3/files/ApplicationTypeFile.js +2 -2
- package/build/cjs/lib/nvm3/files/ApplicationTypeFile.js.map +2 -2
- package/build/cjs/lib/nvm3/files/ControllerInfoFile.js +3 -3
- package/build/cjs/lib/nvm3/files/ControllerInfoFile.js.map +2 -2
- package/build/cjs/lib/nvm3/files/NVMFile.js +4 -4
- package/build/cjs/lib/nvm3/files/NVMFile.js.map +2 -2
- package/build/cjs/lib/nvm3/files/NodeInfoFiles.d.ts +2 -2
- package/build/cjs/lib/nvm3/files/NodeInfoFiles.js +18 -18
- package/build/cjs/lib/nvm3/files/NodeInfoFiles.js.map +3 -3
- package/build/cjs/lib/nvm3/files/ProtocolNodeMaskFiles.d.ts +1 -1
- package/build/cjs/lib/nvm3/files/ProtocolNodeMaskFiles.js +5 -5
- package/build/cjs/lib/nvm3/files/ProtocolNodeMaskFiles.js.map +1 -1
- package/build/cjs/lib/nvm3/files/RouteCacheFiles.d.ts +1 -1
- package/build/cjs/lib/nvm3/files/RouteCacheFiles.js +11 -11
- package/build/cjs/lib/nvm3/files/RouteCacheFiles.js.map +3 -3
- package/build/cjs/lib/nvm3/files/SUCUpdateEntriesFile.d.ts +1 -1
- package/build/cjs/lib/nvm3/files/SUCUpdateEntriesFile.js +3 -3
- package/build/cjs/lib/nvm3/files/SUCUpdateEntriesFile.js.map +2 -2
- package/build/cjs/lib/nvm3/page.d.ts +1 -1
- package/build/cjs/lib/nvm3/page.js.map +1 -1
- package/build/cjs/lib/nvm3/utils.d.ts +1 -1
- package/build/cjs/lib/nvm3/utils.js +3 -3
- package/build/cjs/lib/nvm3/utils.js.map +1 -1
- package/build/cjs/lib/nvm500/EntryParsers.d.ts +2 -2
- package/build/cjs/lib/nvm500/EntryParsers.js +10 -10
- package/build/cjs/lib/nvm500/EntryParsers.js.map +3 -3
- package/build/cjs/lib/nvm500/adapter.d.ts +2 -2
- package/build/cjs/lib/nvm500/adapter.js.map +1 -1
- package/build/cjs/lib/nvm500/impls/Bridge_6_6x.d.ts +1 -1
- package/build/cjs/lib/nvm500/impls/Bridge_6_6x.js +7 -7
- package/build/cjs/lib/nvm500/impls/Bridge_6_6x.js.map +2 -2
- package/build/cjs/lib/nvm500/impls/Bridge_6_7x.d.ts +1 -1
- package/build/cjs/lib/nvm500/impls/Bridge_6_7x.js +7 -7
- package/build/cjs/lib/nvm500/impls/Bridge_6_7x.js.map +2 -2
- package/build/cjs/lib/nvm500/impls/Bridge_6_8x.d.ts +1 -1
- package/build/cjs/lib/nvm500/impls/Bridge_6_8x.js +7 -7
- package/build/cjs/lib/nvm500/impls/Bridge_6_8x.js.map +2 -2
- package/build/cjs/lib/nvm500/impls/Static_6_6x.d.ts +1 -1
- package/build/cjs/lib/nvm500/impls/Static_6_6x.js +7 -7
- package/build/cjs/lib/nvm500/impls/Static_6_6x.js.map +2 -2
- package/build/cjs/lib/nvm500/impls/Static_6_7x.d.ts +1 -1
- package/build/cjs/lib/nvm500/impls/Static_6_7x.js +7 -7
- package/build/cjs/lib/nvm500/impls/Static_6_7x.js.map +2 -2
- package/build/cjs/lib/nvm500/impls/Static_6_8x.d.ts +1 -1
- package/build/cjs/lib/nvm500/impls/Static_6_8x.js +7 -7
- package/build/cjs/lib/nvm500/impls/Static_6_8x.js.map +2 -2
- package/build/cjs/lib/nvm500/shared.d.ts +2 -2
- package/build/cjs/lib/nvm500/shared.js +2 -2
- package/build/cjs/lib/nvm500/shared.js.map +1 -1
- package/build/cjs/nvm500/NVMParser.d.ts +5 -5
- package/build/esm/convert.d.ts +3 -3
- package/build/esm/convert.d.ts.map +1 -1
- package/build/esm/convert.js +2 -2
- package/build/esm/convert.js.map +1 -1
- package/build/esm/lib/NVM3.js +2 -2
- package/build/esm/lib/NVM3.js.map +1 -1
- package/build/esm/lib/NVM500.js +1 -1
- package/build/esm/lib/NVM500.js.map +1 -1
- package/build/esm/lib/common/definitions.d.ts +5 -5
- package/build/esm/lib/common/definitions.d.ts.map +1 -1
- package/build/esm/lib/common/routeCache.d.ts +2 -2
- package/build/esm/lib/common/routeCache.d.ts.map +1 -1
- package/build/esm/lib/common/routeCache.js +2 -2
- package/build/esm/lib/common/routeCache.js.map +1 -1
- package/build/esm/lib/common/sucUpdateEntry.d.ts +1 -1
- package/build/esm/lib/common/sucUpdateEntry.d.ts.map +1 -1
- package/build/esm/lib/common/sucUpdateEntry.js +1 -1
- package/build/esm/lib/common/sucUpdateEntry.js.map +1 -1
- package/build/esm/lib/common/utils.js +1 -1
- package/build/esm/lib/common/utils.js.map +1 -1
- package/build/esm/lib/io/BufferedNVMReader.d.ts +1 -1
- package/build/esm/lib/io/BufferedNVMReader.d.ts.map +1 -1
- package/build/esm/lib/io/BufferedNVMReader.js +1 -1
- package/build/esm/lib/io/BufferedNVMReader.js.map +1 -1
- package/build/esm/lib/nvm3/adapter.d.ts +2 -2
- package/build/esm/lib/nvm3/adapter.d.ts.map +1 -1
- package/build/esm/lib/nvm3/adapter.js +2 -2
- package/build/esm/lib/nvm3/adapter.js.map +1 -1
- package/build/esm/lib/nvm3/files/ApplicationCCsFile.d.ts +2 -2
- package/build/esm/lib/nvm3/files/ApplicationCCsFile.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/ApplicationCCsFile.js +2 -2
- package/build/esm/lib/nvm3/files/ApplicationCCsFile.js.map +1 -1
- package/build/esm/lib/nvm3/files/ApplicationDataFile.d.ts +1 -1
- package/build/esm/lib/nvm3/files/ApplicationDataFile.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/ApplicationNameFile.d.ts +1 -1
- package/build/esm/lib/nvm3/files/ApplicationNameFile.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/ApplicationRFConfigFile.d.ts +2 -2
- package/build/esm/lib/nvm3/files/ApplicationRFConfigFile.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/ApplicationRFConfigFile.js +2 -2
- package/build/esm/lib/nvm3/files/ApplicationRFConfigFile.js.map +1 -1
- package/build/esm/lib/nvm3/files/ApplicationTypeFile.d.ts +1 -1
- package/build/esm/lib/nvm3/files/ApplicationTypeFile.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/ApplicationTypeFile.js +1 -1
- package/build/esm/lib/nvm3/files/ApplicationTypeFile.js.map +1 -1
- package/build/esm/lib/nvm3/files/ControllerInfoFile.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/ControllerInfoFile.js +1 -1
- package/build/esm/lib/nvm3/files/ControllerInfoFile.js.map +1 -1
- package/build/esm/lib/nvm3/files/NVMFile.js +1 -1
- package/build/esm/lib/nvm3/files/NVMFile.js.map +1 -1
- package/build/esm/lib/nvm3/files/NodeInfoFiles.d.ts +2 -2
- package/build/esm/lib/nvm3/files/NodeInfoFiles.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/NodeInfoFiles.js +2 -2
- package/build/esm/lib/nvm3/files/NodeInfoFiles.js.map +1 -1
- package/build/esm/lib/nvm3/files/ProtocolNodeMaskFiles.d.ts +1 -1
- package/build/esm/lib/nvm3/files/ProtocolNodeMaskFiles.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/ProtocolNodeMaskFiles.js +1 -1
- package/build/esm/lib/nvm3/files/ProtocolNodeMaskFiles.js.map +1 -1
- package/build/esm/lib/nvm3/files/RouteCacheFiles.d.ts +1 -1
- package/build/esm/lib/nvm3/files/RouteCacheFiles.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/RouteCacheFiles.js +2 -2
- package/build/esm/lib/nvm3/files/RouteCacheFiles.js.map +1 -1
- package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.d.ts +1 -1
- package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.js +1 -1
- package/build/esm/lib/nvm3/files/SUCUpdateEntriesFile.js.map +1 -1
- package/build/esm/lib/nvm3/page.d.ts +1 -1
- package/build/esm/lib/nvm3/page.d.ts.map +1 -1
- package/build/esm/lib/nvm3/utils.d.ts +1 -1
- package/build/esm/lib/nvm3/utils.d.ts.map +1 -1
- package/build/esm/lib/nvm3/utils.js +1 -1
- package/build/esm/lib/nvm3/utils.js.map +1 -1
- package/build/esm/lib/nvm500/EntryParsers.d.ts +2 -2
- package/build/esm/lib/nvm500/EntryParsers.d.ts.map +1 -1
- package/build/esm/lib/nvm500/EntryParsers.js +2 -2
- package/build/esm/lib/nvm500/EntryParsers.js.map +1 -1
- package/build/esm/lib/nvm500/adapter.d.ts +2 -2
- package/build/esm/lib/nvm500/adapter.d.ts.map +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_6x.d.ts +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_6x.d.ts.map +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_6x.js +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_6x.js.map +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_7x.d.ts +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_7x.d.ts.map +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_7x.js +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_7x.js.map +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_8x.d.ts +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_8x.d.ts.map +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_8x.js +1 -1
- package/build/esm/lib/nvm500/impls/Bridge_6_8x.js.map +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_6x.d.ts +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_6x.d.ts.map +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_6x.js +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_6x.js.map +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_7x.d.ts +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_7x.d.ts.map +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_7x.js +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_7x.js.map +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_8x.d.ts +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_8x.d.ts.map +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_8x.js +1 -1
- package/build/esm/lib/nvm500/impls/Static_6_8x.js.map +1 -1
- package/build/esm/lib/nvm500/shared.d.ts +2 -2
- package/build/esm/lib/nvm500/shared.d.ts.map +1 -1
- package/build/esm/lib/nvm500/shared.js +1 -1
- package/build/esm/lib/nvm500/shared.js.map +1 -1
- package/build/esm/nvm500/NVMParser.d.ts +5 -5
- package/build/esm/nvm500/NVMParser.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/nvm3/adapter.ts"],
|
|
4
|
-
"sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core/safe\";\nimport { num2hex } from \"@zwave-js/shared/safe\";\nimport { assertNever } from \"alcalzone-shared/helpers\";\nimport { SUC_MAX_UPDATES } from \"../../consts.js\";\nimport { type NVM3 } from \"../NVM3.js\";\nimport {\n\ttype ControllerNVMProperty,\n\ttype LRNodeNVMProperty,\n\ttype NVMAdapter,\n\ttype NVMProperty,\n\ttype NVMPropertyToDataType,\n\ttype NodeNVMProperty,\n} from \"../common/definitions.js\";\nimport { type RouteCache } from \"../common/routeCache.js\";\nimport {\n\ttype ApplicationCCsFile,\n\tApplicationCCsFileID,\n\tApplicationDataFile,\n\tApplicationDataFileID,\n\tApplicationNameFile,\n\tApplicationNameFileID,\n\ttype ApplicationRFConfigFile,\n\tApplicationRFConfigFileID,\n\ttype ApplicationTypeFile,\n\tApplicationTypeFileID,\n\ttype ApplicationVersionFile,\n\ttype ApplicationVersionFile800,\n\tApplicationVersionFile800ID,\n\tApplicationVersionFileID,\n\ttype ControllerInfoFile,\n\tControllerInfoFileID,\n\tLRNodeInfoFileV5,\n\tNVMFile,\n\tNodeInfoFileV0,\n\tNodeInfoFileV1,\n\tProtocolAppRouteLockNodeMaskFile,\n\tProtocolAppRouteLockNodeMaskFileID,\n\tProtocolLRNodeListFile,\n\tProtocolLRNodeListFileID,\n\tProtocolNodeListFile,\n\tProtocolNodeListFileID,\n\tProtocolPendingDiscoveryNodeMaskFile,\n\tProtocolPendingDiscoveryNodeMaskFileID,\n\tProtocolPreferredRepeatersFile,\n\tProtocolPreferredRepeatersFileID,\n\tProtocolRouteCacheExistsNodeMaskFile,\n\tProtocolRouteCacheExistsNodeMaskFileID,\n\tProtocolRouteSlaveSUCNodeMaskFile,\n\tProtocolRouteSlaveSUCNodeMaskFileID,\n\tProtocolSUCPendingUpdateNodeMaskFile,\n\tProtocolSUCPendingUpdateNodeMaskFileID,\n\ttype ProtocolVersionFile,\n\tProtocolVersionFileID,\n\tProtocolVirtualNodeMaskFile,\n\tProtocolVirtualNodeMaskFileID,\n\tRouteCacheFileV0,\n\tRouteCacheFileV1,\n\tSUCUpdateEntriesFileIDV0,\n\tSUCUpdateEntriesFileV0,\n\tSUCUpdateEntriesFileV5,\n\tSUCUpdateEntriesFileV5IDBase,\n\tSUCUpdateEntriesFileV5IDMax,\n\tSUC_UPDATES_PER_FILE_V5,\n\tgetNVMSectionByFileID,\n\tnodeIdToLRNodeInfoFileIDV5,\n\tnodeIdToNodeInfoFileIDV0,\n\tnodeIdToNodeInfoFileIDV1,\n\tnodeIdToRouteCacheFileIDV0,\n\tnodeIdToRouteCacheFileIDV1,\n\tsucUpdateIndexToSUCUpdateEntriesFileIDV5,\n} from \"./files/index.js\";\n\nconst DEFAULT_FILE_VERSION = \"7.0.0\";\n\nexport class NVM3Adapter implements NVMAdapter {\n\tpublic constructor(nvm: NVM3) {\n\t\tthis._nvm = nvm;\n\t}\n\n\tprivate _nvm: NVM3;\n\tprivate _initialized: boolean = false;\n\n\tprivate _protocolInfo: {\n\t\tversion: string;\n\t\tformat: number;\n\t} | undefined;\n\tprivate _applicationInfo: {\n\t\tversion: string;\n\t\tformat: number;\n\t} | undefined;\n\n\t/** A list of pending changes that haven't been written to the NVM yet. `null` indicates a deleted entry. */\n\tprivate _pendingChanges: Map<number, Uint8Array | null> = new Map();\n\n\tprivate getFileVersion(fileId: number): string {\n\t\tif (\n\t\t\tfileId === ProtocolVersionFileID\n\t\t\t|| fileId === ApplicationVersionFileID\n\t\t\t|| fileId === ApplicationVersionFile800ID\n\t\t) {\n\t\t\treturn DEFAULT_FILE_VERSION;\n\t\t}\n\t\tconst section = getNVMSectionByFileID(fileId);\n\t\tif (section === \"application\") {\n\t\t\treturn this._applicationInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t} else if (section === \"protocol\") {\n\t\t\treturn this._protocolInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t}\n\n\t\treturn DEFAULT_FILE_VERSION;\n\t}\n\n\tprivate async init(): Promise<void> {\n\t\tif (!this._protocolInfo) {\n\t\t\tconst protocolVersionFile = await this._getFile<\n\t\t\t\tProtocolVersionFile\n\t\t\t>(\n\t\t\t\tProtocolVersionFileID,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tif (protocolVersionFile) {\n\t\t\t\tconst version =\n\t\t\t\t\t`${protocolVersionFile.major}.${protocolVersionFile.minor}.${protocolVersionFile.patch}`;\n\t\t\t\tthis._protocolInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: protocolVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (!this._applicationInfo) {\n\t\t\tconst applicationVersionFile700 = await this._getFile<\n\t\t\t\tApplicationVersionFile\n\t\t\t>(ApplicationVersionFileID, true);\n\t\t\tconst applicationVersionFile800 = await this._getFile<\n\t\t\t\tApplicationVersionFile800\n\t\t\t>(ApplicationVersionFile800ID, true);\n\t\t\tconst applicationVersionFile = applicationVersionFile700\n\t\t\t\t?? applicationVersionFile800;\n\n\t\t\tif (applicationVersionFile) {\n\t\t\t\tconst version =\n\t\t\t\t\t`${applicationVersionFile.major}.${applicationVersionFile.minor}.${applicationVersionFile.patch}`;\n\t\t\t\tthis._applicationInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: applicationVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tthis._initialized = true;\n\t}\n\n\t/** Adds a complete file to the list of pending changes */\n\tpublic setFile(file: NVMFile): void {\n\t\tconst { key, data } = file.serialize();\n\t\tthis._pendingChanges.set(key, data);\n\t}\n\n\tpublic async hasFile(fileId: number): Promise<boolean> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\treturn this._pendingChanges.get(fileId) !== null;\n\t\t} else {\n\t\t\treturn this._nvm.has(fileId);\n\t\t}\n\t}\n\n\tprivate async _getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T | undefined> {\n\t\tif (!skipInit && !this._initialized) await this.init();\n\n\t\t// Prefer pending changes over the actual NVM, so changes can be composed\n\t\tlet data: Uint8Array | null | undefined;\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\tdata = this._pendingChanges.get(fileId);\n\t\t} else {\n\t\t\tdata = await this._nvm.get(fileId);\n\t\t}\n\t\tif (!data) return;\n\n\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\treturn NVMFile.from(fileId, data, fileVersion) as T;\n\t}\n\n\tprivate async _expectFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T> {\n\t\tconst file = await this._getFile<T>(fileId, skipInit);\n\t\tif (!file) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`NVM file ${num2hex(fileId)} not found`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\t\treturn file;\n\t}\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired: true,\n\t): Promise<T>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: false,\n\t): Promise<T | undefined>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: boolean,\n\t): Promise<unknown> {\n\t\tif (required) {\n\t\t\treturn this._expectFile<T>(fileId) as any;\n\t\t} else {\n\t\t\treturn this._getFile<T>(fileId) as any;\n\t\t}\n\t}\n\n\tpublic get<T extends NVMProperty, R extends boolean = boolean>(\n\t\tproperty: T,\n\t\trequired?: R,\n\t): Promise<\n\t\tR extends true ? NVMPropertyToDataType<T>\n\t\t\t: (NVMPropertyToDataType<T> | undefined)\n\t> {\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.getControllerNVMProperty(property, !!required) as any;\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.getLRNodeNVMProperty(property, !!required) as any;\n\t\t} else {\n\t\t\treturn this.getNodeNVMProperty(property, !!required) as any;\n\t\t}\n\t}\n\n\tprivate async getControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tif (!file) return;\n\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.format;\n\t\t\t}\n\t\t\tcase \"applicationVersion\":\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\n\t\t\t\tif (!file) {\n\t\t\t\t\tif (required) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (property.type === \"applicationVersion\") {\n\t\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t\t} else if (property.type === \"applicationFileFormat\") {\n\t\t\t\t\treturn file?.format;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = await getFile<ApplicationDataFile>(\n\t\t\t\t\tApplicationDataFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.applicationData;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = await getFile<ApplicationNameFile>(\n\t\t\t\t\tApplicationNameFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.name;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file = await getFile<ControllerInfoFile>(\n\t\t\t\t\tControllerInfoFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file = await getFile<ApplicationCCsFile>(\n\t\t\t\t\tApplicationCCsFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await getFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await getFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = await getFile<ProtocolPreferredRepeatersFile>(\n\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = await getFile<SUCUpdateEntriesFileV0>(\n\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.updateEntries;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tconst updateEntries = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\t// None of the files are required\n\t\t\t\t\t\tconst file = await this._getFile<\n\t\t\t\t\t\t\tSUCUpdateEntriesFileV5\n\t\t\t\t\t\t>(\n\t\t\t\t\t\t\tsucUpdateIndexToSUCUpdateEntriesFileIDV5(index),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!file) break;\n\t\t\t\t\t\tupdateEntries.push(...file.updateEntries);\n\t\t\t\t\t}\n\t\t\t\t\treturn updateEntries;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV0>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV0(\n\t\t\t\t\t\t\tproperty.nodeId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfo;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV1(\n\t\t\t\t\t\t\tproperty.nodeId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfos.find((info) =>\n\t\t\t\t\t\tinfo.nodeId === property.nodeId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile = await this.getFile<\n\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFile\n\t\t\t\t>(ProtocolRouteCacheExistsNodeMaskFileID);\n\n\t\t\t\t// If the node is not marked as having routes, don't try to read them\n\t\t\t\tif (!nodeMaskFile) return;\n\t\t\t\tif (!nodeMaskFile.nodeIdSet.has(property.nodeId)) return;\n\n\t\t\t\tlet routeCache: RouteCache | undefined;\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV0>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV0(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCache;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV1(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCaches.find((route) =>\n\t\t\t\t\t\troute.nodeId === property.nodeId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!routeCache) return;\n\t\t\t\treturn {\n\t\t\t\t\tlwr: routeCache.lwr,\n\t\t\t\t\tnlwr: routeCache.nlwr,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst file = await getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tnodeIdToLRNodeInfoFileIDV5(property.nodeId),\n\t\t\t\t);\n\t\t\t\treturn file?.nodeInfos.find((info) =>\n\t\t\t\t\tinfo.nodeId === property.nodeId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tpublic async set<T extends NVMProperty>(\n\t\tproperty: T,\n\t\tvalue: NVMPropertyToDataType<T>,\n\t): Promise<void> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.setControllerNVMProperty(property, value);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.setLRNodeNVMProperty(property, value);\n\t\t} else {\n\t\t\treturn this.setNodeNVMProperty(property, value);\n\t\t}\n\t}\n\n\tprivate async setControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tfunction failFileMissing(): never {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot set property in NVM for non-existing file\",\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\n\t\tconst expectFile = async <T extends NVMFile>(\n\t\t\tfileId: number,\n\t\t): Promise<T> => {\n\t\t\tconst file = await this._getFile<T>(fileId);\n\t\t\tif (!file) failFileMissing();\n\t\t\treturn file;\n\t\t};\n\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst [major, minor, patch] = (value as string).split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationVersion\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\t\t\t\tif (!file) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst [major, minor, patch] = (value as string).split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file = await expectFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = new ApplicationDataFile({\n\t\t\t\t\tapplicationData: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationDataFileID),\n\t\t\t\t});\n\t\t\t\tfile.applicationData = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = new ApplicationNameFile({\n\t\t\t\t\tname: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationNameFileID),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file = await expectFile<ControllerInfoFile>(\n\t\t\t\t\tControllerInfoFileID,\n\t\t\t\t);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file = await expectFile<ApplicationCCsFile>(\n\t\t\t\t\tApplicationCCsFileID,\n\t\t\t\t);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await expectFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await expectFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t) ?? new ProtocolNodeListFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(ProtocolNodeListFileID),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t) ?? new ProtocolLRNodeListFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(ProtocolLRNodeListFileID),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t) ?? new ProtocolVirtualNodeMaskFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = new ProtocolPreferredRepeatersFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = new ProtocolAppRouteLockNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = new ProtocolRouteSlaveSUCNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = new ProtocolSUCPendingUpdateNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = new ProtocolPendingDiscoveryNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = new SUCUpdateEntriesFileV0({\n\t\t\t\t\t\tupdateEntries: value,\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst fileId = sucUpdateIndexToSUCUpdateEntriesFileIDV5(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst fileExists = await this.hasFile(fileId);\n\t\t\t\t\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\t\t\t\t\tconst slice = value.slice(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tindex + SUC_UPDATES_PER_FILE_V5,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (slice.length > 0) {\n\t\t\t\t\t\t\tconst file = new SUCUpdateEntriesFileV5({\n\t\t\t\t\t\t\t\tupdateEntries: slice,\n\t\t\t\t\t\t\t\tfileId,\n\t\t\t\t\t\t\t\tfileVersion,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t} else if (fileExists) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst fileId = nodeIdToLRNodeInfoFileIDV5(property.nodeId);\n\t\t\t\tlet file = await this._getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tfileId,\n\t\t\t\t);\n\t\t\t\tif (value) {\n\t\t\t\t\t// Info added or modified\n\t\t\t\t\tfile ??= new LRNodeInfoFileV5({\n\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t} else if (file) {\n\t\t\t\t\t// info deleted\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single node info per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV0({\n\t\t\t\t\t\t\tnodeInfo: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.nodeInfo = value;\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple node infos per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV1(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tfileId,\n\t\t\t\t\t);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV1({\n\t\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single route per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<RouteCacheFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Route added or modified\n\t\t\t\t\t\tfile ??= new RouteCacheFileV0({\n\t\t\t\t\t\t\trouteCache: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.routeCache = {\n\t\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// Route deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple routes per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV1(property.nodeId);\n\t\t\t\t\tconst file = await this._getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tfileId,\n\t\t\t\t\t) ?? new RouteCacheFileV1({\n\t\t\t\t\t\trouteCaches: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.routeCaches.findIndex(\n\t\t\t\t\t\t(route) => route.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tconst newRoute: RouteCache = {\n\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t};\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.routeCaches[existingIndex] = newRoute;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.routeCaches.push(newRoute);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t}\n\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile = await this._getFile<\n\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFile\n\t\t\t\t>(ProtocolRouteCacheExistsNodeMaskFileID)\n\t\t\t\t\t?? new ProtocolRouteCacheExistsNodeMaskFile({\n\t\t\t\t\t\tnodeIds: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFileID,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\n\t\t\t\tif (!value && nodeMaskFile.nodeIdSet.has(property.nodeId)) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.delete(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t} else if (\n\t\t\t\t\tvalue && !nodeMaskFile.nodeIdSet.has(property.nodeId)\n\t\t\t\t) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.add(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tpublic async delete(\n\t\tproperty: NVMProperty,\n\t): Promise<void> {\n\t\tif (property.domain === \"controller\") {\n\t\t\tswitch (property.type) {\n\t\t\t\tcase \"protocolVersion\":\n\t\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\t\tthis._pendingChanges.set(ProtocolVersionFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationVersion\":\n\t\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFileID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFile800ID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationData\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationDataFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationName\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationNameFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"homeId\":\n\t\t\t\tcase \"nodeId\":\n\t\t\t\tcase \"lastNodeId\":\n\t\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\tcase \"sucLastIndex\":\n\t\t\t\tcase \"controllerConfiguration\":\n\t\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\t\tcase \"maxNodeId\":\n\t\t\t\tcase \"reservedId\":\n\t\t\t\tcase \"systemState\":\n\t\t\t\tcase \"lastNodeIdLR\":\n\t\t\t\tcase \"maxNodeIdLR\":\n\t\t\t\tcase \"reservedIdLR\":\n\t\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\t\tcase \"dcdcConfig\": {\n\t\t\t\t\tthis._pendingChanges.set(ControllerInfoFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"includedInsecurely\":\n\t\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationCCsFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"rfRegion\":\n\t\t\t\tcase \"txPower\":\n\t\t\t\tcase \"measured0dBm\":\n\t\t\t\tcase \"enablePTI\":\n\t\t\t\tcase \"maxTXPower\":\n\t\t\t\tcase \"nodeIdType\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationRFConfigFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"isListening\":\n\t\t\t\tcase \"optionalFunctionality\":\n\t\t\t\tcase \"genericDeviceClass\":\n\t\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationTypeFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"nodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"lrNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"appRouteLock\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tlet id = SUCUpdateEntriesFileV5IDBase;\n\t\t\t\t\t\t\tid <= SUCUpdateEntriesFileV5IDMax;\n\t\t\t\t\t\t\tid++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (await this.hasFile(id)) {\n\t\t\t\t\t\t\t\tthis._pendingChanges.set(id, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"learnedHomeId\":\n\t\t\t\tcase \"commandClasses\":\n\t\t\t\tcase \"watchdogStarted\":\n\t\t\t\tcase \"powerLevelNormal\":\n\t\t\t\tcase \"powerLevelLow\":\n\t\t\t\tcase \"powerMode\":\n\t\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\t\treturn;\n\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(property);\n\t\t\t}\n\t\t} else if (\n\t\t\tproperty.domain === \"lrnode\"\n\t\t) {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setLRNodeNVMProperty(property, undefined);\n\t\t} else if (\n\t\t\tproperty.domain === \"node\"\n\t\t) {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setNodeNVMProperty(property, undefined);\n\t\t}\n\t}\n\n\tpublic hasPendingChanges(): boolean {\n\t\treturn this._pendingChanges.size > 0;\n\t}\n\n\tpublic async commit(): Promise<void> {\n\t\tawait this._nvm.setMany([...this._pendingChanges]);\n\t}\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": [
|
|
4
|
+
"sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport { num2hex } from \"@zwave-js/shared\";\nimport { assertNever } from \"alcalzone-shared/helpers\";\nimport { SUC_MAX_UPDATES } from \"../../consts.js\";\nimport type { NVM3 } from \"../NVM3.js\";\nimport type {\n\tControllerNVMProperty,\n\tLRNodeNVMProperty,\n\tNVMAdapter,\n\tNVMProperty,\n\tNVMPropertyToDataType,\n\tNodeNVMProperty,\n} from \"../common/definitions.js\";\nimport type { RouteCache } from \"../common/routeCache.js\";\nimport {\n\ttype ApplicationCCsFile,\n\tApplicationCCsFileID,\n\tApplicationDataFile,\n\tApplicationDataFileID,\n\tApplicationNameFile,\n\tApplicationNameFileID,\n\ttype ApplicationRFConfigFile,\n\tApplicationRFConfigFileID,\n\ttype ApplicationTypeFile,\n\tApplicationTypeFileID,\n\ttype ApplicationVersionFile,\n\ttype ApplicationVersionFile800,\n\tApplicationVersionFile800ID,\n\tApplicationVersionFileID,\n\ttype ControllerInfoFile,\n\tControllerInfoFileID,\n\tLRNodeInfoFileV5,\n\tNVMFile,\n\tNodeInfoFileV0,\n\tNodeInfoFileV1,\n\tProtocolAppRouteLockNodeMaskFile,\n\tProtocolAppRouteLockNodeMaskFileID,\n\tProtocolLRNodeListFile,\n\tProtocolLRNodeListFileID,\n\tProtocolNodeListFile,\n\tProtocolNodeListFileID,\n\tProtocolPendingDiscoveryNodeMaskFile,\n\tProtocolPendingDiscoveryNodeMaskFileID,\n\tProtocolPreferredRepeatersFile,\n\tProtocolPreferredRepeatersFileID,\n\tProtocolRouteCacheExistsNodeMaskFile,\n\tProtocolRouteCacheExistsNodeMaskFileID,\n\tProtocolRouteSlaveSUCNodeMaskFile,\n\tProtocolRouteSlaveSUCNodeMaskFileID,\n\tProtocolSUCPendingUpdateNodeMaskFile,\n\tProtocolSUCPendingUpdateNodeMaskFileID,\n\ttype ProtocolVersionFile,\n\tProtocolVersionFileID,\n\tProtocolVirtualNodeMaskFile,\n\tProtocolVirtualNodeMaskFileID,\n\tRouteCacheFileV0,\n\tRouteCacheFileV1,\n\tSUCUpdateEntriesFileIDV0,\n\tSUCUpdateEntriesFileV0,\n\tSUCUpdateEntriesFileV5,\n\tSUCUpdateEntriesFileV5IDBase,\n\tSUCUpdateEntriesFileV5IDMax,\n\tSUC_UPDATES_PER_FILE_V5,\n\tgetNVMSectionByFileID,\n\tnodeIdToLRNodeInfoFileIDV5,\n\tnodeIdToNodeInfoFileIDV0,\n\tnodeIdToNodeInfoFileIDV1,\n\tnodeIdToRouteCacheFileIDV0,\n\tnodeIdToRouteCacheFileIDV1,\n\tsucUpdateIndexToSUCUpdateEntriesFileIDV5,\n} from \"./files/index.js\";\n\nconst DEFAULT_FILE_VERSION = \"7.0.0\";\n\nexport class NVM3Adapter implements NVMAdapter {\n\tpublic constructor(nvm: NVM3) {\n\t\tthis._nvm = nvm;\n\t}\n\n\tprivate _nvm: NVM3;\n\tprivate _initialized: boolean = false;\n\n\tprivate _protocolInfo: {\n\t\tversion: string;\n\t\tformat: number;\n\t} | undefined;\n\tprivate _applicationInfo: {\n\t\tversion: string;\n\t\tformat: number;\n\t} | undefined;\n\n\t/** A list of pending changes that haven't been written to the NVM yet. `null` indicates a deleted entry. */\n\tprivate _pendingChanges: Map<number, Uint8Array | null> = new Map();\n\n\tprivate getFileVersion(fileId: number): string {\n\t\tif (\n\t\t\tfileId === ProtocolVersionFileID\n\t\t\t|| fileId === ApplicationVersionFileID\n\t\t\t|| fileId === ApplicationVersionFile800ID\n\t\t) {\n\t\t\treturn DEFAULT_FILE_VERSION;\n\t\t}\n\t\tconst section = getNVMSectionByFileID(fileId);\n\t\tif (section === \"application\") {\n\t\t\treturn this._applicationInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t} else if (section === \"protocol\") {\n\t\t\treturn this._protocolInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t}\n\n\t\treturn DEFAULT_FILE_VERSION;\n\t}\n\n\tprivate async init(): Promise<void> {\n\t\tif (!this._protocolInfo) {\n\t\t\tconst protocolVersionFile = await this._getFile<\n\t\t\t\tProtocolVersionFile\n\t\t\t>(\n\t\t\t\tProtocolVersionFileID,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tif (protocolVersionFile) {\n\t\t\t\tconst version =\n\t\t\t\t\t`${protocolVersionFile.major}.${protocolVersionFile.minor}.${protocolVersionFile.patch}`;\n\t\t\t\tthis._protocolInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: protocolVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (!this._applicationInfo) {\n\t\t\tconst applicationVersionFile700 = await this._getFile<\n\t\t\t\tApplicationVersionFile\n\t\t\t>(ApplicationVersionFileID, true);\n\t\t\tconst applicationVersionFile800 = await this._getFile<\n\t\t\t\tApplicationVersionFile800\n\t\t\t>(ApplicationVersionFile800ID, true);\n\t\t\tconst applicationVersionFile = applicationVersionFile700\n\t\t\t\t?? applicationVersionFile800;\n\n\t\t\tif (applicationVersionFile) {\n\t\t\t\tconst version =\n\t\t\t\t\t`${applicationVersionFile.major}.${applicationVersionFile.minor}.${applicationVersionFile.patch}`;\n\t\t\t\tthis._applicationInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: applicationVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tthis._initialized = true;\n\t}\n\n\t/** Adds a complete file to the list of pending changes */\n\tpublic setFile(file: NVMFile): void {\n\t\tconst { key, data } = file.serialize();\n\t\tthis._pendingChanges.set(key, data);\n\t}\n\n\tpublic async hasFile(fileId: number): Promise<boolean> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\treturn this._pendingChanges.get(fileId) !== null;\n\t\t} else {\n\t\t\treturn this._nvm.has(fileId);\n\t\t}\n\t}\n\n\tprivate async _getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T | undefined> {\n\t\tif (!skipInit && !this._initialized) await this.init();\n\n\t\t// Prefer pending changes over the actual NVM, so changes can be composed\n\t\tlet data: Uint8Array | null | undefined;\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\tdata = this._pendingChanges.get(fileId);\n\t\t} else {\n\t\t\tdata = await this._nvm.get(fileId);\n\t\t}\n\t\tif (!data) return;\n\n\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\treturn NVMFile.from(fileId, data, fileVersion) as T;\n\t}\n\n\tprivate async _expectFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T> {\n\t\tconst file = await this._getFile<T>(fileId, skipInit);\n\t\tif (!file) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`NVM file ${num2hex(fileId)} not found`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\t\treturn file;\n\t}\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired: true,\n\t): Promise<T>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: false,\n\t): Promise<T | undefined>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: boolean,\n\t): Promise<unknown> {\n\t\tif (required) {\n\t\t\treturn this._expectFile<T>(fileId) as any;\n\t\t} else {\n\t\t\treturn this._getFile<T>(fileId) as any;\n\t\t}\n\t}\n\n\tpublic get<T extends NVMProperty, R extends boolean = boolean>(\n\t\tproperty: T,\n\t\trequired?: R,\n\t): Promise<\n\t\tR extends true ? NVMPropertyToDataType<T>\n\t\t\t: (NVMPropertyToDataType<T> | undefined)\n\t> {\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.getControllerNVMProperty(property, !!required) as any;\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.getLRNodeNVMProperty(property, !!required) as any;\n\t\t} else {\n\t\t\treturn this.getNodeNVMProperty(property, !!required) as any;\n\t\t}\n\t}\n\n\tprivate async getControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tif (!file) return;\n\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.format;\n\t\t\t}\n\t\t\tcase \"applicationVersion\":\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\n\t\t\t\tif (!file) {\n\t\t\t\t\tif (required) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (property.type === \"applicationVersion\") {\n\t\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t\t} else if (property.type === \"applicationFileFormat\") {\n\t\t\t\t\treturn file?.format;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = await getFile<ApplicationDataFile>(\n\t\t\t\t\tApplicationDataFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.applicationData;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = await getFile<ApplicationNameFile>(\n\t\t\t\t\tApplicationNameFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.name;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file = await getFile<ControllerInfoFile>(\n\t\t\t\t\tControllerInfoFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file = await getFile<ApplicationCCsFile>(\n\t\t\t\t\tApplicationCCsFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await getFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await getFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = await getFile<ProtocolPreferredRepeatersFile>(\n\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = await getFile<SUCUpdateEntriesFileV0>(\n\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.updateEntries;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tconst updateEntries = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\t// None of the files are required\n\t\t\t\t\t\tconst file = await this._getFile<\n\t\t\t\t\t\t\tSUCUpdateEntriesFileV5\n\t\t\t\t\t\t>(\n\t\t\t\t\t\t\tsucUpdateIndexToSUCUpdateEntriesFileIDV5(index),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!file) break;\n\t\t\t\t\t\tupdateEntries.push(...file.updateEntries);\n\t\t\t\t\t}\n\t\t\t\t\treturn updateEntries;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV0>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV0(\n\t\t\t\t\t\t\tproperty.nodeId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfo;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV1(\n\t\t\t\t\t\t\tproperty.nodeId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfos.find((info) =>\n\t\t\t\t\t\tinfo.nodeId === property.nodeId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile = await this.getFile<\n\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFile\n\t\t\t\t>(ProtocolRouteCacheExistsNodeMaskFileID);\n\n\t\t\t\t// If the node is not marked as having routes, don't try to read them\n\t\t\t\tif (!nodeMaskFile) return;\n\t\t\t\tif (!nodeMaskFile.nodeIdSet.has(property.nodeId)) return;\n\n\t\t\t\tlet routeCache: RouteCache | undefined;\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV0>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV0(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCache;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV1(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCaches.find((route) =>\n\t\t\t\t\t\troute.nodeId === property.nodeId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!routeCache) return;\n\t\t\t\treturn {\n\t\t\t\t\tlwr: routeCache.lwr,\n\t\t\t\t\tnlwr: routeCache.nlwr,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst file = await getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tnodeIdToLRNodeInfoFileIDV5(property.nodeId),\n\t\t\t\t);\n\t\t\t\treturn file?.nodeInfos.find((info) =>\n\t\t\t\t\tinfo.nodeId === property.nodeId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tpublic async set<T extends NVMProperty>(\n\t\tproperty: T,\n\t\tvalue: NVMPropertyToDataType<T>,\n\t): Promise<void> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.setControllerNVMProperty(property, value);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.setLRNodeNVMProperty(property, value);\n\t\t} else {\n\t\t\treturn this.setNodeNVMProperty(property, value);\n\t\t}\n\t}\n\n\tprivate async setControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tfunction failFileMissing(): never {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot set property in NVM for non-existing file\",\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\n\t\tconst expectFile = async <T extends NVMFile>(\n\t\t\tfileId: number,\n\t\t): Promise<T> => {\n\t\t\tconst file = await this._getFile<T>(fileId);\n\t\t\tif (!file) failFileMissing();\n\t\t\treturn file;\n\t\t};\n\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst [major, minor, patch] = (value as string).split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationVersion\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\t\t\t\tif (!file) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst [major, minor, patch] = (value as string).split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file = await expectFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = new ApplicationDataFile({\n\t\t\t\t\tapplicationData: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationDataFileID),\n\t\t\t\t});\n\t\t\t\tfile.applicationData = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = new ApplicationNameFile({\n\t\t\t\t\tname: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationNameFileID),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file = await expectFile<ControllerInfoFile>(\n\t\t\t\t\tControllerInfoFileID,\n\t\t\t\t);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file = await expectFile<ApplicationCCsFile>(\n\t\t\t\t\tApplicationCCsFileID,\n\t\t\t\t);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await expectFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await expectFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t) ?? new ProtocolNodeListFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(ProtocolNodeListFileID),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t) ?? new ProtocolLRNodeListFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(ProtocolLRNodeListFileID),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t) ?? new ProtocolVirtualNodeMaskFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = new ProtocolPreferredRepeatersFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = new ProtocolAppRouteLockNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = new ProtocolRouteSlaveSUCNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = new ProtocolSUCPendingUpdateNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = new ProtocolPendingDiscoveryNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = new SUCUpdateEntriesFileV0({\n\t\t\t\t\t\tupdateEntries: value,\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst fileId = sucUpdateIndexToSUCUpdateEntriesFileIDV5(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst fileExists = await this.hasFile(fileId);\n\t\t\t\t\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\t\t\t\t\tconst slice = value.slice(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tindex + SUC_UPDATES_PER_FILE_V5,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (slice.length > 0) {\n\t\t\t\t\t\t\tconst file = new SUCUpdateEntriesFileV5({\n\t\t\t\t\t\t\t\tupdateEntries: slice,\n\t\t\t\t\t\t\t\tfileId,\n\t\t\t\t\t\t\t\tfileVersion,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t} else if (fileExists) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst fileId = nodeIdToLRNodeInfoFileIDV5(property.nodeId);\n\t\t\t\tlet file = await this._getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tfileId,\n\t\t\t\t);\n\t\t\t\tif (value) {\n\t\t\t\t\t// Info added or modified\n\t\t\t\t\tfile ??= new LRNodeInfoFileV5({\n\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t} else if (file) {\n\t\t\t\t\t// info deleted\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single node info per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV0({\n\t\t\t\t\t\t\tnodeInfo: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.nodeInfo = value;\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple node infos per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV1(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tfileId,\n\t\t\t\t\t);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV1({\n\t\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single route per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<RouteCacheFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Route added or modified\n\t\t\t\t\t\tfile ??= new RouteCacheFileV0({\n\t\t\t\t\t\t\trouteCache: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.routeCache = {\n\t\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// Route deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple routes per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV1(property.nodeId);\n\t\t\t\t\tconst file = await this._getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tfileId,\n\t\t\t\t\t) ?? new RouteCacheFileV1({\n\t\t\t\t\t\trouteCaches: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.routeCaches.findIndex(\n\t\t\t\t\t\t(route) => route.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tconst newRoute: RouteCache = {\n\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t};\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.routeCaches[existingIndex] = newRoute;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.routeCaches.push(newRoute);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t}\n\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile = await this._getFile<\n\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFile\n\t\t\t\t>(ProtocolRouteCacheExistsNodeMaskFileID)\n\t\t\t\t\t?? new ProtocolRouteCacheExistsNodeMaskFile({\n\t\t\t\t\t\tnodeIds: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFileID,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\n\t\t\t\tif (!value && nodeMaskFile.nodeIdSet.has(property.nodeId)) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.delete(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t} else if (\n\t\t\t\t\tvalue && !nodeMaskFile.nodeIdSet.has(property.nodeId)\n\t\t\t\t) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.add(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tpublic async delete(\n\t\tproperty: NVMProperty,\n\t): Promise<void> {\n\t\tif (property.domain === \"controller\") {\n\t\t\tswitch (property.type) {\n\t\t\t\tcase \"protocolVersion\":\n\t\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\t\tthis._pendingChanges.set(ProtocolVersionFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationVersion\":\n\t\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFileID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFile800ID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationData\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationDataFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationName\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationNameFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"homeId\":\n\t\t\t\tcase \"nodeId\":\n\t\t\t\tcase \"lastNodeId\":\n\t\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\tcase \"sucLastIndex\":\n\t\t\t\tcase \"controllerConfiguration\":\n\t\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\t\tcase \"maxNodeId\":\n\t\t\t\tcase \"reservedId\":\n\t\t\t\tcase \"systemState\":\n\t\t\t\tcase \"lastNodeIdLR\":\n\t\t\t\tcase \"maxNodeIdLR\":\n\t\t\t\tcase \"reservedIdLR\":\n\t\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\t\tcase \"dcdcConfig\": {\n\t\t\t\t\tthis._pendingChanges.set(ControllerInfoFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"includedInsecurely\":\n\t\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationCCsFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"rfRegion\":\n\t\t\t\tcase \"txPower\":\n\t\t\t\tcase \"measured0dBm\":\n\t\t\t\tcase \"enablePTI\":\n\t\t\t\tcase \"maxTXPower\":\n\t\t\t\tcase \"nodeIdType\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationRFConfigFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"isListening\":\n\t\t\t\tcase \"optionalFunctionality\":\n\t\t\t\tcase \"genericDeviceClass\":\n\t\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationTypeFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"nodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"lrNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"appRouteLock\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tlet id = SUCUpdateEntriesFileV5IDBase;\n\t\t\t\t\t\t\tid <= SUCUpdateEntriesFileV5IDMax;\n\t\t\t\t\t\t\tid++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (await this.hasFile(id)) {\n\t\t\t\t\t\t\t\tthis._pendingChanges.set(id, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"learnedHomeId\":\n\t\t\t\tcase \"commandClasses\":\n\t\t\t\tcase \"watchdogStarted\":\n\t\t\t\tcase \"powerLevelNormal\":\n\t\t\t\tcase \"powerLevelLow\":\n\t\t\t\tcase \"powerMode\":\n\t\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\t\treturn;\n\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(property);\n\t\t\t}\n\t\t} else if (\n\t\t\tproperty.domain === \"lrnode\"\n\t\t) {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setLRNodeNVMProperty(property, undefined);\n\t\t} else if (\n\t\t\tproperty.domain === \"node\"\n\t\t) {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setNodeNVMProperty(property, undefined);\n\t\t}\n\t}\n\n\tpublic hasPendingChanges(): boolean {\n\t\treturn this._pendingChanges.size > 0;\n\t}\n\n\tpublic async commit(): Promise<void> {\n\t\tawait this._nvm.setMany([...this._pendingChanges]);\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CommandClasses } from "@zwave-js/core
|
|
2
|
-
import { Bytes } from "@zwave-js/shared
|
|
1
|
+
import { CommandClasses } from "@zwave-js/core";
|
|
2
|
+
import { Bytes } from "@zwave-js/shared";
|
|
3
3
|
import type { NVM3Object } from "../object.js";
|
|
4
4
|
import { NVMFile, type NVMFileCreationOptions, type NVMFileDeserializationOptions } from "./NVMFile.js";
|
|
5
5
|
export interface ApplicationCCsFileOptions extends NVMFileCreationOptions {
|
|
@@ -23,8 +23,8 @@ __export(ApplicationCCsFile_exports, {
|
|
|
23
23
|
ApplicationCCsFileID: () => ApplicationCCsFileID
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(ApplicationCCsFile_exports);
|
|
26
|
-
var
|
|
27
|
-
var
|
|
26
|
+
var import_core = require("@zwave-js/core");
|
|
27
|
+
var import_shared = require("@zwave-js/shared");
|
|
28
28
|
var import_NVMFile = require("./NVMFile.js");
|
|
29
29
|
var __esDecorate = function(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
30
30
|
function accept(f) {
|
|
@@ -116,7 +116,7 @@ let ApplicationCCsFile = (() => {
|
|
|
116
116
|
includedSecurelyInsecureCCs;
|
|
117
117
|
includedSecurelySecureCCs;
|
|
118
118
|
serialize() {
|
|
119
|
-
this.payload = new
|
|
119
|
+
this.payload = new import_shared.Bytes((1 + MAX_CCs) * 3);
|
|
120
120
|
let offset = 0;
|
|
121
121
|
for (const array of [
|
|
122
122
|
this.includedInsecurely,
|
|
@@ -133,9 +133,9 @@ let ApplicationCCsFile = (() => {
|
|
|
133
133
|
toJSON() {
|
|
134
134
|
return {
|
|
135
135
|
...super.toJSON(),
|
|
136
|
-
"included insecurely": this.includedInsecurely.map((cc) =>
|
|
137
|
-
"included securely (insecure)": this.includedSecurelyInsecureCCs.map((cc) =>
|
|
138
|
-
"included securely (secure)": this.includedSecurelySecureCCs.map((cc) =>
|
|
136
|
+
"included insecurely": this.includedInsecurely.map((cc) => import_core.CommandClasses[cc]).join(", "),
|
|
137
|
+
"included securely (insecure)": this.includedSecurelyInsecureCCs.map((cc) => import_core.CommandClasses[cc]).join(", "),
|
|
138
|
+
"included securely (secure)": this.includedSecurelySecureCCs.map((cc) => import_core.CommandClasses[cc]).join(", ")
|
|
139
139
|
};
|
|
140
140
|
}
|
|
141
141
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/nvm3/files/ApplicationCCsFile.ts"],
|
|
4
|
-
"sourcesContent": ["import { CommandClasses } from \"@zwave-js/core
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kBAA+B;AAC/B,
|
|
6
|
-
"names": [
|
|
4
|
+
"sourcesContent": ["import { CommandClasses } from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport type { NVM3Object } from \"../object.js\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationCCsFileOptions extends NVMFileCreationOptions {\n\tincludedInsecurely: CommandClasses[];\n\tincludedSecurelyInsecureCCs: CommandClasses[];\n\tincludedSecurelySecureCCs: CommandClasses[];\n}\n\nconst MAX_CCs = 35;\n\nexport const ApplicationCCsFileID = 103;\n\n@nvmFileID(ApplicationCCsFileID)\n@nvmSection(\"application\")\nexport class ApplicationCCsFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationCCsFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tlet offset = 0;\n\t\t\tlet numCCs = this.payload[offset];\n\t\t\tthis.includedInsecurely = [\n\t\t\t\t...this.payload.subarray(offset + 1, offset + 1 + numCCs),\n\t\t\t];\n\t\t\toffset += MAX_CCs;\n\n\t\t\tnumCCs = this.payload[offset];\n\t\t\tthis.includedSecurelyInsecureCCs = [\n\t\t\t\t...this.payload.subarray(offset + 1, offset + 1 + numCCs),\n\t\t\t];\n\t\t\toffset += MAX_CCs;\n\t\t\tnumCCs = this.payload[offset];\n\t\t\tthis.includedSecurelySecureCCs = [\n\t\t\t\t...this.payload.subarray(offset + 1, offset + 1 + numCCs),\n\t\t\t];\n\t\t} else {\n\t\t\tthis.includedInsecurely = options.includedInsecurely;\n\t\t\tthis.includedSecurelyInsecureCCs =\n\t\t\t\toptions.includedSecurelyInsecureCCs;\n\t\t\tthis.includedSecurelySecureCCs = options.includedSecurelySecureCCs;\n\t\t}\n\t}\n\n\tpublic includedInsecurely: CommandClasses[];\n\tpublic includedSecurelyInsecureCCs: CommandClasses[];\n\tpublic includedSecurelySecureCCs: CommandClasses[];\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tthis.payload = new Bytes((1 + MAX_CCs) * 3);\n\t\tlet offset = 0;\n\t\tfor (\n\t\t\tconst array of [\n\t\t\t\tthis.includedInsecurely,\n\t\t\t\tthis.includedSecurelyInsecureCCs,\n\t\t\t\tthis.includedSecurelySecureCCs,\n\t\t\t]\n\t\t) {\n\t\t\tthis.payload[offset] = array.length;\n\t\t\tthis.payload.set(array, offset + 1);\n\t\t\toffset += 1 + MAX_CCs;\n\t\t}\n\t\treturn super.serialize();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\t\"included insecurely\": this.includedInsecurely\n\t\t\t\t.map((cc) => CommandClasses[cc])\n\t\t\t\t.join(\", \"),\n\t\t\t\"included securely (insecure)\": this.includedSecurelyInsecureCCs\n\t\t\t\t.map((cc) => CommandClasses[cc])\n\t\t\t\t.join(\", \"),\n\t\t\t\"included securely (secure)\": this.includedSecurelySecureCCs\n\t\t\t\t.map((cc) => CommandClasses[cc])\n\t\t\t\t.join(\", \"),\n\t\t};\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kBAA+B;AAC/B,oBAAsB;AAEtB,qBAOO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQP,MAAM,UAAU;AAET,MAAM,uBAAuB;IAIvB,sBAAkB,MAAA;8BAF9B,0BAAU,oBAAoB,OAC9B,2BAAW,aAAa,CAAC;;;;oBACc;0CAAA,YAAO;WAAA;;;;;;;;AAA/C,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IACZ,YACC,SAAkE;AAElE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,YAAI,SAAS;AACb,YAAI,SAAS,KAAK,QAAQ,MAAM;AAChC,aAAK,qBAAqB;UACzB,GAAG,KAAK,QAAQ,SAAS,SAAS,GAAG,SAAS,IAAI,MAAM;;AAEzD,kBAAU;AAEV,iBAAS,KAAK,QAAQ,MAAM;AAC5B,aAAK,8BAA8B;UAClC,GAAG,KAAK,QAAQ,SAAS,SAAS,GAAG,SAAS,IAAI,MAAM;;AAEzD,kBAAU;AACV,iBAAS,KAAK,QAAQ,MAAM;AAC5B,aAAK,4BAA4B;UAChC,GAAG,KAAK,QAAQ,SAAS,SAAS,GAAG,SAAS,IAAI,MAAM;;MAE1D,OAAO;AACN,aAAK,qBAAqB,QAAQ;AAClC,aAAK,8BACJ,QAAQ;AACT,aAAK,4BAA4B,QAAQ;MAC1C;IACD;IAEO;IACA;IACA;IAEA,YAAS;AACf,WAAK,UAAU,IAAI,qBAAO,IAAI,WAAW,CAAC;AAC1C,UAAI,SAAS;AACb,iBACO,SAAS;QACd,KAAK;QACL,KAAK;QACL,KAAK;SAEL;AACD,aAAK,QAAQ,MAAM,IAAI,MAAM;AAC7B,aAAK,QAAQ,IAAI,OAAO,SAAS,CAAC;AAClC,kBAAU,IAAI;MACf;AACA,aAAO,MAAM,UAAS;IACvB;;IAGO,SAAM;AACZ,aAAO;QACN,GAAG,MAAM,OAAM;QACf,uBAAuB,KAAK,mBAC1B,IAAI,CAAC,OAAO,2BAAe,EAAE,CAAC,EAC9B,KAAK,IAAI;QACX,gCAAgC,KAAK,4BACnC,IAAI,CAAC,OAAO,2BAAe,EAAE,CAAC,EAC9B,KAAK,IAAI;QACX,8BAA8B,KAAK,0BACjC,IAAI,CAAC,OAAO,2BAAe,EAAE,CAAC,EAC9B,KAAK,IAAI;;IAEb;;;;",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Bytes } from "@zwave-js/shared";
|
|
2
2
|
import { NVMFile, type NVMFileCreationOptions, type NVMFileDeserializationOptions } from "./NVMFile.js";
|
|
3
3
|
export interface ApplicationDataFileOptions extends NVMFileCreationOptions {
|
|
4
4
|
applicationData: Bytes;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/nvm3/files/ApplicationDataFile.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
4
|
+
"sourcesContent": ["import type { Bytes } from \"@zwave-js/shared\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationDataFileOptions extends NVMFileCreationOptions {\n\tapplicationData: Bytes;\n}\n\nexport const ApplicationDataFileID = 200;\n\n@nvmFileID(ApplicationDataFileID)\n@nvmSection(\"application\")\nexport class ApplicationDataFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationDataFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (!gotDeserializationOptions(options)) {\n\t\t\tthis.payload = options.applicationData;\n\t\t}\n\t}\n\n\t// Just binary data\n\tpublic get applicationData(): Bytes {\n\t\treturn this.payload;\n\t}\n\tpublic set applicationData(value: Bytes) {\n\t\tthis.payload = value;\n\t}\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AACA,qBAOO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,MAAM,wBAAwB;IAIxB,uBAAmB,MAAA;8BAF/B,0BAAU,qBAAqB,OAC/B,2BAAW,aAAa,CAAC;;;;oBACe;2CAAA,YAAO;WAAA;;;;;;;;AAAhD,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IACZ,YACC,SAAmE;AAEnE,YAAM,OAAO;AACb,UAAI,KAAC,0CAA0B,OAAO,GAAG;AACxC,aAAK,UAAU,QAAQ;MACxB;IACD;;IAGA,IAAW,kBAAe;AACzB,aAAO,KAAK;IACb;IACA,IAAW,gBAAgB,OAAY;AACtC,WAAK,UAAU;IAChB;;;;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Bytes } from "@zwave-js/shared";
|
|
2
|
-
import {
|
|
2
|
+
import type { NVM3Object } from "../object.js";
|
|
3
3
|
import { NVMFile, type NVMFileCreationOptions, type NVMFileDeserializationOptions } from "./NVMFile.js";
|
|
4
4
|
export interface ApplicationNameFileOptions extends NVMFileCreationOptions {
|
|
5
5
|
name: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/nvm3/files/ApplicationNameFile.ts"],
|
|
4
|
-
"sourcesContent": ["import { Bytes, cpp2js } from \"@zwave-js/shared\";\nimport {
|
|
4
|
+
"sourcesContent": ["import { Bytes, cpp2js } from \"@zwave-js/shared\";\nimport type { NVM3Object } from \"../object.js\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationNameFileOptions extends NVMFileCreationOptions {\n\tname: string;\n}\n\nexport const ApplicationNameFileID = 0x4100c;\n\n@nvmFileID(ApplicationNameFileID)\n@nvmSection(\"application\")\nexport class ApplicationNameFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationNameFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.name = cpp2js(this.payload.toString(\"utf8\"));\n\t\t} else {\n\t\t\tthis.name = options.name;\n\t\t}\n\t}\n\n\tpublic name: string;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\t// Return a zero-terminated string with a fixed length of 30 bytes\n\t\tconst nameAsString = Bytes.from(this.name, \"utf8\");\n\t\tthis.payload = new Bytes(30).fill(0);\n\t\tthis.payload.set(nameAsString.subarray(0, this.payload.length), 0);\n\t\treturn super.serialize();\n\t}\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oBAA8B;AAE9B,qBAOO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,MAAM,wBAAwB;IAIxB,uBAAmB,MAAA;8BAF/B,0BAAU,qBAAqB,OAC/B,2BAAW,aAAa,CAAC;;;;oBACe;2CAAA,YAAO;WAAA;;;;;;;;AAAhD,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IACZ,YACC,SAAmE;AAEnE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,aAAK,WAAO,sBAAO,KAAK,QAAQ,SAAS,MAAM,CAAC;MACjD,OAAO;AACN,aAAK,OAAO,QAAQ;MACrB;IACD;IAEO;IAEA,YAAS;AAEf,YAAM,eAAe,oBAAM,KAAK,KAAK,MAAM,MAAM;AACjD,WAAK,UAAU,IAAI,oBAAM,EAAE,EAAE,KAAK,CAAC;AACnC,WAAK,QAAQ,IAAI,aAAa,SAAS,GAAG,KAAK,QAAQ,MAAM,GAAG,CAAC;AACjE,aAAO,MAAM,UAAS;IACvB;;;;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { NodeIDType, RFRegion } from "@zwave-js/core
|
|
2
|
-
import { type AllOrNone, Bytes } from "@zwave-js/shared
|
|
1
|
+
import { NodeIDType, RFRegion } from "@zwave-js/core";
|
|
2
|
+
import { type AllOrNone, Bytes } from "@zwave-js/shared";
|
|
3
3
|
import type { NVM3Object } from "../object.js";
|
|
4
4
|
import { NVMFile, type NVMFileCreationOptions, type NVMFileDeserializationOptions } from "./NVMFile.js";
|
|
5
5
|
export type ApplicationRFConfigFileOptions = NVMFileCreationOptions & {
|
|
@@ -33,8 +33,8 @@ __export(ApplicationRFConfigFile_exports, {
|
|
|
33
33
|
ApplicationRFConfigFileID: () => ApplicationRFConfigFileID
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(ApplicationRFConfigFile_exports);
|
|
36
|
-
var
|
|
37
|
-
var
|
|
36
|
+
var import_core = require("@zwave-js/core");
|
|
37
|
+
var import_shared = require("@zwave-js/shared");
|
|
38
38
|
var import_gte = __toESM(require("semver/functions/gte.js"), 1);
|
|
39
39
|
var import_lt = __toESM(require("semver/functions/lt.js"), 1);
|
|
40
40
|
var import_NVMFile = require("./NVMFile.js");
|
|
@@ -124,7 +124,7 @@ let ApplicationRFConfigFile = (() => {
|
|
|
124
124
|
this.maxTXPower = this.payload.readInt16LE(6) / 10;
|
|
125
125
|
this.nodeIdType = this.payload[8];
|
|
126
126
|
} else {
|
|
127
|
-
throw new
|
|
127
|
+
throw new import_core.ZWaveError(`ApplicationRFConfigFile has unsupported length ${this.payload.length}`, import_core.ZWaveErrorCodes.NVM_NotSupported);
|
|
128
128
|
}
|
|
129
129
|
} else {
|
|
130
130
|
this.rfRegion = options.rfRegion;
|
|
@@ -143,7 +143,7 @@ let ApplicationRFConfigFile = (() => {
|
|
|
143
143
|
nodeIdType;
|
|
144
144
|
serialize() {
|
|
145
145
|
if ((0, import_lt.default)(this.fileVersion, "7.18.1")) {
|
|
146
|
-
this.payload = new
|
|
146
|
+
this.payload = new import_shared.Bytes((0, import_gte.default)(this.fileVersion, "7.15.3") ? 6 : 3).fill(0);
|
|
147
147
|
this.payload[0] = this.rfRegion;
|
|
148
148
|
this.payload.writeIntLE(this.txPower * 10, 1, 1);
|
|
149
149
|
this.payload.writeIntLE(this.measured0dBm * 10, 2, 1);
|
|
@@ -152,20 +152,20 @@ let ApplicationRFConfigFile = (() => {
|
|
|
152
152
|
this.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 4);
|
|
153
153
|
}
|
|
154
154
|
} else if ((0, import_lt.default)(this.fileVersion, "7.21.0")) {
|
|
155
|
-
this.payload = new
|
|
155
|
+
this.payload = new import_shared.Bytes(8).fill(0);
|
|
156
156
|
this.payload[0] = this.rfRegion;
|
|
157
157
|
this.payload.writeInt16LE(this.txPower * 10, 1);
|
|
158
158
|
this.payload.writeInt16LE(this.measured0dBm * 10, 3);
|
|
159
159
|
this.payload[5] = this.enablePTI ?? 0;
|
|
160
160
|
this.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 6);
|
|
161
161
|
} else {
|
|
162
|
-
this.payload = new
|
|
162
|
+
this.payload = new import_shared.Bytes(9).fill(0);
|
|
163
163
|
this.payload[0] = this.rfRegion;
|
|
164
164
|
this.payload.writeInt16LE(this.txPower * 10, 1);
|
|
165
165
|
this.payload.writeInt16LE(this.measured0dBm * 10, 3);
|
|
166
166
|
this.payload[5] = this.enablePTI ?? 0;
|
|
167
167
|
this.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 6);
|
|
168
|
-
this.payload[8] = this.nodeIdType ??
|
|
168
|
+
this.payload[8] = this.nodeIdType ?? import_core.NodeIDType.Short;
|
|
169
169
|
}
|
|
170
170
|
return super.serialize();
|
|
171
171
|
}
|
|
@@ -173,7 +173,7 @@ let ApplicationRFConfigFile = (() => {
|
|
|
173
173
|
toJSON() {
|
|
174
174
|
const ret = {
|
|
175
175
|
...super.toJSON(),
|
|
176
|
-
"RF Region": (0,
|
|
176
|
+
"RF Region": (0, import_shared.getEnumMemberName)(import_core.RFRegion, this.rfRegion),
|
|
177
177
|
"TX Power": `${this.txPower.toFixed(1)} dBm`,
|
|
178
178
|
"Power @ 0dBm": `${this.measured0dBm.toFixed(1)} dBm`
|
|
179
179
|
};
|
|
@@ -184,7 +184,7 @@ let ApplicationRFConfigFile = (() => {
|
|
|
184
184
|
ret["max TX power"] = `${this.maxTXPower.toFixed(1)} dBm`;
|
|
185
185
|
}
|
|
186
186
|
if (this.nodeIdType != void 0) {
|
|
187
|
-
ret["node ID type"] = (0,
|
|
187
|
+
ret["node ID type"] = (0, import_shared.getEnumMemberName)(import_core.NodeIDType, this.nodeIdType);
|
|
188
188
|
}
|
|
189
189
|
return ret;
|
|
190
190
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/nvm3/files/ApplicationRFConfigFile.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\tNodeIDType,\n\tRFRegion,\n\tZWaveError,\n\tZWaveErrorCodes,\n} from \"@zwave-js/core
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kBAKO;AACP,
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["import {\n\tNodeIDType,\n\tRFRegion,\n\tZWaveError,\n\tZWaveErrorCodes,\n} from \"@zwave-js/core\";\nimport { type AllOrNone, Bytes, getEnumMemberName } from \"@zwave-js/shared\";\nimport semverGte from \"semver/functions/gte.js\";\nimport semverLt from \"semver/functions/lt.js\";\nimport type { NVM3Object } from \"../object.js\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport type ApplicationRFConfigFileOptions =\n\t& NVMFileCreationOptions\n\t& {\n\t\trfRegion: RFRegion;\n\t\ttxPower: number;\n\t\tmeasured0dBm: number;\n\t}\n\t& AllOrNone<{\n\t\tenablePTI?: number;\n\t\tmaxTXPower?: number;\n\t}>\n\t& {\n\t\tnodeIdType?: number;\n\t};\n\nexport const ApplicationRFConfigFileID = 104;\n\n@nvmFileID(ApplicationRFConfigFileID)\n@nvmSection(\"application\")\nexport class ApplicationRFConfigFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationRFConfigFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tif (this.payload.length === 3 || this.payload.length === 6) {\n\t\t\t\tthis.rfRegion = this.payload[0];\n\t\t\t\tthis.txPower = this.payload.readInt8(1) / 10;\n\t\t\t\tthis.measured0dBm = this.payload.readInt8(2) / 10;\n\t\t\t\tif (this.payload.length === 6) {\n\t\t\t\t\tthis.enablePTI = this.payload[3];\n\t\t\t\t\tthis.maxTXPower = this.payload.readInt16LE(4) / 10;\n\t\t\t\t}\n\t\t\t} else if (this.payload.length === 8) {\n\t\t\t\tthis.rfRegion = this.payload[0];\n\t\t\t\tthis.txPower = this.payload.readInt16LE(1) / 10;\n\t\t\t\tthis.measured0dBm = this.payload.readInt16LE(3) / 10;\n\t\t\t\tthis.enablePTI = this.payload[5];\n\t\t\t\tthis.maxTXPower = this.payload.readInt16LE(6) / 10;\n\t\t\t} else if (this.payload.length === 9) {\n\t\t\t\tthis.rfRegion = this.payload[0];\n\t\t\t\tthis.txPower = this.payload.readInt16LE(1) / 10;\n\t\t\t\tthis.measured0dBm = this.payload.readInt16LE(3) / 10;\n\t\t\t\tthis.enablePTI = this.payload[5];\n\t\t\t\tthis.maxTXPower = this.payload.readInt16LE(6) / 10;\n\t\t\t\tthis.nodeIdType = this.payload[8];\n\t\t\t} else {\n\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t`ApplicationRFConfigFile has unsupported length ${this.payload.length}`,\n\t\t\t\t\tZWaveErrorCodes.NVM_NotSupported,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.rfRegion = options.rfRegion;\n\t\t\tthis.txPower = options.txPower;\n\t\t\tthis.measured0dBm = options.measured0dBm;\n\t\t\tthis.enablePTI = options.enablePTI;\n\t\t\tthis.maxTXPower = options.maxTXPower;\n\t\t\tthis.nodeIdType = options.nodeIdType;\n\t\t}\n\t}\n\n\tpublic rfRegion: RFRegion;\n\tpublic txPower: number;\n\tpublic measured0dBm: number;\n\tpublic enablePTI?: number;\n\tpublic maxTXPower?: number;\n\tpublic nodeIdType?: NodeIDType;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tif (semverLt(this.fileVersion, \"7.18.1\")) {\n\t\t\tthis.payload = new Bytes(\n\t\t\t\tsemverGte(this.fileVersion, \"7.15.3\") ? 6 : 3,\n\t\t\t).fill(0);\n\t\t\tthis.payload[0] = this.rfRegion;\n\t\t\tthis.payload.writeIntLE(this.txPower * 10, 1, 1);\n\t\t\tthis.payload.writeIntLE(this.measured0dBm * 10, 2, 1);\n\t\t\tif (semverGte(this.fileVersion, \"7.15.3\")) {\n\t\t\t\tthis.payload[3] = this.enablePTI ?? 0;\n\t\t\t\tthis.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 4);\n\t\t\t}\n\t\t} else if (semverLt(this.fileVersion, \"7.21.0\")) {\n\t\t\tthis.payload = new Bytes(8).fill(0);\n\t\t\tthis.payload[0] = this.rfRegion;\n\t\t\tthis.payload.writeInt16LE(this.txPower * 10, 1);\n\t\t\tthis.payload.writeInt16LE(this.measured0dBm * 10, 3);\n\t\t\tthis.payload[5] = this.enablePTI ?? 0;\n\t\t\tthis.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 6);\n\t\t} else {\n\t\t\tthis.payload = new Bytes(9).fill(0);\n\t\t\tthis.payload[0] = this.rfRegion;\n\t\t\tthis.payload.writeInt16LE(this.txPower * 10, 1);\n\t\t\tthis.payload.writeInt16LE(this.measured0dBm * 10, 3);\n\t\t\tthis.payload[5] = this.enablePTI ?? 0;\n\t\t\tthis.payload.writeInt16LE((this.maxTXPower ?? 0) * 10, 6);\n\t\t\tthis.payload[8] = this.nodeIdType ?? NodeIDType.Short;\n\t\t}\n\t\treturn super.serialize();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\tconst ret: Record<string, any> = {\n\t\t\t...super.toJSON(),\n\t\t\t\"RF Region\": getEnumMemberName(RFRegion, this.rfRegion),\n\t\t\t\"TX Power\": `${this.txPower.toFixed(1)} dBm`,\n\t\t\t\"Power @ 0dBm\": `${this.measured0dBm.toFixed(1)} dBm`,\n\t\t};\n\t\tif (this.enablePTI != undefined) {\n\t\t\tret[\"enable PTI\"] = this.enablePTI;\n\t\t}\n\t\tif (this.maxTXPower != undefined) {\n\t\t\tret[\"max TX power\"] = `${this.maxTXPower.toFixed(1)} dBm`;\n\t\t}\n\t\tif (this.nodeIdType != undefined) {\n\t\t\tret[\"node ID type\"] = getEnumMemberName(\n\t\t\t\tNodeIDType,\n\t\t\t\tthis.nodeIdType,\n\t\t\t);\n\t\t}\n\t\treturn ret;\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kBAKO;AACP,oBAAyD;AACzD,iBAAsB;AACtB,gBAAqB;AAErB,qBAOO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAM,4BAA4B;IAI5B,2BAAuB,MAAA;8BAFnC,0BAAU,yBAAyB,OACnC,2BAAW,aAAa,CAAC;;;;oBACmB;+CAAA,YAAO;WAAA;;;;;;;;AAApD,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IACZ,YACC,SAAuE;AAEvE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,YAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,WAAW,GAAG;AAC3D,eAAK,WAAW,KAAK,QAAQ,CAAC;AAC9B,eAAK,UAAU,KAAK,QAAQ,SAAS,CAAC,IAAI;AAC1C,eAAK,eAAe,KAAK,QAAQ,SAAS,CAAC,IAAI;AAC/C,cAAI,KAAK,QAAQ,WAAW,GAAG;AAC9B,iBAAK,YAAY,KAAK,QAAQ,CAAC;AAC/B,iBAAK,aAAa,KAAK,QAAQ,YAAY,CAAC,IAAI;UACjD;QACD,WAAW,KAAK,QAAQ,WAAW,GAAG;AACrC,eAAK,WAAW,KAAK,QAAQ,CAAC;AAC9B,eAAK,UAAU,KAAK,QAAQ,YAAY,CAAC,IAAI;AAC7C,eAAK,eAAe,KAAK,QAAQ,YAAY,CAAC,IAAI;AAClD,eAAK,YAAY,KAAK,QAAQ,CAAC;AAC/B,eAAK,aAAa,KAAK,QAAQ,YAAY,CAAC,IAAI;QACjD,WAAW,KAAK,QAAQ,WAAW,GAAG;AACrC,eAAK,WAAW,KAAK,QAAQ,CAAC;AAC9B,eAAK,UAAU,KAAK,QAAQ,YAAY,CAAC,IAAI;AAC7C,eAAK,eAAe,KAAK,QAAQ,YAAY,CAAC,IAAI;AAClD,eAAK,YAAY,KAAK,QAAQ,CAAC;AAC/B,eAAK,aAAa,KAAK,QAAQ,YAAY,CAAC,IAAI;AAChD,eAAK,aAAa,KAAK,QAAQ,CAAC;QACjC,OAAO;AACN,gBAAM,IAAI,uBACT,kDAAkD,KAAK,QAAQ,MAAM,IACrE,4BAAgB,gBAAgB;QAElC;MACD,OAAO;AACN,aAAK,WAAW,QAAQ;AACxB,aAAK,UAAU,QAAQ;AACvB,aAAK,eAAe,QAAQ;AAC5B,aAAK,YAAY,QAAQ;AACzB,aAAK,aAAa,QAAQ;AAC1B,aAAK,aAAa,QAAQ;MAC3B;IACD;IAEO;IACA;IACA;IACA;IACA;IACA;IAEA,YAAS;AACf,cAAI,UAAAA,SAAS,KAAK,aAAa,QAAQ,GAAG;AACzC,aAAK,UAAU,IAAI,wBAClB,WAAAC,SAAU,KAAK,aAAa,QAAQ,IAAI,IAAI,CAAC,EAC5C,KAAK,CAAC;AACR,aAAK,QAAQ,CAAC,IAAI,KAAK;AACvB,aAAK,QAAQ,WAAW,KAAK,UAAU,IAAI,GAAG,CAAC;AAC/C,aAAK,QAAQ,WAAW,KAAK,eAAe,IAAI,GAAG,CAAC;AACpD,gBAAI,WAAAA,SAAU,KAAK,aAAa,QAAQ,GAAG;AAC1C,eAAK,QAAQ,CAAC,IAAI,KAAK,aAAa;AACpC,eAAK,QAAQ,cAAc,KAAK,cAAc,KAAK,IAAI,CAAC;QACzD;MACD,eAAW,UAAAD,SAAS,KAAK,aAAa,QAAQ,GAAG;AAChD,aAAK,UAAU,IAAI,oBAAM,CAAC,EAAE,KAAK,CAAC;AAClC,aAAK,QAAQ,CAAC,IAAI,KAAK;AACvB,aAAK,QAAQ,aAAa,KAAK,UAAU,IAAI,CAAC;AAC9C,aAAK,QAAQ,aAAa,KAAK,eAAe,IAAI,CAAC;AACnD,aAAK,QAAQ,CAAC,IAAI,KAAK,aAAa;AACpC,aAAK,QAAQ,cAAc,KAAK,cAAc,KAAK,IAAI,CAAC;MACzD,OAAO;AACN,aAAK,UAAU,IAAI,oBAAM,CAAC,EAAE,KAAK,CAAC;AAClC,aAAK,QAAQ,CAAC,IAAI,KAAK;AACvB,aAAK,QAAQ,aAAa,KAAK,UAAU,IAAI,CAAC;AAC9C,aAAK,QAAQ,aAAa,KAAK,eAAe,IAAI,CAAC;AACnD,aAAK,QAAQ,CAAC,IAAI,KAAK,aAAa;AACpC,aAAK,QAAQ,cAAc,KAAK,cAAc,KAAK,IAAI,CAAC;AACxD,aAAK,QAAQ,CAAC,IAAI,KAAK,cAAc,uBAAW;MACjD;AACA,aAAO,MAAM,UAAS;IACvB;;IAGO,SAAM;AACZ,YAAM,MAA2B;QAChC,GAAG,MAAM,OAAM;QACf,iBAAa,iCAAkB,sBAAU,KAAK,QAAQ;QACtD,YAAY,GAAG,KAAK,QAAQ,QAAQ,CAAC,CAAC;QACtC,gBAAgB,GAAG,KAAK,aAAa,QAAQ,CAAC,CAAC;;AAEhD,UAAI,KAAK,aAAa,QAAW;AAChC,YAAI,YAAY,IAAI,KAAK;MAC1B;AACA,UAAI,KAAK,cAAc,QAAW;AACjC,YAAI,cAAc,IAAI,GAAG,KAAK,WAAW,QAAQ,CAAC,CAAC;MACpD;AACA,UAAI,KAAK,cAAc,QAAW;AACjC,YAAI,cAAc,QAAI,iCACrB,wBACA,KAAK,UAAU;MAEjB;AACA,aAAO;IACR;;;;",
|
|
6
|
+
"names": ["semverLt", "semverGte"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Bytes } from "@zwave-js/shared
|
|
1
|
+
import { Bytes } from "@zwave-js/shared";
|
|
2
2
|
import type { NVM3Object } from "../object.js";
|
|
3
3
|
import { NVMFile, type NVMFileCreationOptions, type NVMFileDeserializationOptions } from "./NVMFile.js";
|
|
4
4
|
export interface ApplicationTypeFileOptions extends NVMFileCreationOptions {
|
|
@@ -23,7 +23,7 @@ __export(ApplicationTypeFile_exports, {
|
|
|
23
23
|
ApplicationTypeFileID: () => ApplicationTypeFileID
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(ApplicationTypeFile_exports);
|
|
26
|
-
var
|
|
26
|
+
var import_shared = require("@zwave-js/shared");
|
|
27
27
|
var import_NVMFile = require("./NVMFile.js");
|
|
28
28
|
var __esDecorate = function(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
29
29
|
function accept(f) {
|
|
@@ -105,7 +105,7 @@ let ApplicationTypeFile = (() => {
|
|
|
105
105
|
genericDeviceClass;
|
|
106
106
|
specificDeviceClass;
|
|
107
107
|
serialize() {
|
|
108
|
-
this.payload =
|
|
108
|
+
this.payload = import_shared.Bytes.from([
|
|
109
109
|
(this.isListening ? 1 : 0) | (this.optionalFunctionality ? 2 : 0),
|
|
110
110
|
this.genericDeviceClass,
|
|
111
111
|
this.specificDeviceClass
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/lib/nvm3/files/ApplicationTypeFile.ts"],
|
|
4
|
-
"sourcesContent": ["import { Bytes } from \"@zwave-js/shared
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
4
|
+
"sourcesContent": ["import { Bytes } from \"@zwave-js/shared\";\nimport type { NVM3Object } from \"../object.js\";\nimport {\n\tNVMFile,\n\ttype NVMFileCreationOptions,\n\ttype NVMFileDeserializationOptions,\n\tgotDeserializationOptions,\n\tnvmFileID,\n\tnvmSection,\n} from \"./NVMFile.js\";\n\nexport interface ApplicationTypeFileOptions extends NVMFileCreationOptions {\n\tisListening: boolean;\n\toptionalFunctionality: boolean;\n\tgenericDeviceClass: number;\n\tspecificDeviceClass: number;\n}\n\nexport const ApplicationTypeFileID = 102;\n\n@nvmFileID(ApplicationTypeFileID)\n@nvmSection(\"application\")\nexport class ApplicationTypeFile extends NVMFile {\n\tpublic constructor(\n\t\toptions: NVMFileDeserializationOptions | ApplicationTypeFileOptions,\n\t) {\n\t\tsuper(options);\n\t\tif (gotDeserializationOptions(options)) {\n\t\t\tthis.isListening = !!(this.payload[0] & 0b1);\n\t\t\tthis.optionalFunctionality = !!(this.payload[0] & 0b10);\n\t\t\tthis.genericDeviceClass = this.payload[1];\n\t\t\tthis.specificDeviceClass = this.payload[2];\n\t\t} else {\n\t\t\tthis.isListening = options.isListening;\n\t\t\tthis.optionalFunctionality = options.optionalFunctionality;\n\t\t\tthis.genericDeviceClass = options.genericDeviceClass;\n\t\t\tthis.specificDeviceClass = options.specificDeviceClass;\n\t\t}\n\t}\n\n\tpublic isListening: boolean;\n\tpublic optionalFunctionality: boolean;\n\tpublic genericDeviceClass: number;\n\tpublic specificDeviceClass: number;\n\n\tpublic serialize(): NVM3Object & { data: Bytes } {\n\t\tthis.payload = Bytes.from([\n\t\t\t(this.isListening ? 0b1 : 0)\n\t\t\t| (this.optionalFunctionality ? 0b10 : 0),\n\t\t\tthis.genericDeviceClass,\n\t\t\tthis.specificDeviceClass,\n\t\t]);\n\t\treturn super.serialize();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\tpublic toJSON() {\n\t\treturn {\n\t\t\t...super.toJSON(),\n\t\t\tlistening: this.isListening,\n\t\t\t\"opt. functionality\": this.optionalFunctionality,\n\t\t\tgenericDeviceClass: this.genericDeviceClass,\n\t\t\tspecificDeviceClass: this.specificDeviceClass,\n\t\t};\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oBAAsB;AAEtB,qBAOO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,wBAAwB;IAIxB,uBAAmB,MAAA;8BAF/B,0BAAU,qBAAqB,OAC/B,2BAAW,aAAa,CAAC;;;;oBACe;2CAAA,YAAO;WAAA;;;;;;;;AAAhD,mBAAA,MAAA,mBAAA,EAAA,OAAA,WAAA,GAAA,kBAAA,EAAA,MAAA,SAAA,MAAA,WAAA,MAAA,UAAA,UAAA,GAAA,MAAA,uBAAA;;;AAAa,wBAAA,YAAA,uBAAA;;IACZ,YACC,SAAmE;AAEnE,YAAM,OAAO;AACb,cAAI,0CAA0B,OAAO,GAAG;AACvC,aAAK,cAAc,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI;AACxC,aAAK,wBAAwB,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI;AAClD,aAAK,qBAAqB,KAAK,QAAQ,CAAC;AACxC,aAAK,sBAAsB,KAAK,QAAQ,CAAC;MAC1C,OAAO;AACN,aAAK,cAAc,QAAQ;AAC3B,aAAK,wBAAwB,QAAQ;AACrC,aAAK,qBAAqB,QAAQ;AAClC,aAAK,sBAAsB,QAAQ;MACpC;IACD;IAEO;IACA;IACA;IACA;IAEA,YAAS;AACf,WAAK,UAAU,oBAAM,KAAK;SACxB,KAAK,cAAc,IAAM,MACvB,KAAK,wBAAwB,IAAO;QACvC,KAAK;QACL,KAAK;OACL;AACD,aAAO,MAAM,UAAS;IACvB;;IAGO,SAAM;AACZ,aAAO;QACN,GAAG,MAAM,OAAM;QACf,WAAW,KAAK;QAChB,sBAAsB,KAAK;QAC3B,oBAAoB,KAAK;QACzB,qBAAqB,KAAK;;IAE5B;;;;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -23,7 +23,7 @@ __export(ControllerInfoFile_exports, {
|
|
|
23
23
|
ControllerInfoFileID: () => ControllerInfoFileID
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(ControllerInfoFile_exports);
|
|
26
|
-
var
|
|
26
|
+
var import_core = require("@zwave-js/core");
|
|
27
27
|
var import_shared = require("@zwave-js/shared");
|
|
28
28
|
var import_NVMFile = require("./NVMFile.js");
|
|
29
29
|
var __esDecorate = function(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
@@ -116,7 +116,7 @@ let ControllerInfoFile = (() => {
|
|
|
116
116
|
this.primaryLongRangeChannelId = this.payload[20];
|
|
117
117
|
this.dcdcConfig = this.payload[21];
|
|
118
118
|
} else {
|
|
119
|
-
throw new
|
|
119
|
+
throw new import_core.ZWaveError(`Unsupported payload length`, import_core.ZWaveErrorCodes.NVM_InvalidFormat);
|
|
120
120
|
}
|
|
121
121
|
} else {
|
|
122
122
|
this.homeId = import_shared.Bytes.view(options.homeId);
|
|
@@ -192,7 +192,7 @@ let ControllerInfoFile = (() => {
|
|
|
192
192
|
}
|
|
193
193
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
194
194
|
toJSON() {
|
|
195
|
-
return (0,
|
|
195
|
+
return (0, import_core.stripUndefined)({
|
|
196
196
|
...super.toJSON(),
|
|
197
197
|
homeId: (0, import_shared.buffer2hex)(this.homeId),
|
|
198
198
|
nodeId: this.nodeId,
|