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,118 @@
|
|
|
1
|
+
module Roby::TaskStructure
|
|
2
|
+
class Roby::TaskEventGenerator
|
|
3
|
+
# Mark this event as being handled by the task +task+
|
|
4
|
+
def handle_with(repairing_task, remove_when_done: true)
|
|
5
|
+
if repairing_task.respond_to?(:as_plan)
|
|
6
|
+
repairing_task = repairing_task.as_plan
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
if !task.child_object?(repairing_task, ErrorHandling)
|
|
10
|
+
task.add_error_handler repairing_task, Set.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
if remove_when_done
|
|
14
|
+
repairing_task.stop_event.on do |event|
|
|
15
|
+
repairing_task = event.task
|
|
16
|
+
if task.plan && task.child_object?(repairing_task, ErrorHandling)
|
|
17
|
+
task.remove_error_handler(repairing_task)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
task[repairing_task, ErrorHandling] << Roby::Queries::ExecutionExceptionMatcher.new.with_origin(task.model.find_event(symbol))
|
|
23
|
+
repairing_task
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
relation :ErrorHandling, child_name: :error_handler, strong: true, scheduling: true
|
|
28
|
+
|
|
29
|
+
module ErrorHandling::Extension
|
|
30
|
+
def repaired_tasks
|
|
31
|
+
each_parent_object(ErrorHandling).to_a
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def failed_task
|
|
35
|
+
# For backward compatibility only. One should use #repaired_tasks
|
|
36
|
+
repaired_tasks.first
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Tests if this task can be used to repair an exception
|
|
40
|
+
#
|
|
41
|
+
# It is different from {#repairs_error?} as the latter tests whether
|
|
42
|
+
# this task is currently repairing such an exception, while this one only
|
|
43
|
+
# tests if it could (usually, the difference is whether this task is
|
|
44
|
+
# running)
|
|
45
|
+
#
|
|
46
|
+
# @return [Boolean]
|
|
47
|
+
def can_repair_error?(exception)
|
|
48
|
+
return if finished?
|
|
49
|
+
|
|
50
|
+
exception = exception.to_execution_exception
|
|
51
|
+
repaired_tasks.each do |repaired|
|
|
52
|
+
matchers = repaired[self, ErrorHandling]
|
|
53
|
+
if matchers.any? { |m| m === exception }
|
|
54
|
+
return true
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
false
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Tests whether the given exception is handled by this task or by a
|
|
61
|
+
# repair handler attached to this task
|
|
62
|
+
def repairs_error?(exception)
|
|
63
|
+
exception = exception.to_execution_exception
|
|
64
|
+
running? && can_repair_error?(exception)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Returns the set of repair tasks attached to self that match the given
|
|
68
|
+
# exception
|
|
69
|
+
def find_all_matching_repair_tasks(exception)
|
|
70
|
+
exception = exception.to_execution_exception
|
|
71
|
+
result = []
|
|
72
|
+
each_error_handler do |child, matchers|
|
|
73
|
+
next if child.finished?
|
|
74
|
+
result << child if matchers.any? { |m| m === exception }
|
|
75
|
+
end
|
|
76
|
+
result
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Tests if this task can handle the provided exception, either because
|
|
80
|
+
# it is an error repair task itself, or because it has one attached.
|
|
81
|
+
#
|
|
82
|
+
# It is different from {#handles_error?} as the latter tests whether
|
|
83
|
+
# this task is currently handling the exception, while this one only
|
|
84
|
+
# tests if it could (usually, the difference is whether this task is
|
|
85
|
+
# running)
|
|
86
|
+
#
|
|
87
|
+
# @return [Boolean]
|
|
88
|
+
def can_handle_error?(exception)
|
|
89
|
+
exception = exception.to_execution_exception
|
|
90
|
+
can_repair_error?(exception) ||
|
|
91
|
+
!find_all_matching_repair_tasks(exception).empty?
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Tests if this task is currently handling the provided exception,
|
|
95
|
+
# either because it is an error repair task itself, or because it has
|
|
96
|
+
# one attached.
|
|
97
|
+
#
|
|
98
|
+
# @return [Boolean]
|
|
99
|
+
def handles_error?(exception)
|
|
100
|
+
return if !plan
|
|
101
|
+
exception = exception.to_execution_exception
|
|
102
|
+
((running? || starting?) && can_repair_error?(exception)) ||
|
|
103
|
+
find_all_matching_repair_tasks(exception).any? { |t| t.starting? || t.running? }
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Test if this task has an active repair tasks associated
|
|
107
|
+
def being_repaired?
|
|
108
|
+
each_child_object(ErrorHandling).any? { |t| t.running? }
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
class ErrorHandling
|
|
113
|
+
def merge_info(parent, child, opt1, opt2)
|
|
114
|
+
opt1 | opt2
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module TaskStructure
|
|
3
|
+
# The execution_agent defines an agent (process or otherwise) a given
|
|
4
|
+
# task is executed by. It allows to define a class of these execution agent,
|
|
5
|
+
# so that the specific agents are managed externally (load-balancing, ...)
|
|
6
|
+
relation :ExecutionAgent,
|
|
7
|
+
parent_name: :executed_task,
|
|
8
|
+
child_name: :execution_agent,
|
|
9
|
+
noinfo: true,
|
|
10
|
+
distribute: false,
|
|
11
|
+
single_child: true,
|
|
12
|
+
copy_on_replace: true,
|
|
13
|
+
strong: true
|
|
14
|
+
|
|
15
|
+
class ExecutedTaskAlreadyRunning < RuntimeError; end
|
|
16
|
+
|
|
17
|
+
class ExecutionAgent
|
|
18
|
+
def self.execution_agent_failed_to_start(reason, ready_event)
|
|
19
|
+
execution_agent = ready_event.task
|
|
20
|
+
|
|
21
|
+
tasks = []
|
|
22
|
+
execution_agent.each_executed_task do |task|
|
|
23
|
+
tasks << task
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
plan = execution_agent.plan
|
|
27
|
+
if !tasks.empty?
|
|
28
|
+
plan.control.execution_agent_failed_to_start(execution_agent, tasks, reason)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.pending_execution_agent_failed(event)
|
|
33
|
+
execution_agent = event.task
|
|
34
|
+
|
|
35
|
+
if execution_agent.ready?
|
|
36
|
+
tasks = []
|
|
37
|
+
execution_agent.each_executed_task do |task|
|
|
38
|
+
tasks << task if task.pending? || task.starting?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
plan = execution_agent.plan
|
|
42
|
+
if !tasks.empty?
|
|
43
|
+
plan.control.pending_executed_by_failed(execution_agent, tasks)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.remove_agent_aborted_relation(ev)
|
|
49
|
+
executed_task = ev.task
|
|
50
|
+
execution_agent = executed_task.execution_agent
|
|
51
|
+
|
|
52
|
+
# The event handler will be called even if the
|
|
53
|
+
# execution agent has been removed. Check that there is
|
|
54
|
+
# actually an execution agent
|
|
55
|
+
if execution_agent
|
|
56
|
+
execution_agent.stop_event.remove_forwarding executed_task.aborted_event
|
|
57
|
+
executed_task.remove_execution_agent execution_agent
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def self.establish_agent_aborted_relation(ev)
|
|
62
|
+
executed_task = ev.task
|
|
63
|
+
execution_agent = executed_task.execution_agent
|
|
64
|
+
|
|
65
|
+
# The event handler will be called even if the
|
|
66
|
+
# execution agent has been removed. Check that there is
|
|
67
|
+
# actually an execution agent
|
|
68
|
+
if execution_agent
|
|
69
|
+
execution_agent.stop_event.forward_to executed_task.aborted_event
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# This module defines model-level definition of execution agent, for
|
|
74
|
+
# instance to Roby::Task
|
|
75
|
+
module ModelExtension
|
|
76
|
+
# The model of execution agent for this class
|
|
77
|
+
def execution_agent
|
|
78
|
+
for klass in ancestors
|
|
79
|
+
if klass.instance_variable_defined?(:@execution_agent)
|
|
80
|
+
return klass.instance_variable_get(:@execution_agent)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
nil
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Defines a model of execution agent. Doing
|
|
87
|
+
#
|
|
88
|
+
# TaskModel.executed_by ExecutionAgentModel
|
|
89
|
+
#
|
|
90
|
+
# is equivalent to
|
|
91
|
+
#
|
|
92
|
+
# task = TaskModel.new
|
|
93
|
+
# exec = <find a suitable ExecutionAgentModel instance in the plan or
|
|
94
|
+
# create a new one>
|
|
95
|
+
# task.executed_by exec
|
|
96
|
+
#
|
|
97
|
+
# for all instances of TaskModel. The actual job is done in the
|
|
98
|
+
# ExecutionAgentSpawn module
|
|
99
|
+
def executed_by(agent_model, arguments = Hash.new)
|
|
100
|
+
@execution_agent = [agent_model, arguments]
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
module Extension
|
|
105
|
+
# In order to handle faults, it is needed that some event handlers are
|
|
106
|
+
# defined on the task that has an execution agent
|
|
107
|
+
#
|
|
108
|
+
# However, we only want to define them once. Therefore, this flag is set
|
|
109
|
+
# to true as soon as the handlers have been added on +self+
|
|
110
|
+
attr_predicate :used_with_an_execution_agent?, true
|
|
111
|
+
|
|
112
|
+
# In order to handle faults, it is needed that some event handlers are
|
|
113
|
+
# defined on the agent's task
|
|
114
|
+
#
|
|
115
|
+
# However, we only want to define them once. Therefore, this flag is set
|
|
116
|
+
# to true as soon as the handlers have been added on +self+
|
|
117
|
+
attr_predicate :used_as_execution_agent?, true
|
|
118
|
+
|
|
119
|
+
# Defines a new execution agent for this task.
|
|
120
|
+
def executed_by(agent)
|
|
121
|
+
if agent.respond_to?(:as_plan)
|
|
122
|
+
agent = agent.as_plan
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
return if execution_agent == agent
|
|
126
|
+
|
|
127
|
+
if !agent.has_event?(:ready)
|
|
128
|
+
raise ArgumentError, "execution agent tasks should define the :ready event"
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
old_agent = execution_agent
|
|
132
|
+
if old_agent && old_agent != agent
|
|
133
|
+
remove_execution_agent old_agent
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
add_execution_agent(agent)
|
|
137
|
+
agent
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def adding_execution_agent(child, info)
|
|
141
|
+
if running?
|
|
142
|
+
raise ExecutedTaskAlreadyRunning, "#{self} is already running, cannot add or change its agent"
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
super
|
|
146
|
+
|
|
147
|
+
if model_agent = model.execution_agent
|
|
148
|
+
if !child.fullfills?(*model_agent)
|
|
149
|
+
raise Roby::ModelViolation, "execution agent #{child} does not fullfill the expected #{model_agent}"
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# Installs the handlers needed for fault handling
|
|
155
|
+
#
|
|
156
|
+
# See the documentation of #used_with_an_execution_agent?
|
|
157
|
+
def added_execution_agent(child, info)
|
|
158
|
+
super
|
|
159
|
+
if !used_with_an_execution_agent?
|
|
160
|
+
start_event.on(&ExecutionAgent.method(:establish_agent_aborted_relation))
|
|
161
|
+
stop_event.on(&ExecutionAgent.method(:remove_agent_aborted_relation))
|
|
162
|
+
self.used_with_an_execution_agent = true
|
|
163
|
+
|
|
164
|
+
end
|
|
165
|
+
if !child.used_as_execution_agent?
|
|
166
|
+
if !child.ready_event.emitted?
|
|
167
|
+
child.ready_event.when_unreachable(
|
|
168
|
+
true, &ExecutionAgent.method(:execution_agent_failed_to_start))
|
|
169
|
+
end
|
|
170
|
+
child.stop_event.on(
|
|
171
|
+
&ExecutionAgent.method(:pending_execution_agent_failed))
|
|
172
|
+
child.used_as_execution_agent = true
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
class MissingRequiredExecutionAgent < Roby::CommandFailed
|
|
179
|
+
def initialize(task)
|
|
180
|
+
super(nil, task.start_event)
|
|
181
|
+
end
|
|
182
|
+
def pretty_print(pp)
|
|
183
|
+
pp.text "attempted to start a task that is expecting an execution agent but has none"
|
|
184
|
+
pp.breakable
|
|
185
|
+
failed_task.pretty_print(pp)
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
class ExecutionAgentNotReady < Roby::CommandFailed
|
|
190
|
+
attr_reader :execution_agent
|
|
191
|
+
def initialize(task)
|
|
192
|
+
super(nil, task.start_event)
|
|
193
|
+
@execution_agent = task.execution_agent
|
|
194
|
+
end
|
|
195
|
+
def pretty_print(pp)
|
|
196
|
+
pp.text "attempted to start a task buts its agent is not ready"
|
|
197
|
+
pp.breakable
|
|
198
|
+
failed_task.pretty_print(pp)
|
|
199
|
+
pp.breakable
|
|
200
|
+
pp.text "executed_by "
|
|
201
|
+
execution_agent.pretty_print(pp)
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# This module is hooked in Roby::TaskEventGenerator to check that a task
|
|
206
|
+
# which is being started has a suitable execution agent, and to start it if
|
|
207
|
+
# it's not the case
|
|
208
|
+
module ExecutionAgentStart
|
|
209
|
+
module Installer
|
|
210
|
+
def initialize_events
|
|
211
|
+
super
|
|
212
|
+
start_event.extend ExecutionAgentStart
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
Roby::Task.class_eval do
|
|
216
|
+
prepend Installer
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def calling(context)
|
|
220
|
+
super
|
|
221
|
+
|
|
222
|
+
agent = task.execution_agent
|
|
223
|
+
if !agent
|
|
224
|
+
if task.model.execution_agent
|
|
225
|
+
raise MissingRequiredExecutionAgent.new(task), "the model of #{task} requires an execution agent, but the task has none"
|
|
226
|
+
end
|
|
227
|
+
elsif !agent.ready?
|
|
228
|
+
raise ExecutionAgentNotReady.new(task), "cannot start #{task}, its agent is not ready"
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module Roby::TaskStructure
|
|
2
|
+
relation :PlannedBy,
|
|
3
|
+
child_name: :planning_task,
|
|
4
|
+
parent_name: :planned_task,
|
|
5
|
+
noinfo: true,
|
|
6
|
+
single_child: true
|
|
7
|
+
|
|
8
|
+
class PlannedBy
|
|
9
|
+
module Extension
|
|
10
|
+
# Returns the first child enumerated by planned_tasks. This is a
|
|
11
|
+
# convenience method that can be used if it is known that the planning
|
|
12
|
+
# task is only planning for one single task (a pretty common case)
|
|
13
|
+
def planned_task
|
|
14
|
+
each_in_neighbour_merged(PlannedBy, intrusive: true).first
|
|
15
|
+
end
|
|
16
|
+
# The set of tasks which are planned by this one
|
|
17
|
+
def planned_tasks; parent_objects(PlannedBy) end
|
|
18
|
+
# Set +task+ as the planning task of +self+
|
|
19
|
+
def planned_by(task, replace: false, optional: false, plan_early: true)
|
|
20
|
+
if task.respond_to?(:as_plan)
|
|
21
|
+
task = task.as_plan
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
if old = planning_task
|
|
25
|
+
if replace
|
|
26
|
+
remove_planning_task(old)
|
|
27
|
+
else
|
|
28
|
+
raise ArgumentError, "this task already has a planner"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
add_planning_task(task, optional: optional, plan_early: true)
|
|
32
|
+
if !plan_early
|
|
33
|
+
task.schedule_as(self)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
task
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Returns a set of PlanningFailedError exceptions for all abstract tasks
|
|
41
|
+
# for which planning has failed
|
|
42
|
+
def check_structure(plan)
|
|
43
|
+
result = []
|
|
44
|
+
each_edge do |planned_task, planning_task, options|
|
|
45
|
+
next if plan != planning_task.plan
|
|
46
|
+
next if !planning_task.failed?
|
|
47
|
+
next if !planned_task.self_owned?
|
|
48
|
+
|
|
49
|
+
if (planned_task.pending? && !planned_task.executable?) || !options[:optional]
|
|
50
|
+
result << [Roby::PlanningFailedError.new(planned_task, planning_task), nil]
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
result
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
module Roby
|
|
60
|
+
# This exception is raised when a task is abstract, and its planner failed:
|
|
61
|
+
# the system will therefore not have a suitable executable development for
|
|
62
|
+
# this task, and this is a failure
|
|
63
|
+
class PlanningFailedError < LocalizedError
|
|
64
|
+
# The planning task
|
|
65
|
+
attr_reader :planning_task
|
|
66
|
+
# The planned task
|
|
67
|
+
def planned_task; failed_task end
|
|
68
|
+
# The reason for the failure
|
|
69
|
+
attr_reader :failure_reason
|
|
70
|
+
|
|
71
|
+
def initialize(planned_task, planning_task, failure_reason: planning_task.failure_reason)
|
|
72
|
+
super(planned_task)
|
|
73
|
+
@planning_task = planning_task
|
|
74
|
+
@failure_reason = failure_reason
|
|
75
|
+
report_exceptions_from(failure_reason)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def pretty_print(pp)
|
|
79
|
+
pp.text "failed to plan "
|
|
80
|
+
planned_task.pretty_print(pp)
|
|
81
|
+
pp.breakable
|
|
82
|
+
pp.text "planned by "
|
|
83
|
+
planning_task.pretty_print(pp)
|
|
84
|
+
pp.breakable
|
|
85
|
+
pp.text " failed with "
|
|
86
|
+
failure_reason.pretty_print(pp)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Roby::Tasks
|
|
2
|
+
# Base functionality for the Sequence and Parallel aggregators
|
|
3
|
+
class TaskAggregator < Roby::Task
|
|
4
|
+
def initialize(arguments = Hash.new)
|
|
5
|
+
@tasks = Array.new
|
|
6
|
+
@name = nil
|
|
7
|
+
super
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
terminates
|
|
11
|
+
event(:start, controlable: true)
|
|
12
|
+
|
|
13
|
+
# The array of tasks that are aggregated by this object
|
|
14
|
+
attr_reader :tasks
|
|
15
|
+
|
|
16
|
+
# TODO: is this really necessary
|
|
17
|
+
def each_task(&iterator)
|
|
18
|
+
yield(self)
|
|
19
|
+
tasks.each(&iterator)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# True if this aggregator has no tasks
|
|
23
|
+
def empty?; tasks.empty? end
|
|
24
|
+
|
|
25
|
+
# Removes this aggregator from the plan
|
|
26
|
+
def delete
|
|
27
|
+
@name = self.name
|
|
28
|
+
@tasks = nil
|
|
29
|
+
if plan
|
|
30
|
+
plan.remove_task(self)
|
|
31
|
+
else
|
|
32
|
+
clear_relations
|
|
33
|
+
freeze
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|