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,22 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Actions
|
|
3
|
+
module Models
|
|
4
|
+
module Interface
|
|
5
|
+
include Models::InterfaceBase
|
|
6
|
+
include MetaRuby::ModelAsClass
|
|
7
|
+
|
|
8
|
+
# @api private
|
|
9
|
+
#
|
|
10
|
+
# Internal handler for MetaRuby's inherited-attribute functionality.
|
|
11
|
+
# It updates an action from a parent model to match this model.
|
|
12
|
+
#
|
|
13
|
+
# In particular, it updates coordination models to point to actions
|
|
14
|
+
# of this
|
|
15
|
+
def promote_registered_action(name, action)
|
|
16
|
+
actions[name] ||= action.rebind(self)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Actions
|
|
3
|
+
module Models
|
|
4
|
+
module InterfaceBase
|
|
5
|
+
# IMPORTANT: ModelAsClass / ModelAsModule must NOT be included here.
|
|
6
|
+
# This interface model is used by both Interface (which is a
|
|
7
|
+
# ModelAsClass) and Library (which is a ModelAsModule)
|
|
8
|
+
extend MetaRuby::Attributes
|
|
9
|
+
|
|
10
|
+
# @api private
|
|
11
|
+
#
|
|
12
|
+
# Internal handler for MetaRuby's inherited-attribute functionality.
|
|
13
|
+
# This method does nothing, it's here so that the registered_action
|
|
14
|
+
# attribute gets promotion enabled. It's overloaded in Interface to
|
|
15
|
+
# actually rebind the action to the interface
|
|
16
|
+
def promote_registered_action(name, action)
|
|
17
|
+
action
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# The set of actions defined on this interface
|
|
21
|
+
#
|
|
22
|
+
# @return [Hash<String,Models::Action>]
|
|
23
|
+
# @key_name action_name
|
|
24
|
+
inherited_attribute(:registered_action, :actions, map: true) { Hash.new }
|
|
25
|
+
|
|
26
|
+
# The set of fault response tables added to this action interface
|
|
27
|
+
# @return [Array<Model<FaultResponseTable>>]
|
|
28
|
+
inherited_attribute(:fault_response_table, :fault_response_tables) { Array.new }
|
|
29
|
+
|
|
30
|
+
# Exception raised when an action is defined with the wrong count of
|
|
31
|
+
# argument (zero if no arguments are specified and one if arguments
|
|
32
|
+
# are specified)
|
|
33
|
+
class ArgumentCountMismatch < ScriptError; end
|
|
34
|
+
|
|
35
|
+
# Adds all actions defined in another action interface or in an
|
|
36
|
+
# action library in this interface
|
|
37
|
+
#
|
|
38
|
+
# @param [Module,Interface]
|
|
39
|
+
# @return [void]
|
|
40
|
+
def use_library(library)
|
|
41
|
+
if library <= Actions::Interface
|
|
42
|
+
library.each_registered_action do |name, action|
|
|
43
|
+
actions[name] ||= action
|
|
44
|
+
end
|
|
45
|
+
library.each_fault_response_table do |table|
|
|
46
|
+
use_fault_response_table table
|
|
47
|
+
end
|
|
48
|
+
else
|
|
49
|
+
include library
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Enumerates the actions registered on this interface
|
|
54
|
+
#
|
|
55
|
+
# @yieldparam [Models::Action] action
|
|
56
|
+
def each_action
|
|
57
|
+
return enum_for(:each_action) if !block_given?
|
|
58
|
+
each_registered_action do |_, description|
|
|
59
|
+
yield(description)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Clears everything stored on this model
|
|
64
|
+
def clear_model
|
|
65
|
+
super
|
|
66
|
+
actions.clear
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Create a new action description that is going to be used to
|
|
70
|
+
# describe the next method. Note that only methods that have a
|
|
71
|
+
# description are exported as actions
|
|
72
|
+
#
|
|
73
|
+
# @return Action
|
|
74
|
+
def describe(doc = nil)
|
|
75
|
+
if @current_description
|
|
76
|
+
Actions::Interface.warn "the last #describe call was not followed by an action definition. Did you forget to add a method to your action interface ?"
|
|
77
|
+
end
|
|
78
|
+
@current_description = Models::Action.new(doc)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Registers a new action on this model
|
|
82
|
+
#
|
|
83
|
+
# If no specific return type has been specified, one is created
|
|
84
|
+
# automatically and registered as a constant on this action
|
|
85
|
+
# interface. For instance, the start_all_devices action would create
|
|
86
|
+
# a simple StartAllDevices task model.
|
|
87
|
+
def register_action(name, action_model)
|
|
88
|
+
name = name.to_s
|
|
89
|
+
create_default_action_return_type(name, action_model)
|
|
90
|
+
action_model.name = name
|
|
91
|
+
actions[action_model.name] = action_model
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# @api private
|
|
95
|
+
#
|
|
96
|
+
# Create and register the default task model for a given action
|
|
97
|
+
# model if needed (i.e. if the action model does not have an
|
|
98
|
+
# explicit return type yet)
|
|
99
|
+
def create_default_action_return_type(name, action_model)
|
|
100
|
+
return if action_model.returned_type != Roby::Task
|
|
101
|
+
|
|
102
|
+
task_model_name = name.camelcase(:upper)
|
|
103
|
+
if const_defined_here?(task_model_name)
|
|
104
|
+
action_model.returns(const_get(task_model_name))
|
|
105
|
+
else
|
|
106
|
+
task_model = Roby::Task.new_submodel do
|
|
107
|
+
terminates
|
|
108
|
+
end
|
|
109
|
+
const_set task_model_name, task_model
|
|
110
|
+
task_model.permanent_model = self.permanent_model?
|
|
111
|
+
action_model.returns(task_model)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
# Hook used to export methods for which there is a description
|
|
117
|
+
def method_added(method_name)
|
|
118
|
+
super
|
|
119
|
+
if @current_description
|
|
120
|
+
name = method_name.to_s
|
|
121
|
+
description, @current_description = @current_description, nil
|
|
122
|
+
description = MethodAction.new(self, description)
|
|
123
|
+
|
|
124
|
+
if existing = find_action_by_name(name)
|
|
125
|
+
if description.returned_type == Roby::Task
|
|
126
|
+
description.returns(existing.returned_type)
|
|
127
|
+
end
|
|
128
|
+
description.overloads(existing)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
expected_argument_count =
|
|
132
|
+
if description.arguments.empty? then 0
|
|
133
|
+
else 1
|
|
134
|
+
end
|
|
135
|
+
begin
|
|
136
|
+
check_arity(instance_method(name), expected_argument_count)
|
|
137
|
+
rescue ArgumentError => e
|
|
138
|
+
if expected_argument_count == 0
|
|
139
|
+
raise ArgumentCountMismatch, "action #{name} has been declared to have no arguments, the #{name} method must be callable without any arguments"
|
|
140
|
+
else
|
|
141
|
+
raise ArgumentCountMismatch, "action #{name} has been declared to have arguments, the #{name} method must be callable with a single Hash argument"
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
register_action(name, description)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Returns the action description for the given action name, or nil
|
|
149
|
+
# if there are none with that name
|
|
150
|
+
#
|
|
151
|
+
# @param [String] name
|
|
152
|
+
# @return [Models::Action,nil]
|
|
153
|
+
def find_action_by_name(name)
|
|
154
|
+
find_registered_action(name.to_s)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Returns all the action description for the actions that can
|
|
158
|
+
# produce such a task
|
|
159
|
+
#
|
|
160
|
+
# @param [Roby::Task,Roby::TaskService] type
|
|
161
|
+
# @return [Array<Models::Action>]
|
|
162
|
+
def find_all_actions_by_type(type)
|
|
163
|
+
result = []
|
|
164
|
+
each_action do |description|
|
|
165
|
+
if description.returned_type.fullfills?(type)
|
|
166
|
+
result << description
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
result
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# @api private
|
|
173
|
+
#
|
|
174
|
+
# Verifies that #describe was called to describe an action that is
|
|
175
|
+
# now being defined, and returns it
|
|
176
|
+
#
|
|
177
|
+
# The current description is nil after this call
|
|
178
|
+
#
|
|
179
|
+
# @raise [ArgumentError] if describe was not called
|
|
180
|
+
def require_current_description
|
|
181
|
+
action_model, @current_description = @current_description, nil
|
|
182
|
+
if action_model
|
|
183
|
+
action_model
|
|
184
|
+
else
|
|
185
|
+
raise ArgumentError, "you must describe the action with #describe before calling #action_coordination"
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def create_and_register_coordination_action(name, coordination_class, action_model: require_current_description, &block)
|
|
190
|
+
name = name.to_s
|
|
191
|
+
create_default_action_return_type(name, action_model)
|
|
192
|
+
action_model, coordination_model =
|
|
193
|
+
create_coordination_action(action_model, coordination_class, &block)
|
|
194
|
+
register_action(name, action_model)
|
|
195
|
+
coordination_model.name = name
|
|
196
|
+
|
|
197
|
+
define_method(name) do |**arguments|
|
|
198
|
+
action_model.instanciate(plan, **arguments)
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
return action_model, coordination_model
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def create_coordination_model(action_model, coordination_class, &block)
|
|
205
|
+
root_m = action_model.returned_type
|
|
206
|
+
coordination_model = coordination_class.
|
|
207
|
+
new_submodel(action_interface: self, root: root_m)
|
|
208
|
+
|
|
209
|
+
action_model.arguments.each do |arg|
|
|
210
|
+
if !arg.required
|
|
211
|
+
coordination_model.argument arg.name, default: arg.default
|
|
212
|
+
else
|
|
213
|
+
coordination_model.argument arg.name
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
coordination_model.parse(&block)
|
|
217
|
+
coordination_model
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Helper method for {#action_state_machine} and {#action_script}
|
|
221
|
+
def create_coordination_action(action_model, coordination_class, &block)
|
|
222
|
+
coordination_model = create_coordination_model(action_model, coordination_class, &block)
|
|
223
|
+
action_model = CoordinationAction.new(coordination_model, action_model)
|
|
224
|
+
return action_model, coordination_model
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# Defines an action from an
|
|
228
|
+
# {Coordination::Models::ActionStateMachine}
|
|
229
|
+
#
|
|
230
|
+
# @param [String] name the name of the new action
|
|
231
|
+
# @yield the action state machine definition
|
|
232
|
+
# @return [Action,Coordination::Models::ActionStateMachine]
|
|
233
|
+
#
|
|
234
|
+
# The action state machine model can later be retrieved using
|
|
235
|
+
# {Action#coordination_model}
|
|
236
|
+
#
|
|
237
|
+
# @example (see Coordination::Models::ActionStateMachine)
|
|
238
|
+
def action_state_machine(name, &block)
|
|
239
|
+
action_model = require_current_description
|
|
240
|
+
|
|
241
|
+
# Define user-possible starting states, this will override the default starting state
|
|
242
|
+
if action_model.has_arg?("start_state")
|
|
243
|
+
raise ArgumentError, "A argument \"start_state\" has defined for the statemachine, but this keyword is reserved"
|
|
244
|
+
end
|
|
245
|
+
action_model.optional_arg("start_state", "name of the state in which the state machine should start", nil)
|
|
246
|
+
create_and_register_coordination_action(name, Coordination::ActionStateMachine, action_model: action_model, &block)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# @deprecated use {#action_state_machine} instead
|
|
250
|
+
def state_machine(name, &block)
|
|
251
|
+
action_state_machine(name, &block)
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# Defines an action from an
|
|
255
|
+
# {Coordination::Models::ActionScript}
|
|
256
|
+
#
|
|
257
|
+
# @param [String] name the name of the new action
|
|
258
|
+
# @yield the action script definition
|
|
259
|
+
# @return [Action,Coordination::Models::ActionScript]
|
|
260
|
+
#
|
|
261
|
+
# The action script model can later be retrieved using
|
|
262
|
+
# {Action#coordination_model}
|
|
263
|
+
def action_script(name, options = Hash.new, &block)
|
|
264
|
+
create_and_register_coordination_action(name, Coordination::ActionScript, &block)
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def respond_to_missing?(m, include_private)
|
|
268
|
+
find_action_by_name(m.to_s) || super
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
# Returns an action description if 'm' is the name of a known action
|
|
272
|
+
#
|
|
273
|
+
# @return [Action]
|
|
274
|
+
def method_missing(m, *args)
|
|
275
|
+
if model = find_action_by_name(m.to_s)
|
|
276
|
+
if args.size > 1
|
|
277
|
+
raise ArgumentError, "expected zero or one argument, got #{args.size}"
|
|
278
|
+
end
|
|
279
|
+
return model.new(*args)
|
|
280
|
+
end
|
|
281
|
+
super
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
# Declare that this fault response table should be used on all plans
|
|
285
|
+
# that are going to use this action interface
|
|
286
|
+
def use_fault_response_table(table_model, arguments = Hash.new)
|
|
287
|
+
table_model.validate_arguments(arguments)
|
|
288
|
+
fault_response_tables << [table_model, arguments]
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Actions
|
|
3
|
+
module Models
|
|
4
|
+
# Action defined by a method on an {Interface}
|
|
5
|
+
class MethodAction < Action
|
|
6
|
+
# The action interface on which this action is defined
|
|
7
|
+
attr_accessor :action_interface_model
|
|
8
|
+
|
|
9
|
+
def initialize(action_interface_model, doc = nil)
|
|
10
|
+
super(doc)
|
|
11
|
+
@action_interface_model = action_interface_model
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def to_s
|
|
15
|
+
"#{super} of #{action_interface_model}"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def ==(other)
|
|
19
|
+
other.kind_of?(self.class) &&
|
|
20
|
+
other.action_interface_model == action_interface_model &&
|
|
21
|
+
other.name == name
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Instanciate this action on the given plan
|
|
25
|
+
def instanciate(plan, arguments = Hash.new)
|
|
26
|
+
action_interface = action_interface_model.new(plan)
|
|
27
|
+
|
|
28
|
+
if self.arguments.empty?
|
|
29
|
+
if !arguments.empty?
|
|
30
|
+
raise ArgumentError, "#{name} expects no arguments, but #{arguments.size} are given"
|
|
31
|
+
end
|
|
32
|
+
result = action_interface.send(name).as_plan
|
|
33
|
+
else
|
|
34
|
+
default_arguments = self.arguments.inject(Hash.new) do |h, arg|
|
|
35
|
+
h[arg.name] = arg.default
|
|
36
|
+
h
|
|
37
|
+
end
|
|
38
|
+
arguments = Kernel.validate_options arguments, default_arguments
|
|
39
|
+
self.arguments.each do |arg|
|
|
40
|
+
if arg.required && !arguments.has_key?(arg.name.to_sym)
|
|
41
|
+
raise ArgumentError, "required argument #{arg.name} not given to #{name}"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
result = action_interface.send(name, arguments).as_plan
|
|
45
|
+
end
|
|
46
|
+
# Make the planning task inherit the model/argument flags
|
|
47
|
+
if planning_task = result.planning_task
|
|
48
|
+
if planning_task.respond_to?(:action_model=)
|
|
49
|
+
planning_task.action_model ||= self
|
|
50
|
+
end
|
|
51
|
+
if planning_task.respond_to?(:action_arguments=)
|
|
52
|
+
result.planning_task.action_arguments ||= arguments
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
result
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Create a new action model that is bound to a different interface model
|
|
59
|
+
#
|
|
60
|
+
# @param [Models::Interface] action_interface_model the new model
|
|
61
|
+
# @param [Boolean] force the rebind will happen only if the new
|
|
62
|
+
# interface model is a submodel of the current one. If force is
|
|
63
|
+
# true, it will be done regardless.
|
|
64
|
+
# @return [Action] the rebound action model
|
|
65
|
+
def rebind(action_interface_model)
|
|
66
|
+
rebound = dup
|
|
67
|
+
if action_interface_model <= self.action_interface_model
|
|
68
|
+
rebound.action_interface_model = action_interface_model
|
|
69
|
+
end
|
|
70
|
+
rebound
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Returns the plan pattern that will deploy this action on the plan
|
|
74
|
+
def plan_pattern(arguments = Hash.new)
|
|
75
|
+
job_id, arguments = Kernel.filter_options arguments, :job_id
|
|
76
|
+
|
|
77
|
+
planner = Roby::Actions::Task.new(
|
|
78
|
+
Hash[action_model: self,
|
|
79
|
+
action_arguments: arguments].merge(job_id))
|
|
80
|
+
planner.planning_result_task
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def to_s
|
|
84
|
+
"#{action_interface_model.name}.#{name}"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Actions
|
|
3
|
+
# A task that calls an action interface to generate a plan
|
|
4
|
+
class Task < Roby::Task
|
|
5
|
+
terminates
|
|
6
|
+
|
|
7
|
+
provides Roby::Interface::Job
|
|
8
|
+
|
|
9
|
+
# Once the task has been started, this is the transaction object that
|
|
10
|
+
# is being used / has been used to generate before committing in the
|
|
11
|
+
# plan
|
|
12
|
+
# @return [Transaction]
|
|
13
|
+
attr_reader :transaction
|
|
14
|
+
|
|
15
|
+
# The action itself
|
|
16
|
+
# @return [Models::Action]
|
|
17
|
+
argument :action_model
|
|
18
|
+
# The arguments for the action method
|
|
19
|
+
# @return [Hash]
|
|
20
|
+
argument :action_arguments, default: Hash.new
|
|
21
|
+
|
|
22
|
+
# The model of the roby task that is going to represent the action
|
|
23
|
+
# in the plan
|
|
24
|
+
# @return [Model<Roby::Task>]
|
|
25
|
+
def planned_model
|
|
26
|
+
action_model.returned_task_type
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# The action interface model used by this planner
|
|
30
|
+
# @return [Model<Interface>]
|
|
31
|
+
def action_interface_model
|
|
32
|
+
action_model.action_interface_model
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def job_name
|
|
36
|
+
formatted_arguments = (action_arguments || Hash.new).map do |k, v|
|
|
37
|
+
"#{k} => #{v}"
|
|
38
|
+
end.join(", ")
|
|
39
|
+
"#{action_model}(#{formatted_arguments})"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def to_s
|
|
43
|
+
if action_model
|
|
44
|
+
"#{super}[#{action_interface_model}:#{action_model}](#{action_arguments}) -> #{action_model.returned_type}"
|
|
45
|
+
else "#{super}"
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def planning_result_task
|
|
50
|
+
if success? || result
|
|
51
|
+
result
|
|
52
|
+
elsif task = planned_tasks.find { true }
|
|
53
|
+
task
|
|
54
|
+
elsif pending?
|
|
55
|
+
task = planned_model.new
|
|
56
|
+
task.planned_by self
|
|
57
|
+
task.abstract = true
|
|
58
|
+
task
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# The transaction in which we build the new plan. It gets committed on
|
|
63
|
+
# success.
|
|
64
|
+
attr_reader :transaction
|
|
65
|
+
# The planner result. It is either an exception or a task object
|
|
66
|
+
attr_reader :result
|
|
67
|
+
|
|
68
|
+
# Starts planning
|
|
69
|
+
event :start do |context|
|
|
70
|
+
if owners.size > 1
|
|
71
|
+
@transaction = Distributed::Transaction.new(plan)
|
|
72
|
+
owners.each do |peer|
|
|
73
|
+
transaction.add_owner peer
|
|
74
|
+
end
|
|
75
|
+
else
|
|
76
|
+
@transaction = Transaction.new(plan)
|
|
77
|
+
end
|
|
78
|
+
start_event.emit
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
poll do
|
|
82
|
+
result_task = action_model.instanciate(transaction, action_arguments)
|
|
83
|
+
|
|
84
|
+
# Don't replace the planning task with ourselves if the
|
|
85
|
+
# transaction specifies another planning task
|
|
86
|
+
if new_planning_task = result_task.planning_task
|
|
87
|
+
if !new_planning_task.arguments.set?(:job_id)
|
|
88
|
+
new_planning_task.job_id = job_id
|
|
89
|
+
end
|
|
90
|
+
else
|
|
91
|
+
result_task.planned_by transaction[self]
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
if placeholder = planning_result_task
|
|
95
|
+
placeholder = transaction[placeholder]
|
|
96
|
+
transaction.replace(placeholder, result_task)
|
|
97
|
+
placeholder.remove_planning_task transaction[self]
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# If the transaction is distributed, and is not proposed to all
|
|
101
|
+
# owners, do it
|
|
102
|
+
transaction.propose
|
|
103
|
+
transaction.commit_transaction
|
|
104
|
+
@result = result_task
|
|
105
|
+
success_event.emit
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
on :failed do |event|
|
|
109
|
+
transaction.discard_transaction
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|