knxultimate
Version:
KNX IP protocol implementation for Node. This is the ENGINE of Node-Red KNX-Ultimate node.
82 lines • 3.2 kB
JavaScript
;
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