rclnodejs 1.5.2 → 1.6.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 (31) hide show
  1. package/index.js +20 -3
  2. package/lib/message_serialization.js +171 -0
  3. package/lib/node.js +15 -0
  4. package/lib/parameter.js +4 -10
  5. package/lib/subscription.js +16 -1
  6. package/lib/utils.js +287 -0
  7. package/package.json +2 -7
  8. package/prebuilds/linux-arm64/humble-jammy-arm64-rclnodejs.node +0 -0
  9. package/prebuilds/linux-arm64/jazzy-noble-arm64-rclnodejs.node +0 -0
  10. package/prebuilds/linux-arm64/kilted-noble-arm64-rclnodejs.node +0 -0
  11. package/prebuilds/linux-x64/humble-jammy-x64-rclnodejs.node +0 -0
  12. package/prebuilds/linux-x64/jazzy-noble-x64-rclnodejs.node +0 -0
  13. package/prebuilds/linux-x64/kilted-noble-x64-rclnodejs.node +0 -0
  14. package/rosidl_convertor/idl_convertor.js +3 -2
  15. package/rosidl_gen/generate_worker.js +1 -1
  16. package/rosidl_gen/idl_generator.js +11 -24
  17. package/rosidl_gen/index.js +1 -1
  18. package/rosidl_gen/templates/action-template.js +68 -0
  19. package/rosidl_gen/templates/message-template.js +1113 -0
  20. package/rosidl_gen/templates/service-event-template.js +31 -0
  21. package/rosidl_gen/templates/service-template.js +44 -0
  22. package/rosidl_parser/rosidl_parser.js +2 -2
  23. package/third_party/ref-napi/lib/ref.js +0 -45
  24. package/types/index.d.ts +17 -0
  25. package/types/node.d.ts +16 -1
  26. package/rosidl_gen/templates/CMakeLists.dot +0 -40
  27. package/rosidl_gen/templates/action.dot +0 -50
  28. package/rosidl_gen/templates/message.dot +0 -851
  29. package/rosidl_gen/templates/package.dot +0 -16
  30. package/rosidl_gen/templates/service.dot +0 -26
  31. package/rosidl_gen/templates/service_event.dot +0 -10
