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,64 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# Definition of model-level functionality for action scripts
|
|
5
|
+
#
|
|
6
|
+
# Action scripts are sequential representations of action
|
|
7
|
+
# coordinations. Each step is a script instruction (created with one
|
|
8
|
+
# of the API calls in {Script}) whose argument is a {Task} object.
|
|
9
|
+
# The {Task} object represents the actual work that will be done
|
|
10
|
+
# there
|
|
11
|
+
#
|
|
12
|
+
# Action script models are usually created through an action
|
|
13
|
+
# interface with Interface#action_script. The script
|
|
14
|
+
# model can then be retrieved using
|
|
15
|
+
# {Actions::Models::Action#coordination_model}.
|
|
16
|
+
#
|
|
17
|
+
# @example creating an action script
|
|
18
|
+
# class Main < Roby::Actions::Interface
|
|
19
|
+
# action_script 'example_action' do
|
|
20
|
+
# # Start moving at 0.1 m/s until we move more than 0.1m
|
|
21
|
+
# move_task = task move(speed: 0.1)
|
|
22
|
+
# d_monitor = task monitor_movement_threshold(d: 0.1)
|
|
23
|
+
# d_monitor.depends_on move_task
|
|
24
|
+
# execute d_monitor
|
|
25
|
+
#
|
|
26
|
+
# # Then, once we're done with that, stand still for 20s
|
|
27
|
+
# stand_task = task move(speed: 0)
|
|
28
|
+
# t_monitor = task monitor_time_threshold(t: 20)
|
|
29
|
+
# t_monitor.depends_on stand_task
|
|
30
|
+
# execute t_monitor
|
|
31
|
+
#
|
|
32
|
+
# # Finally, announce the success
|
|
33
|
+
# emit success_event
|
|
34
|
+
# end
|
|
35
|
+
# end
|
|
36
|
+
#
|
|
37
|
+
# @example retrieving a script model from an action
|
|
38
|
+
# Main.find_action_by_name('example_action').coordination_model
|
|
39
|
+
module ActionScript
|
|
40
|
+
include Models::Actions
|
|
41
|
+
include Models::Script
|
|
42
|
+
|
|
43
|
+
def respond_to_missing?(m, include_private)
|
|
44
|
+
if m =~ /(.*)!/
|
|
45
|
+
action_interface && action_interface.find_action_by_name(m.to_s)
|
|
46
|
+
else super
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def method_missing(m, *args)
|
|
51
|
+
if m =~ /(.*)!/
|
|
52
|
+
action_name = $1
|
|
53
|
+
action = action_interface.find_action_by_name(action_name)
|
|
54
|
+
task = task(action.new(*args))
|
|
55
|
+
task.name = action_name
|
|
56
|
+
execute(task)
|
|
57
|
+
else super
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
|
|
5
|
+
# Definition of model-level functionality for action state machines
|
|
6
|
+
#
|
|
7
|
+
# In an action state machine, each state is represented by a single Roby
|
|
8
|
+
# task. At the model level, they get represented by a {Task} object, and
|
|
9
|
+
# more specifically very often by a {TaskFromAction} object. One
|
|
10
|
+
# important bit to understand is that a given Task object represents
|
|
11
|
+
# always the same state (i.e. task0 == task1 if task0 and task1
|
|
12
|
+
# represent the same state). It is for instance possible that task0 !=
|
|
13
|
+
# task1 even if task0 and task1 are issued by the same action.
|
|
14
|
+
#
|
|
15
|
+
# Transitions are stored as ({Task},{Event},{Task}) triplets, specifying
|
|
16
|
+
# the origin state, the triggering event and the target state.
|
|
17
|
+
# {Event#task} is often the same than the origin state, but not
|
|
18
|
+
# always (see below)
|
|
19
|
+
#
|
|
20
|
+
# Note that because some states are subclasses of
|
|
21
|
+
# {TaskWithDependencies}, it is possible that some {Task} objects
|
|
22
|
+
# are not states, only tasks that are dependencies of other states
|
|
23
|
+
# created with {TaskWithDependencies#depends_on} or dependencies of
|
|
24
|
+
# the state machine itself created with {Actions#depends_on}. The events
|
|
25
|
+
# of these task objects can be used in transitions
|
|
26
|
+
#
|
|
27
|
+
# Action state machine models are usually created through an action
|
|
28
|
+
# interface with Interface#action_state_machine. The state machine
|
|
29
|
+
# model can then be retrieved using
|
|
30
|
+
# {Actions::Models::Action#coordination_model}.
|
|
31
|
+
#
|
|
32
|
+
# @example creating an action state machine model
|
|
33
|
+
# class Main < Roby::Actions::Interface
|
|
34
|
+
# action_state_machine 'example_action' do
|
|
35
|
+
# move = state move(speed: 0.1)
|
|
36
|
+
# stand = state move(speed: 0)
|
|
37
|
+
# # This monitor triggers each time the system moves more than
|
|
38
|
+
# # 0.1 meters
|
|
39
|
+
# d_monitor = task monitor_movement_threshold(d: 0.1)
|
|
40
|
+
# # This monitor triggers after 20 seconds
|
|
41
|
+
# t_monitor = task monitor_time_threshold(t: 20)
|
|
42
|
+
# # Make the distance monitor run in the move state
|
|
43
|
+
# move.depends_on d_monitor
|
|
44
|
+
# # Make the time monitor run in the stand state
|
|
45
|
+
# stand.depends_on t_monitor
|
|
46
|
+
# start move
|
|
47
|
+
# transition move, d_monitor.success_event, stand
|
|
48
|
+
# transition stand, t_monitor.success_event, move
|
|
49
|
+
# end
|
|
50
|
+
# end
|
|
51
|
+
#
|
|
52
|
+
# @example retrieving a state machine model from an action
|
|
53
|
+
# Main.find_action_by_name('example_action').coordination_model
|
|
54
|
+
module ActionStateMachine
|
|
55
|
+
include Actions
|
|
56
|
+
|
|
57
|
+
# The starting state
|
|
58
|
+
# @return [Task]
|
|
59
|
+
attr_reader :starting_state
|
|
60
|
+
|
|
61
|
+
# The set of defined transitions
|
|
62
|
+
#
|
|
63
|
+
# @return [Array<(Task,Event,Task)>]
|
|
64
|
+
inherited_attribute(:transition, :transitions) { Array.new }
|
|
65
|
+
|
|
66
|
+
# (see Actions#toplevel_state?)
|
|
67
|
+
def toplevel_state?(state)
|
|
68
|
+
root == state ||
|
|
69
|
+
starting_state == state ||
|
|
70
|
+
transitions.any? { |from_state, _, to_state| from_state == state || to_state == state }
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @see (Base#map_task)
|
|
74
|
+
def map_tasks(mapping)
|
|
75
|
+
super
|
|
76
|
+
|
|
77
|
+
@starting_state = mapping[starting_state]
|
|
78
|
+
@transitions = transitions.map do |state, event, new_state|
|
|
79
|
+
[mapping[state],
|
|
80
|
+
mapping[event.task].find_event(event.symbol),
|
|
81
|
+
mapping[new_state]]
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def parse_names
|
|
86
|
+
super(Task => '_state', Capture => "")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Declares the starting state
|
|
90
|
+
def start(state)
|
|
91
|
+
parse_names
|
|
92
|
+
@starting_state = validate_task(state)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def state(object, task_model = Roby::Task)
|
|
96
|
+
task(object, task_model)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Capture the value of an event context
|
|
100
|
+
#
|
|
101
|
+
# The value returned by #capture is meant to be used as arguments to
|
|
102
|
+
# other states. This is a mechanism to pass information from one
|
|
103
|
+
# state to the next.
|
|
104
|
+
#
|
|
105
|
+
# @example determine the current heading and servo on it
|
|
106
|
+
# measure_heading = state(self.measure_heading)
|
|
107
|
+
# start(measure_heading)
|
|
108
|
+
# current_heading = capture(measure_heading.success_event)
|
|
109
|
+
# transition measure_heading.success_event, keep_heading(heading: current_heading)
|
|
110
|
+
#
|
|
111
|
+
def capture(state, event = nil, &block)
|
|
112
|
+
if !event
|
|
113
|
+
state, event = state.task, state
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
if !toplevel_state?(state)
|
|
117
|
+
raise ArgumentError, "#{state} is not a toplevel state, a capture's state must be toplevel"
|
|
118
|
+
elsif !event_active_in_state?(event, state)
|
|
119
|
+
raise ArgumentError, "#{event} is not an event that is active in state #{state}"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
filter =
|
|
123
|
+
if block
|
|
124
|
+
lambda(&block)
|
|
125
|
+
else
|
|
126
|
+
lambda { |event| event.context.first }
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
capture = Capture.new(filter)
|
|
130
|
+
captures[capture] = [state, event]
|
|
131
|
+
capture
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Returns the state for the given name, if found, nil otherwise
|
|
135
|
+
#
|
|
136
|
+
# @return Roby::Coordination::Models::TaskFromAction
|
|
137
|
+
def find_state_by_name(name) find_task_by_name("#{name}_state") end
|
|
138
|
+
|
|
139
|
+
def validate_task(object) if
|
|
140
|
+
!object.kind_of?(Coordination::Models::Task)
|
|
141
|
+
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"
|
|
142
|
+
end
|
|
143
|
+
object
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# Computes the set of states that are used in the transitions but
|
|
147
|
+
# are actually not reachable
|
|
148
|
+
#
|
|
149
|
+
# @return [Array<Task>]
|
|
150
|
+
def compute_unreachable_states
|
|
151
|
+
queue = [starting_state].to_set
|
|
152
|
+
transitions = self.each_transition.to_a.dup
|
|
153
|
+
|
|
154
|
+
done_something = true
|
|
155
|
+
while done_something
|
|
156
|
+
done_something = false
|
|
157
|
+
transitions.delete_if do |from, _, to|
|
|
158
|
+
if queue.include?(from)
|
|
159
|
+
queue << to
|
|
160
|
+
done_something = true
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
transitions.map(&:first).to_set
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Overloaded from Actions to validate the state machine definition
|
|
169
|
+
#
|
|
170
|
+
# @raise [UnreachableStateUsed] if some transitions are using events
|
|
171
|
+
# from states that cannot be reached from the start state
|
|
172
|
+
def parse(&block)
|
|
173
|
+
super
|
|
174
|
+
|
|
175
|
+
if !starting_state
|
|
176
|
+
raise ArgumentError, "no starting state defined"
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Validate that all source states in transitions are reachable
|
|
180
|
+
# from the start state
|
|
181
|
+
unreachable = compute_unreachable_states
|
|
182
|
+
if !unreachable.empty?
|
|
183
|
+
raise UnreachableStateUsed.new(unreachable), "#{unreachable.size} states are used in transitions but are actually not reachable"
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Declares a transition from a state to a new state, caused by an
|
|
188
|
+
# event
|
|
189
|
+
#
|
|
190
|
+
# @overload transition(state.my_event, new_state)
|
|
191
|
+
# declares that once the 'my' event on the given state is emitted,
|
|
192
|
+
# we should transition to new_state
|
|
193
|
+
# @overload transition(state, event, new_state)
|
|
194
|
+
# declares that, while in state 'state', transition to 'new_state'
|
|
195
|
+
# if the given event is emitted
|
|
196
|
+
#
|
|
197
|
+
def transition(*spec)
|
|
198
|
+
parse_names
|
|
199
|
+
|
|
200
|
+
if spec.size == 2
|
|
201
|
+
state_event, new_state = *spec
|
|
202
|
+
transition(state_event.task, state_event, new_state)
|
|
203
|
+
elsif spec.size != 3
|
|
204
|
+
raise ArgumentError, "expected 2 or 3 arguments, got #{spec.size}"
|
|
205
|
+
else
|
|
206
|
+
state, state_event, new_state = *spec
|
|
207
|
+
validate_task(state)
|
|
208
|
+
validate_task(new_state)
|
|
209
|
+
if !event_active_in_state?(state_event, state)
|
|
210
|
+
raise EventNotActiveInState, "cannot transition on #{state_event} while in state #{state} as the event is not active in this state"
|
|
211
|
+
end
|
|
212
|
+
transitions << [state, state_event, new_state]
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def to_s
|
|
217
|
+
"#{action_interface}.#{name}"
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Coordination
|
|
3
|
+
module Models
|
|
4
|
+
# Metamodel for Coordination::Actions
|
|
5
|
+
module Actions
|
|
6
|
+
include Base
|
|
7
|
+
|
|
8
|
+
attribute(:captures) { Hash.new }
|
|
9
|
+
|
|
10
|
+
# The action interface model this state machine model is defined on
|
|
11
|
+
# @return [Actions::Models::Interface,Actions::Models::Library]
|
|
12
|
+
attr_accessor :action_interface
|
|
13
|
+
|
|
14
|
+
# Create a new coordination model based on a different action
|
|
15
|
+
# interface
|
|
16
|
+
def rebind(action_interface)
|
|
17
|
+
m = dup
|
|
18
|
+
m.action_interface = action_interface
|
|
19
|
+
|
|
20
|
+
task_mapping = Hash.new
|
|
21
|
+
task_mapping[root] = root.rebind(m)
|
|
22
|
+
tasks.each do |task|
|
|
23
|
+
task_mapping[task] = task.rebind(m)
|
|
24
|
+
end
|
|
25
|
+
m.map_tasks(task_mapping)
|
|
26
|
+
m
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# (see Base#map_tasks)
|
|
30
|
+
def map_tasks(mapping)
|
|
31
|
+
super
|
|
32
|
+
|
|
33
|
+
@forwards = forwards.map do |state, event, target_event|
|
|
34
|
+
state = mapping[state]
|
|
35
|
+
event = mapping[event.task].find_event(event.symbol)
|
|
36
|
+
target_event = mapping[target_event.task].find_event(target_event.symbol)
|
|
37
|
+
[state, event, target_event]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
@dependencies = dependencies.map do |task, role|
|
|
41
|
+
[mapping[task], role]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
@captures = captures.map_value do |capture, (state, event)|
|
|
45
|
+
[mapping[state], mapping[event.task].find_event(event.symbol)]
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# The set of defined forwards
|
|
50
|
+
#
|
|
51
|
+
# @return [Array<(Task,Event,Event)>]
|
|
52
|
+
inherited_attribute(:forward, :forwards) { Array.new }
|
|
53
|
+
|
|
54
|
+
# A set of tasks that should always be active when self is active
|
|
55
|
+
#
|
|
56
|
+
# @return [Set<Task>]
|
|
57
|
+
inherited_attribute(:dependency, :dependencies) { Set.new }
|
|
58
|
+
|
|
59
|
+
# A list of variables that allow to capture event contexts
|
|
60
|
+
inherited_attribute(:capture, :captures) { Hash.new }
|
|
61
|
+
|
|
62
|
+
# Creates a new state machine model as a submodel of self
|
|
63
|
+
#
|
|
64
|
+
# @param [Model<Coordination::Actions>] submodel the submodel that
|
|
65
|
+
# is being setup
|
|
66
|
+
# @option options [Model<Actions::Interface>] :action_interface the action
|
|
67
|
+
# interface model on which this state machine is defined
|
|
68
|
+
# @option options [Model<Roby::Task>] :root the task model that is
|
|
69
|
+
# going to be used as a toplevel task for the state machine
|
|
70
|
+
def setup_submodel(submodel, action_interface: nil, **super_options)
|
|
71
|
+
super(submodel, **super_options)
|
|
72
|
+
submodel.action_interface = action_interface
|
|
73
|
+
submodel
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Declares that the given event on the root task of the state should
|
|
77
|
+
# be forwarded to an event on this task
|
|
78
|
+
#
|
|
79
|
+
# @overload forward(state.my_event, target_event)
|
|
80
|
+
# declares that, while in state 'state', forward 'my_event' to the
|
|
81
|
+
# given event name on the state machine task
|
|
82
|
+
# @overload forward(state, event, target_event)
|
|
83
|
+
# declares that, while in state 'state', forward 'event' to the
|
|
84
|
+
# given event name on the state machine task
|
|
85
|
+
#
|
|
86
|
+
def forward(*spec)
|
|
87
|
+
if spec.size == 2
|
|
88
|
+
state_event, target_event = *spec
|
|
89
|
+
forward(state_event.task, state_event, target_event)
|
|
90
|
+
elsif spec.size != 3
|
|
91
|
+
raise ArgumentError, "expected 2 or 3 arguments, got #{spec.size}"
|
|
92
|
+
else
|
|
93
|
+
state, event, target_event = *spec
|
|
94
|
+
if !toplevel_state?(state)
|
|
95
|
+
raise NotToplevelState, "cannot specify #{state} as the state to forward from as it is not a toplevel state"
|
|
96
|
+
elsif !event_active_in_state?(event, state)
|
|
97
|
+
raise EventNotActiveInState, "cannot forward from #{event} while in state #{state} as the event is not active in this state"
|
|
98
|
+
elsif !root_event?(target_event)
|
|
99
|
+
raise NotRootEvent, "can only forward to a root event"
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
forwards << [state, event, target_event]
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# @api private
|
|
107
|
+
#
|
|
108
|
+
# Raise if the given state is not a toplevel state
|
|
109
|
+
def toplevel_state?(state)
|
|
110
|
+
true
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# @api private
|
|
114
|
+
#
|
|
115
|
+
# Raise if an event is not "active" while in a particular state
|
|
116
|
+
def event_active_in_state?(event, state)
|
|
117
|
+
event.task == root ||
|
|
118
|
+
required_tasks_for(state).has_key?(event.task)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# @api private
|
|
122
|
+
#
|
|
123
|
+
# Raises if the event is not an event of the root task
|
|
124
|
+
def root_event?(event)
|
|
125
|
+
event.task == root
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Adds a toplevel dependency
|
|
129
|
+
#
|
|
130
|
+
# This declares that the given task should always run while self is
|
|
131
|
+
# running
|
|
132
|
+
#
|
|
133
|
+
# @param [Task] task
|
|
134
|
+
# @return [Task] the task itself
|
|
135
|
+
def depends_on(task, role: nil)
|
|
136
|
+
task = validate_task(task)
|
|
137
|
+
dependencies << [task, role]
|
|
138
|
+
task
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Returns the set of actions that should be active when the given
|
|
142
|
+
# task is active, as a mapping from the {Task} object to the roles
|
|
143
|
+
# that this object has (as "dependency roles")
|
|
144
|
+
#
|
|
145
|
+
# It includes task itself, as task should run when it is active
|
|
146
|
+
# @return [{Task=>Set<String>}]
|
|
147
|
+
def required_tasks_for(task)
|
|
148
|
+
result = Hash.new
|
|
149
|
+
task.dependencies.each do |action, role|
|
|
150
|
+
result[action] ||= Set.new
|
|
151
|
+
result[action] << role if role
|
|
152
|
+
end
|
|
153
|
+
each_dependency do |action, role|
|
|
154
|
+
result[action] ||= Set.new
|
|
155
|
+
result[action] << role if role
|
|
156
|
+
end
|
|
157
|
+
result[task] ||= Set.new
|
|
158
|
+
result[task] << 'current_task'
|
|
159
|
+
result
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Helper to build delayed arguments
|
|
163
|
+
def from(object)
|
|
164
|
+
Roby::Task.from(object)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Helper to build delayed arguments
|
|
168
|
+
def from_state(state_object = State)
|
|
169
|
+
Roby::Task.from_state(state_object)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Evaluates a state machine definition block
|
|
173
|
+
def parse(&block)
|
|
174
|
+
class_eval(&block)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def respond_to_missing?(m, include_private)
|
|
178
|
+
(action_interface && action_interface.find_action_by_name(m.to_s)) || super
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def method_missing(m, *args)
|
|
182
|
+
if action = action_interface.find_action_by_name(m.to_s)
|
|
183
|
+
action.new(*args)
|
|
184
|
+
else return super
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|