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,77 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# Definition of the metamodel for Coordination::FaultResponseTable
|
|
5
|
+
module FaultResponseTable
|
|
6
|
+
include Roby::Actions::Models::Interface
|
|
7
|
+
include Arguments
|
|
8
|
+
|
|
9
|
+
# The set of defined fault handlers
|
|
10
|
+
#
|
|
11
|
+
# @return [FaultHandler]
|
|
12
|
+
inherited_attribute('fault_handler', 'fault_handlers') { Array.new }
|
|
13
|
+
|
|
14
|
+
def find_all_matching_handlers(exception)
|
|
15
|
+
each_fault_handler.find_all do |h|
|
|
16
|
+
h.execution_exception_matcher === exception
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Representation of a fault handler at the interface level
|
|
21
|
+
class Action < Roby::Actions::Models::Action
|
|
22
|
+
attr_reader :fault_response_table_model
|
|
23
|
+
|
|
24
|
+
# The fault handler model itself
|
|
25
|
+
def fault_handler_model
|
|
26
|
+
coordination_model
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# The common interface to set the fault handler
|
|
30
|
+
attr_accessor :coordination_model
|
|
31
|
+
|
|
32
|
+
def initialize(fault_response_table_model)
|
|
33
|
+
super()
|
|
34
|
+
@fault_response_table_model = fault_response_table_model
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def on_fault(exception_matcher, &block)
|
|
39
|
+
exception_matcher = exception_matcher.to_execution_exception_matcher
|
|
40
|
+
action_model = Action.new(self)
|
|
41
|
+
each_argument do |_, arg|
|
|
42
|
+
action_model.required_arg(arg.name)
|
|
43
|
+
end
|
|
44
|
+
action_model, handler =
|
|
45
|
+
create_coordination_action(action_model, Coordination::FaultHandler, &block)
|
|
46
|
+
handler.execution_exception_matcher(exception_matcher)
|
|
47
|
+
fault_handlers << handler
|
|
48
|
+
handler
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def each_task
|
|
52
|
+
return enum_for(:each_task) if !block_given?
|
|
53
|
+
super
|
|
54
|
+
each_fault_handler do |handler|
|
|
55
|
+
if task = handler.replacement
|
|
56
|
+
yield(task)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def respond_to_missing?(m, include_private)
|
|
62
|
+
Queries::ExecutionExceptionMatcher.method_defined?(m) || super
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def method_missing(m, *args, &block)
|
|
66
|
+
if Queries::ExecutionExceptionMatcher.method_defined?(m)
|
|
67
|
+
matcher = Queries::ExecutionExceptionMatcher.new
|
|
68
|
+
matcher.send(m, *args, &block)
|
|
69
|
+
matcher
|
|
70
|
+
else super
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# The root task in the execution context
|
|
5
|
+
class Root < Task
|
|
6
|
+
attr_accessor :coordination_model
|
|
7
|
+
|
|
8
|
+
def initialize(model, coordination_model)
|
|
9
|
+
super(model)
|
|
10
|
+
@coordination_model = coordination_model
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def rebind(coordination_model)
|
|
14
|
+
m = super
|
|
15
|
+
m.coordination_model = coordination_model
|
|
16
|
+
m
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
require 'roby/tasks/timeout'
|
|
2
|
+
module Roby
|
|
3
|
+
module Coordination
|
|
4
|
+
module Models
|
|
5
|
+
# The metamodel for all script-based coordination models
|
|
6
|
+
module Script
|
|
7
|
+
extend MetaRuby::Attributes
|
|
8
|
+
|
|
9
|
+
class DeadInstruction < Roby::LocalizedError; end
|
|
10
|
+
|
|
11
|
+
# Script element that implements {Script#start}
|
|
12
|
+
class Start < Coordination::ScriptInstruction
|
|
13
|
+
attr_reader :task
|
|
14
|
+
attr_reader :dependency_options
|
|
15
|
+
|
|
16
|
+
attr_predicate :explicit_start?, true
|
|
17
|
+
|
|
18
|
+
def initialize(task, explicit_start: false, **dependency_options)
|
|
19
|
+
@explicit_start = explicit_start
|
|
20
|
+
@task = task
|
|
21
|
+
@dependency_options = dependency_options
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def new(script)
|
|
25
|
+
Start.new(script.instance_for(task), explicit_start: explicit_start?, **dependency_options)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def execute(script)
|
|
29
|
+
script.start_task(task, explicit_start: explicit_start?)
|
|
30
|
+
true
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def to_s; "start(#{task}, #{dependency_options})" end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Script element that implements {Script#wait}
|
|
37
|
+
class Wait < Coordination::ScriptInstruction
|
|
38
|
+
attr_reader :event
|
|
39
|
+
|
|
40
|
+
# @return [Time,nil] time after which an emission is valid.
|
|
41
|
+
# 'nil' means that only emissions that have happened after
|
|
42
|
+
# the script reached this instruction are considered
|
|
43
|
+
attr_reader :time_barrier
|
|
44
|
+
|
|
45
|
+
# @return [Float] number of seconds after which the wait
|
|
46
|
+
# instruction should generate an error
|
|
47
|
+
attr_reader :timeout
|
|
48
|
+
|
|
49
|
+
# @return [Boolean] true if {#execute} has been called once
|
|
50
|
+
attr_predicate :initialized?
|
|
51
|
+
|
|
52
|
+
# @return [Boolean] true if the watched event got emitted
|
|
53
|
+
attr_predicate :done?
|
|
54
|
+
|
|
55
|
+
# @option options [Float] :timeout (nil) value for {#timeout}
|
|
56
|
+
# @option options [Time] :after (nil) value for
|
|
57
|
+
# {#time_barrier}
|
|
58
|
+
def initialize(event, after: nil)
|
|
59
|
+
@event = event
|
|
60
|
+
@done = false
|
|
61
|
+
@time_barrier = after
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def new(script)
|
|
65
|
+
Wait.new(script.instance_for(event), after: time_barrier)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def execute(script)
|
|
69
|
+
event = self.event.resolve
|
|
70
|
+
plan = script.plan
|
|
71
|
+
root_task = script.root_task
|
|
72
|
+
|
|
73
|
+
if time_barrier
|
|
74
|
+
last_event = event.history.last
|
|
75
|
+
if last_event && last_event.time > time_barrier
|
|
76
|
+
return true
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
if event.unreachable?
|
|
81
|
+
plan.add_error(DeadInstruction.new(script.root_task))
|
|
82
|
+
return false
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
if event.task != root_task
|
|
86
|
+
role_name = "wait_#{self.object_id}"
|
|
87
|
+
current_roles = (root_task.depends_on?(event.task) && root_task.roles_of(event.task))
|
|
88
|
+
root_task.depends_on event.task, success: nil, role: role_name
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
event.if_unreachable(cancel_at_emission: true) do |reason, generator|
|
|
92
|
+
if !disabled?
|
|
93
|
+
generator.plan.add_error(DeadInstruction.new(script.root_task))
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
event.on on_replace: :copy do |event|
|
|
98
|
+
if event.generator == self.event.resolve && !disabled?
|
|
99
|
+
if !time_barrier || event.time > time_barrier
|
|
100
|
+
if role_name && (child = script.root_task.find_child_from_role(role_name))
|
|
101
|
+
script.root_task.remove_roles(child, role_name, remove_child_when_empty: !current_roles || !current_roles.empty?)
|
|
102
|
+
end
|
|
103
|
+
cancel
|
|
104
|
+
script.step
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
false
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def waited_task_role
|
|
113
|
+
"wait_#{object_id}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def to_s; "wait(#{event})" end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Script element that implements {Script#emit}
|
|
120
|
+
class Emit < Coordination::ScriptInstruction
|
|
121
|
+
# @return [Event] the event that should be
|
|
122
|
+
# emitted
|
|
123
|
+
attr_reader :event
|
|
124
|
+
|
|
125
|
+
def initialize(event)
|
|
126
|
+
@event = event
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def new(script)
|
|
130
|
+
Emit.new(script.instance_for(event))
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def execute(script)
|
|
134
|
+
event.resolve.emit
|
|
135
|
+
true
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def to_s; "emit(#{event})" end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
class TimeoutStart
|
|
142
|
+
attr_reader :seconds
|
|
143
|
+
attr_reader :event
|
|
144
|
+
|
|
145
|
+
def initialize(seconds, options = Hash.new)
|
|
146
|
+
@seconds = seconds
|
|
147
|
+
options = Kernel.validate_options options, emit: nil
|
|
148
|
+
@event = options[:emit]
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def new(script)
|
|
152
|
+
event = if self.event
|
|
153
|
+
script.instance_for(self.event)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
Coordination::TaskScript::TimeoutStart.new(self, event)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
class TimeoutStop
|
|
161
|
+
attr_reader :timeout_start
|
|
162
|
+
|
|
163
|
+
def initialize(timeout_start)
|
|
164
|
+
@timeout_start = timeout_start
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def new(script)
|
|
168
|
+
Coordination::TaskScript::TimeoutStop.new(script.instance_for(timeout_start))
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
inherited_single_value_attribute('__terminal') { false }
|
|
173
|
+
|
|
174
|
+
# Marks this script has being terminated, i.e. that no new
|
|
175
|
+
# instructions can be added to it
|
|
176
|
+
#
|
|
177
|
+
# Once this is called, adding new instructions will raise
|
|
178
|
+
# ArgumentError
|
|
179
|
+
def terminal
|
|
180
|
+
__terminal(true)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# @return [Boolean] if true, this script cannot get new
|
|
184
|
+
# instructions (a terminal instruction has been added)
|
|
185
|
+
def terminal?
|
|
186
|
+
__terminal
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# The list of instructions in this script
|
|
190
|
+
# @return [Array]
|
|
191
|
+
attribute(:instructions) { Array.new }
|
|
192
|
+
|
|
193
|
+
# Starts the given task
|
|
194
|
+
#
|
|
195
|
+
# @param [Task] task the action-task. It must be created by
|
|
196
|
+
# calling {Base#task} on the relevant object
|
|
197
|
+
# @param [Hash] options the dependency relation options. See
|
|
198
|
+
# {Roby::TaskStructure::Dependency::Extension#depends_on}
|
|
199
|
+
def start(task, explicit_start: false, **options)
|
|
200
|
+
task = validate_or_create_task task
|
|
201
|
+
add Start.new(task, explicit_start: explicit_start, **options)
|
|
202
|
+
wait(task.start_event)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Starts the given task, and waits for it to successfully finish
|
|
206
|
+
#
|
|
207
|
+
# @param [Task] task the action-task. It must be created by
|
|
208
|
+
# calling {Base#task} on the relevant object
|
|
209
|
+
# @param [Hash] options the dependency relation options. See
|
|
210
|
+
# {Roby::TaskStructure::Dependency::Extension#depends_on}
|
|
211
|
+
def execute(task, options = Hash.new)
|
|
212
|
+
task = validate_or_create_task task
|
|
213
|
+
start(task, options)
|
|
214
|
+
wait(task.success_event)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# Waits a certain amount of time before continuing
|
|
218
|
+
#
|
|
219
|
+
# @param [Float] time the amount of time to wait, in seconds
|
|
220
|
+
def sleep(time)
|
|
221
|
+
task = self.task(ActionCoordination::TaskFromAsPlan.new(Tasks::Timeout.with_arguments(delay: time), Tasks::Timeout))
|
|
222
|
+
start task, explicit_start: true
|
|
223
|
+
wait task.stop_event
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# Waits until this event gets emitted
|
|
227
|
+
#
|
|
228
|
+
# It will wait even if this event has already been emitted at
|
|
229
|
+
# this point in the script (i.e. waits for a "new" emission)
|
|
230
|
+
#
|
|
231
|
+
# @param [Event] event the event to wait for
|
|
232
|
+
# @param [Hash] options
|
|
233
|
+
# @param [Float] timeout a timeout (for backward
|
|
234
|
+
# compatibility, use timeout(seconds) do ... end instead)
|
|
235
|
+
def wait(event, timeout: nil, **wait_options)
|
|
236
|
+
validate_event event
|
|
237
|
+
|
|
238
|
+
wait = Wait.new(event, **wait_options)
|
|
239
|
+
if timeout
|
|
240
|
+
timeout(timeout) do
|
|
241
|
+
add wait
|
|
242
|
+
end
|
|
243
|
+
else
|
|
244
|
+
add wait
|
|
245
|
+
end
|
|
246
|
+
wait
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# Emit the given event
|
|
250
|
+
#
|
|
251
|
+
# @param [Event] event
|
|
252
|
+
def emit(event)
|
|
253
|
+
validate_event event
|
|
254
|
+
add Emit.new(event)
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# Execute another script at this point in the execution
|
|
258
|
+
def call(script)
|
|
259
|
+
instructions.concat(script.instructions)
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def timeout_start(delay, options = Hash.new)
|
|
263
|
+
ins = TimeoutStart.new(delay, options)
|
|
264
|
+
add ins
|
|
265
|
+
ins
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def timeout_stop(timeout_start)
|
|
269
|
+
ins = TimeoutStop.new(timeout_start)
|
|
270
|
+
add ins
|
|
271
|
+
ins
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def add(instruction)
|
|
275
|
+
if terminal?
|
|
276
|
+
raise ArgumentError, "a terminal command has been called on this script, cannot add anything further"
|
|
277
|
+
end
|
|
278
|
+
instructions << instruction
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# A model-level coordination task
|
|
5
|
+
#
|
|
6
|
+
# Coordination models are built using instances of
|
|
7
|
+
# {Coordination::Models::Task} (or its subclasses). When they get
|
|
8
|
+
# instanciated into actual coordination objects, these are uniquely
|
|
9
|
+
# associated with instances of {Coordination::Task} (or its
|
|
10
|
+
# subclasses).
|
|
11
|
+
#
|
|
12
|
+
# This class is the base class for all model-level coordination
|
|
13
|
+
# tasks. It is typed (i.e. we know the Roby task model that it
|
|
14
|
+
# represents) and optionally has a name.
|
|
15
|
+
class Task
|
|
16
|
+
# The underlying Roby task model
|
|
17
|
+
#
|
|
18
|
+
# If it responds to {#find_child}, the coordination task model
|
|
19
|
+
# will allow to validate the task's own children.
|
|
20
|
+
#
|
|
21
|
+
# @return [Model<Roby::Task>] the Roby task model, as a subclass
|
|
22
|
+
# of Roby::Task
|
|
23
|
+
attr_accessor :model
|
|
24
|
+
|
|
25
|
+
# The task name
|
|
26
|
+
#
|
|
27
|
+
# @return [nil,String]
|
|
28
|
+
attr_accessor :name
|
|
29
|
+
|
|
30
|
+
# Creates this model-level coordination task to represent a
|
|
31
|
+
# given Roby task model
|
|
32
|
+
#
|
|
33
|
+
# @param [Model<Roby::Task>] model the Roby task model, which is
|
|
34
|
+
# either Roby::Task or one of its subclasses
|
|
35
|
+
def initialize(model)
|
|
36
|
+
@model = model
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Create a new coordination task based on a different
|
|
40
|
+
# coordination model
|
|
41
|
+
def rebind(coordination_model)
|
|
42
|
+
dup
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @api private
|
|
46
|
+
#
|
|
47
|
+
# Used in {Base#rebind} to update the internal relationships
|
|
48
|
+
# between coordination tasks
|
|
49
|
+
def map_tasks(mapping)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Returns an instance-level coordination task that can be used
|
|
53
|
+
# to represent self
|
|
54
|
+
#
|
|
55
|
+
# It is delegated to the task model, as the actual class that is
|
|
56
|
+
# used to represent self in a coordination object might depend
|
|
57
|
+
# on the class of the model-level coordination task.
|
|
58
|
+
#
|
|
59
|
+
# @return [Coordination::Task]
|
|
60
|
+
def new(execution_context)
|
|
61
|
+
Coordination::Task.new(execution_context, self)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Tests if this task has a given event
|
|
65
|
+
#
|
|
66
|
+
# @param [String,Symbol] event_name the event name
|
|
67
|
+
# @return [Boolean] true if the event is an event of self, and
|
|
68
|
+
# false otherwise
|
|
69
|
+
def has_event?(event_name)
|
|
70
|
+
if model && model.respond_to?(:find_event)
|
|
71
|
+
model.find_event(event_name.to_sym)
|
|
72
|
+
else true
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Returns an model-level coordination event that can be used to
|
|
77
|
+
# represent an event on this task
|
|
78
|
+
#
|
|
79
|
+
# @param [String,Symbol] event_name the event name
|
|
80
|
+
# @return [Coordination::Models::Event] the event object, or nil
|
|
81
|
+
# if the event does not exist
|
|
82
|
+
def find_event(event_name)
|
|
83
|
+
if has_event?(event_name)
|
|
84
|
+
return Event.new(self, event_name)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Test if this coordination task can tell us something about the
|
|
89
|
+
# models of its children
|
|
90
|
+
#
|
|
91
|
+
# It uses the presence or absence of a #find_child method on
|
|
92
|
+
# {#model} to determine it.
|
|
93
|
+
#
|
|
94
|
+
# @return [Boolean] true if {#has_child?} and
|
|
95
|
+
# {#find_child_model} can return meaningful information.
|
|
96
|
+
def can_resolve_child_models?
|
|
97
|
+
model && model.respond_to?(:find_child)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Tests if this task has a child with the given role
|
|
101
|
+
#
|
|
102
|
+
# It always returns true if {#model} does not allow us to
|
|
103
|
+
# resolve children. The rationale is that these methods are used
|
|
104
|
+
# to type-validate tasks in e.g. action state machines and we
|
|
105
|
+
# need to simply be permissive if the models does not allow us
|
|
106
|
+
# to validate anything. Use {#can_resolve_child_models?} to know
|
|
107
|
+
# whether validation is meaningful.
|
|
108
|
+
#
|
|
109
|
+
# @return [Boolean] true if the task has a child with the given
|
|
110
|
+
# role, or if {#model} does not allow to do any validation.
|
|
111
|
+
def has_child?(role)
|
|
112
|
+
find_child_model(role) ||
|
|
113
|
+
!can_resolve_child_models?
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Returns the model of a given child of this task
|
|
117
|
+
#
|
|
118
|
+
# It always returns Roby::Task if {#model} does not allow us to
|
|
119
|
+
# resolve children. The rationale is that these methods are used
|
|
120
|
+
# to type-validate tasks in e.g. action state machines and we
|
|
121
|
+
# need to simply be permissive if the models does not allow us
|
|
122
|
+
# to validate anything. Use {#can_resolve_child_models?} to know
|
|
123
|
+
# whether validation is meaningful.
|
|
124
|
+
#
|
|
125
|
+
# @return [Model<Roby::Task>,nil] the child's model, or nil if
|
|
126
|
+
# the child does not exist.
|
|
127
|
+
def find_child_model(role)
|
|
128
|
+
if can_resolve_child_models?
|
|
129
|
+
model.find_child(role)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Returns a representation of this task's child that can be used
|
|
134
|
+
# in a coordination model
|
|
135
|
+
#
|
|
136
|
+
# @param [String,Symbol] role the child's role
|
|
137
|
+
# @param [nil,Model<Roby::Task>] child_model the child's model.
|
|
138
|
+
# This can be set to either overwrite what is known to Roby
|
|
139
|
+
# (i.e. overwrite what {#model} announces), or to give
|
|
140
|
+
# information that {#model} does not have in case
|
|
141
|
+
# {#can_resolve_child_models?} returns false
|
|
142
|
+
# @return [Coordination::Models::Child,nil] the child object, or
|
|
143
|
+
# nil if there is no such child on self
|
|
144
|
+
def find_child(role, child_model = nil)
|
|
145
|
+
if has_child?(role)
|
|
146
|
+
return Child.new(self, role, child_model || find_child_model(role))
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def find_through_method_missing(m, args)
|
|
151
|
+
MetaRuby::DSLs.find_through_method_missing(
|
|
152
|
+
self, m, args,
|
|
153
|
+
'_event' => :find_event,
|
|
154
|
+
'_child' => :find_child) ||
|
|
155
|
+
super
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def has_through_method_missing?(m)
|
|
159
|
+
MetaRuby::DSLs.has_through_method_missing?(
|
|
160
|
+
self, m,
|
|
161
|
+
'_event' => :has_event?,
|
|
162
|
+
'_child' => :has_child?) ||
|
|
163
|
+
super
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
include MetaRuby::DSLs::FindThroughMethodMissing
|
|
167
|
+
|
|
168
|
+
def to_coordination_task(task_model = Roby::Task)
|
|
169
|
+
self
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# This method must be overloaded in the tasks that will be
|
|
173
|
+
# actually used in the coordination primitives
|
|
174
|
+
def instanciate(plan, variables = Hash.new)
|
|
175
|
+
raise NotImplementedError, "must reimplement #instanciate in the task objects used in coordination primitives"
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def setup_instanciated_task(coordination_context, task, arguments = Hash.new)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|