@@ -39,24 +39,24 @@ const _rospy_imports = Dict{String,ROSPackage}()
3939const _rospy_objects = Dict {String,PyObject} ()
4040const _rospy_modules = Dict {String,PyObject} ()
4141
42- const _ros_builtin_types = Dict {String, Symbol } (
43- " bool" => : Bool ,
44- " int8" => : Int8 ,
45- " int16" => : Int16 ,
46- " int32" => : Int32 ,
47- " int64" => : Int64 ,
48- " uint8" => : UInt8 ,
49- " uint16" => : UInt16 ,
50- " uint32" => : UInt32 ,
51- " uint64" => : UInt64 ,
52- " float32" => : Float32 ,
53- " float64" => : Float64 ,
54- " string" => : String ,
55- " time" => : Time ,
56- " duration" => : Duration ,
42+ const _ros_builtin_types = Dict {String,DataType } (
43+ " bool" => Bool,
44+ " int8" => Int8,
45+ " int16" => Int16,
46+ " int32" => Int32,
47+ " int64" => Int64,
48+ " uint8" => UInt8,
49+ " uint16" => UInt16,
50+ " uint32" => UInt32,
51+ " uint64" => UInt64,
52+ " float32" => Float32,
53+ " float64" => Float64,
54+ " string" => String,
55+ " time" => Time,
56+ " duration" => Duration,
5757 # Deprecated by ROS but supported here
58- " char" => : UInt8 ,
59- " byte" => : Int8 ,
58+ " char" => UInt8,
59+ " byte" => Int8,
6060 )
6161
6262# Abstract supertypes of all generated types
@@ -143,18 +143,18 @@ function _rosimport(package::String, ismsg::Bool, names::String...)
143143end
144144
145145"""
146- rostypegen()
146+ rostypegen(rosrootmod::Module=Main )
147147
148- Initiate the Julia type generation process after importing some ROS types. Creates modules in `Main`
149- with the same behavior as imported ROS modules in python. Should only be called once, after all
150- `@rosimport` statements are done.
148+ Initiate the Julia type generation process after importing some ROS types. Creates modules in
149+ rootrosmod (default is `Main`) with the same behavior as imported ROS modules in python.
150+ Should only be called once, after all `@rosimport` statements are done.
151151"""
152- function rostypegen ()
152+ function rostypegen (rosrootmod :: Module = Main )
153153 global _rospy_imports
154154 pkgdeps = _collectdeps (_rospy_imports)
155155 pkglist = _order (pkgdeps)
156156 for pkg in pkglist
157- buildpackage (_rospy_imports[pkg])
157+ buildpackage (_rospy_imports[pkg], rosrootmod )
158158 end
159159end
160160
@@ -277,38 +277,47 @@ function _import_rospy_pkg(package::String)
277277end
278278
279279# The function that creates and fills the generated top-level modules
280- function buildpackage (pkg:: ROSPackage )
280+ function buildpackage (pkg:: ROSPackage , rosrootmod :: Module )
281281 @debug (" Building package: " , _name (pkg))
282282
283283 # Create the top-level module for the package in Main
284284 pkgsym = Symbol (_name (pkg))
285- pkgcode = Expr (:toplevel , :(module ($ pkgsym) end ))
286- Main. eval (pkgcode)
287- pkgmod = Main. eval (pkgsym)
285+ pkgcode = :(module ($ pkgsym) end )
286+ pkginitcode = :(function __init__ () end )
288287
289288 # Add msg and srv submodules if needed
290289 @debug_addindent
291290 if length (pkg. msg. members) > 0
292291 msgmod = :(module msg end )
293- msgcode = modulecode (pkg. msg)
292+ msgcode = modulecode (pkg. msg, rosrootmod )
294293 for expr in msgcode
295294 push! (msgmod. args[3 ]. args, expr)
296295 end
297- eval (pkgmod, msgmod)
296+ push! (pkgcode. args[3 ]. args, msgmod)
297+ for typ in pkg. msg. members
298+ push! (pkginitcode. args[2 ]. args, :(@rosimport $ (pkgsym). msg: $ (Symbol (typ))))
299+ end
298300 end
299301 if length (pkg. srv. members) > 0
300302 srvmod = :(module srv end )
301- srvcode = modulecode (pkg. srv)
303+ srvcode = modulecode (pkg. srv, rosrootmod )
302304 for expr in srvcode
303305 push! (srvmod. args[3 ]. args, expr)
304306 end
305- eval (pkgmod, srvmod)
307+ push! (pkgcode. args[3 ]. args, srvmod)
308+ for typ in pkg. srv. members
309+ push! (pkginitcode. args[2 ]. args, :(@rosimport $ (pkgsym). srv: $ (Symbol (typ))))
310+ end
306311 end
312+ push! (pkgcode. args[3 ]. args, :(import RobotOS. @rosimport ))
313+ push! (pkgcode. args[3 ]. args, pkginitcode)
314+ pkgcode = Expr (:toplevel , pkgcode)
315+ rosrootmod. eval (pkgcode)
307316 @debug_subindent
308317end
309318
310319# Generate all code for a .msg or .srv module
311- function modulecode (mod:: ROSModule )
320+ function modulecode (mod:: ROSModule , rosrootmod :: Module )
312321 @debug (" submodule: " , _fullname (mod))
313322 modcode = Expr[]
314323
@@ -325,7 +334,7 @@ function modulecode(mod::ROSModule)
325334 end
326335 )
327336 # Import statement specific to the module
328- append! (modcode, _importexprs (mod))
337+ append! (modcode, _importexprs (mod, rosrootmod ))
329338 # The exported names
330339 push! (modcode, _exportexpr (mod))
331340
@@ -340,20 +349,20 @@ function modulecode(mod::ROSModule)
340349end
341350
342351# The imports specific to each module, including dependant packages
343- function _importexprs (mod:: ROSMsgModule )
352+ function _importexprs (mod:: ROSMsgModule , rosrootmod :: Module )
344353 imports = Expr[Expr (:import , :RobotOS , :AbstractMsg )]
345354 othermods = filter (d -> d != _name (mod), mod. deps)
346- append! (imports, [Expr (:using ,:Main ,Symbol (m),:msg ) for m in othermods])
355+ append! (imports, [Expr (:using ,fullname (rosrootmod) ... ,Symbol (m),:msg ) for m in othermods])
347356 imports
348357end
349- function _importexprs (mod:: ROSSrvModule )
358+ function _importexprs (mod:: ROSSrvModule , rosrootmod :: Module )
350359 imports = Expr[
351360 Expr (:import , :RobotOS , :AbstractSrv ),
352361 Expr (:import , :RobotOS , :AbstractService ),
353362 Expr (:import , :RobotOS , :_srv_reqtype ),
354363 Expr (:import , :RobotOS , :_srv_resptype ),
355364 ]
356- append! (imports, [Expr (:using ,:Main ,Symbol (m),:msg ) for m in mod. deps])
365+ append! (imports, [Expr (:using ,fullname (rosrootmod) ... ,Symbol (m),:msg ) for m in mod. deps])
357366 imports
358367end
359368
@@ -519,7 +528,7 @@ function _addtypemember!(exprs, namestr, typestr)
519528 end
520529 j_typ = _ros_builtin_types[typestr]
521530 # Compute the default value now
522- j_def = @eval _typedefault ($ j_typ)
531+ j_def = _typedefault (j_typ)
523532 end
524533
525534 namesym = Symbol (namestr)
0 commit comments