@zwave-js/nvmedit 15.15.2 → 15.16.0
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 +6 -5
- package/build/cjs/convert.js.map +2 -2
- package/build/cjs/lib/NVM3.d.ts +6 -5
- package/build/cjs/lib/NVM3.js.map +2 -2
- package/build/cjs/lib/NVM500.js.map +2 -2
- 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.map +2 -2
- package/build/cjs/lib/common/sucUpdateEntry.d.ts +2 -2
- package/build/cjs/lib/common/sucUpdateEntry.js.map +2 -2
- package/build/cjs/lib/common/utils.d.ts +3 -2
- package/build/cjs/lib/common/utils.js.map +2 -2
- package/build/cjs/lib/io/BufferedNVMReader.d.ts +3 -2
- package/build/cjs/lib/io/BufferedNVMReader.js.map +2 -2
- package/build/cjs/lib/io/NVMFileIO.d.ts +3 -2
- package/build/cjs/lib/io/NVMFileIO.js.map +2 -2
- package/build/cjs/lib/io/NVMMemoryIO.d.ts +4 -3
- package/build/cjs/lib/io/NVMMemoryIO.js.map +2 -2
- package/build/cjs/lib/nvm3/adapter.js.map +2 -2
- package/build/cjs/lib/nvm3/files/ControllerInfoFile.d.ts +3 -3
- package/build/cjs/lib/nvm3/files/ControllerInfoFile.js.map +2 -2
- package/build/cjs/lib/nvm3/files/NVMFile.d.ts +2 -2
- package/build/cjs/lib/nvm3/files/NVMFile.js.map +2 -2
- package/build/cjs/lib/nvm3/files/NodeInfoFiles.js.map +2 -2
- package/build/cjs/lib/nvm3/object.d.ts +3 -2
- package/build/cjs/lib/nvm3/object.js.map +2 -2
- package/build/cjs/lib/nvm3/page.d.ts +2 -1
- package/build/cjs/lib/nvm3/page.js.map +2 -2
- package/build/cjs/lib/nvm500/EntryParsers.d.ts +4 -4
- package/build/cjs/lib/nvm500/EntryParsers.js.map +2 -2
- package/build/cjs/lib/nvm500/adapter.js.map +2 -2
- package/build/cjs/lib/nvm500/shared.d.ts +2 -1
- package/build/cjs/lib/nvm500/shared.js.map +2 -2
- package/build/esm/convert.d.ts +6 -5
- package/build/esm/convert.d.ts.map +1 -1
- package/build/esm/convert.js +1 -1
- package/build/esm/convert.js.map +1 -1
- package/build/esm/lib/NVM3.d.ts +6 -5
- package/build/esm/lib/NVM3.d.ts.map +1 -1
- package/build/esm/lib/NVM3.js +1 -1
- package/build/esm/lib/NVM3.js.map +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.map +1 -1
- package/build/esm/lib/common/sucUpdateEntry.d.ts +2 -2
- package/build/esm/lib/common/sucUpdateEntry.d.ts.map +1 -1
- package/build/esm/lib/common/sucUpdateEntry.js.map +1 -1
- package/build/esm/lib/common/utils.d.ts +3 -2
- package/build/esm/lib/common/utils.d.ts.map +1 -1
- package/build/esm/lib/common/utils.js.map +1 -1
- package/build/esm/lib/io/BufferedNVMReader.d.ts +3 -2
- package/build/esm/lib/io/BufferedNVMReader.d.ts.map +1 -1
- package/build/esm/lib/io/BufferedNVMReader.js.map +1 -1
- package/build/esm/lib/io/NVMFileIO.d.ts +3 -2
- package/build/esm/lib/io/NVMFileIO.d.ts.map +1 -1
- package/build/esm/lib/io/NVMFileIO.js.map +1 -1
- package/build/esm/lib/io/NVMMemoryIO.d.ts +4 -3
- package/build/esm/lib/io/NVMMemoryIO.d.ts.map +1 -1
- package/build/esm/lib/io/NVMMemoryIO.js.map +1 -1
- package/build/esm/lib/nvm3/adapter.d.ts.map +1 -1
- package/build/esm/lib/nvm3/adapter.js.map +1 -1
- package/build/esm/lib/nvm3/files/ControllerInfoFile.d.ts +3 -3
- package/build/esm/lib/nvm3/files/ControllerInfoFile.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/ControllerInfoFile.js.map +1 -1
- package/build/esm/lib/nvm3/files/NVMFile.d.ts +2 -2
- package/build/esm/lib/nvm3/files/NVMFile.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/NVMFile.js.map +1 -1
- package/build/esm/lib/nvm3/files/NodeInfoFiles.d.ts.map +1 -1
- package/build/esm/lib/nvm3/files/NodeInfoFiles.js.map +1 -1
- package/build/esm/lib/nvm3/object.d.ts +3 -2
- package/build/esm/lib/nvm3/object.d.ts.map +1 -1
- package/build/esm/lib/nvm3/object.js.map +1 -1
- package/build/esm/lib/nvm3/page.d.ts +2 -1
- package/build/esm/lib/nvm3/page.d.ts.map +1 -1
- package/build/esm/lib/nvm3/page.js.map +1 -1
- package/build/esm/lib/nvm500/EntryParsers.d.ts +4 -4
- package/build/esm/lib/nvm500/EntryParsers.d.ts.map +1 -1
- package/build/esm/lib/nvm500/EntryParsers.js.map +1 -1
- package/build/esm/lib/nvm500/adapter.js.map +1 -1
- package/build/esm/lib/nvm500/shared.d.ts +2 -1
- package/build/esm/lib/nvm500/shared.d.ts.map +1 -1
- package/build/esm/lib/nvm500/shared.js.map +1 -1
- package/package.json +6 -6
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type BytesView } from "@zwave-js/shared";
|
|
1
2
|
import { FragmentType, ObjectType } from "./consts.js";
|
|
2
3
|
export interface NVM3ObjectHeader {
|
|
3
4
|
offset: number;
|
|
@@ -15,9 +16,9 @@ export interface NVM3Object {
|
|
|
15
16
|
type: ObjectType;
|
|
16
17
|
fragmentType: FragmentType;
|
|
17
18
|
key: number;
|
|
18
|
-
data?:
|
|
19
|
+
data?: BytesView;
|
|
19
20
|
}
|
|
20
|
-
export declare function serializeObject(obj: NVM3Object):
|
|
21
|
+
export declare function serializeObject(obj: NVM3Object): BytesView;
|
|
21
22
|
export declare function fragmentLargeObject(obj: NVM3Object & {
|
|
22
23
|
type: ObjectType.DataLarge | ObjectType.CounterLarge;
|
|
23
24
|
}, maxFirstFragmentSizeWithHeader: number, maxFragmentSizeWithHeader: number): NVM3Object[];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/nvm3/object.ts"],
|
|
4
|
-
"sourcesContent": ["import { Bytes } from \"@zwave-js/shared\";\nimport {\n\tFragmentType,\n\tNVM3_CODE_LARGE_SHIFT,\n\tNVM3_CODE_SMALL_SHIFT,\n\tNVM3_COUNTER_SIZE,\n\tNVM3_OBJ_FRAGTYPE_MASK,\n\tNVM3_OBJ_FRAGTYPE_SHIFT,\n\tNVM3_OBJ_HEADER_SIZE_LARGE,\n\tNVM3_OBJ_HEADER_SIZE_SMALL,\n\tNVM3_OBJ_KEY_MASK,\n\tNVM3_OBJ_KEY_SHIFT,\n\tNVM3_OBJ_LARGE_LEN_MASK,\n\tNVM3_OBJ_TYPE_MASK,\n\tNVM3_WORD_SIZE,\n\tObjectType,\n} from \"./consts.js\";\nimport { computeBergerCode, computeBergerCodeMulti } from \"./utils.js\";\n\nexport interface NVM3ObjectHeader {\n\toffset: number;\n\ttype: ObjectType;\n\tkey: number;\n\tfragmentType: FragmentType;\n\t/** The length of the header */\n\theaderSize: number;\n\t/** The length of the object data */\n\tfragmentSize: number;\n\t/** The total length of the object in the NVM */\n\talignedSize: number;\n}\n\nexport interface NVM3Object {\n\ttype: ObjectType;\n\tfragmentType: FragmentType;\n\tkey: number;\n\tdata?:
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;AAAA,
|
|
4
|
+
"sourcesContent": ["import { Bytes, type BytesView } from \"@zwave-js/shared\";\nimport {\n\tFragmentType,\n\tNVM3_CODE_LARGE_SHIFT,\n\tNVM3_CODE_SMALL_SHIFT,\n\tNVM3_COUNTER_SIZE,\n\tNVM3_OBJ_FRAGTYPE_MASK,\n\tNVM3_OBJ_FRAGTYPE_SHIFT,\n\tNVM3_OBJ_HEADER_SIZE_LARGE,\n\tNVM3_OBJ_HEADER_SIZE_SMALL,\n\tNVM3_OBJ_KEY_MASK,\n\tNVM3_OBJ_KEY_SHIFT,\n\tNVM3_OBJ_LARGE_LEN_MASK,\n\tNVM3_OBJ_TYPE_MASK,\n\tNVM3_WORD_SIZE,\n\tObjectType,\n} from \"./consts.js\";\nimport { computeBergerCode, computeBergerCodeMulti } from \"./utils.js\";\n\nexport interface NVM3ObjectHeader {\n\toffset: number;\n\ttype: ObjectType;\n\tkey: number;\n\tfragmentType: FragmentType;\n\t/** The length of the header */\n\theaderSize: number;\n\t/** The length of the object data */\n\tfragmentSize: number;\n\t/** The total length of the object in the NVM */\n\talignedSize: number;\n}\n\nexport interface NVM3Object {\n\ttype: ObjectType;\n\tfragmentType: FragmentType;\n\tkey: number;\n\tdata?: BytesView;\n}\n\nexport function serializeObject(obj: NVM3Object): BytesView {\n\tconst isLarge = obj.type === ObjectType.DataLarge\n\t\t|| obj.type === ObjectType.CounterLarge;\n\tconst headerSize = isLarge\n\t\t? NVM3_OBJ_HEADER_SIZE_LARGE\n\t\t: NVM3_OBJ_HEADER_SIZE_SMALL;\n\tconst dataLength = obj.data?.length ?? 0;\n\tconst ret = new Bytes(dataLength + headerSize);\n\n\t// Write header\n\tif (isLarge) {\n\t\tlet hdr2 = dataLength & NVM3_OBJ_LARGE_LEN_MASK;\n\n\t\tconst hdr1 = (obj.type & NVM3_OBJ_TYPE_MASK)\n\t\t\t| ((obj.key & NVM3_OBJ_KEY_MASK) << NVM3_OBJ_KEY_SHIFT)\n\t\t\t| ((obj.fragmentType & NVM3_OBJ_FRAGTYPE_MASK)\n\t\t\t\t<< NVM3_OBJ_FRAGTYPE_SHIFT);\n\n\t\tconst bergerCode = computeBergerCodeMulti(\n\t\t\t[hdr1, hdr2],\n\t\t\t32 + NVM3_CODE_LARGE_SHIFT,\n\t\t);\n\t\thdr2 |= bergerCode << NVM3_CODE_LARGE_SHIFT;\n\n\t\tret.writeInt32LE(hdr1, 0);\n\t\tret.writeInt32LE(hdr2, 4);\n\t} else {\n\t\tlet typeAndLen = obj.type;\n\t\tif (typeAndLen === ObjectType.DataSmall && dataLength > 0) {\n\t\t\ttypeAndLen += dataLength;\n\t\t}\n\t\tlet hdr1 = (typeAndLen & NVM3_OBJ_TYPE_MASK)\n\t\t\t| ((obj.key & NVM3_OBJ_KEY_MASK) << NVM3_OBJ_KEY_SHIFT);\n\t\tconst bergerCode = computeBergerCode(hdr1, NVM3_CODE_SMALL_SHIFT);\n\t\thdr1 |= bergerCode << NVM3_CODE_SMALL_SHIFT;\n\n\t\tret.writeInt32LE(hdr1, 0);\n\t}\n\n\t// Write data\n\tif (obj.data) {\n\t\tret.set(obj.data, headerSize);\n\t}\n\treturn ret;\n}\n\nexport function fragmentLargeObject(\n\tobj: NVM3Object & { type: ObjectType.DataLarge | ObjectType.CounterLarge },\n\tmaxFirstFragmentSizeWithHeader: number,\n\tmaxFragmentSizeWithHeader: number,\n): NVM3Object[] {\n\tconst ret: NVM3Object[] = [];\n\n\tif (\n\t\tobj.data!.length + NVM3_OBJ_HEADER_SIZE_LARGE\n\t\t\t<= maxFirstFragmentSizeWithHeader\n\t) {\n\t\treturn [obj];\n\t}\n\n\tlet offset = 0;\n\twhile (offset < obj.data!.length) {\n\t\tconst fragmentSize = offset === 0\n\t\t\t? maxFirstFragmentSizeWithHeader - NVM3_OBJ_HEADER_SIZE_LARGE\n\t\t\t: maxFragmentSizeWithHeader - NVM3_OBJ_HEADER_SIZE_LARGE;\n\t\tconst data = obj.data!.subarray(offset, offset + fragmentSize);\n\n\t\tret.push({\n\t\t\ttype: obj.type,\n\t\t\tkey: obj.key,\n\t\t\tfragmentType: offset === 0\n\t\t\t\t? FragmentType.First\n\t\t\t\t: data.length + NVM3_OBJ_HEADER_SIZE_LARGE\n\t\t\t\t\t\t< maxFragmentSizeWithHeader\n\t\t\t\t? FragmentType.Last\n\t\t\t\t: FragmentType.Next,\n\t\t\tdata,\n\t\t});\n\n\t\toffset += fragmentSize;\n\t}\n\n\treturn ret;\n}\n\nexport function getAlignedSize(size: number): number {\n\treturn (size + NVM3_WORD_SIZE - 1) & ~(NVM3_WORD_SIZE - 1);\n}\n\nexport function getHeaderSize(obj: NVM3Object): number {\n\tswitch (obj.type) {\n\t\tcase ObjectType.Deleted:\n\t\tcase ObjectType.CounterSmall:\n\t\tcase ObjectType.DataSmall:\n\t\t\treturn NVM3_OBJ_HEADER_SIZE_SMALL;\n\t\tcase ObjectType.CounterLarge:\n\t\tcase ObjectType.DataLarge:\n\t\t\treturn NVM3_OBJ_HEADER_SIZE_LARGE;\n\t}\n}\n\nexport function getFragmentSize(obj: NVM3Object): number {\n\tswitch (obj.type) {\n\t\tcase ObjectType.Deleted:\n\t\t\treturn 0;\n\t\tcase ObjectType.CounterSmall:\n\t\t\treturn NVM3_COUNTER_SIZE;\n\t\tcase ObjectType.DataSmall:\n\t\tcase ObjectType.DataLarge:\n\t\tcase ObjectType.CounterLarge:\n\t\t\treturn obj.data?.length ?? 0;\n\t}\n}\n\nexport function getRequiredSpace(obj: NVM3Object): number {\n\treturn getHeaderSize(obj) + getAlignedSize(getFragmentSize(obj));\n}\n\nexport function getObjectHeader(\n\tobj: NVM3Object,\n\toffset: number,\n): NVM3ObjectHeader {\n\tconst headerSize = getHeaderSize(obj);\n\tconst fragmentSize = getFragmentSize(obj);\n\treturn {\n\t\toffset,\n\t\tkey: obj.key,\n\t\ttype: obj.type,\n\t\tfragmentType: obj.fragmentType,\n\t\theaderSize,\n\t\tfragmentSize,\n\t\talignedSize: headerSize + getAlignedSize(fragmentSize),\n\t};\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;AAAA,oBAAsC;AACtC,oBAeO;AACP,mBAA0D;AAsBpD,SAAU,gBAAgB,KAAe;AAC9C,QAAM,UAAU,IAAI,SAAS,yBAAW,aACpC,IAAI,SAAS,yBAAW;AAC5B,QAAM,aAAa,UAChB,2CACA;AACH,QAAM,aAAa,IAAI,MAAM,UAAU;AACvC,QAAM,MAAM,IAAI,oBAAM,aAAa,UAAU;AAG7C,MAAI,SAAS;AACZ,QAAI,OAAO,aAAa;AAExB,UAAM,OAAQ,IAAI,OAAO,oCACpB,IAAI,MAAM,oCAAsB,oCAChC,IAAI,eAAe,yCACnB;AAEL,UAAM,iBAAa,qCAClB,CAAC,MAAM,IAAI,GACX,KAAK,mCAAqB;AAE3B,YAAQ,cAAc;AAEtB,QAAI,aAAa,MAAM,CAAC;AACxB,QAAI,aAAa,MAAM,CAAC;EACzB,OAAO;AACN,QAAI,aAAa,IAAI;AACrB,QAAI,eAAe,yBAAW,aAAa,aAAa,GAAG;AAC1D,oBAAc;IACf;AACA,QAAI,OAAQ,aAAa,oCACpB,IAAI,MAAM,oCAAsB;AACrC,UAAM,iBAAa,gCAAkB,MAAM,mCAAqB;AAChE,YAAQ,cAAc;AAEtB,QAAI,aAAa,MAAM,CAAC;EACzB;AAGA,MAAI,IAAI,MAAM;AACb,QAAI,IAAI,IAAI,MAAM,UAAU;EAC7B;AACA,SAAO;AACR;AA5CgB;AA8CV,SAAU,oBACf,KACA,gCACA,2BAAiC;AAEjC,QAAM,MAAoB,CAAA;AAE1B,MACC,IAAI,KAAM,SAAS,4CACf,gCACH;AACD,WAAO,CAAC,GAAG;EACZ;AAEA,MAAI,SAAS;AACb,SAAO,SAAS,IAAI,KAAM,QAAQ;AACjC,UAAM,eAAe,WAAW,IAC7B,iCAAiC,2CACjC,4BAA4B;AAC/B,UAAM,OAAO,IAAI,KAAM,SAAS,QAAQ,SAAS,YAAY;AAE7D,QAAI,KAAK;MACR,MAAM,IAAI;MACV,KAAK,IAAI;MACT,cAAc,WAAW,IACtB,2BAAa,QACb,KAAK,SAAS,2CACZ,4BACF,2BAAa,OACb,2BAAa;MAChB;KACA;AAED,cAAU;EACX;AAEA,SAAO;AACR;AArCgB;AAuCV,SAAU,eAAe,MAAY;AAC1C,SAAQ,OAAO,+BAAiB,IAAK,EAAE,+BAAiB;AACzD;AAFgB;AAIV,SAAU,cAAc,KAAe;AAC5C,UAAQ,IAAI,MAAM;IACjB,KAAK,yBAAW;IAChB,KAAK,yBAAW;IAChB,KAAK,yBAAW;AACf,aAAO;IACR,KAAK,yBAAW;IAChB,KAAK,yBAAW;AACf,aAAO;EACT;AACD;AAVgB;AAYV,SAAU,gBAAgB,KAAe;AAC9C,UAAQ,IAAI,MAAM;IACjB,KAAK,yBAAW;AACf,aAAO;IACR,KAAK,yBAAW;AACf,aAAO;IACR,KAAK,yBAAW;IAChB,KAAK,yBAAW;IAChB,KAAK,yBAAW;AACf,aAAO,IAAI,MAAM,UAAU;EAC7B;AACD;AAXgB;AAaV,SAAU,iBAAiB,KAAe;AAC/C,SAAO,cAAc,GAAG,IAAI,eAAe,gBAAgB,GAAG,CAAC;AAChE;AAFgB;AAIV,SAAU,gBACf,KACA,QAAc;AAEd,QAAM,aAAa,cAAc,GAAG;AACpC,QAAM,eAAe,gBAAgB,GAAG;AACxC,SAAO;IACN;IACA,KAAK,IAAI;IACT,MAAM,IAAI;IACV,cAAc,IAAI;IAClB;IACA;IACA,aAAa,aAAa,eAAe,YAAY;;AAEvD;AAfgB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type BytesView } from "@zwave-js/shared";
|
|
1
2
|
import { type PageStatus, type PageWriteSize } from "./consts.js";
|
|
2
3
|
import type { NVM3Object } from "./object.js";
|
|
3
4
|
export interface NVM3PageHeader {
|
|
@@ -17,5 +18,5 @@ export interface NVM3Page {
|
|
|
17
18
|
}
|
|
18
19
|
export declare function pageSizeToBits(pageSize: number): number;
|
|
19
20
|
export declare function pageSizeFromBits(bits: number): number;
|
|
20
|
-
export declare function serializePageHeader(header: Omit<NVM3PageHeader, "offset">):
|
|
21
|
+
export declare function serializePageHeader(header: Omit<NVM3PageHeader, "offset">): BytesView;
|
|
21
22
|
//# sourceMappingURL=page.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/nvm3/page.ts"],
|
|
4
|
-
"sourcesContent": ["import { Bytes } from \"@zwave-js/shared\";\nimport {\n\tNVM3_MIN_PAGE_SIZE,\n\tNVM3_PAGE_COUNTER_MASK,\n\tNVM3_PAGE_COUNTER_SIZE,\n\tNVM3_PAGE_HEADER_SIZE,\n\tNVM3_PAGE_MAGIC,\n\ttype PageStatus,\n\ttype PageWriteSize,\n} from \"./consts.js\";\nimport type { NVM3Object } from \"./object.js\";\nimport { computeBergerCode } from \"./utils.js\";\n\nexport interface NVM3PageHeader {\n\toffset: number;\n\tversion: number;\n\teraseCount: number;\n\tstatus: PageStatus;\n\tencrypted: boolean;\n\tpageSize: number;\n\twriteSize: PageWriteSize;\n\tmemoryMapped: boolean;\n\tdeviceFamily: number;\n}\n\nexport interface NVM3Page {\n\theader: NVM3PageHeader;\n\tobjects: NVM3Object[];\n}\n\n// The page size field has a value from 0 to 7 describing page sizes from 512 to 65536 bytes\nexport function pageSizeToBits(pageSize: number): number {\n\treturn Math.ceil(Math.log2(pageSize) - Math.log2(NVM3_MIN_PAGE_SIZE));\n}\n\nexport function pageSizeFromBits(bits: number): number {\n\treturn NVM3_MIN_PAGE_SIZE * Math.pow(2, bits);\n}\n\nexport function serializePageHeader(\n\theader: Omit<NVM3PageHeader, \"offset\">,\n):
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;AAAA,
|
|
4
|
+
"sourcesContent": ["import { Bytes, type BytesView } from \"@zwave-js/shared\";\nimport {\n\tNVM3_MIN_PAGE_SIZE,\n\tNVM3_PAGE_COUNTER_MASK,\n\tNVM3_PAGE_COUNTER_SIZE,\n\tNVM3_PAGE_HEADER_SIZE,\n\tNVM3_PAGE_MAGIC,\n\ttype PageStatus,\n\ttype PageWriteSize,\n} from \"./consts.js\";\nimport type { NVM3Object } from \"./object.js\";\nimport { computeBergerCode } from \"./utils.js\";\n\nexport interface NVM3PageHeader {\n\toffset: number;\n\tversion: number;\n\teraseCount: number;\n\tstatus: PageStatus;\n\tencrypted: boolean;\n\tpageSize: number;\n\twriteSize: PageWriteSize;\n\tmemoryMapped: boolean;\n\tdeviceFamily: number;\n}\n\nexport interface NVM3Page {\n\theader: NVM3PageHeader;\n\tobjects: NVM3Object[];\n}\n\n// The page size field has a value from 0 to 7 describing page sizes from 512 to 65536 bytes\nexport function pageSizeToBits(pageSize: number): number {\n\treturn Math.ceil(Math.log2(pageSize) - Math.log2(NVM3_MIN_PAGE_SIZE));\n}\n\nexport function pageSizeFromBits(bits: number): number {\n\treturn NVM3_MIN_PAGE_SIZE * Math.pow(2, bits);\n}\n\nexport function serializePageHeader(\n\theader: Omit<NVM3PageHeader, \"offset\">,\n): BytesView {\n\tconst ret = new Bytes(NVM3_PAGE_HEADER_SIZE);\n\n\tret.writeUInt16LE(header.version, 0);\n\tret.writeUInt16LE(NVM3_PAGE_MAGIC, 2);\n\n\tlet eraseCount = header.eraseCount & NVM3_PAGE_COUNTER_MASK;\n\tconst eraseCountCode = computeBergerCode(\n\t\teraseCount,\n\t\tNVM3_PAGE_COUNTER_SIZE,\n\t);\n\teraseCount |= eraseCountCode << NVM3_PAGE_COUNTER_SIZE;\n\tret.writeInt32LE(eraseCount, 4);\n\n\tlet eraseCountInv = ~header.eraseCount & NVM3_PAGE_COUNTER_MASK;\n\tconst eraseCountInvCode = computeBergerCode(\n\t\teraseCountInv,\n\t\tNVM3_PAGE_COUNTER_SIZE,\n\t);\n\teraseCountInv |= eraseCountInvCode << NVM3_PAGE_COUNTER_SIZE;\n\tret.writeInt32LE(eraseCountInv, 8);\n\n\tret.writeUInt32LE(header.status, 12);\n\n\tconst devInfo = (header.deviceFamily & 0x7ff)\n\t\t| ((header.writeSize & 0b1) << 11)\n\t\t| ((header.memoryMapped ? 1 : 0) << 12)\n\t\t| (pageSizeToBits(header.pageSize) << 13);\n\tret.writeUInt16LE(devInfo, 16);\n\n\tconst formatInfo = header.encrypted ? 0xfffe : 0xffff;\n\tret.writeUInt16LE(formatInfo, 18);\n\n\treturn ret;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;AAAA,oBAAsC;AACtC,oBAQO;AAEP,mBAAkC;AAoB5B,SAAU,eAAe,UAAgB;AAC9C,SAAO,KAAK,KAAK,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,gCAAkB,CAAC;AACrE;AAFgB;AAIV,SAAU,iBAAiB,MAAY;AAC5C,SAAO,mCAAqB,KAAK,IAAI,GAAG,IAAI;AAC7C;AAFgB;AAIV,SAAU,oBACf,QAAsC;AAEtC,QAAM,MAAM,IAAI,oBAAM,mCAAqB;AAE3C,MAAI,cAAc,OAAO,SAAS,CAAC;AACnC,MAAI,cAAc,+BAAiB,CAAC;AAEpC,MAAI,aAAa,OAAO,aAAa;AACrC,QAAM,qBAAiB,gCACtB,YACA,oCAAsB;AAEvB,gBAAc,kBAAkB;AAChC,MAAI,aAAa,YAAY,CAAC;AAE9B,MAAI,gBAAgB,CAAC,OAAO,aAAa;AACzC,QAAM,wBAAoB,gCACzB,eACA,oCAAsB;AAEvB,mBAAiB,qBAAqB;AACtC,MAAI,aAAa,eAAe,CAAC;AAEjC,MAAI,cAAc,OAAO,QAAQ,EAAE;AAEnC,QAAM,UAAW,OAAO,eAAe,QAClC,OAAO,YAAY,MAAQ,MAC3B,OAAO,eAAe,IAAI,MAAM,KACjC,eAAe,OAAO,QAAQ,KAAK;AACvC,MAAI,cAAc,SAAS,EAAE;AAE7B,QAAM,aAAa,OAAO,YAAY,QAAS;AAC/C,MAAI,cAAc,YAAY,EAAE;AAEhC,SAAO;AACR;AApCgB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type NodeProtocolInfo } from "@zwave-js/core";
|
|
2
|
-
import { Bytes } from "@zwave-js/shared";
|
|
2
|
+
import { Bytes, type BytesView } from "@zwave-js/shared";
|
|
3
3
|
import type { NVMModuleType } from "./shared.js";
|
|
4
4
|
export interface NVMDescriptor {
|
|
5
5
|
manufacturerID: number;
|
|
@@ -9,19 +9,19 @@ export interface NVMDescriptor {
|
|
|
9
9
|
firmwareVersion: string;
|
|
10
10
|
protocolVersion: string;
|
|
11
11
|
}
|
|
12
|
-
export declare function parseNVMDescriptor(data:
|
|
12
|
+
export declare function parseNVMDescriptor(data: BytesView, offset?: number): NVMDescriptor;
|
|
13
13
|
export declare function encodeNVMDescriptor(descriptor: NVMDescriptor): Bytes;
|
|
14
14
|
export interface NVMModuleDescriptor {
|
|
15
15
|
size: number;
|
|
16
16
|
type: NVMModuleType;
|
|
17
17
|
version: string;
|
|
18
18
|
}
|
|
19
|
-
export declare function parseNVMModuleDescriptor(data:
|
|
19
|
+
export declare function parseNVMModuleDescriptor(data: BytesView, offset?: number): NVMModuleDescriptor;
|
|
20
20
|
export declare function encodeNVMModuleDescriptor(descriptior: NVMModuleDescriptor): Bytes;
|
|
21
21
|
export interface NVM500NodeInfo extends Omit<NodeProtocolInfo, "hasSpecificDeviceClass"> {
|
|
22
22
|
genericDeviceClass: number;
|
|
23
23
|
specificDeviceClass: number | null;
|
|
24
24
|
}
|
|
25
|
-
export declare function parseNVM500NodeInfo(buffer:
|
|
25
|
+
export declare function parseNVM500NodeInfo(buffer: BytesView, offset: number): NVM500NodeInfo;
|
|
26
26
|
export declare function encodeNVM500NodeInfo(nodeInfo: NVM500NodeInfo): Bytes;
|
|
27
27
|
//# sourceMappingURL=EntryParsers.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/nvm500/EntryParsers.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\ttype NodeProtocolInfo,\n\tencodeNodeProtocolInfo,\n\tparseNodeProtocolInfo,\n} from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport type { NVMModuleType } from \"./shared.js\";\n\nexport interface NVMDescriptor {\n\tmanufacturerID: number;\n\tfirmwareID: number;\n\tproductType: number;\n\tproductID: number;\n\tfirmwareVersion: string;\n\tprotocolVersion: string;\n}\n\nexport function parseNVMDescriptor(\n\tdata:
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;AAAA,kBAIO;AACP,
|
|
4
|
+
"sourcesContent": ["import {\n\ttype NodeProtocolInfo,\n\tencodeNodeProtocolInfo,\n\tparseNodeProtocolInfo,\n} from \"@zwave-js/core\";\nimport { Bytes, type BytesView } from \"@zwave-js/shared\";\nimport type { NVMModuleType } from \"./shared.js\";\n\nexport interface NVMDescriptor {\n\tmanufacturerID: number;\n\tfirmwareID: number;\n\tproductType: number;\n\tproductID: number;\n\tfirmwareVersion: string;\n\tprotocolVersion: string;\n}\n\nexport function parseNVMDescriptor(\n\tdata: BytesView,\n\toffset: number = 0,\n): NVMDescriptor {\n\tconst buffer = Bytes.view(data);\n\treturn {\n\t\tmanufacturerID: buffer.readUInt16BE(offset),\n\t\tfirmwareID: buffer.readUInt16BE(offset + 2),\n\t\tproductType: buffer.readUInt16BE(offset + 4),\n\t\tproductID: buffer.readUInt16BE(offset + 6),\n\t\tfirmwareVersion: `${buffer[offset + 8]}.${buffer[offset + 9]}`,\n\t\t// Z-Wave protocol versions are formatted as \"6.07\" and similar\n\t\tprotocolVersion: `${buffer[offset + 10]}.${\n\t\t\tbuffer[offset + 11].toString().padStart(\n\t\t\t\t2,\n\t\t\t\t\"0\",\n\t\t\t)\n\t\t}`,\n\t};\n}\n\nexport function encodeNVMDescriptor(descriptor: NVMDescriptor): Bytes {\n\tconst ret = new Bytes(12);\n\tret.writeUInt16BE(descriptor.manufacturerID, 0);\n\tret.writeUInt16BE(descriptor.firmwareID, 2);\n\tret.writeUInt16BE(descriptor.productType, 4);\n\tret.writeUInt16BE(descriptor.productID, 6);\n\tconst fwVersionParts = descriptor.firmwareVersion\n\t\t.split(\".\")\n\t\t.map((i) => parseInt(i));\n\tret[8] = fwVersionParts[0];\n\tret[9] = fwVersionParts[1];\n\tconst protocolVersionParts = descriptor.protocolVersion\n\t\t.split(\".\")\n\t\t.map((i) => parseInt(i));\n\tret[10] = protocolVersionParts[0];\n\tret[11] = protocolVersionParts[1];\n\treturn ret;\n}\n\nexport interface NVMModuleDescriptor {\n\tsize: number;\n\ttype: NVMModuleType;\n\tversion: string;\n}\n\nexport function parseNVMModuleDescriptor(\n\tdata: BytesView,\n\toffset: number = 0,\n): NVMModuleDescriptor {\n\tconst buffer = Bytes.view(data);\n\treturn {\n\t\tsize: buffer.readUInt16BE(offset),\n\t\ttype: buffer[offset + 2],\n\t\tversion: `${buffer[offset + 3]}.${buffer[offset + 4]}`,\n\t};\n}\n\nexport function encodeNVMModuleDescriptor(\n\tdescriptior: NVMModuleDescriptor,\n): Bytes {\n\tconst ret = new Bytes(5);\n\tret.writeUInt16BE(descriptior.size, 0);\n\tret[2] = descriptior.type;\n\tconst versionParts = descriptior.version.split(\".\").map((i) => parseInt(i));\n\tret[3] = versionParts[0];\n\tret[4] = versionParts[1];\n\treturn ret;\n}\n\nexport interface NVM500NodeInfo\n\textends Omit<NodeProtocolInfo, \"hasSpecificDeviceClass\">\n{\n\tgenericDeviceClass: number;\n\tspecificDeviceClass: number | null;\n}\n\nexport function parseNVM500NodeInfo(\n\tbuffer: BytesView,\n\toffset: number,\n): NVM500NodeInfo {\n\tconst { hasSpecificDeviceClass, ...protocolInfo } = parseNodeProtocolInfo(\n\t\tbuffer,\n\t\toffset,\n\t);\n\tconst genericDeviceClass = buffer[offset + 3];\n\tconst specificDeviceClass = hasSpecificDeviceClass\n\t\t? buffer[offset + 4]\n\t\t: null;\n\treturn {\n\t\t...protocolInfo,\n\t\tgenericDeviceClass,\n\t\tspecificDeviceClass,\n\t};\n}\n\nexport function encodeNVM500NodeInfo(nodeInfo: NVM500NodeInfo): Bytes {\n\treturn Bytes.concat([\n\t\tencodeNodeProtocolInfo({\n\t\t\t...nodeInfo,\n\t\t\thasSpecificDeviceClass: !!nodeInfo.specificDeviceClass,\n\t\t}),\n\t\tBytes.from([\n\t\t\tnodeInfo.genericDeviceClass,\n\t\t\tnodeInfo.specificDeviceClass ?? 0,\n\t\t]),\n\t]);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;AAAA,kBAIO;AACP,oBAAsC;AAYhC,SAAU,mBACf,MACA,SAAiB,GAAC;AAElB,QAAM,SAAS,oBAAM,KAAK,IAAI;AAC9B,SAAO;IACN,gBAAgB,OAAO,aAAa,MAAM;IAC1C,YAAY,OAAO,aAAa,SAAS,CAAC;IAC1C,aAAa,OAAO,aAAa,SAAS,CAAC;IAC3C,WAAW,OAAO,aAAa,SAAS,CAAC;IACzC,iBAAiB,GAAG,OAAO,SAAS,CAAC,CAAC,IAAI,OAAO,SAAS,CAAC,CAAC;;IAE5D,iBAAiB,GAAG,OAAO,SAAS,EAAE,CAAC,IACtC,OAAO,SAAS,EAAE,EAAE,SAAQ,EAAG,SAC9B,GACA,GAAG,CAEL;;AAEF;AAnBgB;AAqBV,SAAU,oBAAoB,YAAyB;AAC5D,QAAM,MAAM,IAAI,oBAAM,EAAE;AACxB,MAAI,cAAc,WAAW,gBAAgB,CAAC;AAC9C,MAAI,cAAc,WAAW,YAAY,CAAC;AAC1C,MAAI,cAAc,WAAW,aAAa,CAAC;AAC3C,MAAI,cAAc,WAAW,WAAW,CAAC;AACzC,QAAM,iBAAiB,WAAW,gBAChC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AACxB,MAAI,CAAC,IAAI,eAAe,CAAC;AACzB,MAAI,CAAC,IAAI,eAAe,CAAC;AACzB,QAAM,uBAAuB,WAAW,gBACtC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AACxB,MAAI,EAAE,IAAI,qBAAqB,CAAC;AAChC,MAAI,EAAE,IAAI,qBAAqB,CAAC;AAChC,SAAO;AACR;AAjBgB;AAyBV,SAAU,yBACf,MACA,SAAiB,GAAC;AAElB,QAAM,SAAS,oBAAM,KAAK,IAAI;AAC9B,SAAO;IACN,MAAM,OAAO,aAAa,MAAM;IAChC,MAAM,OAAO,SAAS,CAAC;IACvB,SAAS,GAAG,OAAO,SAAS,CAAC,CAAC,IAAI,OAAO,SAAS,CAAC,CAAC;;AAEtD;AAVgB;AAYV,SAAU,0BACf,aAAgC;AAEhC,QAAM,MAAM,IAAI,oBAAM,CAAC;AACvB,MAAI,cAAc,YAAY,MAAM,CAAC;AACrC,MAAI,CAAC,IAAI,YAAY;AACrB,QAAM,eAAe,YAAY,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AAC1E,MAAI,CAAC,IAAI,aAAa,CAAC;AACvB,MAAI,CAAC,IAAI,aAAa,CAAC;AACvB,SAAO;AACR;AAVgB;AAmBV,SAAU,oBACf,QACA,QAAc;AAEd,QAAM,EAAE,wBAAwB,GAAG,aAAY,QAAK,mCACnD,QACA,MAAM;AAEP,QAAM,qBAAqB,OAAO,SAAS,CAAC;AAC5C,QAAM,sBAAsB,yBACzB,OAAO,SAAS,CAAC,IACjB;AACH,SAAO;IACN,GAAG;IACH;IACA;;AAEF;AAjBgB;AAmBV,SAAU,qBAAqB,UAAwB;AAC5D,SAAO,oBAAM,OAAO;QACnB,oCAAuB;MACtB,GAAG;MACH,wBAAwB,CAAC,CAAC,SAAS;KACnC;IACD,oBAAM,KAAK;MACV,SAAS;MACT,SAAS,uBAAuB;KAChC;GACD;AACF;AAXgB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/nvm500/adapter.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n\ttype CommandClasses,\n\tZWaveError,\n\tZWaveErrorCodes,\n} from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport { assertNever } from \"alcalzone-shared/helpers\";\nimport { SUC_MAX_UPDATES } from \"../../consts.js\";\nimport type { NVM500, NVM500Info } from \"../NVM500.js\";\nimport type {\n\tControllerNVMProperty,\n\tNVMAdapter,\n\tNVMProperty,\n\tNVMPropertyToDataType,\n\tNodeNVMProperty,\n} from \"../common/definitions.js\";\nimport type { Route } from \"../common/routeCache.js\";\nimport type { SUCUpdateEntry } from \"../common/sucUpdateEntry.js\";\nimport type { NodeInfo } from \"../nvm3/files/index.js\";\nimport type { NVM500NodeInfo } from \"./EntryParsers.js\";\nimport {\n\tAPPL_NODEPARM_MAX,\n\ttype NVMData,\n\ttype NVMEntryName,\n\tNVM_SERIALAPI_HOST_SIZE,\n} from \"./shared.js\";\n\nexport class NVM500Adapter implements NVMAdapter {\n\tpublic constructor(nvm: NVM500) {\n\t\tthis._nvm = nvm;\n\t}\n\n\tprivate _nvm: NVM500;\n\n\tpublic async get<T extends NVMProperty, R extends boolean = boolean>(\n\t\tproperty: T,\n\t\trequired?: R,\n\t): Promise<\n\t\tR extends true ? NonNullable<NVMPropertyToDataType<T>>\n\t\t\t: (NVMPropertyToDataType<T> | undefined)\n\t> {\n\t\tconst info = this._nvm.info ?? await this._nvm.init();\n\n\t\tlet ret: unknown;\n\t\tif (property.domain === \"controller\") {\n\t\t\tret = await this.getControllerNVMProperty(info, property);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`500 series NVM has no support for Long Range node information`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t} else {\n\t\t\tret = await this.getNodeNVMProperty(property);\n\t\t}\n\t\tif (required && ret === undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`NVM data for property ${JSON.stringify(property)} not found`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\t\treturn ret as any;\n\t}\n\n\tprivate async getOnly<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t): Promise<T | undefined> {\n\t\tconst data = await this._nvm.get(property);\n\t\treturn data?.[0] as T | undefined;\n\t}\n\n\tprivate async getSingle<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t): Promise<T | undefined> {\n\t\tconst data = await this._nvm.getSingle(property, index);\n\t\treturn data as T | undefined;\n\t}\n\n\tprivate getAll<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t): Promise<T[] | undefined> {\n\t\treturn this._nvm.get(property) as any;\n\t}\n\n\tprivate async getControllerNVMProperty(\n\t\tinfo: NVM500Info,\n\t\tproperty: ControllerNVMProperty,\n\t): Promise<unknown> {\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\":\n\t\t\t\treturn info.nvmDescriptor.protocolVersion;\n\t\t\tcase \"applicationVersion\":\n\t\t\t\treturn info.nvmDescriptor.firmwareVersion;\n\n\t\t\tcase \"protocolFileFormat\":\n\t\t\tcase \"applicationFileFormat\":\n\t\t\t\t// Not supported in 500 series, but we use 500 in JSON to designate a 500 series NVM\n\t\t\t\treturn 500;\n\n\t\t\tcase \"applicationData\":\n\t\t\t\treturn this.getOnly<Uint8Array>(\n\t\t\t\t\t\"EEOFFSET_HOST_OFFSET_START_far\",\n\t\t\t\t);\n\n\t\t\tcase \"applicationName\":\n\t\t\t\t// Not supported in 500 series\n\t\t\t\treturn;\n\n\t\t\tcase \"homeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = await this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_HOME_ID_far\",\n\t\t\t\t);\n\t\t\t\tif (homeId == undefined) return;\n\t\t\t\tconst ret = new Bytes(4).fill(0);\n\t\t\t\t// FIXME: BE? LE?\n\t\t\t\tret.writeUInt32BE(homeId, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = await this.getOnly<number>(\"NVM_HOMEID_far\");\n\t\t\t\tif (homeId == undefined) return;\n\t\t\t\tconst ret = new Bytes(4).fill(0);\n\t\t\t\t// FIXME: BE? LE?\n\t\t\t\tret.writeUInt32BE(homeId, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tcase \"nodeId\":\n\t\t\t\treturn this.getOnly<number>(\"NVM_NODEID_far\");\n\n\t\t\tcase \"lastNodeId\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_LAST_USED_NODE_ID_START_far\",\n\t\t\t\t);\n\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far\",\n\t\t\t\t);\n\t\t\tcase \"sucLastIndex\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_SUC_LAST_INDEX_START_far\",\n\t\t\t\t);\n\t\t\tcase \"controllerConfiguration\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_CONTROLLER_CONFIGURATION_far\",\n\t\t\t\t);\n\n\t\t\tcase \"maxNodeId\":\n\t\t\t\treturn this.getOnly<number>(\"EX_NVM_MAX_NODE_ID_far\");\n\t\t\tcase \"reservedId\":\n\t\t\t\treturn this.getOnly<number>(\"EX_NVM_RESERVED_ID_far\");\n\t\t\tcase \"systemState\":\n\t\t\t\treturn this.getOnly<number>(\"NVM_SYSTEM_STATE\");\n\n\t\t\tcase \"commandClasses\": {\n\t\t\t\tconst numCCs = await this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_LEN_far\",\n\t\t\t\t);\n\t\t\t\tconst ret = await this.getAll<CommandClasses>(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_far\",\n\t\t\t\t);\n\t\t\t\treturn ret?.slice(0, numCCs);\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\":\n\t\t\t\treturn this.getOnly<number[]>(\"NVM_PREFERRED_REPEATERS_far\");\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\treturn this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_APP_LOCK_far\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\treturn this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\treturn this.getOnly<number[]>(\"EX_NVM_PENDING_UPDATE_far\");\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\treturn this.getOnly<number[]>(\"NVM_PENDING_DISCOVERY_far\");\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst nodeInfos = await this.getAll<NVM500NodeInfo>(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t);\n\t\t\t\treturn nodeInfos\n\t\t\t\t\t?.map((info, index) => info ? (index + 1) : undefined)\n\t\t\t\t\t.filter((id) => id != undefined);\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst ret = await this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_BRIDGE_NODEPOOL_START_far\",\n\t\t\t\t);\n\t\t\t\treturn ret ?? [];\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tconst ret = await this.getAll<SUCUpdateEntry>(\n\t\t\t\t\t\"EX_NVM_SUC_NODE_LIST_START_far\",\n\t\t\t\t);\n\t\t\t\treturn ret?.filter(Boolean);\n\t\t\t}\n\n\t\t\tcase \"watchdogStarted\":\n\t\t\t\treturn this.getOnly<number>(\"EEOFFSET_WATCHDOG_STARTED_far\");\n\n\t\t\tcase \"powerLevelNormal\":\n\t\t\t\treturn this.getAll<number>(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_NORMAL_far\",\n\t\t\t\t);\n\t\t\tcase \"powerLevelLow\":\n\t\t\t\treturn this.getAll<number>(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_LOW_far\",\n\t\t\t\t);\n\t\t\tcase \"powerMode\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_far\",\n\t\t\t\t);\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far\",\n\t\t\t\t);\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far\",\n\t\t\t\t);\n\n\t\t\tcase \"sucAwarenessPushNeeded\":\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\tcase \"lrNodeIds\":\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\":\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\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\":\n\t\t\t\t// Not supported on 500 series, 700+ series only\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): Promise<unknown> {\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst nodeInfo = await this.getSingle<NVM500NodeInfo>(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t);\n\t\t\t\tconst sucUpdateIndex = await this.getSingle<number>(\n\t\t\t\t\t\"EX_NVM_SUC_CONTROLLER_LIST_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t) ?? 0xff;\n\t\t\t\tconst neighbors = await this.getSingle<number[]>(\n\t\t\t\t\t\"EX_NVM_ROUTING_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t) ?? [];\n\n\t\t\t\tif (!nodeInfo) return;\n\n\t\t\t\treturn {\n\t\t\t\t\tnodeId,\n\t\t\t\t\t...nodeInfo,\n\t\t\t\t\tneighbors,\n\t\t\t\t\tsucUpdateIndex,\n\t\t\t\t} satisfies NodeInfo;\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tconst lwr = await this.getSingle<Route>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t);\n\t\t\t\tconst nlwr = await this.getSingle<Route>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_NLWR_SR_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t);\n\t\t\t\treturn { lwr, nlwr };\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setOnly(\n\t\tproperty: NVMEntryName,\n\t\tvalue: NVMData,\n\t): Promise<void> {\n\t\treturn this._nvm.set(property, [value]);\n\t}\n\n\tprivate setSingle(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t\tvalue: NVMData,\n\t): Promise<void> {\n\t\treturn this._nvm.setSingle(property, index, value);\n\t}\n\n\tprivate setAll(\n\t\tproperty: NVMEntryName,\n\t\tvalue: NVMData[],\n\t): Promise<void> {\n\t\treturn this._nvm.set(property, value);\n\t}\n\n\tset<T extends NVMProperty>(\n\t\tproperty: T,\n\t\tvalue: NVMPropertyToDataType<T>,\n\t): Promise<void> {\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\tthrow new ZWaveError(\n\t\t\t\t`500 series NVM has no support for Long Range node information`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\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\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\":\n\t\t\tcase \"applicationVersion\":\n\t\t\t\t// Only written during erase\n\t\t\t\treturn;\n\n\t\t\tcase \"protocolFileFormat\":\n\t\t\tcase \"applicationFileFormat\":\n\t\t\t\t// Cannot be written\n\t\t\t\treturn;\n\n\t\t\tcase \"applicationData\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_HOST_OFFSET_START_far\",\n\t\t\t\t\tvalue ?? new Bytes(NVM_SERIALAPI_HOST_SIZE).fill(0xff),\n\t\t\t\t);\n\n\t\t\tcase \"applicationName\":\n\t\t\t\t// Not supported in 500 series\n\t\t\t\treturn;\n\n\t\t\tcase \"homeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = value.readUInt32BE(0);\n\t\t\t\treturn this.setOnly(\"EX_NVM_HOME_ID_far\", homeId);\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst learnedHomeId = value?.readUInt32BE(0) ?? 0x00000000;\n\t\t\t\treturn this.setOnly(\"NVM_HOMEID_far\", learnedHomeId);\n\t\t\t}\n\n\t\t\tcase \"nodeId\":\n\t\t\t\treturn this.setOnly(\"NVM_NODEID_far\", value);\n\n\t\t\tcase \"lastNodeId\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_LAST_USED_NODE_ID_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"sucLastIndex\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_SUC_LAST_INDEX_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"controllerConfiguration\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_CONTROLLER_CONFIGURATION_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"maxNodeId\":\n\t\t\t\treturn this.setOnly(\"EX_NVM_MAX_NODE_ID_far\", value);\n\t\t\tcase \"reservedId\":\n\t\t\t\treturn this.setOnly(\"EX_NVM_RESERVED_ID_far\", value);\n\t\t\tcase \"systemState\":\n\t\t\t\treturn this.setOnly(\"NVM_SYSTEM_STATE\", value);\n\n\t\t\tcase \"commandClasses\": {\n\t\t\t\tawait this.setOnly(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_LEN_far\",\n\t\t\t\t\tvalue.length,\n\t\t\t\t);\n\t\t\t\tconst CCs = new Array(APPL_NODEPARM_MAX).fill(0xff);\n\t\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\t\tif (i < APPL_NODEPARM_MAX) {\n\t\t\t\t\t\tCCs[i] = value[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.setAll(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_far\",\n\t\t\t\t\tCCs,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\":\n\t\t\t\treturn this.setOnly(\"NVM_PREFERRED_REPEATERS_far\", value);\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_APP_LOCK_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\treturn this.setOnly(\"EX_NVM_PENDING_UPDATE_far\", value);\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\treturn this.setOnly(\"NVM_PENDING_DISCOVERY_far\", value);\n\t\t\t}\n\n\t\t\tcase \"nodeIds\":\n\t\t\t\t// Cannot be written. Is implied by the node info table\n\t\t\t\treturn;\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_BRIDGE_NODEPOOL_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tconst entries = value as SUCUpdateEntry[];\n\t\t\t\tconst sucUpdateEntries = new Array(SUC_MAX_UPDATES).fill(\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\t\t\tif (i < SUC_MAX_UPDATES) {\n\t\t\t\t\t\tsucUpdateEntries[i] = entries[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EX_NVM_SUC_NODE_LIST_START_far\",\n\t\t\t\t\tsucUpdateEntries,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"watchdogStarted\":\n\t\t\t\treturn this.setOnly(\"EEOFFSET_WATCHDOG_STARTED_far\", value);\n\n\t\t\tcase \"powerLevelNormal\":\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_NORMAL_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerLevelLow\":\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_LOW_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerMode\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"sucAwarenessPushNeeded\":\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\tcase \"lrNodeIds\":\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\":\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\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\":\n\t\t\t\t// Not supported on 500 series, 700+ series only\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 setNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst node = value as NodeInfo;\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tisListening: node.isListening,\n\t\t\t\t\t\t\tisFrequentListening: node.isFrequentListening,\n\t\t\t\t\t\t\tisRouting: node.isRouting,\n\t\t\t\t\t\t\tsupportedDataRates: node.supportedDataRates,\n\t\t\t\t\t\t\tprotocolVersion: node.protocolVersion,\n\t\t\t\t\t\t\toptionalFunctionality: node.optionalFunctionality,\n\t\t\t\t\t\t\tnodeType: node.nodeType,\n\t\t\t\t\t\t\tsupportsSecurity: node.supportsSecurity,\n\t\t\t\t\t\t\tsupportsBeaming: node.supportsBeaming,\n\t\t\t\t\t\t\tgenericDeviceClass: node.genericDeviceClass,\n\t\t\t\t\t\t\tspecificDeviceClass: node.specificDeviceClass\n\t\t\t\t\t\t\t\t?? null,\n\t\t\t\t\t\t} satisfies NVM500NodeInfo\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_SUC_CONTROLLER_LIST_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode?.sucUpdateIndex ?? 0xfe,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTING_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode?.neighbors,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst routes = value as { lwr?: Route; nlwr?: Route };\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\troutes.lwr,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_NLWR_SR_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t\troutes.nlwr,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tpublic async delete(_property: NVMProperty): Promise<void> {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic hasPendingChanges(): boolean {\n\t\t// We don't buffer changes\n\t\treturn false;\n\t}\n\n\tpublic async commit(): Promise<void> {\n\t\t// We don't buffer changes at the moment\n\t}\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,kBAIO;AACP,
|
|
4
|
+
"sourcesContent": ["import {\n\ttype CommandClasses,\n\tZWaveError,\n\tZWaveErrorCodes,\n} from \"@zwave-js/core\";\nimport { Bytes, type BytesView } from \"@zwave-js/shared\";\nimport { assertNever } from \"alcalzone-shared/helpers\";\nimport { SUC_MAX_UPDATES } from \"../../consts.js\";\nimport type { NVM500, NVM500Info } from \"../NVM500.js\";\nimport type {\n\tControllerNVMProperty,\n\tNVMAdapter,\n\tNVMProperty,\n\tNVMPropertyToDataType,\n\tNodeNVMProperty,\n} from \"../common/definitions.js\";\nimport type { Route } from \"../common/routeCache.js\";\nimport type { SUCUpdateEntry } from \"../common/sucUpdateEntry.js\";\nimport type { NodeInfo } from \"../nvm3/files/index.js\";\nimport type { NVM500NodeInfo } from \"./EntryParsers.js\";\nimport {\n\tAPPL_NODEPARM_MAX,\n\ttype NVMData,\n\ttype NVMEntryName,\n\tNVM_SERIALAPI_HOST_SIZE,\n} from \"./shared.js\";\n\nexport class NVM500Adapter implements NVMAdapter {\n\tpublic constructor(nvm: NVM500) {\n\t\tthis._nvm = nvm;\n\t}\n\n\tprivate _nvm: NVM500;\n\n\tpublic async get<T extends NVMProperty, R extends boolean = boolean>(\n\t\tproperty: T,\n\t\trequired?: R,\n\t): Promise<\n\t\tR extends true ? NonNullable<NVMPropertyToDataType<T>>\n\t\t\t: (NVMPropertyToDataType<T> | undefined)\n\t> {\n\t\tconst info = this._nvm.info ?? await this._nvm.init();\n\n\t\tlet ret: unknown;\n\t\tif (property.domain === \"controller\") {\n\t\t\tret = await this.getControllerNVMProperty(info, property);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`500 series NVM has no support for Long Range node information`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t} else {\n\t\t\tret = await this.getNodeNVMProperty(property);\n\t\t}\n\t\tif (required && ret === undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`NVM data for property ${JSON.stringify(property)} not found`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\t\treturn ret as any;\n\t}\n\n\tprivate async getOnly<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t): Promise<T | undefined> {\n\t\tconst data = await this._nvm.get(property);\n\t\treturn data?.[0] as T | undefined;\n\t}\n\n\tprivate async getSingle<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t): Promise<T | undefined> {\n\t\tconst data = await this._nvm.getSingle(property, index);\n\t\treturn data as T | undefined;\n\t}\n\n\tprivate getAll<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t): Promise<T[] | undefined> {\n\t\treturn this._nvm.get(property) as any;\n\t}\n\n\tprivate async getControllerNVMProperty(\n\t\tinfo: NVM500Info,\n\t\tproperty: ControllerNVMProperty,\n\t): Promise<unknown> {\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\":\n\t\t\t\treturn info.nvmDescriptor.protocolVersion;\n\t\t\tcase \"applicationVersion\":\n\t\t\t\treturn info.nvmDescriptor.firmwareVersion;\n\n\t\t\tcase \"protocolFileFormat\":\n\t\t\tcase \"applicationFileFormat\":\n\t\t\t\t// Not supported in 500 series, but we use 500 in JSON to designate a 500 series NVM\n\t\t\t\treturn 500;\n\n\t\t\tcase \"applicationData\":\n\t\t\t\treturn this.getOnly<BytesView>(\n\t\t\t\t\t\"EEOFFSET_HOST_OFFSET_START_far\",\n\t\t\t\t);\n\n\t\t\tcase \"applicationName\":\n\t\t\t\t// Not supported in 500 series\n\t\t\t\treturn;\n\n\t\t\tcase \"homeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = await this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_HOME_ID_far\",\n\t\t\t\t);\n\t\t\t\tif (homeId == undefined) return;\n\t\t\t\tconst ret = new Bytes(4).fill(0);\n\t\t\t\t// FIXME: BE? LE?\n\t\t\t\tret.writeUInt32BE(homeId, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = await this.getOnly<number>(\"NVM_HOMEID_far\");\n\t\t\t\tif (homeId == undefined) return;\n\t\t\t\tconst ret = new Bytes(4).fill(0);\n\t\t\t\t// FIXME: BE? LE?\n\t\t\t\tret.writeUInt32BE(homeId, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tcase \"nodeId\":\n\t\t\t\treturn this.getOnly<number>(\"NVM_NODEID_far\");\n\n\t\t\tcase \"lastNodeId\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_LAST_USED_NODE_ID_START_far\",\n\t\t\t\t);\n\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far\",\n\t\t\t\t);\n\t\t\tcase \"sucLastIndex\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_SUC_LAST_INDEX_START_far\",\n\t\t\t\t);\n\t\t\tcase \"controllerConfiguration\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_CONTROLLER_CONFIGURATION_far\",\n\t\t\t\t);\n\n\t\t\tcase \"maxNodeId\":\n\t\t\t\treturn this.getOnly<number>(\"EX_NVM_MAX_NODE_ID_far\");\n\t\t\tcase \"reservedId\":\n\t\t\t\treturn this.getOnly<number>(\"EX_NVM_RESERVED_ID_far\");\n\t\t\tcase \"systemState\":\n\t\t\t\treturn this.getOnly<number>(\"NVM_SYSTEM_STATE\");\n\n\t\t\tcase \"commandClasses\": {\n\t\t\t\tconst numCCs = await this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_LEN_far\",\n\t\t\t\t);\n\t\t\t\tconst ret = await this.getAll<CommandClasses>(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_far\",\n\t\t\t\t);\n\t\t\t\treturn ret?.slice(0, numCCs);\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\":\n\t\t\t\treturn this.getOnly<number[]>(\"NVM_PREFERRED_REPEATERS_far\");\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\treturn this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_APP_LOCK_far\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\treturn this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\treturn this.getOnly<number[]>(\"EX_NVM_PENDING_UPDATE_far\");\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\treturn this.getOnly<number[]>(\"NVM_PENDING_DISCOVERY_far\");\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst nodeInfos = await this.getAll<NVM500NodeInfo>(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t);\n\t\t\t\treturn nodeInfos\n\t\t\t\t\t?.map((info, index) => info ? (index + 1) : undefined)\n\t\t\t\t\t.filter((id) => id != undefined);\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst ret = await this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_BRIDGE_NODEPOOL_START_far\",\n\t\t\t\t);\n\t\t\t\treturn ret ?? [];\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tconst ret = await this.getAll<SUCUpdateEntry>(\n\t\t\t\t\t\"EX_NVM_SUC_NODE_LIST_START_far\",\n\t\t\t\t);\n\t\t\t\treturn ret?.filter(Boolean);\n\t\t\t}\n\n\t\t\tcase \"watchdogStarted\":\n\t\t\t\treturn this.getOnly<number>(\"EEOFFSET_WATCHDOG_STARTED_far\");\n\n\t\t\tcase \"powerLevelNormal\":\n\t\t\t\treturn this.getAll<number>(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_NORMAL_far\",\n\t\t\t\t);\n\t\t\tcase \"powerLevelLow\":\n\t\t\t\treturn this.getAll<number>(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_LOW_far\",\n\t\t\t\t);\n\t\t\tcase \"powerMode\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_far\",\n\t\t\t\t);\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far\",\n\t\t\t\t);\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far\",\n\t\t\t\t);\n\n\t\t\tcase \"sucAwarenessPushNeeded\":\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\tcase \"lrNodeIds\":\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\":\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\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\":\n\t\t\t\t// Not supported on 500 series, 700+ series only\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): Promise<unknown> {\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst nodeInfo = await this.getSingle<NVM500NodeInfo>(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t);\n\t\t\t\tconst sucUpdateIndex = await this.getSingle<number>(\n\t\t\t\t\t\"EX_NVM_SUC_CONTROLLER_LIST_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t) ?? 0xff;\n\t\t\t\tconst neighbors = await this.getSingle<number[]>(\n\t\t\t\t\t\"EX_NVM_ROUTING_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t) ?? [];\n\n\t\t\t\tif (!nodeInfo) return;\n\n\t\t\t\treturn {\n\t\t\t\t\tnodeId,\n\t\t\t\t\t...nodeInfo,\n\t\t\t\t\tneighbors,\n\t\t\t\t\tsucUpdateIndex,\n\t\t\t\t} satisfies NodeInfo;\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tconst lwr = await this.getSingle<Route>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t);\n\t\t\t\tconst nlwr = await this.getSingle<Route>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_NLWR_SR_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t);\n\t\t\t\treturn { lwr, nlwr };\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setOnly(\n\t\tproperty: NVMEntryName,\n\t\tvalue: NVMData,\n\t): Promise<void> {\n\t\treturn this._nvm.set(property, [value]);\n\t}\n\n\tprivate setSingle(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t\tvalue: NVMData,\n\t): Promise<void> {\n\t\treturn this._nvm.setSingle(property, index, value);\n\t}\n\n\tprivate setAll(\n\t\tproperty: NVMEntryName,\n\t\tvalue: NVMData[],\n\t): Promise<void> {\n\t\treturn this._nvm.set(property, value);\n\t}\n\n\tset<T extends NVMProperty>(\n\t\tproperty: T,\n\t\tvalue: NVMPropertyToDataType<T>,\n\t): Promise<void> {\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\tthrow new ZWaveError(\n\t\t\t\t`500 series NVM has no support for Long Range node information`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\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\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\":\n\t\t\tcase \"applicationVersion\":\n\t\t\t\t// Only written during erase\n\t\t\t\treturn;\n\n\t\t\tcase \"protocolFileFormat\":\n\t\t\tcase \"applicationFileFormat\":\n\t\t\t\t// Cannot be written\n\t\t\t\treturn;\n\n\t\t\tcase \"applicationData\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_HOST_OFFSET_START_far\",\n\t\t\t\t\tvalue ?? new Bytes(NVM_SERIALAPI_HOST_SIZE).fill(0xff),\n\t\t\t\t);\n\n\t\t\tcase \"applicationName\":\n\t\t\t\t// Not supported in 500 series\n\t\t\t\treturn;\n\n\t\t\tcase \"homeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = value.readUInt32BE(0);\n\t\t\t\treturn this.setOnly(\"EX_NVM_HOME_ID_far\", homeId);\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst learnedHomeId = value?.readUInt32BE(0) ?? 0x00000000;\n\t\t\t\treturn this.setOnly(\"NVM_HOMEID_far\", learnedHomeId);\n\t\t\t}\n\n\t\t\tcase \"nodeId\":\n\t\t\t\treturn this.setOnly(\"NVM_NODEID_far\", value);\n\n\t\t\tcase \"lastNodeId\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_LAST_USED_NODE_ID_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"sucLastIndex\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_SUC_LAST_INDEX_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"controllerConfiguration\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_CONTROLLER_CONFIGURATION_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"maxNodeId\":\n\t\t\t\treturn this.setOnly(\"EX_NVM_MAX_NODE_ID_far\", value);\n\t\t\tcase \"reservedId\":\n\t\t\t\treturn this.setOnly(\"EX_NVM_RESERVED_ID_far\", value);\n\t\t\tcase \"systemState\":\n\t\t\t\treturn this.setOnly(\"NVM_SYSTEM_STATE\", value);\n\n\t\t\tcase \"commandClasses\": {\n\t\t\t\tawait this.setOnly(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_LEN_far\",\n\t\t\t\t\tvalue.length,\n\t\t\t\t);\n\t\t\t\tconst CCs = new Array(APPL_NODEPARM_MAX).fill(0xff);\n\t\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\t\tif (i < APPL_NODEPARM_MAX) {\n\t\t\t\t\t\tCCs[i] = value[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.setAll(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_far\",\n\t\t\t\t\tCCs,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\":\n\t\t\t\treturn this.setOnly(\"NVM_PREFERRED_REPEATERS_far\", value);\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_APP_LOCK_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\treturn this.setOnly(\"EX_NVM_PENDING_UPDATE_far\", value);\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\treturn this.setOnly(\"NVM_PENDING_DISCOVERY_far\", value);\n\t\t\t}\n\n\t\t\tcase \"nodeIds\":\n\t\t\t\t// Cannot be written. Is implied by the node info table\n\t\t\t\treturn;\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_BRIDGE_NODEPOOL_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tconst entries = value as SUCUpdateEntry[];\n\t\t\t\tconst sucUpdateEntries = new Array(SUC_MAX_UPDATES).fill(\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\t\t\tif (i < SUC_MAX_UPDATES) {\n\t\t\t\t\t\tsucUpdateEntries[i] = entries[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EX_NVM_SUC_NODE_LIST_START_far\",\n\t\t\t\t\tsucUpdateEntries,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"watchdogStarted\":\n\t\t\t\treturn this.setOnly(\"EEOFFSET_WATCHDOG_STARTED_far\", value);\n\n\t\t\tcase \"powerLevelNormal\":\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_NORMAL_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerLevelLow\":\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_LOW_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerMode\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"sucAwarenessPushNeeded\":\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\tcase \"lrNodeIds\":\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\":\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\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\":\n\t\t\t\t// Not supported on 500 series, 700+ series only\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 setNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst node = value as NodeInfo;\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tisListening: node.isListening,\n\t\t\t\t\t\t\tisFrequentListening: node.isFrequentListening,\n\t\t\t\t\t\t\tisRouting: node.isRouting,\n\t\t\t\t\t\t\tsupportedDataRates: node.supportedDataRates,\n\t\t\t\t\t\t\tprotocolVersion: node.protocolVersion,\n\t\t\t\t\t\t\toptionalFunctionality: node.optionalFunctionality,\n\t\t\t\t\t\t\tnodeType: node.nodeType,\n\t\t\t\t\t\t\tsupportsSecurity: node.supportsSecurity,\n\t\t\t\t\t\t\tsupportsBeaming: node.supportsBeaming,\n\t\t\t\t\t\t\tgenericDeviceClass: node.genericDeviceClass,\n\t\t\t\t\t\t\tspecificDeviceClass: node.specificDeviceClass\n\t\t\t\t\t\t\t\t?? null,\n\t\t\t\t\t\t} satisfies NVM500NodeInfo\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_SUC_CONTROLLER_LIST_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode?.sucUpdateIndex ?? 0xfe,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTING_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode?.neighbors,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst routes = value as { lwr?: Route; nlwr?: Route };\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\troutes.lwr,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_NLWR_SR_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t\troutes.nlwr,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tpublic async delete(_property: NVMProperty): Promise<void> {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic hasPendingChanges(): boolean {\n\t\t// We don't buffer changes\n\t\treturn false;\n\t}\n\n\tpublic async commit(): Promise<void> {\n\t\t// We don't buffer changes at the moment\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_shared", "info"]
|
|
7
7
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { BytesView } from "@zwave-js/shared";
|
|
1
2
|
import type { Route } from "../common/routeCache.js";
|
|
2
3
|
import type { SUCUpdateEntry } from "../common/sucUpdateEntry.js";
|
|
3
4
|
import type { NVM500NodeInfo, NVMDescriptor, NVMModuleDescriptor } from "./EntryParsers.js";
|
|
@@ -25,7 +26,7 @@ export interface NVMEntry {
|
|
|
25
26
|
}
|
|
26
27
|
/** The NVM entry as it appears in a valid layout, with all sizes and offsets resolved */
|
|
27
28
|
export type ResolvedNVMEntry = Required<NVMEntry>;
|
|
28
|
-
export type NVMData =
|
|
29
|
+
export type NVMData = BytesView | number | NVMDescriptor | number[] | Route | NVMModuleDescriptor | SUCUpdateEntry | NVM500NodeInfo | undefined;
|
|
29
30
|
export interface ParsedNVMEntry extends NVMEntry {
|
|
30
31
|
data: NVMData[];
|
|
31
32
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/nvm500/shared.ts"],
|
|
4
|
-
"sourcesContent": ["import { NUM_NODEMASK_BYTES } from \"@zwave-js/core\";\nimport { SUC_UPDATE_ENTRY_SIZE } from \"../../consts.js\";\nimport type { Route } from \"../common/routeCache.js\";\nimport type { SUCUpdateEntry } from \"../common/sucUpdateEntry.js\";\nimport type {\n\tNVM500NodeInfo,\n\tNVMDescriptor,\n\tNVMModuleDescriptor,\n} from \"./EntryParsers.js\";\n\nexport enum NVMEntryType {\n\tNVMModuleSize,\n\tByte,\n\tWord,\n\tDWord,\n\tBuffer,\n\tNodeInfo,\n\tNodeMask,\n\tSUCUpdateEntry,\n\tRoute,\n\tNVMModuleDescriptor,\n\tNVMDescriptor,\n}\n\n// These names are pretty bad, but they're used in Silabs nvm_converter code, so we keep them for easier lookup\nexport type NVMEntryName =\n\t| \"EEOFFSET_CMDCLASS_far\"\n\t| \"EEOFFSET_CMDCLASS_LEN_far\"\n\t| \"EEOFFSET_HOST_OFFSET_START_far\"\n\t| \"EEOFFSET_MAGIC_far\"\n\t| \"EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far\"\n\t| \"EEOFFSET_MODULE_POWER_MODE_far\"\n\t| \"EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far\"\n\t| \"EEOFFSET_POWERLEVEL_LOW_far\"\n\t| \"EEOFFSET_POWERLEVEL_NORMAL_far\"\n\t| \"EEOFFSET_WATCHDOG_STARTED_far\"\n\t| \"EX_NVM_BRIDGE_NODEPOOL_START_far\"\n\t| \"EX_NVM_CONTROLLER_CONFIGURATION_far\"\n\t| \"EX_NVM_HOME_ID_far\"\n\t| \"EX_NVM_LAST_USED_NODE_ID_START_far\"\n\t| \"EX_NVM_MAX_NODE_ID_far\"\n\t| \"EX_NVM_NODE_TABLE_START_far\"\n\t| \"EX_NVM_PENDING_UPDATE_far\"\n\t| \"EX_NVM_RESERVED_ID_far\"\n\t| \"EX_NVM_ROUTECACHE_APP_LOCK_far\"\n\t| \"EX_NVM_ROUTECACHE_MAGIC_far\"\n\t| \"EX_NVM_ROUTECACHE_NLWR_SR_START_far\"\n\t| \"EX_NVM_ROUTECACHE_START_far\"\n\t| \"EX_NVM_ROUTING_TABLE_START_far\"\n\t| \"EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far\"\n\t| \"EX_NVM_SUC_ACTIVE_START_far\"\n\t| \"EX_NVM_SUC_CONTROLLER_LIST_START_far\"\n\t| \"EX_NVM_SUC_LAST_INDEX_START_far\"\n\t| \"EX_NVM_SUC_NODE_LIST_START_far\"\n\t| \"EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far\"\n\t| \"EX_NVM_ZENSOR_TABLE_START_far\"\n\t| \"NVM_CONFIGURATION_REALLYVALID_far\"\n\t| \"NVM_CONFIGURATION_VALID_far\"\n\t| \"NVM_HOMEID_far\"\n\t| \"NVM_INTERNAL_RESERVED_1_far\"\n\t| \"NVM_INTERNAL_RESERVED_2_far\"\n\t| \"NVM_INTERNAL_RESERVED_3_far\"\n\t| \"NVM_NODEID_far\"\n\t| \"NVM_PENDING_DISCOVERY_far\"\n\t| \"NVM_PREFERRED_REPEATERS_far\"\n\t| \"NVM_RTC_TIMERS_far\"\n\t| \"NVM_SECURITY0_KEY_far\"\n\t| \"NVM_SYSTEM_STATE\"\n\t| \"nvmApplicationDescriptor\"\n\t| \"nvmApplicationSize\"\n\t| \"nvmDescriptor\"\n\t| \"nvmDescriptorDescriptor\"\n\t| \"nvmDescriptorSize\"\n\t| \"nvmHostApplicationDescriptor\"\n\t| \"nvmHostApplicationSize\"\n\t| \"nvmModuleSizeEndMarker\"\n\t| \"nvmTotalEnd\"\n\t| \"nvmZWlibraryDescriptor\"\n\t| \"nvmZWlibrarySize\";\n\n// The NVM entries are organized in modules. Each module starts with 16-bit size (NVM_MODULE_SIZE)\n// and ends with a module descriptor (NVM_MODULE_DESCRIPTOR).\n// The offset (if specified) is used to validate the NVM format.\nexport interface NVMEntry {\n\tname: NVMEntryName;\n\ttype: NVMEntryType;\n\t// Override the default size for this entry\n\tsize?: number;\n\t/** The offset is only specified if it is needed for validation */\n\toffset?: number;\n\t// The actual size of this entry is size(type) * count\n\tcount: number;\n}\n\n/** The NVM entry as it appears in a valid layout, with all sizes and offsets resolved */\nexport type ResolvedNVMEntry = Required<NVMEntry>;\n\nexport type NVMData =\n\t|
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;AAAA,kBAAmC;
|
|
4
|
+
"sourcesContent": ["import { NUM_NODEMASK_BYTES } from \"@zwave-js/core\";\nimport type { BytesView } from \"@zwave-js/shared\";\nimport { SUC_UPDATE_ENTRY_SIZE } from \"../../consts.js\";\nimport type { Route } from \"../common/routeCache.js\";\nimport type { SUCUpdateEntry } from \"../common/sucUpdateEntry.js\";\nimport type {\n\tNVM500NodeInfo,\n\tNVMDescriptor,\n\tNVMModuleDescriptor,\n} from \"./EntryParsers.js\";\n\nexport enum NVMEntryType {\n\tNVMModuleSize,\n\tByte,\n\tWord,\n\tDWord,\n\tBuffer,\n\tNodeInfo,\n\tNodeMask,\n\tSUCUpdateEntry,\n\tRoute,\n\tNVMModuleDescriptor,\n\tNVMDescriptor,\n}\n\n// These names are pretty bad, but they're used in Silabs nvm_converter code, so we keep them for easier lookup\nexport type NVMEntryName =\n\t| \"EEOFFSET_CMDCLASS_far\"\n\t| \"EEOFFSET_CMDCLASS_LEN_far\"\n\t| \"EEOFFSET_HOST_OFFSET_START_far\"\n\t| \"EEOFFSET_MAGIC_far\"\n\t| \"EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far\"\n\t| \"EEOFFSET_MODULE_POWER_MODE_far\"\n\t| \"EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far\"\n\t| \"EEOFFSET_POWERLEVEL_LOW_far\"\n\t| \"EEOFFSET_POWERLEVEL_NORMAL_far\"\n\t| \"EEOFFSET_WATCHDOG_STARTED_far\"\n\t| \"EX_NVM_BRIDGE_NODEPOOL_START_far\"\n\t| \"EX_NVM_CONTROLLER_CONFIGURATION_far\"\n\t| \"EX_NVM_HOME_ID_far\"\n\t| \"EX_NVM_LAST_USED_NODE_ID_START_far\"\n\t| \"EX_NVM_MAX_NODE_ID_far\"\n\t| \"EX_NVM_NODE_TABLE_START_far\"\n\t| \"EX_NVM_PENDING_UPDATE_far\"\n\t| \"EX_NVM_RESERVED_ID_far\"\n\t| \"EX_NVM_ROUTECACHE_APP_LOCK_far\"\n\t| \"EX_NVM_ROUTECACHE_MAGIC_far\"\n\t| \"EX_NVM_ROUTECACHE_NLWR_SR_START_far\"\n\t| \"EX_NVM_ROUTECACHE_START_far\"\n\t| \"EX_NVM_ROUTING_TABLE_START_far\"\n\t| \"EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far\"\n\t| \"EX_NVM_SUC_ACTIVE_START_far\"\n\t| \"EX_NVM_SUC_CONTROLLER_LIST_START_far\"\n\t| \"EX_NVM_SUC_LAST_INDEX_START_far\"\n\t| \"EX_NVM_SUC_NODE_LIST_START_far\"\n\t| \"EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far\"\n\t| \"EX_NVM_ZENSOR_TABLE_START_far\"\n\t| \"NVM_CONFIGURATION_REALLYVALID_far\"\n\t| \"NVM_CONFIGURATION_VALID_far\"\n\t| \"NVM_HOMEID_far\"\n\t| \"NVM_INTERNAL_RESERVED_1_far\"\n\t| \"NVM_INTERNAL_RESERVED_2_far\"\n\t| \"NVM_INTERNAL_RESERVED_3_far\"\n\t| \"NVM_NODEID_far\"\n\t| \"NVM_PENDING_DISCOVERY_far\"\n\t| \"NVM_PREFERRED_REPEATERS_far\"\n\t| \"NVM_RTC_TIMERS_far\"\n\t| \"NVM_SECURITY0_KEY_far\"\n\t| \"NVM_SYSTEM_STATE\"\n\t| \"nvmApplicationDescriptor\"\n\t| \"nvmApplicationSize\"\n\t| \"nvmDescriptor\"\n\t| \"nvmDescriptorDescriptor\"\n\t| \"nvmDescriptorSize\"\n\t| \"nvmHostApplicationDescriptor\"\n\t| \"nvmHostApplicationSize\"\n\t| \"nvmModuleSizeEndMarker\"\n\t| \"nvmTotalEnd\"\n\t| \"nvmZWlibraryDescriptor\"\n\t| \"nvmZWlibrarySize\";\n\n// The NVM entries are organized in modules. Each module starts with 16-bit size (NVM_MODULE_SIZE)\n// and ends with a module descriptor (NVM_MODULE_DESCRIPTOR).\n// The offset (if specified) is used to validate the NVM format.\nexport interface NVMEntry {\n\tname: NVMEntryName;\n\ttype: NVMEntryType;\n\t// Override the default size for this entry\n\tsize?: number;\n\t/** The offset is only specified if it is needed for validation */\n\toffset?: number;\n\t// The actual size of this entry is size(type) * count\n\tcount: number;\n}\n\n/** The NVM entry as it appears in a valid layout, with all sizes and offsets resolved */\nexport type ResolvedNVMEntry = Required<NVMEntry>;\n\nexport type NVMData =\n\t| BytesView\n\t| number\n\t| NVMDescriptor\n\t| number[]\n\t| Route\n\t| NVMModuleDescriptor\n\t| SUCUpdateEntry\n\t| NVM500NodeInfo\n\t| undefined;\n\nexport interface ParsedNVMEntry extends NVMEntry {\n\tdata: NVMData[];\n}\n\nexport type NVMLayout = readonly Readonly<NVMEntry>[];\n\nexport type ResolvedNVMLayout = ReadonlyMap<NVMEntryName, ResolvedNVMEntry>;\n\nexport const NVMEntrySizes: Record<NVMEntryType, number> = {\n\t[NVMEntryType.NVMModuleSize]: 2, // Marks the start of an NVM module\n\t[NVMEntryType.Byte]: 1,\n\t[NVMEntryType.Word]: 2,\n\t[NVMEntryType.DWord]: 4,\n\t[NVMEntryType.Buffer]: 1, // The size must be specified\n\t[NVMEntryType.NodeInfo]: 5, // 3 bytes NodeProtocolInfo + generic + specific device class\n\t[NVMEntryType.NodeMask]: NUM_NODEMASK_BYTES, // Nodes bitmask\n\t[NVMEntryType.SUCUpdateEntry]: SUC_UPDATE_ENTRY_SIZE,\n\t[NVMEntryType.Route]: 5, // a Route\n\t[NVMEntryType.NVMModuleDescriptor]: 5, // 2 bytes module size, 1 byte module type, 2 bytes module version\n\t[NVMEntryType.NVMDescriptor]: 12,\n};\n\nexport enum NVMModuleType {\n\tUNDEFINED = 0x00,\n\tZW_PHY_LIBRARY = 0x01,\n\tZW_LIBRARY = 0x02,\n\tZW_FRAMEWORK = 0x03,\n\tAPPLICATION = 0x04,\n\tHOST_APPLICATION = 0x05,\n\tSECURITY_2 = 0x06,\n\tNVM_DESCRIPTOR = 0xff,\n}\n\nexport const SUC_CONTROLLER_LIST_SIZE = 232;\n\nexport const MAX_REPEATERS = 4;\n\n/* NVM is 16KB, 32KB or even more (you decide the size of your SPI EEPROM or FLASH chip) */\n/* Use only a reasonable amount of it for host application */\nexport const NVM_SERIALAPI_HOST_SIZE = 2048;\n\nexport const POWERLEVEL_CHANNELS = 3;\nexport const APPL_NODEPARM_MAX = 35;\nexport const RTC_TIMER_SIZE = 16;\nexport const TOTAL_RTC_TIMER_MAX = 8 + 2; /* max number of active RTC timers */\n\nexport const CONFIGURATION_VALID_0 = 0x54;\nexport const CONFIGURATION_VALID_1 = 0xa5;\nexport const ROUTECACHE_VALID = 0x4a;\nexport const MAGIC_VALUE = 0x42;\n\nexport interface NVM500Impl {\n\tname: string;\n\tlibrary: \"static\" | \"bridge\";\n\tprotocolVersions: string[];\n\tlayout: NVMLayout;\n}\n\nexport type ResolvedNVM500Impl = Omit<NVM500Impl, \"layout\"> & {\n\tlayout: ResolvedNVMLayout;\n};\n\nexport function resolveLayout(layout: NVMLayout): {\n\tlayout: ResolvedNVMLayout;\n\tnvmSize: number;\n} {\n\tconst ret: Map<NVMEntryName, Required<NVMEntry>> = new Map();\n\tlet offset = 0;\n\tfor (const entry of layout) {\n\t\tconst size = entry.size ?? NVMEntrySizes[entry.type];\n\t\tconst resolvedEntry: ResolvedNVMEntry = {\n\t\t\t...entry,\n\t\t\tsize,\n\t\t\toffset: entry.offset ?? offset,\n\t\t};\n\t\tret.set(resolvedEntry.name, resolvedEntry);\n\t\toffset += size * entry.count;\n\t}\n\n\tconst endMarker = ret.get(\"nvmModuleSizeEndMarker\")!;\n\tconst nvmSize = endMarker.offset + endMarker.size;\n\n\treturn { layout: ret, nvmSize };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;AAAA,kBAAmC;AAEnC,oBAAsC;AAStC,IAAY;CAAZ,SAAYA,eAAY;AACvB,EAAAA,cAAAA,cAAA,eAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,MAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,MAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,OAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,QAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,UAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,UAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,gBAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,OAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,qBAAA,IAAA,CAAA,IAAA;AACA,EAAAA,cAAAA,cAAA,eAAA,IAAA,EAAA,IAAA;AACD,GAZY,iBAAA,eAAY,CAAA,EAAA;AA0GjB,MAAM,gBAA8C;EAC1D,CAAC,aAAa,aAAa,GAAG;;EAC9B,CAAC,aAAa,IAAI,GAAG;EACrB,CAAC,aAAa,IAAI,GAAG;EACrB,CAAC,aAAa,KAAK,GAAG;EACtB,CAAC,aAAa,MAAM,GAAG;;EACvB,CAAC,aAAa,QAAQ,GAAG;;EACzB,CAAC,aAAa,QAAQ,GAAG;;EACzB,CAAC,aAAa,cAAc,GAAG;EAC/B,CAAC,aAAa,KAAK,GAAG;;EACtB,CAAC,aAAa,mBAAmB,GAAG;;EACpC,CAAC,aAAa,aAAa,GAAG;;AAG/B,IAAY;CAAZ,SAAYC,gBAAa;AACxB,EAAAA,eAAAA,eAAA,WAAA,IAAA,CAAA,IAAA;AACA,EAAAA,eAAAA,eAAA,gBAAA,IAAA,CAAA,IAAA;AACA,EAAAA,eAAAA,eAAA,YAAA,IAAA,CAAA,IAAA;AACA,EAAAA,eAAAA,eAAA,cAAA,IAAA,CAAA,IAAA;AACA,EAAAA,eAAAA,eAAA,aAAA,IAAA,CAAA,IAAA;AACA,EAAAA,eAAAA,eAAA,kBAAA,IAAA,CAAA,IAAA;AACA,EAAAA,eAAAA,eAAA,YAAA,IAAA,CAAA,IAAA;AACA,EAAAA,eAAAA,eAAA,gBAAA,IAAA,GAAA,IAAA;AACD,GATY,kBAAA,gBAAa,CAAA,EAAA;AAWlB,MAAM,2BAA2B;AAEjC,MAAM,gBAAgB;AAItB,MAAM,0BAA0B;AAEhC,MAAM,sBAAsB;AAC5B,MAAM,oBAAoB;AAC1B,MAAM,iBAAiB;AACvB,MAAM,sBAAsB,IAAI;AAEhC,MAAM,wBAAwB;AAC9B,MAAM,wBAAwB;AAC9B,MAAM,mBAAmB;AACzB,MAAM,cAAc;AAarB,SAAU,cAAc,QAAiB;AAI9C,QAAM,MAA6C,oBAAI,IAAG;AAC1D,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AAC3B,UAAM,OAAO,MAAM,QAAQ,cAAc,MAAM,IAAI;AACnD,UAAM,gBAAkC;MACvC,GAAG;MACH;MACA,QAAQ,MAAM,UAAU;;AAEzB,QAAI,IAAI,cAAc,MAAM,aAAa;AACzC,cAAU,OAAO,MAAM;EACxB;AAEA,QAAM,YAAY,IAAI,IAAI,wBAAwB;AAClD,QAAM,UAAU,UAAU,SAAS,UAAU;AAE7C,SAAO,EAAE,QAAQ,KAAK,QAAO;AAC9B;AArBgB;",
|
|
6
6
|
"names": ["NVMEntryType", "NVMModuleType"]
|
|
7
7
|
}
|
package/build/esm/convert.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CommandClasses, NodeIDType, type NodeProtocolInfo, RFRegion } from "@zwave-js/core";
|
|
2
|
+
import { type BytesView } from "@zwave-js/shared";
|
|
2
3
|
import { type NVM3Meta } from "./lib/NVM3.js";
|
|
3
4
|
import { type Route } from "./lib/common/routeCache.js";
|
|
4
5
|
import type { SUCUpdateEntry } from "./lib/common/sucUpdateEntry.js";
|
|
@@ -95,14 +96,14 @@ export declare function nodeHasInfo(node: NVMJSONNode): node is NVMJSONNodeWithI
|
|
|
95
96
|
/** Converts a compressed set of NVM objects to a JSON representation */
|
|
96
97
|
export declare function nvmObjectsToJSON(objects: ReadonlyMap<number, NVM3Object>): NVMJSON;
|
|
97
98
|
/** Reads an NVM buffer of a 700+ series stick and returns its JSON representation */
|
|
98
|
-
export declare function nvmToJSON(buffer:
|
|
99
|
+
export declare function nvmToJSON(buffer: BytesView, debugLogs?: boolean): Promise<NVMJSONWithMeta>;
|
|
99
100
|
/** Reads an NVM buffer of a 500-series stick and returns its JSON representation */
|
|
100
|
-
export declare function nvm500ToJSON(buffer:
|
|
101
|
-
export declare function jsonToNVM(json: NVMJSON, targetSDKVersion: string): Promise<
|
|
101
|
+
export declare function nvm500ToJSON(buffer: BytesView): Promise<Required<NVM500JSON>>;
|
|
102
|
+
export declare function jsonToNVM(json: NVMJSON, targetSDKVersion: string): Promise<BytesView>;
|
|
102
103
|
/** Takes a JSON represented 500 series NVM and converts it to binary */
|
|
103
|
-
export declare function jsonToNVM500(json: Required<NVM500JSON>, protocolVersion: string): Promise<
|
|
104
|
+
export declare function jsonToNVM500(json: Required<NVM500JSON>, protocolVersion: string): Promise<BytesView>;
|
|
104
105
|
export declare function json500To700(json: NVM500JSON, truncateApplicationData?: boolean): NVMJSON;
|
|
105
106
|
export declare function json700To500(json: NVMJSON): NVM500JSON;
|
|
106
107
|
/** Converts the given source NVM into a format that is compatible with the given target NVM */
|
|
107
|
-
export declare function migrateNVM(sourceNVM:
|
|
108
|
+
export declare function migrateNVM(sourceNVM: BytesView, targetNVM: BytesView, options?: MigrateNVMOptions): Promise<BytesView>;
|
|
108
109
|
//# sourceMappingURL=convert.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,cAAc,EAGnB,UAAU,EACV,KAAK,gBAAgB,EAErB,QAAQ,EAER,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/convert.ts"],"names":[],"mappings":"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"}
|
package/build/esm/convert.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ControllerCapabilityFlags, MAX_NODES, NodeIDType, NodeType, RFRegion, stripUndefined, } from "@zwave-js/core";
|
|
2
2
|
import { ZWaveError, ZWaveErrorCodes, isZWaveError, } from "@zwave-js/core/error";
|
|
3
|
-
import { Bytes, buffer2hex, cloneDeep, num2hex, pick } from "@zwave-js/shared";
|
|
3
|
+
import { Bytes, buffer2hex, cloneDeep, num2hex, pick, } from "@zwave-js/shared";
|
|
4
4
|
import { isObject } from "alcalzone-shared/typeguards";
|
|
5
5
|
import semverGte from "semver/functions/gte.js";
|
|
6
6
|
import semverLt from "semver/functions/lt.js";
|