Skip to content

Commit 52c6d02

Browse files
committed
fix(services): correct readRangeAcknowledge implementation
1 parent 3cbf43f commit 52c6d02

2 files changed

Lines changed: 22 additions & 24 deletions

File tree

lib/services.js

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,7 +1297,7 @@ module.exports.decodeEventNotifyData = (buffer, offset) => {
12971297
module.exports.encodeReadRangeAcknowledge = (buffer, objectId, propertyId, arrayIndex, resultFlags, itemCount, applicationData, requestType, firstSequence) => {
12981298
baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance);
12991299
baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
1300-
if (arrayIndex === baAsn1.BACNET_ARRAY_ALL) {
1300+
if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
13011301
baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex);
13021302
}
13031303
baAsn1.encodeContextBitstring(buffer, 3, resultFlags);
@@ -1317,42 +1317,45 @@ module.exports.decodeReadRangeAcknowledge = (buffer, offset, apduLen) => {
13171317
let len = 0;
13181318
let result;
13191319
let decodedValue;
1320-
let resultFlag;
13211320
if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
13221321
len++;
13231322
decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
13241323
len += decodedValue.len;
1325-
let objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1326-
let property = {};
1324+
const objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1325+
const property = {index: baAsn1.BACNET_ARRAY_ALL};
13271326
result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
13281327
len += result.len;
13291328
if (result.tagNumber !== 1) return;
13301329
decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
13311330
len += decodedValue.len;
13321331
property.id = decodedValue.value;
13331332
result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1334-
len += result.len;
13351333
if ((result.tagNumber === 2) && (len < apduLen)) {
1334+
len += result.len;
13361335
decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
13371336
len += decodedValue.len;
13381337
property.index = decodedValue.value;
1339-
} else {
1340-
decodedValue = baAsn1.decodeBitstring(buffer, offset + len, 2);
1341-
len += decodedValue.len;
1342-
resultFlag = decodedValue.value;
13431338
}
13441339
result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
13451340
len += result.len;
1341+
decodedValue = baAsn1.decodeBitstring(buffer, offset + len, result.value);
1342+
len += decodedValue.len;
1343+
const resultFlag = decodedValue.value;
1344+
result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1345+
len += result.len;
13461346
decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
13471347
len += decodedValue.len;
13481348
const itemCount = decodedValue.value;
13491349
if (!(baAsn1.decodeIsOpeningTag(buffer, offset + len))) return;
1350-
len += 1;
1351-
const rangeBuffer = buffer.slice(offset + len, buffer.length - offset - len - 1);
1350+
len++;
1351+
const rangeBuffer = buffer.slice(offset + len, apduLen - 3);
13521352
return {
1353-
len: len,
1353+
objectId: objectId,
1354+
property: property,
1355+
resultFlag: resultFlag,
13541356
itemCount: itemCount,
1355-
rangeBuffer: rangeBuffer
1357+
rangeBuffer: rangeBuffer,
1358+
len: len,
13561359
};
13571360
};
13581361

test/unit/bacnet-services.spec.js

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,23 +1652,18 @@ describe('bacstack - Services layer', () => {
16521652
});
16531653
});
16541654

1655-
// TODO: Correct test behaviour
1656-
describe.skip('ReadRangeAcknowledge', () => {
1655+
describe('ReadRangeAcknowledge', () => {
16571656
it('should successfully encode and decode', () => {
16581657
const buffer = utils.getBuffer();
16591658
baServices.encodeReadRangeAcknowledge(buffer, {type: 12, instance: 500}, 5048, 0xFFFFFFFF, {bitsUsed: 24, value: [1, 2, 3]}, 12, Buffer.from([1, 2, 3]), 2, 2);
16601659
const result = baServices.decodeReadRangeAcknowledge(buffer.buffer, 0, buffer.offset);
16611660
delete result.len;
16621661
expect(result).to.deep.equal({
1663-
count: 0,
1664-
objectId: {type: 61, instance: 35},
1665-
position: 10,
1666-
property: {
1667-
index: 0xFFFFFFFF,
1668-
id: 85
1669-
},
1670-
requestType: 1,
1671-
time: undefined
1662+
objectId: {type: 12, instance: 500},
1663+
itemCount: 12,
1664+
property: {id: 5048, index: 0xFFFFFFFF},
1665+
resultFlag: {bitsUsed: 24, value: [1, 2, 3]},
1666+
rangeBuffer: Buffer.from([1, 2, 3])
16721667
});
16731668
});
16741669
});

0 commit comments

Comments
 (0)