@@ -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