@@ -1,851 +0,0 @@
1
- // This file is automatically generated by Intel rclnodejs
2
- //
3
- // *** DO NOT EDIT directly
4
- //
5
-
6
- 'use strict';
7
-
8
- {{
9
- let objectWrapper = it.spec.msgName + 'Wrapper';
10
- let arrayWrapper = it.spec.msgName + 'ArrayWrapper';
11
-
12
- let refObjectType = it.spec.msgName + 'RefStruct';
13
- let refObjectArrayType = it.spec.msgName + 'RefStructArray';
14
- let refArrayType = it.spec.msgName + 'RefArray';
15
- const compactMsgDefJSON = JSON.stringify(JSON.parse(it.json));
16
-
17
- if (it.spec.fields.length === 0) {
18
- it.spec.isEmpty = true;
19
- /* Following rosidl_generator_c style, put a bool member named '_dummy' */
20
- it.spec.fields.push({
21
- "type": {
22
- "isArray": false,
23
- "pkgName": null,
24
- "type": "bool",
25
- "isDynamicArray": false,
26
- "stringUpperBound": null,
27
- "isUpperBound": false,
28
- "isPrimitiveType": true,
29
- "isFixedSizeArray": false,
30
- "arraySize": null
31
- },
32
- "name": "_dummy"
33
- });
34
- }
35
-
36
- function getPrimitiveNameByType(type) {
37
- if (type.type === 'bool') {
38
- return 'Bool';
39
- } else if (type.type === 'int8') {
40
- return 'Int8';
41
- } else if (type.type === 'uint8') {
42
- return 'UInt8';
43
- } else if (type.type === 'int16') {
44
- return 'Int16';
45
- } else if (type.type === 'uint16') {
46
- return 'UInt16';
47
- } else if (type.type === 'int32') {
48
- return 'Int32';
49
- } else if (type.type === 'uint32') {
50
- return 'UInt32';
51
- } else if (type.type === 'int64') {
52
- return 'Int64';
53
- } else if (type.type === 'uint64') {
54
- return 'UInt64';
55
- } else if (type.type === 'float64') {
56
- return 'Float64';
57
- } else if (type.type === 'float32') {
58
- return 'Float32';
59
- } else if (type.type === 'char') {
60
- return 'Char';
61
- } else if (type.type === 'byte') {
62
- return 'Byte';
63
- } else if (type.type === 'string' || type.type === 'wstring') {
64
- return 'String';
65
- } else {
66
- return '';
67
- }
68
- }
69
-
70
- function getTypedArrayName(type) {
71
- const t = type.type.toLowerCase();
72
- let typedArrayName = null;
73
-
74
- switch (t) {
75
- case 'byte':
76
- case 'octet':
77
- case 'uint8':
78
- typedArrayName = 'Uint8Array';
79
- break;
80
- case 'char':
81
- case 'int8':
82
- typedArrayName = 'Int8Array';
83
- break;
84
- case 'int16':
85
- case 'short':
86
- typedArrayName = 'Int16Array';
87
- break;
88
- case 'uint16':
89
- case 'unsigned short':
90
- typedArrayName = 'Uint16Array';
91
- break;
92
- case 'int32':
93
- case 'long':
94
- typedArrayName = 'Int32Array';
95
- break;
96
- case 'uint32':
97
- case 'unsigned long':
98
- typedArrayName = 'Uint32Array';
99
- break;
100
- case 'float':
101
- case 'float32':
102
- typedArrayName = 'Float32Array';
103
- break;
104
- case 'double':
105
- case 'float64':
106
- typedArrayName = 'Float64Array';
107
- break;
108
- default:
109
- typedArrayName = '';
110
- }
111
- return typedArrayName;
112
- }
113
-
114
- function getTypedArrayElementName(type) {
115
- const t = type.type.toLowerCase();
116
- if (t === 'int8') {
117
- return 'int8';
118
- } else if (t === 'uint8') {
119
- return 'uint8';
120
- } else if (t === 'int16') {
121
- return 'int16';
122
- } else if (t === 'uint16') {
123
- return 'uint16';
124
- } else if (t === 'int32') {
125
- return 'int32';
126
- } else if (t === 'uint32') {
127
- return 'uint32';
128
- } else if (t === 'float64') {
129
- return 'double';
130
- } else if (t === 'float32') {
131
- return 'float';
132
- } else if (t === 'char') {
133
- return 'int8';
134
- } else if (t === 'byte') {
135
- return 'uint8';
136
- } else {
137
- return '';
138
- }
139
- }
140
-
141
- const primitiveBaseType = ['Bool', 'Int8', 'UInt8', 'Int16', 'UInt16', 'Int32', 'UInt32',
142
- 'Int64', 'UInt64', 'Float64', 'Float32', 'Char', 'Byte', 'String'];
143
- const typedArrayType = ['int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32',
144
- 'float64', 'float32', 'char', 'byte'];
145
-
146
- let existedModules = [];
147
-
148
- function isExisted(requiredModule) {
149
- return existedModules.indexOf(requiredModule) !== -1;
150
- }
151
-
152
- function isPrimitivePackage(baseType) {
153
- return primitiveBaseType.indexOf(baseType.type) !== -1;
154
- }
155
-
156
- function isTypedArrayType(type) {
157
- return typedArrayType.indexOf(type.type.toLowerCase()) !== -1;
158
- }
159
-
160
- function isBigInt(type) {
161
- return ['int64', 'uint64'].indexOf(type.type.toLowerCase()) !== -1;
162
- }
163
-
164
- const willUseTypedArray = isTypedArrayType(it.spec.baseType);
165
- const currentTypedArray = getTypedArrayName(it.spec.baseType);
166
- const currentTypedArrayElementType = getTypedArrayElementName(it.spec.baseType);
167
-
168
- function shouldRequire(baseType, fieldType) {
169
- let requiredModule = '{{=getPackageNameByType(fieldType)}}/{{=getModulePathByType(fieldType)}}';
170
- let shouldRequire = !isPrimitivePackage(baseType) && (fieldType.isArray || !fieldType.isPrimitiveType || fieldType.type === 'string');
171
-
172
- if (shouldRequire && !isExisted(requiredModule)) {
173
- existedModules.push(requiredModule);
174
- return true;
175
- } else {
176
- return false;
177
- }
178
- }
179
-
180
- function getWrapperNameByType(type) {
181
- if (type.isPrimitiveType) {
182
- return getPrimitiveNameByType(type) + 'Wrapper';
183
- } else {
184
- return type.type + 'Wrapper';
185
- }
186
- }
187
-
188
- function getModulePathByType(type, messageInfo) {
189
- if (type.isPrimitiveType) {
190
- return 'std_msgs__msg__' + getPrimitiveNameByType(type) + '.js';
191
- }
192
-
193
- if (
194
- messageInfo &&
195
- messageInfo.subFolder === 'action' &&
196
- messageInfo.pkgName === type.pkgName &&
197
- (type.type.endsWith('_Goal') || type.type.endsWith('_Result') || type.type.endsWith('_Feedback'))
198
- ) {
199
- return type.pkgName + '__action__' + type.type + '.js';
200
- }
201
-
202
- /* We should use '__msg__' to require "service_msgs/msg/ServiceEventInfo.msg" for service event message. */
203
- if (messageInfo && messageInfo.isServiceEvent && (type.type !== 'ServiceEventInfo')) {
204
- return type.pkgName + `__${it.spec.subFolder}__` + type.type + '.js';
205
- }
206
- return type.pkgName + '__msg__' + type.type + '.js';
207
- }
208
-
209
- function getPackageNameByType(type) {
210
- if (type.isPrimitiveType) {
211
- return 'std_msgs';
212
- } else {
213
- return type.pkgName;
214
- }
215
- }
216
-
217
- function extractMemberNames(fields) {
218
- let memberNames = [];
219
- fields.forEach(field => {
220
- memberNames.push(field.name);
221
- });
222
- return JSON.stringify(memberNames);
223
- }
224
- }}
225
-
226
- {{? willUseTypedArray}}
227
- const rclnodejs = require('../../lib/native_loader.js');
228
- {{?}}
229
- const ref = require('../../third_party/ref-napi');
230
- const StructType = require('@rclnodejs/ref-struct-di')(ref);
231
- const ArrayType = require('@rclnodejs/ref-array-di')(ref);
232
- const primitiveTypes = require('../../rosidl_gen/primitive_types.js');
233
- const deallocator = require('../../rosidl_gen/deallocator.js');
234
- const translator = require('../../rosidl_gen/message_translator.js');
235
-
236
- {{~ it.spec.fields :field}}
237
- {{? shouldRequire(it.spec.baseType, field.type)}}
238
- const {{=getWrapperNameByType(field.type)}} = require('../../generated/{{=getPackageNameByType(field.type)}}/{{=getModulePathByType(field.type, it.messageInfo)}}');
239
- {{?}}
240
- {{~}}
241
-
242
- {{? it.spec.msgName === 'String'}}
243
- const {{=refObjectType}} = primitiveTypes.string;
244
- {{??}}
245
- const {{=refObjectType}} = StructType({
246
- {{~ it.spec.fields :field}}
247
- {{? field.type.isPrimitiveType && !field.type.isArray}}
248
- {{=field.name}}: primitiveTypes.{{=field.type.type}},
249
- {{?? field.type.isPrimitiveType && field.type.isArray && field.type.isFixedSizeArray}}
250
- {{=field.name}}: ArrayType(primitiveTypes.{{=field.type.type}}, {{=field.type.arraySize}}),
251
- {{?? !field.type.isPrimitiveType && field.type.isArray && field.type.isFixedSizeArray}}
252
- {{=field.name}}: ArrayType({{=getWrapperNameByType(field.type)}}.refObjectType, {{=field.type.arraySize}}),
253
- {{?? field.type.isArray}}
254
- {{=field.name}}: {{=getWrapperNameByType(field.type)}}.refObjectArrayType,
255
- {{??}}
256
- {{=field.name}}: {{=getWrapperNameByType(field.type)}}.refObjectType,
257
- {{?}}
258
- {{~}}
259
- });
260
- {{?}}
261
-
262
- const {{=refArrayType}} = ArrayType({{=refObjectType}});
263
- const {{=refObjectArrayType}} = StructType({
264
- {{? willUseTypedArray}}
265
- data: ref.refType(ref.types.{{=currentTypedArrayElementType}}),
266
- {{??}}
267
- data: {{=refArrayType}},
268
- {{?}}
269
- size: ref.types.size_t,
270
- capacity: ref.types.size_t
271
- });
272
-
273
- {{/* Define the wrapper class for the message. */}}
274
- class {{=objectWrapper}} {
275
- constructor(other) {
276
- this._initialize();
277
- this._setDefaults();
278
-
279
- {{/* Construct `this` from `other`. */}}
280
- if (typeof other === 'object' && other._refObject) {
281
- this._refObject = new {{=refObjectType}}(other._refObject.toObject());
282
- {{~ it.spec.fields :field}}
283
- {{? field.type.isArray}}
284
- this._wrapperFields.{{=field.name}} = {{=getWrapperNameByType(field.type)}}.createArray();
285
- this._wrapperFields.{{=field.name}}.copy(other._wrapperFields.{{=field.name}});
286
- {{? field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
287
- this.{{=field.name}} = other.{{=field.name}};
288
- {{?}}
289
- {{?? !field.type.isPrimitiveType || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
290
- this._wrapperFields.{{=field.name}} = new {{=getWrapperNameByType(field.type)}}(other._wrapperFields.{{=field.name}});
291
- {{?}}
292
- {{~}}
293
- } else if (typeof other !== 'undefined') {
294
- {{/* Try to construct the message from a plan object of JavaScript. */}}
295
- translator.constructFromPlanObject(this, other);
296
- }
297
- this.freeze(/*own=*/false);
298
- }
299
-
300
- {{/* Set default values if the fields of the message have. */}}
301
- _setDefaults() {
302
- {{~ it.spec.fields :field}}
303
- {{? field.type.isPrimitiveType && !field.type.isArray && field.default_value}}
304
- {{? field.type.type === 'string' || field.type.type === 'wstring'}}
305
- this._refObject.{{=field.name}} = "{{=field.default_value.replace(/"/g, '\\"')}}";
306
- {{??}}
307
- this._refObject.{{=field.name}} = {{=field.default_value}};
308
- {{?}}
309
- {{?? field.type.isPrimitiveType && !isTypedArrayType(field.type) && field.default_value}}
310
- {{? isBigInt(field.type)}}
311
- {{/* For non-TypedArray like int64/uint64. */}}
312
- this._{{=field.name}}Array = {{=JSON.stringify(field.default_value)}}.map(num => BigInt(num));
313
- {{??}}
314
- {{/* For non-TypedArray like bool. */}}
315
- this._{{=field.name}}Array = {{=JSON.stringify(field.default_value)}};
316
- {{?}}
317
- {{?? field.type.isPrimitiveType && isTypedArrayType(field.type) && field.default_value}}
318
- this._wrapperFields.{{=field.name}}.fill({{=getTypedArrayName(field.type)}}.from({{=JSON.stringify(field.default_value)}}));
319
- {{?}}
320
- {{~}}
321
- }
322
-
323
- _initialize() {
324
- this._wrapperFields = {};
325
- this._refObject = new {{=refObjectType}}();
326
- {{~ it.spec.fields :field}}
327
- {{? field.type.isArray}}
328
- this._wrapperFields.{{=field.name}} = {{=getWrapperNameByType(field.type)}}.createArray();
329
- {{? field.type.type === 'string' && field.type.isFixedSizeArray}}
330
- for (let i = 0; i < {{=field.type.arraySize}}; i++) {
331
- primitiveTypes.initString(this._refObject.{{=field.name}}[i]);
332
- }
333
- {{?}}
334
- {{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
335
- this._{{=field.name}}Array = [];
336
- {{?}}
337
- {{?? !field.type.isPrimitiveType || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
338
- this._wrapperFields.{{=field.name}} = new {{=getWrapperNameByType(field.type)}}();
339
- {{?? it.spec.msgName === 'String'}}
340
- primitiveTypes.initString(this._refObject);
341
- {{?}}
342
- {{~}}
343
- }
344
-
345
- static createFromRefObject(refObject) {
346
- let self = new {{=objectWrapper}}();
347
- self.copyRefObject(refObject);
348
- return self;
349
- }
350
-
351
- static createArray() {
352
- return new {{=arrayWrapper}};
353
- }
354
-
355
- static get ArrayType() {
356
- return {{=arrayWrapper}};
357
- }
358
-
359
- static get refObjectArrayType() {
360
- return {{=refObjectArrayType}}
361
- }
362
-
363
- static get refObjectType() {
364
- return {{=refObjectType}};
365
- }
366
-
367
- toRawROS() {
368
- this.freeze(/*own=*/true);
369
- return this._refObject.ref();
370
- }
371
-
372
- {{ /*Assign values to the ref object wrapped by `this`. */ }}
373
- freeze(own) {
374
- {{~ it.spec.fields :field}}
375
- {{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type) && field.type.isFixedSizeArray}}
376
- {{? field.type.type === 'string'}}
377
- for (let i = 0; i < {{=field.type.arraySize}}; i++) {
378
- if (own) {
379
- primitiveTypes.initString(this._refObject.{{=field.name}}[i].ref(), own);
380
- } else {
381
- if (this._{{=field.name}}Array.length === {{=field.type.arraySize}}) {
382
- const value = this._{{=field.name}}Array[i];
383
- this._refObject.{{=field.name}}[i].data = value;
384
- this._refObject.{{=field.name}}[i].size = Buffer.byteLength(value);
385
- this._refObject.{{=field.name}}[i].capacity = Buffer.byteLength(value) + 1;
386
- }
387
- }
388
- }
389
- {{?? isBigInt(field.type)}}
390
- {{/* For non-TypedArray like int64/uint64. */}}
391
- this._refObject.{{=field.name}} = this._{{=field.name}}Array.map(num => num.toString());
392
- {{??}}
393
- {{/* For non-TypedArray like bool. */}}
394
- this._refObject.{{=field.name}} = this._{{=field.name}}Array;
395
- {{?}}
396
- {{?? field.type.isArray && field.type.isPrimitiveType && isTypedArrayType(field.type) && field.type.isFixedSizeArray}}
397
- this._refObject.{{=field.name}} = Array.from(this._wrapperFields.{{=field.name}}.data);
398
- {{?? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
399
- if (own) {
400
- this._wrapperFields.{{=field.name}}.fill([]);
401
- } else {
402
- this._wrapperFields.{{=field.name}}.fill(this._{{=field.name}}Array);
403
- }
404
- this._wrapperFields.{{=field.name}}.freeze(own);
405
- this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
406
- {{?? field.type.isArray && field.type.isPrimitiveType && isTypedArrayType(field.type)}}
407
- if (own) {
408
- this._wrapperFields.{{=field.name}}.fill({{=getTypedArrayName(field.type)}}.from([]));
409
- }
410
- this._wrapperFields.{{=field.name}}.freeze(own);
411
- this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
412
- {{?? field.type.isArray && !field.type.isPrimitiveType && field.type.isFixedSizeArray}}
413
- for (let i = 0; i < {{=field.type.arraySize}}; i++) {
414
- if (this._wrapperFields.{{=field.name}}.data[i]) {
415
- this._wrapperFields.{{=field.name}}.data[i].freeze(own);
416
- this._refObject.{{=field.name}}[i] = this._wrapperFields.{{=field.name}}.data[i].refObject;
417
- }
418
- }
419
- {{?? field.type.isArray || !field.type.isPrimitiveType}}
420
- {{? field.type.isArray}}
421
- if (own) {
422
- this._wrapperFields.{{=field.name}}.fill([]);
423
- }
424
- {{?}}
425
- this._wrapperFields.{{=field.name}}.freeze(own);
426
- this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
427
- {{?? field.type.type === 'string' && it.spec.msgName !== 'String'}}
428
- if (own) {
429
- this._wrapperFields.{{=field.name}}.freeze(own);
430
- }
431
- this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
432
- {{?? it.spec.msgName === 'String'}}
433
- if (own) {
434
- primitiveTypes.initString(this._refObject.ref(), own);
435
- }
436
- {{?}}
437
- {{~}}
438
- }
439
-
440
- serialize() {
441
- this.freeze(/*own=*/false);
442
- return this._refObject.ref();
443
- }
444
-
445
- deserialize(refObject) {
446
- {{~ it.spec.fields :field}}
447
- {{? field.type.isArray && field.type.isPrimitiveType && field.type.isFixedSizeArray && isTypedArrayType(field.type)}}
448
- this._wrapperFields.{{=field.name}}.fill(refObject.{{=field.name}}.toArray());
449
- {{?? field.type.isArray && field.type.isPrimitiveType && field.type.isFixedSizeArray && !isTypedArrayType(field.type)}}
450
- {{? field.type.type === 'string'}}
451
- for (let index = 0; index < {{=field.type.arraySize}}; index++) {
452
- this._{{=field.name}}Array[index] = refObject.{{=field.name}}[index].data;
453
- }
454
- {{??}}
455
- {{/* For non-TypedArray like int64/uint64/bool. */}}
456
- this._{{=field.name}}Array = refObject.{{=field.name}}.toArray();
457
- {{?}}
458
- {{?? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
459
- refObject.{{=field.name}}.data.length = refObject.{{=field.name}}.size;
460
- for (let index = 0; index < refObject.{{=field.name}}.size; index++) {
461
- this._{{=field.name}}Array[index] = refObject.{{=field.name}}.data[index].data;
462
- }
463
- {{?? field.type.isArray && !field.type.isPrimitiveType && field.type.isFixedSizeArray}}
464
- this._refObject.{{=field.name}} = refObject.{{=field.name}};
465
- this._wrapperFields.{{=field.name}}.size = {{=field.type.arraySize}}
466
- for (let i = 0; i < {{=field.type.arraySize}}; i++) {
467
- this._wrapperFields.{{=field.name}}.data[i].copyRefObject(refObject.{{=field.name}}[i]);
468
- }
469
- {{?? field.type.isArray || !field.type.isPrimitiveType}}
470
- this._wrapperFields.{{=field.name}}.copyRefObject(refObject.{{=field.name}});
471
- {{?? field.type.type === 'string' && it.spec.msgName !== 'String'}}
472
- this._wrapperFields.{{=field.name}}.data = refObject.{{=field.name}}.data;
473
- {{?? field.type.isPrimitiveType}}
474
- this._refObject.{{=field.name}} = refObject.{{=field.name}};
475
- {{?}}
476
- {{~}}
477
- }
478
-
479
- toPlainObject(enableTypedArray) {
480
- return translator.toPlainObject(this, enableTypedArray);
481
- }
482
-
483
- static freeStruct(refObject) {
484
- {{~ it.spec.fields :field}}
485
- {{? field.type.isArray && !field.type.isFixedSizeArray}}
486
- if (refObject.{{=field.name}}.size != 0) {
487
- {{=getWrapperNameByType(field.type)}}.ArrayType.freeArray(refObject.{{=field.name}});
488
- {{/* We don't need to free the memory for TypedArray objects, because v8 takes the ownership of it. */}}
489
- if (!{{=getWrapperNameByType(field.type)}}.ArrayType.useTypedArray) {
490
- deallocator.freeStructMember(refObject.{{=field.name}}, {{=getWrapperNameByType(field.type)}}.refObjectArrayType, 'data');
491
- }
492
- }
493
- {{?? field.type.isArray && !field.type.isPrimitiveType && field.type.isFixedSizeArray}}
494
- for (let i = 0; i < {{=field.type.arraySize}}; i++) {
495
- {{=getWrapperNameByType(field.type)}}.freeStruct(refObject.{{=field.name}}[i]);
496
- }
497
- {{?? field.type.isArray && field.type.type === 'string' && field.type.isFixedSizeArray}}
498
- for (let i = 0; i < {{=field.type.arraySize}}; i++) {
499
- {{=getWrapperNameByType(field.type)}}.freeStruct(refObject.{{=field.name}}[i]);
500
- }
501
- {{?? !field.type.isPrimitiveType || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
502
- {{=getWrapperNameByType(field.type)}}.freeStruct(refObject.{{=field.name}});
503
- {{?? it.spec.msgName === 'String'}}
504
- deallocator.freeStructMember(refObject, {{=getWrapperNameByType(field.type)}}.refObjectType, '{{=field.name}}');
505
- {{?}}
506
- {{~}}
507
- }
508
-
509
- static destroyRawROS(msg) {
510
- {{=objectWrapper}}.freeStruct(msg.refObject);
511
- }
512
-
513
- static type() {
514
- return {pkgName: '{{=it.messageInfo.pkgName}}', subFolder: '{{=it.messageInfo.subFolder}}', interfaceName: '{{=it.messageInfo.interfaceName}}'};
515
- }
516
-
517
- static isPrimitive() {
518
- return {{=isPrimitivePackage(it.spec.baseType)}};
519
- }
520
-
521
- static get isROSArray() {
522
- return false;
523
- }
524
-
525
- get refObject() {
526
- return this._refObject;
527
- }
528
-
529
- {{~ it.spec.fields :field}}
530
- get {{=field.name}}() {
531
- {{? field.type.isArray && field.type.type === 'Constants'}}
532
- return [];
533
- {{?? field.type.isArray && isTypedArrayType(field.type)}}
534
- return this._wrapperFields['{{=field.name}}'].data;
535
- {{?? field.type.isArray && field.type.isPrimitiveType}}
536
- return this._{{=field.name}}Array;
537
- {{?? field.type.isArray && !field.type.isPrimitiveType}}
538
- return this._wrapperFields.{{=field.name}};
539
- {{?? !field.type.isPrimitiveType && !field.type.isArray}}
540
- return this._wrapperFields.{{=field.name}};
541
- {{?? !field.type.isArray && field.type.type === 'string' && it.spec.msgName !== 'String'}}
542
- return this._wrapperFields.{{=field.name}}.data;
543
- {{?? isBigInt(field.type)}}
544
- return BigInt(this._refObject.{{=field.name}});
545
- {{??}}
546
- return this._refObject.{{=field.name}};
547
- {{?}}
548
- }
549
-
550
- set {{=field.name}}(value) {
551
- {{?field.type.isArray && field.type.isFixedSizeArray}}
552
- if (value.length !== {{=field.type.arraySize}}) {
553
- throw new RangeError('The length of the array must be {{=field.type.arraySize}}.');
554
- }
555
-
556
- {{?}}
557
- {{?field.type.isArray && field.type.isUpperBound}}
558
- if (value.length > {{=field.type.arraySize}}) {
559
- throw new RangeError('The length of array {{=field.name}} must be <= {{=field.type.arraySize}}.');
560
- }
561
- {{?}}
562
-
563
- {{? field.type.isArray && isTypedArrayType(field.type)}}
564
- this._wrapperFields['{{=field.name}}'].fill(value);
565
- {{?? field.type.isArray && field.type.isPrimitiveType}}
566
- this._{{=field.name}}Array = value;
567
- {{?? field.type.isArray && !field.type.isPrimitiveType}}
568
- this._wrapperFields.{{=field.name}}.fill(value);
569
- {{?? !field.type.isPrimitiveType && !field.type.isArray}}
570
- if (value instanceof {{=getWrapperNameByType(field.type)}}) {
571
- this._wrapperFields.{{=field.name}}.copy(value);
572
- } else {
573
- this._wrapperFields.{{=field.name}}.copy(new {{=getWrapperNameByType(field.type)}}(value));
574
- }
575
- {{?? !field.type.isArray && field.type.type === 'string' && it.spec.msgName !== 'String'}}
576
- this._wrapperFields.{{=field.name}}.data = value;
577
- {{?? isBigInt(field.type)}}
578
- if (typeof value !== "bigint") {
579
- throw new TypeError('{{=field.name}} must be type of bigint');
580
- }
581
- this._refObject.{{=field.name}} = value.toString();
582
- {{??}}
583
- {{? it.spec.msgName === 'String'}}
584
- this._refObject.size = Buffer.byteLength(value);
585
- this._refObject.capacity = Buffer.byteLength(value) + 1;
586
- {{?}}
587
- this._refObject.{{=field.name}} = value;
588
- {{?}}
589
- }
590
- {{~}}
591
-
592
- copyRefObject(refObject) {
593
- this._refObject = new {{=refObjectType}}(refObject.toObject());
594
-
595
- {{~ it.spec.fields :field}}
596
- {{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
597
- refObject.{{=field.name}}.data.length = refObject.{{=field.name}}.size;
598
- for (let index = 0; index < refObject.{{=field.name}}.size; index++) {
599
- this._{{=field.name}}Array[index] = refObject.{{=field.name}}.data[index].data;
600
- }
601
- {{?? field.type.isArray && field.type.isPrimitiveType && field.type.isFixedSizeArray}}
602
- this._wrapperFields.{{=field.name}}.fill(refObject.{{=field.name}}.toArray());
603
- {{?? field.type.isArray && !field.type.isPrimitiveType && field.type.isFixedSizeArray}}
604
- this._refObject.{{=field.name}} = refObject.{{=field.name}};
605
- this._wrapperFields.{{=field.name}}.size = {{=field.type.arraySize}}
606
- for (let i = 0; i < {{=field.type.arraySize}}; i++) {
607
- this._wrapperFields.{{=field.name}}.data[i].copyRefObject(refObject.{{=field.name}}[i]);
608
- }
609
- {{?? !field.type.isPrimitiveType || field.type.isArray || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
610
- this._wrapperFields.{{=field.name}}.copyRefObject(this._refObject.{{=field.name}});
611
- {{?}}
612
- {{~}}
613
- }
614
-
615
- copy(other) {
616
- this._refObject = new {{=refObjectType}}(other._refObject.toObject());
617
-
618
- {{~ it.spec.fields :field}}
619
- {{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
620
- this._{{=field.name}}Array = other._{{=field.name}}Array.slice();
621
- {{?? !field.type.isPrimitiveType || field.type.isArray || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
622
- this._wrapperFields.{{=field.name}}.copy(other._wrapperFields.{{=field.name}});
623
- {{?}}
624
- {{~}}
625
- }
626
-
627
- static get classType() {
628
- return {{=objectWrapper}};
629
- }
630
-
631
- static get ROSMessageDef() {
632
- return {{=compactMsgDefJSON}};
633
- }
634
-
635
- hasMember(name) {
636
- let memberNames = {{=extractMemberNames(it.spec.fields)}};
637
- return memberNames.indexOf(name) !== -1;
638
- }
639
- }
640
-
641
- {{/* Define the wrapper class for the message array. */}}
642
- class {{=arrayWrapper}} {
643
- constructor(size = 0) {
644
- this._resize(size);
645
- }
646
-
647
- toRawROS() {
648
- return this._refObject.ref();
649
- }
650
-
651
- fill(values) {
652
- {{? willUseTypedArray}}
653
- if (Array.isArray(values)) {
654
- {{/* Convert to TypedArray. */}}
655
- this._wrappers = new {{=currentTypedArray}}(values);
656
- } else {
657
- this._wrappers = values;
658
- }
659
- {{?? isPrimitivePackage(it.spec.baseType)}}
660
- {{/* For primitive arrays, only string/bool/int64/uint64 array drops here. */}}
661
- const length = values.length;
662
- this._resize(length);
663
- for (let i = 0; i < length; ++i) {
664
- let wrapper = new {{=objectWrapper}}();
665
- wrapper.data = values[i];
666
- this._wrappers[i] = wrapper;
667
- }
668
- {{??}}
669
- const length = values.length;
670
- this._resize(length);
671
- values.forEach((value, index) => {
672
- if (value instanceof {{=objectWrapper}}) {
673
- this._wrappers[index].copy(value);
674
- } else {
675
- this._wrappers[index] = new {{=objectWrapper}}(value);
676
- }
677
- });
678
- {{?}}
679
- }
680
-
681
- {{/* Put all data currently stored in `this._wrappers` into `this._refObject`. */}}
682
- freeze(own) {
683
- {{/* When it's a TypedArray: no need to copy to `this._refArray`. */}}
684
- {{? !willUseTypedArray}}
685
- this._wrappers.forEach((wrapper, index) => {
686
- wrapper.freeze(own);
687
- this._refArray[index] = wrapper.refObject;
688
- });
689
- {{?}}
690
-
691
- this._refObject.size = this._wrappers.length;
692
- this._refObject.capacity = this._wrappers.length;
693
-
694
- if (this._refObject.capacity === 0) {
695
- this._refObject.data = null
696
- } else {
697
- {{? willUseTypedArray}}
698
- const buffer = Buffer.from(new Uint8Array(this._wrappers.buffer));
699
- this._refObject.data = buffer;
700
- {{??}}
701
- this._refObject.data = this._refArray.buffer;
702
- {{?}}
703
- }
704
- }
705
-
706
- get refObject() {
707
- return this._refObject;
708
- }
709
-
710
- get data() {
711
- return this._wrappers;
712
- }
713
-
714
- get size() {
715
- return this._wrappers.length;
716
- }
717
-
718
- set size(value) {
719
- if (typeof value != 'number') {
720
- throw new TypeError('Invalid argument: should provide a number to {{=arrayWrapper}}.size setter');
721
- }
722
- return this._resize(value);
723
- }
724
-
725
- get capacity() {
726
- return this._wrappers.length;
727
- }
728
-
729
- set capacity(value) {
730
- if (typeof value != 'number') {
731
- throw new TypeError('Invalid argument: should provide a number to {{=arrayWrapper}}.capacity setter');
732
- }
733
- return this._resize(value);
734
- }
735
-
736
- get refObject() {
737
- return this._refObject;
738
- }
739
-
740
- _resize(size) {
741
- if (size < 0) {
742
- throw new RangeError('Invalid argument: should provide a positive number');
743
- }
744
- {{? willUseTypedArray}}
745
- this._refArray = undefined;
746
- {{??}}
747
- this._refArray = new {{=refArrayType}}(size);
748
- {{?}}
749
-
750
- this._refObject = new {{=refObjectArrayType}}();
751
- this._refObject.size = size;
752
- this._refObject.capacity = size;
753
-
754
- {{? willUseTypedArray}}
755
- this._wrappers = new {{=currentTypedArray}}(size);
756
- {{??}}
757
- this._wrappers = new Array();
758
- for (let i = 0; i < size; i++) {
759
- this._wrappers.push(new {{=objectWrapper}}());
760
- }
761
- {{?}}
762
- }
763
-
764
- {{/* Copy all data from `this._refObject` into `this._wrappers`. */}}
765
- copyRefObject(refObject) {
766
- this._refObject = refObject;
767
-
768
- {{? willUseTypedArray}}
769
- const byteLen = refObject.size * ref.types.{{=currentTypedArrayElementType}}.size;
770
- {{/* An ArrayBuffer object doesn't hold the ownership of memory block starting from address for TypedArray. */}}
771
- const arrayBuffer = refObject.data.length !== 0 ?
772
- rclnodejs.createArrayBufferFromAddress(refObject.data.hexAddress(), byteLen) :
773
- Buffer.alloc(0);
774
- this._wrappers = new {{=currentTypedArray}}(arrayBuffer);
775
- {{??}}
776
- let refObjectArray = this._refObject.data;
777
- refObjectArray.length = this._refObject.size;
778
- this._resize(this._refObject.size);
779
- for (let index = 0; index < this._refObject.size; index++) {
780
- this._wrappers[index].copyRefObject(refObjectArray[index]);
781
- }
782
- {{?}}
783
- }
784
-
785
- copy(other) {
786
- if (! (other instanceof {{=arrayWrapper}})) {
787
- throw new TypeError('Invalid argument: should provide "{{=arrayWrapper}}".');
788
- }
789
-
790
- this._resize(other.size);
791
- {{? willUseTypedArray}}
792
- this._wrappers = other._wrappers.slice();
793
- {{??}}
794
- {{/* Deep copy for non-TypedArray. */}}
795
- other._wrappers.forEach((wrapper, index) => {
796
- this._wrappers[index].copy(wrapper);
797
- });
798
- {{?}}
799
- }
800
-
801
- static freeArray(refObject) {
802
- {{/* We don't need to free the memory for TypedArray objects, because v8 takes the ownership of it. */}}
803
- {{? !willUseTypedArray}}
804
- let refObjectArray = refObject.data;
805
- refObjectArray.length = refObject.size;
806
- for (let index = 0; index < refObject.size; index++) {
807
- {{=objectWrapper}}.freeStruct(refObjectArray[index]);
808
- }
809
- {{?}}
810
- }
811
-
812
- static get elementType() {
813
- return {{=objectWrapper}};
814
- }
815
-
816
- static get isROSArray() {
817
- return true;
818
- }
819
-
820
- static get useTypedArray() {
821
- return {{=willUseTypedArray}};
822
- }
823
-
824
- get classType() {
825
- return {{=arrayWrapper}};
826
- }
827
-
828
- toPlainObject(enableTypedArray) {
829
- return translator.toPlainObject(this, enableTypedArray);
830
- }
831
- }
832
-
833
- {{? it.spec.constants != undefined && it.spec.constants.length}}
834
- {{/* Define constants ({{=it.spec.constants.length}} in total). */}}
835
- {{~ it.spec.constants :c}}
836
- {{? c.type === "string"}}
837
- Object.defineProperty({{=objectWrapper}}, "{{=c.name}}", {value: "{{=c.value}}", writable: false, enumerable: true, configurable: true});
838
- {{??}}
839
- Object.defineProperty({{=objectWrapper}}, "{{=c.name}}", {value: {{=c.value}}, writable: false, enumerable: true, configurable: true});
840
- {{?}}
841
- {{~}}
842
- {{?}}
843
-
844
- module.exports = {{=objectWrapper}};
845
-
846
- {{? it.isDebug}}
847
- /*
848
- * The following is the original spec object coming from parser:
849
- {{=it.json}}
850
- */
851
- {{?}}