Skip to content

Commit 0e7e4b5

Browse files
committed
Merge pull request #16 from chfritz/Issue#14_unify_apis
Unifying API for on-the-fly and gennodejs messages
2 parents bfddfde + 054a18f commit 0e7e4b5

File tree

4 files changed

+220
-137
lines changed

4 files changed

+220
-137
lines changed

example2.js

Lines changed: 63 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,77 @@
11
'use strict';
22

33
let rosnodejs = require('./index.js');
4-
// const std_msgs = rosnodejs.require('std_msgs').msg;
5-
// const SetBool = rosnodejs.require('std_srvs').srv.SetBool;
64

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

10-
const msg = new (rosnodejs.message('std_msgs/String'))(
11-
{ data: "howdy" });
10+
const std_msgs = rosnodejs.require('std_msgs').msg;
11+
const msg = new std_msgs.String();
1212

13-
rosnodejs.initNode('/my_node')
14-
.then((rosNode) => {
13+
const SetBool = rosnodejs.require('std_srvs').srv.SetBool;
14+
const request = new SetBool.Request();
1515

16-
// EXP 1) Service Server
17-
let service = rosNode.advertiseService('/set_bool','std_srvs/SetBool',
18-
(req, resp) => {
19-
console.log('Handling request! ' + JSON.stringify(req));
20-
resp.success = !req.data;
21-
resp.message = 'Inverted!';
22-
return true;
23-
});
16+
// EXP 1) Service Server
17+
let service = rosNode.advertiseService(
18+
'/set_bool','std_srvs/SetBool',
19+
(req, resp) => {
20+
console.log('Handling request! ' + JSON.stringify(req));
21+
resp.success = !req.data;
22+
resp.message = 'Inverted!';
23+
return true;
24+
});
2425

25-
// EXP 2) Service Client
26-
setTimeout(function() {
27-
let serviceClient = rosNode.serviceClient('/set_bool','std_srvs/SetBool');
28-
rosNode.waitForService(serviceClient.getService(), 2000)
29-
.then((available) => {
30-
if (available) {
31-
const request =
32-
new (rosnodejs.serviceRequest('std_srvs/SetBool'))({
33-
data: false });
34-
serviceClient.call(request, (resp) => {
35-
console.log('Service response ' + JSON.stringify(resp));
36-
});
37-
} else {
38-
console.log('Service not available');
39-
}
26+
// EXP 2) Service Client
27+
setTimeout(function() {
28+
let serviceClient = rosNode.serviceClient('/set_bool','std_srvs/SetBool');
29+
rosNode.waitForService(serviceClient.getService(), 2000)
30+
.then((available) => {
31+
if (available) {
32+
const request = new SetBool.Request();
33+
request.data = true;
34+
serviceClient.call(request, (resp) => {
35+
console.log('Service response ' + JSON.stringify(resp));
4036
});
41-
}, 1000); // wait a second before calling our service
42-
43-
// EXP 3) Params
44-
rosNode.setParam('~junk', {'hi': 2}).then(() => {
45-
rosNode.getParam('~junk').then((val) => {
46-
console.log('Got Param!!! ' + JSON.stringify(val));
47-
});
48-
});
49-
50-
// // EXP 4) Publisher
51-
let pub = rosNode.advertise('/my_topic','std_msgs/String', {
52-
queueSize: 1,
53-
latching: true,
54-
throttleMs: 9
55-
});
56-
57-
let msgStart = 'my message ';
58-
let iter = 0;
59-
setInterval(() => {
60-
msg.data = msgStart + iter
61-
pub.publish(msg);
62-
++iter;
63-
if (iter > 200) {
64-
iter = 0;
37+
} else {
38+
console.log('Service not available');
6539
}
66-
}, 5);
40+
});
41+
}, 1000); // wait a second before calling our service
6742

68-
// EXP 5) Subscriber
69-
let sub = rosNode.subscribe('/my_topic', 'std_msgs/String',
70-
(data) => {
71-
console.log('SUB DATA ', data, data.data);
72-
},
73-
{queueSize: 1,
74-
throttleMs: 1000});
43+
// EXP 3) Params
44+
rosNode.setParam('~junk', {'hi': 2}).then(() => {
45+
rosNode.getParam('~junk').then((val) => {
46+
console.log('Got Param!!! ' + JSON.stringify(val));
7547
});
48+
});
49+
50+
// // EXP 4) Publisher
51+
let pub = rosNode.advertise('/my_topic','std_msgs/String', {
52+
queueSize: 1,
53+
latching: true,
54+
throttleMs: 9
55+
});
7656

57+
// EXP 5) Subscriber
58+
let sub = rosNode.subscribe(
59+
'/my_topic',
60+
'std_msgs/String',
61+
(data) => {
62+
console.log('SUB DATA ', data, data.data);
63+
},
64+
{queueSize: 1,
65+
throttleMs: 1000});
66+
67+
let msgStart = 'my message ';
68+
let iter = 0;
69+
setInterval(() => {
70+
msg.data = msgStart + iter
71+
pub.publish(msg);
72+
++iter;
73+
if (iter > 200) {
74+
iter = 0;
75+
}
76+
}, 5);
7777
});

index.js

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ let Rosnodejs = {
8888
return Promise.resolve(this.getNodeHandle());
8989
}
9090
// else
91-
throw new Error('Unable to initialize node [' + nodeName + '] - node [' + rosNode.getNodeName() + '] already exists');
91+
throw new Error('Unable to initialize node [' + nodeName + '] - node ['
92+
+ rosNode.getNodeName() + '] already exists');
9293
}
9394

9495
// FIXME: validate nodeName -- MUST START WITH '/'
@@ -119,15 +120,26 @@ let Rosnodejs = {
119120
// resolve when connection to master is established
120121
let checkMasterTimeout = 0;
121122
rosNode = new RosNode(nodeName, rosMasterUri);
123+
122124
return new Promise((resolve, reject) => {
123-
_checkMasterHelper(resolve, 0);
125+
this.use(options.messages, options.services).then(() => {
126+
_checkMasterHelper(resolve, 0);
127+
});
124128
})
125129
.catch((err) => {
126130
log.error('Error: ' + err);
127131
});
128132
},
129133

130134
require(msgPackage) {
135+
// check our registry of on-demand generate message definition
136+
var fromRegistry = messages.getPackageFromRegistry(msgPackage);
137+
if (fromRegistry) {
138+
return fromRegistry;
139+
}
140+
141+
// if we can't find it in registry, check for gennodejs
142+
// pre-compiled versions
131143
let pack = msgUtils.getPackage(msgPackage);
132144
if (!pack) {
133145
msgUtils.loadMessagePackage(msgPackage);
@@ -139,60 +151,54 @@ let Rosnodejs = {
139151

140152
/** create message classes and services classes for all the given
141153
* types before calling callback */
142-
use(messages, services, callback) {
154+
use(messages, services) {
143155
const self = this;
144-
this._useMessages(messages, function() {
145-
self._useServices(services, callback);
156+
return new Promise((resolve, reject) => {
157+
self._useMessages(messages)
158+
.then(() => {
159+
return self._useServices(services);
160+
}).then(() => {
161+
resolve();
162+
});
146163
});
147164
},
148165

149166
/** create message classes for all the given types */
150-
_useMessages(types, callback) {
151-
var Messages = [];
152-
types.forEach(function(type) {
153-
console.log('get message type! ' + type);
154-
messages.getMessage(type, function(error, Message) {
155-
console.log('got it!');
156-
Messages.push(Message);
157-
if (Messages.length === types.length) {
158-
callback();
159-
}
167+
_useMessages(types) {
168+
if (!types || types.length == 0) {
169+
return Promise.resolve();
170+
}
171+
var count = types.length;
172+
return new Promise((resolve, reject) => {
173+
types.forEach(function(type) {
174+
messages.getMessage(type, function(error, Message) {
175+
if (--count == 0) {
176+
resolve();
177+
}
178+
});
160179
});
161180
});
162181
},
163-
182+
164183
/** create message classes for all the given types */
165-
_useServices(types, callback) {
184+
_useServices(types) {
185+
if (!types || types.length == 0) {
186+
return Promise.resolve();
187+
}
166188
var count = types.length;
167-
types.forEach(function(type) {
168-
console.log('get service type! ' + type);
169-
messages.getServiceRequest(type, function() {
170-
messages.getServiceResponse(type, function() {
171-
console.log('got it!');
172-
if (--count == 0) {
173-
callback();
174-
}
189+
return new Promise((resolve, reject) => {
190+
types.forEach(function(type) {
191+
messages.getServiceRequest(type, function() {
192+
messages.getServiceResponse(type, function() {
193+
if (--count == 0) {
194+
resolve();
195+
}
196+
});
175197
});
176198
});
177199
});
178200
},
179201

180-
/** get message definition class from registry. Do not generate it
181-
* from .msg file if it doesn't already exist. This is mostly
182-
* because that would need to be async right now and we want a sync
183-
* method. */
184-
message(type) {
185-
return messages.getFromRegistry(type, "message");
186-
},
187-
188-
serviceRequest(type) {
189-
return messages.getFromRegistry(type, "request");
190-
},
191-
192-
serviceResponse(type) {
193-
return messages.getFromRegistry(type, "response");
194-
},
195-
196202
/**
197203
* @return {NodeHandle} for initialized node
198204
*/

utils/message_utils.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -207,10 +207,8 @@ let MessageUtils = {
207207
let type = parts[1];
208208
return messagePackage.msg[type];
209209
} else {
210-
// console.log("get message from registry");
211-
let type = messages.getFromRegistry(rosDataType, "message");
210+
let type = messages.getFromRegistry(rosDataType, ["msg"]);
212211
if (type) {
213-
// console.log("got message from registry", type);
214212
return new type();
215213
} else {
216214
console.error('Unable to find message package ' + msgPackage);
@@ -227,18 +225,18 @@ let MessageUtils = {
227225
let type = parts[1];
228226
return messagePackage.srv[type];
229227
} else {
230-
// console.log("get service %s from registry", rosDataType);
231-
let request = messages.getFromRegistry(rosDataType, "request");
232-
let response = messages.getFromRegistry(rosDataType, "response");
228+
let request =
229+
messages.getFromRegistry(rosDataType, ["srv", "Request"]);
230+
let response =
231+
messages.getFromRegistry(rosDataType, ["srv", "Response"]);
233232
if (request && response) {
234-
return {
235-
// Request: new request(),
236-
// Response: new response()
233+
return {
237234
Request: request,
238235
Response: response
239236
};
240237
} else {
241-
console.error('Unable to find service package %s: %j %j', msgPackage, request, response);
238+
console.error('Unable to find service package %s: %j %j',
239+
msgPackage, request, response);
242240
throw new Error();
243241
}
244242
}

0 commit comments

Comments
 (0)