Module: Syskit

Extended by:
Roby::DRoby::V5::DRobyConstant::Dump
Defined in:
lib/syskit/base.rb,
lib/syskit/port.rb,
lib/syskit/test.rb,
lib/yard-syskit.rb,
lib/syskit/robot.rb,
lib/syskit/actions.rb,
lib/syskit/gui/ide.rb,
lib/syskit/runtime.rb,
lib/syskit/version.rb,
lib/syskit/cli/main.rb,
lib/syskit/graphviz.rb,
lib/syskit/gui/page.rb,
lib/syskit/property.rb,
lib/syskit/roby_app.rb,
lib/syskit/roby_app.rb,
lib/syskit/ros/node.rb,
lib/syskit/component.rb,
lib/syskit/data_flow.rb,
lib/syskit/test/base.rb,
lib/syskit/test/self.rb,
lib/syskit/test/spec.rb,
lib/syskit/deployment.rb,
lib/syskit/exceptions.rb,
lib/syskit/gui/browse.rb,
lib/syskit/properties.rb,
lib/syskit/composition.rb,
lib/syskit/gui/testing.rb,
lib/syskit/models/base.rb,
lib/syskit/models/port.rb,
lib/syskit/placeholder.rb,
lib/syskit/port_access.rb,
lib/syskit/cli/gen_main.rb,
lib/syskit/data_service.rb,
lib/syskit/gui/composer.rb,
lib/syskit/task_context.rb,
lib/syskit/gui/html_page.rb,
lib/syskit/gui/ruby_item.rb,
lib/syskit/live_property.rb,
lib/syskit/actions/action.rb,
lib/syskit/actions/profile.rb,
lib/syskit/gui/instanciate.rb,
lib/syskit/gui/state_label.rb,
lib/syskit/gui/widget_list.rb,
lib/syskit/roby_app/plugin.rb,
lib/syskit/roby_app/plugin.rb,
lib/syskit/shell_interface.rb,
lib/syskit/connection_graph.rb,
lib/syskit/models/component.rb,
lib/syskit/orogen_namespace.rb,
lib/syskit/test/action_test.rb,
lib/syskit/connection_graphs.rb,
lib/syskit/gui/batch_manager.rb,
lib/syskit/gui/model_browser.rb,
lib/syskit/gui/runtime_state.rb,
lib/syskit/models/deployment.rb,
lib/syskit/roby_app/rest_api.rb,
lib/syskit/roby_app/toplevel.rb,
lib/syskit/ruby_task_context.rb,
lib/syskit/test/profile_test.rb,
lib/syskit/abstract_component.rb,
lib/syskit/bound_data_service.rb,
lib/syskit/gui/page_extension.rb,
lib/syskit/instance_selection.rb,
lib/syskit/models/composition.rb,
lib/syskit/models/orogen_base.rb,
lib/syskit/models/placeholder.rb,
lib/syskit/models/port_access.rb,
lib/syskit/network_generation.rb,
lib/syskit/runtime/exceptions.rb,
lib/syskit/droby/v5/droby_dump.rb,
lib/syskit/gui/job_state_label.rb,
lib/syskit/models/data_service.rb,
lib/syskit/models/task_context.rb,
lib/syskit/remote_state_getter.rb,
lib/syskit/test/component_test.rb,
lib/syskit/actions/action_model.rb,
lib/syskit/dependency_injection.rb,
lib/syskit/gui/app_start_dialog.rb,
lib/syskit/instance_requirements.rb,
lib/syskit/models/faceted_access.rb,
lib/syskit/robot/device_instance.rb,
lib/syskit/test/roby_app_helpers.rb,
lib/syskit/actual_data_flow_graph.rb,
lib/syskit/gui/global_state_label.rb,
lib/syskit/gui/job_status_display.rb,
lib/syskit/robot/robot_definition.rb,
lib/syskit/roby_app/configuration.rb,
lib/syskit/roby_app/logging_group.rb,
lib/syskit/test/task_context_test.rb,
lib/syskit/gui/expanded_job_status.rb,
lib/syskit/gui/logging_groups_item.rb,
lib/syskit/models/deployment_group.rb,
lib/syskit/models/placeholder_task.rb,
lib/syskit/robot/communication_bus.rb,
lib/syskit/roby_app/process_server.rb,
lib/syskit/test/flexmock_extension.rb,
lib/syskit/test/profile_assertions.rb,
lib/syskit/models/composition_child.rb,
lib/syskit/network_generation/async.rb,
lib/syskit/roby_app/robot_extension.rb,
lib/syskit/roby_app/single_file_dsl.rb,
lib/syskit/coordination/data_monitor.rb,
lib/syskit/droby/v5/typelib_registry.rb,
lib/syskit/gui/logging_configuration.rb,
lib/syskit/models/bound_data_service.rb,
lib/syskit/network_generation/engine.rb,
lib/syskit/network_generation/logger.rb,
lib/syskit/test/network_manipulation.rb,
lib/syskit/coordination/port_handling.rb,
lib/syskit/gui/component_network_view.rb,
lib/syskit/instance_requirements_task.rb,
lib/syskit/roby_app/unmanaged_process.rb,
lib/syskit/ros/roby_app/configuration.rb,
lib/syskit/runtime/update_task_states.rb,
lib/syskit/task_configuration_manager.rb,
lib/syskit/test/action_interface_test.rb,
lib/syskit/coordination/plan_extension.rb,
lib/syskit/models/dynamic_data_service.rb,
lib/syskit/robot/slave_device_instance.rb,
lib/syskit/test/execution_expectations.rb,
lib/syskit/test/ruby_task_context_test.rb,
lib/syskit/dependency_injection_context.rb,
lib/syskit/models/configured_deployment.rb,
lib/syskit/robot/master_device_instance.rb,
lib/syskit/models/specialization_manager.rb,
lib/syskit/runtime/connection_management.rb,
lib/syskit/gui/logging_configuration_item.rb,
lib/syskit/roby_app/logging_configuration.rb,
lib/syskit/gui/component_network_base_view.rb,
lib/syskit/network_generation/merge_solver.rb,
lib/syskit/coordination/models/data_monitor.rb,
lib/syskit/roby_app/rest_deployment_manager.rb,
lib/syskit/roby_app/unmanaged_tasks_manager.rb,
lib/syskit/runtime/update_deployment_states.rb,
lib/syskit/actions/interface_model_extension.rb,
lib/syskit/coordination/models/port_handling.rb,
lib/syskit/gui/model_views/ruby_task_context.rb,
lib/syskit/models/bound_dynamic_data_service.rb,
lib/syskit/models/composition_specialization.rb,
lib/syskit/coordination/data_monitoring_error.rb,
lib/syskit/coordination/data_monitoring_table.rb,
lib/syskit/coordination/models/task_extension.rb,
lib/syskit/coordination/task_script_extension.rb,
lib/syskit/coordination/transaction_extension.rb,
lib/syskit/gui/logging_configuration_item_base.rb,
lib/syskit/network_generation/dataflow_dynamics.rb,
lib/syskit/network_generation/dataflow_computation.rb,
lib/syskit/runtime/apply_requirement_modifications.rb,
lib/syskit/coordination/models/data_monitoring_table.rb,
lib/syskit/coordination/data_monitoring_error_matcher.rb,
lib/syskit/network_generation/system_network_deployer.rb,
lib/syskit/coordination/fault_response_table_extension.rb,
lib/syskit/network_generation/system_network_generator.rb,
lib/syskit/coordination/models/fault_response_table_extension.rb,
lib/syskit/coordination/models/data_monitor_predicate_from_block.rb

