@bitpoolos/edge-bacnet 1.0.6 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/bacnet_client.js +650 -233
  2. package/bacnet_device.js +65 -16
  3. package/bacnet_gateway.html +242 -99
  4. package/bacnet_gateway.js +211 -27
  5. package/bacnet_object.js +1 -1
  6. package/bacnet_read.html +211 -133
  7. package/bacnet_read.js +24 -24
  8. package/bacnet_server.js +321 -0
  9. package/bacnet_write.html +24 -15
  10. package/bacnet_write.js +0 -2
  11. package/common.js +95 -9
  12. package/edge-bacnet-datastore.cfg +0 -0
  13. package/package.json +6 -4
  14. package/resources/confirmationservice.min.js +1 -0
  15. package/resources/confirmdialog.min.js +1 -0
  16. package/resources/fonts/primeicons.woff2 +0 -0
  17. package/resources/node-bacnet/CHANGELOG.md +481 -0
  18. package/resources/{bacstack → node-bacnet}/LICENSE.md +3 -1
  19. package/resources/node-bacnet/README.md +91 -0
  20. package/resources/node-bacnet/docs/Client.html +4422 -0
  21. package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
  22. package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
  23. package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
  24. package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
  25. package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
  26. package/resources/node-bacnet/docs/bacnet.html +7032 -0
  27. package/resources/node-bacnet/docs/client.js.html +1759 -0
  28. package/resources/node-bacnet/docs/enum.js.html +2530 -0
  29. package/resources/node-bacnet/docs/global.html +2068 -0
  30. package/resources/node-bacnet/docs/images/mocha-logo.svg +65 -0
  31. package/resources/node-bacnet/docs/index.html +283 -0
  32. package/resources/node-bacnet/docs/scripts/collapse.js +11 -0
  33. package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +4 -0
  34. package/resources/node-bacnet/docs/scripts/linenumber.js +26 -0
  35. package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  36. package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +2 -0
  37. package/resources/node-bacnet/docs/scripts/prettify/prettify.js +28 -0
  38. package/resources/node-bacnet/docs/scripts/search.js +47 -0
  39. package/resources/node-bacnet/docs/services_i-am.js.html +157 -0
  40. package/resources/node-bacnet/docs/services_time-sync.js.html +118 -0
  41. package/resources/node-bacnet/docs/services_who-is.js.html +138 -0
  42. package/resources/node-bacnet/docs/styles/jsdoc.css +683 -0
  43. package/resources/node-bacnet/docs/styles/prettify.css +82 -0
  44. package/resources/node-bacnet/examples/discover-devices.js +66 -0
  45. package/resources/node-bacnet/examples/read-device.js +510 -0
  46. package/resources/node-bacnet/examples/subscribe-cov.js +75 -0
  47. package/resources/{bacstack → node-bacnet}/index.js +3 -0
  48. package/resources/{bacstack → node-bacnet}/lib/apdu.js +56 -39
  49. package/resources/{bacstack → node-bacnet}/lib/asn1.js +550 -532
  50. package/resources/node-bacnet/lib/bvlc.js +90 -0
  51. package/resources/node-bacnet/lib/client.js +1695 -0
  52. package/resources/node-bacnet/lib/enum.js +2463 -0
  53. package/resources/node-bacnet/lib/npdu.js +123 -0
  54. package/resources/{bacstack → node-bacnet}/lib/services/add-list-element.js +12 -6
  55. package/resources/{bacstack → node-bacnet}/lib/services/alarm-acknowledge.js +3 -3
  56. package/resources/{bacstack → node-bacnet}/lib/services/alarm-summary.js +5 -4
  57. package/resources/{bacstack → node-bacnet}/lib/services/atomic-read-file.js +49 -26
  58. package/resources/{bacstack → node-bacnet}/lib/services/atomic-write-file.js +40 -23
  59. package/resources/{bacstack → node-bacnet}/lib/services/cov-notify.js +33 -17
  60. package/resources/{bacstack → node-bacnet}/lib/services/create-object.js +23 -13
  61. package/resources/{bacstack → node-bacnet}/lib/services/delete-object.js +7 -2
  62. package/resources/{bacstack → node-bacnet}/lib/services/device-communication-control.js +8 -3
  63. package/resources/{bacstack → node-bacnet}/lib/services/error.js +7 -0
  64. package/resources/{bacstack → node-bacnet}/lib/services/event-information.js +10 -9
  65. package/resources/{bacstack → node-bacnet}/lib/services/event-notify-data.js +38 -16
  66. package/resources/{bacstack → node-bacnet}/lib/services/get-enrollment-summary.js +24 -11
  67. package/resources/{bacstack → node-bacnet}/lib/services/get-event-information.js +28 -13
  68. package/resources/node-bacnet/lib/services/i-am.js +90 -0
  69. package/resources/{bacstack/lib/services/i-have-broadcast.js → node-bacnet/lib/services/i-have.js} +3 -2
  70. package/resources/{bacstack → node-bacnet}/lib/services/index.js +7 -4
  71. package/resources/{bacstack → node-bacnet}/lib/services/life-safety-operation.js +3 -2
  72. package/resources/{bacstack → node-bacnet}/lib/services/private-transfer.js +3 -2
  73. package/resources/{bacstack → node-bacnet}/lib/services/read-property-multiple.js +11 -6
  74. package/resources/{bacstack → node-bacnet}/lib/services/read-property.js +42 -24
  75. package/resources/{bacstack → node-bacnet}/lib/services/read-range.js +37 -27
  76. package/resources/node-bacnet/lib/services/register-foreign-device.js +18 -0
  77. package/resources/{bacstack → node-bacnet}/lib/services/reinitialize-device.js +9 -4
  78. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-cov.js +9 -4
  79. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-property.js +18 -8
  80. package/resources/{bacstack → node-bacnet}/lib/services/time-sync.js +28 -5
  81. package/resources/{bacstack → node-bacnet}/lib/services/who-has.js +3 -3
  82. package/resources/{bacstack → node-bacnet}/lib/services/who-is.js +42 -9
  83. package/resources/{bacstack → node-bacnet}/lib/services/write-property-multiple.js +33 -16
  84. package/resources/{bacstack → node-bacnet}/lib/services/write-property.js +23 -13
  85. package/resources/node-bacnet/lib/transport.js +82 -0
  86. package/resources/node-bacnet/package.json +92 -0
  87. package/resources/primeicons.css +90 -2
  88. package/resources/bacstack/.codeclimate.yml +0 -15
  89. package/resources/bacstack/.dockerignore +0 -5
  90. package/resources/bacstack/.editorconfig +0 -13
  91. package/resources/bacstack/.eslintrc.yml +0 -13
  92. package/resources/bacstack/.github/ISSUE_TEMPLATE.md +0 -26
  93. package/resources/bacstack/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  94. package/resources/bacstack/.github/workflows/ci.yml +0 -39
  95. package/resources/bacstack/.jscsrc +0 -8
  96. package/resources/bacstack/.jshintrc +0 -50
  97. package/resources/bacstack/.travis.yml +0 -27
  98. package/resources/bacstack/CHANGELOG.md +0 -232
  99. package/resources/bacstack/CODE_OF_CONDUCT.md +0 -74
  100. package/resources/bacstack/CONTRIBUTING.md +0 -77
  101. package/resources/bacstack/Dockerfile +0 -15
  102. package/resources/bacstack/FAQ.md +0 -64
  103. package/resources/bacstack/README.md +0 -157
  104. package/resources/bacstack/docker-compose.yml +0 -9
  105. package/resources/bacstack/lib/adpu.js +0 -190
  106. package/resources/bacstack/lib/bvlc.js +0 -43
  107. package/resources/bacstack/lib/client.js +0 -1028
  108. package/resources/bacstack/lib/enum.js +0 -1314
  109. package/resources/bacstack/lib/npdu.js +0 -119
  110. package/resources/bacstack/lib/services/i-am-broadcast.js +0 -51
  111. package/resources/bacstack/lib/services.js +0 -1963
  112. package/resources/bacstack/lib/transport.js +0 -52
  113. package/resources/bacstack/package-lock.json +0 -7974
  114. package/resources/bacstack/package.json +0 -84
  115. package/resources/bacstack/test/compliance/who-is.spec.js +0 -37
  116. package/resources/bacstack/test/integration/acknowledge-alarm.spec.js +0 -14
  117. package/resources/bacstack/test/integration/add-list-element.spec.js +0 -16
  118. package/resources/bacstack/test/integration/confirmed-event-notification.spec.js +0 -30
  119. package/resources/bacstack/test/integration/confirmed-private-transfer.spec.js +0 -15
  120. package/resources/bacstack/test/integration/create-object.spec.js +0 -16
  121. package/resources/bacstack/test/integration/delete-object.spec.js +0 -14
  122. package/resources/bacstack/test/integration/device-communication-control.spec.js +0 -14
  123. package/resources/bacstack/test/integration/get-alarm-summary.spec.js +0 -14
  124. package/resources/bacstack/test/integration/get-enrollment-summary.spec.js +0 -15
  125. package/resources/bacstack/test/integration/get-event-information.spec.js +0 -14
  126. package/resources/bacstack/test/integration/read-file.spec.js +0 -14
  127. package/resources/bacstack/test/integration/read-property-multiple.spec.js +0 -110
  128. package/resources/bacstack/test/integration/read-property.spec.js +0 -14
  129. package/resources/bacstack/test/integration/read-range.spec.js +0 -14
  130. package/resources/bacstack/test/integration/reinitialize-sevice.spec.js +0 -14
  131. package/resources/bacstack/test/integration/remove-list-element.spec.js +0 -16
  132. package/resources/bacstack/test/integration/subscribe-cov.spec.js +0 -14
  133. package/resources/bacstack/test/integration/subscribe-property.spec.js +0 -14
  134. package/resources/bacstack/test/integration/time-sync-utc.spec.js +0 -10
  135. package/resources/bacstack/test/integration/time-sync.spec.js +0 -10
  136. package/resources/bacstack/test/integration/unconfirmed-event-notification.spec.js +0 -28
  137. package/resources/bacstack/test/integration/unconfirmed-private-transfer.spec.js +0 -11
  138. package/resources/bacstack/test/integration/utils.js +0 -30
  139. package/resources/bacstack/test/integration/who-is.spec.js +0 -17
  140. package/resources/bacstack/test/integration/write-file.spec.js +0 -14
  141. package/resources/bacstack/test/integration/write-property-multiple.spec.js +0 -19
  142. package/resources/bacstack/test/integration/write-property.spec.js +0 -14
  143. package/resources/bacstack/test/unit/apdu.spec.js +0 -162
  144. package/resources/bacstack/test/unit/asn1.spec.js +0 -39
  145. package/resources/bacstack/test/unit/bacnet-apdu.spec.js +0 -161
  146. package/resources/bacstack/test/unit/bacnet-asn1.spec.js +0 -32
  147. package/resources/bacstack/test/unit/bacnet-bvlc.spec.js +0 -57
  148. package/resources/bacstack/test/unit/bacnet-npdu.spec.js +0 -118
  149. package/resources/bacstack/test/unit/bacnet-services.spec.js +0 -2052
  150. package/resources/bacstack/test/unit/bvlc.spec.js +0 -58
  151. package/resources/bacstack/test/unit/npdu.spec.js +0 -119
  152. package/resources/bacstack/test/unit/service-add-list-element.spec.js +0 -24
  153. package/resources/bacstack/test/unit/service-alarm-acknowledge.spec.js +0 -71
  154. package/resources/bacstack/test/unit/service-alarm-summary.spec.js +0 -22
  155. package/resources/bacstack/test/unit/service-atomic-read-file.spec.js +0 -54
  156. package/resources/bacstack/test/unit/service-atomic-write-file.spec.js +0 -56
  157. package/resources/bacstack/test/unit/service-cov-notify.spec.js +0 -98
  158. package/resources/bacstack/test/unit/service-create-object.spec.js +0 -90
  159. package/resources/bacstack/test/unit/service-delete-object.spec.js +0 -17
  160. package/resources/bacstack/test/unit/service-device-communication-control.spec.js +0 -29
  161. package/resources/bacstack/test/unit/service-error.spec.js +0 -17
  162. package/resources/bacstack/test/unit/service-event-information.spec.js +0 -48
  163. package/resources/bacstack/test/unit/service-event-notify-data.spec.js +0 -310
  164. package/resources/bacstack/test/unit/service-get-enrollment-summary.spec.js +0 -45
  165. package/resources/bacstack/test/unit/service-get-event-information.spec.js +0 -62
  166. package/resources/bacstack/test/unit/service-i-am.spec.js +0 -19
  167. package/resources/bacstack/test/unit/service-i-have-broadcast.spec.js +0 -18
  168. package/resources/bacstack/test/unit/service-life-safety-operation.spec.js +0 -19
  169. package/resources/bacstack/test/unit/service-private-transfer.spec.js +0 -18
  170. package/resources/bacstack/test/unit/service-read-property-multiple.spec.js +0 -131
  171. package/resources/bacstack/test/unit/service-read-property.spec.js +0 -541
  172. package/resources/bacstack/test/unit/service-read-range.spec.js +0 -97
  173. package/resources/bacstack/test/unit/service-reinitialize-device.spec.js +0 -27
  174. package/resources/bacstack/test/unit/service-subscribe-cov.spec.js +0 -32
  175. package/resources/bacstack/test/unit/service-subscribe-property.spec.js +0 -50
  176. package/resources/bacstack/test/unit/service-time-sync.spec.js +0 -18
  177. package/resources/bacstack/test/unit/service-who-has.spec.js +0 -33
  178. package/resources/bacstack/test/unit/service-who-is.spec.js +0 -17
  179. package/resources/bacstack/test/unit/service-write-property-multiple.spec.js +0 -143
  180. package/resources/bacstack/test/unit/service-write-property.spec.js +0 -198
  181. package/resources/bacstack/test/unit/utils.js +0 -6
