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
data/lib/roby/interface.rb
CHANGED
|
@@ -1,474 +1,141 @@
|
|
|
1
|
-
require '
|
|
2
|
-
|
|
1
|
+
require 'roby'
|
|
3
2
|
module Roby
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
# High-level command and control of a Roby controller
|
|
4
|
+
#
|
|
5
|
+
# The {Interface} module provides a high-level control interface to a
|
|
6
|
+
# running Roby controller. It is the basis for all remote Roby UIs such as
|
|
7
|
+
# the Syskit IDE or the Roby shell. The following documentation aims at
|
|
8
|
+
# giving a bird eye's view of the module's structure
|
|
9
|
+
#
|
|
10
|
+
# == Jobs
|
|
11
|
+
#
|
|
12
|
+
# The high-level construct used in the Roby interface is the job. Jobs are
|
|
13
|
+
# representation of the high-level goals that a user gave to the system. A
|
|
14
|
+
# task represents a job if:
|
|
15
|
+
#
|
|
16
|
+
# - it provides the {Interface::Job} service
|
|
17
|
+
# - it has a non-nil {Interface::Job#job_id} argument
|
|
18
|
+
# - itself or its planned task is a mission
|
|
19
|
+
#
|
|
20
|
+
# In case a job task is a planning task, the job itself will be represented
|
|
21
|
+
# by the job's planned task. Across the job-related APIs, one will see that
|
|
22
|
+
# jobs are therefore associated with two tasks: the task or placeholder
|
|
23
|
+
# task, and the job task itself.
|
|
24
|
+
#
|
|
25
|
+
# The interface APIs provide ways to track the progress of jobs. Each job
|
|
26
|
+
# transition is represented by a Interface::JOB_* constant (e.g.
|
|
27
|
+
# {Interface::JOB_READY}), and notifications are sent to remote endpoints
|
|
28
|
+
# about the current state and progress of jobs.
|
|
29
|
+
#
|
|
30
|
+
# == Synchronous Client/Server API
|
|
31
|
+
#
|
|
32
|
+
# A Roby application will in most cases create an {Interface::Interface}
|
|
33
|
+
# object, which is the endpoint for all interface-related matters. A
|
|
34
|
+
# client/server mechanism allows to access the app's interface.
|
|
35
|
+
# {Interface::Server} provides the server-side and {Interface::Client} the
|
|
36
|
+
# client-side. Both classes are independent of the communication channel
|
|
37
|
+
# used. The communication is based on marshalling and demarshalling of an
|
|
38
|
+
# array that represents a method name and arguments on the
|
|
39
|
+
# {Interface::Interface} class. The marshalling/demarshalling and the exact
|
|
40
|
+
# packet format is left to the channel class given to Client and Server at
|
|
41
|
+
# construction time (see below)
|
|
42
|
+
#
|
|
43
|
+
# The core of the method calls on {Interface::Client} are the calls
|
|
44
|
+
# available on {Interface::Interface}. Check the latter to figure out what
|
|
45
|
+
# you can do with the former. In addition, it supports starting actions (and
|
|
46
|
+
# jobs) using an action_name!(arguments) syntax. This is meant as syntactic
|
|
47
|
+
# sugar for use in interactive implementations, but one should use
|
|
48
|
+
# {Interface::Interface#start_job} when starting jobs programmatically.
|
|
49
|
+
#
|
|
50
|
+
# In addition to the remote method calls, the Client API provides
|
|
51
|
+
# notifications pushed by the interface:
|
|
52
|
+
#
|
|
53
|
+
# - {Interface::Client#pop_notification}: general log messages from
|
|
54
|
+
# {Application#notify}. By default, all log messages generated from {Robot}
|
|
55
|
+
# are forwarded this way
|
|
56
|
+
# - {Interface::Client#pop_job_progress}: job progress
|
|
57
|
+
# - {Interface::Client#pop_exception}: about exceptions
|
|
58
|
+
#
|
|
59
|
+
# == Asynchronous API
|
|
60
|
+
#
|
|
61
|
+
# To connect to the client/server API, one has to have a remote Roby app to
|
|
62
|
+
# connect to. Moreoover, the API is really designed as a request/response
|
|
63
|
+
# scheme, which is not a very nice format to build UIs from.
|
|
64
|
+
#
|
|
65
|
+
# For these, reasons, a higher level, event-based API has been built on top
|
|
66
|
+
# of the client/server functionality. The main entrypoint for this
|
|
67
|
+
# asynchronous API is {Interface::Async::Interface}. In addition to properly
|
|
68
|
+
# handling (re)connections, this API provides also a nicer interface to job
|
|
69
|
+
# tracking.
|
|
70
|
+
#
|
|
71
|
+
# Jobs are represented by {Async::JobMonitor} objects, which track the job
|
|
72
|
+
# state and provide operations on them such as killing, dropping and
|
|
73
|
+
# restarting them as well as registering hooks to track their progress. One
|
|
74
|
+
# usually gets these job monitor objects by listening for new jobs using
|
|
75
|
+
# {Async::Interface#on_job}.
|
|
76
|
+
#
|
|
77
|
+
# Note that in most cases, new job monitor objects are inactive (i.e. won't
|
|
78
|
+
# get notifications) until you explicitely call {Async::JobMonitor#start} on
|
|
79
|
+
# them. Whether this is the case or not is documented on each method that
|
|
80
|
+
# return or yield a job monitor object.
|
|
81
|
+
#
|
|
82
|
+
# == Asynchronous log stream API
|
|
83
|
+
#
|
|
84
|
+
# In addition to the notifications provided by {Interface::Client}, one can
|
|
85
|
+
# use the Roby logging to build a complete representation of a plan. The
|
|
86
|
+
# {Interface::Async::Log} class gives easy-to-use access to such a rebuilt
|
|
87
|
+
# plan, along with the ability to disconnect and reconnect to a remote
|
|
88
|
+
# Roby app.
|
|
89
|
+
#
|
|
90
|
+
# == Event Loop Integration
|
|
91
|
+
#
|
|
92
|
+
# {Interface::Interface} hooks itself in the app's main event loop, as does
|
|
93
|
+
# {Interface::TCPServer}. On the client side, processing is done in
|
|
94
|
+
# {Interface::Client#poll} which therefore needs to be called periodically
|
|
95
|
+
# within your app's main loop. In Qt, it usually means starting a timer
|
|
96
|
+
#
|
|
97
|
+
# timer = Qt::Timer.new(self)
|
|
98
|
+
# timer.connect(SIGNAL('timeout()')) do
|
|
99
|
+
# client.poll
|
|
100
|
+
# end
|
|
101
|
+
#
|
|
102
|
+
# == Communication Channel
|
|
103
|
+
#
|
|
104
|
+
# {Interface::DRobyChannel} provides a default implementation, using the
|
|
105
|
+
# DRoby marshalling/demarshalling for object-to-binary translation,
|
|
106
|
+
# WebSockets for framing and a subclass of IO as the underlying
|
|
107
|
+
# communication medium. The most common usage is to spawn a TCP server based
|
|
108
|
+
# on this channel with {Interface::TCPServer}, and connect to it from the
|
|
109
|
+
# client side with {Interface.connect_with_tcp_to}. A Roby application
|
|
110
|
+
# spawns such a server automatically by calling
|
|
111
|
+
# {Roby::Application#setup_shell_interface} if
|
|
112
|
+
# {Roby::Application#public_shell_interface?} is true.
|
|
113
|
+
#
|
|
114
|
+
|
|
115
|
+
module Interface
|
|
116
|
+
DEFAULT_PORT = 20201
|
|
117
|
+
DEFAULT_REST_PORT = 20202
|
|
118
|
+
|
|
119
|
+
extend Logger::Hierarchy
|
|
120
|
+
|
|
121
|
+
module Async
|
|
122
|
+
extend Logger::Hierarchy
|
|
11
123
|
end
|
|
12
|
-
def pretty_print(pp)
|
|
13
|
-
pp.text to_s
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
alias __method_missing__ method_missing
|
|
17
|
-
def method_missing(*args, &block)
|
|
18
|
-
if remote_interface
|
|
19
|
-
remote_interface.call(self, *args, &block)
|
|
20
|
-
else
|
|
21
|
-
super
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# RemoteInterface objects are used as local representation of remote
|
|
27
|
-
# interface objects. They offer a seamless interface to a remotely running
|
|
28
|
-
# Roby controller.
|
|
29
|
-
class RemoteInterface
|
|
30
|
-
# Create a RemoteInterface object for the remote object represented by
|
|
31
|
-
# +interface+, where +interface+ is a DRbObject for a remote Interface
|
|
32
|
-
# object.
|
|
33
|
-
def initialize(interface)
|
|
34
|
-
@interface = interface
|
|
35
|
-
reconnect
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def reconnect
|
|
39
|
-
remote_models = @interface.task_models
|
|
40
|
-
remote_models.map do |klass|
|
|
41
|
-
klass = klass.proxy(nil)
|
|
42
|
-
|
|
43
|
-
if klass.respond_to?(:remote_name)
|
|
44
|
-
# This is a local proxy for a remote model. Add it in our
|
|
45
|
-
# namespace as well.
|
|
46
|
-
path = klass.remote_name.split '::'
|
|
47
|
-
klass_name = path.pop
|
|
48
|
-
mod = Object
|
|
49
|
-
while !path.empty?
|
|
50
|
-
name = path.shift
|
|
51
|
-
mod = begin
|
|
52
|
-
mod.const_get(name)
|
|
53
|
-
rescue NameError
|
|
54
|
-
mod.const_set(name, Module.new)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
mod.const_set(klass_name, klass)
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# Returns a Query object which can be used to interactively query the
|
|
63
|
-
# running plan
|
|
64
|
-
def find_tasks(model = nil, args = nil)
|
|
65
|
-
q = Query.new(self)
|
|
66
|
-
if model
|
|
67
|
-
q.which_fullfills(model, args)
|
|
68
|
-
end
|
|
69
|
-
q
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# Defined for remotes queries to work
|
|
73
|
-
def query_result_set(query) # :nodoc:
|
|
74
|
-
@interface.remote_query_result_set(Distributed.format(query)).each do |t|
|
|
75
|
-
t.remote_interface = self
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
# Defined for remotes queries to work
|
|
79
|
-
def query_each(result_set) # :nodoc:
|
|
80
|
-
result_set.each do |t|
|
|
81
|
-
yield(t)
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
# Defined for remotes queries to work
|
|
85
|
-
def query_roots(result_set, relation) # :nodoc:
|
|
86
|
-
@interface.remote_query_roots(result_set, Distributed.format(relation)).each do |t|
|
|
87
|
-
t.remote_interface = self
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# Returns the DRbObject for the remote controller state object
|
|
92
|
-
def state
|
|
93
|
-
remote_constant('State')
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def instance_methods(include_super = false) # :nodoc:
|
|
97
|
-
Interface.instance_methods(false).
|
|
98
|
-
actions.map { |name| "#{name}!" }
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def actions_summary(with_advanced = false)
|
|
102
|
-
methods = @interface.actions
|
|
103
|
-
if !with_advanced
|
|
104
|
-
methods = methods.delete_if { |m| m.description.advanced? }
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
if !methods.empty?
|
|
108
|
-
puts
|
|
109
|
-
desc = methods.map do |p|
|
|
110
|
-
doc = p.description.doc || ["(no description set)"]
|
|
111
|
-
Hash['Name' => "#{p.name}!", 'Description' => doc.join("\n")]
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
ColumnFormatter.from_hashes(desc, STDOUT,
|
|
115
|
-
:header_delimiter => true,
|
|
116
|
-
:column_delimiter => "|",
|
|
117
|
-
:order => %w{Name Description})
|
|
118
|
-
puts
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
nil
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
def actions(with_advanced = false)
|
|
125
|
-
@interface.actions.each do |m|
|
|
126
|
-
next if m.description.advanced? if !with_advanced
|
|
127
|
-
display_action_description(m)
|
|
128
|
-
puts
|
|
129
|
-
end
|
|
130
|
-
nil
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# Standard way to display a set of tasks
|
|
134
|
-
def task_set_to_s(task_set) # :nodoc:
|
|
135
|
-
if task_set.empty?
|
|
136
|
-
return "no tasks"
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
task = task_set.map do |task|
|
|
140
|
-
state_name = %w{pending starting running finishing finished}.find do |state_name|
|
|
141
|
-
task.send("#{state_name}?")
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
since = task.start_time
|
|
145
|
-
lifetime = task.lifetime
|
|
146
|
-
Hash['Task' => task.to_s,
|
|
147
|
-
'State' => state_name,
|
|
148
|
-
'Since' => (since.asctime if since),
|
|
149
|
-
'Lifetime' => (Time.at(lifetime).to_hms if lifetime)
|
|
150
|
-
]
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
io = StringIO.new
|
|
154
|
-
ColumnFormatter.from_hashes(task, STDOUT,
|
|
155
|
-
:header_delimiter => true,
|
|
156
|
-
:column_delimiter => "|",
|
|
157
|
-
:order => %w{Task State Lifetime Since})
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
# Displays information about the plan's missions
|
|
161
|
-
def missions
|
|
162
|
-
missions = find_tasks.mission.to_a
|
|
163
|
-
task_set_to_s(missions)
|
|
164
|
-
nil
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# Displays information about the running tasks
|
|
168
|
-
def running_tasks
|
|
169
|
-
tasks = find_tasks.running.to_a
|
|
170
|
-
task_set_to_s(tasks)
|
|
171
|
-
nil
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
# Displays details about the actions matching 'regex'
|
|
175
|
-
def describe(name, with_advanced = false)
|
|
176
|
-
name = Regexp.new(name)
|
|
177
|
-
m = @interface.actions.find_all { |p| name === p.name }
|
|
178
|
-
|
|
179
|
-
if !with_advanced
|
|
180
|
-
filtered = m.find_all { |m| !m.description.advanced? }
|
|
181
|
-
m = filtered if !filtered.empty?
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
if m.empty?
|
|
185
|
-
puts "no such method"
|
|
186
|
-
else
|
|
187
|
-
m.each do |desc|
|
|
188
|
-
puts
|
|
189
|
-
display_action_description(desc)
|
|
190
|
-
puts
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
nil
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
# Displays a help message
|
|
197
|
-
def help
|
|
198
|
-
puts
|
|
199
|
-
puts "Available Actions"
|
|
200
|
-
puts "================="
|
|
201
|
-
actions_summary
|
|
202
|
-
puts ""
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
puts <<-EOHELP
|
|
206
|
-
each action is started with action_name!(:arg1 => value1, :arg2 => value2, ...)
|
|
207
|
-
and returns the corresponding task object. A message is displayed in the shell
|
|
208
|
-
when the task finishes."
|
|
209
|
-
|
|
210
|
-
Shell Commands
|
|
211
|
-
==============
|
|
212
|
-
Command | Help
|
|
213
|
-
---------------------------------------------------------------------------------------------
|
|
214
|
-
actions_summary(advanced = false) | displays the list of actions with a short documentation |
|
|
215
|
-
actions(advanced = false) | displays details for each available actions |
|
|
216
|
-
describe(regex) | displays details about the actions matching 'regex' |
|
|
217
|
-
missions | displays the set of running missions with their status |
|
|
218
|
-
running_tasks | displays the set of running tasks with their status |
|
|
219
|
-
| |
|
|
220
|
-
help | this help message |
|
|
221
|
-
|
|
222
|
-
EOHELP
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
# Standard display of an action description. +m+ is a PlanningMethod
|
|
226
|
-
# object.
|
|
227
|
-
def display_action_description(m) # :nodoc:
|
|
228
|
-
args = m.description.arguments.
|
|
229
|
-
sort_by { |arg_desc| arg_desc.name }
|
|
230
|
-
|
|
231
|
-
first = true
|
|
232
|
-
args_summary = args.map do |arg_desc|
|
|
233
|
-
name = arg_desc.name
|
|
234
|
-
is_required = arg_desc.required
|
|
235
|
-
format = if is_required then "%s"
|
|
236
|
-
else "[%s]"
|
|
237
|
-
end
|
|
238
|
-
text = format % ["#{", " if !first}:#{name} => #{name}"]
|
|
239
|
-
first = false
|
|
240
|
-
text
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
args_table = args.
|
|
244
|
-
map do |arg_desc|
|
|
245
|
-
Hash['Argument' => arg_desc.name,
|
|
246
|
-
'Description' => (arg_desc.doc || "(no description set)")]
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
method_doc = m.description.doc || [""]
|
|
250
|
-
puts "#{m.name}! #{args_summary.join("")}\n#{method_doc.join("\n")}"
|
|
251
|
-
if m.description.arguments.empty?
|
|
252
|
-
puts "No arguments"
|
|
253
|
-
else
|
|
254
|
-
ColumnFormatter.from_hashes(args_table, STDOUT,
|
|
255
|
-
:left_padding => " ",
|
|
256
|
-
:header_delimiter => true,
|
|
257
|
-
:column_delimiter => "|",
|
|
258
|
-
:order => %w{Argument Description})
|
|
259
|
-
end
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
def method_missing(m, *args) # :nodoc:
|
|
264
|
-
result = @interface.send(m, *args)
|
|
265
|
-
if result.kind_of?(RemoteObjectProxy)
|
|
266
|
-
result.remote_interface = @interface
|
|
267
|
-
end
|
|
268
|
-
result
|
|
269
|
-
|
|
270
|
-
rescue Exception => e
|
|
271
|
-
raise e, e.message, Roby.filter_backtrace(e.backtrace)
|
|
272
|
-
end
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
# This class is used to interface with the Roby event loop and plan. It is the
|
|
276
|
-
# main front object when accessing a Roby core remotely
|
|
277
|
-
class Interface
|
|
278
|
-
# This module defines the hooks needed to plug Interface objects onto
|
|
279
|
-
# ExecutionEngine
|
|
280
|
-
module GatherExceptions
|
|
281
|
-
# The set of Interface objects that have been registered to us
|
|
282
|
-
attribute(:interfaces) { Array.new }
|
|
283
|
-
|
|
284
|
-
# Register a new Interface object so that it gets feedback information
|
|
285
|
-
# from the running controller.
|
|
286
|
-
def register_interface(iface)
|
|
287
|
-
Roby.synchronize do
|
|
288
|
-
interfaces << iface
|
|
289
|
-
end
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
# Pushes a exception message to all the already registered remote interfaces.
|
|
293
|
-
def push_exception_message(name, error, tasks)
|
|
294
|
-
Roby.synchronize do
|
|
295
|
-
msg = Roby.format_exception(error.exception).join("\n")
|
|
296
|
-
msg << "\nThe following tasks have been killed:\n"
|
|
297
|
-
tasks.each do |t|
|
|
298
|
-
msg << " "
|
|
299
|
-
if error.exception.involved_plan_object?(t)
|
|
300
|
-
msg << "#{t.class}:0x#{t.address.to_s(16)}\n"
|
|
301
|
-
else
|
|
302
|
-
PP.pp(t, msg)
|
|
303
|
-
end
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
interfaces.each do |iface|
|
|
307
|
-
iface.pending_messages << msg
|
|
308
|
-
end
|
|
309
|
-
end
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
# Pushes an exception information on all remote interfaces connected to us
|
|
313
|
-
def handled_exception(error, task)
|
|
314
|
-
super if defined? super
|
|
315
|
-
push_exception_message("exception", error, [task])
|
|
316
|
-
end
|
|
317
|
-
|
|
318
|
-
# Pushes an exception information on all remote interfaces connected to us
|
|
319
|
-
def fatal_exception(error, tasks)
|
|
320
|
-
super if defined? super
|
|
321
|
-
push_exception_message("fatal exception", error, tasks)
|
|
322
|
-
end
|
|
323
|
-
end
|
|
324
|
-
|
|
325
|
-
# The engine this interface is tied to
|
|
326
|
-
attr_reader :engine
|
|
327
|
-
# The set of pending messages that are to be displayed on the remote interface
|
|
328
|
-
attr_reader :pending_messages
|
|
329
|
-
# Creates a local server for a remote interface, acting on +control+
|
|
330
|
-
def initialize(engine)
|
|
331
|
-
@pending_messages = Queue.new
|
|
332
|
-
@engine = engine
|
|
333
|
-
|
|
334
|
-
engine.extend GatherExceptions
|
|
335
|
-
engine.register_interface self
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
# Clear the current plan: remove all running and permanent tasks.
|
|
339
|
-
def clear
|
|
340
|
-
engine.execute do
|
|
341
|
-
plan.missions.dup.each { |t| plan.discard(t) }
|
|
342
|
-
plan.permanent_tasks.dup.each { |t| plan.auto(t) }
|
|
343
|
-
plan.permanent_events.dup.each { |t| plan.auto(t) }
|
|
344
|
-
end
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
# Make the Roby event loop quit
|
|
348
|
-
def stop; engine.quit; nil end
|
|
349
|
-
# The Roby plan
|
|
350
|
-
def plan; engine.plan end
|
|
351
|
-
|
|
352
|
-
# Synchronously call +m+ on +tasks+ with the given arguments. This,
|
|
353
|
-
# along with the implementation of RemoteInterface#method_missing,
|
|
354
|
-
# ensures that no interactive operations are performed outside the
|
|
355
|
-
# control thread.
|
|
356
|
-
def call(task, m, *args)
|
|
357
|
-
engine.execute do
|
|
358
|
-
if m.to_s =~ /!$/
|
|
359
|
-
event_name = $`
|
|
360
|
-
# Check if the called event is terminal. If it is the case,
|
|
361
|
-
# discard the task before calling it, and make sure the user
|
|
362
|
-
# will get a message
|
|
363
|
-
#
|
|
364
|
-
if task.event(event_name).terminal?
|
|
365
|
-
plan.unmark_mission(task)
|
|
366
|
-
task.on(:stop) { |ev| pending_messages << "task #{ev.task} stopped by user request" }
|
|
367
|
-
else
|
|
368
|
-
task.on(event_name) { |ev| pending_messages << "done emitting #{ev.generator}" }
|
|
369
|
-
end
|
|
370
|
-
end
|
|
371
|
-
|
|
372
|
-
task.send(m, *args)
|
|
373
|
-
end
|
|
374
|
-
end
|
|
375
|
-
|
|
376
|
-
def find_tasks(model = nil, args = nil)
|
|
377
|
-
plan.find_tasks(model, args)
|
|
378
|
-
end
|
|
379
|
-
|
|
380
|
-
# For using Query on Interface objects
|
|
381
|
-
def remote_query_result_set(m_query) # :nodoc:
|
|
382
|
-
plan.query_result_set(m_query.to_query(plan)).
|
|
383
|
-
map { |t| RemoteObjectProxy.new(t) }
|
|
384
|
-
end
|
|
385
|
-
# For using Query on Interface objects
|
|
386
|
-
def remote_query_roots(result_set, m_relation) # :nodoc:
|
|
387
|
-
plan.query_roots(result_set, m_relation.proxy(nil)).
|
|
388
|
-
map { |t| RemoteObjectProxy.new(t) }
|
|
389
|
-
end
|
|
390
|
-
|
|
391
|
-
# Returns a DRbObject on the given named constant. Use this to get a
|
|
392
|
-
# remote interface to a given object, not taking into account its
|
|
393
|
-
# 'marshallability'
|
|
394
|
-
def remote_constant(name)
|
|
395
|
-
DRbObject.new(name.to_s.constantize)
|
|
396
|
-
end
|
|
397
|
-
|
|
398
|
-
# Reload the Roby framework code
|
|
399
|
-
#
|
|
400
|
-
# WARNING: does not work for now
|
|
401
|
-
def reload
|
|
402
|
-
Roby.app.reload
|
|
403
|
-
nil
|
|
404
|
-
end
|
|
405
|
-
|
|
406
|
-
# Returns the set of task models as DRobyTaskModel objects. The standard
|
|
407
|
-
# Roby task models are excluded.
|
|
408
|
-
def task_models
|
|
409
|
-
task_models = []
|
|
410
|
-
engine.execute do
|
|
411
|
-
ObjectSpace.each_object(Class) do |obj|
|
|
412
|
-
if obj <= Roby::Task && obj.name !~ /^Roby::/
|
|
413
|
-
task_models << obj
|
|
414
|
-
end
|
|
415
|
-
end
|
|
416
|
-
end
|
|
417
|
-
task_models.map { |t| t.droby_dump(nil) }
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
# Returns the set of PlanningMethod objects that describe the methods
|
|
421
|
-
# exported in the application's planners.
|
|
422
|
-
def actions
|
|
423
|
-
Roby.app.planners.
|
|
424
|
-
map do |p|
|
|
425
|
-
p.planning_methods
|
|
426
|
-
end.flatten.sort_by { |p| p.name }
|
|
427
|
-
end
|
|
428
|
-
|
|
429
|
-
# Called every once in a while by RemoteInterface to read and clear the
|
|
430
|
-
# set of pending messages.
|
|
431
|
-
def poll_messages
|
|
432
|
-
result = []
|
|
433
|
-
while !pending_messages.empty?
|
|
434
|
-
msg = pending_messages.pop
|
|
435
|
-
result << msg
|
|
436
|
-
end
|
|
437
|
-
result
|
|
438
|
-
end
|
|
439
|
-
|
|
440
|
-
# Tries to find a planner method which matches +name+ with +args+. If it finds
|
|
441
|
-
# one, creates a task planned by a planning task and yields both
|
|
442
|
-
def method_missing(name, *args)
|
|
443
|
-
if name.to_s =~ /!$/
|
|
444
|
-
name = $`.to_sym
|
|
445
|
-
else
|
|
446
|
-
super
|
|
447
|
-
end
|
|
448
|
-
|
|
449
|
-
if args.size > 1
|
|
450
|
-
raise ArgumentError, "wrong number of arguments (#{args.size} for 1) in #{name}!"
|
|
451
|
-
end
|
|
452
|
-
|
|
453
|
-
options = args.first || {}
|
|
454
|
-
task, planner = Robot.prepare_action(name, options)
|
|
455
|
-
begin
|
|
456
|
-
engine.wait_until(planner.event(:success)) do
|
|
457
|
-
plan.add_mission(task)
|
|
458
|
-
yield(task, planner) if block_given?
|
|
459
|
-
end
|
|
460
|
-
rescue Roby::UnreachableEvent
|
|
461
|
-
raise RuntimeError, "cannot start #{name}: #{planner.terminal_event.context.first}"
|
|
462
|
-
end
|
|
463
|
-
|
|
464
|
-
engine.execute do
|
|
465
|
-
result = planner.result
|
|
466
|
-
result.on(:failed) { |ev| pending_messages << "task #{ev.task} failed" }
|
|
467
|
-
result.on(:success) { |ev| pending_messages << "task #{ev.task} finished successfully" }
|
|
468
|
-
RemoteObjectProxy.new(result)
|
|
469
|
-
end
|
|
470
|
-
end
|
|
471
124
|
end
|
|
472
125
|
end
|
|
473
126
|
|
|
474
|
-
|
|
127
|
+
require 'websocket'
|
|
128
|
+
require 'utilrb/hash'
|
|
129
|
+
require 'roby/interface/job'
|
|
130
|
+
require 'roby/interface/exceptions'
|
|
131
|
+
require 'roby/interface/command_argument'
|
|
132
|
+
require 'roby/interface/command'
|
|
133
|
+
require 'roby/interface/command_library'
|
|
134
|
+
require 'roby/interface/interface'
|
|
135
|
+
require 'roby/interface/droby_channel'
|
|
136
|
+
require 'roby/interface/server'
|
|
137
|
+
require 'roby/interface/client'
|
|
138
|
+
require 'roby/interface/subcommand_client'
|
|
139
|
+
require 'roby/interface/tcp'
|
|
140
|
+
require 'roby/interface/shell_client'
|
|
141
|
+
require 'roby/interface/shell_subcommand'
|