Defined Under Namespace

Modules: Actions, CLI, ComBus, Coordination, DRoby, DataService, Device, GUI, Models, NetworkGeneration, OroGenNamespace, Placeholder, PortAccess, ROS, Robot, RobyApp, Runtime, Test, YARD Classes: :DataFlow, ActualDataFlowGraph, Ambiguous, AmbiguousAutoConnection, AmbiguousImplicitServiceSelection, AmbiguousIndirectCompositionSelection, AmbiguousPortMappings, AmbiguousPortOnCompositeModel, AmbiguousServiceMapping, AmbiguousServiceSelection, AmbiguousSpecialization, BoundDataService, Component, Composition, ConfigError, ConflictingDeviceAllocation, ConnectionGraph, DataFlow, DataflowPropagationError, DependencyInjection, DependencyInjectionContext, Deployment, DeviceAllocationFailed, DotCrashError, DotFailedError, Graphviz, IncompatibleComponentModels, InputPort, InputWriter, InstanceRequirements, InstanceRequirementsTask, InstanceSelection, InstanciationError, InternalError, InvalidAutoConnection, InvalidComponentSelection, InvalidCompositionChildSelection, InvalidDynamicServiceBlock, InvalidPortMapping, InvalidProvides, InvalidSelection, InvalidState, LiveProperty, MissingDeployments, ModifyingFinalizedPortInfo, NameResolutionError, NoMatchingService, NoMatchingServiceForCompositionChild, NonSymmetricSpecializationConstraint, OutputPort, OutputReader, Port, PortAccessFailure, PortAccessor, PortNotFound, Properties, Property, PropertyUpdateError, RemoteStateGetter, RubyTaskContext, SelfConnection, ShellInterface, SpecError, SyskitConfigurationPrecedence, TaskAllocationFailed, TaskConfigurationManager, TaskContext, TaskNameAlreadyInUse, TaskNameRequired, UnknownServiceName, WrongPortConnectionDirection, WrongPortConnectionTypes

