[PATCH] Added support for loading orogen extensions via command line.
Matthias Goldhoorn
matthias.goldhoorn at dfki.de
Tue Nov 12 11:49:25 CET 2013
---
bin/orogen | 9 +++++++++
lib/orogen/gen/project.rb | 14 +++++++++++++-
lib/orogen/spec/task_context.rb | 33 ++++++++++++++++++++++++++++++++-
lib/orogen/templates/project.orogen | 9 +++++++++
4 files changed, 63 insertions(+), 2 deletions(-)
diff --git a/bin/orogen b/bin/orogen
index 34e3776..e9dcec7 100755
--- a/bin/orogen
+++ b/bin/orogen
@@ -7,6 +7,7 @@ require 'optparse'
Typelib.load_type_plugins = false
DEFAULT_TRANSPORTS = %w{corba typelib mqueue}
+DEFAULT_EXTENSIONS = %w{}
verbosity = 0
extended_states = true
@@ -15,6 +16,7 @@ Orocos::TypekitMarshallers::TypeInfo::Plugin.rtt_scripting = true
imported_typekits = []
transports = []
+extensions = []
no_transports = false
explicit_typekit_slice = false
@@ -41,6 +43,12 @@ parser = OptionParser.new do |opt|
explicit_typekit_slice = true
Orocos::Generation.typekit_slice = slice_size
end
+
+ opt.on('--extensions=NAME[,NAME]', "selects the extensions that should be enabled (by default, #{DEFAULT_EXTENSIONS.join(", ")} are enabled)") do |v|
+ v.split(',').each do |name|
+ extensions << name
+ end
+ end
opt.on('--transports=NAME[,NAME]', "selects the transports that should be enabled (by default, #{DEFAULT_TRANSPORTS.join(", ")} are enabled)") do |transport_names|
transport_names.split(',').each do |name|
@@ -145,6 +153,7 @@ begin
filename = files.first
Orocos.beautify_loading_errors(filename) do
component.enable_transports(*transports)
+ component.enable_extension(extensions)
component.load(filename, verbosity > 1)
imported_typekits.each do |tk_name|
begin
diff --git a/lib/orogen/gen/project.rb b/lib/orogen/gen/project.rb
index 6ae046a..2247e08 100644
--- a/lib/orogen/gen/project.rb
+++ b/lib/orogen/gen/project.rb
@@ -996,7 +996,11 @@ def task_context(name, options = Hash.new, &block)
typekit.perform_pending_loads
end
- task = external_task_context(name, options, &block)
+
+ task = external_task_context(name, options) do
+ Orocos::Spec::TaskContext.apply_default_extensions(self)
+ instance_eval(&block)
+ end
if extended_states?
task.extended_state_support
end
@@ -1366,6 +1370,14 @@ def enable_transports(*transport_names)
end
@enabled_transports |= transport_names.to_set
end
+
+ # Enable the given transports
+ def enable_extension(extensions)
+ extensions.each do |ext|
+ Orocos::Spec::TaskContext.default_extensions << ext
+ end
+ end
+
end
Component = Project
diff --git a/lib/orogen/spec/task_context.rb b/lib/orogen/spec/task_context.rb
index ddea01b..e4af130 100644
--- a/lib/orogen/spec/task_context.rb
+++ b/lib/orogen/spec/task_context.rb
@@ -25,6 +25,12 @@ def supercall(default, m, *args, &block)
default
end
end
+
+ # Called at registration time so that the extension can apply some default stuff
+ #
+ # @param [TaskContext]
+ def registered_on(task_context)
+ end
end
# Model of a task context, i.e. a component interface
@@ -43,6 +49,30 @@ class TaskContext
# Gets or sets the documentation string for this task context
dsl_attribute :doc
+ class << self
+ # @return [Symbol] set of method names that should be called on
+ # the newly created task at creation time. This is meant to
+ # register some default extensions automatically
+ attr_reader :default_extensions
+ attr_reader :extensions_disabled
+
+ def disable_default_extensions
+ @extensions_disabled = true
+ end
+
+ def apply_default_extensions(task_context)
+ if !extensions_disabled
+ default_extensions.each do |ext|
+ task_context.send(ext)
+ end
+ end
+ end
+ end
+ @extensions_disabled = false
+ @default_extensions = Array.new
+
+ enumerate_inherited_map 'default_extension', 'default_extensions'
+
# Set of extensions registered for this task
#
# Extensions are named objects of arbitrary type that can be used to
@@ -62,6 +92,7 @@ def register_extension(obj)
raise ArgumentError, "there is already an extension called #{name}: #{old}"
else
extensions << obj
+ obj.registered_on(self)
end
end
@@ -283,7 +314,7 @@ def initialize(project = nil, name = nil)
@dynamic_ports = Array.new
@event_ports = Hash.new
@initial_state = 'Stopped'
-
+ @default_extensions = Array.new
@fixed_initial_state = false
@needs_configuration = false
diff --git a/lib/orogen/templates/project.orogen b/lib/orogen/templates/project.orogen
index b99d49f..6c77c94 100644
--- a/lib/orogen/templates/project.orogen
+++ b/lib/orogen/templates/project.orogen
@@ -3,6 +3,8 @@ enable_transports('<%= component.enabled_transports.sort.join("', '") %>')
<% end %>
self.extended_states = <%= Orocos::Generation.extended_states_enabled? %>
+Orocos::Spec::TaskContext.disable_default_extensions
+
<% used_typekits.each do |tk| %>
<% if !tk.virtual? %>
using_typekit "<%= tk.name %>"
@@ -10,3 +12,10 @@ using_typekit "<%= tk.name %>"
<% end %>
<%= File.read(component.deffile) %>
+
+
+<% self_tasks.each do |task_context| %>
+<% Orocos::Spec::TaskContext.default_extensions.each do |ext| %>
+find_task_context("<%= task_context.name %>").send(ext)
+<% end %>
+<% end %>
--
1.7.10.4
--------------080009020403010402020807--
More information about the Rock-dev
mailing list