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/log/console.rb
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
require 'utilrb/time/to_hms'
|
|
2
|
-
require 'roby/log/logger'
|
|
3
|
-
|
|
4
|
-
module Roby::Log
|
|
5
|
-
# A logger object which dumps events in a human-readable form to an IO object.
|
|
6
|
-
class ConsoleLogger
|
|
7
|
-
def splat?; false end
|
|
8
|
-
def self.filter_names(name)
|
|
9
|
-
name.gsub(/Roby::(?:Genom::)?/, '')
|
|
10
|
-
end
|
|
11
|
-
# Name of an event generator source
|
|
12
|
-
def self.gen_source(gen)
|
|
13
|
-
if gen.respond_to?(:task) then gen.task.name
|
|
14
|
-
else 'toplevel'
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
# Human readable name for event generators
|
|
18
|
-
def self.gen_name(gen)
|
|
19
|
-
if gen.respond_to?(:symbol) then "[#{gen.symbol}]"
|
|
20
|
-
else gen.name
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
attr_reader :io, :columns
|
|
25
|
-
def initialize(io)
|
|
26
|
-
@io = io
|
|
27
|
-
@columns = Hash.new { |h, k| h[k] = Array.new }
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def arg_to_s(arg)
|
|
31
|
-
case arg
|
|
32
|
-
when Time then Time.at(arg - @reftime).to_hms
|
|
33
|
-
when Array then arg.map { |v| arg_to_s(v) }.to_s
|
|
34
|
-
when Hash then arg.map { |k, v| [arg_to_s(k), arg_to_s(v)].join(" => ") }.to_s
|
|
35
|
-
else arg.to_s
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def logs_message?(m); true end
|
|
41
|
-
def close; end
|
|
42
|
-
def dump_method(m, time, *args) # :nodoc:
|
|
43
|
-
@reftime ||= time
|
|
44
|
-
|
|
45
|
-
args.map! { |a| arg_to_s(a) }
|
|
46
|
-
args.map!(&ConsoleLogger.method(:filter_names))
|
|
47
|
-
args.unshift(m).
|
|
48
|
-
unshift(Time.at(time - @reftime).to_hms)
|
|
49
|
-
|
|
50
|
-
columns = self.columns[m]
|
|
51
|
-
args.each_with_index do |str, i|
|
|
52
|
-
str = str.to_s
|
|
53
|
-
if !columns[i] || (str.length > columns[i])
|
|
54
|
-
columns[i] = str.length
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
args.each_with_index do |arg, i|
|
|
59
|
-
w = columns[i]
|
|
60
|
-
io << ("%-#{w}s " % arg)
|
|
61
|
-
end
|
|
62
|
-
io << "\n"
|
|
63
|
-
rescue
|
|
64
|
-
STDERR.puts "#{time} #{m} #{args}"
|
|
65
|
-
raise
|
|
66
|
-
end
|
|
67
|
-
private :display
|
|
68
|
-
|
|
69
|
-
Roby::Log.each_hook do |klass, m|
|
|
70
|
-
define_method(m) { |time, args| dump_method(m, time, args) }
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
data/lib/roby/log/data_stream.rb
DELETED
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
require 'roby/log'
|
|
2
|
-
module Roby::Log
|
|
3
|
-
# == Displaying log data
|
|
4
|
-
#
|
|
5
|
-
# Data display is done in three objects:
|
|
6
|
-
# * a DataStream object which is the data source itself. It gives
|
|
7
|
-
# information about available samples, time of samples and extracts raw
|
|
8
|
-
# data. An example of data stream is the EventStream object which reads
|
|
9
|
-
# Roby's event logs, returning one cycle worth of data at a time.
|
|
10
|
-
# * a DataDecoder object which takes the raw data returned by a DataStream
|
|
11
|
-
# object and turns it into a more usable representation. For instance, the PlanBuilder
|
|
12
|
-
# decoder takes an event stream from an EventStream object and rebuilds a plan-like
|
|
13
|
-
# structure from it.
|
|
14
|
-
# * a display which takes its information from the decoder. The RelationDisplay displays
|
|
15
|
-
# the information included in the PlanRebuilder decoder and displays it as a graph.
|
|
16
|
-
class DataStream
|
|
17
|
-
# The stream ID, which has to be unique on a single Roby core
|
|
18
|
-
attr_reader :id
|
|
19
|
-
# The stream name. A [name, type] has to be globally unique
|
|
20
|
-
attr_reader :name
|
|
21
|
-
# The stream type, as a string.
|
|
22
|
-
attr_reader :type
|
|
23
|
-
|
|
24
|
-
def self.open(basename)
|
|
25
|
-
stream = new(basename)
|
|
26
|
-
stream.open
|
|
27
|
-
|
|
28
|
-
if block_given?
|
|
29
|
-
begin
|
|
30
|
-
yield(stream)
|
|
31
|
-
ensure
|
|
32
|
-
stream.logfile.close
|
|
33
|
-
end
|
|
34
|
-
else
|
|
35
|
-
stream
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def initialize(name, type)
|
|
41
|
-
@id = object_id
|
|
42
|
-
@name = name
|
|
43
|
-
@type = type
|
|
44
|
-
@range = [nil, nil]
|
|
45
|
-
|
|
46
|
-
@decoders = []
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def each_sample
|
|
50
|
-
while sample = read_and_decode
|
|
51
|
-
yield(sample)
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def to_s; "#{name} [#{type}]" end
|
|
56
|
-
def open; end
|
|
57
|
-
def close; end
|
|
58
|
-
|
|
59
|
-
def has_sample?; false end
|
|
60
|
-
attr_predicate :reinit, true
|
|
61
|
-
def reinit?; end
|
|
62
|
-
def reinit!
|
|
63
|
-
@range = [nil, nil]
|
|
64
|
-
@reinit = false
|
|
65
|
-
|
|
66
|
-
clear
|
|
67
|
-
end
|
|
68
|
-
def read_all; end
|
|
69
|
-
|
|
70
|
-
def read_and_decode
|
|
71
|
-
if raw = read
|
|
72
|
-
self.class.decode(raw)
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# The [min, max] range of available samples. Initially
|
|
77
|
-
# [nil, nil]
|
|
78
|
-
attr_reader :range
|
|
79
|
-
|
|
80
|
-
# The set of decoders attached to this stream
|
|
81
|
-
attr_reader :decoders
|
|
82
|
-
|
|
83
|
-
def clear
|
|
84
|
-
decoders.each { |dec| dec.clear }
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# True if there is at least one display attached to this data stream
|
|
88
|
-
def displayed?
|
|
89
|
-
decoders.any? do |dec|
|
|
90
|
-
!dec.displays.empty?
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
# Reuse or creates a decoder of the given class for this data
|
|
95
|
-
# stream
|
|
96
|
-
def decoder(klass)
|
|
97
|
-
if dec = decoders.find { |d| d.kind_of?(klass) }
|
|
98
|
-
dec
|
|
99
|
-
else
|
|
100
|
-
decoders << (dec = klass.new(name))
|
|
101
|
-
dec.stream = self
|
|
102
|
-
added_decoder(dec)
|
|
103
|
-
dec
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def added_decoder(dec)
|
|
108
|
-
super if defined? super
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
# Do a read and decode the data
|
|
112
|
-
#
|
|
113
|
-
# It returns false if no decoders have found interesting updates in the
|
|
114
|
-
# decoded data, and true otherwise. The method relies on the decoder's
|
|
115
|
-
# #process method to return true/false when required.
|
|
116
|
-
#
|
|
117
|
-
# See DataDecoder#process
|
|
118
|
-
def advance
|
|
119
|
-
if data = read_and_decode
|
|
120
|
-
!decoders.find_all do |dec|
|
|
121
|
-
dec.process(data)
|
|
122
|
-
end.empty?
|
|
123
|
-
else
|
|
124
|
-
raise EOFError
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
def init(data)
|
|
129
|
-
self.class.init(data)
|
|
130
|
-
end
|
|
131
|
-
def decode(data)
|
|
132
|
-
self.class.decode(data)
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
# Displays may have the ability to not display a per-cycle information,
|
|
136
|
-
# but to add information as it is coming over. This call asks them to
|
|
137
|
-
# remove the information integrated until now.
|
|
138
|
-
#
|
|
139
|
-
# It forwards the call to the decoders' #clear_integrated call. These
|
|
140
|
-
# methods should return true if a change has been needed on any of their
|
|
141
|
-
# display, and false otherwise.
|
|
142
|
-
def clear_integrated
|
|
143
|
-
!decoders.find_all do |decoder|
|
|
144
|
-
decoder.clear_integrated
|
|
145
|
-
end.empty?
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
# Update the displays
|
|
149
|
-
#
|
|
150
|
-
# It returns false if all decoders have reported that no display update
|
|
151
|
-
# was required, and true otherwise. The method relies on the decoder's
|
|
152
|
-
# #display method to return true/false when required.
|
|
153
|
-
#
|
|
154
|
-
# See DataDecoder#display
|
|
155
|
-
def display
|
|
156
|
-
decoders.each do |decoder|
|
|
157
|
-
decoder.display
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def ==(other)
|
|
162
|
-
other.kind_of?(DataStream) &&
|
|
163
|
-
name == other.name &&
|
|
164
|
-
type == other.type
|
|
165
|
-
end
|
|
166
|
-
def eql?(other); self == other end
|
|
167
|
-
def hash; [name, type].hash end
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
# In the data flow model we're using, a data decoder gets data from a
|
|
171
|
-
# DataStream object and builds a representation that can be used by
|
|
172
|
-
# displays.
|
|
173
|
-
class DataDecoder
|
|
174
|
-
# The set of displays attached to this decoder
|
|
175
|
-
attr_reader :displays
|
|
176
|
-
# The decoder name
|
|
177
|
-
attr_reader :name
|
|
178
|
-
|
|
179
|
-
# The DataStream object we're getting our data from
|
|
180
|
-
attr_accessor :stream
|
|
181
|
-
|
|
182
|
-
def initialize(name)
|
|
183
|
-
@name = name
|
|
184
|
-
@displays = []
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
# Clear the stream data
|
|
188
|
-
def clear
|
|
189
|
-
displays.each { |d| d.clear }
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
# Displays may have the ability to not display a per-cycle information,
|
|
193
|
-
# but to add information as it is coming over. This call asks them to
|
|
194
|
-
# remove the information integrated until now.
|
|
195
|
-
#
|
|
196
|
-
# It forwards the call to the displays' #clear_integrated call(if any). These
|
|
197
|
-
# methods should return true if a change has been needed on any of their
|
|
198
|
-
# display, and false otherwise.
|
|
199
|
-
def clear_integrated
|
|
200
|
-
!displays.find_all do |display|
|
|
201
|
-
if display.respond_to?(:clear_integrated)
|
|
202
|
-
display.clear_integrated
|
|
203
|
-
end
|
|
204
|
-
end.empty?
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
# Updates the displays that are associated with this decoder. Returns
|
|
208
|
-
# true if one of the displays have been changed, and false otherwise.
|
|
209
|
-
#
|
|
210
|
-
# It relies on the display's #update method to return true if something
|
|
211
|
-
# has changed on the display and false otherwise.
|
|
212
|
-
def display
|
|
213
|
-
!displays.find_all do |display|
|
|
214
|
-
display.update
|
|
215
|
-
end.empty?
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
# This module gets mixed-in the display classes. It creates the necessary
|
|
220
|
-
# stream => decoder => display link, reusing (if possible) a decoder that
|
|
221
|
-
# already exists.
|
|
222
|
-
#
|
|
223
|
-
# One should use it that way:
|
|
224
|
-
#
|
|
225
|
-
# class Display
|
|
226
|
-
# include DataDisplay
|
|
227
|
-
# decoder DecoderClass
|
|
228
|
-
# end
|
|
229
|
-
#
|
|
230
|
-
# Then, one can do
|
|
231
|
-
# display = Display.new
|
|
232
|
-
# display.stream = data_stream
|
|
233
|
-
#
|
|
234
|
-
# and leave the rest to the DataDisplay implementation.
|
|
235
|
-
module DataDisplay
|
|
236
|
-
module ClassExtension
|
|
237
|
-
def decoder(new_type = nil)
|
|
238
|
-
if new_type
|
|
239
|
-
@decoder_class = new_type
|
|
240
|
-
else
|
|
241
|
-
@decoder_class
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
# The decoder object. That object gets data from a DataStream object and
|
|
247
|
-
# decodes it into the format required by the display.
|
|
248
|
-
#
|
|
249
|
-
# Examples: PlanRebuilder
|
|
250
|
-
attr_reader :decoder
|
|
251
|
-
attr_reader :main
|
|
252
|
-
|
|
253
|
-
# The configuration UI object. Usually a subclass of Qt::Widget
|
|
254
|
-
attr_accessor :config_ui
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
def splat? #:nodoc:
|
|
258
|
-
true
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
# Sets the data stream that this display listens to. It creates or gets
|
|
262
|
-
# the decoder that is necessary between the raw stream and the display
|
|
263
|
-
def stream=(data_stream)
|
|
264
|
-
if decoder
|
|
265
|
-
clear
|
|
266
|
-
end
|
|
267
|
-
|
|
268
|
-
@decoder = data_stream.decoder(self.class.decoder)
|
|
269
|
-
decoder.displays << self
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
def clear; end
|
|
273
|
-
end
|
|
274
|
-
end
|
|
275
|
-
|
data/lib/roby/log/dot.rb
DELETED
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
require 'roby/distributed/protocol'
|
|
2
|
-
require 'roby/log'
|
|
3
|
-
require 'tempfile'
|
|
4
|
-
require 'fileutils'
|
|
5
|
-
|
|
6
|
-
module Roby
|
|
7
|
-
module LoggedPlan
|
|
8
|
-
attr_accessor :layout_level
|
|
9
|
-
def all_events(display)
|
|
10
|
-
known_tasks.inject(free_events.dup) do |events, task|
|
|
11
|
-
if display.displayed?(task)
|
|
12
|
-
events.merge(task.events.values.to_value_set)
|
|
13
|
-
else
|
|
14
|
-
events
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
attr_reader :dot_id
|
|
20
|
-
def to_dot(display, io, level)
|
|
21
|
-
@layout_level = level
|
|
22
|
-
id = io.layout_id(self)
|
|
23
|
-
@dot_id = "plan_#{id}"
|
|
24
|
-
io << "subgraph cluster_#{dot_id} {\n"
|
|
25
|
-
(known_tasks | finalized_tasks | free_events | finalized_events).
|
|
26
|
-
each do |obj|
|
|
27
|
-
obj.to_dot(display, io) if display.displayed?(obj)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
io << "};\n"
|
|
31
|
-
|
|
32
|
-
transactions.each do |trsc|
|
|
33
|
-
trsc.to_dot(display, io, level + 1)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
relations_to_dot(display, io, Roby::Log::RelationsDisplay.all_task_relations, known_tasks)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def each_displayed_relation(display, relations, objects)
|
|
40
|
-
relations.each do |rel|
|
|
41
|
-
next unless display.relation_enabled?(rel)
|
|
42
|
-
|
|
43
|
-
objects.each do |from|
|
|
44
|
-
next unless display.displayed?(from)
|
|
45
|
-
unless display[from]
|
|
46
|
-
Roby::Log.warn "no display item for #{from} in #each_displayed_relation"
|
|
47
|
-
next
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
from.each_child_object(rel) do |to|
|
|
51
|
-
next unless display.displayed?(to)
|
|
52
|
-
unless display[to]
|
|
53
|
-
Roby::Log.warn "no display item for child in #{from} <#{rel}> #{to} in #each_displayed_relation"
|
|
54
|
-
next
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
yield(rel, from, to)
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def relations_to_dot(display, io, all_relations, objects)
|
|
64
|
-
each_displayed_relation(display, all_relations, objects) do |rel, from, to|
|
|
65
|
-
from_id, to_id = from.dot_id, to.dot_id
|
|
66
|
-
if from_id && to_id
|
|
67
|
-
io << " #{from_id} -> #{to_id}\n"
|
|
68
|
-
else
|
|
69
|
-
Roby::Log.warn "ignoring #{from}(#{from.object_id} #{from_id}) -> #{to}(#{to.object_id} #{to_id}) in #{rel} in #{caller(1).join("\n ")}"
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def layout_relations(positions, display, all_relations, objects)
|
|
75
|
-
each_displayed_relation(display, all_relations, objects) do |rel, from, to|
|
|
76
|
-
display.task_relation(from, to, rel, from[to, rel])
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# The distance from the root plan
|
|
81
|
-
attr_reader :depth
|
|
82
|
-
|
|
83
|
-
# Computes the plan depths and max_depth for this plan and all its
|
|
84
|
-
# children. +depth+ is this plan depth
|
|
85
|
-
#
|
|
86
|
-
# Returns max_depth
|
|
87
|
-
def compute_depth(depth)
|
|
88
|
-
@depth = depth
|
|
89
|
-
child_depth = transactions.
|
|
90
|
-
map { |trsc| trsc.compute_depth(depth + 1) }.
|
|
91
|
-
max
|
|
92
|
-
child_depth || depth
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def apply_layout(bounding_rects, positions, display, max_depth = nil)
|
|
96
|
-
max_depth ||= compute_depth(0)
|
|
97
|
-
|
|
98
|
-
if rect = bounding_rects[dot_id]
|
|
99
|
-
item = display[self]
|
|
100
|
-
rect[2] *= 1.2
|
|
101
|
-
rect[3] *= 1.2
|
|
102
|
-
item.z_value = Log::PLAN_LAYER + depth - max_depth
|
|
103
|
-
item.set_rect *rect
|
|
104
|
-
else
|
|
105
|
-
Roby::Log.warn "no bounding rectangle for #{self} (#{dot_id})"
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
(known_tasks | finalized_tasks | free_events | finalized_events).
|
|
110
|
-
each do |obj|
|
|
111
|
-
obj.apply_layout(positions, display)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
transactions.each do |trsc|
|
|
115
|
-
trsc.apply_layout(bounding_rects, positions, display, max_depth)
|
|
116
|
-
end
|
|
117
|
-
layout_relations(positions, display, Roby::Log::RelationsDisplay.all_task_relations, known_tasks)
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
module LoggedPlanObject
|
|
122
|
-
attr_reader :dot_id
|
|
123
|
-
|
|
124
|
-
def dot_label(display); display_name(display) end
|
|
125
|
-
|
|
126
|
-
# Adds the dot definition for this object in +io+
|
|
127
|
-
def to_dot(display, io)
|
|
128
|
-
return unless display.displayed?(self)
|
|
129
|
-
@dot_id ||= "plan_object_#{io.layout_id(self)}"
|
|
130
|
-
io << " #{dot_id}[label=\"#{dot_label(display).split("\n").join('\n')}\"];\n"
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# Applys the layout in +positions+ to this particular object
|
|
134
|
-
def apply_layout(positions, display)
|
|
135
|
-
return unless display.displayed?(self)
|
|
136
|
-
if p = positions[dot_id]
|
|
137
|
-
raise "no graphics for #{self}" unless graphics_item = display[self]
|
|
138
|
-
graphics_item.pos = p
|
|
139
|
-
else
|
|
140
|
-
STDERR.puts "WARN: #{self} has not been layouted"
|
|
141
|
-
end
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
class PlanObject::DRoby
|
|
146
|
-
include LoggedPlanObject
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
class TaskEventGenerator::DRoby
|
|
150
|
-
def dot_label(display); symbol.to_s end
|
|
151
|
-
def dot_id; task.dot_id end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
module LoggedTask
|
|
155
|
-
include LoggedPlanObject
|
|
156
|
-
def dot_label(display)
|
|
157
|
-
event_names = events.values.find_all { |ev| display.displayed?(ev) }.
|
|
158
|
-
map { |ev| ev.dot_label(display) }.
|
|
159
|
-
join(" ")
|
|
160
|
-
|
|
161
|
-
own = super
|
|
162
|
-
if own.size > event_names.size then own
|
|
163
|
-
else event_names
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
module Log
|
|
169
|
-
class Layout
|
|
170
|
-
@@bkpindex = 0
|
|
171
|
-
|
|
172
|
-
def layout_id(object)
|
|
173
|
-
id = Object.address_from_id(object.object_id).to_s
|
|
174
|
-
object_ids[id] = object
|
|
175
|
-
id
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
attribute(:object_ids) { Hash.new }
|
|
179
|
-
attr_reader :dot_input
|
|
180
|
-
|
|
181
|
-
def <<(string); dot_input << string end
|
|
182
|
-
def layout(display, plan)
|
|
183
|
-
@@index ||= 0
|
|
184
|
-
@@index += 1
|
|
185
|
-
|
|
186
|
-
# Dot input file
|
|
187
|
-
@dot_input = Tempfile.new("roby_dot")
|
|
188
|
-
# Dot output file
|
|
189
|
-
dot_output = Tempfile.new("roby_layout")
|
|
190
|
-
|
|
191
|
-
dot_input << "digraph relations {\n"
|
|
192
|
-
display.layout_options.each do |k, v|
|
|
193
|
-
dot_input << " #{k}=#{v};\n"
|
|
194
|
-
end
|
|
195
|
-
plan.to_dot(display, self, 0)
|
|
196
|
-
|
|
197
|
-
# Take the signalling into account for the layout
|
|
198
|
-
display.propagated_events.each do |_, sources, to, _|
|
|
199
|
-
sources.each do |from|
|
|
200
|
-
from_id, to_id = from.dot_id, to.dot_id
|
|
201
|
-
if from_id && to_id
|
|
202
|
-
dot_input << " #{from.dot_id} -> #{to.dot_id}\n"
|
|
203
|
-
end
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
dot_input << "\n};"
|
|
208
|
-
dot_input.flush
|
|
209
|
-
|
|
210
|
-
# Make sure the GUI keeps being updated while dot is processing
|
|
211
|
-
FileUtils.cp dot_input.path, "/tmp/dot-input-#{@@index}.dot"
|
|
212
|
-
system("#{display.layout_method} #{dot_input.path} > #{dot_output.path}")
|
|
213
|
-
#pid = fork do
|
|
214
|
-
# exec("#{display.layout_method} #{dot_input.path} > #{dot_output.path}")
|
|
215
|
-
#end
|
|
216
|
-
#while !Process.waitpid(pid, Process::WNOHANG)
|
|
217
|
-
# if Qt::Application.has_pending_events
|
|
218
|
-
# Qt::Application.process_events
|
|
219
|
-
# else
|
|
220
|
-
# sleep(0.05)
|
|
221
|
-
# end
|
|
222
|
-
#end
|
|
223
|
-
FileUtils.cp dot_output.path, "/tmp/dot-output-#{@@index}.dot"
|
|
224
|
-
|
|
225
|
-
# Load only task bounding boxes from dot, update arrows later
|
|
226
|
-
current_graph_id = nil
|
|
227
|
-
bounding_rects = Hash.new
|
|
228
|
-
object_pos = Hash.new
|
|
229
|
-
lines = File.open(dot_output.path) { |io| io.readlines }
|
|
230
|
-
full_line = ""
|
|
231
|
-
lines.each do |line|
|
|
232
|
-
line.chomp!
|
|
233
|
-
full_line << line
|
|
234
|
-
if line[-1] == ?\\
|
|
235
|
-
full_line.chop!
|
|
236
|
-
next
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
case full_line
|
|
240
|
-
when /((?:\w+_)+\d+) \[.*pos="(\d+),(\d+)"/
|
|
241
|
-
object_pos[$1] = Qt::PointF.new(Integer($2), Integer($3))
|
|
242
|
-
when /subgraph cluster_(plan_\d+)/
|
|
243
|
-
current_graph_id = $1
|
|
244
|
-
when /graph \[bb="(\d+),(\d+),(\d+),(\d+)"\]/
|
|
245
|
-
bb = [$1, $2, $3, $4].map do |c|
|
|
246
|
-
c = Integer(c)
|
|
247
|
-
end
|
|
248
|
-
bounding_rects[current_graph_id] = [bb[0], bb[1], bb[2] - bb[0], bb[3] - bb[1]]
|
|
249
|
-
end
|
|
250
|
-
full_line = ""
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
graph_bb = bounding_rects.delete(nil)
|
|
254
|
-
bounding_rects.each_value do |coords|
|
|
255
|
-
coords[0] -= graph_bb[0]
|
|
256
|
-
coords[1] = graph_bb[1] - coords[1] - coords[3]
|
|
257
|
-
end
|
|
258
|
-
object_pos.each do |id, pos|
|
|
259
|
-
pos.x -= graph_bb[0]
|
|
260
|
-
pos.y = graph_bb[1] - pos.y
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
@display = display
|
|
264
|
-
@plan = plan
|
|
265
|
-
@object_pos = object_pos
|
|
266
|
-
@bounding_rects = bounding_rects
|
|
267
|
-
|
|
268
|
-
ensure
|
|
269
|
-
dot_input.close! if dot_input
|
|
270
|
-
dot_output.close! if dot_output
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
attr_reader :bounding_rects, :object_pos, :display, :plan
|
|
274
|
-
def apply
|
|
275
|
-
plan.apply_layout(bounding_rects, object_pos, display)
|
|
276
|
-
end
|
|
277
|
-
end
|
|
278
|
-
end
|
|
279
|
-
end
|