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,20 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Relations
|
|
3
|
+
# Subclass of Relations::Space for tasks.
|
|
4
|
+
#
|
|
5
|
+
# It adds attributes that are specific to tasks
|
|
6
|
+
class TaskRelationGraph < Relations::Graph
|
|
7
|
+
extend Models::TaskRelationGraph
|
|
8
|
+
|
|
9
|
+
# If true, the tasks that have a parent in this relation will still be
|
|
10
|
+
# available for scheduling. Otherwise, they won't get scheduled
|
|
11
|
+
attr_predicate :scheduling?, true
|
|
12
|
+
|
|
13
|
+
def initialize(scheduling: self.class.scheduling?, **options)
|
|
14
|
+
super(**options)
|
|
15
|
+
@scheduling = scheduling
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
data/lib/roby/robot.rb
CHANGED
|
@@ -1,53 +1,100 @@
|
|
|
1
|
+
require 'utilrb/logger'
|
|
2
|
+
|
|
1
3
|
module Robot
|
|
2
|
-
|
|
3
|
-
|
|
4
|
+
def self.log_formatter(severity, time, progname, msg)
|
|
5
|
+
Roby.app.notify(progname, severity.to_s, msg)
|
|
6
|
+
Roby.logger.formatter.call(severity, time, progname, msg)
|
|
4
7
|
end
|
|
5
|
-
extend Logger::
|
|
8
|
+
extend Logger::Root('Robot', Logger::INFO, &method(:log_formatter))
|
|
6
9
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
# @deprecated use Roby.app.action_from_model instead
|
|
11
|
+
def self.action_from_model(model)
|
|
12
|
+
return Roby.app.action_from_model(model)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @deprecated use Roby.app.find_action_from_name instead
|
|
16
|
+
def self.find_action_from_name(name)
|
|
17
|
+
return Roby.app.find_action_from_name(name)
|
|
18
|
+
end
|
|
16
19
|
|
|
17
|
-
|
|
20
|
+
# @deprecated use Roby.app.action_from_name instead
|
|
21
|
+
def self.action_from_name(name)
|
|
22
|
+
return Roby.app.action_from_name(name)
|
|
23
|
+
end
|
|
18
24
|
|
|
19
|
-
|
|
20
|
-
|
|
25
|
+
# @deprecated use Roby.app.prepare_action instead
|
|
26
|
+
def self.prepare_action(plan, name, **arguments)
|
|
27
|
+
if plan != Roby.app.plan
|
|
28
|
+
raise ArgumentError, "cannot call prepare_action with any other plan than Roby.app.plan"
|
|
29
|
+
end
|
|
30
|
+
return Roby.app.prepare_action(name, **arguments)
|
|
31
|
+
end
|
|
21
32
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
33
|
+
# Implements that one can call
|
|
34
|
+
#
|
|
35
|
+
# Robot.action_name! arg0: value0, arg1: value1
|
|
36
|
+
#
|
|
37
|
+
# To inject a given action in Roby.plan. The added action is added as a
|
|
38
|
+
# mission.
|
|
39
|
+
#
|
|
40
|
+
# See also Robot.prepare_action
|
|
41
|
+
def self.method_missing(name, *args)
|
|
42
|
+
if name.to_s =~ /!$/
|
|
43
|
+
name = $`.to_sym
|
|
44
|
+
else
|
|
45
|
+
super
|
|
46
|
+
end
|
|
29
47
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
48
|
+
if args.size > 1
|
|
49
|
+
raise ArgumentError, "wrong number of arguments (#{args.size} for 1) in #{name}!"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
options = args.first || {}
|
|
53
|
+
task, planner = Roby.app.prepare_action(name, job_id: Roby::Interface::Job.allocate_job_id, **options)
|
|
54
|
+
task.plan.add_mission_task(task)
|
|
55
|
+
return task, planner
|
|
33
56
|
end
|
|
34
57
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
58
|
+
# Declare the robot type of the robot configuration being loaded
|
|
59
|
+
#
|
|
60
|
+
# Place this on top of the robot file in config/robots/
|
|
61
|
+
def self.robot_type(robot_type)
|
|
62
|
+
# Declare it first
|
|
63
|
+
Roby.app.robots.declare_robot_type(Roby.app.robot_name, robot_type)
|
|
64
|
+
# And then set it up
|
|
65
|
+
Roby.app.robot(Roby.app.robot_name, robot_type)
|
|
66
|
+
end
|
|
41
67
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
68
|
+
def self.init(&block)
|
|
69
|
+
Roby.app.on_init(&block)
|
|
70
|
+
end
|
|
45
71
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
72
|
+
def self.setup(&block)
|
|
73
|
+
Roby.app.on_setup(&block)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def self.requires(&block)
|
|
77
|
+
Roby.app.on_require(&block)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def self.clear_models(&block)
|
|
81
|
+
Roby.app.on_clear_models(&block)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def self.cleanup(&block)
|
|
85
|
+
Roby.app.on_cleanup(&block)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def self.config(&block)
|
|
89
|
+
Roby.app.on_config(&block)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def self.controller(&block)
|
|
93
|
+
Roby.app.controller(&block)
|
|
94
|
+
end
|
|
49
95
|
|
|
50
|
-
|
|
96
|
+
def self.actions(&block)
|
|
97
|
+
Roby.app.actions(&block)
|
|
51
98
|
end
|
|
52
99
|
end
|
|
53
100
|
|
|
@@ -1,34 +1,164 @@
|
|
|
1
|
+
require 'roby/schedulers/reporting'
|
|
2
|
+
|
|
1
3
|
module Roby
|
|
4
|
+
# The namespace in which Roby's default schedulers are defined
|
|
5
|
+
#
|
|
6
|
+
# In Roby, the scheduler is an object that decides which tasks to start at
|
|
7
|
+
# any given time. There can be only one scheduler, which is set at
|
|
8
|
+
# initialization time with
|
|
9
|
+
#
|
|
10
|
+
# Roby.scheduler = <scheduler object>.
|
|
11
|
+
#
|
|
12
|
+
# For instance
|
|
13
|
+
#
|
|
14
|
+
# Roby.scheduler = Roby::Schedulers::Basic.new
|
|
15
|
+
#
|
|
16
|
+
# Then, the scheduler's #initial_events method is called at the
|
|
17
|
+
# beginning of each execution cycle. This method is supposed to call
|
|
18
|
+
# whatever event is reasonable to call with respect to the system's
|
|
19
|
+
# state (i.e. execution situation).
|
|
2
20
|
module Schedulers
|
|
3
|
-
|
|
4
|
-
|
|
21
|
+
# The basic schedulers uses the Roby's "core" plan model to decide which
|
|
22
|
+
# tasks can be started.
|
|
23
|
+
#
|
|
24
|
+
# See the documentation of Roby::Schedulers for more information
|
|
25
|
+
#
|
|
26
|
+
# The basic scheduler starts the tasks for which:
|
|
27
|
+
# * the task is pending, executable and owned by the local robot
|
|
28
|
+
# * the start event is root in all event relations (i.e. there is
|
|
29
|
+
# neither signals and forwards pointing to it).
|
|
30
|
+
# * it is root in the dependency relationship
|
|
31
|
+
# * if the +include_children+ option of Basic.new is set to true, it
|
|
32
|
+
# may be non-root in the dependency relation, in which case it is
|
|
33
|
+
# started if and only if it has at least one parent that is running
|
|
34
|
+
# (i.e. children are started after their parents).
|
|
35
|
+
#
|
|
36
|
+
class Basic < Reporting
|
|
37
|
+
# The plan on which the scheduler applies
|
|
38
|
+
attr_reader :plan
|
|
39
|
+
# The Roby::Query which is used to get the set of tasks that might
|
|
40
|
+
# be startable
|
|
41
|
+
attr_reader :query
|
|
42
|
+
# If true, the scheduler will start tasks which are non-root in the
|
|
43
|
+
# dependency relation, if they have parents that are already
|
|
44
|
+
# running.
|
|
5
45
|
attr_reader :include_children
|
|
6
|
-
|
|
46
|
+
|
|
47
|
+
# Create a new Basic schedulers that work on the given plan, and
|
|
48
|
+
# with the provided +include_children+ option.
|
|
49
|
+
#
|
|
50
|
+
# See Basic for a description of the +include_children+ option.
|
|
51
|
+
#
|
|
52
|
+
# If +plan+ is set to nil, the scheduler will use Roby.plan
|
|
53
|
+
def initialize(include_children = false, plan = nil)
|
|
54
|
+
super()
|
|
55
|
+
|
|
56
|
+
@plan = plan || Roby.plan
|
|
7
57
|
@include_children = include_children
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
58
|
+
@query = self.plan.find_tasks.
|
|
59
|
+
executable.
|
|
60
|
+
pending.
|
|
61
|
+
self_owned
|
|
62
|
+
|
|
63
|
+
@can_schedule_cache = Hash.new
|
|
64
|
+
@enabled = true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
attr_predicate :enabled?, true
|
|
68
|
+
|
|
69
|
+
def can_start?(task)
|
|
70
|
+
start_event = task.start_event
|
|
71
|
+
if !start_event.controlable?
|
|
72
|
+
report_holdoff "start event not controlable", task
|
|
73
|
+
return false
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
if (agent = task.execution_agent) && !agent.ready_event.emitted?
|
|
77
|
+
report_holdoff "task's execution agent %2 is not ready", task, agent
|
|
78
|
+
return false
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
if !start_event.root?(EventStructure::CausalLink)
|
|
82
|
+
report_holdoff "start event not root in the causal link relation", task
|
|
83
|
+
return false
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
task.each_relation do |r|
|
|
87
|
+
if r.respond_to?(:scheduling?) && !r.scheduling? && !task.root?(r)
|
|
88
|
+
report_holdoff "not root in %2, which forbids scheduling", task, r
|
|
89
|
+
return false
|
|
17
90
|
end
|
|
91
|
+
end
|
|
92
|
+
true
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def can_schedule?(task, time = Time.now, stack = [])
|
|
96
|
+
if !can_start?(task)
|
|
97
|
+
report_holdoff "cannot be started", task
|
|
98
|
+
return false
|
|
99
|
+
end
|
|
18
100
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
101
|
+
root_task =
|
|
102
|
+
if task.root?(TaskStructure::Dependency)
|
|
103
|
+
true
|
|
104
|
+
else
|
|
105
|
+
planned_tasks = task.planned_tasks
|
|
106
|
+
!planned_tasks.empty? &&
|
|
107
|
+
planned_tasks.all? { |t| !t.executable? }
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
if root_task
|
|
111
|
+
true
|
|
112
|
+
elsif include_children && task.parents.any? { |t| t.running? }
|
|
113
|
+
true
|
|
114
|
+
elsif include_children
|
|
115
|
+
report_holdoff "not root, and has no running parent", task
|
|
116
|
+
false
|
|
117
|
+
else
|
|
118
|
+
report_holdoff "not root, and include_children is false", task
|
|
119
|
+
false
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Starts all tasks that are eligible. See the documentation of the
|
|
124
|
+
# Basic class for an in-depth description
|
|
125
|
+
def initial_events
|
|
126
|
+
@can_schedule_cache.clear
|
|
127
|
+
time = Time.now
|
|
128
|
+
|
|
129
|
+
not_executable = self.plan.find_tasks.
|
|
130
|
+
not_executable.
|
|
131
|
+
pending.
|
|
132
|
+
self_owned
|
|
133
|
+
|
|
134
|
+
not_executable.each do |task|
|
|
135
|
+
# Try to figure out why ...
|
|
136
|
+
if task.execution_agent && !task.execution_agent.ready?
|
|
137
|
+
report_pending_non_executable_task("execution agent not ready (%2)", task, task.execution_agent)
|
|
138
|
+
elsif task.partially_instanciated?
|
|
139
|
+
report_pending_non_executable_task("partially instanciated", task)
|
|
140
|
+
else
|
|
141
|
+
report_pending_non_executable_task("not executable", task)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
scheduled_tasks = []
|
|
146
|
+
for task in query.reset
|
|
147
|
+
result =
|
|
148
|
+
if @can_schedule_cache.include?(task)
|
|
149
|
+
@can_schedule_cache[task]
|
|
150
|
+
else @can_schedule_cache[task] = can_schedule?(task, time, [])
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
if result
|
|
154
|
+
task.start!
|
|
155
|
+
report_trigger task.start_event
|
|
156
|
+
scheduled_tasks << task
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
scheduled_tasks
|
|
160
|
+
end
|
|
161
|
+
end
|
|
32
162
|
end
|
|
33
163
|
end
|
|
34
164
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'roby/schedulers/reporting'
|
|
2
|
+
|
|
3
|
+
module Roby
|
|
4
|
+
module Schedulers
|
|
5
|
+
# A scheduler that does nothing, used by {ExecutionEngine} by default
|
|
6
|
+
class Null < Reporting
|
|
7
|
+
attr_predicate :enabled?, true
|
|
8
|
+
|
|
9
|
+
attr_reader :plan
|
|
10
|
+
|
|
11
|
+
def initialize(plan)
|
|
12
|
+
@plan = plan
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def initial_events
|
|
16
|
+
[]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'roby/schedulers/state'
|
|
2
|
+
|
|
3
|
+
module Roby
|
|
4
|
+
module Schedulers
|
|
5
|
+
extend Logger::Hierarchy
|
|
6
|
+
extend Logger::Forward
|
|
7
|
+
|
|
8
|
+
class Reporting
|
|
9
|
+
def report_pending_non_executable_task(msg, task, *args)
|
|
10
|
+
Roby::Schedulers.debug { State.format_message_into_string(msg, task, *args) }
|
|
11
|
+
plan.execution_engine.log(:scheduler_report_pending_non_executable_task, msg, task, *args)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def report_trigger(generator)
|
|
15
|
+
Roby::Schedulers.debug { "called #{generator}" }
|
|
16
|
+
plan.execution_engine.log(:scheduler_report_trigger, generator)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def report_holdoff(msg, task, *args)
|
|
20
|
+
Roby::Schedulers.debug { State.format_message_into_string(msg, task, *args) }
|
|
21
|
+
plan.execution_engine.log(:scheduler_report_holdoff, msg, task, *args)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def report_action(msg, task, *args)
|
|
25
|
+
Roby::Schedulers.debug { State.format_message_into_string(msg, task, *args) }
|
|
26
|
+
plan.execution_engine.log(:scheduler_report_action, msg, task, *args)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module Schedulers
|
|
3
|
+
# Objects representing the reports from a scheduler object
|
|
4
|
+
#
|
|
5
|
+
# They are saved in logs, and can also be listened to through
|
|
6
|
+
# {Interface::Interface}
|
|
7
|
+
class State
|
|
8
|
+
# Tasks that are pending in the plan, but are not executable
|
|
9
|
+
attr_accessor :pending_non_executable_tasks
|
|
10
|
+
# The list of event generators triggered by the scheduler
|
|
11
|
+
#
|
|
12
|
+
# @return [EventGenerator]
|
|
13
|
+
attr_accessor :called_generators
|
|
14
|
+
# The list of tasks that have been considered for scheduling, but
|
|
15
|
+
# could not be scheduled, along with the reason
|
|
16
|
+
#
|
|
17
|
+
# @return [{Task=>[String,Array]}] a mapping from the task that was
|
|
18
|
+
# not scheduled, to a list of messages and objects. The message
|
|
19
|
+
# can contain %N placeholders which will be replaced by the
|
|
20
|
+
# corresponding element from the array
|
|
21
|
+
attr_accessor :non_scheduled_tasks
|
|
22
|
+
# The list of actions that have been taken by the scheduler
|
|
23
|
+
#
|
|
24
|
+
# @return [{Task=>[String,Array]}] a mapping from the task on which
|
|
25
|
+
# an action was performed, to a list of messages and objects. The message
|
|
26
|
+
# can contain %N placeholders which will be replaced by the
|
|
27
|
+
# corresponding element from the array
|
|
28
|
+
attr_accessor :actions
|
|
29
|
+
|
|
30
|
+
def initialize
|
|
31
|
+
@pending_non_executable_tasks = Set.new
|
|
32
|
+
@called_generators = Set.new
|
|
33
|
+
@non_scheduled_tasks = Hash.new { |h, k| h[k] = Set.new }
|
|
34
|
+
@actions = Hash.new { |h, k| h[k] = Set.new }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def report_pending_non_executable_task(msg, task, *args)
|
|
38
|
+
pending_non_executable_tasks << [msg, task, *args]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def report_trigger(generator)
|
|
42
|
+
called_generators << generator
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def report_holdoff(msg, task, *args)
|
|
46
|
+
non_scheduled_tasks[task] << [msg, *args]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def report_action(msg, task, *args)
|
|
50
|
+
actions[task] << [msg, *args]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Add information contained in 'state' to this object
|
|
54
|
+
def merge!(state)
|
|
55
|
+
pending_non_executable_tasks.merge(state.pending_non_executable_tasks)
|
|
56
|
+
called_generators.merge(state.called_generators)
|
|
57
|
+
non_scheduled_tasks.merge!(state.non_scheduled_tasks) do |task, msg0, msg1|
|
|
58
|
+
msg0.merge(msg1)
|
|
59
|
+
end
|
|
60
|
+
actions.merge!(state.actions) do |task, msg0, msg1|
|
|
61
|
+
msg0.merge(msg1)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def pretty_print(pp)
|
|
66
|
+
if !pending_non_executable_tasks.empty?
|
|
67
|
+
has_text = true
|
|
68
|
+
pp.text "Pending non-executable tasks"
|
|
69
|
+
pp.nest(2) do
|
|
70
|
+
pending_non_executable_tasks.each do |args|
|
|
71
|
+
pp.breakable
|
|
72
|
+
pp.text self.class.format_message_into_string(*args)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
if !non_scheduled_tasks.empty?
|
|
78
|
+
pp.breakable if has_text
|
|
79
|
+
has_text = true
|
|
80
|
+
pp.text "Non scheduled tasks"
|
|
81
|
+
pp.nest(2) do
|
|
82
|
+
non_scheduled_tasks.each do |task, msgs|
|
|
83
|
+
pp.breakable
|
|
84
|
+
task.pretty_print(pp)
|
|
85
|
+
pp.nest(2) do
|
|
86
|
+
msgs.each do |msg, *args|
|
|
87
|
+
pp.breakable
|
|
88
|
+
pp.text self.class.format_message_into_string(msg, task, *args)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
if !actions.empty?
|
|
96
|
+
pp.breakable if has_text
|
|
97
|
+
has_text = true
|
|
98
|
+
pp.text "Actions taken"
|
|
99
|
+
pp.nest(2) do
|
|
100
|
+
actions.each do |task, msgs|
|
|
101
|
+
pp.breakable
|
|
102
|
+
task.pretty_print(pp)
|
|
103
|
+
pp.nest(2) do
|
|
104
|
+
msgs.each do |msg, *args|
|
|
105
|
+
pp.breakable
|
|
106
|
+
pp.text self.class.format_message_into_string(msg, task, *args)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Formats a message stored in {#non_scheduled_tasks} into a plain
|
|
115
|
+
# string
|
|
116
|
+
def self.format_message_into_string(msg, *args)
|
|
117
|
+
args.each_with_index.inject(msg) do |msg, (a, i)|
|
|
118
|
+
a = if a.respond_to?(:map)
|
|
119
|
+
a.map(&:to_s).join(", ")
|
|
120
|
+
else a.to_s
|
|
121
|
+
end
|
|
122
|
+
msg.gsub "%#{i + 1}", a
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
|