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,55 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
module Arguments
|
|
5
|
+
extend MetaRuby::Attributes
|
|
6
|
+
|
|
7
|
+
Argument = Struct.new :name, :required, :default
|
|
8
|
+
|
|
9
|
+
# The set of arguments available to this execution context
|
|
10
|
+
# @return [Array<Symbol>]
|
|
11
|
+
inherited_attribute(:argument, :arguments, map: true) { Hash.new }
|
|
12
|
+
|
|
13
|
+
# Define a new argument for this coordination model
|
|
14
|
+
#
|
|
15
|
+
# Arguments are made available within the coordination model as
|
|
16
|
+
# Variable objects
|
|
17
|
+
#
|
|
18
|
+
# @param [String,Symbol] name the argument name
|
|
19
|
+
# @param [Hash] options
|
|
20
|
+
# @option options :default a default value for this argument. Note
|
|
21
|
+
# that 'nil' is considered as a proper default value.
|
|
22
|
+
# @return [Argument] the new argument object
|
|
23
|
+
def argument(name, options = Hash.new)
|
|
24
|
+
options = Kernel.validate_options options, :default
|
|
25
|
+
arguments[name.to_sym] = Argument.new(name.to_sym, !options.has_key?(:default), options[:default])
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Validates that the provided argument hash is valid for this
|
|
29
|
+
# particular coordination model
|
|
30
|
+
#
|
|
31
|
+
# @raise ArgumentError if some given arguments are not known to this
|
|
32
|
+
# model, or if some required arguments are not set
|
|
33
|
+
def validate_arguments(arguments)
|
|
34
|
+
arguments = Kernel.normalize_options arguments
|
|
35
|
+
arguments.keys.each do |arg_name|
|
|
36
|
+
if !find_argument(arg_name)
|
|
37
|
+
raise ArgumentError, "#{arg_name} is not an argument on #{self}"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
each_argument do |_, arg|
|
|
41
|
+
if !arguments.has_key?(arg.name)
|
|
42
|
+
if arg.required
|
|
43
|
+
raise ArgumentError, "#{arg.name} is required by #{self}, but is not provided (given arguments: #{arguments})"
|
|
44
|
+
end
|
|
45
|
+
arguments[arg.name] = arg.default
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
arguments
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# Model part of Base
|
|
5
|
+
module Base
|
|
6
|
+
include MetaRuby::ModelAsClass
|
|
7
|
+
include Arguments
|
|
8
|
+
|
|
9
|
+
# Name of this coordination object
|
|
10
|
+
#
|
|
11
|
+
# For debugging purposes. It is usually set by the enclosing context
|
|
12
|
+
#
|
|
13
|
+
# @return [String,nil]
|
|
14
|
+
attr_accessor :name
|
|
15
|
+
|
|
16
|
+
# Gets or sets the root task model
|
|
17
|
+
#
|
|
18
|
+
# @return [Root] the root task model, i.e. a representation of the
|
|
19
|
+
# task this execution context is going to be run on
|
|
20
|
+
def root(*new_root)
|
|
21
|
+
if !new_root.empty?
|
|
22
|
+
@root = Root.new(new_root.first, self)
|
|
23
|
+
elsif @root then @root
|
|
24
|
+
elsif superclass.respond_to?(:root)
|
|
25
|
+
@root = superclass.root.rebind(self)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @deprecated use {#root} instead, as it is a more DSL-like API
|
|
30
|
+
attr_writer :root
|
|
31
|
+
|
|
32
|
+
# @return [Model<Roby::Task>] the task model this execution context
|
|
33
|
+
# is attached to
|
|
34
|
+
def task_model; root.model end
|
|
35
|
+
|
|
36
|
+
# Gives direct access to the root's events
|
|
37
|
+
#
|
|
38
|
+
# This is needed to be able to use a coordination model as model for
|
|
39
|
+
# a coordination task, which in turn gives access to e.g. states in
|
|
40
|
+
# an action state machine
|
|
41
|
+
def find_event(name)
|
|
42
|
+
root.find_event(name)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Returns the task for the given name, if found, nil otherwise
|
|
46
|
+
#
|
|
47
|
+
# @return Roby::Coordination::Models::TaskFromAction
|
|
48
|
+
def find_task_by_name(name)
|
|
49
|
+
tasks.find do |m|
|
|
50
|
+
m.name == name.to_s
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# The set of defined tasks
|
|
55
|
+
# @return [Array<Task>]
|
|
56
|
+
inherited_attribute(:task, :tasks) { Array.new }
|
|
57
|
+
|
|
58
|
+
# The set of fault response tables that should be active when this
|
|
59
|
+
# coordination model is
|
|
60
|
+
# @return [Array<(FaultResponseTable,Hash)>]
|
|
61
|
+
inherited_attribute(:used_fault_response_table, :used_fault_response_tables) { Array.new }
|
|
62
|
+
|
|
63
|
+
# Creates a new execution context model as a submodel of self
|
|
64
|
+
#
|
|
65
|
+
# @param [Model<Roby::Task>] subclass the
|
|
66
|
+
# task model that is going to be used as a toplevel task for the
|
|
67
|
+
# state machine
|
|
68
|
+
# @return [Model<StateMachine>] a subclass of StateMachine
|
|
69
|
+
def setup_submodel(subclass, options = Hash.new)
|
|
70
|
+
options = Kernel.validate_options options, root: Roby::Task
|
|
71
|
+
subclass.root(options[:root])
|
|
72
|
+
super
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Creates a state from an object
|
|
76
|
+
def task(object, task_model = Roby::Task)
|
|
77
|
+
if object.respond_to?(:to_coordination_task)
|
|
78
|
+
task = object.to_coordination_task(task_model)
|
|
79
|
+
tasks << task
|
|
80
|
+
task
|
|
81
|
+
elsif object.respond_to?(:as_plan)
|
|
82
|
+
task = TaskFromAsPlan.new(object, task_model)
|
|
83
|
+
tasks << task
|
|
84
|
+
task
|
|
85
|
+
else raise ArgumentError, "cannot create a task from #{object}"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# @api private
|
|
90
|
+
#
|
|
91
|
+
# Transform the model by exchanging tasks
|
|
92
|
+
#
|
|
93
|
+
# @param [#[]] mapping a mapping that replaces an existing task by a
|
|
94
|
+
# new one. All tasks must be mapped
|
|
95
|
+
def map_tasks(mapping)
|
|
96
|
+
@root = mapping.fetch(root)
|
|
97
|
+
@tasks = tasks.map do |t|
|
|
98
|
+
new_task = mapping.fetch(t)
|
|
99
|
+
new_task.map_tasks(mapping)
|
|
100
|
+
new_task
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Assigns names to tasks based on the name of the local variables
|
|
105
|
+
# they are assigned to
|
|
106
|
+
#
|
|
107
|
+
# This must be called by methods that are themselves called during
|
|
108
|
+
# parsing
|
|
109
|
+
#
|
|
110
|
+
# @param [String] suffix that should be added to all the names
|
|
111
|
+
def parse_names(suffixes)
|
|
112
|
+
definition_context = binding.callers.find { |b| b.frame_type == :block }
|
|
113
|
+
return if !definition_context
|
|
114
|
+
|
|
115
|
+
# Assign names to tasks using the local variables
|
|
116
|
+
vars = definition_context.eval "local_variables"
|
|
117
|
+
values = definition_context.eval "[#{vars.map { |n| "#{n}" }.join(", ")}]"
|
|
118
|
+
vars.zip(values).each do |name, object|
|
|
119
|
+
suffixes.each do |klass, suffix|
|
|
120
|
+
if object.kind_of?(klass)
|
|
121
|
+
object.name = "#{name}#{suffix}"
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def respond_to_missing?(m, include_private)
|
|
128
|
+
has_argument?(m) ||
|
|
129
|
+
(m =~ /_event$|_child$/ && root.respond_to?(m)) ||
|
|
130
|
+
super
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def method_missing(m, *args, &block)
|
|
134
|
+
if has_argument?(m)
|
|
135
|
+
if !args.empty?
|
|
136
|
+
raise ArgumentError, "expected zero arguments to #{m}, got #{args.size}"
|
|
137
|
+
end
|
|
138
|
+
Variable.new(m)
|
|
139
|
+
elsif m =~ /(.*)(?:_event$|_child$)/
|
|
140
|
+
return root.send(m, *args, &block)
|
|
141
|
+
else return super
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def validate_task(object)
|
|
146
|
+
if !object.kind_of?(Coordination::Models::Task)
|
|
147
|
+
raise ArgumentError, "expected a state object, got #{object}. States need to be created from e.g. actions by calling #state before they can be used in the state machine"
|
|
148
|
+
end
|
|
149
|
+
object
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def validate_or_create_task(task)
|
|
153
|
+
if !task.kind_of?(Coordination::Models::Task)
|
|
154
|
+
task(task)
|
|
155
|
+
else task
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def validate_event(object)
|
|
160
|
+
if !object.kind_of?(Coordination::Models::Event)
|
|
161
|
+
raise ArgumentError, "expected an action-event object, got #{object}. Acceptable events need to be created from e.g. actions by calling #task(action).my_event"
|
|
162
|
+
end
|
|
163
|
+
object
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Declare that this fault response table should be active as long as
|
|
167
|
+
# this coordination model is
|
|
168
|
+
def use_fault_response_table(table_model, arguments = Hash.new)
|
|
169
|
+
arguments = table_model.validate_arguments(arguments)
|
|
170
|
+
used_fault_response_tables << [table_model, arguments]
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# Object that is used to represent the context of an event context
|
|
5
|
+
class Capture
|
|
6
|
+
# The capture name
|
|
7
|
+
#
|
|
8
|
+
# Only used for debugging purposes
|
|
9
|
+
#
|
|
10
|
+
# @return [String]
|
|
11
|
+
attr_accessor :name
|
|
12
|
+
|
|
13
|
+
# Create a new capture object
|
|
14
|
+
#
|
|
15
|
+
# @param [#call] filter an object that is used to process the
|
|
16
|
+
# event's context. It is passed the context as-is (i.e. as an
|
|
17
|
+
# array) and should return the value that should be captured
|
|
18
|
+
def initialize(filter = lambda { |event| event.context })
|
|
19
|
+
@filter = filter
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Filter the context through the filter object passed to
|
|
23
|
+
# {#initialize}
|
|
24
|
+
def filter(state_machine, event)
|
|
25
|
+
CaptureEvaluationContext.new(state_machine).
|
|
26
|
+
instance_exec(event, &@filter)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class CaptureEvaluationContext < Object
|
|
30
|
+
def initialize(state_machine)
|
|
31
|
+
@state_machine = state_machine
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def respond_to_missing?(m, include_private)
|
|
35
|
+
@state_machine.model.has_argument?(m) || super
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def method_missing(m, *args)
|
|
39
|
+
if @state_machine.arguments.has_key?(m)
|
|
40
|
+
if args.empty?
|
|
41
|
+
return @state_machine.arguments[m]
|
|
42
|
+
else
|
|
43
|
+
raise ArgumentError, "expected zero argument to #{m}, got #{args.size}"
|
|
44
|
+
end
|
|
45
|
+
elsif @state_machine.model.has_argument?(m)
|
|
46
|
+
raise ArgumentError, "#{m} is not set"
|
|
47
|
+
end
|
|
48
|
+
super
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Exception raised when trying to evaluate a capture whose
|
|
53
|
+
# backing event has not yet happened
|
|
54
|
+
class Unbound < RuntimeError
|
|
55
|
+
attr_reader :capture
|
|
56
|
+
def initialize(capture)
|
|
57
|
+
@capture = capture
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def evaluate_delayed_argument(task)
|
|
62
|
+
throw :no_value
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Evaluate the capture
|
|
66
|
+
#
|
|
67
|
+
# @param [Hash] variables the underlying coordination object's
|
|
68
|
+
# bound variables
|
|
69
|
+
# @raise Unbound if the capture's backing event has not yet been
|
|
70
|
+
# emitted
|
|
71
|
+
def evaluate(variables)
|
|
72
|
+
if variables.has_key?(self)
|
|
73
|
+
variables[self]
|
|
74
|
+
else
|
|
75
|
+
raise Unbound.new(self), "#{self} is not bound yet"
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def to_s
|
|
80
|
+
"capture:#{name || '<unnamed>'}"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# A representation of a task of the execution context's task
|
|
5
|
+
class Child < Task
|
|
6
|
+
# @return [Base,Child] the child's parent
|
|
7
|
+
attr_reader :parent
|
|
8
|
+
# @return [String] the child's role, relative to its parent
|
|
9
|
+
attr_reader :role
|
|
10
|
+
# The child's model
|
|
11
|
+
attr_reader :model
|
|
12
|
+
|
|
13
|
+
def initialize(parent, role, model)
|
|
14
|
+
@parent, @role, @model = parent, role, model
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def ==(other)
|
|
18
|
+
other.kind_of?(Child) &&
|
|
19
|
+
other.parent == parent &&
|
|
20
|
+
other.role == role &&
|
|
21
|
+
other.model == model
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [Coordination::Child]
|
|
25
|
+
def new(execution_context)
|
|
26
|
+
Coordination::Child.new(execution_context, self)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def to_s; "#{parent}.#{role}_child[#{model}]" end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# A representation of an event on the execution context's task
|
|
5
|
+
class Event
|
|
6
|
+
# @return [Coordination::Models::Task] The task this event is defined on
|
|
7
|
+
attr_reader :task
|
|
8
|
+
# @return [Symbol] the event's symbol
|
|
9
|
+
attr_reader :symbol
|
|
10
|
+
|
|
11
|
+
def initialize(task, symbol)
|
|
12
|
+
@task, @symbol = task, symbol.to_sym
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @return [Coordination::Base::Event]
|
|
16
|
+
def new(execution_context)
|
|
17
|
+
Coordination::Event.new(execution_context, self)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def ==(other)
|
|
21
|
+
other.kind_of?(self.class) &&
|
|
22
|
+
other.symbol == symbol &&
|
|
23
|
+
other.task == task
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# When running in this event's state, forward this event to the
|
|
27
|
+
# given root task event
|
|
28
|
+
def forward_to(root_event)
|
|
29
|
+
if !root_event.task.respond_to?(:coordination_model)
|
|
30
|
+
raise NotRootEvent, "can only forward to a root event"
|
|
31
|
+
end
|
|
32
|
+
root_event.task.coordination_model.
|
|
33
|
+
forward task, self, root_event
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def to_s; "#{task}.#{symbol}_event" end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# Base class for model validation errors
|
|
5
|
+
class CoordinationModelError < Exception; end
|
|
6
|
+
|
|
7
|
+
# Exception thrown when using a non-root event in a context where
|
|
8
|
+
# only root events are allowed
|
|
9
|
+
class NotRootEvent < CoordinationModelError; end
|
|
10
|
+
|
|
11
|
+
# Exception raised in state machine definitions when a state is used
|
|
12
|
+
# in a transition, that cannot be reached in the first place
|
|
13
|
+
class UnreachableStateUsed < RuntimeError
|
|
14
|
+
# The set of unreachable states
|
|
15
|
+
attr_reader :states
|
|
16
|
+
|
|
17
|
+
def initialize(states)
|
|
18
|
+
@states = states
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def pretty_print(pp)
|
|
22
|
+
pp.text "#{states.size} states are unreachable but used in transitions anyways"
|
|
23
|
+
pp.nest(2) do
|
|
24
|
+
pp.seplist(states) do |s|
|
|
25
|
+
pp.breakable
|
|
26
|
+
s.pretty_print(pp)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Exception thrown when a toplevel state was expected but a
|
|
33
|
+
# dependency was given
|
|
34
|
+
class NotToplevelState < CoordinationModelError; end
|
|
35
|
+
|
|
36
|
+
# Exception thrown when using an event in a context where it is not
|
|
37
|
+
# active
|
|
38
|
+
class EventNotActiveInState < CoordinationModelError; end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# Definition of a single fault handler in a FaultResponseTable
|
|
5
|
+
module FaultHandler
|
|
6
|
+
include Actions
|
|
7
|
+
include Script
|
|
8
|
+
|
|
9
|
+
# @return [FaultResponseTable] the table this handler is part of
|
|
10
|
+
def fault_response_table; action_interface end
|
|
11
|
+
# @return [Queries::ExecutionExceptionMatcher] the object
|
|
12
|
+
# defining for which faults this handler should be activated
|
|
13
|
+
inherited_single_value_attribute(:execution_exception_matcher) { Queries.none }
|
|
14
|
+
# @return [Integer] this handler's priority
|
|
15
|
+
inherited_single_value_attribute(:priority) { 0 }
|
|
16
|
+
# @return [:missions,:actions,:origin] the fault response
|
|
17
|
+
# location
|
|
18
|
+
inherited_single_value_attribute(:response_location) { :actions }
|
|
19
|
+
# @return [Boolean] if true, the action location will be retried
|
|
20
|
+
# after the fault response table, otherwise whatever should
|
|
21
|
+
# happen will happen (other error handling, ...)
|
|
22
|
+
inherited_single_value_attribute(:__carry_on) { false }
|
|
23
|
+
# @return [Boolean] if true, the last action of the response
|
|
24
|
+
# will be to retry whichever action/missions/tasks have been
|
|
25
|
+
# interrupted by the fault
|
|
26
|
+
def carry_on?; !!__carry_on end
|
|
27
|
+
# @deprecated use {#carry_on?}
|
|
28
|
+
def try_again?; carry_on? end
|
|
29
|
+
# @return [#instanciate] an object that allows to create the
|
|
30
|
+
# toplevel task of the fault response
|
|
31
|
+
inherited_single_value_attribute :action
|
|
32
|
+
|
|
33
|
+
def to_s
|
|
34
|
+
"#{fault_response_table}.on_fault(#{execution_exception_matcher})"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def locate_on_missions
|
|
38
|
+
response_location :missions
|
|
39
|
+
self
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def locate_on_actions
|
|
43
|
+
response_location :actions
|
|
44
|
+
self
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def locate_on_origin
|
|
48
|
+
response_location :origin
|
|
49
|
+
self
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Try the repaired action again when the fault handler
|
|
53
|
+
# successfully finishes
|
|
54
|
+
#
|
|
55
|
+
# It can be called anytime in the script, but will have an
|
|
56
|
+
# effect only at the end of the fault handler
|
|
57
|
+
def carry_on
|
|
58
|
+
__carry_on(true)
|
|
59
|
+
terminal
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @deprecated use {#carry_on}
|
|
63
|
+
def try_again; carry_on end
|
|
64
|
+
|
|
65
|
+
# Script element that implements the replacement part of
|
|
66
|
+
# {#replace_by}
|
|
67
|
+
class ReplaceBy < Coordination::ScriptInstruction
|
|
68
|
+
attr_reader :replacement_task
|
|
69
|
+
|
|
70
|
+
def initialize(replacement_task)
|
|
71
|
+
@replacement_task = replacement_task
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def new(fault_handler)
|
|
75
|
+
ReplaceBy.new(fault_handler.instance_for(replacement_task))
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def execute(fault_handler)
|
|
79
|
+
response_task = fault_handler.root_task
|
|
80
|
+
plan = response_task.plan
|
|
81
|
+
replacement_task = self.replacement_task.resolve
|
|
82
|
+
|
|
83
|
+
response_task.each_parent_object(Roby::TaskStructure::ErrorHandling) do |repaired_task|
|
|
84
|
+
repaired_task_parents = repaired_task.each_parent_task.map do |parent_task|
|
|
85
|
+
[parent_task, parent_task[repaired_task, Roby::TaskStructure::Dependency]]
|
|
86
|
+
end
|
|
87
|
+
plan.replace(repaired_task, replacement_task)
|
|
88
|
+
repaired_task_parents.each do |parent_t, dependency_options|
|
|
89
|
+
parent_t.add_child repaired_task, dependency_options
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
true
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def to_s; "start(#{task}, #{dependency_options})" end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
class FinalizeReplacement < Coordination::ScriptInstruction
|
|
99
|
+
def new(fault_handler)
|
|
100
|
+
self
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def execute(fault_handler)
|
|
104
|
+
response_task = fault_handler.root_task
|
|
105
|
+
response_task.each_parent_object(Roby::TaskStructure::ErrorHandling) do |repaired_task|
|
|
106
|
+
repaired_task_parents = repaired_task.each_parent_task.to_a
|
|
107
|
+
repaired_task_parents.each do |parent|
|
|
108
|
+
parent.remove_child repaired_task
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Replace the response's location by this task when the fault
|
|
115
|
+
# handler script is finished
|
|
116
|
+
#
|
|
117
|
+
# It terminates the script, i.e. no instructions can be added
|
|
118
|
+
# after it is called
|
|
119
|
+
#
|
|
120
|
+
# @raise ArgumentError if there is already a replacement task
|
|
121
|
+
def replace_by(task, until_event = nil)
|
|
122
|
+
__carry_on(false)
|
|
123
|
+
replacement_task = validate_or_create_task(task)
|
|
124
|
+
start replacement_task
|
|
125
|
+
instructions << ReplaceBy.new(replacement_task)
|
|
126
|
+
wait(until_event || replacement_task.success_event)
|
|
127
|
+
instructions << FinalizeReplacement.new
|
|
128
|
+
emit success_event
|
|
129
|
+
terminal
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
class ResponseLocationVisitor < RGL::DFSVisitor
|
|
133
|
+
attr_reader :predicate, :selected
|
|
134
|
+
|
|
135
|
+
def initialize(graph, predicate)
|
|
136
|
+
super(graph)
|
|
137
|
+
@predicate = predicate
|
|
138
|
+
@selected = Set.new
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def handle_examine_vertex(u)
|
|
142
|
+
if predicate.call(u)
|
|
143
|
+
selected << u
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def follow_edge?(u, v)
|
|
148
|
+
if selected.include?(u)
|
|
149
|
+
false
|
|
150
|
+
else super
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def find_response_locations(origin)
|
|
156
|
+
if response_location == :origin
|
|
157
|
+
return [origin].to_set
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
predicate =
|
|
161
|
+
if response_location == :missions
|
|
162
|
+
proc { |t| t.mission? && t.running? }
|
|
163
|
+
elsif response_location == :actions
|
|
164
|
+
proc { |t| t.running? && t.planning_task && t.planning_task.kind_of?(Roby::Actions::Task) }
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
search_graph = origin.plan.
|
|
168
|
+
task_relation_graph_for(TaskStructure::Dependency).
|
|
169
|
+
reverse
|
|
170
|
+
visitor = ResponseLocationVisitor.new(search_graph, predicate)
|
|
171
|
+
search_graph.depth_first_visit(origin, visitor) {}
|
|
172
|
+
visitor.selected
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# @api private
|
|
176
|
+
#
|
|
177
|
+
# Activate this fault handler for the given exception and
|
|
178
|
+
# arguments. It creates the {FaultHandlingTask} and attaches the
|
|
179
|
+
# handler on it as an action script.
|
|
180
|
+
#
|
|
181
|
+
# @param [ExecutionException] exception
|
|
182
|
+
# @param [Hash] arguments
|
|
183
|
+
def activate(exception, arguments = Hash.new)
|
|
184
|
+
locations = find_response_locations(exception.origin)
|
|
185
|
+
if locations.empty?
|
|
186
|
+
Roby.warn "#{self} did match an exception, but the response location #{response_location} does not match anything"
|
|
187
|
+
return
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
plan = exception.origin.plan
|
|
191
|
+
|
|
192
|
+
# Create the response task
|
|
193
|
+
plan.add(response_task = FaultHandlingTask.new)
|
|
194
|
+
response_task.fault_handler = self
|
|
195
|
+
new(response_task, arguments)
|
|
196
|
+
response_task.start!
|
|
197
|
+
locations.each do |task|
|
|
198
|
+
# Mark :stop as handled by the response task and kill
|
|
199
|
+
# the task
|
|
200
|
+
#
|
|
201
|
+
# In addition, if origin == task, we need to handle the
|
|
202
|
+
# error events as well
|
|
203
|
+
task.add_error_handler response_task,
|
|
204
|
+
[task.stop_event.to_execution_exception_matcher, execution_exception_matcher].to_set
|
|
205
|
+
end
|
|
206
|
+
locations.each do |task|
|
|
207
|
+
# This should not be needed. However, the current GC
|
|
208
|
+
# implementation in ExecutionEngine does not stop at
|
|
209
|
+
# finished tasks, and therefore would not GC the
|
|
210
|
+
# underlying tasks
|
|
211
|
+
task.remove_children(Roby::TaskStructure::Dependency)
|
|
212
|
+
task.stop! if task.running?
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|