prisme-flow
Version:
prisme platform flow engine
628 lines (585 loc) • 25.7 kB
JavaScript
var baAsn1 = require('./bacnet-asn1');
var baEnum = require('./bacnet-enum');
module.exports.encodeIamBroadcast = function(buffer, deviceId, maxApdu, segmentation, vendorId) {
baAsn1.encode_application_object_id(buffer, baEnum.BacnetObjectTypes.OBJECT_DEVICE, deviceId);
baAsn1.encode_application_unsigned(buffer, maxApdu);
baAsn1.encode_application_enumerated(buffer, segmentation);
baAsn1.encode_application_unsigned(buffer, vendorId);
};
module.exports.decodeIamBroadcast = function(buffer, offset) {
var result;
var apduLen = 0;
var orgOffset = offset;
result = baAsn1.decode_tag_number_and_value(buffer, offset + apduLen);
apduLen += result.len;
if (result.tagNumber !== baEnum.BacnetApplicationTags.BACNET_APPLICATION_TAG_OBJECT_ID) return;
result = baAsn1.decode_object_id(buffer, offset + apduLen);
apduLen += result.len;
if (result.objectType !== baEnum.BacnetObjectTypes.OBJECT_DEVICE) return;
var deviceId = result.instance;
result = baAsn1.decode_tag_number_and_value(buffer, offset + apduLen);
apduLen += result.len;
if (result.tagNumber !== baEnum.BacnetApplicationTags.BACNET_APPLICATION_TAG_UNSIGNED_INT) return;
result = baAsn1.decode_unsigned(buffer, offset + apduLen, result.value);
apduLen += result.len;
var maxApdu = result.value;
result = baAsn1.decode_tag_number_and_value(buffer, offset + apduLen);
apduLen += result.len;
if (result.tagNumber !== baEnum.BacnetApplicationTags.BACNET_APPLICATION_TAG_ENUMERATED) return;
result = baAsn1.decode_enumerated(buffer, offset + apduLen, result.value);
apduLen += result.len;
if (result.value > baEnum.BacnetSegmentations.SEGMENTATION_NONE) return;
var segmentation = result.value;
result = baAsn1.decode_tag_number_and_value(buffer, offset + apduLen);
apduLen += result.len;
if (result.tagNumber !== baEnum.BacnetApplicationTags.BACNET_APPLICATION_TAG_UNSIGNED_INT) return;
result = baAsn1.decode_unsigned(buffer, offset + apduLen, result.value);
apduLen += result.len;
if (result.value > 0xFFFF) return;
var vendorId = result.value;
return {
len: offset - orgOffset,
deviceId: deviceId,
maxApdu: maxApdu,
segmentation: segmentation,
vendorId: vendorId
};
};
module.exports.EncodeWhoHasBroadcast = function(buffer, lowLimit, highLimit, objectId, objectName) {
if ((lowLimit >= 0) && (lowLimit <= baAsn1.BACNET_MAX_INSTANCE) && (highLimit >= 0) && (highLimit <= baAsn1.BACNET_MAX_INSTANCE)) {
baAsn1.encodeContextUnsigned(buffer, 0, lowLimit);
baAsn1.encodeContextUnsigned(buffer, 1, highLimit);
}
if (objectName && objectName !== '') {
baAsn1.encode_context_character_string(buffer, 3, objectName);
} else {
baAsn1.encode_context_object_id(buffer, 2, objectId.type, objectId.instance);
}
};
module.exports.DecodeWhoHasBroadcast = function(buffer, offset, apduLen) {
var len = 0;
var value = {};
var decodedValue;
var result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
if (result.tagNumber === 0) {
decodedValue = baAsn1.decode_unsigned(buffer, offset + len, result.value);
len += decodedValue.len;
if (decodedValue.value <= baAsn1.BACNET_MAX_INSTANCE) {
value.lowLimit = decodedValue.value;
}
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
}
if (result.tagNumber === 1) {
decodedValue = baAsn1.decode_unsigned(buffer, offset + len, result.value);
len += decodedValue.len;
if (decodedValue.value <= baAsn1.BACNET_MAX_INSTANCE) {
value.highLimit = decodedValue.value;
}
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
}
if (result.tagNumber === 2) {
decodedValue = baAsn1.decode_object_id(buffer, offset + len);
len += decodedValue.len;
value.objId = {type: decodedValue.objectType, instance: decodedValue.instance};
}
if (result.tagNumber === 3) {
decodedValue = baAsn1.decode_character_string(buffer, offset + len, apduLen - (offset + len), result.value);
len += decodedValue.len;
value.objName = decodedValue.value;
}
value.len = len;
return value;
};
module.exports.EncodeWhoIsBroadcast = function(buffer, lowLimit, highLimit) {
if ((lowLimit >= 0) && (lowLimit <= baAsn1.BACNET_MAX_INSTANCE) && (highLimit >= 0) && (highLimit <= baAsn1.BACNET_MAX_INSTANCE)) {
baAsn1.encodeContextUnsigned(buffer, 0, lowLimit);
baAsn1.encodeContextUnsigned(buffer, 1, highLimit);
}
};
module.exports.DecodeWhoIsBroadcast = function(buffer, offset, apduLen) {
var len = 0;
var value = {};
if (apduLen <= 0) return;
var result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
if (result.tagNumber !== 0) return;
if (apduLen <= len) return;
var decodedValue = baAsn1.decode_unsigned(buffer, offset + len, result.value);
len += decodedValue.len;
if (decodedValue.value <= baAsn1.BACNET_MAX_INSTANCE) {
value.lowLimit = decodedValue.value;
}
if (apduLen <= len) return;
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
if (result.tagNumber !== 1) return;
if (apduLen <= len) return;
decodedValue = baAsn1.decode_unsigned(buffer, offset + len, result.value);
len += decodedValue.len;
if (decodedValue.value <= baAsn1.BACNET_MAX_INSTANCE) {
value.highLimit = decodedValue.value;
}
value.len = len;
return value;
};
module.exports.EncodeIhaveBroadcast = function(buffer, deviceId, objectId, objectName) {
baAsn1.encode_application_object_id(buffer, deviceId.type, deviceId.instance);
baAsn1.encode_application_object_id(buffer, objectId.type, objectId.instance);
baAsn1.encode_application_character_string(buffer, objectName);
};
module.exports.EncodeAlarmAcknowledge = function(buffer, ackProcessIdentifier, eventObjectIdentifier, eventStateAcked, ackSource, eventTimeStamp, ackTimeStamp) {
baAsn1.encodeContextUnsigned(buffer, 0, ackProcessIdentifier);
baAsn1.encode_context_objectId(buffer, 1, eventObjectIdentifier.type, eventObjectIdentifier.instance);
baAsn1.encodeContextEnumerated(buffer, 2, eventStateAcked);
baAsn1.bacapp_encode_context_timestamp(buffer, 3, eventTimeStamp);
baAsn1.encode_context_character_string(buffer, 4, ackSource);
baAsn1.bacapp_encode_context_timestamp(buffer, 5, ackTimeStamp);
};
module.exports.EncodeAtomicReadFile = function(buffer, isStream, objectId, position, count) {
baAsn1.encode_application_object_id(buffer, objectId.type, objectId.instance);
if (isStream) {
baAsn1.encode_opening_tag(buffer, 0);
baAsn1.encode_application_signed(buffer, position);
baAsn1.encode_application_unsigned(buffer, count);
baAsn1.encode_closing_tag(buffer, 0);
} else {
baAsn1.encode_opening_tag(buffer, 1);
baAsn1.encode_application_signed(buffer, position);
baAsn1.encode_application_unsigned(buffer, count);
baAsn1.encode_closing_tag(buffer, 1);
}
};
module.exports.EncodeAtomicReadFileAcknowledge = function(buffer, isStream, endOfFile, position, blockCount, blocks, counts) {
baAsn1.encode_application_boolean(buffer, endOfFile);
if (isStream) {
baAsn1.encode_opening_tag(buffer, 0);
baAsn1.encode_application_signed(buffer, position);
baAsn1.encode_application_octet_string(buffer, blocks[0], 0, counts[0]);
baAsn1.encode_closing_tag(buffer, 0);
} else {
baAsn1.encode_opening_tag(buffer, 1);
baAsn1.encode_application_signed(buffer, position);
baAsn1.encode_application_unsigned(buffer, blockCount);
for (var i = 0; i < blockCount; i++) {
baAsn1.encode_application_octet_string(buffer, blocks[i], 0, counts[i]);
}
baAsn1.encode_closing_tag(buffer, 1);
}
};
module.exports.EncodeAtomicWriteFile = function(buffer, isStream, objectId, position, blockCount, blocks, counts) {
baAsn1.encode_application_object_id(buffer, objectId.type, objectId.instance);
if (isStream) {
baAsn1.encode_opening_tag(buffer, 0);
baAsn1.encode_application_signed(buffer, position);
baAsn1.encode_application_octet_string(buffer, blocks[0], 0, counts[0]);
baAsn1.encode_closing_tag(buffer, 0);
} else {
baAsn1.encode_opening_tag(buffer, 1);
baAsn1.encode_application_signed(buffer, position);
baAsn1.encode_application_unsigned(buffer, blockCount);
for (var i = 0; i < blockCount; i++) {
baAsn1.encode_application_octet_string(buffer, blocks[i], 0, counts[i]);
}
baAsn1.encode_closing_tag(buffer, 1);
}
};
module.exports.EncodeCreateProperty = function(buffer, objectId, valueList) {
baAsn1.encode_opening_tag(buffer, 0);
baAsn1.encode_context_object_id(buffer, 1, objectId.type, objectId.instance);
baAsn1.encode_closing_tag(buffer, 0);
baAsn1.encode_opening_tag(buffer, 1);
valueList.forEach(function(propertyValue) {
baAsn1.encode_context_enumerated(buffer, 0, propertyValue.property.propertyIdentifier);
if (propertyValue.property.propertyArrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
baAsn1.encode_context_unsigned(buffer, 1, propertyValue.property.propertyArrayIndex);
}
baAsn1.encode_opening_tag(buffer, 2);
propertyValue.value.forEach(function(value) {
baAsn1.bacapp_encode_application_data(buffer, value);
});
baAsn1.encode_closing_tag(buffer, 2);
if (propertyValue.priority !== baAsn1.BACNET_NO_PRIORITY) {
baAsn1.encode_context_unsigned(buffer, 3, propertyValue.priority);
}
});
baAsn1.encode_closing_tag(buffer, 1);
};
module.exports.EncodeAddListElement = function(buffer, objectId, propertyId, arrayIndex, valueList) {
baAsn1.encode_context_object_id(buffer, 0, objectId.type, objectId.instance);
baAsn1.encode_context_enumerated(buffer, 1, propertyId);
if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
baAsn1.encode_context_unsigned(buffer, 2, arrayIndex);
}
baAsn1.encode_opening_tag(buffer, 3);
valueList.forEach(function(value) {
baAsn1.bacapp_encode_application_data(buffer, value);
});
baAsn1.encode_closing_tag(buffer, 3);
};
module.exports.EncodeAtomicWriteFileAcknowledge = function(buffer, isStream, position) {
if (isStream) {
baAsn1.encode_context_signed(buffer, 0, position);
} else {
baAsn1.encode_context_signed(buffer, 1, position);
}
};
module.exports.EncodeSubscribeProperty = function(buffer, subscriberProcessIdentifier, monitoredObjectIdentifier, cancellationRequest, issueConfirmedNotifications, lifetime, monitoredProperty, covIncrementPresent, covIncrement) {
baAsn1.encode_context_unsigned(buffer, 0, subscriberProcessIdentifier);
baAsn1.encode_context_object_id(buffer, 1, monitoredObjectIdentifier.type, monitoredObjectIdentifier.instance);
if (!cancellationRequest) {
baAsn1.encode_context_boolean(buffer, 2, issueConfirmedNotifications);
baAsn1.encode_context_unsigned(buffer, 3, lifetime);
}
baAsn1.encode_opening_tag(buffer, 4);
baAsn1.encode_context_enumerated(buffer, 0, monitoredProperty.propertyIdentifier);
if (monitoredProperty.propertyArrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
baAsn1.encode_context_unsigned(buffer, 1, monitoredProperty.propertyArrayIndex);
}
baAsn1.encode_closing_tag(buffer, 4);
if (covIncrementPresent) {
baAsn1.encode_context_real(buffer, 5, covIncrement);
}
};
module.exports.EncodeAlarmSummary = function(buffer, objectIdentifier, alarmState, acknowledgedTransitions) {
baAsn1.encode_application_object_id(buffer, objectIdentifier.type, objectIdentifier.instance);
baAsn1.encode_application_enumerated(buffer, alarmState);
baAsn1.encode_application_bitstring(buffer, acknowledgedTransitions);
};
module.exports.EncodeGetEventInformation = function(buffer, sendLast, lastReceivedObjectIdentifier) {
if (sendLast) {
baAsn1.encode_context_objectId(buffer, 0, lastReceivedObjectIdentifier.type, lastReceivedObjectIdentifier.instance);
}
};
module.exports.EncodeGetEventInformationAcknowledge = function(buffer, events, moreEvents) {
var i;
baAsn1.encode_opening_tag(buffer, 0);
events.forEach(function(eventData) {
baAsn1.encode_context_object_id(buffer, 0, eventData.objectIdentifier.type, eventData.objectIdentifier.instance);
baAsn1.encode_context_enumerated(buffer, 1, eventData.eventState);
baAsn1.encode_context_bitstring(buffer, 2, eventData.acknowledgedTransitions);
baAsn1.encode_opening_tag(buffer, 3);
for (i = 0; i < 3; i++) {
baAsn1.bacapp_encode_timestamp(buffer, eventData.eventTimeStamps[i]);
}
baAsn1.encode_closing_tag(buffer, 3);
baAsn1.encode_context_enumerated(buffer, 4, eventData.notifyType);
baAsn1.encode_context_bitstring(buffer, 5, eventData.eventEnable);
baAsn1.encode_opening_tag(buffer, 6);
for (i = 0; i < 3; i++) {
baAsn1.encode_application_unsigned(buffer, eventData.eventPriorities[i]);
}
baAsn1.encode_closing_tag(buffer, 6);
});
baAsn1.encode_closing_tag(buffer, 0);
baAsn1.encode_context_boolean(buffer, 1, moreEvents);
};
module.exports.EncodeLifeSafetyOperation = function(buffer, processId, requestingSrc, operation, targetObject) {
baAsn1.encodeContextUnsigned(buffer, 0, processId);
baAsn1.encode_context_character_string(buffer, 1, requestingSrc);
baAsn1.encodeContextEnumerated(buffer, 2, operation);
baAsn1.encode_context_objectId(buffer, 3, targetObject.type, targetObject.instance);
};
module.exports.EncodePrivateTransferConfirmed = function(buffer, vendorID, serviceNumber, data) {
baAsn1.encodeContextUnsigned(buffer, 0, vendorID);
baAsn1.encodeContextUnsigned(buffer, 1, serviceNumber);
baAsn1.encode_opening_tag(buffer, 2);
buffer.Add(data, data.Length);
baAsn1.encode_closing_tag(buffer, 2);
};
module.exports.EncodePrivateTransferUnconfirmed = function(buffer, vendorID, serviceNumber, data) {
baAsn1.encodeContextUnsigned(buffer, 0, vendorID);
baAsn1.encodeContextUnsigned(buffer, 1, serviceNumber);
baAsn1.encode_opening_tag(buffer, 2);
buffer.Add(data, data.Length);
baAsn1.encode_closing_tag(buffer, 2);
};
module.exports.EncodePrivateTransferAcknowledge = function(buffer, vendorID, serviceNumber, data) {
baAsn1.encodeContextUnsigned(buffer, 0, vendorID);
baAsn1.encodeContextUnsigned(buffer, 1, serviceNumber);
baAsn1.encode_opening_tag(buffer, 2);
buffer.Add(data, data.Length);
baAsn1.encode_closing_tag(buffer, 2);
};
module.exports.EncodeDeviceCommunicationControl = function(buffer, timeDuration, enableDisable, password) {
if (timeDuration > 0) {
baAsn1.encodeContextUnsigned(buffer, 0, timeDuration);
}
baAsn1.encodeContextEnumerated(buffer, 1, enableDisable);
if (password && password !== '') {
baAsn1.encode_context_character_string(buffer, 2, password);
}
};
module.exports.DecodeDeviceCommunicationControl = function(buffer, offset, apduLen) {
var len = 0;
var value = {};
var decodedValue;
var result;
if (baAsn1.decode_is_context_tag(buffer, offset + len, 0)) {
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
decodedValue = baAsn1.decode_unsigned(buffer, offset + len, result.value);
value.timeDuration = decodedValue.value;
len += decodedValue.len;
}
if (!baAsn1.decode_is_context_tag(buffer, offset + len, 1)) return;
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
decodedValue = baAsn1.decode_enumerated(buffer, offset + len, result.value);
value.enableDisable = decodedValue.value;
len += decodedValue.len;
if (len < apduLen) {
if (!baAsn1.decode_is_context_tag(buffer, offset + len, 2)) return;
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
decodedValue = baAsn1.decode_character_string(buffer, offset + len, apduLen - (offset + len), result.value);
value.password = decodedValue.value;
len += decodedValue.len;
}
value.len = len;
return value;
};
module.exports.EncodeReinitializeDevice = function(buffer, state, password) {
baAsn1.encodeContextEnumerated(buffer, 0, state);
if (password && password !== '') {
baAsn1.encode_context_character_string(buffer, 1, password);
}
};
module.exports.DecodeReinitializeDevice = function(buffer, offset, apduLen) {
var len = 0;
var value = {};
var result;
if (!baAsn1.decode_is_context_tag(buffer, offset + len, 0)) return;
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
var decodedValue = baAsn1.decode_enumerated(buffer, offset + len, result.value);
value.state = decodedValue.value;
len += decodedValue.len;
if (len < apduLen) {
if (!baAsn1.decode_is_context_tag(buffer, offset + len, 1)) return;
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
decodedValue = baAsn1.decode_character_string(buffer, offset + len, apduLen - (offset + len), result.value);
value.password = decodedValue.value;
len += decodedValue.len;
}
value.len = len;
return value;
};
module.exports.EncodeReadRange = function(buffer, objectId, propertyId, arrayIndex, requestType, position, time, count) {
baAsn1.encode_context_objectId(buffer, 0, objectId.type, objectId.instance);
baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex);
}
switch (requestType) {
case baEnum.BacnetReadRangeRequestTypes.RR_BY_POSITION:
baAsn1.encode_opening_tag(buffer, 3);
baAsn1.encode_application_unsigned(buffer, position);
baAsn1.encode_application_signed(buffer, count);
baAsn1.encode_closing_tag(buffer, 3);
break;
case baEnum.BacnetReadRangeRequestTypes.RR_BY_SEQUENCE:
baAsn1.encode_opening_tag(buffer, 6);
baAsn1.encode_application_unsigned(buffer, position);
baAsn1.encode_application_signed(buffer, count);
baAsn1.encode_closing_tag(buffer, 6);
break;
case baEnum.BacnetReadRangeRequestTypes.RR_BY_TIME:
baAsn1.encode_opening_tag(buffer, 7);
baAsn1.encode_application_date(buffer, time);
baAsn1.encode_application_time(buffer, time);
baAsn1.encode_application_signed(buffer, count);
baAsn1.encode_closing_tag(buffer, 7);
break;
case baEnum.BacnetReadRangeRequestTypes.RR_READ_ALL:
break;
default:
break;
}
};
module.exports.EncodeReadProperty = function(buffer, objectType, objectInstance, propertyId, arrayIndex) {
if (objectType <= baAsn1.BACNET_MAX_OBJECT) {
baAsn1.encode_context_object_id(buffer, 0, objectType, objectInstance);
}
if (propertyId <= baEnum.BacnetPropertyIds.MAX_BACNET_PROPERTY_ID) {
baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
}
if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex || baAsn1.BACNET_ARRAY_ALL);
}
};
module.exports.EncodeReadPropertyAcknowledge = function(buffer, objectId, propertyId, arrayIndex, valueList) {
baAsn1.encode_context_object_id(buffer, 0, objectId.type, objectId.instance);
baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
baAsn1.encode_context_unsigned(buffer, 2, arrayIndex);
}
baAsn1.encode_opening_tag(buffer, 3);
valueList.forEach(function(value) {
baAsn1.bacapp_encode_application_data(buffer, value);
});
baAsn1.encode_closing_tag(buffer, 3);
};
module.exports.DecodeReadPropertyAcknowledge = function(buffer, offset, apduLen) {
var objectId = {};
var property = {};
if (!baAsn1.decode_is_context_tag(buffer, offset, 0)) return;
var len = 1;
var result = baAsn1.decode_object_id(buffer, offset + len);
len += result.len;
objectId.type = result.objectType;
objectId.instance = result.instance;
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
if (result.tagNumber !== 1) return;
result = baAsn1.decode_enumerated(buffer, offset + len, result.value);
len += result.len;
property.propertyIdentifier = result.value;
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
if (result.tagNumber === 2) {
len += result.len;
len += baAsn1.decode_unsigned(buffer, offset + len, result.value);
property.propertyArrayIndex = result.propertyArrayIndex;
} else {
property.propertyArrayIndex = baAsn1.BACNET_ARRAY_ALL;
}
var valueList = [];
if (!baAsn1.decode_is_opening_tag_number(buffer, offset + len, 3)) return;
len++;
while ((apduLen - len) > 1) {
result = baAsn1.bacapp_decode_application_data(buffer, offset + len, apduLen + offset, objectId.type, property.propertyIdentifier);
if (!result) return;
len += result.len;
valueList.push(result);
}
if (!baAsn1.decode_is_closing_tag_number(buffer, offset + len, 3)) return;
len++;
return {
len: len,
objectId: objectId,
property: property,
valueList: valueList
};
};
module.exports.EncodeReadPropertyMultiple = function(buffer, properties) {
properties.forEach(function(value) {
baAsn1.encode_read_access_specification(buffer, value);
});
};
module.exports.EncodeReadPropertyMultipleAcknowledge = function(buffer, values) {
values.forEach(function(value) {
baAsn1.encode_read_access_result(buffer, value);
});
};
module.exports.DecodeReadPropertyMultipleAcknowledge = function(buffer, offset, apduLen) {
var len = 0;
var values = [];
while ((apduLen - len) > 0) {
var result = baAsn1.decode_read_access_result(buffer, offset + len, apduLen - len);
if (!result) return;
len += result.len;
values.push(result.value);
}
return {
len: len,
values: values
};
};
module.exports.EncodeWriteProperty = function(buffer, objectType, objectInstance, propertyId, arrayIndex, priority, valueList) {
baAsn1.encode_context_object_id(buffer, 0, objectType, objectInstance);
baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex);
}
baAsn1.encode_opening_tag(buffer, 3);
valueList.forEach(function(value) {
baAsn1.bacapp_encode_application_data(buffer, value);
});
baAsn1.encode_closing_tag(buffer, 3);
if (priority !== baAsn1.BACNET_NO_PRIORITY) {
baAsn1.encodeContextUnsigned(buffer, 4, priority);
}
};
var EncodeWritePropertyMultiple = module.exports.EncodeWritePropertyMultiple = function(buffer, objectId, valueList) {
baAsn1.encode_context_objectId(buffer, 0, objectId.type, objectId.instance);
baAsn1.encode_opening_tag(buffer, 1);
valueList.forEach(function(pValue) {
baAsn1.encodeContextEnumerated(buffer, 0, pValue.property.propertyIdentifier);
if (pValue.property.propertyArrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
baAsn1.encodeContextUnsigned(buffer, 1, pValue.property.propertyArrayIndex);
}
baAsn1.encode_opening_tag(buffer, 2);
pValue.value.forEach(function(value) {
baAsn1.bacapp_encode_application_data(buffer, value);
});
baAsn1.encode_closing_tag(buffer, 2);
if (pValue.priority !== baAsn1.BACNET_NO_PRIORITY) {
baAsn1.encodeContextUnsigned(buffer, 3, pValue.priority);
}
});
baAsn1.encode_closing_tag(buffer, 1);
};
module.exports.EncodeWriteObjectMultiple = function(buffer, valueList) {
valueList.forEach(function(rValue) {
EncodeWritePropertyMultiple(buffer, rValue.objectIdentifier, rValue.values);
});
};
module.exports.DecodeDeleteObject = function(buffer, offset, apduLen) {
var result = baAsn1.decode_tag_number_and_value(buffer, offset);
if (result.tagNumber === 12) return;
var len = 1;
var value = baAsn1.decode_object_id(buffer, offset + len);
len += value.len;
if (len !== apduLen) return;
value.len = len;
return value;
};
module.exports.EncodeCreateObjectAcknowledge = function(buffer, objectId) {
baAsn1.encode_application_object_id(buffer, objectId.type, objectId.instance);
};
module.exports.EncodeTimeSync = function(buffer, time) {
baAsn1.encode_application_date(buffer, time);
baAsn1.encode_application_time(buffer, time);
};
module.exports.DecodeTimeSync = function(buffer, offset, length) {
var len = 0;
var result;
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
if (result.tagNumber !== baEnum.BacnetApplicationTags.BACNET_APPLICATION_TAG_DATE) return;
var date = baAsn1.decode_date(buffer, offset + len);
len += date.len;
result = baAsn1.decode_tag_number_and_value(buffer, offset + len);
len += result.len;
if (result.tagNumber !== baEnum.BacnetApplicationTags.BACNET_APPLICATION_TAG_TIME) return;
var time = baAsn1.decode_bacnet_time(buffer, offset + len);
len += time.len;
return {
len: len,
value: new Date(date.value.getFullYear(), date.value.getMonth(), date.value.getDate(), time.value.getHours(), time.value.getMinutes(), time.value.getSeconds(), time.value.getMilliseconds())
};
};
module.exports.EncodeError = function(buffer, errorClass, errorCode) {
baAsn1.encode_application_enumerated(buffer, errorClass);
baAsn1.encode_application_enumerated(buffer, errorCode);
};
module.exports.DecodeError = function(buffer, offset) {
var orgOffset = offset;
var result;
result = baAsn1.decode_tag_number_and_value(buffer, offset);
offset += result.len;
var errorClass = baAsn1.decode_enumerated(buffer, offset, result.value);
offset += errorClass.len;
result = baAsn1.decode_tag_number_and_value(buffer, offset);
offset += result.len;
var errorCode = baAsn1.decode_enumerated(buffer, offset, result.value);
offset += errorClass.len;
return {
len: offset - orgOffset,
class: errorClass.value,
code: errorCode.value
};
};