UNPKG

ts-bacnet

Version:

The BACnet protocol library written in pure JavaScript.

232 lines (231 loc) 8.58 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.decodeAbort = exports.encodeAbort = exports.decodeError = exports.encodeError = exports.decodeResult = exports.encodeResult = exports.decodeSegmentAck = exports.encodeSegmentAck = exports.decodeComplexAck = exports.encodeComplexAck = exports.decodeSimpleAck = exports.encodeSimpleAck = exports.decodeUnconfirmedServiceRequest = exports.encodeUnconfirmedServiceRequest = exports.decodeConfirmedServiceRequest = exports.encodeConfirmedServiceRequest = exports.getDecodedInvokeId = exports.setDecodedType = exports.getDecodedType = void 0; const baAsn1 = __importStar(require("./asn1")); const baEnum = __importStar(require("./enum")); const getDecodedType = (buffer, offset) => { return buffer[offset]; }; exports.getDecodedType = getDecodedType; const setDecodedType = (buffer, offset, type) => { buffer[offset] = type; }; exports.setDecodedType = setDecodedType; const getDecodedInvokeId = (buffer, offset) => { const type = (0, exports.getDecodedType)(buffer, offset); switch (type & baEnum.PDU_TYPE_MASK) { case baEnum.PduType.SIMPLE_ACK: case baEnum.PduType.COMPLEX_ACK: case baEnum.PduType.ERROR: case baEnum.PduType.REJECT: case baEnum.PduType.ABORT: return buffer[offset + 1]; case baEnum.PduType.CONFIRMED_REQUEST: return buffer[offset + 2]; default: return undefined; } }; exports.getDecodedInvokeId = getDecodedInvokeId; const encodeConfirmedServiceRequest = (buffer, type, service, maxSegments, maxApdu, invokeId, sequencenumber, proposedWindowSize) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = maxSegments | maxApdu; buffer.buffer[buffer.offset++] = invokeId; if ((type & baEnum.PduConReqBit.SEGMENTED_MESSAGE) > 0) { buffer.buffer[buffer.offset++] = sequencenumber; buffer.buffer[buffer.offset++] = proposedWindowSize; } buffer.buffer[buffer.offset++] = service; }; exports.encodeConfirmedServiceRequest = encodeConfirmedServiceRequest; const decodeConfirmedServiceRequest = (buffer, offset) => { const orgOffset = offset; const type = buffer[offset++]; const maxSegments = buffer[offset] & 0xf0; const maxApdu = buffer[offset++] & 0x0f; const invokeId = buffer[offset++]; let sequencenumber = 0; let proposedWindowNumber = 0; if ((type & baEnum.PduConReqBit.SEGMENTED_MESSAGE) > 0) { sequencenumber = buffer[offset++]; proposedWindowNumber = buffer[offset++]; } const service = buffer[offset++]; return { len: offset - orgOffset, type, service, maxSegments, maxApdu, invokeId, sequencenumber, proposedWindowNumber, }; }; exports.decodeConfirmedServiceRequest = decodeConfirmedServiceRequest; const encodeUnconfirmedServiceRequest = (buffer, type, service) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = service; }; exports.encodeUnconfirmedServiceRequest = encodeUnconfirmedServiceRequest; const decodeUnconfirmedServiceRequest = (buffer, offset) => { const orgOffset = offset; const type = buffer[offset++]; const service = buffer[offset++]; return { len: offset - orgOffset, type, service, }; }; exports.decodeUnconfirmedServiceRequest = decodeUnconfirmedServiceRequest; const encodeSimpleAck = (buffer, type, service, invokeId) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; buffer.buffer[buffer.offset++] = service; }; exports.encodeSimpleAck = encodeSimpleAck; const decodeSimpleAck = (buffer, offset) => { const orgOffset = offset; const type = buffer[offset++]; const invokeId = buffer[offset++]; const service = buffer[offset++]; return { len: offset - orgOffset, type, service, invokeId, }; }; exports.decodeSimpleAck = decodeSimpleAck; const encodeComplexAck = (buffer, type, service, invokeId, sequencenumber, proposedWindowNumber) => { let len = 3; buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; if ((type & baEnum.PduConReqBit.SEGMENTED_MESSAGE) > 0) { buffer.buffer[buffer.offset++] = sequencenumber; buffer.buffer[buffer.offset++] = proposedWindowNumber; len += 2; } buffer.buffer[buffer.offset++] = service; return len; }; exports.encodeComplexAck = encodeComplexAck; const decodeComplexAck = (buffer, offset) => { const orgOffset = offset; const type = buffer[offset++]; const invokeId = buffer[offset++]; let sequencenumber = 0; let proposedWindowNumber = 0; if ((type & baEnum.PduConReqBit.SEGMENTED_MESSAGE) > 0) { sequencenumber = buffer[offset++]; proposedWindowNumber = buffer[offset++]; } const service = buffer[offset++]; return { len: offset - orgOffset, type, service, invokeId, sequencenumber, proposedWindowNumber, }; }; exports.decodeComplexAck = decodeComplexAck; const encodeSegmentAck = (buffer, type, originalInvokeId, sequencenumber, actualWindowSize) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = originalInvokeId; buffer.buffer[buffer.offset++] = sequencenumber; buffer.buffer[buffer.offset++] = actualWindowSize; }; exports.encodeSegmentAck = encodeSegmentAck; const decodeSegmentAck = (buffer, offset) => { const orgOffset = offset; const type = buffer[offset++]; const originalInvokeId = buffer[offset++]; const sequencenumber = buffer[offset++]; const actualWindowSize = buffer[offset++]; return { len: offset - orgOffset, type, originalInvokeId, sequencenumber, actualWindowSize, }; }; exports.decodeSegmentAck = decodeSegmentAck; const encodeResult = (buffer, /* BvlcResultFormat */ resultCode) => { baAsn1.encodeUnsigned(buffer, resultCode, 2); }; exports.encodeResult = encodeResult; const decodeResult = (buffer, offset) => { const orgOffset = offset; const decode = baAsn1.decodeUnsigned(buffer, offset, 2); offset += decode.len; return { len: offset - orgOffset, resultCode: decode.value, // BvlcResultFormat }; }; exports.decodeResult = decodeResult; const encodeError = (buffer, type, service, invokeId) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; buffer.buffer[buffer.offset++] = service; }; exports.encodeError = encodeError; const decodeError = (buffer, offset) => { const orgOffset = offset; const type = buffer[offset++]; const invokeId = buffer[offset++]; const service = buffer[offset++]; return { len: offset - orgOffset, type, service, invokeId, }; }; exports.decodeError = decodeError; const encodeAbort = (buffer, type, invokeId, reason) => { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; buffer.buffer[buffer.offset++] = reason; }; exports.encodeAbort = encodeAbort; const decodeAbort = (buffer, offset) => { const orgOffset = offset; const type = buffer[offset++]; const invokeId = buffer[offset++]; const reason = buffer[offset++]; return { len: offset - orgOffset, type, invokeId, reason, }; }; exports.decodeAbort = decodeAbort;