UNPKG

prisme-flow

Version:

prisme platform flow engine

191 lines (173 loc) 5.8 kB
var baEnum = require('./bacnet-enum'); var getDecodedType = module.exports.getDecodedType = function(buffer, offset) { return buffer[offset]; }; module.exports.setDecodedType = function(buffer, offset, type) { buffer[offset] = type; }; module.exports.getDecodedInvokeId = function(buffer, offset) { var type = getDecodedType(buffer, offset); switch (type & baEnum.BacnetPduTypes.PDU_TYPE_MASK) { case baEnum.BacnetPduTypes.PDU_TYPE_SIMPLE_ACK: case baEnum.BacnetPduTypes.PDU_TYPE_COMPLEX_ACK: case baEnum.BacnetPduTypes.PDU_TYPE_ERROR: case baEnum.BacnetPduTypes.PDU_TYPE_REJECT: case baEnum.BacnetPduTypes.PDU_TYPE_ABORT: return buffer[offset + 1]; case baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST: return buffer[offset + 2]; default: return; } }; module.exports.encodeConfirmedServiceRequest = function(buffer, type, service, maxSegments, maxAdpu, invokeId, sequencenumber, proposedWindowSize) { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = maxSegments | maxAdpu; buffer.buffer[buffer.offset++] = invokeId; if ((type & baEnum.BacnetPduTypes.SEGMENTED_MESSAGE) > 0) { buffer.buffer[buffer.offset++] = sequencenumber; buffer.buffer[buffer.offset++] = proposedWindowSize; } buffer.buffer[buffer.offset++] = service; }; module.exports.decodeConfirmedServiceRequest = function(buffer, offset) { var orgOffset = offset; var type = buffer[offset++]; var maxSegments = buffer[offset] & 0xF0; var maxAdpu = buffer[offset++] & 0x0F; var invokeId = buffer[offset++]; var sequencenumber = 0; var proposedWindowNumber = 0; if ((type & baEnum.BacnetPduTypes.SEGMENTED_MESSAGE) > 0) { sequencenumber = buffer[offset++]; proposedWindowNumber = buffer[offset++]; } var service = buffer[offset++]; return { len: offset - orgOffset, type: type, service: service, maxSegments: maxSegments, maxAdpu: maxAdpu, invokeId: invokeId, sequencenumber: sequencenumber, proposedWindowNumber: proposedWindowNumber }; }; module.exports.encodeUnconfirmedServiceRequest = function(buffer, type, service) { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = service; }; module.exports.decodeUnconfirmedServiceRequest = function(buffer, offset) { var orgOffset = offset; var type = buffer[offset++]; var service = buffer[offset++]; return { len: offset - orgOffset, type: type, service: service }; }; module.exports.encodeSimpleAck = function(buffer, type, service, invokeId) { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; buffer.buffer[buffer.offset++] = service; }; module.exports.decodeSimpleAck = function(buffer, offset) { var orgOffset = offset; var type = buffer[offset++]; var invokeId = buffer[offset++]; var service = buffer[offset++]; return { len: offset - orgOffset, type: type, service: service, invokeId: invokeId }; }; module.exports.encodeComplexAck = function(buffer, type, service, invokeId, sequencenumber, proposedWindowNumber) { var len = 3; buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; if ((type & baEnum.BacnetPduTypes.SEGMENTED_MESSAGE) > 0) { buffer.buffer[buffer.offset++] = sequencenumber; buffer.buffer[buffer.offset++] = proposedWindowNumber; len += 2; } buffer.buffer[buffer.offset++] = service; return len; }; module.exports.decodeComplexAck = function(buffer, offset) { var orgOffset = offset; var type = buffer[offset++]; var invokeId = buffer[offset++]; var sequencenumber = 0; var proposedWindowNumber = 0; if ((type & baEnum.BacnetPduTypes.SEGMENTED_MESSAGE) > 0) { sequencenumber = buffer[offset++]; proposedWindowNumber = buffer[offset++]; } var service = buffer[offset++]; return { len: offset - orgOffset, type: type, service: service, invokeId: invokeId, sequencenumber: sequencenumber, proposedWindowNumber: proposedWindowNumber }; }; module.exports.encodeSegmentAck = function(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; }; module.exports.decodeSegmentAck = function(buffer, offset) { var orgOffset = offset; var type = buffer[offset++]; var originalInvokeId = buffer[offset++]; var sequencenumber = buffer[offset++]; var actualWindowSize = buffer[offset++]; return { len: offset - orgOffset, type: type, originalInvokeId: originalInvokeId, sequencenumber: sequencenumber, actualWindowSize: actualWindowSize }; }; module.exports.encodeError = function(buffer, type, service, invokeId) { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; buffer.buffer[buffer.offset++] = service; }; module.exports.decodeError = function(buffer, offset) { var orgOffset = offset; var type = buffer[offset++]; var invokeId = buffer[offset++]; var service = buffer[offset++]; return { len: offset - orgOffset, type: type, service: service, invokeId: invokeId }; }; module.exports.encodeAbort = function(buffer, type, invokeId, reason) { buffer.buffer[buffer.offset++] = type; buffer.buffer[buffer.offset++] = invokeId; buffer.buffer[buffer.offset++] = reason; }; module.exports.decodeAbort = function(buffer, offset) { var orgOffset = offset; var type = buffer[offset++]; var invokeId = buffer[offset++]; var reason = buffer[offset++]; return { len: offset - orgOffset, type: type, invokeId: invokeId, reason: reason }; };