@@ -6,35 +6,28 @@ export @rosimport, rostypegen, rostypereset, gentypes, cleartypes
6
6
# Composite types for internal use. Keeps track of the imported types and helps
7
7
# keep code generation orderly.
8
8
abstract ROSModule
9
- type ROSMsgModule <: ROSModule
9
+ type ROSPackage
10
10
name:: ASCIIString
11
+ msg:: ROSModule
12
+ srv:: ROSModule
13
+ function ROSPackage (pkgname:: String )
14
+ pkg = new (pkgname)
15
+ pkg. msg = ROSMsgModule (pkg)
16
+ pkg. srv = ROSSrvModule (pkg)
17
+ pkg
18
+ end
19
+ end
20
+ type ROSMsgModule <: ROSModule
21
+ pkg:: ROSPackage
11
22
members:: Vector{ASCIIString}
12
23
deps:: Set{ASCIIString}
13
- function ROSMsgModule (mname:: String )
14
- new (mname,
15
- ASCIIString[],
16
- Set {ASCIIString} ()
17
- )
18
- end
24
+ ROSMsgModule (pkg) = new (pkg, ASCIIString[], Set {ASCIIString} ())
19
25
end
20
26
type ROSSrvModule <: ROSModule
21
- name :: ASCIIString
27
+ pkg :: ROSPackage
22
28
members:: Vector{ASCIIString}
23
29
deps:: Set{ASCIIString}
24
- function ROSSrvModule (mname:: String )
25
- new (mname,
26
- ASCIIString[],
27
- Set {ASCIIString} ()
28
- )
29
- end
30
- end
31
- type ROSPackage
32
- name:: ASCIIString
33
- msg:: ROSMsgModule
34
- srv:: ROSSrvModule
35
- function ROSPackage (pkgname:: String )
36
- new (pkgname, ROSMsgModule (pkgname), ROSSrvModule (pkgname))
37
- end
30
+ ROSSrvModule (pkg) = new (pkg, ASCIIString[], Set {ASCIIString} ())
38
31
end
39
32
40
33
# These two global objects maintain the hierarchy from multiple calls to
@@ -156,8 +149,8 @@ cleartypes() = error("cleartypes() renamed to rostypereset()")
156
149
function addtype! (mod:: ROSMsgModule , typ:: String )
157
150
global _rospy_objects
158
151
if ! (typ in mod. members)
159
- @debug (" Message type import: " , _modname (mod), " ." , typ)
160
- pymod, pyobj = _pyvars (_modname (mod), typ)
152
+ @debug (" Message type import: " , _fullname (mod), " ." , typ)
153
+ pymod, pyobj = _pyvars (_fullname (mod), typ)
161
154
162
155
deptypes = pyobj[:_slot_types ]
163
156
_importdeps! (mod, deptypes)
172
165
function addtype! (mod:: ROSSrvModule , typ:: String )
173
166
global _rospy_objects
174
167
if ! (typ in mod. members)
175
- @debug (" Service type import: " , _modname (mod), " ." , typ)
176
- pymod, pyobj = _pyvars (_modname (mod), typ)
168
+ @debug (" Service type import: " , _fullname (mod), " ." , typ)
169
+ pymod, pyobj = _pyvars (_fullname (mod), typ)
177
170
178
171
if ! haskey (pyobj, " _request_class" )
179
172
error (string (" Incorrect service name: " , typ))
@@ -201,7 +194,7 @@ function _pyvars(modname::String, typ::String)
201
194
try pymod. pymember (typ)
202
195
catch ex
203
196
if isa (ex, KeyError)
204
- error ( " $typ not found in package: $modname " )
197
+ throw ( KeyError ( " ' $typ ' in package ' $modname ' " ) )
205
198
else
206
199
rethrow (ex)
207
200
end
@@ -230,7 +223,7 @@ function _importdeps!(mod::ROSModule, deps::Vector)
230
223
# Dependencies will always be messages only
231
224
depmod = _rospy_imports[pkgname]. msg
232
225
# pushing to a set does not create duplicates
233
- push! (mod. deps, depmod. name )
226
+ push! (mod. deps, _name ( depmod) )
234
227
235
228
addtype! (depmod, typename)
236
229
@debug_subindent
241
234
# Bring in the python modules as needed
242
235
function _import_rospy_pkg (package:: String )
243
236
pkg, ptype = split (package, ' .' )
244
- if ptype != " msg" && ptype != " srv"
245
- throw (ArgumentError (" Improper import call for package: $package " ))
246
- end
247
237
pypkg = symbol (string (" py_" ,pkg," _" ,ptype))
248
238
if ! isdefined (RobotOS, pypkg)
249
239
@debug (" Importing python package: " , package)
@@ -260,10 +250,10 @@ end
260
250
261
251
# The function that creates and fills the generated top-level modules
262
252
function buildpackage (pkg:: ROSPackage )
263
- @debug (" Building package: " , pkg. name )
253
+ @debug (" Building package: " , _name ( pkg) )
264
254
265
255
# Create the top-level module for the package in Main
266
- pkgsym = symbol (pkg. name )
256
+ pkgsym = symbol (_name ( pkg) )
267
257
pkgcode = Expr (:toplevel , :(module ($ pkgsym) end ))
268
258
Main. eval (pkgcode)
269
259
pkgmod = Main. eval (pkgsym)
291
281
292
282
# Generate all code for a .msg or .srv module
293
283
function modulecode (mod:: ROSModule )
294
- @debug (" submodule: " , _modname (mod))
284
+ @debug (" submodule: " , _fullname (mod))
295
285
modcode = Expr[]
296
286
297
287
# Common imports
324
314
# The imports specific to each module, including dependant packages
325
315
function _importexprs (mod:: ROSMsgModule )
326
316
imports = Expr[Expr (:import , :RobotOS , :MsgT )]
327
- othermods = filter (d -> d != mod. name , mod. deps)
317
+ othermods = filter (d -> d != _name ( mod) , mod. deps)
328
318
append! (imports, [Expr (:using ,symbol (m),:msg ) for m in othermods])
329
319
imports
330
320
end
@@ -382,29 +372,28 @@ end
382
372
# Will create 3 different composite types.
383
373
function buildtype (mod:: ROSSrvModule , typename:: String )
384
374
global _rospy_objects
385
- fulltypestr = _rostypestr (mod, typename)
386
375
387
- req_str = string (fulltypestr ," Request" )
388
- reqobj = _rospy_objects[req_str ]
376
+ req_typestr = _rostypestr (mod, string (typename ," Request" ) )
377
+ reqobj = _rospy_objects[req_typestr ]
389
378
memnames = reqobj[:__slots__ ]
390
379
memtypes = reqobj[:_slot_types ]
391
380
reqmems = collect (zip (memnames, memtypes))
392
- pyreq = :(RobotOS. _rospy_objects[$ req_str ])
393
- reqexprs = typecode (req_str , :SrvT , reqmems)
381
+ pyreq = :(RobotOS. _rospy_objects[$ req_typestr ])
382
+ reqexprs = typecode (req_typestr , :SrvT , reqmems)
394
383
395
- resp_str = string (fulltypestr ," Response" )
396
- respobj = _rospy_objects[resp_str ]
384
+ resp_typestr = _rostypestr (mod, string (typename ," Response" ) )
385
+ respobj = _rospy_objects[resp_typestr ]
397
386
memnames = respobj[:__slots__ ]
398
387
memtypes = respobj[:_slot_types ]
399
388
respmems = collect (zip (memnames, memtypes))
400
- pyresp = :(RobotOS. _rospy_objects[$ resp_str ])
401
- respexprs = typecode (resp_str , :SrvT , respmems)
389
+ pyresp = :(RobotOS. _rospy_objects[$ resp_typestr ])
390
+ respexprs = typecode (resp_typestr , :SrvT , respmems)
402
391
403
392
defsym = symbol (typename)
404
393
reqsym = symbol (string (typename," Request" ))
405
394
respsym = symbol (string (typename," Response" ))
406
395
srvexprs = Expr[
407
- :(type $ defsym <: ServiceDefinition end ),
396
+ :(immutable $ defsym <: ServiceDefinition end ),
408
397
:(_typerepr (:: Type{$defsym} ) = $ (_rostypestr (mod,typename))),
409
398
:(_srv_reqtype (:: Type{$defsym} ) = $ reqsym),
410
399
:(_srv_resptype (:: Type{$defsym} ) = $ respsym),
419
408
# (3) convert(PyObject, ...)
420
409
# (4) convert(..., o::PyObject)
421
410
function typecode (rosname:: String , super:: Symbol , members:: Vector )
422
- pkg, tname = _splittypestr (rosname)
411
+ tname = _splittypestr (rosname)[ 2 ]
423
412
@debug (" Type: " , tname)
424
413
tsym = symbol (tname)
425
414
@@ -568,7 +557,7 @@ function _order(d::Dict)
568
557
tlist
569
558
end
570
559
571
- _rostypestr (mod:: ROSModule , name:: String ) = string (mod. name ," /" ,name)
560
+ _rostypestr (mod:: ROSModule , name:: String ) = string (_name ( mod) ," /" ,name)
572
561
function _splittypestr (typestr:: String )
573
562
if ! _isrostype (typestr)
574
563
error (string (" Invalid message type '$typestr ', " ,
@@ -634,6 +623,10 @@ _typerepr{T}(::Type{T}) = error("Not a ROS type")
634
623
_srv_reqtype {T} ( :: Type{T} ) = error (" Not a ROS Service type" )
635
624
_srv_resptype {T} (:: Type{T} ) = error (" Not a ROS Service type" )
636
625
626
+ # Accessors for the package name
627
+ _name (p:: ROSPackage ) = p. name
628
+ _name (m:: ROSModule ) = _name (m. pkg)
629
+
637
630
# Get the full ROS name for a module (e.g., 'std_msgs.msg' or nav_msgs.srv')
638
- _modname (m:: ROSMsgModule ) = string (m . name , " .msg" )
639
- _modname (m:: ROSSrvModule ) = string (m . name , " .srv" )
631
+ _fullname (m:: ROSMsgModule ) = string (_name (m) , " .msg" )
632
+ _fullname (m:: ROSSrvModule ) = string (_name (m) , " .srv" )
0 commit comments