UNPKG

knxultimate

Version:

KNX IP protocol implementation for Node. This is the ENGINE of Node-Red KNX-Ultimate node.

82 lines 3.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.KNXAddressLevel = exports.KNXAddressType = void 0; const binary_parser_1 = require("binary-parser"); const KNXUtils_1 = require("./KNXUtils"); const threeLevelPhysical = new binary_parser_1.Parser().bit4('l1').bit4('l2').uint8('l3'); const threeLevelGroup = new binary_parser_1.Parser().bit5('l1').bit3('l2').uint8('l3'); const twoLevel = new binary_parser_1.Parser().bit5('l1').bit11('l2'); const ADDRESS_LENGTH = 2; var KNXAddressType; (function (KNXAddressType) { KNXAddressType[KNXAddressType["TYPE_INDIVIDUAL"] = 0] = "TYPE_INDIVIDUAL"; KNXAddressType[KNXAddressType["TYPE_GROUP"] = 1] = "TYPE_GROUP"; })(KNXAddressType || (exports.KNXAddressType = KNXAddressType = {})); var KNXAddressLevel; (function (KNXAddressLevel) { KNXAddressLevel[KNXAddressLevel["LEVEL_TWO"] = 2] = "LEVEL_TWO"; KNXAddressLevel[KNXAddressLevel["LEVEL_THREE"] = 3] = "LEVEL_THREE"; })(KNXAddressLevel || (exports.KNXAddressLevel = KNXAddressLevel = {})); class KNXAddress { constructor(address, type = KNXAddressType.TYPE_INDIVIDUAL, level = KNXAddressLevel.LEVEL_THREE) { this.type = type; this.level = level; this.set(address); this.length = 2; } static get TYPE_INDIVIDUAL() { return KNXAddressType.TYPE_INDIVIDUAL; } static get TYPE_GROUP() { return KNXAddressType.TYPE_GROUP; } static createFromString(address, type = KNXAddressType.TYPE_INDIVIDUAL) { return new KNXAddress((0, KNXUtils_1.validateKNXAddress)(address, type === KNXAddressType.TYPE_GROUP), type); } static createFromBuffer(buffer, offset = 0, type = KNXAddressType.TYPE_INDIVIDUAL) { if (offset + 2 > buffer.length) { throw new Error(`offset ${offset} out of buffer range ${buffer.length}`); } const address = buffer.readUInt16BE(offset); return new KNXAddress(address, type); } set(address) { if (isNaN(address)) { throw new Error('Invalid address format'); } else if (address > 0xffff) { throw new Error('Invalid address number'); } else { this._address = address; } } get() { return this._address; } toString() { let address = ''; const buf = Buffer.alloc(2); buf.writeUInt16BE(this._address); if (this.type === KNXAddressType.TYPE_GROUP && this.level === KNXAddressLevel.LEVEL_TWO) { const addr = twoLevel.parse(buf); address = [addr.l1, addr.l2].join('/'); } else { const sep = this.type === KNXAddressType.TYPE_GROUP ? '/' : '.'; const addr = (this.type === KNXAddressType.TYPE_GROUP ? threeLevelGroup : threeLevelPhysical).parse(buf); address = [addr.l1, addr.l2, addr.l3].join(sep); } return address; } toBuffer() { const buffer = Buffer.alloc(this.length); buffer.writeUInt16BE(this._address, 0); return buffer; } } exports.default = KNXAddress; //# sourceMappingURL=KNXAddress.js.map