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
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
module Roby::TaskStructure
|
|
2
|
-
# This module defines model-level definition of execution agent, for
|
|
3
|
-
# instance to Roby::Task
|
|
4
|
-
module ModelLevelExecutionAgent
|
|
5
|
-
# The model of execution agent for this class
|
|
6
|
-
def execution_agent
|
|
7
|
-
for klass in ancestors
|
|
8
|
-
if klass.instance_variable_defined?(:@execution_agent)
|
|
9
|
-
return klass.instance_variable_get(:@execution_agent)
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
nil
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Defines a model of execution agent. Doing
|
|
16
|
-
#
|
|
17
|
-
# TaskModel.executed_by ExecutionAgentModel
|
|
18
|
-
#
|
|
19
|
-
# is equivalent to
|
|
20
|
-
#
|
|
21
|
-
# task = TaskModel.new
|
|
22
|
-
# exec = <find a suitable ExecutionAgentModel instance in the plan or
|
|
23
|
-
# create a new one>
|
|
24
|
-
# task.executed_by exec
|
|
25
|
-
#
|
|
26
|
-
# for all instances of TaskModel. The actual job is done in the
|
|
27
|
-
# ExecutionAgentSpawn module
|
|
28
|
-
def executed_by(agent_model, arguments = Hash.new)
|
|
29
|
-
@execution_agent = [agent_model, arguments]
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# The execution_agent defines an agent (process or otherwise) a given
|
|
34
|
-
# task is executed by. It allows to define a class of these execution agent,
|
|
35
|
-
# so that the specific agents are managed externally (load-balancing, ...)
|
|
36
|
-
relation :ExecutionAgent, :parent_name => :executed_task, :child_name => :execution_agent,
|
|
37
|
-
:noinfo => true, :distribute => false, :single_child => true do
|
|
38
|
-
|
|
39
|
-
# When ExecutionAgent support is included in a model (for instance Roby::Task), add
|
|
40
|
-
# the model-level classes
|
|
41
|
-
def self.included(klass) # :nodoc:
|
|
42
|
-
klass.extend Roby::TaskStructure::ModelLevelExecutionAgent
|
|
43
|
-
super
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Defines a new execution agent for this task.
|
|
47
|
-
def executed_by(agent)
|
|
48
|
-
return if execution_agent == agent
|
|
49
|
-
if !agent.event(:start).controlable? && !agent.running?
|
|
50
|
-
raise ArgumentError, "the start event of #{self}'s execution agent #{agent} is not controlable"
|
|
51
|
-
end
|
|
52
|
-
# Check that agent defines the :ready event
|
|
53
|
-
if !agent.has_event?(:ready)
|
|
54
|
-
raise ArgumentError, "execution agent tasks should define the :ready event"
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
old_agent = execution_agent
|
|
58
|
-
if old_agent && old_agent != agent
|
|
59
|
-
Roby.debug "an agent is already defined for this task"
|
|
60
|
-
remove_execution_agent old_agent
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
unless old_agent
|
|
64
|
-
# If the task did have an agent already, these event handlers
|
|
65
|
-
# are already set up
|
|
66
|
-
if running?
|
|
67
|
-
Roby::Distributed.update(self) do
|
|
68
|
-
agent.forward_to(:stop, self, :aborted)
|
|
69
|
-
end
|
|
70
|
-
else
|
|
71
|
-
on(:start) do
|
|
72
|
-
# The event handler will be called even if the
|
|
73
|
-
# execution agent has been removed. Check that there is
|
|
74
|
-
# actually an execution agent
|
|
75
|
-
if execution_agent
|
|
76
|
-
Roby::Distributed.update(self) do
|
|
77
|
-
execution_agent.forward_to(:stop, self, :aborted)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
on(:stop) do
|
|
84
|
-
if execution_agent
|
|
85
|
-
Roby::Distributed.update(self) do
|
|
86
|
-
execution_agent.event(:stop).remove_forwarding event(:aborted)
|
|
87
|
-
remove_execution_agent execution_agent
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
add_execution_agent(agent)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
class ExecutionAgentSpawningFailed < Roby::LocalizedError
|
|
99
|
-
attr_reader :agent_model, :error
|
|
100
|
-
def initialize(task, agent_model, error)
|
|
101
|
-
super(task)
|
|
102
|
-
@agent_model, @error = agent_model, error
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
# Add a suitable execution agent to +task+ if its model has a execution
|
|
107
|
-
# agent model (see ModelLevelExecutionAgent), either by reusing one
|
|
108
|
-
# that is already in the plan, or by creating a new one.
|
|
109
|
-
def ExecutionAgent.spawn(task)
|
|
110
|
-
agent_model, arguments = task.model.execution_agent
|
|
111
|
-
candidates = task.plan.find_tasks.
|
|
112
|
-
with_model(agent_model).
|
|
113
|
-
with_arguments(arguments).
|
|
114
|
-
self_owned.
|
|
115
|
-
not_finished
|
|
116
|
-
|
|
117
|
-
agent = nil
|
|
118
|
-
|
|
119
|
-
if candidates.empty?
|
|
120
|
-
begin
|
|
121
|
-
agent = agent_model.new(arguments)
|
|
122
|
-
agent.on(:stop) do
|
|
123
|
-
agent.each_executed_task do |task|
|
|
124
|
-
if task.running?
|
|
125
|
-
task.emit(:aborted, "execution agent #{self} failed")
|
|
126
|
-
elsif task.pending?
|
|
127
|
-
task.remove_execution_agent agent
|
|
128
|
-
spawn(task)
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
rescue Exception => e
|
|
133
|
-
task.plan.engine.add_error(ExecutionAgentSpawningFailed.new(task, agent_model, e))
|
|
134
|
-
end
|
|
135
|
-
else
|
|
136
|
-
running, pending = candidates.partition { |t| t.running? }
|
|
137
|
-
agent = if running.empty? then pending.first
|
|
138
|
-
else running.first
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
task.executed_by agent
|
|
142
|
-
agent
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# This module is hooked in Roby::TaskEventGenerator to check that a task
|
|
146
|
-
# which is being started has a suitable execution agent, and to start it if
|
|
147
|
-
# it's not the case
|
|
148
|
-
module ExecutionAgentStart
|
|
149
|
-
def calling(context)
|
|
150
|
-
super if defined? super
|
|
151
|
-
return unless symbol == :start
|
|
152
|
-
|
|
153
|
-
agent = task.execution_agent
|
|
154
|
-
if !agent
|
|
155
|
-
if task.model.execution_agent
|
|
156
|
-
raise CommandFailed.new(nil, self), "the model of #{task} requires an execution agent, but the task has none"
|
|
157
|
-
else
|
|
158
|
-
return
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
# Check that the agent matches the model
|
|
163
|
-
agent_model, arguments = task.model.execution_agent
|
|
164
|
-
if agent_model
|
|
165
|
-
if !agent.fullfills?(agent_model, arguments)
|
|
166
|
-
raise CommandFailed.new(nil, self), "the execution agent #{agent} does not match the required model #{agent_model}, #{arguments}"
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
if agent.finished? || agent.finishing?
|
|
171
|
-
raise CommandFailed.new(nil, self), "task #{task} has an execution agent but it is dead"
|
|
172
|
-
elsif !agent.event(:ready).happened? && !agent.depends_on?(task)
|
|
173
|
-
postpone(agent.event(:ready), "spawning execution agent #{agent} for #{self}") do
|
|
174
|
-
if agent.pending?
|
|
175
|
-
agent.event(:ready).if_unreachable(true) do |reason|
|
|
176
|
-
self.emit_failed "execution agent #{agent} failed to initialize: #{reason}"
|
|
177
|
-
end
|
|
178
|
-
agent.start!
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
Roby::TaskEventGenerator.include ExecutionAgentStart
|
|
185
|
-
|
|
186
|
-
# This module is included in Roby::Plan to automatically add execution agents
|
|
187
|
-
# to tasks that require it and are discovered in the executable plan.
|
|
188
|
-
module ExecutionAgentSpawn
|
|
189
|
-
# Hook into plan discovery to add execution agents to new tasks.
|
|
190
|
-
# See ExecutionAgentSpawn.spawn
|
|
191
|
-
def added_tasks(tasks)
|
|
192
|
-
# For now, settle on adding the execution agents only in the
|
|
193
|
-
# main plan. Otherwise, it is possible that two transactions
|
|
194
|
-
# will try to add two different agents
|
|
195
|
-
#
|
|
196
|
-
# Note that it would be solved by plan merging ...
|
|
197
|
-
return unless executable?
|
|
198
|
-
|
|
199
|
-
for task in tasks
|
|
200
|
-
if !task.execution_agent && task.model.execution_agent && task.self_owned?
|
|
201
|
-
ExecutionAgent.spawn(task)
|
|
202
|
-
end
|
|
203
|
-
end
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
Roby::Plan.include ExecutionAgentSpawn
|
|
207
|
-
end
|
|
208
|
-
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
module Roby::TaskStructure
|
|
2
|
-
relation :PlannedBy, :child_name => :planning_task,
|
|
3
|
-
:parent_name => :planned_task, :noinfo => true, :single_child => true do
|
|
4
|
-
|
|
5
|
-
# The set of tasks which are planned by this one
|
|
6
|
-
def planned_tasks; parent_objects(PlannedBy) end
|
|
7
|
-
# Set +task+ as the planning task of +self+
|
|
8
|
-
def planned_by(task, options = {})
|
|
9
|
-
if old = planning_task
|
|
10
|
-
if options[:replace]
|
|
11
|
-
remove_planning_task(old)
|
|
12
|
-
else
|
|
13
|
-
raise ArgumentError, "this task already has a planner"
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
add_planning_task(task)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# Returns a set of PlanningFailedError exceptions for all abstract tasks
|
|
21
|
-
# for which planning has failed
|
|
22
|
-
def PlannedBy.check_structure(plan)
|
|
23
|
-
result = []
|
|
24
|
-
Roby::TaskStructure::PlannedBy.each_edge do |planned_task, planning_task, _|
|
|
25
|
-
next unless plan == planning_task.plan && planning_task.failed?
|
|
26
|
-
next unless planned_task.pending? && !planned_task.executable? && planned_task.self_owned?
|
|
27
|
-
result << Roby::PlanningFailedError.new(planned_task, planning_task)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
result
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
module Roby
|
|
35
|
-
# This exception is raised when a task is abstract, and its planner failed:
|
|
36
|
-
# the system will therefore not have a suitable executable development for
|
|
37
|
-
# this task, and this is a failure
|
|
38
|
-
class PlanningFailedError < LocalizedError
|
|
39
|
-
# The planning task
|
|
40
|
-
attr_reader :planned_task
|
|
41
|
-
|
|
42
|
-
def initialize(planned_task, planning_task)
|
|
43
|
-
@planned_task = planned_task
|
|
44
|
-
super(planning_task.failure_event)
|
|
45
|
-
end
|
|
46
|
-
def pretty_print(pp)
|
|
47
|
-
pp.text "failed to plan "
|
|
48
|
-
planned_task.pretty_print(pp)
|
|
49
|
-
pp.breakable
|
|
50
|
-
pp.breakable
|
|
51
|
-
pp.text "the following planning task failed with the #{failure_point.symbol} event"
|
|
52
|
-
pp.breakable
|
|
53
|
-
failed_task.pretty_print(pp)
|
|
54
|
-
pp.breakable
|
|
55
|
-
|
|
56
|
-
if failure_point.context
|
|
57
|
-
pp.breakable
|
|
58
|
-
failure_point.context.first.pretty_print(pp)
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
module Distributions
|
|
2
|
-
class Gaussian
|
|
3
|
-
attr_reader :mean, :dev
|
|
4
|
-
def initialize(mean, dev)
|
|
5
|
-
@mean, @dev = mean, dev
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
module Roby
|
|
11
|
-
# A TimeDistribution object describes the evolution of a
|
|
12
|
-
# value object w.r.t. time. Time can be described by absolute
|
|
13
|
-
# values using Time objects or w.r.t. the plan by using
|
|
14
|
-
# EventGenerator objects
|
|
15
|
-
class TimeDistribution
|
|
16
|
-
attr_reader :info
|
|
17
|
-
def initialize(info)
|
|
18
|
-
@info = info
|
|
19
|
-
@timepoints = Array.new
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Set the predicted value of the distribution at +event+
|
|
23
|
-
def set_value(event, value)
|
|
24
|
-
@timepoints << [event, :set_value, value]
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Set a decay function which is valid from +event+
|
|
28
|
-
def set_decay(event, decay)
|
|
29
|
-
@timepoints << [event, :set_decay, decay]
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Set the knowledge value for the distribution at +event+
|
|
33
|
-
# For now, the only valid values are 0 (nothing known)
|
|
34
|
-
# and 1 (perfectly known)
|
|
35
|
-
def set_knowledge(event, value = 1.0)
|
|
36
|
-
@timepoints << [event, :set_knowledge, value]
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
class Task < PlanObject
|
|
41
|
-
inherited_enumerable(:needed_information) { Array.new }
|
|
42
|
-
inherited_enumerable(:improved_information) { Array.new }
|
|
43
|
-
|
|
44
|
-
# This task is influenced by the information contained in +info+
|
|
45
|
-
def self.needs(info); needed_information << info end
|
|
46
|
-
def self.needs?(info); enum_for(:each_needed_information).any? { |i| info === i } end
|
|
47
|
-
def needs?(info); self.model.needs?(info) end
|
|
48
|
-
|
|
49
|
-
# This task will improve the information contained in +info+
|
|
50
|
-
def self.improves(info); improved_information << info end
|
|
51
|
-
def self.improves?(info); enum_for(:each_improved_information).any? { |i| info === i } end
|
|
52
|
-
def improves?(info); self.model.improves?(info) end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
data/lib/roby/state/state.rb
DELETED
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
module Roby
|
|
2
|
-
# ExtendedStruct objects are OpenStructs where attributes have a default
|
|
3
|
-
# class. They are used to build hierarchical data structure on-the-fly
|
|
4
|
-
#
|
|
5
|
-
# For instance
|
|
6
|
-
# root = ExtendedStruct.new
|
|
7
|
-
# root.child.value = 42
|
|
8
|
-
#
|
|
9
|
-
# However, you *cannot* check if a value is defined or not with
|
|
10
|
-
# if (root.child)
|
|
11
|
-
# <do something>
|
|
12
|
-
# end
|
|
13
|
-
#
|
|
14
|
-
# You'll have to test with respond_to? or #{name}?. The second one will
|
|
15
|
-
# return true only if the attribute is defined <b>and</b> it is not false
|
|
16
|
-
# if (root.respond_to?(:child)
|
|
17
|
-
# <do something>
|
|
18
|
-
# end
|
|
19
|
-
#
|
|
20
|
-
# == Handling of methods defined on parents
|
|
21
|
-
#
|
|
22
|
-
# Methods defined in Object or Kernel are automatically overriden if needed.
|
|
23
|
-
# For instance, if you're managing a (x, y, z) position using ExtendedStruct,
|
|
24
|
-
# you will want YAML#y to *not* get in the way. The exceptions are the methods
|
|
25
|
-
# listed in NOT_OVERRIDABLE
|
|
26
|
-
#
|
|
27
|
-
class ExtendedStruct
|
|
28
|
-
include DRbUndumped
|
|
29
|
-
|
|
30
|
-
# +attach_to+ and +attach_name+
|
|
31
|
-
# are used so that
|
|
32
|
-
# root = ExtendedStruct.new
|
|
33
|
-
# root.bla
|
|
34
|
-
# does *not* add a +bla+ attribute to root, while the following constructs
|
|
35
|
-
# root.bla.test = 20
|
|
36
|
-
# bla = root.bla
|
|
37
|
-
# bla.test = 20
|
|
38
|
-
# does
|
|
39
|
-
#
|
|
40
|
-
# Note, however that
|
|
41
|
-
# bla = root.bla
|
|
42
|
-
# root.bla = 10
|
|
43
|
-
# bla.test = 20
|
|
44
|
-
#
|
|
45
|
-
# will *not* make root.bla be the +bla+ object. And that
|
|
46
|
-
#
|
|
47
|
-
# bla = root.bla
|
|
48
|
-
# root.stable!
|
|
49
|
-
# bla.test = 20
|
|
50
|
-
#
|
|
51
|
-
# will not fail
|
|
52
|
-
def initialize(children_class = ExtendedStruct, attach_to = nil, attach_name = nil) # :nodoc
|
|
53
|
-
clear
|
|
54
|
-
@attach_as = [attach_to, attach_name.to_s] if attach_to
|
|
55
|
-
@children_class = children_class
|
|
56
|
-
@observers = Hash.new { |h, k| h[k] = [] }
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def clear
|
|
60
|
-
@attach_as = nil
|
|
61
|
-
@stable = false
|
|
62
|
-
@members = Hash.new
|
|
63
|
-
@pending = Hash.new
|
|
64
|
-
@filters = Hash.new
|
|
65
|
-
@aliases = Hash.new
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def self._load(io)
|
|
69
|
-
marshalled_members, aliases = Marshal.load(io)
|
|
70
|
-
members = marshalled_members.inject({}) do |h, (n, mv)|
|
|
71
|
-
begin
|
|
72
|
-
h[n] = Marshal.load(mv)
|
|
73
|
-
rescue Exception
|
|
74
|
-
Roby::Distributed.warn "cannot load #{n} #{mv}: #{$!.message}"
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
h
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
result = ExtendedStruct.new
|
|
81
|
-
result.instance_variable_set("@members", members)
|
|
82
|
-
result.instance_variable_set("@aliases", aliases)
|
|
83
|
-
result
|
|
84
|
-
|
|
85
|
-
rescue Exception
|
|
86
|
-
Roby::Distributed.warn "cannot load #{members} #{io}: #{$!.message}"
|
|
87
|
-
raise
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def _dump(lvl = -1)
|
|
91
|
-
marshalled_members = @members.map do |name, value|
|
|
92
|
-
[name, Marshal.dump(value)] rescue nil
|
|
93
|
-
end
|
|
94
|
-
marshalled_members.compact!
|
|
95
|
-
Marshal.dump([marshalled_members, @aliases])
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
attr_reader :children_class
|
|
99
|
-
|
|
100
|
-
attr_reader :attach_as, :__parent_struct, :__parent_name
|
|
101
|
-
def attach # :nodoc:
|
|
102
|
-
if @attach_as
|
|
103
|
-
@__parent_struct, @__parent_name = @attach_as
|
|
104
|
-
@attach_as = nil
|
|
105
|
-
__parent_struct.attach_child(__parent_name, self)
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
def detach
|
|
109
|
-
@attach_as = nil
|
|
110
|
-
end
|
|
111
|
-
def attach_child(name, obj)
|
|
112
|
-
@members[name.to_s] = obj
|
|
113
|
-
end
|
|
114
|
-
protected :detach, :attach_as
|
|
115
|
-
|
|
116
|
-
# Call +block+ with the new value if +name+ changes
|
|
117
|
-
def on(name = nil, &block)
|
|
118
|
-
name = name.to_s if name
|
|
119
|
-
@observers[name] << block
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
# Converts this ExtendedStruct into a corresponding hash, where all
|
|
123
|
-
# keys are symbols. If +recursive+ is true, any member which responds
|
|
124
|
-
# to #to_hash will be converted as well
|
|
125
|
-
def to_hash(recursive = true)
|
|
126
|
-
result = Hash.new
|
|
127
|
-
@members.each do |k, v|
|
|
128
|
-
result[k.to_sym] = if recursive && v.respond_to?(:to_hash)
|
|
129
|
-
v.to_hash
|
|
130
|
-
else v
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
result
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
# Iterates on all defined members of this object
|
|
137
|
-
def each_member(&block)
|
|
138
|
-
@members.each(&block)
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
# Update a set of values on this struct
|
|
142
|
-
# If a hash is given, it is an name => value hash of attribute
|
|
143
|
-
# values. A given block is yield with self, so that the construct
|
|
144
|
-
#
|
|
145
|
-
# my.extendable.struct.very.deep.update do |deep|
|
|
146
|
-
# <update deep>
|
|
147
|
-
# end
|
|
148
|
-
#
|
|
149
|
-
# can be used
|
|
150
|
-
def update(hash = nil)
|
|
151
|
-
attach
|
|
152
|
-
hash.each { |k, v| send("#{k}=", v) } if hash
|
|
153
|
-
yield(self) if block_given?
|
|
154
|
-
self
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
def delete(name = nil)
|
|
158
|
-
raise TypeError, "#{self} is stable" if stable?
|
|
159
|
-
if name
|
|
160
|
-
name = name.to_s
|
|
161
|
-
if child = @members.delete(name)
|
|
162
|
-
child.instance_variable_set(:@__parent_struct, nil)
|
|
163
|
-
child.instance_variable_set(:@__parent_name, nil)
|
|
164
|
-
elsif child = @pending.delete(name)
|
|
165
|
-
child.instance_variable_set(:@attach_as, nil)
|
|
166
|
-
elsif child = @aliases.delete(name)
|
|
167
|
-
# nothing to do here
|
|
168
|
-
else
|
|
169
|
-
raise ArgumentError, "no such child #{name}"
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
# and remove aliases that point to +name+
|
|
173
|
-
@aliases.delete_if { |_, pointed_to| pointed_to == name }
|
|
174
|
-
else
|
|
175
|
-
if __parent_struct
|
|
176
|
-
__parent_struct.delete(__parent_name)
|
|
177
|
-
elsif @attach_as
|
|
178
|
-
@attach_as.first.delete(@attach_as.last)
|
|
179
|
-
else
|
|
180
|
-
raise ArgumentError, "#{self} is attached to nothing"
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
# Define a filter for the +name+ attribute on self. The given block
|
|
186
|
-
# is called when the attribute is written, and should return true if
|
|
187
|
-
# the new value if valid or false otherwise
|
|
188
|
-
def filter(name, &block)
|
|
189
|
-
@filters[name.to_s] = block
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
# If self is stable, it cannot be updated. That is, calling a setter method
|
|
193
|
-
# raises NoMethodError
|
|
194
|
-
def stable?; @stable end
|
|
195
|
-
|
|
196
|
-
# Sets the stable attribute of +self+ to +is_stable+. If +recursive+ is true,
|
|
197
|
-
# set it on the child struct as well.
|
|
198
|
-
#
|
|
199
|
-
def stable!(recursive = false, is_stable = true)
|
|
200
|
-
@stable = is_stable
|
|
201
|
-
if recursive
|
|
202
|
-
@members.each { |name, object| object.stable!(recursive, is_stable) if object.respond_to?(:stable!) }
|
|
203
|
-
end
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def updated(name, value)
|
|
207
|
-
if @observers.has_key?(name)
|
|
208
|
-
@observers[name].each { |b| b.call(value) }
|
|
209
|
-
end
|
|
210
|
-
@observers[nil].each { |b| b.call(value) }
|
|
211
|
-
|
|
212
|
-
if __parent_struct
|
|
213
|
-
__parent_struct.updated(__parent_name, self)
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
# Returns true if this object has no member
|
|
218
|
-
def empty?; @members.empty? end
|
|
219
|
-
|
|
220
|
-
if RUBY_VERSION >= "1.8.7"
|
|
221
|
-
def respond_to?(name, include_private = false) # :nodoc:
|
|
222
|
-
return true if super
|
|
223
|
-
return __respond_to__(name)
|
|
224
|
-
end
|
|
225
|
-
else
|
|
226
|
-
def respond_to?(name) # :nodoc:
|
|
227
|
-
return true if super
|
|
228
|
-
return __respond_to__(name)
|
|
229
|
-
end
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
# 1.8.7's #respond_to? takes two arguments, 1.8.6 only one. This is the
|
|
234
|
-
# common implementation for both version. #respond_to? is adapted (see
|
|
235
|
-
# above)
|
|
236
|
-
def __respond_to__(name) # :nodoc:
|
|
237
|
-
name = name.to_s
|
|
238
|
-
return false if name =~ FORBIDDEN_NAMES_RX
|
|
239
|
-
|
|
240
|
-
if name =~ /=$/
|
|
241
|
-
!@stable
|
|
242
|
-
else
|
|
243
|
-
if @members.has_key?(name)
|
|
244
|
-
true
|
|
245
|
-
else
|
|
246
|
-
(alias_to = @aliases[name]) && respond_to?(alias_to)
|
|
247
|
-
end
|
|
248
|
-
end
|
|
249
|
-
end
|
|
250
|
-
|
|
251
|
-
def get(name, default_value)
|
|
252
|
-
if respond_to?(name)
|
|
253
|
-
send(name.to_sym)
|
|
254
|
-
else
|
|
255
|
-
default_value
|
|
256
|
-
end
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
FORBIDDEN_NAMES=%w{marshal each enum to}.map { |str| "^#{str}_" }
|
|
260
|
-
FORBIDDEN_NAMES_RX = /(?:#{FORBIDDEN_NAMES.join("|")})/
|
|
261
|
-
|
|
262
|
-
NOT_OVERRIDABLE = %w{class} + instance_methods(false)
|
|
263
|
-
NOT_OVERRIDABLE_RX = /(?:#{NOT_OVERRIDABLE.join("|")})/
|
|
264
|
-
|
|
265
|
-
def method_missing(name, *args, &update) # :nodoc:
|
|
266
|
-
name = name.to_s
|
|
267
|
-
|
|
268
|
-
super(name.to_sym, *args, &update) if name =~ FORBIDDEN_NAMES_RX
|
|
269
|
-
if name =~ /(.+)=$/
|
|
270
|
-
# Setter
|
|
271
|
-
name = $1
|
|
272
|
-
|
|
273
|
-
value = *args
|
|
274
|
-
if stable?
|
|
275
|
-
raise NoMethodError, "#{self} is stable"
|
|
276
|
-
elsif @filters.has_key?(name) && !@filters[name].call(value)
|
|
277
|
-
raise ArgumentError, "value #{value} is not valid for #{name}"
|
|
278
|
-
elsif !@members.has_key?(name) && !@aliases.has_key?(name) && respond_to?(name)
|
|
279
|
-
if NOT_OVERRIDABLE_RX =~ name
|
|
280
|
-
raise ArgumentError, "#{name} is already defined an cannot be overriden"
|
|
281
|
-
end
|
|
282
|
-
|
|
283
|
-
# Override it
|
|
284
|
-
singleton_class.class_eval { private name }
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
attach
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
@aliases.delete(name)
|
|
291
|
-
pending = @pending.delete(name)
|
|
292
|
-
|
|
293
|
-
if pending && pending != value
|
|
294
|
-
pending.detach
|
|
295
|
-
end
|
|
296
|
-
|
|
297
|
-
@members[name] = value
|
|
298
|
-
updated(name, value)
|
|
299
|
-
return value
|
|
300
|
-
|
|
301
|
-
elsif name =~ /(.+)\?$/
|
|
302
|
-
# Test
|
|
303
|
-
name = $1
|
|
304
|
-
respond_to?(name) && send(name)
|
|
305
|
-
|
|
306
|
-
elsif args.empty? # getter
|
|
307
|
-
attach
|
|
308
|
-
|
|
309
|
-
if @members.has_key?(name)
|
|
310
|
-
member = @members[name]
|
|
311
|
-
else
|
|
312
|
-
if alias_to = @aliases[name]
|
|
313
|
-
return send(alias_to)
|
|
314
|
-
elsif stable?
|
|
315
|
-
raise NoMethodError, "no such attribute #{name} (#{self} is stable)"
|
|
316
|
-
else
|
|
317
|
-
member = children_class.new(children_class, self, name)
|
|
318
|
-
@pending[name] = member
|
|
319
|
-
end
|
|
320
|
-
end
|
|
321
|
-
|
|
322
|
-
if update
|
|
323
|
-
member.update(&update)
|
|
324
|
-
else
|
|
325
|
-
member
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
else
|
|
329
|
-
super(name.to_sym, *args, &update)
|
|
330
|
-
end
|
|
331
|
-
end
|
|
332
|
-
|
|
333
|
-
def alias(from, to)
|
|
334
|
-
@aliases[to.to_s] = from.to_s
|
|
335
|
-
end
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
class StateSpace < ExtendedStruct
|
|
339
|
-
def initialize
|
|
340
|
-
@exported_fields = Set.new
|
|
341
|
-
super
|
|
342
|
-
end
|
|
343
|
-
|
|
344
|
-
def _dump(lvl = -1)
|
|
345
|
-
marshalled_members = @exported_fields.map do |name|
|
|
346
|
-
value = @members[name]
|
|
347
|
-
[name, Marshal.dump(value)] rescue nil
|
|
348
|
-
end
|
|
349
|
-
marshalled_members.compact!
|
|
350
|
-
Marshal.dump([marshalled_members, @aliases])
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
def deep_copy
|
|
354
|
-
exported_fields, @exported_fields = @exported_fields, Set.new
|
|
355
|
-
Marshal.load(Marshal.dump(self))
|
|
356
|
-
ensure
|
|
357
|
-
@exported_fields = exported_fiels
|
|
358
|
-
end
|
|
359
|
-
|
|
360
|
-
def testing?; Roby.app.testing? end
|
|
361
|
-
def simulation?; Roby.app.simulation? end
|
|
362
|
-
def export(*names)
|
|
363
|
-
@exported_fields.merge names.map { |n| n.to_s }.to_set
|
|
364
|
-
end
|
|
365
|
-
end
|
|
366
|
-
end
|
|
367
|
-
|