@@ -1,1963 +0,0 @@
1
- var baAsn1 = require('./asn1');
2
- var baEnum = require('./enum');
3
-
4
- module.exports.encodeIamBroadcast = function(buffer, deviceId, maxApdu, segmentation, vendorId) {
5
- baAsn1.encodeApplicationObjectId(buffer, baEnum.ObjectTypes.OBJECT_DEVICE, deviceId);
6
- baAsn1.encodeApplicationUnsigned(buffer, maxApdu);
7
- baAsn1.encodeApplicationEnumerated(buffer, segmentation);
8
- baAsn1.encodeApplicationUnsigned(buffer, vendorId);
9
- };
10
-
11
- module.exports.decodeIamBroadcast = function(buffer, offset) {
12
- var result;
13
- var apduLen = 0;
14
- var orgOffset = offset;
15
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + apduLen);
16
- apduLen += result.len;
17
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_OBJECT_ID) return;
18
- result = baAsn1.decodeObjectId(buffer, offset + apduLen);
19
- apduLen += result.len;
20
- if (result.objectType !== baEnum.ObjectTypes.OBJECT_DEVICE) return;
21
- var deviceId = result.instance;
22
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + apduLen);
23
- apduLen += result.len;
24
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_UNSIGNED_INT) return;
25
- result = baAsn1.decodeUnsigned(buffer, offset + apduLen, result.value);
26
- apduLen += result.len;
27
- var maxApdu = result.value;
28
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + apduLen);
29
- apduLen += result.len;
30
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_ENUMERATED) return;
31
- result = baAsn1.decodeEnumerated(buffer, offset + apduLen, result.value);
32
- apduLen += result.len;
33
- if (result.value > baEnum.Segmentations.SEGMENTATION_NONE) return;
34
- var segmentation = result.value;
35
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + apduLen);
36
- apduLen += result.len;
37
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_UNSIGNED_INT) return;
38
- result = baAsn1.decodeUnsigned(buffer, offset + apduLen, result.value);
39
- apduLen += result.len;
40
- if (result.value > 0xFFFF) return;
41
- var vendorId = result.value;
42
- return {
43
- len: offset - orgOffset,
44
- deviceId: deviceId,
45
- maxApdu: maxApdu,
46
- segmentation: segmentation,
47
- vendorId: vendorId
48
- };
49
- };
50
-
51
- module.exports.encodeWhoHasBroadcast = function(buffer, lowLimit, highLimit, objectId, objectName) {
52
- if ((lowLimit >= 0) && (lowLimit <= baAsn1.BACNET_MAX_INSTANCE) && (highLimit >= 0) && (highLimit <= baAsn1.BACNET_MAX_INSTANCE)) {
53
- baAsn1.encodeContextUnsigned(buffer, 0, lowLimit);
54
- baAsn1.encodeContextUnsigned(buffer, 1, highLimit);
55
- }
56
- if (objectName && objectName !== '') {
57
- baAsn1.encodeContextCharacterString(buffer, 3, objectName);
58
- } else {
59
- baAsn1.encodeContextObjectId(buffer, 2, objectId.type, objectId.instance);
60
- }
61
- };
62
-
63
- module.exports.decodeWhoHasBroadcast = function(buffer, offset, apduLen) {
64
- var len = 0;
65
- var value = {};
66
- var decodedValue;
67
- var result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
68
- len += result.len;
69
- if (result.tagNumber === 0) {
70
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
71
- len += decodedValue.len;
72
- if (decodedValue.value <= baAsn1.BACNET_MAX_INSTANCE) {
73
- value.lowLimit = decodedValue.value;
74
- }
75
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
76
- len += result.len;
77
- }
78
- if (result.tagNumber === 1) {
79
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
80
- len += decodedValue.len;
81
- if (decodedValue.value <= baAsn1.BACNET_MAX_INSTANCE) {
82
- value.highLimit = decodedValue.value;
83
- }
84
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
85
- len += result.len;
86
- }
87
- if (result.tagNumber === 2) {
88
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
89
- len += decodedValue.len;
90
- value.objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
91
- }
92
- if (result.tagNumber === 3) {
93
- decodedValue = baAsn1.decodeCharacterString(buffer, offset + len, apduLen - (offset + len), result.value);
94
- len += decodedValue.len;
95
- value.objectName = decodedValue.value;
96
- }
97
- value.len = len;
98
- return value;
99
- };
100
-
101
- module.exports.encodeWhoIsBroadcast = function(buffer, lowLimit, highLimit) {
102
- if ((lowLimit >= 0) && (lowLimit <= baAsn1.BACNET_MAX_INSTANCE) && (highLimit >= 0) && (highLimit <= baAsn1.BACNET_MAX_INSTANCE)) {
103
- baAsn1.encodeContextUnsigned(buffer, 0, lowLimit);
104
- baAsn1.encodeContextUnsigned(buffer, 1, highLimit);
105
- }
106
- };
107
-
108
- module.exports.decodeWhoIsBroadcast = function(buffer, offset, apduLen) {
109
- var len = 0;
110
- var value = {};
111
- if (apduLen <= 0) return {};
112
- var result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
113
- len += result.len;
114
- if (result.tagNumber !== 0) return;
115
- if (apduLen <= len) return;
116
- var decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
117
- len += decodedValue.len;
118
- if (decodedValue.value <= baAsn1.BACNET_MAX_INSTANCE) {
119
- value.lowLimit = decodedValue.value;
120
- }
121
- if (apduLen <= len) return;
122
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
123
- len += result.len;
124
- if (result.tagNumber !== 1) return;
125
- if (apduLen <= len) return;
126
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
127
- len += decodedValue.len;
128
- if (decodedValue.value <= baAsn1.BACNET_MAX_INSTANCE) {
129
- value.highLimit = decodedValue.value;
130
- }
131
- value.len = len;
132
- return value;
133
- };
134
-
135
- module.exports.encodeAtomicReadFile = function(buffer, isStream, objectId, position, count) {
136
- baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance);
137
- if (isStream) {
138
- baAsn1.encodeOpeningTag(buffer, 0);
139
- baAsn1.encodeApplicationSigned(buffer, position);
140
- baAsn1.encodeApplicationUnsigned(buffer, count);
141
- baAsn1.encodeClosingTag(buffer, 0);
142
- } else {
143
- baAsn1.encodeOpeningTag(buffer, 1);
144
- baAsn1.encodeApplicationSigned(buffer, position);
145
- baAsn1.encodeApplicationUnsigned(buffer, count);
146
- baAsn1.encodeClosingTag(buffer, 1);
147
- }
148
- };
149
-
150
- module.exports.decodeAtomicReadFile = function(buffer, offset) {
151
- var len = 0;
152
- var result;
153
- var decodedValue;
154
- var isStream = true;
155
- var objectId = {};
156
- var position = -1;
157
- var count = 0;
158
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
159
- len += result.len;
160
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_OBJECT_ID) return;
161
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
162
- len += decodedValue.len;
163
- objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
164
- if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 0)) {
165
- isStream = true;
166
- len++;
167
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
168
- len += result.len;
169
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_SIGNED_INT) return;
170
- decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
171
- len += decodedValue.len;
172
- position = decodedValue.value;
173
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
174
- len += result.len;
175
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_UNSIGNED_INT) return;
176
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
177
- len += decodedValue.len;
178
- count = decodedValue.value;
179
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) return;
180
- len++;
181
- } else if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) {
182
- isStream = false;
183
- len++;
184
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
185
- len += result.len;
186
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_SIGNED_INT) return;
187
- decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
188
- len += decodedValue.len;
189
- position = decodedValue.value;
190
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
191
- len += result.len;
192
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_UNSIGNED_INT) return;
193
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
194
- len += decodedValue.len;
195
- count = decodedValue.value;
196
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) return;
197
- len++;
198
- } else {
199
- return;
200
- }
201
- return {
202
- len: len,
203
- isStream: isStream,
204
- objectId: objectId,
205
- position: position,
206
- count: count
207
- };
208
- };
209
-
210
- module.exports.encodeAtomicReadFileAcknowledge = function(buffer, isStream, endOfFile, position, blockCount, blocks, counts) {
211
- baAsn1.encodeApplicationBoolean(buffer, endOfFile);
212
- if (isStream) {
213
- baAsn1.encodeOpeningTag(buffer, 0);
214
- baAsn1.encodeApplicationSigned(buffer, position);
215
- baAsn1.encodeApplicationOctetString(buffer, blocks[0], 0, counts[0]);
216
- baAsn1.encodeClosingTag(buffer, 0);
217
- } else {
218
- baAsn1.encodeOpeningTag(buffer, 1);
219
- baAsn1.encodeApplicationSigned(buffer, position);
220
- baAsn1.encodeApplicationUnsigned(buffer, blockCount);
221
- for (var i = 0; i < blockCount; i++) {
222
- baAsn1.encodeApplicationOctetString(buffer, blocks[i], 0, counts[i]);
223
- }
224
- baAsn1.encodeClosingTag(buffer, 1);
225
- }
226
- };
227
-
228
- module.exports.decodeAtomicReadFileAcknowledge = function(buffer, offset) {
229
- var len = 0;
230
- var result;
231
- var decodedValue;
232
- var endOfFile;
233
- var isStream;
234
- var position;
235
- var targetBuffer;
236
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
237
- len += result.len;
238
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_BOOLEAN) return;
239
- endOfFile = result.value > 0;
240
- if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 0)) {
241
- isStream = true;
242
- len++;
243
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
244
- len += result.len;
245
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_SIGNED_INT) return;
246
- decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
247
- len += decodedValue.len;
248
- position = decodedValue.value;
249
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
250
- len += result.len;
251
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_OCTET_STRING) return;
252
- targetBuffer = buffer.slice(offset + len, offset + len + result.value);
253
- len += result.value;
254
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) return;
255
- len++;
256
- } else if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) {
257
- isStream = false;
258
- throw new Error('NotImplemented');
259
- } else {
260
- return;
261
- }
262
- return {
263
- len: len,
264
- endOfFile: endOfFile,
265
- isStream: isStream,
266
- position: position,
267
- buffer: targetBuffer
268
- };
269
- };
270
-
271
- module.exports.encodeAtomicWriteFile = function(buffer, isStream, objectId, position, blockCount, blocks, counts) {
272
- baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance);
273
- if (isStream) {
274
- baAsn1.encodeOpeningTag(buffer, 0);
275
- baAsn1.encodeApplicationSigned(buffer, position);
276
- baAsn1.encodeApplicationOctetString(buffer, blocks[0], 0, counts[0]);
277
- baAsn1.encodeClosingTag(buffer, 0);
278
- } else {
279
- baAsn1.encodeOpeningTag(buffer, 1);
280
- baAsn1.encodeApplicationSigned(buffer, position);
281
- baAsn1.encodeApplicationUnsigned(buffer, blockCount);
282
- for (var i = 0; i < blockCount; i++) {
283
- baAsn1.encodeApplicationOctetString(buffer, blocks[i], 0, counts[i]);
284
- }
285
- baAsn1.encodeClosingTag(buffer, 1);
286
- }
287
- };
288
-
289
- module.exports.decodeAtomicWriteFile = function(buffer, offset, apduLen) {
290
- var len = 0;
291
- var result;
292
- var decodedValue;
293
- var isStream = true;
294
- var position = -1;
295
- var blockCount = 0;
296
- var blocks = null;
297
- var counts = null;
298
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
299
- len += result.length;
300
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_OBJECT_ID) return;
301
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
302
- len += decodedValue.len;
303
- var objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
304
- if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 0)) {
305
- isStream = true;
306
- len++;
307
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
308
- len += result.length;
309
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_SIGNED_INT) return;
310
- decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
311
- len += decodedValue.len;
312
- position = decodedValue.value;
313
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
314
- len += result.length;
315
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_OCTET_STRING) return;
316
- blockCount = 1;
317
-
318
- // TODO: Implement
319
-
320
- /*
321
- blocks = new byte[1][];
322
- blocks[0] = new byte[len_value_type];
323
- counts = new int[] { len_value_type };*/
324
-
325
- len += baAsn1.decodeOctetString(buffer, offset + len, apduLen, blocks[0], 0, result.value);
326
-
327
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) return;
328
- len++;
329
- } else if (baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) {
330
- isStream = false;
331
- len++;
332
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
333
- len += result.length;
334
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_SIGNED_INT) return;
335
- decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
336
- len += decodedValue.len;
337
- position = decodedValue.value;
338
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
339
- len += result.length;
340
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_UNSIGNED_INT) return;
341
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
342
- len += decodedValue.len;
343
- blockCount = decodedValue.value;
344
-
345
- // TODO: Implement
346
- /*blocks = new byte[block_count][];
347
- counts = new int[block_count];*/
348
-
349
- for (var i = 0; i < blockCount; i++) {
350
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
351
- len += result.len;
352
- /*blocks[i] = new byte[len_value_type];
353
- counts[i] = len_value_type;*/
354
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_OCTET_STRING) return;
355
- len += baAsn1.decodeOctetString(buffer, offset + len, apduLen, blocks[i], 0, result.value);
356
-
357
- }
358
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) return;
359
- len++;
360
- } else {
361
- return;
362
- }
363
- return {
364
- len: len,
365
- isStream: isStream,
366
- objectId: objectId,
367
- position: position,
368
- blockCount: blockCount,
369
- blocks: blocks,
370
- counts: counts
371
- };
372
- };
373
-
374
- module.exports.encodeAtomicWriteFileAcknowledge = function(buffer, isStream, position) {
375
- if (isStream) {
376
- baAsn1.encodeContextSigned(buffer, 0, position);
377
- } else {
378
- baAsn1.encodeContextSigned(buffer, 1, position);
379
- }
380
- };
381
-
382
- module.exports.decodeAtomicWriteFileAcknowledge = function(buffer, offset) {
383
- var len = 0;
384
- var isStream = false;
385
- var position = 0;
386
- var decodedValue;
387
- var result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
388
- len += result.len;
389
- if (result.tagNumber === 0) {
390
- isStream = true;
391
- } else if (result.tagNumber === 1) {
392
- isStream = false;
393
- } else {
394
- return;
395
- }
396
- decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
397
- len += decodedValue.len;
398
- position = decodedValue.value;
399
- return {
400
- len: len,
401
- isStream: isStream,
402
- position: position
403
- };
404
- };
405
-
406
- module.exports.encodeDeviceCommunicationControl = function(buffer, timeDuration, enableDisable, password) {
407
- if (timeDuration > 0) {
408
- baAsn1.encodeContextUnsigned(buffer, 0, timeDuration);
409
- }
410
- baAsn1.encodeContextEnumerated(buffer, 1, enableDisable);
411
- if (password && password !== '') {
412
- baAsn1.encodeContextCharacterString(buffer, 2, password);
413
- }
414
- };
415
-
416
- module.exports.decodeDeviceCommunicationControl = function(buffer, offset, apduLen) {
417
- var len = 0;
418
- var value = {};
419
- var decodedValue;
420
- var result;
421
- if (baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
422
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
423
- len += result.len;
424
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
425
- value.timeDuration = decodedValue.value;
426
- len += decodedValue.len;
427
- }
428
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
429
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
430
- len += result.len;
431
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
432
- value.enableDisable = decodedValue.value;
433
- len += decodedValue.len;
434
- if (len < apduLen) {
435
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 2)) return;
436
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
437
- len += result.len;
438
- decodedValue = baAsn1.decodeCharacterString(buffer, offset + len, apduLen - (offset + len), result.value);
439
- value.password = decodedValue.value;
440
- len += decodedValue.len;
441
- }
442
- value.len = len;
443
- return value;
444
- };
445
-
446
- module.exports.encodeReinitializeDevice = function(buffer, state, password) {
447
- baAsn1.encodeContextEnumerated(buffer, 0, state);
448
- if (password && password !== '') {
449
- baAsn1.encodeContextCharacterString(buffer, 1, password);
450
- }
451
- };
452
-
453
- module.exports.decodeReinitializeDevice = function(buffer, offset, apduLen) {
454
- var len = 0;
455
- var value = {};
456
- var result;
457
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
458
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
459
- len += result.len;
460
- var decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
461
- value.state = decodedValue.value;
462
- len += decodedValue.len;
463
- if (len < apduLen) {
464
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
465
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
466
- len += result.len;
467
- decodedValue = baAsn1.decodeCharacterString(buffer, offset + len, apduLen - (offset + len), result.value);
468
- value.password = decodedValue.value;
469
- len += decodedValue.len;
470
- }
471
- value.len = len;
472
- return value;
473
- };
474
-
475
- module.exports.encodeReadRange = function(buffer, objectId, propertyId, arrayIndex, requestType, position, time, count) {
476
- baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance);
477
- baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
478
- if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
479
- baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex);
480
- }
481
- switch (requestType) {
482
- case baEnum.ReadRangeRequestTypes.RR_BY_POSITION:
483
- baAsn1.encodeOpeningTag(buffer, 3);
484
- baAsn1.encodeApplicationUnsigned(buffer, position);
485
- baAsn1.encodeApplicationSigned(buffer, count);
486
- baAsn1.encodeClosingTag(buffer, 3);
487
- break;
488
- case baEnum.ReadRangeRequestTypes.RR_BY_SEQUENCE:
489
- baAsn1.encodeOpeningTag(buffer, 6);
490
- baAsn1.encodeApplicationUnsigned(buffer, position);
491
- baAsn1.encodeApplicationSigned(buffer, count);
492
- baAsn1.encodeClosingTag(buffer, 6);
493
- break;
494
- case baEnum.ReadRangeRequestTypes.RR_BY_TIME:
495
- baAsn1.encodeOpeningTag(buffer, 7);
496
- baAsn1.encodeApplicationDate(buffer, time);
497
- baAsn1.encodeApplicationTime(buffer, time);
498
- baAsn1.encodeApplicationSigned(buffer, count);
499
- baAsn1.encodeClosingTag(buffer, 7);
500
- break;
501
- case baEnum.ReadRangeRequestTypes.RR_READ_ALL:
502
- break;
503
- default:
504
- break;
505
- }
506
- };
507
-
508
- module.exports.decodeReadRange = function(buffer, offset, apduLen) {
509
- var len = 0;
510
- var result;
511
- var decodedValue;
512
- var requestType = baEnum.ReadRangeRequestTypes.RR_READ_ALL;
513
- var position;
514
- var time;
515
- var count;
516
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
517
- len++;
518
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len, 0);
519
- len += decodedValue.len;
520
- var objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
521
- var property = {};
522
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
523
- len += result.len;
524
- if (result.tagNumber !== 1) return;
525
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
526
- len += decodedValue.len;
527
- property.id = decodedValue.value;
528
- if (len < apduLen && baAsn1.decodeIsContextTag(buffer, offset + len, 2)) {
529
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
530
- len += result.len;
531
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
532
- len += decodedValue.len;
533
- property.index = decodedValue.value;
534
- } else {
535
- property.index = baAsn1.BACNET_ARRAY_ALL;
536
- }
537
- if (len < apduLen) {
538
- result = baAsn1.decodeTagNumber(buffer, offset + len);
539
- len += result.len;
540
- switch (result.tagNumber) {
541
- case 3:
542
- requestType = baEnum.ReadRangeRequestTypes.RR_BY_POSITION;
543
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
544
- len += result.len;
545
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
546
- len += decodedValue.len;
547
- position = decodedValue.value;
548
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
549
- len += result.len;
550
- decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
551
- len += decodedValue.len;
552
- count = decodedValue.value;
553
- break;
554
- case 6:
555
- requestType = baEnum.ReadRangeRequestTypes.RR_BY_SEQUENCE;
556
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
557
- len += result.len;
558
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
559
- len += decodedValue.len;
560
- position = decodedValue.value;
561
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
562
- len += result.len;
563
- decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
564
- len += decodedValue.len;
565
- count = decodedValue.value;
566
- break;
567
- case 7:
568
- requestType = baEnum.ReadRangeRequestTypes.RR_BY_TIME;
569
- decodedValue = baAsn1.decodeApplicationDate(buffer, offset + len);
570
- len += decodedValue.len;
571
- var tmpDate = decodedValue.value.value;
572
- decodedValue = baAsn1.decodeApplicationTime(buffer, offset + len);
573
- len += decodedValue.len;
574
- var tmpTime = decodedValue.value.value;
575
- time = new Date(tmpDate.getYear(), tmpDate.getMonth(), tmpDate.getDate(), tmpTime.getHours(), tmpTime.getMinutes(), tmpTime.getSeconds(), tmpTime.getMilliseconds());
576
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
577
- len += result.len;
578
- decodedValue = baAsn1.decodeSigned(buffer, offset + len, result.value);
579
- len += decodedValue.len;
580
- count = decodedValue.value;
581
- break;
582
- default:
583
- return;
584
- }
585
- result = baAsn1.decodeTagNumber(buffer, offset + len);
586
- len += result.len;
587
- }
588
- return {
589
- len: len,
590
- objectId: objectId,
591
- property: property,
592
- requestType: requestType,
593
- position: position,
594
- time: time,
595
- count: count
596
- };
597
- };
598
-
599
- module.exports.encodeReadProperty = function(buffer, objectType, objectInstance, propertyId, arrayIndex) {
600
- if (objectType <= baAsn1.BACNET_MAX_OBJECT) {
601
- baAsn1.encodeContextObjectId(buffer, 0, objectType, objectInstance);
602
- }
603
- if (propertyId <= baEnum.PropertyIds.MAX_BACNET_PROPERTY_ID) {
604
- baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
605
- }
606
- if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
607
- baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex || baAsn1.BACNET_ARRAY_ALL);
608
- }
609
- };
610
-
611
- module.exports.decodeReadProperty = function(buffer, offset, apduLen) {
612
- var len = 0;
613
- var result;
614
- var decodedValue;
615
- if (apduLen < 7) return;
616
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
617
- len++;
618
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
619
- len += decodedValue.len;
620
- var objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
621
- var property = {};
622
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
623
- len += result.len;
624
- if (result.tagNumber !== 1) return;
625
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
626
- len += decodedValue.len;
627
- property.id = decodedValue.value;
628
- property.index = baAsn1.BACNET_ARRAY_ALL;
629
- if (len < apduLen) {
630
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
631
- len += result.len;
632
- if ((result.tagNumber === 2) && (len < apduLen)) {
633
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
634
- len += decodedValue.len;
635
- property.index = decodedValue.value;
636
- } else {
637
- return;
638
- }
639
- }
640
- if (len < apduLen) return;
641
- return {
642
- len: len,
643
- objectId: objectId,
644
- property: property
645
- };
646
- };
647
-
648
- module.exports.encodeReadPropertyAcknowledge = function(buffer, objectId, propertyId, arrayIndex, values) {
649
- baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance);
650
- baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
651
- if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
652
- baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex);
653
- }
654
- baAsn1.encodeOpeningTag(buffer, 3);
655
- values.forEach(function(value) {
656
- baAsn1.bacappEncodeApplicationData(buffer, value);
657
- });
658
- baAsn1.encodeClosingTag(buffer, 3);
659
- };
660
-
661
- module.exports.decodeReadPropertyAcknowledge = function(buffer, offset, apduLen) {
662
- var result;
663
- var decodedValue;
664
- var objectId = {};
665
- var property = {};
666
- if (!baAsn1.decodeIsContextTag(buffer, offset, 0)) return;
667
- var len = 1;
668
- result = baAsn1.decodeObjectId(buffer, offset + len);
669
- len += result.len;
670
- objectId.type = result.objectType;
671
- objectId.instance = result.instance;
672
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
673
- len += result.len;
674
- if (result.tagNumber !== 1) return;
675
- result = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
676
- len += result.len;
677
- property.id = result.value;
678
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
679
- if (result.tagNumber === 2) {
680
- len += result.len;
681
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
682
- len += decodedValue.len;
683
- property.index = decodedValue.value;
684
- } else {
685
- property.index = baAsn1.BACNET_ARRAY_ALL;
686
- }
687
- var values = [];
688
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 3)) return;
689
- len++;
690
- while ((apduLen - len) > 1) {
691
- result = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, objectId.type, property.id);
692
- if (!result) return;
693
- len += result.len;
694
- delete result.len;
695
- values.push(result);
696
- }
697
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 3)) return;
698
- len++;
699
- return {
700
- len: len,
701
- objectId: objectId,
702
- property: property,
703
- values: values
704
- };
705
- };
706
-
707
- module.exports.encodeReadPropertyMultiple = function(buffer, properties) {
708
- properties.forEach(function(value) {
709
- baAsn1.encodeReadAccessSpecification(buffer, value);
710
- });
711
- };
712
-
713
- module.exports.decodeReadPropertyMultiple = function(buffer, offset, apduLen) {
714
- var len = 0;
715
- var values = [];
716
- while ((apduLen - len) > 0) {
717
- var decodedValue = baAsn1.decodeReadAccessSpecification(buffer, offset + len, apduLen - len);
718
- if (!decodedValue) return;
719
- len += decodedValue.len;
720
- values.push(decodedValue.value);
721
- }
722
- return {
723
- len: len,
724
- properties: values
725
- };
726
- };
727
-
728
- module.exports.encodeReadPropertyMultipleAcknowledge = function(buffer, values) {
729
- values.forEach(function(value) {
730
- baAsn1.encodeReadAccessResult(buffer, value);
731
- });
732
- };
733
-
734
- module.exports.decodeReadPropertyMultipleAcknowledge = function(buffer, offset, apduLen) {
735
- var len = 0;
736
- var values = [];
737
- while ((apduLen - len) > 0) {
738
- var result = baAsn1.decodeReadAccessResult(buffer, offset + len, apduLen - len);
739
- if (!result) return;
740
- len += result.len;
741
- values.push(result.value);
742
- }
743
- return {
744
- len: len,
745
- values: values
746
- };
747
- };
748
-
749
- module.exports.encodeWriteProperty = function(buffer, objectType, objectInstance, propertyId, arrayIndex, priority, values) {
750
- baAsn1.encodeContextObjectId(buffer, 0, objectType, objectInstance);
751
- baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
752
- if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
753
- baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex);
754
- }
755
- baAsn1.encodeOpeningTag(buffer, 3);
756
- values.forEach(function(value) {
757
- baAsn1.bacappEncodeApplicationData(buffer, value);
758
- });
759
- baAsn1.encodeClosingTag(buffer, 3);
760
- if (priority !== baAsn1.BACNET_NO_PRIORITY) {
761
- baAsn1.encodeContextUnsigned(buffer, 4, priority);
762
- }
763
- };
764
-
765
- module.exports.decodeWriteProperty = function(buffer, offset, apduLen) {
766
- var len = 0;
767
- var value = {
768
- property: {}
769
- };
770
- var decodedValue;
771
- var result;
772
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
773
- len++;
774
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
775
- var objectId = {
776
- type: decodedValue.objectType,
777
- instance: decodedValue.instance
778
- };
779
- len += decodedValue.len;
780
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
781
- len += result.len;
782
- if (result.tagNumber !== 1) return;
783
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
784
- len += decodedValue.len;
785
- value.property.id = decodedValue.value;
786
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
787
- if (result.tagNumber === 2) {
788
- len += result.len;
789
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
790
- len += decodedValue.len;
791
- value.property.index = decodedValue.value;
792
- } else {
793
- value.property.index = baAsn1.BACNET_ARRAY_ALL;
794
- }
795
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 3)) return;
796
- len++;
797
- var values = [];
798
- while ((apduLen - len) > 1 && !baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 3)) {
799
- decodedValue = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, objectId.type, value.property.id);
800
- if (!decodedValue) return;
801
- len += decodedValue.len;
802
- delete decodedValue.len;
803
- values.push(decodedValue);
804
- }
805
- value.value = values;
806
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 3)) return;
807
- len++;
808
- value.priority = baAsn1.BACNET_MAX_PRIORITY;
809
- if (len < apduLen) {
810
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
811
- if (result.tagNumber === 4) {
812
- len += result.len;
813
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
814
- len += decodedValue;
815
- if ((decodedValue.value >= baAsn1.BACNET_MIN_PRIORITY) && (decodedValue.value <= baAsn1.BACNET_MAX_PRIORITY)) {
816
- value.priority = decodedValue.value;
817
- } else {
818
- return;
819
- }
820
- }
821
- }
822
- return {
823
- len: len,
824
- objectId: objectId,
825
- value: value
826
- };
827
- };
828
-
829
- var encodeWritePropertyMultiple = module.exports.encodeWritePropertyMultiple = function(buffer, objectId, values) {
830
- baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance);
831
- baAsn1.encodeOpeningTag(buffer, 1);
832
- values.forEach(function(pValue) {
833
- baAsn1.encodeContextEnumerated(buffer, 0, pValue.property.id);
834
- if (pValue.property.index !== baAsn1.BACNET_ARRAY_ALL) {
835
- baAsn1.encodeContextUnsigned(buffer, 1, pValue.property.index);
836
- }
837
- baAsn1.encodeOpeningTag(buffer, 2);
838
- pValue.value.forEach(function(value) {
839
- baAsn1.bacappEncodeApplicationData(buffer, value);
840
- });
841
- baAsn1.encodeClosingTag(buffer, 2);
842
- if (pValue.priority !== baAsn1.BACNET_NO_PRIORITY) {
843
- baAsn1.encodeContextUnsigned(buffer, 3, pValue.priority);
844
- }
845
- });
846
- baAsn1.encodeClosingTag(buffer, 1);
847
- };
848
-
849
- module.exports.decodeWritePropertyMultiple = function(buffer, offset, apduLen) {
850
- var len = 0;
851
- var result;
852
- var decodedValue;
853
- var objectId;
854
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
855
- len += result.len;
856
- if ((result.tagNumber !== 0) || (apduLen <= len)) return;
857
- apduLen -= len;
858
- if (apduLen < 4) return;
859
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
860
- len += decodedValue.len;
861
- objectId = {
862
- type: decodedValue.objectType,
863
- instance: decodedValue.instance
864
- };
865
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) return;
866
- len++;
867
- var _values = [];
868
- while ((apduLen - len) > 1) {
869
- var newEntry = {};
870
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
871
- len += result.len;
872
- if (result.tagNumber !== 0) return;
873
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
874
- len += decodedValue.len;
875
- var propertyId = decodedValue.value;
876
- var arrayIndex = baAsn1.BACNET_ARRAY_ALL;
877
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
878
- len += result.len;
879
- if (result.tagNumber === 1) {
880
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
881
- len += decodedValue.len;
882
- arrayIndex = decodedValue.value;
883
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
884
- len += result.len;
885
- }
886
- newEntry.property = {id: propertyId, index: arrayIndex};
887
- if ((result.tagNumber !== 2) || (!baAsn1.decodeIsOpeningTag(buffer, offset + len - 1))) return;
888
- var values = [];
889
- while ((len + offset) <= buffer.length && !baAsn1.decodeIsClosingTag(buffer, offset + len)) {
890
- var value = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, objectId.type, propertyId);
891
- if (!value) return;
892
- len += value.len;
893
- delete value.len;
894
- values.push(value);
895
- }
896
- len++;
897
- newEntry.value = values;
898
- var priority = baAsn1.BACNET_NO_PRIORITY;
899
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
900
- len += result.len;
901
- if (result.tagNumber === 3) {
902
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
903
- len += decodedValue.len;
904
- priority = decodedValue.value;
905
- } else {
906
- len--;
907
- }
908
- newEntry.priority = priority;
909
- _values.push(newEntry);
910
- }
911
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) return;
912
- len++;
913
- return {
914
- len: len,
915
- objectId: objectId,
916
- values: _values
917
- };
918
- };
919
-
920
- module.exports.encodeWriteObjectMultiple = function(buffer, values) {
921
- values.forEach(function(object) {
922
- encodeWritePropertyMultiple(buffer, object.objectId, object.values);
923
- });
924
- };
925
-
926
- module.exports.encodeCreateObjectAcknowledge = function(buffer, objectId) {
927
- baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance);
928
- };
929
-
930
- module.exports.encodeTimeSync = function(buffer, time) {
931
- baAsn1.encodeApplicationDate(buffer, time);
932
- baAsn1.encodeApplicationTime(buffer, time);
933
- };
934
-
935
- module.exports.decodeTimeSync = function(buffer, offset, length) {
936
- var len = 0;
937
- var result;
938
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
939
- len += result.len;
940
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_DATE) return;
941
- var date = baAsn1.decodeDate(buffer, offset + len);
942
- len += date.len;
943
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
944
- len += result.len;
945
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_TIME) return;
946
- var time = baAsn1.decodeBacnetTime(buffer, offset + len);
947
- len += time.len;
948
- return {
949
- len: len,
950
- value: new Date(date.value.getFullYear(), date.value.getMonth(), date.value.getDate(), time.value.getHours(), time.value.getMinutes(), time.value.getSeconds(), time.value.getMilliseconds())
951
- };
952
- };
953
-
954
- module.exports.encodeError = function(buffer, errorClass, errorCode) {
955
- baAsn1.encodeApplicationEnumerated(buffer, errorClass);
956
- baAsn1.encodeApplicationEnumerated(buffer, errorCode);
957
- };
958
-
959
- module.exports.decodeError = function(buffer, offset) {
960
- var orgOffset = offset;
961
- var result;
962
- result = baAsn1.decodeTagNumberAndValue(buffer, offset);
963
- offset += result.len;
964
- var errorClass = baAsn1.decodeEnumerated(buffer, offset, result.value);
965
- offset += errorClass.len;
966
- result = baAsn1.decodeTagNumberAndValue(buffer, offset);
967
- offset += result.len;
968
- var errorCode = baAsn1.decodeEnumerated(buffer, offset, result.value);
969
- offset += errorClass.len;
970
- return {
971
- len: offset - orgOffset,
972
- class: errorClass.value,
973
- code: errorCode.value
974
- };
975
- };
976
-
977
- module.exports.encodeSubscribeCOV = function(buffer, subscriberProcessId, monitoredObjectId, cancellationRequest, issueConfirmedNotifications, lifetime) {
978
- baAsn1.encodeContextUnsigned(buffer, 0, subscriberProcessId);
979
- baAsn1.encodeContextObjectId(buffer, 1, monitoredObjectId.type, monitoredObjectId.instance);
980
- if (!cancellationRequest) {
981
- baAsn1.encodeContextBoolean(buffer, 2, issueConfirmedNotifications);
982
- baAsn1.encodeContextUnsigned(buffer, 3, lifetime);
983
- }
984
- };
985
-
986
- module.exports.decodeSubscribeCOV = function(buffer, offset, apduLen) {
987
- var len = 0;
988
- var value = {};
989
- var result;
990
- var decodedValue;
991
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
992
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
993
- len += result.len;
994
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
995
- len += decodedValue.len;
996
- value.subscriberProcessId = decodedValue.value;
997
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
998
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
999
- len += result.len;
1000
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1001
- len += decodedValue.len;
1002
- value.monitoredObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1003
- value.cancellationRequest = true;
1004
- if (len < apduLen) {
1005
- value.issueConfirmedNotifications = false;
1006
- if (baAsn1.decodeIsContextTag(buffer, offset + len, 2)) {
1007
- value.cancellationRequest = false;
1008
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1009
- len += result.len;
1010
- value.issueConfirmedNotifications = buffer[offset + len] > 0;
1011
- len++;
1012
- }
1013
- value.lifetime = 0;
1014
- if (baAsn1.decodeIsContextTag(buffer, offset + len, 3)) {
1015
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1016
- len += result.len;
1017
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1018
- len += decodedValue.len;
1019
- value.lifetime = decodedValue.value;
1020
- }
1021
- }
1022
- value.len = len;
1023
- return value;
1024
- };
1025
-
1026
- module.exports.encodeSubscribeProperty = function(buffer, subscriberProcessId, monitoredObjectId, cancellationRequest, issueConfirmedNotifications, lifetime, monitoredProperty, covIncrementPresent, covIncrement) {
1027
- baAsn1.encodeContextUnsigned(buffer, 0, subscriberProcessId);
1028
- baAsn1.encodeContextObjectId(buffer, 1, monitoredObjectId.type, monitoredObjectId.instance);
1029
- if (!cancellationRequest) {
1030
- baAsn1.encodeContextBoolean(buffer, 2, issueConfirmedNotifications);
1031
- baAsn1.encodeContextUnsigned(buffer, 3, lifetime);
1032
- }
1033
- baAsn1.encodeOpeningTag(buffer, 4);
1034
- baAsn1.encodeContextEnumerated(buffer, 0, monitoredProperty.id);
1035
- if (monitoredProperty.index !== baAsn1.BACNET_ARRAY_ALL) {
1036
- baAsn1.encodeContextUnsigned(buffer, 1, monitoredProperty.index);
1037
- }
1038
- baAsn1.encodeClosingTag(buffer, 4);
1039
- if (covIncrementPresent) {
1040
- baAsn1.encodeContextReal(buffer, 5, covIncrement);
1041
- }
1042
- };
1043
-
1044
- module.exports.decodeSubscribeProperty = function(buffer, offset) {
1045
- var len = 0;
1046
- var value = {};
1047
- var result;
1048
- var decodedValue;
1049
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
1050
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1051
- len += result.len;
1052
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1053
- len += decodedValue.len;
1054
- value.subscriberProcessId = decodedValue.value;
1055
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
1056
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1057
- len += result.len;
1058
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1059
- len += decodedValue.len;
1060
- value.monitoredObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1061
- value.cancellationRequest = true;
1062
- value.issueConfirmedNotifications = false;
1063
- if (baAsn1.decodeIsContextTag(buffer, offset + len, 2)) {
1064
- value.cancellationRequest = false;
1065
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1066
- len += result.len;
1067
- value.issueConfirmedNotifications = buffer[offset + len] > 0;
1068
- len++;
1069
- }
1070
- value.lifetime = 0;
1071
- if (baAsn1.decodeIsContextTag(buffer, offset + len, 3)) {
1072
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1073
- len += result.len;
1074
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1075
- len += decodedValue.len;
1076
- value.lifetime = decodedValue.value;
1077
- }
1078
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 4)) return;
1079
- len++;
1080
- value.monitoredProperty = {};
1081
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
1082
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1083
- len += result.len;
1084
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1085
- len += decodedValue.len;
1086
- value.monitoredProperty.id = decodedValue.value;
1087
- value.monitoredProperty.index = baAsn1.BACNET_ARRAY_ALL;
1088
- if (baAsn1.decodeIsContextTag(buffer, offset + len, 1)) {
1089
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1090
- len += result.len;
1091
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1092
- len += decodedValue.len;
1093
- value.monitoredProperty.index = decodedValue.value;
1094
- }
1095
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 4)) return;
1096
- len++;
1097
- value.covIncrement = 0;
1098
- if (baAsn1.decodeIsContextTag(buffer, offset + len, 5)) {
1099
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1100
- len += result.len;
1101
- decodedValue = baAsn1.decodeReal(buffer, offset + len);
1102
- len += decodedValue.len;
1103
- value.covIncrement = decodedValue.value;
1104
- }
1105
- value.len = len;
1106
- return value;
1107
- };
1108
-
1109
- module.exports.encodeEventNotifyData = function(buffer, data) {
1110
- baAsn1.encodeContextUnsigned(buffer, 0, data.processId);
1111
- baAsn1.encodeContextObjectId(buffer, 1, data.initiatingObjectId.type, data.initiatingObjectId.instance);
1112
- baAsn1.encodeContextObjectId(buffer, 2, data.eventObjectId.type, data.eventObjectId.instance);
1113
- baAsn1.bacappEncodeContextTimestamp(buffer, 3, data.timeStamp);
1114
- baAsn1.encodeContextUnsigned(buffer, 4, data.notificationClass);
1115
- baAsn1.encodeContextUnsigned(buffer, 5, data.priority);
1116
- baAsn1.encodeContextEnumerated(buffer, 6, data.eventType);
1117
- if (data.messageText && data.messageText !== '') {
1118
- baAsn1.encodeContextCharacterString(buffer, 7, data.messageText);
1119
- }
1120
- baAsn1.encodeContextEnumerated(buffer, 8, data.notifyType);
1121
- switch (data.notifyType) {
1122
- case baEnum.NotifyTypes.NOTIFY_ALARM:
1123
- case baEnum.NotifyTypes.NOTIFY_EVENT:
1124
- baAsn1.encodeContextBoolean(buffer, 9, data.ackRequired);
1125
- baAsn1.encodeContextEnumerated(buffer, 10, data.fromState);
1126
- break;
1127
- default:
1128
- break;
1129
- }
1130
- baAsn1.encodeContextEnumerated(buffer, 11, data.toState);
1131
- switch (data.notifyType) {
1132
- case baEnum.NotifyTypes.NOTIFY_ALARM:
1133
- case baEnum.NotifyTypes.NOTIFY_EVENT:
1134
- baAsn1.encodeOpeningTag(buffer, 12);
1135
- switch (data.eventType) {
1136
- case baEnum.EventTypes.EVENT_CHANGE_OF_BITSTRING:
1137
- baAsn1.encodeOpeningTag(buffer, 0);
1138
- baAsn1.encodeContextBitstring(buffer, 0, data.changeOfBitstringReferencedBitString);
1139
- baAsn1.encodeContextBitstring(buffer, 1, data.changeOfBitstringStatusFlags);
1140
- baAsn1.encodeClosingTag(buffer, 0);
1141
- break;
1142
- case baEnum.EventTypes.EVENT_CHANGE_OF_STATE:
1143
- baAsn1.encodeOpeningTag(buffer, 1);
1144
- baAsn1.encodeOpeningTag(buffer, 0);
1145
- baAsn1.bacappEncodePropertyState(buffer, data.changeOfStateNewState);
1146
- baAsn1.encodeClosingTag(buffer, 0);
1147
- baAsn1.encodeContextBitstring(buffer, 1, data.changeOfStateStatusFlags);
1148
- baAsn1.encodeClosingTag(buffer, 1);
1149
- break;
1150
- case baEnum.EventTypes.EVENT_CHANGE_OF_VALUE:
1151
- baAsn1.encodeOpeningTag(buffer, 2);
1152
- baAsn1.encodeOpeningTag(buffer, 0);
1153
- switch (data.changeOfValueTag) {
1154
- case baEnum.COVTypes.CHANGE_OF_VALUE_REAL:
1155
- baAsn1.encodeContextReal(buffer, 1, data.changeOfValueChangeValue);
1156
- break;
1157
- case baEnum.COVTypes.CHANGE_OF_VALUE_BITS:
1158
- baAsn1.encodeContextBitstring(buffer, 0, data.changeOfValueChangedBits);
1159
- break;
1160
- default:
1161
- throw new Error('NotImplemented');
1162
- }
1163
- baAsn1.encodeClosingTag(buffer, 0);
1164
- baAsn1.encodeContextBitstring(buffer, 1, data.changeOfValueStatusFlags);
1165
- baAsn1.encodeClosingTag(buffer, 2);
1166
- break;
1167
- case baEnum.EventTypes.EVENT_FLOATING_LIMIT:
1168
- baAsn1.encodeOpeningTag(buffer, 4);
1169
- baAsn1.encodeContextReal(buffer, 0, data.floatingLimitReferenceValue);
1170
- baAsn1.encodeContextBitstring(buffer, 1, data.floatingLimitStatusFlags);
1171
- baAsn1.encodeContextReal(buffer, 2, data.floatingLimitSetPointValue);
1172
- baAsn1.encodeContextReal(buffer, 3, data.floatingLimitErrorLimit);
1173
- baAsn1.encodeClosingTag(buffer, 4);
1174
- break;
1175
- case baEnum.EventTypes.EVENT_OUT_OF_RANGE:
1176
- baAsn1.encodeOpeningTag(buffer, 5);
1177
- baAsn1.encodeContextReal(buffer, 0, data.outOfRangeExceedingValue);
1178
- baAsn1.encodeContextBitstring(buffer, 1, data.outOfRangeStatusFlags);
1179
- baAsn1.encodeContextReal(buffer, 2, data.outOfRangeDeadband);
1180
- baAsn1.encodeContextReal(buffer, 3, data.outOfRangeExceededLimit);
1181
- baAsn1.encodeClosingTag(buffer, 5);
1182
- break;
1183
- case baEnum.EventTypes.EVENT_CHANGE_OF_LIFE_SAFETY:
1184
- baAsn1.encodeOpeningTag(buffer, 8);
1185
- baAsn1.encodeContextEnumerated(buffer, 0, data.changeOfLifeSafetyNewState);
1186
- baAsn1.encodeContextEnumerated(buffer, 1, data.changeOfLifeSafetyNewMode);
1187
- baAsn1.encodeContextBitstring(buffer, 2, data.changeOfLifeSafetyStatusFlags);
1188
- baAsn1.encodeContextEnumerated(buffer, 3, data.changeOfLifeSafetyOperationExpected);
1189
- baAsn1.encodeClosingTag(buffer, 8);
1190
- break;
1191
- case baEnum.EventTypes.EVENT_BUFFER_READY:
1192
- baAsn1.encodeOpeningTag(buffer, 10);
1193
- baAsn1.bacappEncodeContextDeviceObjPropertyRef(buffer, 0, data.bufferReadyBufferProperty);
1194
- baAsn1.encodeContextUnsigned(buffer, 1, data.bufferReadyPreviousNotification);
1195
- baAsn1.encodeContextUnsigned(buffer, 2, data.bufferReadyCurrentNotification);
1196
- baAsn1.encodeClosingTag(buffer, 10);
1197
- break;
1198
- case baEnum.EventTypes.EVENT_UNSIGNED_RANGE:
1199
- baAsn1.encodeOpeningTag(buffer, 11);
1200
- baAsn1.encodeContextUnsigned(buffer, 0, data.unsignedRangeExceedingValue);
1201
- baAsn1.encodeContextBitstring(buffer, 1, data.unsignedRangeStatusFlags);
1202
- baAsn1.encodeContextUnsigned(buffer, 2, data.unsignedRangeExceededLimit);
1203
- baAsn1.encodeClosingTag(buffer, 11);
1204
- break;
1205
- case baEnum.EventTypes.EVENT_EXTENDED:
1206
- case baEnum.EventTypes.EVENT_COMMAND_FAILURE:
1207
- throw new Error('NotImplemented');
1208
- default:
1209
- throw new Error('NotImplemented');
1210
- }
1211
- baAsn1.encodeClosingTag(buffer, 12);
1212
- break;
1213
- case baEnum.NotifyTypes.NOTIFY_ACK_NOTIFICATION:
1214
- throw new Error('NotImplemented');
1215
- default:
1216
- break;
1217
- }
1218
- };
1219
-
1220
- module.exports.decodeEventNotifyData = function(buffer, offset) {
1221
- var len = 0;
1222
- var result;
1223
- var decodedValue;
1224
- var eventData = {};
1225
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
1226
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1227
- len += result.len;
1228
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1229
- len += decodedValue.len;
1230
- eventData.processId = decodedValue.value;
1231
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
1232
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1233
- len += result.len;
1234
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1235
- len += decodedValue.len;
1236
- eventData.initiatingObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1237
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 2)) return;
1238
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1239
- len += result.len;
1240
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1241
- len += decodedValue.len;
1242
- eventData.eventObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1243
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 3)) return;
1244
- len += 2;
1245
- decodedValue = baAsn1.decodeApplicationDate(buffer, offset + len);
1246
- len += decodedValue.len;
1247
- var date = decodedValue.value.value;
1248
- decodedValue = baAsn1.decodeApplicationTime(buffer, offset + len);
1249
- len += decodedValue.len;
1250
- var time = decodedValue.value.value;
1251
- eventData.timeStamp = {};
1252
- eventData.timeStamp = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
1253
- len += 2;
1254
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 4)) return;
1255
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1256
- len += result.len;
1257
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1258
- len += decodedValue.len;
1259
- eventData.notificationClass = decodedValue.value;
1260
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 5)) return;
1261
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1262
- len += result.len;
1263
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1264
- len += decodedValue.len;
1265
- eventData.priority = decodedValue.value;
1266
- if (eventData.priority > 0xFF) return;
1267
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 6)) return;
1268
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1269
- len += result.len;
1270
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1271
- len += decodedValue.len;
1272
- eventData.eventType = decodedValue.value;
1273
- if (baAsn1.decodeIsContextTag(buffer, offset + len, 7)) {
1274
- decodedValue = baAsn1.decodeContextCharacterString(buffer, offset + len, 20000, 7);
1275
- len += decodedValue.len;
1276
- eventData.messageText = decodedValue.value;
1277
- }
1278
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 8)) return;
1279
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1280
- len += result.len;
1281
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1282
- len += decodedValue.len;
1283
- eventData.notifyType = decodedValue.value;
1284
- switch (eventData.notifyType) {
1285
- case baEnum.NotifyTypes.NOTIFY_ALARM:
1286
- case baEnum.NotifyTypes.NOTIFY_EVENT:
1287
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1288
- len += result.len;
1289
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, 1);
1290
- len += decodedValue.len;
1291
- eventData.ackRequired = (decodedValue.value > 0);
1292
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 10)) return;
1293
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1294
- len += result.len;
1295
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1296
- len += decodedValue.len;
1297
- eventData.fromState = decodedValue.value;
1298
- break;
1299
- default:
1300
- break;
1301
- }
1302
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 11)) return;
1303
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1304
- len += result.len;
1305
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1306
- len += decodedValue.len;
1307
- eventData.toState = decodedValue.value;
1308
- eventData.len = len;
1309
- return eventData;
1310
- };
1311
-
1312
- module.exports.encodeReadRangeAcknowledge = function(buffer, objectId, propertyId, arrayIndex, resultFlags, itemCount, applicationData, requestType, firstSequence) {
1313
- baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance);
1314
- baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
1315
- if (arrayIndex === baAsn1.BACNET_ARRAY_ALL) {
1316
- baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex);
1317
- }
1318
- baAsn1.encodeContextBitstring(buffer, 3, resultFlags);
1319
- baAsn1.encodeContextUnsigned(buffer, 4, itemCount);
1320
- baAsn1.encodeOpeningTag(buffer, 5);
1321
- if (itemCount !== 0) {
1322
- applicationData.copy(buffer.buffer, buffer.offset, 0, applicationData.length);
1323
- buffer.offset += applicationData.length;
1324
- }
1325
- baAsn1.encodeClosingTag(buffer, 5);
1326
- if ((itemCount !== 0) && (requestType !== baEnum.ReadRangeRequestTypes.RR_BY_POSITION) && (requestType !== baEnum.ReadRangeRequestTypes.RR_READ_ALL)) {
1327
- baAsn1.encodeContextUnsigned(buffer, 6, firstSequence);
1328
- }
1329
- };
1330
-
1331
- module.exports.decodeReadRangeAcknowledge = function(buffer, offset, apduLen) {
1332
- var len = 0;
1333
- var result;
1334
- var decodedValue;
1335
- var resultFlag;
1336
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
1337
- len++;
1338
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1339
- len += decodedValue.len;
1340
- var objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1341
- var property = {};
1342
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1343
- len += result.len;
1344
- if (result.tagNumber !== 1) return;
1345
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1346
- len += decodedValue.len;
1347
- property.id = decodedValue.value;
1348
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1349
- len += result.len;
1350
- if ((result.tagNumber === 2) && (len < apduLen)) {
1351
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1352
- len += decodedValue.len;
1353
- property.index = decodedValue.value;
1354
- } else {
1355
- decodedValue = baAsn1.decodeBitstring(buffer, offset + len, 2);
1356
- len += decodedValue.len;
1357
- resultFlag = decodedValue.value;
1358
- }
1359
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1360
- len += result.len;
1361
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1362
- len += decodedValue.len;
1363
- var itemCount = decodedValue.value;
1364
- if (!(baAsn1.decodeIsOpeningTag(buffer, offset + len))) return;
1365
- len += 1;
1366
- var rangeBuffer = buffer.slice(offset + len, buffer.length - offset - len - 1);
1367
- return {
1368
- len: len,
1369
- itemCount: itemCount,
1370
- rangeBuffer: rangeBuffer
1371
- };
1372
- };
1373
-
1374
- module.exports.decodeDeleteObject = function(buffer, offset, apduLen) {
1375
- var result = baAsn1.decodeTagNumberAndValue(buffer, offset);
1376
- if (result.tagNumber !== 12) return;
1377
- var len = 1;
1378
- var value = baAsn1.decodeObjectId(buffer, offset + len);
1379
- len += value.len;
1380
- if (len !== apduLen) return;
1381
- value.len = len;
1382
- return value;
1383
- };
1384
-
1385
- module.exports.encodeDeleteObject = function(buffer, objectId) {
1386
- baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance);
1387
- };
1388
-
1389
- module.exports.encodeCreateObject = function(buffer, objectId, values) {
1390
- baAsn1.encodeOpeningTag(buffer, 0);
1391
- baAsn1.encodeContextObjectId(buffer, 1, objectId.type, objectId.instance);
1392
- baAsn1.encodeClosingTag(buffer, 0);
1393
- baAsn1.encodeOpeningTag(buffer, 1);
1394
- values.forEach(function(propertyValue) {
1395
- baAsn1.encodeContextEnumerated(buffer, 0, propertyValue.property.id);
1396
- if (propertyValue.property.index !== baAsn1.BACNET_ARRAY_ALL) {
1397
- baAsn1.encodeContextUnsigned(buffer, 1, propertyValue.property.index);
1398
- }
1399
- baAsn1.encodeOpeningTag(buffer, 2);
1400
- propertyValue.value.forEach(function(value) {
1401
- baAsn1.bacappEncodeApplicationData(buffer, value);
1402
- });
1403
- baAsn1.encodeClosingTag(buffer, 2);
1404
- if (propertyValue.priority !== baAsn1.BACNET_NO_PRIORITY) {
1405
- baAsn1.encodeContextUnsigned(buffer, 3, propertyValue.priority);
1406
- }
1407
- });
1408
- baAsn1.encodeClosingTag(buffer, 1);
1409
- };
1410
-
1411
- module.exports.decodeCreateObject = function(buffer, offset, apduLen) {
1412
- var len = 0;
1413
- var result;
1414
- var decodedValue;
1415
- var objectId;
1416
- var valueList = [];
1417
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1418
- len += result.len;
1419
- if ((result.tagNumber === 0) && (apduLen > len)) {
1420
- apduLen -= len;
1421
- if (apduLen < 4) return;
1422
- decodedValue = baAsn1.decodeContextObjectId(buffer, offset + len, 1);
1423
- len += decodedValue.len;
1424
- objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1425
- } else {
1426
- return;
1427
- }
1428
- if (baAsn1.decodeIsClosingTag(buffer, offset + len)) {
1429
- len++;
1430
- }
1431
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) return;
1432
- len++;
1433
- while ((apduLen - len) > 1) {
1434
- var newEntry = {};
1435
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1436
- len += result.len;
1437
- if (result.tagNumber !== 0) return;
1438
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1439
- len += decodedValue.len;
1440
- var propertyId = decodedValue.value;
1441
- var arraIndex = baAsn1.BACNET_ARRAY_ALL;
1442
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1443
- len += result.len;
1444
- if (result.tagNumber === 1) {
1445
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1446
- len += decodedValue.len;
1447
- arraIndex += decodedValue.value;
1448
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1449
- len += result.len;
1450
- }
1451
- newEntry.property = {id: propertyId, index: arraIndex};
1452
- if ((result.tagNumber === 2) && (baAsn1.decodeIsOpeningTag(buffer, offset + len - 1))) {
1453
- var values = [];
1454
- while (!baAsn1.decodeIsClosingTag(buffer, offset + len)) {
1455
- decodedValue = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, objectId.type, propertyId);
1456
- if (!decodedValue) return;
1457
- len += decodedValue.len;
1458
- delete decodedValue.len;
1459
- values.push(decodedValue);
1460
- }
1461
- len++;
1462
- newEntry.value = values;
1463
- } else {
1464
- return;
1465
- }
1466
- valueList.push(newEntry);
1467
- }
1468
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) return;
1469
- len++;
1470
- return {
1471
- len: len,
1472
- objectId: objectId,
1473
- values: valueList
1474
- };
1475
- };
1476
-
1477
- module.exports.encodeCOVNotify = function(buffer, subscriberProcessId, initiatingDeviceId, monitoredObjectId, timeRemaining, values) {
1478
- baAsn1.encodeContextUnsigned(buffer, 0, subscriberProcessId);
1479
- baAsn1.encodeContextObjectId(buffer, 1, baEnum.ObjectTypes.OBJECT_DEVICE, initiatingDeviceId);
1480
- baAsn1.encodeContextObjectId(buffer, 2, monitoredObjectId.type, monitoredObjectId.instance);
1481
- baAsn1.encodeContextUnsigned(buffer, 3, timeRemaining);
1482
- baAsn1.encodeOpeningTag(buffer, 4);
1483
- values.forEach(function(value) {
1484
- baAsn1.encodeContextEnumerated(buffer, 0, value.property.id);
1485
- if (value.property.index === baAsn1.BACNET_ARRAY_ALL) {
1486
- baAsn1.encodeContextUnsigned(buffer, 1, value.property.index);
1487
- }
1488
- baAsn1.encodeOpeningTag(buffer, 2);
1489
- value.value.forEach(function(v) {
1490
- baAsn1.bacappEncodeApplicationData(buffer, v);
1491
- });
1492
- baAsn1.encodeClosingTag(buffer, 2);
1493
- if (value.priority === baAsn1.BACNET_NO_PRIORITY) {
1494
- baAsn1.encodeContextUnsigned(buffer, 3, value.priority);
1495
- }
1496
- // TODO: Handle to too large telegrams -> ADPU limit
1497
- });
1498
- baAsn1.encodeClosingTag(buffer, 4);
1499
- };
1500
-
1501
- module.exports.decodeCOVNotify = function(buffer, offset, apduLen) {
1502
- var len = 0;
1503
- var result;
1504
- var decodedValue;
1505
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
1506
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1507
- len += result.len;
1508
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1509
- len += decodedValue.len;
1510
- var subscriberProcessId = decodedValue.value;
1511
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
1512
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1513
- len += result.len;
1514
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1515
- len += decodedValue.len;
1516
- var initiatingDeviceId = {type: decodedValue.objectType, instance: decodedValue.instance};
1517
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 2)) return;
1518
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1519
- len += result.len;
1520
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1521
- len += decodedValue.len;
1522
- var monitoredObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1523
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 3)) return;
1524
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1525
- len += result.len;
1526
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1527
- len += decodedValue.len;
1528
- var timeRemaining = decodedValue.value;
1529
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 4)) return;
1530
- len++;
1531
- var values = [];
1532
- while ((apduLen - len) > 1 && !baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 4)) {
1533
- var newEntry = {};
1534
- newEntry.property = {};
1535
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
1536
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1537
- len += result.len;
1538
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1539
- len += decodedValue.len;
1540
- newEntry.property.id = decodedValue.value;
1541
- if (baAsn1.decodeIsContextTag(buffer, offset + len, 1)) {
1542
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1543
- len += result.len;
1544
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1545
- len += decodedValue.len;
1546
- newEntry.property.index = decodedValue.value;
1547
- } else {
1548
- newEntry.property.index = baAsn1.BACNET_ARRAY_ALL;
1549
- }
1550
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 2)) return;
1551
- len++;
1552
- var properties = [];
1553
- while ((apduLen - len) > 1 && !baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 2)) {
1554
- decodedValue = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, monitoredObjectId.type, newEntry.property.id);
1555
- if (!decodedValue) return;
1556
- len += decodedValue.len;
1557
- delete decodedValue.len;
1558
- properties.push(decodedValue);
1559
- }
1560
- newEntry.value = properties;
1561
- len++;
1562
- if (baAsn1.decodeIsContextTag(buffer, offset + len, 3)) {
1563
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1564
- len += result.len;
1565
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1566
- len += decodedValue.len;
1567
- newEntry.priority = decodedValue.value;
1568
- } else {
1569
- newEntry.priority = baAsn1.BACNET_NO_PRIORITY;
1570
- }
1571
- values.push(newEntry);
1572
- }
1573
- return {
1574
- len: len,
1575
- subscriberProcessId: subscriberProcessId,
1576
- initiatingDeviceId: initiatingDeviceId,
1577
- monitoredObjectId: monitoredObjectId,
1578
- timeRemaining: timeRemaining,
1579
- values: values
1580
- };
1581
- };
1582
-
1583
- module.exports.encodeAlarmSummary = function(buffer, alarms) {
1584
- alarms.forEach(function(alarm) {
1585
- baAsn1.encodeContextObjectId(buffer, 12, alarm.objectId.type, alarm.objectId.instance);
1586
- baAsn1.encodeContextEnumerated(buffer, 9, alarm.alarmState);
1587
- baAsn1.encodeContextBitstring(buffer, 8, alarm.acknowledgedTransitions);
1588
- });
1589
- };
1590
-
1591
- module.exports.decodeAlarmSummary = function(buffer, offset, apduLen) {
1592
- var len = 0;
1593
- var result;
1594
- var decodedValue;
1595
- var alarms = [];
1596
- while ((apduLen - 3 - len) > 0) {
1597
- var value = {};
1598
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1599
- len += result.len;
1600
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1601
- len += decodedValue.len;
1602
- value.objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1603
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1604
- len += result.len;
1605
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1606
- len += decodedValue.len;
1607
- value.alarmState = decodedValue.value;
1608
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1609
- len += result.len;
1610
- decodedValue = baAsn1.decodeBitstring(buffer, offset + len, result.value);
1611
- len += decodedValue.len;
1612
- value.acknowledgedTransitions = decodedValue.value;
1613
- alarms.push(value);
1614
- }
1615
- return {
1616
- len: len,
1617
- alarms: alarms
1618
- };
1619
- };
1620
-
1621
- module.exports.encodeAlarmAcknowledge = function(buffer, ackProcessId, eventObjectId, eventStateAcknowledged, ackSource, eventTimeStamp, ackTimeStamp) {
1622
- baAsn1.encodeContextUnsigned(buffer, 0, ackProcessId);
1623
- baAsn1.encodeContextObjectId(buffer, 1, eventObjectId.type, eventObjectId.instance);
1624
- baAsn1.encodeContextEnumerated(buffer, 2, eventStateAcknowledged);
1625
- baAsn1.bacappEncodeContextTimestamp(buffer, 3, eventTimeStamp);
1626
- baAsn1.encodeContextCharacterString(buffer, 4, ackSource);
1627
- baAsn1.bacappEncodeContextTimestamp(buffer, 5, ackTimeStamp);
1628
- };
1629
-
1630
- module.exports.decodeAlarmAcknowledge = function(buffer, offset, apduLen) {
1631
- var len = 0;
1632
- var value = {};
1633
- var result;
1634
- var decodedValue;
1635
- var date;
1636
- var time;
1637
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1638
- len += result.len;
1639
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1640
- len += decodedValue.len;
1641
- value.acknowledgedProcessId = decodedValue.value;
1642
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1643
- len += result.len;
1644
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1645
- len += decodedValue.len;
1646
- value.eventObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1647
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1648
- len += result.len;
1649
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1650
- len += decodedValue.len;
1651
- value.eventStateAcknowledged = decodedValue.value;
1652
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1653
- len += result.len;
1654
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1655
- len += result.len;
1656
- if (result.tagNumber === baEnum.TimestampTags.TIME_STAMP_TIME) {
1657
- decodedValue = baAsn1.decodeBacnetTime(buffer, offset + len, result.value);
1658
- len += decodedValue.len;
1659
- value.eventTimeStamp = decodedValue.value;
1660
- } else if (result.tagNumber === baEnum.TimestampTags.TIME_STAMP_SEQUENCE) {
1661
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1662
- len += decodedValue.len;
1663
- value.eventTimeStamp = decodedValue.value;
1664
- } else if (result.tagNumber === baEnum.TimestampTags.TIME_STAMP_DATETIME) {
1665
- date = baAsn1.decodeApplicationDate(buffer, offset + len);
1666
- len += date.len;
1667
- date = date.value.value;
1668
- time = baAsn1.decodeApplicationTime(buffer, offset + len);
1669
- len += time.len;
1670
- time = time.value.value;
1671
- value.eventTimeStamp = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
1672
- len++;
1673
- }
1674
- len++;
1675
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1676
- len += result.len;
1677
- decodedValue = baAsn1.decodeCharacterString(buffer, offset + len, apduLen - (offset + len), result.value);
1678
- value.acknowledgeSource = decodedValue.value;
1679
- len += decodedValue.len;
1680
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1681
- len += result.len;
1682
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1683
- len += result.len;
1684
- if (result.tagNumber === baEnum.TimestampTags.TIME_STAMP_TIME) {
1685
- decodedValue = baAsn1.decodeBacnetTime(buffer, offset + len, result.value);
1686
- len += decodedValue.len;
1687
- value.acknowledgeTimeStamp = decodedValue.value;
1688
- } else if (result.tagNumber === baEnum.TimestampTags.TIME_STAMP_SEQUENCE) {
1689
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1690
- len += decodedValue.len;
1691
- value.acknowledgeTimeStamp = decodedValue.value;
1692
- } else if (result.tagNumber === baEnum.TimestampTags.TIME_STAMP_DATETIME) {
1693
- date = baAsn1.decodeApplicationDate(buffer, offset + len);
1694
- len += date.len;
1695
- date = date.value.value;
1696
- time = baAsn1.decodeApplicationTime(buffer, offset + len);
1697
- len += time.len;
1698
- time = time.value.value;
1699
- value.acknowledgeTimeStamp = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
1700
- len++;
1701
- }
1702
- len++;
1703
- value.len = len;
1704
- return value;
1705
- };
1706
-
1707
- module.exports.encodeEventInformation = function(buffer, events, moreEvents) {
1708
- var i;
1709
- baAsn1.encodeOpeningTag(buffer, 0);
1710
- events.forEach(function(event) {
1711
- baAsn1.encodeContextObjectId(buffer, 0, event.objectId.type, event.objectId.instance);
1712
- baAsn1.encodeContextEnumerated(buffer, 1, event.eventState);
1713
- baAsn1.encodeContextBitstring(buffer, 2, event.acknowledgedTransitions);
1714
- baAsn1.encodeOpeningTag(buffer, 3);
1715
- for (i = 0; i < 3; i++) {
1716
- baAsn1.encodeApplicationDate(buffer, event.eventTimeStamps[i]);
1717
- baAsn1.encodeApplicationTime(buffer, event.eventTimeStamps[i]);
1718
- }
1719
- baAsn1.encodeClosingTag(buffer, 3);
1720
- baAsn1.encodeContextEnumerated(buffer, 4, event.notifyType);
1721
- baAsn1.encodeContextBitstring(buffer, 5, event.eventEnable);
1722
- baAsn1.encodeOpeningTag(buffer, 6);
1723
- for (i = 0; i < 3; i++) {
1724
- baAsn1.encodeApplicationUnsigned(buffer, event.eventPriorities[i]);
1725
- }
1726
- baAsn1.encodeClosingTag(buffer, 6);
1727
- });
1728
- baAsn1.encodeClosingTag(buffer, 0);
1729
- baAsn1.encodeContextBoolean(buffer, 1, moreEvents);
1730
- };
1731
-
1732
- module.exports.decodeEventInformation = function(buffer, offset, apduLen) {
1733
- var len = 0;
1734
- var result;
1735
- var decodedValue;
1736
- len++;
1737
- var alarms = [];
1738
- var moreEvents;
1739
- var i;
1740
- while ((apduLen - 3 - len) > 0) {
1741
- var value = {};
1742
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1743
- len += result.len;
1744
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1745
- len += decodedValue.len;
1746
- value.objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1747
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1748
- len += result.len;
1749
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1750
- len += decodedValue.len;
1751
- value.eventState = decodedValue.value;
1752
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1753
- len += result.len;
1754
- decodedValue = baAsn1.decodeBitstring(buffer, offset + len, result.value);
1755
- len += decodedValue.len;
1756
- value.acknowledgedTransitions = decodedValue.value;
1757
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1758
- len += result.len;
1759
- value.eventTimeStamps = [];
1760
- for (i = 0; i < 3; i++) {
1761
- if (result.tagNumber !== baEnum.ApplicationTags.BACNET_APPLICATION_TAG_NULL) {
1762
- decodedValue = baAsn1.decodeApplicationDate(buffer, offset + len);
1763
- len += decodedValue.len;
1764
- var date = decodedValue.value.value;
1765
- decodedValue = baAsn1.decodeApplicationTime(buffer, offset + len);
1766
- len += decodedValue.len;
1767
- var time = decodedValue.value.value;
1768
- value.eventTimeStamps[i] = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
1769
- } else {
1770
- len += result.value;
1771
- }
1772
- }
1773
- len++;
1774
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1775
- len += result.len;
1776
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1777
- len += decodedValue.len;
1778
- value.notifyType = decodedValue.value;
1779
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1780
- len += result.len;
1781
- decodedValue = baAsn1.decodeBitstring(buffer, offset + len, result.value);
1782
- len += decodedValue.len;
1783
- value.eventEnable = decodedValue.value;
1784
- len++;
1785
- value.eventPriorities = [];
1786
- for (i = 0; i < 3; i++) {
1787
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1788
- len += result.len;
1789
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1790
- len += decodedValue.len;
1791
- value.eventPriorities[i] = decodedValue.value;
1792
- }
1793
- len++;
1794
- alarms.push(value);
1795
- }
1796
- moreEvents = (buffer[apduLen - 1] === 1);
1797
- return {
1798
- len: len,
1799
- alarms: alarms,
1800
- moreEvents: moreEvents
1801
- };
1802
- };
1803
-
1804
- module.exports.encodePrivateTransfer = function(buffer, vendorId, serviceNumber, data) {
1805
- baAsn1.encodeContextUnsigned(buffer, 0, vendorId);
1806
- baAsn1.encodeContextUnsigned(buffer, 1, serviceNumber);
1807
- baAsn1.encodeOpeningTag(buffer, 2);
1808
- for (var i = 0; i < data.length; i++) {
1809
- buffer.buffer[buffer.offset++] = data[i];
1810
- }
1811
- baAsn1.encodeClosingTag(buffer, 2);
1812
- };
1813
-
1814
- module.exports.decodePrivateTransfer = function(buffer, offset, apduLen) {
1815
- var len = 0;
1816
- var result;
1817
- var decodedValue;
1818
- var value = {};
1819
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1820
- len += result.len;
1821
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1822
- len += decodedValue.len;
1823
- value.vendorId = decodedValue.value;
1824
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1825
- len += result.len;
1826
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1827
- len += decodedValue.len;
1828
- value.serviceNumber = decodedValue.value;
1829
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1830
- len += result.len;
1831
- var size = apduLen - (offset + len + 1);
1832
- var data = [];
1833
- for (var i = 0; i < size; i++) {
1834
- data.push(buffer[offset + len++]);
1835
- }
1836
- value.data = data;
1837
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1838
- len += result.len;
1839
- value.len = len;
1840
- return value;
1841
- };
1842
-
1843
- module.exports.encodeGetEventInformation = function(buffer, lastReceivedObjectId) {
1844
- baAsn1.encodeContextObjectId(buffer, 0, lastReceivedObjectId.type, lastReceivedObjectId.instance);
1845
- };
1846
-
1847
- module.exports.decodeGetEventInformation = function(buffer, offset) {
1848
- var len = 0;
1849
- var result;
1850
- var decodedValue;
1851
- var value = {};
1852
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1853
- len += result.len;
1854
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1855
- len += decodedValue.len;
1856
- value.lastReceivedObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1857
- value.len = len;
1858
- return value;
1859
- };
1860
-
1861
- module.exports.encodeIhaveBroadcast = function(buffer, deviceId, objectId, objectName) {
1862
- baAsn1.encodeApplicationObjectId(buffer, deviceId.type, deviceId.instance);
1863
- baAsn1.encodeApplicationObjectId(buffer, objectId.type, objectId.instance);
1864
- baAsn1.encodeApplicationCharacterString(buffer, objectName);
1865
- };
1866
-
1867
- module.exports.decodeIhaveBroadcast = function(buffer, offset, apduLen) {
1868
- var len = 0;
1869
- var result;
1870
- var decodedValue;
1871
- var value = {};
1872
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1873
- len += result.len;
1874
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1875
- len += decodedValue.len;
1876
- value.deviceId = {type: decodedValue.objectType, instance: decodedValue.instance};
1877
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1878
- len += result.len;
1879
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1880
- len += decodedValue.len;
1881
- value.objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1882
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1883
- len += result.len;
1884
- decodedValue = baAsn1.decodeCharacterString(buffer, offset + len, apduLen - (offset + len), result.value);
1885
- len += decodedValue.len;
1886
- value.objectName = decodedValue.value;
1887
- value.len = len;
1888
- return value;
1889
- };
1890
-
1891
- module.exports.encodeLifeSafetyOperation = function(buffer, processId, requestingSource, operation, targetObjectId) {
1892
- baAsn1.encodeContextUnsigned(buffer, 0, processId);
1893
- baAsn1.encodeContextCharacterString(buffer, 1, requestingSource);
1894
- baAsn1.encodeContextEnumerated(buffer, 2, operation);
1895
- baAsn1.encodeContextObjectId(buffer, 3, targetObjectId.type, targetObjectId.instance);
1896
- };
1897
-
1898
- module.exports.decodeLifeSafetyOperation = function(buffer, offset, apduLen) {
1899
- var len = 0;
1900
- var result;
1901
- var decodedValue;
1902
- var value = {};
1903
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1904
- len += result.len;
1905
- decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
1906
- len += decodedValue.len;
1907
- value.processId = decodedValue.value;
1908
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1909
- len += result.len;
1910
- decodedValue = baAsn1.decodeCharacterString(buffer, offset + len, apduLen - (offset + len), result.value);
1911
- len += decodedValue.len;
1912
- value.requestingSource = decodedValue.value;
1913
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1914
- len += result.len;
1915
- decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
1916
- len += decodedValue.len;
1917
- value.operation = decodedValue.value;
1918
- result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
1919
- len += result.len;
1920
- decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
1921
- len += decodedValue.len;
1922
- value.targetObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
1923
- value.len = len;
1924
- return value;
1925
- };
1926
-
1927
- // TODO: Implement decoding for following functions
1928
- module.exports.encodeAddListElement = function(buffer, objectId, propertyId, arrayIndex, values) {
1929
- baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance);
1930
- baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
1931
- if (arrayIndex !== baAsn1.BACNET_ARRAY_ALL) {
1932
- baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex);
1933
- }
1934
- baAsn1.encodeOpeningTag(buffer, 3);
1935
- values.forEach(function(value) {
1936
- baAsn1.bacappEncodeApplicationData(buffer, value);
1937
- });
1938
- baAsn1.encodeClosingTag(buffer, 3);
1939
- };
1940
-
1941
- module.exports.encodeGetEventInformationAcknowledge = function(buffer, events, moreEvents) {
1942
- var i;
1943
- baAsn1.encodeOpeningTag(buffer, 0);
1944
- events.forEach(function(eventData) {
1945
- baAsn1.encodeContextObjectId(buffer, 0, eventData.objectId.type, eventData.objectId.instance);
1946
- baAsn1.encodeContextEnumerated(buffer, 1, eventData.eventState);
1947
- baAsn1.encodeContextBitstring(buffer, 2, eventData.acknowledgedTransitions);
1948
- baAsn1.encodeOpeningTag(buffer, 3);
1949
- for (i = 0; i < 3; i++) {
1950
- baAsn1.bacappEncodeTimestamp(buffer, eventData.eventTimeStamps[i]);
1951
- }
1952
- baAsn1.encodeClosingTag(buffer, 3);
1953
- baAsn1.encodeContextEnumerated(buffer, 4, eventData.notifyType);
1954
- baAsn1.encodeContextBitstring(buffer, 5, eventData.eventEnable);
1955
- baAsn1.encodeOpeningTag(buffer, 6);
1956
- for (i = 0; i < 3; i++) {
1957
- baAsn1.encodeApplicationUnsigned(buffer, eventData.eventPriorities[i]);
1958
- }
1959
- baAsn1.encodeClosingTag(buffer, 6);
1960
- });
1961
- baAsn1.encodeClosingTag(buffer, 0);
1962
- baAsn1.encodeContextBoolean(buffer, 1, moreEvents);
1963
- };