Skip to content

Commit ecc4cf2

Browse files
committed
Services working using on-demand class definitions (from .srv files)
1 parent a2ffcad commit ecc4cf2

File tree

5 files changed

+90
-48
lines changed

5 files changed

+90
-48
lines changed

example.js

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ let rosnodejs = require('./index.js');
55
// const SetBool = rosnodejs.require('std_srvs').srv.SetBool;
66

77
// aspirational:
8-
rosnodejs.use(['std_msgs/String'], function() {
8+
rosnodejs.use(['std_msgs/String'],
9+
['std_srvs/SetBool'], function() {
910

1011
const msg = new (rosnodejs.message('std_msgs/String'))(
1112
{ data: "howdy" });
@@ -18,36 +19,48 @@ rosnodejs.use(['std_msgs/String'], function() {
1819
rosnodejs.initNode('/my_node')
1920
.then((rosNode) => {
2021
// EXP 1) Service Server
21-
// let service = rosNode.advertiseService({
22-
// service: '/set_bool',
23-
// type: 'std_srvs/SetBool'
24-
// }, (req, resp) => {
25-
// console.log('Handling request! ' + JSON.stringify(req));
26-
// resp.success = !req.data;
27-
// resp.message = 'Inverted!';
28-
// return true;
29-
// });
22+
let service = rosNode.advertiseService({
23+
service: '/set_bool',
24+
type: 'std_srvs/SetBool'
25+
}, (req, resp) => {
26+
console.log('Handling request! ' + JSON.stringify(req));
27+
resp.success = !req.data;
28+
resp.message = 'Inverted!';
29+
return true;
30+
});
3031

3132
// // EXP 2) Service Client
32-
// let serviceClient = rosNode.serviceClient({
33-
// service: '/set_bool',
34-
// type: 'std_srvs/SetBool'
35-
// });
36-
// rosNode.waitForService(serviceClient.getService(), 2000)
37-
// .then((available) => {
38-
// if (available) {
39-
// const request = new SetBool.Request();
40-
// request.data = true;
41-
// serviceClient.call(request, (resp) => {
42-
// console.log('Service response ' + JSON.stringify(resp));
43-
// });
44-
// }
45-
// });
33+
setTimeout(function() {
34+
let serviceClient = rosNode.serviceClient({
35+
service: '/set_bool',
36+
type: 'std_srvs/SetBool'
37+
});
38+
rosNode.waitForService(serviceClient.getService(), 2000)
39+
.then((available) => {
40+
if (available) {
41+
console.log('Service available');
42+
// const request = new SetBool.Request();
43+
// request.data = true;
44+
// #HERE
45+
const request =
46+
new (rosnodejs.serviceRequest('std_srvs/SetBool'))({
47+
data: true });
48+
console.log("call service", request);
49+
serviceClient.call(request, (resp) => {
50+
console.log('Service response ' + JSON.stringify(resp));
51+
});
52+
} else {
53+
console.log('Service not available');
54+
}
55+
});
56+
}, 1000); // wait a second before calling our service
4657

47-
// // EXP 3) Params
48-
// rosNode.setParam('~junk', {'hi': 2}).then(() => {
49-
// rosNode.getParam('~junk').then((val) => { console.log('Got Param!!! ' + JSON.stringify(val)); });
50-
// });
58+
// EXP 3) Params
59+
rosNode.setParam('~junk', {'hi': 2}).then(() => {
60+
rosNode.getParam('~junk').then((val) => {
61+
console.log('Got Param!!! ' + JSON.stringify(val));
62+
});
63+
});
5164

5265
// // EXP 4) Publisher
5366
let pub = rosNode.advertise({

index.js

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -137,22 +137,17 @@ let Rosnodejs = {
137137
return pack;
138138
},
139139

140-
/** get new object of the message class type for the given ROS
141-
* message type
142-
*/
143-
getMessage(type, cb) {
144-
messages.getMessage(type, function(error, Message) {
145-
// console.log(error, Message);
146-
if (error) {
147-
cb(error, null);
148-
} else {
149-
cb(null, new Message());
150-
}
140+
/** create message classes and services classes for all the given
141+
* types before calling callback */
142+
use(messages, services, callback) {
143+
const self = this;
144+
this._useMessages(messages, function() {
145+
self._useServices(services, callback);
151146
});
152147
},
153148

154149
/** create message classes for all the given types */
155-
use(types, callback) {
150+
_useMessages(types, callback) {
156151
var Messages = [];
157152
types.forEach(function(type) {
158153
messages.getMessage(type, function(error, Message) {
@@ -164,12 +159,34 @@ let Rosnodejs = {
164159
});
165160
},
166161

162+
/** create message classes for all the given types */
163+
_useServices(types, callback) {
164+
var count = types.length;
165+
types.forEach(function(type) {
166+
messages.getServiceRequest(type, function() {
167+
messages.getServiceResponse(type, function() {
168+
if (--count == 0) {
169+
callback();
170+
}
171+
});
172+
});
173+
});
174+
},
175+
167176
/** get message definition class from registry. Do not generate it
168177
* from .msg file if it doesn't already exist. This is mostly
169178
* because that would need to be async right now and we want a sync
170179
* method. */
171180
message(type) {
172-
return messages.getMessageFromRegistry(type);
181+
return messages.getFromRegistry(type, "message");
182+
},
183+
184+
serviceRequest(type) {
185+
return messages.getFromRegistry(type, "request");
186+
},
187+
188+
serviceResponse(type) {
189+
return messages.getFromRegistry(type, "response");
173190
},
174191

175192
/**

utils/message_utils.js

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ let MessageUtils = {
208208
return messagePackage.msg[type];
209209
} else {
210210
// console.log("get message from registry");
211-
let type = messages.getMessageFromRegistry(rosDataType);
211+
let type = messages.getFromRegistry(rosDataType, "message");
212212
if (type) {
213213
// console.log("got message from registry", type);
214214
return new type();
@@ -226,10 +226,21 @@ let MessageUtils = {
226226
if (messagePackage) {
227227
let type = parts[1];
228228
return messagePackage.srv[type];
229-
}
230-
else {
231-
console.error('Unable to find message package ' + msgPackage);
232-
throw new Error();
229+
} else {
230+
// console.log("get service from registry");
231+
let request = messages.getFromRegistry(rosDataType, "request");
232+
let response = messages.getFromRegistry(rosDataType, "response");
233+
if (request && response) {
234+
return {
235+
// Request: new request(),
236+
// Response: new response()
237+
Request: request,
238+
Response: response
239+
};
240+
} else {
241+
console.error('Unable to find message package ' + msgPackage);
242+
throw new Error();
243+
}
233244
}
234245
}
235246
};

utils/messages.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ messages.getMessage = function(messageType, callback) {
1414
this.getMessageFromPackage(messageType, "message", callback);
1515
}
1616

17-
messages.getMessageFromRegistry = function(messageType) {
18-
return getMessageFromRegistry(messageType, "message");
17+
messages.getFromRegistry = function(messageType, type) {
18+
return getMessageFromRegistry(messageType, type);
1919
}
2020

2121
messages.getServiceRequest = function(messageType, callback) {

utils/xmlrpc_utils.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ module.exports = {
2323
}
2424
else if (err || resp[0] !== 1) {
2525
log.warn('Some other error during %s: %s, %j', method, err, resp);
26+
log.warn((new Error()).stack);
2627
reject(err, resp);
2728
}
2829
else {

0 commit comments

Comments
 (0)