roby 0.8.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.deep-cover.rb +3 -0
- data/.gitattributes +1 -0
- data/.gitignore +24 -0
- data/.simplecov +10 -0
- data/.travis.yml +17 -0
- data/.yardopts +4 -0
- data/Gemfile +15 -0
- data/README.md +11 -0
- data/Rakefile +47 -177
- data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
- data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
- data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
- data/benchmark/{genom.rb → attic/genom.rb} +0 -0
- data/benchmark/attic/transactions.rb +62 -0
- data/benchmark/plan_basic_operations.rb +28 -0
- data/benchmark/relations/graph.rb +63 -0
- data/benchmark/ruby/identity.rb +18 -0
- data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
- data/benchmark/ruby/yield_vs_block.rb +35 -0
- data/benchmark/run +5 -0
- data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
- data/benchmark/transactions.rb +99 -51
- data/bin/roby +38 -197
- data/bin/roby-display +14 -0
- data/bin/roby-log +3 -176
- data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
- data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
- data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
- data/doc/guide/{src → attic}/abstraction/index.page +1 -1
- data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
- data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
- data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
- data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
- data/doc/guide/attic/cycle/error_handling.page +98 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
- data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
- data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
- data/doc/guide/{src → attic}/cycle/index.page +1 -1
- data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
- data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
- data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
- data/doc/guide/attic/plans/building_plans.page +89 -0
- data/doc/guide/attic/plans/code.page +192 -0
- data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
- data/doc/guide/attic/plans/index.page +7 -0
- data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
- data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
- data/doc/guide/attic/plans/querying_plans.page +5 -0
- data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
- data/doc/guide/config.yaml +7 -4
- data/doc/guide/ext/extended_menu.rb +29 -0
- data/doc/guide/ext/init.rb +6 -0
- data/doc/guide/ext/rdoc_links.rb +7 -6
- data/doc/guide/src/advanced_concepts/history.page +5 -0
- data/doc/guide/src/advanced_concepts/index.page +11 -0
- data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
- data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
- data/doc/guide/src/advanced_concepts/transactions.page +5 -0
- data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
- data/doc/guide/src/base.template +96 -0
- data/doc/guide/src/basics_shell_header.txt +5 -7
- data/doc/guide/src/building/action_coordination.page +96 -0
- data/doc/guide/src/building/actions.page +124 -0
- data/doc/guide/src/building/file_layout.page +71 -0
- data/doc/guide/src/building/index.page +50 -0
- data/doc/guide/src/building/patterns.page +86 -0
- data/doc/guide/src/building/patterns_forwarding.png +0 -0
- data/doc/guide/src/building/patterns_forwarding.svg +277 -0
- data/doc/guide/src/building/runtime.page +95 -0
- data/doc/guide/src/building/task_models.page +94 -0
- data/doc/guide/src/building/tasks.page +284 -0
- data/doc/guide/src/concepts/error_handling.page +100 -0
- data/doc/guide/src/concepts/exception_propagation.png +0 -0
- data/doc/guide/src/concepts/exception_propagation.svg +445 -0
- data/doc/guide/src/concepts/execution.page +85 -0
- data/doc/guide/src/concepts/execution.png +0 -0
- data/doc/guide/src/concepts/execution.svg +573 -0
- data/doc/guide/src/concepts/execution_cycle.png +0 -0
- data/doc/guide/src/concepts/garbage_collection.page +57 -0
- data/doc/guide/src/concepts/index.page +27 -0
- data/doc/guide/src/concepts/plans.page +101 -0
- data/doc/guide/src/concepts/policy.page +31 -0
- data/doc/guide/src/concepts/reactor.page +61 -0
- data/doc/guide/src/concepts/simple_plan_example.png +0 -0
- data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
- data/doc/guide/src/default.template +9 -74
- data/doc/guide/src/event_relations/forward.page +71 -0
- data/doc/guide/src/event_relations/index.page +12 -0
- data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
- data/doc/guide/src/event_relations/signal.page +55 -0
- data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
- data/doc/guide/src/htmldoc.metainfo +21 -8
- data/doc/guide/src/index.page +8 -3
- data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
- data/doc/guide/src/installation/publications.page +14 -0
- data/doc/guide/src/{introduction → installation}/videos.page +14 -7
- data/doc/guide/src/interacting/index.page +16 -0
- data/doc/guide/src/interacting/run.page +33 -0
- data/doc/guide/src/interacting/shell.page +95 -0
- data/doc/guide/src/plugins/creating_plugins.page +72 -0
- data/doc/guide/src/plugins/index.page +27 -5
- data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
- data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
- data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
- data/doc/guide/src/style_screen.css +687 -0
- data/doc/guide/src/task_relations/dependency.page +107 -0
- data/doc/guide/src/task_relations/executed_by.page +77 -0
- data/doc/guide/src/task_relations/index.page +12 -0
- data/doc/guide/src/task_relations/new_relations.page +119 -0
- data/doc/guide/src/task_relations/planned_by.page +46 -0
- data/doc/guide/src/tutorial/app.page +117 -0
- data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
- data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
- data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
- data/doc/guide/src/tutorial/events.page +195 -0
- data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
- data/doc/guide/src/tutorial/index.page +13 -0
- data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
- data/doc/guide/src/tutorial/relations_display.page +153 -0
- data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
- data/doc/guide/src/tutorial/shell.page +121 -0
- data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
- data/doc/guide/src/tutorial/tasks.page +374 -0
- data/lib/roby.rb +102 -47
- data/lib/roby/actions.rb +17 -0
- data/lib/roby/actions/action.rb +80 -0
- data/lib/roby/actions/interface.rb +45 -0
- data/lib/roby/actions/library.rb +23 -0
- data/lib/roby/actions/models/action.rb +224 -0
- data/lib/roby/actions/models/coordination_action.rb +58 -0
- data/lib/roby/actions/models/interface.rb +22 -0
- data/lib/roby/actions/models/interface_base.rb +294 -0
- data/lib/roby/actions/models/library.rb +12 -0
- data/lib/roby/actions/models/method_action.rb +90 -0
- data/lib/roby/actions/task.rb +114 -0
- data/lib/roby/and_generator.rb +125 -0
- data/lib/roby/app.rb +2795 -829
- data/lib/roby/app/autotest_console_reporter.rb +138 -0
- data/lib/roby/app/base.rb +21 -0
- data/lib/roby/app/cucumber.rb +2 -0
- data/lib/roby/app/cucumber/controller.rb +439 -0
- data/lib/roby/app/cucumber/helpers.rb +280 -0
- data/lib/roby/app/cucumber/world.rb +32 -0
- data/lib/roby/app/debug.rb +136 -0
- data/lib/roby/app/gen.rb +2 -0
- data/lib/roby/app/rake.rb +178 -38
- data/lib/roby/app/robot_config.rb +9 -0
- data/lib/roby/app/robot_names.rb +115 -0
- data/lib/roby/app/run.rb +3 -2
- data/lib/roby/app/scripts.rb +72 -0
- data/lib/roby/app/scripts/autotest.rb +173 -0
- data/lib/roby/app/scripts/display.rb +2 -0
- data/lib/roby/app/scripts/restart.rb +52 -0
- data/lib/roby/app/scripts/results.rb +17 -8
- data/lib/roby/app/scripts/run.rb +155 -24
- data/lib/roby/app/scripts/shell.rb +147 -62
- data/lib/roby/app/scripts/test.rb +107 -22
- data/lib/roby/app/test_reporter.rb +74 -0
- data/lib/roby/app/test_server.rb +159 -0
- data/lib/roby/app/vagrant.rb +47 -0
- data/lib/roby/backports.rb +16 -0
- data/lib/roby/cli/display.rb +190 -0
- data/lib/roby/cli/exceptions.rb +17 -0
- data/lib/roby/cli/gen/actions/class.rb +5 -0
- data/lib/roby/cli/gen/actions/test.rb +6 -0
- data/lib/roby/cli/gen/app/.yardopts +6 -0
- data/lib/roby/cli/gen/app/README.md +28 -0
- data/lib/roby/cli/gen/app/Rakefile +15 -0
- data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
- data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
- data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
- data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
- data/lib/roby/cli/gen/class/class.rb +6 -0
- data/lib/roby/cli/gen/class/test.rb +7 -0
- data/lib/roby/cli/gen/helpers.rb +203 -0
- data/lib/roby/cli/gen/module/module.rb +5 -0
- data/lib/roby/cli/gen/module/test.rb +6 -0
- data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
- data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
- data/lib/roby/cli/gen/task/class.rb +44 -0
- data/lib/roby/cli/gen/task/test.rb +6 -0
- data/lib/roby/cli/gen_main.rb +120 -0
- data/lib/roby/cli/log.rb +276 -0
- data/lib/roby/cli/log/flamegraph.html +499 -0
- data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
- data/lib/roby/cli/main.rb +153 -0
- data/lib/roby/coordination.rb +60 -0
- data/lib/roby/coordination/action_script.rb +25 -0
- data/lib/roby/coordination/action_state_machine.rb +125 -0
- data/lib/roby/coordination/actions.rb +106 -0
- data/lib/roby/coordination/base.rb +145 -0
- data/lib/roby/coordination/calculus.rb +40 -0
- data/lib/roby/coordination/child.rb +28 -0
- data/lib/roby/coordination/event.rb +29 -0
- data/lib/roby/coordination/fault_handler.rb +25 -0
- data/lib/roby/coordination/fault_handling_task.rb +13 -0
- data/lib/roby/coordination/fault_response_table.rb +110 -0
- data/lib/roby/coordination/models/action_script.rb +64 -0
- data/lib/roby/coordination/models/action_state_machine.rb +224 -0
- data/lib/roby/coordination/models/actions.rb +191 -0
- data/lib/roby/coordination/models/arguments.rb +55 -0
- data/lib/roby/coordination/models/base.rb +176 -0
- data/lib/roby/coordination/models/capture.rb +86 -0
- data/lib/roby/coordination/models/child.rb +35 -0
- data/lib/roby/coordination/models/event.rb +41 -0
- data/lib/roby/coordination/models/exceptions.rb +42 -0
- data/lib/roby/coordination/models/fault_handler.rb +219 -0
- data/lib/roby/coordination/models/fault_response_table.rb +77 -0
- data/lib/roby/coordination/models/root.rb +22 -0
- data/lib/roby/coordination/models/script.rb +283 -0
- data/lib/roby/coordination/models/task.rb +184 -0
- data/lib/roby/coordination/models/task_from_action.rb +50 -0
- data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
- data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
- data/lib/roby/coordination/models/task_from_variable.rb +27 -0
- data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
- data/lib/roby/coordination/models/variable.rb +32 -0
- data/lib/roby/coordination/script.rb +200 -0
- data/lib/roby/coordination/script_instruction.rb +12 -0
- data/lib/roby/coordination/task.rb +45 -0
- data/lib/roby/coordination/task_base.rb +69 -0
- data/lib/roby/coordination/task_script.rb +293 -0
- data/lib/roby/coordination/task_state_machine.rb +308 -0
- data/lib/roby/decision_control.rb +33 -21
- data/lib/roby/distributed_object.rb +76 -0
- data/lib/roby/droby.rb +17 -0
- data/lib/roby/droby/droby_id.rb +6 -0
- data/lib/roby/droby/enable.rb +153 -0
- data/lib/roby/droby/event_logger.rb +189 -0
- data/lib/roby/droby/event_logging.rb +57 -0
- data/lib/roby/droby/exceptions.rb +14 -0
- data/lib/roby/droby/identifiable.rb +22 -0
- data/lib/roby/droby/logfile.rb +141 -0
- data/lib/roby/droby/logfile/client.rb +176 -0
- data/lib/roby/droby/logfile/file_format.md +97 -0
- data/lib/roby/droby/logfile/index.rb +117 -0
- data/lib/roby/droby/logfile/reader.rb +139 -0
- data/lib/roby/droby/logfile/server.rb +199 -0
- data/lib/roby/droby/logfile/writer.rb +114 -0
- data/lib/roby/droby/marshal.rb +264 -0
- data/lib/roby/droby/marshallable.rb +12 -0
- data/lib/roby/droby/null_event_logger.rb +25 -0
- data/lib/roby/droby/object_manager.rb +205 -0
- data/lib/roby/droby/peer_id.rb +6 -0
- data/lib/roby/droby/plan_rebuilder.rb +373 -0
- data/lib/roby/droby/rebuilt_plan.rb +160 -0
- data/lib/roby/droby/remote_droby_id.rb +6 -0
- data/lib/roby/droby/timepoints.rb +205 -0
- data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
- data/lib/roby/droby/timepoints_ctf.rb +125 -0
- data/lib/roby/droby/v5.rb +14 -0
- data/lib/roby/droby/v5/builtin.rb +120 -0
- data/lib/roby/droby/v5/droby_class.rb +45 -0
- data/lib/roby/droby/v5/droby_constant.rb +81 -0
- data/lib/roby/droby/v5/droby_dump.rb +1026 -0
- data/lib/roby/droby/v5/droby_id.rb +44 -0
- data/lib/roby/droby/v5/droby_model.rb +82 -0
- data/lib/roby/droby/v5/peer_id.rb +10 -0
- data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
- data/lib/roby/event.rb +79 -957
- data/lib/roby/event_constraints.rb +835 -0
- data/lib/roby/event_generator.rb +1047 -0
- data/lib/roby/event_structure/causal_link.rb +6 -0
- data/lib/roby/event_structure/forwarding.rb +6 -0
- data/lib/roby/event_structure/precedence.rb +7 -0
- data/lib/roby/event_structure/signal.rb +8 -0
- data/lib/roby/event_structure/temporal_constraints.rb +640 -0
- data/lib/roby/exceptions.rb +446 -152
- data/lib/roby/executable_plan.rb +549 -0
- data/lib/roby/execution_engine.rb +1997 -950
- data/lib/roby/filter_generator.rb +26 -0
- data/lib/roby/gui/chronicle_view.rb +225 -0
- data/lib/roby/gui/chronicle_widget.rb +925 -0
- data/lib/roby/gui/dot_id.rb +11 -0
- data/lib/roby/gui/exception_view.rb +44 -0
- data/lib/roby/gui/log_display.rb +273 -0
- data/lib/roby/gui/model_views.rb +2 -0
- data/lib/roby/gui/model_views/action_interface.rb +53 -0
- data/lib/roby/gui/model_views/task.rb +47 -0
- data/lib/roby/gui/model_views/task.rhtml +41 -0
- data/lib/roby/gui/object_info_view.rb +89 -0
- data/lib/roby/gui/plan_dot_layout.rb +427 -0
- data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
- data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
- data/lib/roby/gui/relations_view.rb +278 -0
- data/lib/roby/gui/relations_view/relations.ui +139 -0
- data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
- data/lib/roby/gui/relations_view/relations_config.rb +292 -0
- data/lib/roby/gui/relations_view/relations_view.ui +53 -0
- data/lib/roby/gui/scheduler_view.css +24 -0
- data/lib/roby/gui/scheduler_view.rb +46 -0
- data/lib/roby/gui/scheduler_view.rhtml +53 -0
- data/lib/roby/gui/stepping.rb +93 -0
- data/lib/roby/gui/stepping.ui +181 -0
- data/lib/roby/gui/styles.rb +81 -0
- data/lib/roby/gui/task_display_configuration.rb +42 -0
- data/lib/roby/gui/task_state_at.rb +38 -0
- data/lib/roby/hooks.rb +26 -0
- data/lib/roby/interface.rb +136 -469
- data/lib/roby/interface/async.rb +20 -0
- data/lib/roby/interface/async/action_monitor.rb +188 -0
- data/lib/roby/interface/async/interface.rb +498 -0
- data/lib/roby/interface/async/job_monitor.rb +213 -0
- data/lib/roby/interface/async/log.rb +238 -0
- data/lib/roby/interface/async/new_job_listener.rb +79 -0
- data/lib/roby/interface/async/ui_connector.rb +183 -0
- data/lib/roby/interface/client.rb +553 -0
- data/lib/roby/interface/command.rb +24 -0
- data/lib/roby/interface/command_argument.rb +16 -0
- data/lib/roby/interface/command_library.rb +92 -0
- data/lib/roby/interface/droby_channel.rb +174 -0
- data/lib/roby/interface/exceptions.rb +22 -0
- data/lib/roby/interface/interface.rb +655 -0
- data/lib/roby/interface/job.rb +47 -0
- data/lib/roby/interface/rest.rb +10 -0
- data/lib/roby/interface/rest/api.rb +29 -0
- data/lib/roby/interface/rest/helpers.rb +24 -0
- data/lib/roby/interface/rest/server.rb +212 -0
- data/lib/roby/interface/server.rb +154 -0
- data/lib/roby/interface/shell_client.rb +468 -0
- data/lib/roby/interface/shell_subcommand.rb +24 -0
- data/lib/roby/interface/subcommand_client.rb +35 -0
- data/lib/roby/interface/tcp.rb +168 -0
- data/lib/roby/models/arguments.rb +112 -0
- data/lib/roby/models/plan_object.rb +83 -0
- data/lib/roby/models/task.rb +835 -0
- data/lib/roby/models/task_event.rb +62 -0
- data/lib/roby/models/task_service.rb +78 -0
- data/lib/roby/or_generator.rb +88 -0
- data/lib/roby/plan.rb +1751 -864
- data/lib/roby/plan_object.rb +611 -0
- data/lib/roby/plan_service.rb +200 -0
- data/lib/roby/promise.rb +332 -0
- data/lib/roby/queries.rb +23 -0
- data/lib/roby/queries/and_matcher.rb +32 -0
- data/lib/roby/queries/any.rb +27 -0
- data/lib/roby/queries/code_error_matcher.rb +58 -0
- data/lib/roby/queries/event_generator_matcher.rb +9 -0
- data/lib/roby/queries/execution_exception_matcher.rb +165 -0
- data/lib/roby/queries/index.rb +165 -0
- data/lib/roby/queries/localized_error_matcher.rb +149 -0
- data/lib/roby/queries/matcher_base.rb +107 -0
- data/lib/roby/queries/none.rb +27 -0
- data/lib/roby/queries/not_matcher.rb +30 -0
- data/lib/roby/queries/op_matcher.rb +8 -0
- data/lib/roby/queries/or_matcher.rb +30 -0
- data/lib/roby/queries/plan_object_matcher.rb +363 -0
- data/lib/roby/queries/query.rb +188 -0
- data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
- data/lib/roby/queries/task_matcher.rb +344 -0
- data/lib/roby/relations.rb +42 -678
- data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
- data/lib/roby/relations/directed_relation_support.rb +268 -0
- data/lib/roby/relations/event_relation_graph.rb +19 -0
- data/lib/roby/relations/fork_merge_visitor.rb +154 -0
- data/lib/roby/relations/graph.rb +533 -0
- data/lib/roby/relations/models/directed_relation_support.rb +11 -0
- data/lib/roby/relations/models/graph.rb +75 -0
- data/lib/roby/relations/models/task_relation_graph.rb +18 -0
- data/lib/roby/relations/space.rb +380 -0
- data/lib/roby/relations/task_relation_graph.rb +20 -0
- data/lib/roby/robot.rb +85 -38
- data/lib/roby/schedulers/basic.rb +155 -25
- data/lib/roby/schedulers/null.rb +20 -0
- data/lib/roby/schedulers/reporting.rb +31 -0
- data/lib/roby/schedulers/state.rb +129 -0
- data/lib/roby/schedulers/temporal.rb +91 -0
- data/lib/roby/singletons.rb +87 -0
- data/lib/roby/standalone.rb +4 -2
- data/lib/roby/standard_errors.rb +405 -82
- data/lib/roby/state.rb +6 -3
- data/lib/roby/state/conf_model.rb +5 -0
- data/lib/roby/state/events.rb +181 -95
- data/lib/roby/state/goal_model.rb +77 -0
- data/lib/roby/state/open_struct.rb +591 -0
- data/lib/roby/state/open_struct_model.rb +68 -0
- data/lib/roby/state/pos.rb +45 -45
- data/lib/roby/state/shapes.rb +11 -11
- data/lib/roby/state/state_model.rb +303 -0
- data/lib/roby/state/task.rb +43 -0
- data/lib/roby/support.rb +88 -148
- data/lib/roby/task.rb +1361 -1750
- data/lib/roby/task_arguments.rb +428 -0
- data/lib/roby/task_event.rb +127 -0
- data/lib/roby/task_event_generator.rb +337 -0
- data/lib/roby/task_service.rb +6 -0
- data/lib/roby/task_structure/conflicts.rb +104 -0
- data/lib/roby/task_structure/dependency.rb +932 -0
- data/lib/roby/task_structure/error_handling.rb +118 -0
- data/lib/roby/task_structure/executed_by.rb +234 -0
- data/lib/roby/task_structure/planned_by.rb +90 -0
- data/lib/roby/tasks/aggregator.rb +37 -0
- data/lib/roby/tasks/external_process.rb +275 -0
- data/lib/roby/tasks/group.rb +27 -0
- data/lib/roby/tasks/null.rb +19 -0
- data/lib/roby/tasks/parallel.rb +43 -0
- data/lib/roby/tasks/sequence.rb +88 -0
- data/lib/roby/tasks/simple.rb +21 -0
- data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
- data/lib/roby/tasks/timeout.rb +17 -0
- data/lib/roby/tasks/virtual.rb +55 -0
- data/lib/roby/template_plan.rb +7 -0
- data/lib/roby/test/aruba_minitest.rb +74 -0
- data/lib/roby/test/assertion.rb +16 -0
- data/lib/roby/test/assertions.rb +490 -0
- data/lib/roby/test/common.rb +368 -591
- data/lib/roby/test/dsl.rb +149 -0
- data/lib/roby/test/error.rb +18 -0
- data/lib/roby/test/event_reporter.rb +83 -0
- data/lib/roby/test/execution_expectations.rb +1134 -0
- data/lib/roby/test/expect_execution.rb +151 -0
- data/lib/roby/test/minitest_helpers.rb +166 -0
- data/lib/roby/test/roby_app_helpers.rb +200 -0
- data/lib/roby/test/run_planners.rb +155 -0
- data/lib/roby/test/self.rb +112 -0
- data/lib/roby/test/spec.rb +198 -0
- data/lib/roby/test/tasks/empty_task.rb +4 -4
- data/lib/roby/test/tasks/goto.rb +28 -27
- data/lib/roby/test/teardown_plans.rb +100 -0
- data/lib/roby/test/testcase.rb +239 -307
- data/lib/roby/test/tools.rb +159 -155
- data/lib/roby/test/validate_state_machine.rb +75 -0
- data/lib/roby/transaction.rb +1125 -0
- data/lib/roby/transaction/event_generator_proxy.rb +63 -0
- data/lib/roby/transaction/plan_object_proxy.rb +99 -0
- data/lib/roby/transaction/plan_service_proxy.rb +43 -0
- data/lib/roby/transaction/proxying.rb +120 -0
- data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
- data/lib/roby/transaction/task_proxy.rb +135 -0
- data/lib/roby/until_generator.rb +30 -0
- data/lib/roby/version.rb +5 -0
- data/lib/roby/yard.rb +169 -0
- data/lib/yard-roby.rb +1 -0
- data/manifest.xml +32 -6
- data/roby.gemspec +59 -0
- metadata +788 -587
- data/Manifest.txt +0 -321
- data/NOTES +0 -4
- data/README.txt +0 -166
- data/TODO.txt +0 -146
- data/app/README.txt +0 -24
- data/app/Rakefile +0 -8
- data/app/config/ROBOT.rb +0 -5
- data/app/config/init.rb +0 -33
- data/app/config/roby.yml +0 -3
- data/app/controllers/ROBOT.rb +0 -2
- data/app/planners/ROBOT/main.rb +0 -6
- data/app/planners/main.rb +0 -5
- data/app/scripts/distributed +0 -3
- data/app/scripts/generate/bookmarks +0 -3
- data/app/scripts/replay +0 -3
- data/app/scripts/results +0 -3
- data/app/scripts/run +0 -3
- data/app/scripts/server +0 -3
- data/app/scripts/shell +0 -3
- data/app/scripts/test +0 -3
- data/app/tasks/.gitattributes +0 -0
- data/app/tasks/ROBOT/.gitattributes +0 -0
- data/bin/roby-shell +0 -25
- data/doc/guide/src/basics/app.page +0 -139
- data/doc/guide/src/basics/index.page +0 -11
- data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/basics/relations_display.page +0 -203
- data/doc/guide/src/basics/shell.page +0 -102
- data/doc/guide/src/default.css +0 -319
- data/doc/guide/src/introduction/index.page +0 -29
- data/doc/guide/src/introduction/publications.page +0 -14
- data/doc/guide/src/relations/dependency.page +0 -89
- data/doc/guide/src/relations/index.page +0 -12
- data/ext/droby/dump.cc +0 -175
- data/ext/droby/extconf.rb +0 -3
- data/ext/graph/algorithm.cc +0 -746
- data/ext/graph/extconf.rb +0 -7
- data/ext/graph/graph.cc +0 -575
- data/ext/graph/graph.hh +0 -183
- data/ext/graph/iterator_sequence.hh +0 -102
- data/ext/graph/undirected_dfs.hh +0 -226
- data/ext/graph/undirected_graph.hh +0 -421
- data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
- data/lib/roby/app/scripts/replay.rb +0 -31
- data/lib/roby/app/scripts/server.rb +0 -18
- data/lib/roby/basic_object.rb +0 -151
- data/lib/roby/config.rb +0 -14
- data/lib/roby/distributed.rb +0 -36
- data/lib/roby/distributed/base.rb +0 -448
- data/lib/roby/distributed/communication.rb +0 -875
- data/lib/roby/distributed/connection_space.rb +0 -616
- data/lib/roby/distributed/distributed_object.rb +0 -206
- data/lib/roby/distributed/drb.rb +0 -62
- data/lib/roby/distributed/notifications.rb +0 -531
- data/lib/roby/distributed/peer.rb +0 -555
- data/lib/roby/distributed/protocol.rb +0 -529
- data/lib/roby/distributed/proxy.rb +0 -343
- data/lib/roby/distributed/subscription.rb +0 -311
- data/lib/roby/distributed/transaction.rb +0 -498
- data/lib/roby/external_process_task.rb +0 -225
- data/lib/roby/graph.rb +0 -160
- data/lib/roby/log.rb +0 -3
- data/lib/roby/log/chronicle.rb +0 -303
- data/lib/roby/log/console.rb +0 -74
- data/lib/roby/log/data_stream.rb +0 -275
- data/lib/roby/log/dot.rb +0 -279
- data/lib/roby/log/event_stream.rb +0 -161
- data/lib/roby/log/file.rb +0 -396
- data/lib/roby/log/gui/basic_display.ui +0 -83
- data/lib/roby/log/gui/basic_display_ui.rb +0 -89
- data/lib/roby/log/gui/chronicle.rb +0 -26
- data/lib/roby/log/gui/chronicle_view.rb +0 -40
- data/lib/roby/log/gui/chronicle_view.ui +0 -70
- data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
- data/lib/roby/log/gui/data_displays.rb +0 -171
- data/lib/roby/log/gui/data_displays.ui +0 -155
- data/lib/roby/log/gui/data_displays_ui.rb +0 -146
- data/lib/roby/log/gui/notifications.rb +0 -26
- data/lib/roby/log/gui/relations.rb +0 -269
- data/lib/roby/log/gui/relations.ui +0 -123
- data/lib/roby/log/gui/relations_ui.rb +0 -120
- data/lib/roby/log/gui/relations_view.rb +0 -185
- data/lib/roby/log/gui/relations_view.ui +0 -149
- data/lib/roby/log/gui/relations_view_ui.rb +0 -144
- data/lib/roby/log/gui/replay.rb +0 -366
- data/lib/roby/log/gui/replay_controls.rb +0 -206
- data/lib/roby/log/gui/replay_controls.ui +0 -282
- data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
- data/lib/roby/log/gui/runtime.rb +0 -130
- data/lib/roby/log/hooks.rb +0 -186
- data/lib/roby/log/logger.rb +0 -203
- data/lib/roby/log/notifications.rb +0 -244
- data/lib/roby/log/plan_rebuilder.rb +0 -468
- data/lib/roby/log/relations.rb +0 -1084
- data/lib/roby/log/server.rb +0 -547
- data/lib/roby/log/sqlite.rb +0 -47
- data/lib/roby/log/timings.rb +0 -233
- data/lib/roby/plan-object.rb +0 -371
- data/lib/roby/planning.rb +0 -13
- data/lib/roby/planning/loops.rb +0 -309
- data/lib/roby/planning/model.rb +0 -1012
- data/lib/roby/planning/task.rb +0 -180
- data/lib/roby/query.rb +0 -655
- data/lib/roby/relations/conflicts.rb +0 -67
- data/lib/roby/relations/dependency.rb +0 -358
- data/lib/roby/relations/ensured.rb +0 -19
- data/lib/roby/relations/error_handling.rb +0 -22
- data/lib/roby/relations/events.rb +0 -7
- data/lib/roby/relations/executed_by.rb +0 -208
- data/lib/roby/relations/influence.rb +0 -10
- data/lib/roby/relations/planned_by.rb +0 -63
- data/lib/roby/state/information.rb +0 -55
- data/lib/roby/state/state.rb +0 -367
- data/lib/roby/task-operations.rb +0 -186
- data/lib/roby/task_index.rb +0 -80
- data/lib/roby/test/distributed.rb +0 -230
- data/lib/roby/test/tasks/simple_task.rb +0 -23
- data/lib/roby/transactions.rb +0 -507
- data/lib/roby/transactions/proxy.rb +0 -325
- data/plugins/fault_injection/History.txt +0 -4
- data/plugins/fault_injection/README.txt +0 -34
- data/plugins/fault_injection/Rakefile +0 -12
- data/plugins/fault_injection/TODO.txt +0 -0
- data/plugins/fault_injection/app.rb +0 -52
- data/plugins/fault_injection/fault_injection.rb +0 -89
- data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
- data/plugins/subsystems/README.txt +0 -37
- data/plugins/subsystems/Rakefile +0 -13
- data/plugins/subsystems/app.rb +0 -182
- data/plugins/subsystems/test/app/README +0 -24
- data/plugins/subsystems/test/app/Rakefile +0 -8
- data/plugins/subsystems/test/app/config/app.yml +0 -71
- data/plugins/subsystems/test/app/config/init.rb +0 -12
- data/plugins/subsystems/test/app/config/roby.yml +0 -3
- data/plugins/subsystems/test/app/planners/main.rb +0 -20
- data/plugins/subsystems/test/app/scripts/distributed +0 -3
- data/plugins/subsystems/test/app/scripts/replay +0 -3
- data/plugins/subsystems/test/app/scripts/results +0 -3
- data/plugins/subsystems/test/app/scripts/run +0 -3
- data/plugins/subsystems/test/app/scripts/server +0 -3
- data/plugins/subsystems/test/app/scripts/shell +0 -3
- data/plugins/subsystems/test/app/scripts/test +0 -3
- data/plugins/subsystems/test/app/tasks/services.rb +0 -15
- data/plugins/subsystems/test/test_subsystems.rb +0 -78
- data/test/distributed/test_communication.rb +0 -195
- data/test/distributed/test_connection.rb +0 -284
- data/test/distributed/test_execution.rb +0 -378
- data/test/distributed/test_mixed_plan.rb +0 -341
- data/test/distributed/test_plan_notifications.rb +0 -238
- data/test/distributed/test_protocol.rb +0 -525
- data/test/distributed/test_query.rb +0 -106
- data/test/distributed/test_remote_plan.rb +0 -491
- data/test/distributed/test_transaction.rb +0 -466
- data/test/mockups/external_process +0 -28
- data/test/mockups/tasks.rb +0 -27
- data/test/planning/test_loops.rb +0 -432
- data/test/planning/test_model.rb +0 -427
- data/test/planning/test_task.rb +0 -126
- data/test/relations/test_conflicts.rb +0 -42
- data/test/relations/test_dependency.rb +0 -324
- data/test/relations/test_ensured.rb +0 -38
- data/test/relations/test_executed_by.rb +0 -224
- data/test/relations/test_planned_by.rb +0 -56
- data/test/suite_core.rb +0 -29
- data/test/suite_distributed.rb +0 -10
- data/test/suite_planning.rb +0 -4
- data/test/suite_relations.rb +0 -8
- data/test/tasks/test_external_process.rb +0 -126
- data/test/tasks/test_thread_task.rb +0 -70
- data/test/test_bgl.rb +0 -528
- data/test/test_event.rb +0 -969
- data/test/test_exceptions.rb +0 -591
- data/test/test_execution_engine.rb +0 -987
- data/test/test_gui.rb +0 -20
- data/test/test_interface.rb +0 -43
- data/test/test_log.rb +0 -125
- data/test/test_log_server.rb +0 -133
- data/test/test_plan.rb +0 -418
- data/test/test_query.rb +0 -424
- data/test/test_relations.rb +0 -260
- data/test/test_state.rb +0 -432
- data/test/test_support.rb +0 -16
- data/test/test_task.rb +0 -1181
- data/test/test_testcase.rb +0 -138
- data/test/test_transactions.rb +0 -610
- data/test/test_transactions_proxy.rb +0 -216
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
# Common functionality of coordination models that manipulate actions
|
|
4
|
+
# (ActionStateMachine, ActionScript)
|
|
5
|
+
class Actions < Base
|
|
6
|
+
extend Models::Actions
|
|
7
|
+
|
|
8
|
+
# @return [Coordination::Task] the currently active toplevel task
|
|
9
|
+
attr_reader :current_task
|
|
10
|
+
|
|
11
|
+
TaskInfo = Struct.new :required_tasks, :forwards
|
|
12
|
+
|
|
13
|
+
# Mapping from a Coordination::Models::Task object to the set of
|
|
14
|
+
# forwards that are defined for it
|
|
15
|
+
attr_reader :task_info
|
|
16
|
+
|
|
17
|
+
# Resolved captures
|
|
18
|
+
#
|
|
19
|
+
# This is currently only used by the {ActionStateMachine}
|
|
20
|
+
#
|
|
21
|
+
# @return [Hash<Models::Capture, Object>]
|
|
22
|
+
attr_reader :resolved_captures
|
|
23
|
+
|
|
24
|
+
def initialize(root_task, arguments = Hash.new)
|
|
25
|
+
super(root_task, arguments)
|
|
26
|
+
@task_info = resolve_task_info
|
|
27
|
+
@resolved_captures = Hash.new
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def action_interface_model
|
|
31
|
+
model.action_interface
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def task_info_for(task)
|
|
35
|
+
required_tasks = model.required_tasks_for(task).map do |t, roles|
|
|
36
|
+
[instance_for(t), roles]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
forwards = Set.new
|
|
40
|
+
model.each_forward do |in_task, event, target|
|
|
41
|
+
if in_task == task
|
|
42
|
+
event = instance_for(event)
|
|
43
|
+
target = instance_for(target)
|
|
44
|
+
forwards << [event, target]
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
TaskInfo.new(required_tasks, forwards)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def resolve_task_info
|
|
51
|
+
result = Hash.new
|
|
52
|
+
model.each_task do |task|
|
|
53
|
+
result[instance_for(task)] = task_info_for(task)
|
|
54
|
+
end
|
|
55
|
+
result
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def dependency_options_for(toplevel, task, roles)
|
|
59
|
+
roles = roles.dup
|
|
60
|
+
if task.name
|
|
61
|
+
roles << task.name
|
|
62
|
+
end
|
|
63
|
+
Hash[roles: roles,
|
|
64
|
+
failure: :stop.or(:start.never),
|
|
65
|
+
remove_when_done: true]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def start_task(toplevel, explicit_start: false)
|
|
69
|
+
task_info = self.task_info[toplevel]
|
|
70
|
+
tasks, forwards = task_info.required_tasks, task_info.forwards
|
|
71
|
+
variables = arguments.merge(resolved_captures)
|
|
72
|
+
|
|
73
|
+
instanciated_tasks = tasks.map do |task, roles|
|
|
74
|
+
action_task = task.model.instanciate(root_task.plan, variables)
|
|
75
|
+
root_task.depends_on(action_task, dependency_options_for(toplevel, task, roles))
|
|
76
|
+
bind_coordination_task_to_instance(task, action_task, on_replace: :copy)
|
|
77
|
+
task.model.setup_instanciated_task(self, action_task, variables)
|
|
78
|
+
action_task
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
@current_task = toplevel
|
|
82
|
+
forwards.each do |source, target|
|
|
83
|
+
source.resolve.on do |event|
|
|
84
|
+
if target.resolve.task.running?
|
|
85
|
+
target.resolve.emit(*event.context)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
instanciated_tasks
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def remove_current_task
|
|
94
|
+
current_task_child = root_task.find_child_from_role('current_task')
|
|
95
|
+
task_info[current_task].required_tasks.each do |task, roles|
|
|
96
|
+
if state_name = task.name
|
|
97
|
+
roles = [state_name, *roles]
|
|
98
|
+
end
|
|
99
|
+
if !roles.empty? && (child_task = root_task.find_child_from_role(roles.first))
|
|
100
|
+
root_task.remove_roles(child_task, *roles)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
# Context for all the execution objects that can be attached to the
|
|
4
|
+
# action interface and/or tasks, such as state machines and scripts
|
|
5
|
+
class Base
|
|
6
|
+
extend Models::Base
|
|
7
|
+
|
|
8
|
+
# The parent coordination object
|
|
9
|
+
#
|
|
10
|
+
# @return [nil,Base]
|
|
11
|
+
attr_reader :parent
|
|
12
|
+
|
|
13
|
+
# The task on which this execution context is being executed. It
|
|
14
|
+
# must fullfill model.task
|
|
15
|
+
# @return [Model<Roby::Task>]
|
|
16
|
+
def root_task
|
|
17
|
+
instance_for(model.root).task
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# The plan this coordination object is part of
|
|
21
|
+
def plan
|
|
22
|
+
root_task.plan
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# The set of arguments given to this execution context
|
|
26
|
+
# @return [Hash]
|
|
27
|
+
attr_reader :arguments
|
|
28
|
+
|
|
29
|
+
# A mapping from the model-level description of the context to the
|
|
30
|
+
# instance-level description
|
|
31
|
+
#
|
|
32
|
+
# @see instanciate
|
|
33
|
+
attr_reader :instances
|
|
34
|
+
|
|
35
|
+
# The execution context model
|
|
36
|
+
# @return [Model<Base>] a subclass of Base
|
|
37
|
+
def model
|
|
38
|
+
self.class
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Create a new coordination instance. The model is represented by
|
|
42
|
+
# this object's class
|
|
43
|
+
#
|
|
44
|
+
# @param [Roby::Task] root_task the task instance that should be
|
|
45
|
+
# bound to {Models::Base#root}
|
|
46
|
+
# @param [Hash] arguments parametrization of this coordination
|
|
47
|
+
# object. The list of known arguments can be accessed with
|
|
48
|
+
# model.arguments (defined by {Models::Arguments}.
|
|
49
|
+
# @param [Hash] options
|
|
50
|
+
# @option options [:drop,:copy] :on_replace (:drop) defines what
|
|
51
|
+
# should be done if the root task gets replaced. :drop means that
|
|
52
|
+
# the state machine should not be passed to the new task. :copy
|
|
53
|
+
# means that it should. Note that it only affects the root task.
|
|
54
|
+
# All other tasks that are referred to inside the coordination
|
|
55
|
+
# model are tracked for replacements.
|
|
56
|
+
# @option options [nil,Base] :parent (nil) the parent coordination
|
|
57
|
+
# model. This is used so that the coordination tasks can be shared
|
|
58
|
+
# across instances
|
|
59
|
+
def initialize(root_task = nil, arguments = Hash.new, options = Hash.new)
|
|
60
|
+
options = Kernel.validate_options options, on_replace: :drop, parent: nil
|
|
61
|
+
|
|
62
|
+
@arguments = model.validate_arguments(arguments)
|
|
63
|
+
@parent = options[:parent]
|
|
64
|
+
@instances = Hash.new
|
|
65
|
+
if root_task
|
|
66
|
+
bind_coordination_task_to_instance(
|
|
67
|
+
instance_for(model.root),
|
|
68
|
+
root_task,
|
|
69
|
+
on_replace: options[:on_replace])
|
|
70
|
+
root_task.add_coordination_object(self)
|
|
71
|
+
|
|
72
|
+
attach_fault_response_tables_to(root_task)
|
|
73
|
+
|
|
74
|
+
if options[:on_replace] == :copy
|
|
75
|
+
root_task.as_service.on_replacement do |old_task, new_task|
|
|
76
|
+
old_task.remove_coordination_object(self)
|
|
77
|
+
new_task.add_coordination_object(self)
|
|
78
|
+
attach_fault_response_tables_to(new_task)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def attach_fault_response_tables_to(task)
|
|
85
|
+
model.each_used_fault_response_table do |table, arguments|
|
|
86
|
+
arguments = arguments.map_value do |key, val|
|
|
87
|
+
if val.kind_of?(Models::Variable)
|
|
88
|
+
self.arguments[val.name]
|
|
89
|
+
else val
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
root_task.use_fault_response_table(table, arguments)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Binds a task instance to the coordination task
|
|
97
|
+
#
|
|
98
|
+
# This method binds a task instance to the coordination task it
|
|
99
|
+
# represents, and optionally installs the handlers necessary to
|
|
100
|
+
# track replacement
|
|
101
|
+
#
|
|
102
|
+
# @param [Coordination::Task] coordination_task the coordination task
|
|
103
|
+
# @param [Roby::Task] instance the task
|
|
104
|
+
# @option options [Symbol] :on_replace (:drop) what should be done
|
|
105
|
+
# if the task instance is replaced by another task. If :drop, the
|
|
106
|
+
# coordination task will be reset to nil. If :copy, it will track
|
|
107
|
+
# the new task
|
|
108
|
+
# @return [void]
|
|
109
|
+
def bind_coordination_task_to_instance(coordination_task, instance, options = Hash.new)
|
|
110
|
+
options = Kernel.validate_options options, on_replace: :drop
|
|
111
|
+
|
|
112
|
+
coordination_task.bind(instance)
|
|
113
|
+
if options[:on_replace] == :copy
|
|
114
|
+
instance.as_service.on_replacement do |old_task, new_task|
|
|
115
|
+
coordination_task.bind(new_task)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Returns the instance-level coordination task that is used to
|
|
121
|
+
# represent a model-level coordination task
|
|
122
|
+
#
|
|
123
|
+
# Coordination models are built using instances of
|
|
124
|
+
# {Coordination::Models::Task} (or its subclasses). When they get
|
|
125
|
+
# instanciated into actual coordination objects, these are
|
|
126
|
+
# uniquely associated with instances of {Coordination::Task} (or its
|
|
127
|
+
# subclasses).
|
|
128
|
+
#
|
|
129
|
+
# This method can be used to retrieve the unique object associated
|
|
130
|
+
# with a given model-level coordination task
|
|
131
|
+
#
|
|
132
|
+
# @param [Coordination::Models::Task] object the model-level coordination task
|
|
133
|
+
# @return [Coordination::Task] object the instance-level coordination task
|
|
134
|
+
def instance_for(object)
|
|
135
|
+
if !(ins = instances[object])
|
|
136
|
+
if !parent || !(ins = parent.instances[object])
|
|
137
|
+
ins = instances[object] = object.new(self)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
ins
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Tools
|
|
3
|
+
module Calculus
|
|
4
|
+
module Build
|
|
5
|
+
def self.unary_op(name)
|
|
6
|
+
define_method(name) do
|
|
7
|
+
Unary.new(name, self)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.binary_op(name)
|
|
12
|
+
define_method(name) do |arg|
|
|
13
|
+
Binary.new(name, self, arg)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
unary_op :-@
|
|
18
|
+
unary_op :+@
|
|
19
|
+
binary_op :+
|
|
20
|
+
binary_op :-
|
|
21
|
+
binary_op :*
|
|
22
|
+
binary_op :/
|
|
23
|
+
binary_op :**
|
|
24
|
+
end
|
|
25
|
+
Unary = Struct.new :op, :val do
|
|
26
|
+
def evaluate(variables)
|
|
27
|
+
val.evaluate(variables).send(op)
|
|
28
|
+
end
|
|
29
|
+
include Build
|
|
30
|
+
end
|
|
31
|
+
Binary = Struct.new :op, :left, :right do
|
|
32
|
+
def evaluate(variables)
|
|
33
|
+
left.evaluate(variables).send(op, right.evaluate(variables))
|
|
34
|
+
end
|
|
35
|
+
include Build
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
# Representation of the context's root task
|
|
4
|
+
class Child < TaskBase
|
|
5
|
+
# @return [Coordination::Task] this child's parent
|
|
6
|
+
attr_reader :parent
|
|
7
|
+
|
|
8
|
+
def root_task
|
|
9
|
+
parent
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def initialize(execution_context, model)
|
|
13
|
+
super
|
|
14
|
+
@parent = execution_context.instance_for(model.parent)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def resolve
|
|
18
|
+
if result = parent.resolve.find_child_from_role(model.role)
|
|
19
|
+
result
|
|
20
|
+
else raise ResolvingUnboundObject, "#{parent.resolve}, resolved from #{parent} has not child named #{model.role}"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def to_s; "#{parent}.#{model.role}_child[#{model.model}]" end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
# Representation of the context's root task
|
|
4
|
+
class Event
|
|
5
|
+
# @return [Base] the underlying execution context
|
|
6
|
+
attr_reader :execution_context
|
|
7
|
+
# @return [Coordination::Task] the task this event is part
|
|
8
|
+
# of
|
|
9
|
+
attr_reader :task
|
|
10
|
+
# @return [Coordination::Event]
|
|
11
|
+
attr_reader :model
|
|
12
|
+
|
|
13
|
+
def initialize(execution_context, model)
|
|
14
|
+
@execution_context = execution_context
|
|
15
|
+
@model = model
|
|
16
|
+
@task = execution_context.instance_for(model.task)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def symbol; model.symbol end
|
|
20
|
+
|
|
21
|
+
def resolve
|
|
22
|
+
task.resolve.event(model.symbol)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def to_s; "#{task}.#{symbol}_event" end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
class FaultHandler < ActionScript
|
|
4
|
+
extend Models::FaultHandler
|
|
5
|
+
|
|
6
|
+
def step
|
|
7
|
+
super
|
|
8
|
+
if finished?
|
|
9
|
+
if model.carry_on?
|
|
10
|
+
response_task = self.root_task
|
|
11
|
+
plan = response_task.plan
|
|
12
|
+
response_task.each_parent_object(Roby::TaskStructure::ErrorHandling) do |repaired_task|
|
|
13
|
+
plan.replan(repaired_task)
|
|
14
|
+
end
|
|
15
|
+
response_task.success_event.emit
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_s
|
|
21
|
+
"#{self.class}/#{root_task}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
# Representation of a fault response from a {FaultResponseTable}
|
|
4
|
+
class FaultHandlingTask < Roby::Task
|
|
5
|
+
terminates
|
|
6
|
+
|
|
7
|
+
# @return [FaultHandler] the fault handler that this task represents
|
|
8
|
+
attr_accessor :fault_handler
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
# A way to organize response to faults (a.k.a. Roby exceptions)
|
|
4
|
+
#
|
|
5
|
+
# Fault response tables are defined as subclasses of this class, e.g.
|
|
6
|
+
#
|
|
7
|
+
# @example
|
|
8
|
+
# class MyTable < FaultResponseTable
|
|
9
|
+
# on_fault with_origin(TaskModel.power_off_event) do
|
|
10
|
+
# # Fault response description
|
|
11
|
+
# end
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# The fault response description is [an action
|
|
15
|
+
# script]({Coordination::ActionScript}). It is represented by a
|
|
16
|
+
# {FaultHandlingTask} that is added when a fault response triggers.
|
|
17
|
+
#
|
|
18
|
+
# When a {#on_fault} declaration matches an exception, the table will
|
|
19
|
+
# create a {FaultHandlingTask} task and attach it to a task in the plan.
|
|
20
|
+
# The task it attaches it to depends on statements that extend the
|
|
21
|
+
# action script:
|
|
22
|
+
#
|
|
23
|
+
# * locate_on_missions: the fault response will be assigned to the
|
|
24
|
+
# downmost missions which are affected by the fault.
|
|
25
|
+
# * locate_on_actions: the fault response will be assigned to the
|
|
26
|
+
# downmost actions which are affected by the fault. This is the
|
|
27
|
+
# default.
|
|
28
|
+
# * locate_on_origins: the fault response will be assigned to the fault
|
|
29
|
+
# origin
|
|
30
|
+
#
|
|
31
|
+
# The task on which the fault response is attached is stopped. The
|
|
32
|
+
# exception that caused the response is inhibited while the response is
|
|
33
|
+
# running.
|
|
34
|
+
#
|
|
35
|
+
# By default, once the fault response is finished, the plan will resume
|
|
36
|
+
# normal exception processing. I.e., it is the fault response's
|
|
37
|
+
# responsibility to fix the exception(s) in the plan. This default can
|
|
38
|
+
# be changed by adding the 'restart' statement in the action script. In
|
|
39
|
+
# this case, the mission or task that was assigned to the fault handler
|
|
40
|
+
# will be restarted once the fault handler script terminates. It can
|
|
41
|
+
# optionally be given a number of allowed restarts (to avoid infinite
|
|
42
|
+
# loops) as well as a timeout (to reset the counter if the fault did not
|
|
43
|
+
# occur for a certain length of time)
|
|
44
|
+
#
|
|
45
|
+
# And can then be attached to plans within an action interface:
|
|
46
|
+
#
|
|
47
|
+
# @example enable a fault response table globally
|
|
48
|
+
# use_fault_response_table MyTable
|
|
49
|
+
#
|
|
50
|
+
# @example enable this fault response table whenever a task matching this matcher
|
|
51
|
+
# use_fault_response_table MyTable, when: MyTaskModel.mission
|
|
52
|
+
#
|
|
53
|
+
# @example enable this fault response table when this action is running
|
|
54
|
+
# use_fault_response_table MyTable, when: an_action
|
|
55
|
+
#
|
|
56
|
+
# @example dynamically enable/disable tables programatically
|
|
57
|
+
# Roby.plan.use_fault_response_table MyTable
|
|
58
|
+
# Roby.plan.remove_fault_response_table MyTable
|
|
59
|
+
#
|
|
60
|
+
class FaultResponseTable < Roby::Actions::Interface
|
|
61
|
+
extend Models::FaultResponseTable
|
|
62
|
+
|
|
63
|
+
# @return [{Symbol=>Object}] assigned table arguments
|
|
64
|
+
attr_reader :arguments
|
|
65
|
+
|
|
66
|
+
def initialize(plan, arguments = Hash.new)
|
|
67
|
+
# Argument massaging must be done before we call super(), as
|
|
68
|
+
# super() will attach the table on the plan
|
|
69
|
+
@arguments = model.validate_arguments(arguments)
|
|
70
|
+
super(plan)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Hook called when this table is attached to a given plan
|
|
74
|
+
#
|
|
75
|
+
# This is a hook, so one can inject code here by defining a
|
|
76
|
+
# attach_to method on a module and prepending the module on the
|
|
77
|
+
# FaultResponseTable class. Do not forget to call super
|
|
78
|
+
# in the hook method.
|
|
79
|
+
#
|
|
80
|
+
# @param [Plan] plan
|
|
81
|
+
# @return [void]
|
|
82
|
+
def attach_to(plan)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Returns the handlers that are defined for a particular exception
|
|
86
|
+
#
|
|
87
|
+
# @param [ExecutionException] exception the exception that should be
|
|
88
|
+
# matched
|
|
89
|
+
# @return [Array<Models::FaultHandler>]
|
|
90
|
+
def find_all_matching_handlers(exception)
|
|
91
|
+
model.find_all_matching_handlers(exception)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Called when this table has been removed from the plan it was
|
|
95
|
+
# attached to
|
|
96
|
+
#
|
|
97
|
+
# It cannot be reused afterwards
|
|
98
|
+
#
|
|
99
|
+
# It calls super if it is defined, so it is possible to use it as a
|
|
100
|
+
# hook by defining a module that defines removed! and prepend it in
|
|
101
|
+
# the FaultResponseTable class. Don't forget to call super in the
|
|
102
|
+
# hook
|
|
103
|
+
#.
|
|
104
|
+
# @return [void]
|
|
105
|
+
def removed!
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|