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.(File.dirname(__FILE__))
- SYSKIT_ROOT_DIR =
File.(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
-
#current_color ⇒ Object
readonly
Used by the to_dot* methods for color allocation.
Class Method Summary collapse
-
.allocate_color ⇒ Object
Returns a color from COLOR_PALETTE, rotating each time the method is called.
-
.conf ⇒ Object
The main configuration object.
-
.connect(source, sink, policy) ⇒ Array<(Port,Port)>
Generic implementation of connection handling.
-
.create_proxy_task_model_for(models, **options) ⇒ Object
deprecated
Deprecated.
use Placeholder.create_for
-
.extend_model(model, &block) ⇒ Object
Extend an auto-generated with custom code.
-
.proxy_task_model_for(models) ⇒ Object
deprecated
Deprecated.
use Placholder.for
-
.register_process_server(name, client, log_dir = nil) ⇒ ProcessServerConfig
Make a process server available to syskit.
-
.resolve_connections(output_ports, input_ports) ⇒ Array<(Port,Port)>
Resolves possible connections between a set of output ports and a set of input ports.
-
.resolve_proxy_task_model_requirements(models) ⇒ Object
deprecated
private
Deprecated.
use Placeholder.resolve_requirements instead
- .update_connection_policy(old, new) ⇒ Object
- .warn_about_new_naming_convention ⇒ Object
Instance Attribute Details
#current_color ⇒ Object (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_color ⇒ Object
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 |
.conf ⇒ Object
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.
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
use Placeholder.create_for
333 334 335 336 |
# File 'lib/syskit/models/placeholder.rb', line 333 def self.create_proxy_task_model_for(models, **) Roby.warn_deprecated "Syskit.create_proxy_task_model is deprecated use Models::Placeholder.create_for instead" Models::Placeholder.create_for(models, **) 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
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
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
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.
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 |