Skip to content

Commit

Permalink
refactor(bacnet-client): add options parameter to all client functions
Browse files Browse the repository at this point in the history
BRAKING CHANGE: various function parameters have changed. Adapt according to the documentation.
  • Loading branch information
fh1ch committed Dec 11, 2017
1 parent 1280270 commit 5366ec5
Showing 1 changed file with 86 additions and 39 deletions.
125 changes: 86 additions & 39 deletions lib/bacnet-client.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ var baEnum = require('./bacnet-enum');
* @param {string=} settings.interface - Specific BACNET communication interface if different from primary one.
* @param {string=} [settings.broadcastAddress=255.255.255.255] - The address used for broadcast messages.
* @param {number=} [settings.adpuTimeout=3000] - The timeout in milliseconds until a transaction should be interpreted as error.
// Vendor ID
* @example
* var bacnet = require('bacstack');
*
Expand Down Expand Up @@ -377,25 +378,31 @@ module.exports = function(options) {
/**
* The whoIs command discovers all BACNET devices in a network.
* @function bacstack.whoIs
* @param {number=} lowLimit - Minimal device instance number to search for.
* @param {number=} highLimit - Maximal device instance number to search for.
* @param {string=} address - Unicast address if command should device directly.
* @param {object=} options - Stuff
* @param {number=} options.lowLimit - Minimal device instance number to search for.
* @param {number=} options.highLimit - Maximal device instance number to search for.
* @param {string=} options.address - Unicast address if command should address a device directly.
* @fires bacstack.iAm
* @example
* var bacnet = require('bacstack');
* var client = new bacnet();
*
* client.whoIs();
*/
self.whoIs = function(lowLimit, highLimit, address) {
self.whoIs = function(options) {
var setting = {
lowLimit: options.lowLimit,
highLimit: options.highLimit,
address: options.address || transport.getBroadcastAddress(),
remoteDevice: options.remoteDevice || {}
};
var buffer = getBuffer();
address = address || transport.getBroadcastAddress();
baNpdu.encode(buffer, baEnum.BacnetNpduControls.PRIORITY_NORMAL_MESSAGE, address, null, DEFAULT_HOP_COUNT, baEnum.BacnetNetworkMessageTypes.NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, 0);
baAdpu.encodeUnconfirmedServiceRequest(buffer, baEnum.BacnetPduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST, baEnum.BacnetUnconfirmedServices.SERVICE_UNCONFIRMED_WHO_IS);
baServices.encodeWhoIsBroadcast(buffer, lowLimit, highLimit);
baServices.encodeWhoIsBroadcast(buffer, settings.lowLimit, settings.highLimit);
var npduType = (address !== transport.getBroadcastAddress()) ? baEnum.BacnetBvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU : baEnum.BacnetBvlcFunctions.BVLC_ORIGINAL_BROADCAST_NPDU;
baBvlc.encode(buffer.buffer, npduType, buffer.offset);
transport.send(buffer.buffer, buffer.offset, address);
transport.send(buffer.buffer, buffer.offset, settings.address);
};

/**
Expand All @@ -411,6 +418,12 @@ module.exports = function(options) {
* client.timeSync('192.168.1.43', new Date(), true);
*/
self.timeSync = function(address, dateTime, isUtc) {
var setting = {
maxSegments: options.maxSegments || baEnum.BacnetMaxSegments.MAX_SEG65,
maxAdpu: options.maxAdpu || baEnum.BacnetMaxAdpu.MAX_APDU1476,
invokeId: options.invokeId || getInvokeId(),
remoteDevice: options.remoteDevice || {}
};
var buffer = getBuffer();
baNpdu.encode(buffer, baEnum.BacnetNpduControls.PRIORITY_NORMAL_MESSAGE, address);
if (!isUtc) {
Expand All @@ -432,6 +445,14 @@ module.exports = function(options) {
* @param {number} objectInstance - The BACNET object instance to read.
* @param {number} propertyId - The BACNET property id in the specified object to read.
* @param {number=} arrayIndex - The array index of the property to be read.
// Max Segments
// Max ADPU
// Array Index
// Invoke ID
// Remote Device
// - Address
// - Network
// - Hop Count
* @param {function} next - The callback containing an error, in case of a failure and value object in case of success.
* @example
* var bacnet = require('bacstack');
Expand All @@ -441,18 +462,22 @@ module.exports = function(options) {
* console.log('value: ', value);
* });
*/
self.readProperty = function(address, objectType, objectInstance, propertyId, arrayIndex, next) {
arrayIndex = arrayIndex || baAsn1.BACNET_ARRAY_ALL;
var maxSegments = baEnum.BacnetMaxSegments.MAX_SEG65;
self.readProperty = function(address, objectType, objectInstance, propertyId, options, next) {
var setting = {
maxSegments: options.maxSegments || baEnum.BacnetMaxSegments.MAX_SEG65,
maxAdpu: options.maxAdpu || baEnum.BacnetMaxAdpu.MAX_APDU1476,
invokeId: options.invokeId || getInvokeId(),
remoteDevice: options.remoteDevice || {},
arrayIndex: options.arrayIndex || baAsn1.BACNET_ARRAY_ALL
};
var buffer = getBuffer();
var invokeId = getInvokeId();
baNpdu.encode(buffer, baEnum.BacnetNpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.BacnetNpduControls.EXPECTING_REPLY, address, null, DEFAULT_HOP_COUNT, baEnum.BacnetNetworkMessageTypes.NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, 0);
var type = baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST | (maxSegments !== baEnum.BacnetMaxSegments.MAX_SEG0 ? baEnum.BacnetPduTypes.SEGMENTED_RESPONSE_ACCEPTED : 0);
baAdpu.encodeConfirmedServiceRequest(buffer, type, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_READ_PROPERTY, maxSegments, baEnum.BacnetMaxAdpu.MAX_APDU1476, invokeId, 0, 0);
baServices.encodeReadProperty(buffer, objectType, objectInstance, propertyId, arrayIndex);
baAdpu.encodeConfirmedServiceRequest(buffer, type, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_READ_PROPERTY, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
baServices.encodeReadProperty(buffer, objectType, objectInstance, propertyId, settings.arrayIndex);
baBvlc.encode(buffer.buffer, baEnum.BacnetBvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
transport.send(buffer.buffer, buffer.offset, address);
addCallback(invokeId, function(err, data) {
addCallback(setting.invokeId, function(err, data) {
if (err) return next(err);
var result = baServices.decodeReadPropertyAcknowledge(data.buffer, data.offset, data.length);
if (!result) return next(new Error('INVALID_DECODING'));
Expand All @@ -469,7 +494,7 @@ module.exports = function(options) {
* @param {number} propertyId - The BACNET property id in the specified object to write.
* @param {number} priority - The priority to be used for writing to the property.
* @param {object[]} valueList - A list of values to be written to the specified property.
* @param {BacnetApplicationTags} valueList.tag - The data-type of the value to be written.
* @param {BacnetApplicationTags} valueList.type - The data-type of the value to be written.
* @param {number} valueList.value - The actual value to be written.
* @param {function} next - The callback containing an error, in case of a failure and value object in case of success.
* @example
Expand All @@ -483,15 +508,19 @@ module.exports = function(options) {
* });
*/
self.writeProperty = function(address, objectType, objectInstance, propertyId, priority, valueList, next) {
var maxSegments = baEnum.BacnetMaxSegments.MAX_SEG65;
var setting = {
maxSegments: options.maxSegments || baEnum.BacnetMaxSegments.MAX_SEG65,
maxAdpu: options.maxAdpu || baEnum.BacnetMaxAdpu.MAX_APDU1476,
invokeId: options.invokeId || getInvokeId(),
remoteDevice: options.remoteDevice || {}
};
var buffer = getBuffer();
var invokeId = getInvokeId();
baNpdu.encode(buffer, baEnum.BacnetNpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.BacnetNpduControls.EXPECTING_REPLY, address, null, DEFAULT_HOP_COUNT, baEnum.BacnetNetworkMessageTypes.NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, 0);
baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_WRITE_PROPERTY, maxSegments, baEnum.BacnetMaxAdpu.MAX_APDU1476, invokeId, 0, 0);
baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_WRITE_PROPERTY, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
baServices.encodeWriteProperty(buffer, objectType, objectInstance, propertyId, baAsn1.BACNET_ARRAY_ALL, priority, valueList);
baBvlc.encode(buffer.buffer, baEnum.BacnetBvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
transport.send(buffer.buffer, buffer.offset, address);
addCallback(invokeId, function(err, data) {
addCallback(setting.invokeId, function(err, data) {
next(err);
});
};
Expand Down Expand Up @@ -519,16 +548,20 @@ module.exports = function(options) {
* });
*/
self.readPropertyMultiple = function(address, propertiesArray, next) {
var maxSegments = baEnum.BacnetMaxSegments.MAX_SEG65;
var setting = {
maxSegments: options.maxSegments || baEnum.BacnetMaxSegments.MAX_SEG65,
maxAdpu: options.maxAdpu || baEnum.BacnetMaxAdpu.MAX_APDU1476,
invokeId: options.invokeId | getInvokeId(),
remoteDevice: options.remoteDevice | {}
};
var buffer = getBuffer();
var invokeId = getInvokeId();
baNpdu.encode(buffer, baEnum.BacnetNpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.BacnetNpduControls.EXPECTING_REPLY, address, null, DEFAULT_HOP_COUNT, baEnum.BacnetNetworkMessageTypes.NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, 0);
var type = baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST | (baEnum.maxSegments !== baEnum.BacnetMaxSegments.MAX_SEG0 ? baEnum.BacnetPduTypes.SEGMENTED_RESPONSE_ACCEPTED : 0);
baAdpu.encodeConfirmedServiceRequest(buffer, type, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_READ_PROP_MULTIPLE, maxSegments, baEnum.BacnetMaxAdpu.MAX_APDU1476, invokeId, 0, 0);
baAdpu.encodeConfirmedServiceRequest(buffer, type, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_READ_PROP_MULTIPLE, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
baServices.encodeReadPropertyMultiple(buffer, propertiesArray);
baBvlc.encode(buffer.buffer, baEnum.BacnetBvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
transport.send(buffer.buffer, buffer.offset, address);
addCallback(invokeId, function(err, data) {
addCallback(setting.invokeId, function(err, data) {
if (err) return next(err);
var result = baServices.decodeReadPropertyMultipleAcknowledge(data.buffer, data.offset, data.length);
if (!result) return next(new Error('INVALID_DECODING'));
Expand Down Expand Up @@ -567,15 +600,19 @@ module.exports = function(options) {
* });
*/
self.writePropertyMultiple = function(address, valueList, next) {
var maxSegments = baEnum.BacnetMaxSegments.MAX_SEG65;
var setting = {
maxSegments: options.maxSegments || baEnum.BacnetMaxSegments.MAX_SEG65,
maxAdpu: options.maxAdpu || baEnum.BacnetMaxAdpu.MAX_APDU1476,
invokeId: options.invokeId || getInvokeId(),
remoteDevice: options.remoteDevice || {}
};
var buffer = getBuffer();
var invokeId = getInvokeId();
baNpdu.encode(buffer, baEnum.BacnetNpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.BacnetNpduControls.EXPECTING_REPLY, address);
baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_WRITE_PROP_MULTIPLE, maxSegments, baEnum.BacnetMaxAdpu.MAX_APDU1476, invokeId);
baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_WRITE_PROP_MULTIPLE, settings.maxSegments, settings.maxAdpu, settings.invokeId);
baServices.encodeWriteObjectMultiple(buffer, valueList);
baBvlc.encode(buffer.buffer, baEnum.BacnetBvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
transport.send(buffer.buffer, buffer.offset, address);
addCallback(invokeId, function(err, data) {
addCallback(setting.invokeId, function(err, data) {
next(err);
});
};
Expand All @@ -596,16 +633,21 @@ module.exports = function(options) {
* console.log('value: ', value);
* });
*/
self.deviceCommunicationControl = function(address, timeDuration, enableDisable, password, next) {
var maxSegments = baEnum.BacnetMaxSegments.MAX_SEG65;
self.deviceCommunicationControl = function(address, timeDuration, enableDisable, options, next) {
var setting = {
maxSegments: options.maxSegments || baEnum.BacnetMaxSegments.MAX_SEG65,
maxAdpu: options.maxAdpu || baEnum.BacnetMaxAdpu.MAX_APDU1476,
invokeId: options.invokeId || getInvokeId(),
remoteDevice: options.remoteDevice || {},
password: options.password
};
var buffer = getBuffer();
var invokeId = getInvokeId();
baNpdu.encode(buffer, baEnum.BacnetNpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.BacnetNpduControls.EXPECTING_REPLY, address);
baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL, maxSegments, baEnum.BacnetMaxAdpu.MAX_APDU1476, invokeId, 0, 0);
baServices.encodeDeviceCommunicationControl(buffer, timeDuration, enableDisable, password);
baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
baServices.encodeDeviceCommunicationControl(buffer, timeDuration, enableDisable, settings.password);
baBvlc.encode(buffer.buffer, baEnum.BacnetBvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
transport.send(buffer.buffer, buffer.offset, address);
addCallback(invokeId, function(err, data) {
addCallback(setting.invokeId, function(err, data) {
next(err);
});
};
Expand All @@ -625,16 +667,21 @@ module.exports = function(options) {
* console.log('value: ', value);
* });
*/
self.reinitializeDevice = function(address, state, password, next) {
var maxSegments = baEnum.BacnetMaxSegments.MAX_SEG65;
self.reinitializeDevice = function(address, state, options, next) {
var setting = {
maxSegments: options.maxSegments || baEnum.BacnetMaxSegments.MAX_SEG65,
maxAdpu: options.maxAdpu || baEnum.BacnetMaxAdpu.MAX_APDU1476,
invokeId: options.invokeId || getInvokeId(),
remoteDevice: options.remoteDevice || {},
password: options.password
};
var buffer = getBuffer();
var invokeId = getInvokeId();
baNpdu.encode(buffer, baEnum.BacnetNpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.BacnetNpduControls.EXPECTING_REPLY, address);
baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_REINITIALIZE_DEVICE, maxSegments, baEnum.BacnetMaxAdpu.MAX_APDU1476, invokeId, 0, 0);
baServices.encodeReinitializeDevice(buffer, state, password);
baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.BacnetPduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.BacnetConfirmedServices.SERVICE_CONFIRMED_REINITIALIZE_DEVICE, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
baServices.encodeReinitializeDevice(buffer, state, setting.password);
baBvlc.encode(buffer.buffer, baEnum.BacnetBvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
transport.send(buffer.buffer, buffer.offset, address);
addCallback(invokeId, function(err, data) {
addCallback(setting.invokeId, function(err, data) {
next(err);
});
};
Expand Down

0 comments on commit 5366ec5

Please sign in to comment.