Skip to content

Commit 99bd8dc

Browse files
author
Minggang Wang
authored
Merge pull request #248 from minggangw/fix-issue-232
Use a number variable of message class to hold the array element
2 parents b1a3d72 + 3bfc0b2 commit 99bd8dc

File tree

3 files changed

+37
-15
lines changed

3 files changed

+37
-15
lines changed

rosidl_gen/generator.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "rosidl-generator",
3-
"version": "0.0.5",
3+
"version": "0.0.6",
44
"description": "Generate JavaScript object from ROS IDL(.msg) files",
55
"authors": [
66
"Minggang Wang <[email protected]>",

rosidl_gen/templates/message.dot

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -226,12 +226,20 @@ const {{=refObjectArrayType}} = StructType({
226226
class {{=objectWrapper}} {
227227
constructor(other) {
228228
this._wrapperFields = {};
229+
{{~ it.spec.fields :field}}
230+
{{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
231+
this._{{=field.name}}Array = [];
232+
{{?}}
233+
{{~}}
229234
if (typeof other === 'object' && other._refObject) {
230235
this._refObject = new {{=refObjectType}}(other._refObject.toObject());
231236
{{~ it.spec.fields :field}}
232237
{{? field.type.isArray}}
233238
this._wrapperFields.{{=field.name}} = {{=getWrapperNameByType(field.type)}}.createArray();
234239
this._wrapperFields.{{=field.name}}.copy(other._wrapperFields.{{=field.name}});
240+
{{? field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
241+
this.{{=field.name}} = other.{{=field.name}};
242+
{{?}}
235243
{{?? !field.type.isPrimitiveType || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
236244
this._wrapperFields.{{=field.name}} = new {{=getWrapperNameByType(field.type)}}(other._wrapperFields.{{=field.name}});
237245
{{?}}
@@ -248,6 +256,7 @@ class {{=objectWrapper}} {
248256
{{?}}
249257
{{~}}
250258
}
259+
251260
this.freeze();
252261
}
253262

@@ -280,7 +289,11 @@ class {{=objectWrapper}} {
280289

281290
freeze(own = false) {
282291
{{~ it.spec.fields :field}}
283-
{{? !field.type.isPrimitiveType || field.type.isArray}}
292+
{{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
293+
this._wrapperFields.{{=field.name}}.fill(this._{{=field.name}}Array);
294+
this._wrapperFields.{{=field.name}}.freeze(own);
295+
this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
296+
{{?? !field.type.isPrimitiveType || field.type.isArray}}
284297
this._wrapperFields.{{=field.name}}.freeze(own);
285298
this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
286299
{{?? field.type.type === 'string' && it.spec.msgName !== 'String'}}
@@ -303,7 +316,12 @@ class {{=objectWrapper}} {
303316

304317
deserialize(refObject) {
305318
{{~ it.spec.fields :field}}
306-
{{? !field.type.isPrimitiveType || field.type.isArray}}
319+
{{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
320+
refObject.{{=field.name}}.data.length = refObject.{{=field.name}}.size;
321+
for (let index = 0; index < refObject.{{=field.name}}.size; index++) {
322+
this._{{=field.name}}Array[index] = refObject.{{=field.name}}.data[index].data;
323+
}
324+
{{?? !field.type.isPrimitiveType || field.type.isArray}}
307325
this._wrapperFields.{{=field.name}}.copyRefObject(refObject.{{=field.name}});
308326
{{?? field.type.type === 'string' && it.spec.msgName !== 'String'}}
309327
this._wrapperFields.{{=field.name}}.data = refObject.{{=field.name}}.data;
@@ -357,11 +375,7 @@ class {{=objectWrapper}} {
357375
{{? field.type.isArray && isTypedArrayType(field.type)}}
358376
return this._wrapperFields['{{=field.name}}'].data;
359377
{{?? field.type.isArray && field.type.isPrimitiveType}}
360-
let values = [];
361-
this._wrapperFields['{{=field.name}}'].data.forEach((wrapper, index) => {
362-
values.push(wrapper.data);
363-
});
364-
return values;
378+
return this._{{=field.name}}Array;
365379
{{?? field.type.isArray && !field.type.isPrimitiveType}}
366380
return this._wrapperFields.{{=field.name}};
367381
{{?? !field.type.isPrimitiveType && !field.type.isArray}}
@@ -374,8 +388,10 @@ class {{=objectWrapper}} {
374388
}
375389

376390
set {{=field.name}}(value) {
377-
{{? field.type.isArray && field.type.isPrimitiveType}}
391+
{{? field.type.isArray && isTypedArrayType(field.type)}}
378392
this._wrapperFields['{{=field.name}}'].fill(value);
393+
{{?? field.type.isArray && field.type.isPrimitiveType}}
394+
this._{{=field.name}}Array = value;
379395
{{?? field.type.isArray && !field.type.isPrimitiveType}}
380396
this._wrapperFields.{{=field.name}}.copy(value);
381397
{{?? !field.type.isPrimitiveType && !field.type.isArray}}
@@ -396,7 +412,12 @@ class {{=objectWrapper}} {
396412
this._refObject = new {{=refObjectType}}(refObject.toObject());
397413

398414
{{~ it.spec.fields :field}}
399-
{{? !field.type.isPrimitiveType || field.type.isArray || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
415+
{{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
416+
refObject.{{=field.name}}.data.length = refObject.{{=field.name}}.size;
417+
for (let index = 0; index < refObject.{{=field.name}}.size; index++) {
418+
this._{{=field.name}}Array[index] = refObject.{{=field.name}}.data[index].data;
419+
}
420+
{{?? !field.type.isPrimitiveType || field.type.isArray || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
400421
this._wrapperFields.{{=field.name}}.copyRefObject(this._refObject.{{=field.name}});
401422
{{?}}
402423
{{~}}
@@ -406,7 +427,9 @@ class {{=objectWrapper}} {
406427
this._refObject = new {{=refObjectType}}(other._refObject.toObject());
407428

408429
{{~ it.spec.fields :field}}
409-
{{? !field.type.isPrimitiveType || field.type.isArray || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
430+
{{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
431+
this._{{=field.name}}Array = other._{{=field.name}}Array.slice();
432+
{{?? !field.type.isPrimitiveType || field.type.isArray || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
410433
this._wrapperFields.{{=field.name}}.copy(other._wrapperFields.{{=field.name}});
411434
{{?}}
412435
{{~}}

test/test-array-data.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ describe('rclnodejs message communication', function() {
7272
{
7373
pkg: 'std_msgs', type: 'Int64MultiArray',
7474
values: [
75-
// Waiting for https://github.com/RobotWebTools/rclnodejs/issues/232 to enable this case
76-
// {layout: layout, data: [-111, 1, 2, 3, 8, 6, 0, -25, Number.MAX_SAFE_INTEGER] }, // Provide data via Array
75+
{layout: layout, data: [-111, 1, 2, 3, 8, 6, 0, -25, Number.MAX_SAFE_INTEGER] }, // Provide data via Array
7776
]
7877
},
7978
{
@@ -107,8 +106,7 @@ describe('rclnodejs message communication', function() {
107106
{
108107
pkg: 'std_msgs', type: 'UInt64MultiArray',
109108
values: [
110-
// Waiting for https://github.com/RobotWebTools/rclnodejs/issues/232 to enable this case
111-
// {layout: layout, data: [0, 1, 2, 3, 8, 6, 0, 255, Number.MAX_SAFE_INTEGER] }, // Provide data via Array
109+
{layout: layout, data: [0, 1, 2, 3, 8, 6, 0, 255, Number.MAX_SAFE_INTEGER] }, // Provide data via Array
112110
]
113111
},
114112
{
@@ -146,6 +144,7 @@ describe('rclnodejs message communication', function() {
146144
assert(msg.layout.dim.data[0].label === v.layout.dim[0].label);
147145
assert(msg.layout.dim.data[0].size === v.layout.dim[0].size);
148146
assert(msg.layout.dim.data[0].stride === v.layout.dim[0].stride);
147+
149148
// Second element
150149
assert(typeof msg.layout.dim.data[1] === 'object');
151150
assert(msg.layout.dim.data[1].label === v.layout.dim[1].label);

0 commit comments

Comments
 (0)