UNPKG

inventoresed

Version:

Z-Wave driver written entirely in JavaScript/TypeScript

153 lines (139 loc) 4.54 kB
import { NUM_NODEMASK_BYTES } from "@zwave-js/core/safe"; import { SUC_UPDATE_ENTRY_SIZE } from "../consts"; import type { Route, SUCUpdateEntry } from "../files"; import type { NVM500NodeInfo, NVMDescriptor, NVMModuleDescriptor, } from "./EntryParsers"; export enum NVMEntryType { NVMModuleSize, Byte, Word, DWord, Buffer, NodeInfo, NodeMask, SUCUpdateEntry, Route, NVMModuleDescriptor, NVMDescriptor, } // These names are pretty bad, but they're used in Silabs nvm_converter code, so we keep them for easier lookup export type NVMEntryName = | "EEOFFSET_CMDCLASS_far" | "EEOFFSET_CMDCLASS_LEN_far" | "EEOFFSET_HOST_OFFSET_START_far" | "EEOFFSET_MAGIC_far" | "EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far" | "EEOFFSET_MODULE_POWER_MODE_far" | "EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far" | "EEOFFSET_POWERLEVEL_LOW_far" | "EEOFFSET_POWERLEVEL_NORMAL_far" | "EEOFFSET_WATCHDOG_STARTED_far" | "EX_NVM_BRIDGE_NODEPOOL_START_far" | "EX_NVM_CONTROLLER_CONFIGURATION_far" | "EX_NVM_HOME_ID_far" | "EX_NVM_LAST_USED_NODE_ID_START_far" | "EX_NVM_MAX_NODE_ID_far" | "EX_NVM_NODE_TABLE_START_far" | "EX_NVM_PENDING_UPDATE_far" | "EX_NVM_RESERVED_ID_far" | "EX_NVM_ROUTECACHE_APP_LOCK_far" | "EX_NVM_ROUTECACHE_MAGIC_far" | "EX_NVM_ROUTECACHE_NLWR_SR_START_far" | "EX_NVM_ROUTECACHE_START_far" | "EX_NVM_ROUTING_TABLE_START_far" | "EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far" | "EX_NVM_SUC_ACTIVE_START_far" | "EX_NVM_SUC_CONTROLLER_LIST_START_far" | "EX_NVM_SUC_LAST_INDEX_START_far" | "EX_NVM_SUC_NODE_LIST_START_far" | "EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far" | "EX_NVM_ZENSOR_TABLE_START_far" | "NVM_CONFIGURATION_REALLYVALID_far" | "NVM_CONFIGURATION_VALID_far" | "NVM_HOMEID_far" | "NVM_INTERNAL_RESERVED_1_far" | "NVM_INTERNAL_RESERVED_2_far" | "NVM_INTERNAL_RESERVED_3_far" | "NVM_NODEID_far" | "NVM_PENDING_DISCOVERY_far" | "NVM_PREFERRED_REPEATERS_far" | "NVM_RTC_TIMERS_far" | "NVM_SECURITY0_KEY_far" | "NVM_SYSTEM_STATE" | "nvmApplicationDescriptor" | "nvmApplicationSize" | "nvmDescriptor" | "nvmDescriptorDescriptor" | "nvmDescriptorSize" | "nvmHostApplicationDescriptor" | "nvmHostApplicationSize" | "nvmModuleSizeEndMarker" | "nvmTotalEnd" | "nvmZWlibraryDescriptor" | "nvmZWlibrarySize"; // The NVM entries are organized in modules. Each module starts with 16-bit size (NVM_MODULE_SIZE) // and ends with a module descriptor (NVM_MODULE_DESCRIPTOR). // The offset (if specified) is used to validate the NVM format. export interface NVMEntry { name: NVMEntryName; type: NVMEntryType; // Override the default size for this entry size?: number; /** The offset is only specified if it is needed for validation */ offset?: number; // The actual size of this entry is size(type) * count count: number; } export type NVMData = | Buffer | number | NVMDescriptor | number[] | Route | NVMModuleDescriptor | SUCUpdateEntry | NVM500NodeInfo | undefined; export interface ParsedNVMEntry extends NVMEntry { data: NVMData[]; } export type NVMLayout = NVMEntry[]; export const NVMEntrySizes: Record<NVMEntryType, number> = { [NVMEntryType.NVMModuleSize]: 2, // Marks the start of an NVM module [NVMEntryType.Byte]: 1, [NVMEntryType.Word]: 2, [NVMEntryType.DWord]: 4, [NVMEntryType.Buffer]: 1, // The size must be specified [NVMEntryType.NodeInfo]: 5, // 3 bytes NodeProtocolInfo + generic + specific device class [NVMEntryType.NodeMask]: NUM_NODEMASK_BYTES, // Nodes bitmask [NVMEntryType.SUCUpdateEntry]: SUC_UPDATE_ENTRY_SIZE, [NVMEntryType.Route]: 5, // a Route [NVMEntryType.NVMModuleDescriptor]: 5, // 2 bytes module size, 1 byte module type, 2 bytes module version [NVMEntryType.NVMDescriptor]: 12, }; export enum NVMModuleType { UNDEFINED = 0x00, ZW_PHY_LIBRARY = 0x01, ZW_LIBRARY = 0x02, ZW_FRAMEWORK = 0x03, APPLICATION = 0x04, HOST_APPLICATION = 0x05, SECURITY_2 = 0x06, NVM_DESCRIPTOR = 0xff, } export const SUC_CONTROLLER_LIST_SIZE = 232; export const MAX_REPEATERS = 4; /* NVM is 16KB, 32KB or even more (you decide the size of your SPI EEPROM or FLASH chip) */ /* Use only a reasonable amount of it for host application */ export const NVM_SERIALAPI_HOST_SIZE = 2048; export const POWERLEVEL_CHANNELS = 3; export const APPL_NODEPARM_MAX = 35; export const RTC_TIMER_SIZE = 16; export const TOTAL_RTC_TIMER_MAX = 8 + 2; /* max number of active RTC timers */ export const CONFIGURATION_VALID_0 = 0x54; export const CONFIGURATION_VALID_1 = 0xa5; export const ROUTECACHE_VALID = 0x4a; export const MAGIC_VALUE = 0x42;