knxultimate
Version:
KNX IP protocol implementation for Node. This is the ENGINE of Node-Red KNX-Ultimate node.
81 lines (70 loc) • 2.07 kB
text/typescript
import { KNX_CONSTANTS } from './KNXConstants'
export default class ServiceFamilies {
private _type: number
private _services: Map<number, number>
constructor() {
this._type = KNX_CONSTANTS.SUPP_SVC_FAMILIES
this._services = new Map<number, number>()
}
get type(): number {
return this._type
}
get length(): number {
return 2 * this._services.size + 2
}
get services(): Map<number, number> {
return this._services
}
static createFromBuffer(buffer: Buffer, offset: number = 0) {
if (offset >= buffer.length) {
throw new Error(
`offset ${offset} out of buffer range ${buffer.length}`,
)
}
const structureLength: number = buffer.readUInt8(offset)
if (offset + structureLength > buffer.length) {
throw new Error(
`offset ${offset} block length: ${structureLength} out of buffer range ${buffer.length}`,
)
}
offset++
const type: number = buffer.readUInt8(offset++)
if (type !== KNX_CONSTANTS.SUPP_SVC_FAMILIES) {
throw new Error(`Invalid Service Family type ${type}`)
}
const serviceFamily: ServiceFamilies = new ServiceFamilies()
for (let i = 2; i < structureLength; i += 2) {
serviceFamily.set(
buffer.readUInt8(offset),
buffer.readUInt8(offset + 1),
)
offset += 2
}
return serviceFamily
}
set(id: number, version: number): void {
const _id: number = Number(id)
if (isNaN(_id) || id > 0xff || id < 0) {
throw new Error('Invalid service id')
}
const _version: number = Number(version)
if (isNaN(_version) || version > 0xff || version < 0) {
throw new Error('Invalid service version')
}
this._services.set(id, version)
}
service(id: number): number | undefined {
return this._services.get(id)
}
toBuffer(): Buffer {
const buffer: Buffer = Buffer.alloc(this.length)
let offset: number = 0
buffer.writeUInt8(this.length, offset++)
buffer.writeUInt8(KNX_CONSTANTS.SUPP_SVC_FAMILIES, offset++)
for (const [id, version] of this._services) {
buffer.writeUInt8(id, offset++)
buffer.writeUInt8(version, offset++)
}
return buffer
}
}