[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