roby 0.8.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.deep-cover.rb +3 -0
- data/.gitattributes +1 -0
- data/.gitignore +24 -0
- data/.simplecov +10 -0
- data/.travis.yml +17 -0
- data/.yardopts +4 -0
- data/Gemfile +15 -0
- data/README.md +11 -0
- data/Rakefile +47 -177
- data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
- data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
- data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
- data/benchmark/{genom.rb → attic/genom.rb} +0 -0
- data/benchmark/attic/transactions.rb +62 -0
- data/benchmark/plan_basic_operations.rb +28 -0
- data/benchmark/relations/graph.rb +63 -0
- data/benchmark/ruby/identity.rb +18 -0
- data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
- data/benchmark/ruby/yield_vs_block.rb +35 -0
- data/benchmark/run +5 -0
- data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
- data/benchmark/transactions.rb +99 -51
- data/bin/roby +38 -197
- data/bin/roby-display +14 -0
- data/bin/roby-log +3 -176
- data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
- data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
- data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
- data/doc/guide/{src → attic}/abstraction/index.page +1 -1
- data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
- data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
- data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
- data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
- data/doc/guide/attic/cycle/error_handling.page +98 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
- data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
- data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
- data/doc/guide/{src → attic}/cycle/index.page +1 -1
- data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
- data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
- data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
- data/doc/guide/attic/plans/building_plans.page +89 -0
- data/doc/guide/attic/plans/code.page +192 -0
- data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
- data/doc/guide/attic/plans/index.page +7 -0
- data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
- data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
- data/doc/guide/attic/plans/querying_plans.page +5 -0
- data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
- data/doc/guide/config.yaml +7 -4
- data/doc/guide/ext/extended_menu.rb +29 -0
- data/doc/guide/ext/init.rb +6 -0
- data/doc/guide/ext/rdoc_links.rb +7 -6
- data/doc/guide/src/advanced_concepts/history.page +5 -0
- data/doc/guide/src/advanced_concepts/index.page +11 -0
- data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
- data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
- data/doc/guide/src/advanced_concepts/transactions.page +5 -0
- data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
- data/doc/guide/src/base.template +96 -0
- data/doc/guide/src/basics_shell_header.txt +5 -7
- data/doc/guide/src/building/action_coordination.page +96 -0
- data/doc/guide/src/building/actions.page +124 -0
- data/doc/guide/src/building/file_layout.page +71 -0
- data/doc/guide/src/building/index.page +50 -0
- data/doc/guide/src/building/patterns.page +86 -0
- data/doc/guide/src/building/patterns_forwarding.png +0 -0
- data/doc/guide/src/building/patterns_forwarding.svg +277 -0
- data/doc/guide/src/building/runtime.page +95 -0
- data/doc/guide/src/building/task_models.page +94 -0
- data/doc/guide/src/building/tasks.page +284 -0
- data/doc/guide/src/concepts/error_handling.page +100 -0
- data/doc/guide/src/concepts/exception_propagation.png +0 -0
- data/doc/guide/src/concepts/exception_propagation.svg +445 -0
- data/doc/guide/src/concepts/execution.page +85 -0
- data/doc/guide/src/concepts/execution.png +0 -0
- data/doc/guide/src/concepts/execution.svg +573 -0
- data/doc/guide/src/concepts/execution_cycle.png +0 -0
- data/doc/guide/src/concepts/garbage_collection.page +57 -0
- data/doc/guide/src/concepts/index.page +27 -0
- data/doc/guide/src/concepts/plans.page +101 -0
- data/doc/guide/src/concepts/policy.page +31 -0
- data/doc/guide/src/concepts/reactor.page +61 -0
- data/doc/guide/src/concepts/simple_plan_example.png +0 -0
- data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
- data/doc/guide/src/default.template +9 -74
- data/doc/guide/src/event_relations/forward.page +71 -0
- data/doc/guide/src/event_relations/index.page +12 -0
- data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
- data/doc/guide/src/event_relations/signal.page +55 -0
- data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
- data/doc/guide/src/htmldoc.metainfo +21 -8
- data/doc/guide/src/index.page +8 -3
- data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
- data/doc/guide/src/installation/publications.page +14 -0
- data/doc/guide/src/{introduction → installation}/videos.page +14 -7
- data/doc/guide/src/interacting/index.page +16 -0
- data/doc/guide/src/interacting/run.page +33 -0
- data/doc/guide/src/interacting/shell.page +95 -0
- data/doc/guide/src/plugins/creating_plugins.page +72 -0
- data/doc/guide/src/plugins/index.page +27 -5
- data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
- data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
- data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
- data/doc/guide/src/style_screen.css +687 -0
- data/doc/guide/src/task_relations/dependency.page +107 -0
- data/doc/guide/src/task_relations/executed_by.page +77 -0
- data/doc/guide/src/task_relations/index.page +12 -0
- data/doc/guide/src/task_relations/new_relations.page +119 -0
- data/doc/guide/src/task_relations/planned_by.page +46 -0
- data/doc/guide/src/tutorial/app.page +117 -0
- data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
- data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
- data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
- data/doc/guide/src/tutorial/events.page +195 -0
- data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
- data/doc/guide/src/tutorial/index.page +13 -0
- data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
- data/doc/guide/src/tutorial/relations_display.page +153 -0
- data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
- data/doc/guide/src/tutorial/shell.page +121 -0
- data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
- data/doc/guide/src/tutorial/tasks.page +374 -0
- data/lib/roby.rb +102 -47
- data/lib/roby/actions.rb +17 -0
- data/lib/roby/actions/action.rb +80 -0
- data/lib/roby/actions/interface.rb +45 -0
- data/lib/roby/actions/library.rb +23 -0
- data/lib/roby/actions/models/action.rb +224 -0
- data/lib/roby/actions/models/coordination_action.rb +58 -0
- data/lib/roby/actions/models/interface.rb +22 -0
- data/lib/roby/actions/models/interface_base.rb +294 -0
- data/lib/roby/actions/models/library.rb +12 -0
- data/lib/roby/actions/models/method_action.rb +90 -0
- data/lib/roby/actions/task.rb +114 -0
- data/lib/roby/and_generator.rb +125 -0
- data/lib/roby/app.rb +2795 -829
- data/lib/roby/app/autotest_console_reporter.rb +138 -0
- data/lib/roby/app/base.rb +21 -0
- data/lib/roby/app/cucumber.rb +2 -0
- data/lib/roby/app/cucumber/controller.rb +439 -0
- data/lib/roby/app/cucumber/helpers.rb +280 -0
- data/lib/roby/app/cucumber/world.rb +32 -0
- data/lib/roby/app/debug.rb +136 -0
- data/lib/roby/app/gen.rb +2 -0
- data/lib/roby/app/rake.rb +178 -38
- data/lib/roby/app/robot_config.rb +9 -0
- data/lib/roby/app/robot_names.rb +115 -0
- data/lib/roby/app/run.rb +3 -2
- data/lib/roby/app/scripts.rb +72 -0
- data/lib/roby/app/scripts/autotest.rb +173 -0
- data/lib/roby/app/scripts/display.rb +2 -0
- data/lib/roby/app/scripts/restart.rb +52 -0
- data/lib/roby/app/scripts/results.rb +17 -8
- data/lib/roby/app/scripts/run.rb +155 -24
- data/lib/roby/app/scripts/shell.rb +147 -62
- data/lib/roby/app/scripts/test.rb +107 -22
- data/lib/roby/app/test_reporter.rb +74 -0
- data/lib/roby/app/test_server.rb +159 -0
- data/lib/roby/app/vagrant.rb +47 -0
- data/lib/roby/backports.rb +16 -0
- data/lib/roby/cli/display.rb +190 -0
- data/lib/roby/cli/exceptions.rb +17 -0
- data/lib/roby/cli/gen/actions/class.rb +5 -0
- data/lib/roby/cli/gen/actions/test.rb +6 -0
- data/lib/roby/cli/gen/app/.yardopts +6 -0
- data/lib/roby/cli/gen/app/README.md +28 -0
- data/lib/roby/cli/gen/app/Rakefile +15 -0
- data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
- data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
- data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
- data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
- data/lib/roby/cli/gen/class/class.rb +6 -0
- data/lib/roby/cli/gen/class/test.rb +7 -0
- data/lib/roby/cli/gen/helpers.rb +203 -0
- data/lib/roby/cli/gen/module/module.rb +5 -0
- data/lib/roby/cli/gen/module/test.rb +6 -0
- data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
- data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
- data/lib/roby/cli/gen/task/class.rb +44 -0
- data/lib/roby/cli/gen/task/test.rb +6 -0
- data/lib/roby/cli/gen_main.rb +120 -0
- data/lib/roby/cli/log.rb +276 -0
- data/lib/roby/cli/log/flamegraph.html +499 -0
- data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
- data/lib/roby/cli/main.rb +153 -0
- data/lib/roby/coordination.rb +60 -0
- data/lib/roby/coordination/action_script.rb +25 -0
- data/lib/roby/coordination/action_state_machine.rb +125 -0
- data/lib/roby/coordination/actions.rb +106 -0
- data/lib/roby/coordination/base.rb +145 -0
- data/lib/roby/coordination/calculus.rb +40 -0
- data/lib/roby/coordination/child.rb +28 -0
- data/lib/roby/coordination/event.rb +29 -0
- data/lib/roby/coordination/fault_handler.rb +25 -0
- data/lib/roby/coordination/fault_handling_task.rb +13 -0
- data/lib/roby/coordination/fault_response_table.rb +110 -0
- data/lib/roby/coordination/models/action_script.rb +64 -0
- data/lib/roby/coordination/models/action_state_machine.rb +224 -0
- data/lib/roby/coordination/models/actions.rb +191 -0
- data/lib/roby/coordination/models/arguments.rb +55 -0
- data/lib/roby/coordination/models/base.rb +176 -0
- data/lib/roby/coordination/models/capture.rb +86 -0
- data/lib/roby/coordination/models/child.rb +35 -0
- data/lib/roby/coordination/models/event.rb +41 -0
- data/lib/roby/coordination/models/exceptions.rb +42 -0
- data/lib/roby/coordination/models/fault_handler.rb +219 -0
- data/lib/roby/coordination/models/fault_response_table.rb +77 -0
- data/lib/roby/coordination/models/root.rb +22 -0
- data/lib/roby/coordination/models/script.rb +283 -0
- data/lib/roby/coordination/models/task.rb +184 -0
- data/lib/roby/coordination/models/task_from_action.rb +50 -0
- data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
- data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
- data/lib/roby/coordination/models/task_from_variable.rb +27 -0
- data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
- data/lib/roby/coordination/models/variable.rb +32 -0
- data/lib/roby/coordination/script.rb +200 -0
- data/lib/roby/coordination/script_instruction.rb +12 -0
- data/lib/roby/coordination/task.rb +45 -0
- data/lib/roby/coordination/task_base.rb +69 -0
- data/lib/roby/coordination/task_script.rb +293 -0
- data/lib/roby/coordination/task_state_machine.rb +308 -0
- data/lib/roby/decision_control.rb +33 -21
- data/lib/roby/distributed_object.rb +76 -0
- data/lib/roby/droby.rb +17 -0
- data/lib/roby/droby/droby_id.rb +6 -0
- data/lib/roby/droby/enable.rb +153 -0
- data/lib/roby/droby/event_logger.rb +189 -0
- data/lib/roby/droby/event_logging.rb +57 -0
- data/lib/roby/droby/exceptions.rb +14 -0
- data/lib/roby/droby/identifiable.rb +22 -0
- data/lib/roby/droby/logfile.rb +141 -0
- data/lib/roby/droby/logfile/client.rb +176 -0
- data/lib/roby/droby/logfile/file_format.md +97 -0
- data/lib/roby/droby/logfile/index.rb +117 -0
- data/lib/roby/droby/logfile/reader.rb +139 -0
- data/lib/roby/droby/logfile/server.rb +199 -0
- data/lib/roby/droby/logfile/writer.rb +114 -0
- data/lib/roby/droby/marshal.rb +264 -0
- data/lib/roby/droby/marshallable.rb +12 -0
- data/lib/roby/droby/null_event_logger.rb +25 -0
- data/lib/roby/droby/object_manager.rb +205 -0
- data/lib/roby/droby/peer_id.rb +6 -0
- data/lib/roby/droby/plan_rebuilder.rb +373 -0
- data/lib/roby/droby/rebuilt_plan.rb +160 -0
- data/lib/roby/droby/remote_droby_id.rb +6 -0
- data/lib/roby/droby/timepoints.rb +205 -0
- data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
- data/lib/roby/droby/timepoints_ctf.rb +125 -0
- data/lib/roby/droby/v5.rb +14 -0
- data/lib/roby/droby/v5/builtin.rb +120 -0
- data/lib/roby/droby/v5/droby_class.rb +45 -0
- data/lib/roby/droby/v5/droby_constant.rb +81 -0
- data/lib/roby/droby/v5/droby_dump.rb +1026 -0
- data/lib/roby/droby/v5/droby_id.rb +44 -0
- data/lib/roby/droby/v5/droby_model.rb +82 -0
- data/lib/roby/droby/v5/peer_id.rb +10 -0
- data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
- data/lib/roby/event.rb +79 -957
- data/lib/roby/event_constraints.rb +835 -0
- data/lib/roby/event_generator.rb +1047 -0
- data/lib/roby/event_structure/causal_link.rb +6 -0
- data/lib/roby/event_structure/forwarding.rb +6 -0
- data/lib/roby/event_structure/precedence.rb +7 -0
- data/lib/roby/event_structure/signal.rb +8 -0
- data/lib/roby/event_structure/temporal_constraints.rb +640 -0
- data/lib/roby/exceptions.rb +446 -152
- data/lib/roby/executable_plan.rb +549 -0
- data/lib/roby/execution_engine.rb +1997 -950
- data/lib/roby/filter_generator.rb +26 -0
- data/lib/roby/gui/chronicle_view.rb +225 -0
- data/lib/roby/gui/chronicle_widget.rb +925 -0
- data/lib/roby/gui/dot_id.rb +11 -0
- data/lib/roby/gui/exception_view.rb +44 -0
- data/lib/roby/gui/log_display.rb +273 -0
- data/lib/roby/gui/model_views.rb +2 -0
- data/lib/roby/gui/model_views/action_interface.rb +53 -0
- data/lib/roby/gui/model_views/task.rb +47 -0
- data/lib/roby/gui/model_views/task.rhtml +41 -0
- data/lib/roby/gui/object_info_view.rb +89 -0
- data/lib/roby/gui/plan_dot_layout.rb +427 -0
- data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
- data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
- data/lib/roby/gui/relations_view.rb +278 -0
- data/lib/roby/gui/relations_view/relations.ui +139 -0
- data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
- data/lib/roby/gui/relations_view/relations_config.rb +292 -0
- data/lib/roby/gui/relations_view/relations_view.ui +53 -0
- data/lib/roby/gui/scheduler_view.css +24 -0
- data/lib/roby/gui/scheduler_view.rb +46 -0
- data/lib/roby/gui/scheduler_view.rhtml +53 -0
- data/lib/roby/gui/stepping.rb +93 -0
- data/lib/roby/gui/stepping.ui +181 -0
- data/lib/roby/gui/styles.rb +81 -0
- data/lib/roby/gui/task_display_configuration.rb +42 -0
- data/lib/roby/gui/task_state_at.rb +38 -0
- data/lib/roby/hooks.rb +26 -0
- data/lib/roby/interface.rb +136 -469
- data/lib/roby/interface/async.rb +20 -0
- data/lib/roby/interface/async/action_monitor.rb +188 -0
- data/lib/roby/interface/async/interface.rb +498 -0
- data/lib/roby/interface/async/job_monitor.rb +213 -0
- data/lib/roby/interface/async/log.rb +238 -0
- data/lib/roby/interface/async/new_job_listener.rb +79 -0
- data/lib/roby/interface/async/ui_connector.rb +183 -0
- data/lib/roby/interface/client.rb +553 -0
- data/lib/roby/interface/command.rb +24 -0
- data/lib/roby/interface/command_argument.rb +16 -0
- data/lib/roby/interface/command_library.rb +92 -0
- data/lib/roby/interface/droby_channel.rb +174 -0
- data/lib/roby/interface/exceptions.rb +22 -0
- data/lib/roby/interface/interface.rb +655 -0
- data/lib/roby/interface/job.rb +47 -0
- data/lib/roby/interface/rest.rb +10 -0
- data/lib/roby/interface/rest/api.rb +29 -0
- data/lib/roby/interface/rest/helpers.rb +24 -0
- data/lib/roby/interface/rest/server.rb +212 -0
- data/lib/roby/interface/server.rb +154 -0
- data/lib/roby/interface/shell_client.rb +468 -0
- data/lib/roby/interface/shell_subcommand.rb +24 -0
- data/lib/roby/interface/subcommand_client.rb +35 -0
- data/lib/roby/interface/tcp.rb +168 -0
- data/lib/roby/models/arguments.rb +112 -0
- data/lib/roby/models/plan_object.rb +83 -0
- data/lib/roby/models/task.rb +835 -0
- data/lib/roby/models/task_event.rb +62 -0
- data/lib/roby/models/task_service.rb +78 -0
- data/lib/roby/or_generator.rb +88 -0
- data/lib/roby/plan.rb +1751 -864
- data/lib/roby/plan_object.rb +611 -0
- data/lib/roby/plan_service.rb +200 -0
- data/lib/roby/promise.rb +332 -0
- data/lib/roby/queries.rb +23 -0
- data/lib/roby/queries/and_matcher.rb +32 -0
- data/lib/roby/queries/any.rb +27 -0
- data/lib/roby/queries/code_error_matcher.rb +58 -0
- data/lib/roby/queries/event_generator_matcher.rb +9 -0
- data/lib/roby/queries/execution_exception_matcher.rb +165 -0
- data/lib/roby/queries/index.rb +165 -0
- data/lib/roby/queries/localized_error_matcher.rb +149 -0
- data/lib/roby/queries/matcher_base.rb +107 -0
- data/lib/roby/queries/none.rb +27 -0
- data/lib/roby/queries/not_matcher.rb +30 -0
- data/lib/roby/queries/op_matcher.rb +8 -0
- data/lib/roby/queries/or_matcher.rb +30 -0
- data/lib/roby/queries/plan_object_matcher.rb +363 -0
- data/lib/roby/queries/query.rb +188 -0
- data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
- data/lib/roby/queries/task_matcher.rb +344 -0
- data/lib/roby/relations.rb +42 -678
- data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
- data/lib/roby/relations/directed_relation_support.rb +268 -0
- data/lib/roby/relations/event_relation_graph.rb +19 -0
- data/lib/roby/relations/fork_merge_visitor.rb +154 -0
- data/lib/roby/relations/graph.rb +533 -0
- data/lib/roby/relations/models/directed_relation_support.rb +11 -0
- data/lib/roby/relations/models/graph.rb +75 -0
- data/lib/roby/relations/models/task_relation_graph.rb +18 -0
- data/lib/roby/relations/space.rb +380 -0
- data/lib/roby/relations/task_relation_graph.rb +20 -0
- data/lib/roby/robot.rb +85 -38
- data/lib/roby/schedulers/basic.rb +155 -25
- data/lib/roby/schedulers/null.rb +20 -0
- data/lib/roby/schedulers/reporting.rb +31 -0
- data/lib/roby/schedulers/state.rb +129 -0
- data/lib/roby/schedulers/temporal.rb +91 -0
- data/lib/roby/singletons.rb +87 -0
- data/lib/roby/standalone.rb +4 -2
- data/lib/roby/standard_errors.rb +405 -82
- data/lib/roby/state.rb +6 -3
- data/lib/roby/state/conf_model.rb +5 -0
- data/lib/roby/state/events.rb +181 -95
- data/lib/roby/state/goal_model.rb +77 -0
- data/lib/roby/state/open_struct.rb +591 -0
- data/lib/roby/state/open_struct_model.rb +68 -0
- data/lib/roby/state/pos.rb +45 -45
- data/lib/roby/state/shapes.rb +11 -11
- data/lib/roby/state/state_model.rb +303 -0
- data/lib/roby/state/task.rb +43 -0
- data/lib/roby/support.rb +88 -148
- data/lib/roby/task.rb +1361 -1750
- data/lib/roby/task_arguments.rb +428 -0
- data/lib/roby/task_event.rb +127 -0
- data/lib/roby/task_event_generator.rb +337 -0
- data/lib/roby/task_service.rb +6 -0
- data/lib/roby/task_structure/conflicts.rb +104 -0
- data/lib/roby/task_structure/dependency.rb +932 -0
- data/lib/roby/task_structure/error_handling.rb +118 -0
- data/lib/roby/task_structure/executed_by.rb +234 -0
- data/lib/roby/task_structure/planned_by.rb +90 -0
- data/lib/roby/tasks/aggregator.rb +37 -0
- data/lib/roby/tasks/external_process.rb +275 -0
- data/lib/roby/tasks/group.rb +27 -0
- data/lib/roby/tasks/null.rb +19 -0
- data/lib/roby/tasks/parallel.rb +43 -0
- data/lib/roby/tasks/sequence.rb +88 -0
- data/lib/roby/tasks/simple.rb +21 -0
- data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
- data/lib/roby/tasks/timeout.rb +17 -0
- data/lib/roby/tasks/virtual.rb +55 -0
- data/lib/roby/template_plan.rb +7 -0
- data/lib/roby/test/aruba_minitest.rb +74 -0
- data/lib/roby/test/assertion.rb +16 -0
- data/lib/roby/test/assertions.rb +490 -0
- data/lib/roby/test/common.rb +368 -591
- data/lib/roby/test/dsl.rb +149 -0
- data/lib/roby/test/error.rb +18 -0
- data/lib/roby/test/event_reporter.rb +83 -0
- data/lib/roby/test/execution_expectations.rb +1134 -0
- data/lib/roby/test/expect_execution.rb +151 -0
- data/lib/roby/test/minitest_helpers.rb +166 -0
- data/lib/roby/test/roby_app_helpers.rb +200 -0
- data/lib/roby/test/run_planners.rb +155 -0
- data/lib/roby/test/self.rb +112 -0
- data/lib/roby/test/spec.rb +198 -0
- data/lib/roby/test/tasks/empty_task.rb +4 -4
- data/lib/roby/test/tasks/goto.rb +28 -27
- data/lib/roby/test/teardown_plans.rb +100 -0
- data/lib/roby/test/testcase.rb +239 -307
- data/lib/roby/test/tools.rb +159 -155
- data/lib/roby/test/validate_state_machine.rb +75 -0
- data/lib/roby/transaction.rb +1125 -0
- data/lib/roby/transaction/event_generator_proxy.rb +63 -0
- data/lib/roby/transaction/plan_object_proxy.rb +99 -0
- data/lib/roby/transaction/plan_service_proxy.rb +43 -0
- data/lib/roby/transaction/proxying.rb +120 -0
- data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
- data/lib/roby/transaction/task_proxy.rb +135 -0
- data/lib/roby/until_generator.rb +30 -0
- data/lib/roby/version.rb +5 -0
- data/lib/roby/yard.rb +169 -0
- data/lib/yard-roby.rb +1 -0
- data/manifest.xml +32 -6
- data/roby.gemspec +59 -0
- metadata +788 -587
- data/Manifest.txt +0 -321
- data/NOTES +0 -4
- data/README.txt +0 -166
- data/TODO.txt +0 -146
- data/app/README.txt +0 -24
- data/app/Rakefile +0 -8
- data/app/config/ROBOT.rb +0 -5
- data/app/config/init.rb +0 -33
- data/app/config/roby.yml +0 -3
- data/app/controllers/ROBOT.rb +0 -2
- data/app/planners/ROBOT/main.rb +0 -6
- data/app/planners/main.rb +0 -5
- data/app/scripts/distributed +0 -3
- data/app/scripts/generate/bookmarks +0 -3
- data/app/scripts/replay +0 -3
- data/app/scripts/results +0 -3
- data/app/scripts/run +0 -3
- data/app/scripts/server +0 -3
- data/app/scripts/shell +0 -3
- data/app/scripts/test +0 -3
- data/app/tasks/.gitattributes +0 -0
- data/app/tasks/ROBOT/.gitattributes +0 -0
- data/bin/roby-shell +0 -25
- data/doc/guide/src/basics/app.page +0 -139
- data/doc/guide/src/basics/index.page +0 -11
- data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/basics/relations_display.page +0 -203
- data/doc/guide/src/basics/shell.page +0 -102
- data/doc/guide/src/default.css +0 -319
- data/doc/guide/src/introduction/index.page +0 -29
- data/doc/guide/src/introduction/publications.page +0 -14
- data/doc/guide/src/relations/dependency.page +0 -89
- data/doc/guide/src/relations/index.page +0 -12
- data/ext/droby/dump.cc +0 -175
- data/ext/droby/extconf.rb +0 -3
- data/ext/graph/algorithm.cc +0 -746
- data/ext/graph/extconf.rb +0 -7
- data/ext/graph/graph.cc +0 -575
- data/ext/graph/graph.hh +0 -183
- data/ext/graph/iterator_sequence.hh +0 -102
- data/ext/graph/undirected_dfs.hh +0 -226
- data/ext/graph/undirected_graph.hh +0 -421
- data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
- data/lib/roby/app/scripts/replay.rb +0 -31
- data/lib/roby/app/scripts/server.rb +0 -18
- data/lib/roby/basic_object.rb +0 -151
- data/lib/roby/config.rb +0 -14
- data/lib/roby/distributed.rb +0 -36
- data/lib/roby/distributed/base.rb +0 -448
- data/lib/roby/distributed/communication.rb +0 -875
- data/lib/roby/distributed/connection_space.rb +0 -616
- data/lib/roby/distributed/distributed_object.rb +0 -206
- data/lib/roby/distributed/drb.rb +0 -62
- data/lib/roby/distributed/notifications.rb +0 -531
- data/lib/roby/distributed/peer.rb +0 -555
- data/lib/roby/distributed/protocol.rb +0 -529
- data/lib/roby/distributed/proxy.rb +0 -343
- data/lib/roby/distributed/subscription.rb +0 -311
- data/lib/roby/distributed/transaction.rb +0 -498
- data/lib/roby/external_process_task.rb +0 -225
- data/lib/roby/graph.rb +0 -160
- data/lib/roby/log.rb +0 -3
- data/lib/roby/log/chronicle.rb +0 -303
- data/lib/roby/log/console.rb +0 -74
- data/lib/roby/log/data_stream.rb +0 -275
- data/lib/roby/log/dot.rb +0 -279
- data/lib/roby/log/event_stream.rb +0 -161
- data/lib/roby/log/file.rb +0 -396
- data/lib/roby/log/gui/basic_display.ui +0 -83
- data/lib/roby/log/gui/basic_display_ui.rb +0 -89
- data/lib/roby/log/gui/chronicle.rb +0 -26
- data/lib/roby/log/gui/chronicle_view.rb +0 -40
- data/lib/roby/log/gui/chronicle_view.ui +0 -70
- data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
- data/lib/roby/log/gui/data_displays.rb +0 -171
- data/lib/roby/log/gui/data_displays.ui +0 -155
- data/lib/roby/log/gui/data_displays_ui.rb +0 -146
- data/lib/roby/log/gui/notifications.rb +0 -26
- data/lib/roby/log/gui/relations.rb +0 -269
- data/lib/roby/log/gui/relations.ui +0 -123
- data/lib/roby/log/gui/relations_ui.rb +0 -120
- data/lib/roby/log/gui/relations_view.rb +0 -185
- data/lib/roby/log/gui/relations_view.ui +0 -149
- data/lib/roby/log/gui/relations_view_ui.rb +0 -144
- data/lib/roby/log/gui/replay.rb +0 -366
- data/lib/roby/log/gui/replay_controls.rb +0 -206
- data/lib/roby/log/gui/replay_controls.ui +0 -282
- data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
- data/lib/roby/log/gui/runtime.rb +0 -130
- data/lib/roby/log/hooks.rb +0 -186
- data/lib/roby/log/logger.rb +0 -203
- data/lib/roby/log/notifications.rb +0 -244
- data/lib/roby/log/plan_rebuilder.rb +0 -468
- data/lib/roby/log/relations.rb +0 -1084
- data/lib/roby/log/server.rb +0 -547
- data/lib/roby/log/sqlite.rb +0 -47
- data/lib/roby/log/timings.rb +0 -233
- data/lib/roby/plan-object.rb +0 -371
- data/lib/roby/planning.rb +0 -13
- data/lib/roby/planning/loops.rb +0 -309
- data/lib/roby/planning/model.rb +0 -1012
- data/lib/roby/planning/task.rb +0 -180
- data/lib/roby/query.rb +0 -655
- data/lib/roby/relations/conflicts.rb +0 -67
- data/lib/roby/relations/dependency.rb +0 -358
- data/lib/roby/relations/ensured.rb +0 -19
- data/lib/roby/relations/error_handling.rb +0 -22
- data/lib/roby/relations/events.rb +0 -7
- data/lib/roby/relations/executed_by.rb +0 -208
- data/lib/roby/relations/influence.rb +0 -10
- data/lib/roby/relations/planned_by.rb +0 -63
- data/lib/roby/state/information.rb +0 -55
- data/lib/roby/state/state.rb +0 -367
- data/lib/roby/task-operations.rb +0 -186
- data/lib/roby/task_index.rb +0 -80
- data/lib/roby/test/distributed.rb +0 -230
- data/lib/roby/test/tasks/simple_task.rb +0 -23
- data/lib/roby/transactions.rb +0 -507
- data/lib/roby/transactions/proxy.rb +0 -325
- data/plugins/fault_injection/History.txt +0 -4
- data/plugins/fault_injection/README.txt +0 -34
- data/plugins/fault_injection/Rakefile +0 -12
- data/plugins/fault_injection/TODO.txt +0 -0
- data/plugins/fault_injection/app.rb +0 -52
- data/plugins/fault_injection/fault_injection.rb +0 -89
- data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
- data/plugins/subsystems/README.txt +0 -37
- data/plugins/subsystems/Rakefile +0 -13
- data/plugins/subsystems/app.rb +0 -182
- data/plugins/subsystems/test/app/README +0 -24
- data/plugins/subsystems/test/app/Rakefile +0 -8
- data/plugins/subsystems/test/app/config/app.yml +0 -71
- data/plugins/subsystems/test/app/config/init.rb +0 -12
- data/plugins/subsystems/test/app/config/roby.yml +0 -3
- data/plugins/subsystems/test/app/planners/main.rb +0 -20
- data/plugins/subsystems/test/app/scripts/distributed +0 -3
- data/plugins/subsystems/test/app/scripts/replay +0 -3
- data/plugins/subsystems/test/app/scripts/results +0 -3
- data/plugins/subsystems/test/app/scripts/run +0 -3
- data/plugins/subsystems/test/app/scripts/server +0 -3
- data/plugins/subsystems/test/app/scripts/shell +0 -3
- data/plugins/subsystems/test/app/scripts/test +0 -3
- data/plugins/subsystems/test/app/tasks/services.rb +0 -15
- data/plugins/subsystems/test/test_subsystems.rb +0 -78
- data/test/distributed/test_communication.rb +0 -195
- data/test/distributed/test_connection.rb +0 -284
- data/test/distributed/test_execution.rb +0 -378
- data/test/distributed/test_mixed_plan.rb +0 -341
- data/test/distributed/test_plan_notifications.rb +0 -238
- data/test/distributed/test_protocol.rb +0 -525
- data/test/distributed/test_query.rb +0 -106
- data/test/distributed/test_remote_plan.rb +0 -491
- data/test/distributed/test_transaction.rb +0 -466
- data/test/mockups/external_process +0 -28
- data/test/mockups/tasks.rb +0 -27
- data/test/planning/test_loops.rb +0 -432
- data/test/planning/test_model.rb +0 -427
- data/test/planning/test_task.rb +0 -126
- data/test/relations/test_conflicts.rb +0 -42
- data/test/relations/test_dependency.rb +0 -324
- data/test/relations/test_ensured.rb +0 -38
- data/test/relations/test_executed_by.rb +0 -224
- data/test/relations/test_planned_by.rb +0 -56
- data/test/suite_core.rb +0 -29
- data/test/suite_distributed.rb +0 -10
- data/test/suite_planning.rb +0 -4
- data/test/suite_relations.rb +0 -8
- data/test/tasks/test_external_process.rb +0 -126
- data/test/tasks/test_thread_task.rb +0 -70
- data/test/test_bgl.rb +0 -528
- data/test/test_event.rb +0 -969
- data/test/test_exceptions.rb +0 -591
- data/test/test_execution_engine.rb +0 -987
- data/test/test_gui.rb +0 -20
- data/test/test_interface.rb +0 -43
- data/test/test_log.rb +0 -125
- data/test/test_log_server.rb +0 -133
- data/test/test_plan.rb +0 -418
- data/test/test_query.rb +0 -424
- data/test/test_relations.rb +0 -260
- data/test/test_state.rb +0 -432
- data/test/test_support.rb +0 -16
- data/test/test_task.rb +0 -1181
- data/test/test_testcase.rb +0 -138
- data/test/test_transactions.rb +0 -610
- data/test/test_transactions_proxy.rb +0 -216
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module DRoby
|
|
3
|
+
# Mixin to add event-logging related functionality to a class
|
|
4
|
+
#
|
|
5
|
+
# The class must provide a #event_logger object. It must be non-nil, and
|
|
6
|
+
# can be initialized with {NullEventLogger} for a no-op logger
|
|
7
|
+
module EventLogging
|
|
8
|
+
# Log an event on the underlying logger
|
|
9
|
+
def log(m, *args)
|
|
10
|
+
event_logger.dump(m, Time.now, args)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Log a timepoint on the underlying logger
|
|
14
|
+
def log_timepoint(name)
|
|
15
|
+
current_thread = Thread.current
|
|
16
|
+
event_logger.dump_timepoint(:timepoint, Time.now, [current_thread.droby_id, current_thread.name, name])
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Run a block within a timepoint group
|
|
20
|
+
def log_timepoint_group(name)
|
|
21
|
+
log_timepoint_group_start(name)
|
|
22
|
+
yield
|
|
23
|
+
ensure
|
|
24
|
+
log_timepoint_group_end(name)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Log a timepoint on the underlying logger
|
|
28
|
+
#
|
|
29
|
+
# The logger will NOT do any validation of the group start/end
|
|
30
|
+
# pairing at logging time. This is done at replay time
|
|
31
|
+
def log_timepoint_group_start(name)
|
|
32
|
+
current_thread = Thread.current
|
|
33
|
+
event_logger.dump_timepoint(:timepoint_group_start, Time.now, [current_thread.droby_id, current_thread.name, name])
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# End a timepoint group
|
|
37
|
+
#
|
|
38
|
+
# The logger will NOT do any validation of the group start/end
|
|
39
|
+
# pairing at logging time. This is done at replay time
|
|
40
|
+
def log_timepoint_group_end(name)
|
|
41
|
+
current_thread = Thread.current
|
|
42
|
+
event_logger.dump_timepoint(:timepoint_group_end, Time.now, [current_thread.droby_id, current_thread.name, name])
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# The amount of cycles pending in the {#event_logger}'s dump queue
|
|
46
|
+
def log_queue_size
|
|
47
|
+
event_logger.log_queue_size
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def log_flush_cycle(m, *args)
|
|
51
|
+
event_logger.flush_cycle(m, Time.now, args)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module DRoby
|
|
3
|
+
# Exception raised when trying to resolve a sibling for which we
|
|
4
|
+
# don't have any information
|
|
5
|
+
class UnknownSibling < RuntimeError
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# Exception raised when an attempt to resolve a marshalled object into a
|
|
9
|
+
# local object failed
|
|
10
|
+
class NoLocalObject < RuntimeError
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module DRoby
|
|
3
|
+
module Identifiable
|
|
4
|
+
# The DRobyID for this object
|
|
5
|
+
def droby_id
|
|
6
|
+
if @__droby_remote_id__
|
|
7
|
+
@__droby_remote_id__
|
|
8
|
+
elsif !frozen?
|
|
9
|
+
@__droby_remote_id__ = DRobyID.allocate
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def initialize_copy(old) # :nodoc:
|
|
14
|
+
super
|
|
15
|
+
@__droby_remote_id__ = nil
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
module Roby
|
|
2
|
+
module DRoby
|
|
3
|
+
# Module containing all the logfile-related code
|
|
4
|
+
#
|
|
5
|
+
# Note that unlike other Roby facilities, this file is not meant to be
|
|
6
|
+
# required directly. Require either logfile/reader or logfile/writer
|
|
7
|
+
# depending on what you need
|
|
8
|
+
module Logfile
|
|
9
|
+
extend Logger::Hierarchy
|
|
10
|
+
|
|
11
|
+
MAGIC_CODE = "ROBYLOG"
|
|
12
|
+
PROLOGUE_SIZE = MAGIC_CODE.size + 4
|
|
13
|
+
FORMAT_VERSION = 5
|
|
14
|
+
|
|
15
|
+
class IndexInvalid < RuntimeError; end
|
|
16
|
+
class IndexMissing < RuntimeError; end
|
|
17
|
+
|
|
18
|
+
# Exception raised when attempting to guess the format version of a
|
|
19
|
+
# log file, and the guess fails
|
|
20
|
+
class UnknownFormatVersion < RuntimeError; end
|
|
21
|
+
|
|
22
|
+
# Execption raised when loading a good-looking prologue of a log
|
|
23
|
+
# file, but the contained log version does not match our
|
|
24
|
+
# expectations
|
|
25
|
+
class InvalidFormatVersion < RuntimeError; end
|
|
26
|
+
|
|
27
|
+
# Exception raised when attempting to load a file that does not look
|
|
28
|
+
# like a Roby log file
|
|
29
|
+
class InvalidFileError < RuntimeError; end
|
|
30
|
+
|
|
31
|
+
class TruncatedFileError < InvalidFileError; end
|
|
32
|
+
|
|
33
|
+
def self.write_prologue(io)
|
|
34
|
+
io.write(MAGIC_CODE)
|
|
35
|
+
io.write([FORMAT_VERSION].pack("L<"))
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Write a log file header
|
|
39
|
+
#
|
|
40
|
+
# The created log file will always have {FORMAT_VERSION} as its
|
|
41
|
+
# version field
|
|
42
|
+
def self.write_header(io, options = Hash.new)
|
|
43
|
+
write_prologue(io)
|
|
44
|
+
options = ::Marshal.dump(options)
|
|
45
|
+
io.write [options.size].pack("L<")
|
|
46
|
+
io.write options
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Guess the log file format version for the given IO
|
|
50
|
+
def self.guess_version(input)
|
|
51
|
+
input.rewind
|
|
52
|
+
|
|
53
|
+
magic = input.read(Logfile::MAGIC_CODE.size)
|
|
54
|
+
if magic == Logfile::MAGIC_CODE
|
|
55
|
+
return input.read(4).unpack("L<").first
|
|
56
|
+
else
|
|
57
|
+
input.rewind
|
|
58
|
+
header =
|
|
59
|
+
begin ::Marshal.load(input)
|
|
60
|
+
rescue TypeError
|
|
61
|
+
return
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
case header
|
|
65
|
+
when Hash then return header[:log_format]
|
|
66
|
+
when Symbol
|
|
67
|
+
first_chunk =
|
|
68
|
+
begin ::Marshal.load(input)
|
|
69
|
+
rescue TypeError
|
|
70
|
+
return
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
if first_chunk.kind_of?(Array)
|
|
74
|
+
return 0
|
|
75
|
+
end
|
|
76
|
+
when Array
|
|
77
|
+
if header[-2] == :cycle_end
|
|
78
|
+
return 1
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
ensure
|
|
84
|
+
input.rewind
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Read a file prologue, validating that it is of the latest file
|
|
88
|
+
# format
|
|
89
|
+
#
|
|
90
|
+
# @raise [InvalidFileError,InvalidFormatVersion,UnknownFormatVersion]
|
|
91
|
+
def self.read_prologue(io)
|
|
92
|
+
magic = io.read(MAGIC_CODE.size)
|
|
93
|
+
if magic != MAGIC_CODE
|
|
94
|
+
raise InvalidFileError, "no magic code at beginning of file"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
log_format = io.read(4).unpack('I').first
|
|
98
|
+
validate_format(log_format)
|
|
99
|
+
|
|
100
|
+
rescue InvalidFormatVersion
|
|
101
|
+
raise
|
|
102
|
+
rescue Exception => e
|
|
103
|
+
if format = guess_version(io)
|
|
104
|
+
validate_format(format)
|
|
105
|
+
else
|
|
106
|
+
raise
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# @api private
|
|
111
|
+
#
|
|
112
|
+
# Validate the given format version
|
|
113
|
+
#
|
|
114
|
+
# @raise [InvalidFormatVersion]
|
|
115
|
+
def self.validate_format(format)
|
|
116
|
+
if format < FORMAT_VERSION
|
|
117
|
+
raise InvalidFormatVersion, "this is an outdated format (#{format}, current is #{FORMAT_VERSION}). Please run roby-log upgrade-format"
|
|
118
|
+
elsif format > FORMAT_VERSION
|
|
119
|
+
raise InvalidFormatVersion, "this is an unknown format version #{format}: expected #{FORMAT_VERSION}. This file can be read only by newest version of Roby"
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Load a chunk of data from an event file. +buffer+, if given, must be
|
|
124
|
+
# a String object that will be used as intermediate buffer in the
|
|
125
|
+
# process
|
|
126
|
+
def self.read_one_chunk(io)
|
|
127
|
+
data_size = io.read(4)
|
|
128
|
+
return if !data_size
|
|
129
|
+
|
|
130
|
+
data_size = data_size.unpack("L<").first
|
|
131
|
+
buffer = io.read(data_size) || ''
|
|
132
|
+
if buffer.size < data_size
|
|
133
|
+
raise TruncatedFileError, "expected a chunk of size #{data_size} at #{io.tell}, but got only #{buffer ? buffer.size : '0'} bytes"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
buffer
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
require 'roby/droby/logfile/reader'
|
|
2
|
+
|
|
3
|
+
module Roby
|
|
4
|
+
module DRoby
|
|
5
|
+
module Logfile
|
|
6
|
+
# The client part of the event log distribution service
|
|
7
|
+
class Client
|
|
8
|
+
include Hooks
|
|
9
|
+
include Hooks::InstanceHooks
|
|
10
|
+
|
|
11
|
+
# @!group Hooks
|
|
12
|
+
|
|
13
|
+
# @!method on_init_progress()
|
|
14
|
+
# @yieldparam [Integer] rx the amount of bytes processed so far
|
|
15
|
+
# @yieldparam [Integer] init_size the amount of bytes expected to
|
|
16
|
+
# be received for the init phase
|
|
17
|
+
# @return [void]
|
|
18
|
+
define_hooks :on_init_progress
|
|
19
|
+
|
|
20
|
+
# @!method on_init_done()
|
|
21
|
+
# Hooks called when we finished processing the initial set of data
|
|
22
|
+
# @return [void]
|
|
23
|
+
define_hooks :on_init_done
|
|
24
|
+
|
|
25
|
+
# @!method on_data
|
|
26
|
+
# Hooks called with one cycle worth of data
|
|
27
|
+
#
|
|
28
|
+
# @yieldparam [Array] data the data as logged, unmarshalled (with
|
|
29
|
+
# Marshal.load) but not unmarshalled by Roby. It is a flat array
|
|
30
|
+
# of 4-elements tuples of the form (event_name, sec, usec,
|
|
31
|
+
# args). See {lib/roby/droby/logfile/file_format.md} for more
|
|
32
|
+
# details.
|
|
33
|
+
# @return [void]
|
|
34
|
+
define_hooks :on_data
|
|
35
|
+
|
|
36
|
+
# @!endgroup
|
|
37
|
+
|
|
38
|
+
# The socket through which we are connected to the remote host
|
|
39
|
+
attr_reader :socket
|
|
40
|
+
# The host we are contacting
|
|
41
|
+
attr_reader :host
|
|
42
|
+
# The port on which a connection is created
|
|
43
|
+
attr_reader :port
|
|
44
|
+
# Data that is not a full cycle worth of data (i.e. buffer needed
|
|
45
|
+
# for packet reassembly)
|
|
46
|
+
attr_reader :buffer
|
|
47
|
+
# The amount of bytes received so far
|
|
48
|
+
attr_reader :rx
|
|
49
|
+
|
|
50
|
+
def initialize(host, port = Server::DEFAULT_PORT)
|
|
51
|
+
@host = host
|
|
52
|
+
@port = port
|
|
53
|
+
@buffer = ""
|
|
54
|
+
|
|
55
|
+
@rx = 0
|
|
56
|
+
@socket =
|
|
57
|
+
begin TCPSocket.new(host, port)
|
|
58
|
+
rescue Errno::ECONNREFUSED => e
|
|
59
|
+
raise Interface::ConnectionError, "cannot contact Roby log server at '#{host}:#{port}': #{e.message}"
|
|
60
|
+
end
|
|
61
|
+
socket.fcntl(Fcntl::FD_CLOEXEC, 1)
|
|
62
|
+
socket.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
|
|
63
|
+
rescue Exception
|
|
64
|
+
socket.close if socket
|
|
65
|
+
raise
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def disconnect
|
|
69
|
+
@socket.close
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def close
|
|
73
|
+
@socket.close
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def closed?
|
|
77
|
+
@socket.closed?
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def add_listener(&block)
|
|
81
|
+
on_data(&block)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def alive?
|
|
85
|
+
@alive
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Read and process data
|
|
89
|
+
#
|
|
90
|
+
# @param [Numeric] max max time we can spend processing. The method
|
|
91
|
+
# will at least process one cycle worth of data regardless of this
|
|
92
|
+
# parameter
|
|
93
|
+
# @return [Boolean] true if the last call processed something and
|
|
94
|
+
# false otherwise. It is an indicator of whether there could be
|
|
95
|
+
# still some data pending
|
|
96
|
+
def read_and_process_pending(max: 0)
|
|
97
|
+
current_time = start = Time.now
|
|
98
|
+
while (processed_one_cycle = read_and_process_one_pending_cycle) && (current_time - start) <= max
|
|
99
|
+
current_time = Time.now
|
|
100
|
+
end
|
|
101
|
+
processed_one_cycle
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# The number of bytes that have to be transferred to finish
|
|
105
|
+
# initializing the connection
|
|
106
|
+
attr_reader :init_size
|
|
107
|
+
|
|
108
|
+
def init_done?
|
|
109
|
+
@init_done
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# @api private
|
|
113
|
+
#
|
|
114
|
+
# Read data from the underlying socket
|
|
115
|
+
#
|
|
116
|
+
# @return [Boolean] true if some data was read, false otherwise
|
|
117
|
+
def read_from_socket(size = Server::DATA_CHUNK_SIZE)
|
|
118
|
+
@buffer.concat(socket.read_nonblock(size))
|
|
119
|
+
true
|
|
120
|
+
rescue EOFError, Errno::ECONNRESET, Errno::EPIPE => e
|
|
121
|
+
raise Interface::ComError, e.message, e.backtrace
|
|
122
|
+
rescue Errno::EAGAIN
|
|
123
|
+
false
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# @api private
|
|
127
|
+
#
|
|
128
|
+
# Reads the socket and processes at most one cycle of data
|
|
129
|
+
#
|
|
130
|
+
# @return [Boolean] whether there might be one more cyc
|
|
131
|
+
def read_and_process_one_pending_cycle
|
|
132
|
+
Logfile.debug "#{buffer.size} bytes of data in buffer"
|
|
133
|
+
|
|
134
|
+
while true
|
|
135
|
+
if buffer.size > 4
|
|
136
|
+
data_size = buffer.unpack('L<').first
|
|
137
|
+
Logfile.debug "expecting data block of #{data_size} bytes"
|
|
138
|
+
if buffer.size >= data_size + 4
|
|
139
|
+
break
|
|
140
|
+
end
|
|
141
|
+
return if !read_from_socket([Server::DATA_CHUNK_SIZE, buffer.size - data_size].max)
|
|
142
|
+
else
|
|
143
|
+
return if !read_from_socket
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
if data_size && (buffer.size >= data_size + 4)
|
|
149
|
+
cycle_data = buffer[4, data_size]
|
|
150
|
+
@buffer = buffer[(data_size + 4)..-1]
|
|
151
|
+
data = ::Marshal.load_with_missing_constants(cycle_data)
|
|
152
|
+
if data.kind_of?(Hash)
|
|
153
|
+
Reader.process_options_hash(data)
|
|
154
|
+
elsif data == Server::CONNECTION_INIT_DONE
|
|
155
|
+
@init_done = true
|
|
156
|
+
run_hook :on_init_done
|
|
157
|
+
elsif data[0] == Server::CONNECTION_INIT
|
|
158
|
+
@init_size = data[1]
|
|
159
|
+
else
|
|
160
|
+
@rx += (data_size + 4)
|
|
161
|
+
if !init_done?
|
|
162
|
+
run_hook :on_init_progress, rx, init_size
|
|
163
|
+
end
|
|
164
|
+
run_hook :on_data, data
|
|
165
|
+
end
|
|
166
|
+
Logfile.debug "processed #{data_size} bytes of data, #{@buffer.size} remaining in buffer"
|
|
167
|
+
true
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
rescue Errno::EAGAIN
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
The Roby log file format uses Ruby's Marshal and Roby's own DRoby mechanisms to
|
|
2
|
+
save data to disk.
|
|
3
|
+
|
|
4
|
+
A log file starts with
|
|
5
|
+
|
|
6
|
+
ROBYLOG#{FORMAT_VERSION}#{OPTIONS}
|
|
7
|
+
|
|
8
|
+
FORMAT_VERSION is an integer encoded in little-endian 32-bit. This version is
|
|
9
|
+
incremented each time the format is changed in a backward-incompatible way.
|
|
10
|
+
When the log file format changes, newer ruby versions will require one to run
|
|
11
|
+
the roby-log upgrade command on older log files before they can be interpreted.
|
|
12
|
+
|
|
13
|
+
OPTIONS is a Hash marshalled using Ruby's Marshal facility and prefixed by the
|
|
14
|
+
size of the marshalled hash, in bytes, encoded as a little-endian 32-bit. This
|
|
15
|
+
hash contains the following keys:
|
|
16
|
+
|
|
17
|
+
plugins: [String] the list of plugins loaded in the Roby instance
|
|
18
|
+
|
|
19
|
+
The rest of the file is a list of blocks. Each block is prefixed by its size
|
|
20
|
+
represented with a 32-bit unsigned integer. The rest of the block is a Ruby
|
|
21
|
+
array marshalled using Marshal.dump. The array contains a flat list of log
|
|
22
|
+
messages for one execution cycle. All cycles end with the same cycle_end message.
|
|
23
|
+
|
|
24
|
+
Each message is represented by 4 elements in the array
|
|
25
|
+
|
|
26
|
+
mesage_name, time_seconds, time_microseconds, args
|
|
27
|
+
|
|
28
|
+
where message_name is an event name (listed below), Time is the time where the
|
|
29
|
+
message was queued for logging and 'args' are a list of message-specific
|
|
30
|
+
parameters
|
|
31
|
+
|
|
32
|
+
= Messages in Roby log format version 5
|
|
33
|
+
|
|
34
|
+
Only executable plans log operations that are performed on them. Transactions
|
|
35
|
+
and template plans are currently not logged.
|
|
36
|
+
|
|
37
|
+
A new ExecutablePlan registers itself on the logger with
|
|
38
|
+
|
|
39
|
+
register_executable_plan plan_id
|
|
40
|
+
|
|
41
|
+
Where plan_id is ExecutablePlan#remote_id
|
|
42
|
+
|
|
43
|
+
Every plan object must be registered in an executable plan before it can be
|
|
44
|
+
referred to into other messages or objects. A plan object is registered through
|
|
45
|
+
the merged_plan hook, where the 'plan' parameter is a full dump of the task and
|
|
46
|
+
events that it contains.
|
|
47
|
+
|
|
48
|
+
After a merge_plan message, all further messages will refer to a plan object
|
|
49
|
+
through its #remote_id attribute.
|
|
50
|
+
|
|
51
|
+
merged_plan(plan, merged_plan)
|
|
52
|
+
|
|
53
|
+
Plan modification hooks
|
|
54
|
+
|
|
55
|
+
added_edge(parent, child, relations, info)
|
|
56
|
+
updated_edge_info(parent, child, relation, info)
|
|
57
|
+
removed_edge(parent, child, relations)
|
|
58
|
+
notify_plan_status_change(task, status)
|
|
59
|
+
garbage(object)
|
|
60
|
+
finalized_task(plan, task)
|
|
61
|
+
finalized_event(plan, event)
|
|
62
|
+
task_arguments_updated(task, key, value)
|
|
63
|
+
|
|
64
|
+
Event propagation hooks:
|
|
65
|
+
|
|
66
|
+
task_failed_to_start(task, reason)
|
|
67
|
+
generator_fired(event)
|
|
68
|
+
generator_emit_failed(generator, error)
|
|
69
|
+
generator_propagate_event(is_forwarding, events, generator)
|
|
70
|
+
generator_unreachable(generator, reason)
|
|
71
|
+
exception_notification(plan_id, mode, error, involved_objects)
|
|
72
|
+
mode == EXCEPTION_FATAL -> involved_objects Roby::Task
|
|
73
|
+
mode == EXCEPTION_NONFATAL -> involved_objects Roby::Task
|
|
74
|
+
mode == EXCEPTION_HANDLED -> involved_objects Roby::Task or Roby::Plan
|
|
75
|
+
|
|
76
|
+
Scheduler state:
|
|
77
|
+
|
|
78
|
+
scheduler_report_pending_non_executable_task(msg, task, *args)
|
|
79
|
+
scheduler_report_trigger(generator)
|
|
80
|
+
scheduler_report_holdoff(msg, task, *args)
|
|
81
|
+
scheduler_report_action(msg, task, *args)
|
|
82
|
+
|
|
83
|
+
Cycle information. This message always ends one cycle of data, e.g. each entry
|
|
84
|
+
in a log file will end with this message
|
|
85
|
+
|
|
86
|
+
cycle_end(info)
|
|
87
|
+
|
|
88
|
+
The info parameter is a Hash containing a list of statistics and general
|
|
89
|
+
information from the Roby ExecutionEngine. In addition, it contains the
|
|
90
|
+
following two logger-specific informations:
|
|
91
|
+
|
|
92
|
+
pos: the position of this cycle in the file
|
|
93
|
+
event_count: the number of log messages received during this cycle
|
|
94
|
+
|
|
95
|
+
The log file generated along a log file is simply a list of such cycle_end
|
|
96
|
+
messages.
|
|
97
|
+
|