Constant Summary collapse

BasicObject =
Object
SYSKIT_LIB_DIR =
File.expand_path(File.dirname(__FILE__))
SYSKIT_ROOT_DIR =
File.expand_path(File.join("..", '..'), File.dirname(__FILE__))
VERSION =
"0.1"
COLOR_PALETTE =

A set of colors to be used in graphiz graphs

%w{#FF9955 #FF0000 #bb9c21 #37c637 #62816e #2A7FFF #AA00D4 #D40055 #0000FF}
Flows =
Roby::RelationSpace(Component)
ActualDataFlow =

Represents the actual connection graph between task context proxies. Its vertices are instances of Orocos::TaskContext, and edges are mappings from [source_port_name, sink_port_name] pairs to the connection policy between these ports.

Syskit::ActualDataFlow is the actual global graph instance in which the overall system connections are maintained in practice. Its vertices are Orocos::TaskContext and the edge information a mapping of the form

(source_port_name, sink_port_name) => policy

Syskit::RequiredDataFlow is the graph instance that manages concrete connections between Syskit::TaskContext (i.e. where all the forwarding through compositions has been removed). It is updated as needed by Runtime::ConnectionManagement#update_required_dataflow_graph. Its vertices are Syskit::TaskContext instances and the edge information a mapping of the form

(source_port_name, sink_port_name) => policy

Syskit::Flows::DataFlow is the flow graph that is generated by the engine. Its vertices are Syskit::Component, it contains “virtual” connections (connections between composition ports and task ports). The edge information is of the form

(source_port_name, sink_port_name) => policy

Since compositions are still in this graph, source_port_name and sink_port_name can be either outputs or inputs. In all the other graphs, they are guaranteed to be output ports resp. input ports.

ActualDataFlowGraph.new
RequiredDataFlow =

Represents the actual connection graph between task context proxies. Its vertices are instances of Orocos::TaskContext, and edges are mappings from [source_port_name, sink_port_name] pairs to the connection policy between these ports.

Syskit::ActualDataFlow is the actual global graph instance in which the overall system connections are maintained in practice. Its vertices are Orocos::TaskContext and the edge information a mapping of the form

(source_port_name, sink_port_name) => policy

Syskit::RequiredDataFlow is the graph instance that manages concrete connections between Syskit::TaskContext (i.e. where all the forwarding through compositions has been removed). It is updated as needed by Syskit::Runtime::ConnectionManagement#update_required_dataflow_graph. Its vertices are Syskit::TaskContext instances and the edge information a mapping of the form

(source_port_name, sink_port_name) => policy

Syskit::Flows::DataFlow is the flow graph that is generated by the engine. Its vertices are Syskit::Component, it contains “virtual” connections (connections between composition ports and task ports). The edge information is of the form

(source_port_name, sink_port_name) => policy

Since compositions are still in this graph, source_port_name and sink_port_name can be either outputs or inputs. In all the other graphs, they are guaranteed to be output ports resp. input ports.

ConnectionGraph.new
AbstractComponent =
Roby::TaskService.new_submodel

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Attribute Details

#current_colorObject (readonly)

Used by the to_dot* methods for color allocation



5
6
7
# File 'lib/syskit/graphviz.rb', line 5

def current_color
  @current_color
end

Class Method Details

.allocate_colorObject

Returns a color from COLOR_PALETTE, rotating each time the method is called. It is used by the to_dot* methods.



10
11
12
13
# File 'lib/syskit/graphviz.rb', line 10

def self.allocate_color
    @current_color = (@current_color + 1) % COLOR_PALETTE.size
    COLOR_PALETTE[@current_color]
end

.confObject

The main configuration object

For consistency reasons, it is also available as Roby.conf.syskit when running in a Roby application



29
30
31
# File 'lib/syskit/roby_app.rb', line 29

def conf
    @conf ||= RobyApp::Configuration.new(Roby.app)
end

.connect(source, sink, policy) ⇒ Array<(Port,Port)>

Generic implementation of connection handling

This is used to connect everything that can be connected: component and service instances, composition child models. The method resolves both source and sinks as a set of ports using #each_output_port and #each_input_port if they are not plain ports, finds which connections need to be created using resolve_connections and then calls output_port.connect_to input_port for each of these connections.

Parameters:

  • source (Port, Models::Port, #each_output_port)

    the source part of the connection

  • sink (Port, Models::Port, #each_input_port)

    the sink part of the connection

  • policy (Hash)

    the connection policy

Returns:

  • (Array<(Port,Port)>)

    the set of connections actually created

Raises:



151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/syskit/connection_graphs.rb', line 151

def self.connect(source, sink, policy)
    output_ports =
        if source.respond_to?(:each_output_port)
            source.each_output_port.to_a
        else [source]
        end
    input_ports =
        if sink.respond_to?(:each_input_port)
            sink.each_input_port.to_a
        else [sink]
        end

    connections = resolve_connections(output_ports, input_ports)
    if connections.empty?
        raise InvalidAutoConnection.new(source, sink) 
    end

    connections.each do |out_port, in_port|
        out_port.connect_to in_port, policy
    end

    connections
end

.create_proxy_task_model_for(models, **options) ⇒ Object

Deprecated.

use Placeholder.create_for



333
334
335
336
# File 'lib/syskit/models/placeholder.rb', line 333

def self.create_proxy_task_model_for(models, **options)
    Roby.warn_deprecated "Syskit.create_proxy_task_model is deprecated use Models::Placeholder.create_for instead"
    Models::Placeholder.create_for(models, **options)
end

.extend_model(model, &block) ⇒ Object

Extend an auto-generated with custom code

This is used mainly for Syskit models generated from oroGen models, in extension files within models/orogen/:

Syskit.extend_model OroGen.test.Task do
  def configure
    super
    ...
  end
end


21
22
23
# File 'lib/syskit/models/task_context.rb', line 21

def self.extend_model(model, &block)
    model.class_eval(&block)
end

.proxy_task_model_for(models) ⇒ Object

Deprecated.

use Placholder.for



339
340
341
342
# File 'lib/syskit/models/placeholder.rb', line 339

def self.proxy_task_model_for(models)
    Roby.warn_deprecated "Syskit.proxy_task_model_for is deprecated use Models::Placeholder.for instead"
    Models::Placeholder.for(models)
end

.register_process_server(name, client, log_dir = nil) ⇒ ProcessServerConfig

Make a process server available to syskit

Parameters:

  • name (String)

    the process server name

  • client (Object)

    the process server client object, which has to conform to the API of Orocos::Remotes::Client

  • log_dir (String) (defaults to: nil)

    the path to the server's log directory

Returns:

  • (ProcessServerConfig)


8
9
10
# File 'lib/syskit/deployment.rb', line 8

def register_process_server(name, client, log_dir = nil)
    Syskit.conf.register_process_server(name, client, log_dir = nil)
end

.resolve_connections(output_ports, input_ports) ⇒ Array<(Port,Port)>

Resolves possible connections between a set of output ports and a set of input ports

Parameters:

  • output_ports (Array<Port>)

    the set of output ports

  • input_ports (Array<Port>)

    the set of output ports

Returns:

  • (Array<(Port,Port)>)

    the set of connections

Raises:



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/syskit/connection_graphs.rb', line 65

def self.resolve_connections(output_ports, input_ports)
    Models.debug do
        Models.debug "resolving connections from #{output_ports.map(&:name).sort.join(",")} to #{input_ports.map(&:name).sort.join(",")}"
        break
    end

    result = Array.new
    matched_input_ports = Set.new

    # First resolve the exact matches
    remaining_outputs = output_ports.dup
    remaining_outputs.delete_if do |out_port|
        in_port = input_ports.
            find do |in_port|
                in_port.name == out_port.name &&
                    in_port.type == out_port.type
            end
        if in_port
            result << [out_port, in_port]
            matched_input_ports << in_port
            true
        end
    end

    # In the second stage, we match by type. If there are ambiguities,
    # we try to resolve them by excluding the ports that had an exact
    # match. This is, by experience, expected behaviour in practice
    remaining_outputs.each do |out_port|
        candidates = input_ports.
            find_all { |in_port| in_port.type == out_port.type }
        if candidates.size > 1
            filtered_candidates = candidates.
                find_all { |p| !matched_input_ports.include?(p) }
            if filtered_candidates.size == 1
                candidates = filtered_candidates
            end
        end
        if candidates.size > 1
            raise AmbiguousAutoConnection.new(out_port, candidates)
        elsif candidates.size == 1
            result << [out_port, candidates.first]
        end
    end

    # Finally, verify that we autoconnect multiple outputs to a single
    # input only if it is a multiplexing port
    outputs_per_input = Hash.new
    result.each do |out_port, in_port|
        if outputs_per_input[in_port]
            if !in_port.multiplexes?
                candidates = result.map { |o, i| o if i == in_port }.
                    compact
                raise AmbiguousAutoConnection.new(in_port, candidates)
            end
        end
        outputs_per_input[in_port] = out_port
    end

    Models.debug do
        result.each do |out_port, in_port|
            Models.debug "  #{out_port.name} => #{in_port.name}"
        end
        if !remaining_outputs.empty?
            Models.debug "  no matches found for outputs #{remaining_outputs.map(&:name).sort.join(",")}"
        end
        break
    end
    result
end

.resolve_proxy_task_model_requirements(models) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Deprecated.

use Placeholder.resolve_requirements instead



327
328
329
330
# File 'lib/syskit/models/placeholder.rb', line 327

def self.resolve_proxy_task_model_requirements(models)
    Roby.warn_deprecated "Syskit.resolve_proxy_task_model_requirements is deprecated use Models::Placeholder.resolve_models_argument instead"
    Models::Placeholder.resolve_requirements(models)
end

.update_connection_policy(old, new) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/syskit/connection_graphs.rb', line 12

def self.update_connection_policy(old, new)
    old = old.dup
    new = new.dup
    if old.empty?
        return new
    elsif new.empty?
        return old
    end

    old_fallback = old.delete(:fallback_policy)
    new_fallback = new.delete(:fallback_policy)
    if old_fallback && new_fallback
        fallback = update_connection_policy(old_fallback, new_fallback)
    else
        fallback = old_fallback || new_fallback
    end

    old = Orocos::Port.validate_policy(old)
    new = Orocos::Port.validate_policy(new)

    type = old[:type] || new[:type]
    merged = old.merge(new) do |key, old_value, new_value|
        if old_value == new_value
            old_value
        elsif key == :type
            raise ArgumentError, "connection types mismatch: #{old_value} != #{new_value}"
        elsif key == :transport
            if old_value == 0 then new_value
            elsif new_value == 0 then old_value
            else
                raise ArgumentError, "policy mismatch for transport: #{old_value} != #{new_value}"
            end
        elsif key == :size
            [old_value, new_value].max
        else
            raise ArgumentError, "policy mismatch for #{key}: #{old_value} != #{new_value}"
        end
    end

    if fallback
        merged[:fallback_policy] = fallback
    end
    merged
end

.warn_about_new_naming_conventionObject



16
17
18
# File 'lib/syskit/roby_app/plugin.rb', line 16

def self.warn_about_new_naming_convention
    Syskit.warn 'We have finally adopted a systematic naming convention in Syskit, this led to files and classes to be renamed'
end