Skip to content

Commit 72b0294

Browse files
authored
Fix broken on the fly code (#37)
1 parent 2eabdce commit 72b0294

File tree

5 files changed

+45
-21
lines changed

5 files changed

+45
-21
lines changed

examples/on_the_fly.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
let rosnodejs = require('../index.js');
44

5-
rosnodejs.initNode('/my_node', {
6-
messages: ['std_msgs/String'],
7-
services: ['std_srvs/SetBool']
8-
}).then((rosNode) => {
5+
rosnodejs.initNode('/my_node', { onTheFly: true})
6+
.then((rosNode) => {
97

108
const std_msgs = rosnodejs.require('std_msgs').msg;
119
const msg = new std_msgs.String();

lib/ActionClient.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@
1919

2020
const timeUtils = require('../utils/time_utils.js');
2121
const msgUtils = require('../utils/message_utils.js');
22-
const GoalID = msgUtils.requireMsgPackage('actionlib_msgs').msg.GoalID;
2322
const EventEmitter = require('events');
23+
let GoalID = null;
2424

2525
class ActionClient extends EventEmitter {
2626
constructor(options) {
2727
super();
2828

29+
if (GoalID === null) {
30+
GoalID = msgUtils.requireMsgPackage('actionlib_msgs').msg.GoalID;
31+
}
32+
2933
this._actionType = options.type;
3034

3135
this._actionServer = options.actionServer;

utils/messageGeneration/messages.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ function getMessageFromFile(messageType, filePath, type, callback) {
204204
response = buildMessageClass(details.response);
205205
setMessageInRegistry(messageType, request, type, "Request");
206206
setMessageInRegistry(messageType, response, type, "Response");
207+
setMessageInRegistry(messageType, () => {return request.md5sum(); }, type, 'md5sum');
208+
setMessageInRegistry(messageType, () => { return messageType; }, type, 'datatype');
207209
callback();
208210
// ^ no value needed for services, since they cannot appear nested
209211
// still pretty hacky
@@ -534,19 +536,26 @@ function buildMessageClass(details) {
534536
return this.md5;
535537
};
536538
Message.Constants = Message.constants
537-
= Message.prototype.constants = details.constants;
539+
= Message.prototype.constants = (() => {
540+
const ret = {};
541+
details.constants.forEach((constant) => {
542+
ret[constant.name] = constant.value;
543+
});
544+
return ret;
545+
})();
538546
Message.fields = Message.prototype.fields = details.fields;
539547
Message.serialize = Message.prototype.serialize =
540-
function(obj, buffer) {
541-
serializeInnerMessage(message, buffer, 0);
542-
}
548+
function(obj, buffer, offset) {
549+
serializeInnerMessage(obj, buffer, offset);
550+
};
543551
Message.deserialize = Message.prototype.deserialize = function(buffer) {
544552
var message = new Message();
545553

546554
message = deserializeInnerMessage(message, buffer, 0);
547555

548556
return message;
549-
}
557+
};
558+
Message.getMessageSize = function(msg) { return fieldsUtil.getMessageSize(msg); };
550559
Message.prototype.validate = buildValidator(details);
551560

552561
return Message;

utils/messageGeneration/packages.js

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
'use strict';
2-
var fs = require('fs')
3-
, path = require('path')
4-
, walker = require('walker');
2+
const fs = require('fs')
3+
, path = require('path')
4+
, walker = require('walker')
5+
, async = require('async');
56

67
let packageCache = {};
8+
const cache = {};
79

810
function packageWalk(directory, symlinks, findMessages) {
911
var noSubDirs = new Set();
@@ -91,7 +93,7 @@ function packageWalk(directory, symlinks, findMessages) {
9193

9294
function findPackageInDirectory(directory, packageName, callback) {
9395
var found = false;
94-
return walk(directory)
96+
return packageWalk(directory)
9597
.on('package', function(name, dir) {
9698
if (name === packageName) {
9799
this.emit('stop');
@@ -191,11 +193,20 @@ function findPackagesInDirectoryChain(directories) {
191193
// See http://ros.org/doc/api/rospkg/html/rospack.html
192194
// packages = {};
193195
exports.findPackage = function(packageName, callback) {
196+
var directory = cache[packageName.toLowerCase()];
197+
if (directory) {
198+
callback(null, directory);
199+
return;
200+
}
194201
var rosRoot = process.env.ROS_ROOT;
195-
var packagePath = process.env.ROS_PACKAGE_PATH;
196-
var rosPackagePaths = packagePath.split(':');
202+
var packagePath = process.env.ROS_PACKAGE_PATH
203+
var rosPackagePaths = packagePath.split(':')
197204
var directories = [rosRoot].concat(rosPackagePaths);
198-
return findPackageInDirectoryChain(directories, packageName, callback);
205+
return findPackageInDirectoryChain(directories, packageName,
206+
function(err, directory) {
207+
cache[packageName.toLowerCase()] = directory;
208+
callback(err, directory);
209+
});
199210
};
200211

201212
exports.findMessagePackages = function() {
@@ -211,7 +222,7 @@ exports.getPackageCache = function() {
211222
function forEachPackageInDirectory(directory, list, onEnd) {
212223
fs.access(directory, fs.R_OK, (err) => {
213224
if (!err) {
214-
walk(directory)
225+
packageWalk(directory)
215226
.on('package', function(name, dir) {
216227
list.push(dir);
217228
})
@@ -235,7 +246,7 @@ exports.getAllPackages = function(done) {
235246
}, function(err, directories) {
236247
directories.forEach(function(directory) {
237248
var packageName = path.basename(directory);
238-
cache[packageName] = directory;
249+
cache[packageName.toLowerCase()] = directory;
239250
});
240251
done(err, directories);
241252
});

utils/message_utils.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ let MessageUtils = {
207207
getHandlerForMsgType(rosDataType, loadIfMissing=false) {
208208
let type = messages.getFromRegistry(rosDataType, ["msg"]);
209209
if (type) {
210-
return new type();
210+
return type;
211211
} else {
212212
const [msgPackage, type] = rosDataType.split('/');
213213
let messagePackage = this.getPackage(msgPackage);
@@ -232,7 +232,9 @@ let MessageUtils = {
232232
if (request && response) {
233233
return {
234234
Request: request,
235-
Response: response
235+
Response: response,
236+
md5sum: () => { return request.md5sum(); },
237+
datatype: () => { return rosDataType; }
236238
};
237239
} else {
238240
const [msgPackage, type] = rosDataType.split('/');

0 commit comments

Comments
 (0)