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
|
Binary file
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Useful and useless tasks
|
|
3
|
+
sort_info: 40
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
So far, we have seen that the plan is basically a bunch of tasks and events that
|
|
7
|
+
are related to each other.
|
|
8
|
+
|
|
9
|
+
What this page will detail is how Roby knows what is needed by the system and
|
|
10
|
+
what is not. And what it does with the garbage ...
|
|
11
|
+
|
|
12
|
+
Missions and permanent tasks
|
|
13
|
+
----------------------------
|
|
14
|
+
In any Roby plan, a certain, usually very limited, number of tasks are marked
|
|
15
|
+
either as __missions__ or as __permanent__ tasks. The missions are the current
|
|
16
|
+
robot's main activities (i.e. what it should do). The permanent tasks are the
|
|
17
|
+
tasks that the system's controller wants to keep around, but which are not
|
|
18
|
+
essential to its function. This marking is either done manually, or
|
|
19
|
+
automatically by some of the Roby interfaces when the system is given a
|
|
20
|
+
high-level command.
|
|
21
|
+
|
|
22
|
+
Garbage collection
|
|
23
|
+
------------------
|
|
24
|
+
At the end of each execution cycle, Roby looks at all the tasks in the system's
|
|
25
|
+
plan. Tasks that are __needed__ by a mission or a permanent tasks are left
|
|
26
|
+
alone. Everything else is stopped automatically and
|
|
27
|
+
|
|
28
|
+
Roby determines what is "needed" and what is "not needed" by looking at the
|
|
29
|
+
task relations. Unless specified otherwise in the relation declaration,
|
|
30
|
+
relations all express a "needed by" relationship, i.e. the source of a relation
|
|
31
|
+
edge needs the target of that edge to function properly.
|
|
32
|
+
|
|
33
|
+
In other words, Roby follows all the relations, from the missions and permanent
|
|
34
|
+
tasks, and marks all tasks it finds as "useful". Everything else is garbage
|
|
35
|
+
collected.
|
|
36
|
+
|
|
37
|
+
The stopping order is top-down, i.e. the toplevel tasks (that are not a child in
|
|
38
|
+
one of the task relations) is stopped. Once that task is stopped, it is removed
|
|
39
|
+
from the plan and the process continues until there is nothing to stop.
|
|
40
|
+
|
|
41
|
+
In general, the garbage collection mechanism allows to manage only the
|
|
42
|
+
high-level actions (i.e. the missions), leaving the rest of the tasks in the
|
|
43
|
+
system to Roby.
|
|
44
|
+
|
|
45
|
+
Conclusion
|
|
46
|
+
----------
|
|
47
|
+
What we have seen so far:
|
|
48
|
+
|
|
49
|
+
- the concept of reactors
|
|
50
|
+
- the structuration of tasks and events in plans
|
|
51
|
+
- how these plans get executed
|
|
52
|
+
- and how, in Roby, one can only manage the high-level mission tasks, leaving
|
|
53
|
+
the cleanup to automatic garbage collection handling
|
|
54
|
+
|
|
55
|
+
The next step is to understand [how Roby represents and handles
|
|
56
|
+
errors](error_handling.html)
|
|
57
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Concepts
|
|
3
|
+
sort_info: 0
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
What Roby is:
|
|
7
|
+
|
|
8
|
+
* it is an __event based__ description of a system or of a system of systems,
|
|
9
|
+
and its(their) execution. At the root of everything are events, that
|
|
10
|
+
represent single points in time, i.e. "things" that happen during execution.
|
|
11
|
+
Roby allows to structure the reaction to these events, i.e. what code should
|
|
12
|
+
be executed when event X is received.
|
|
13
|
+
* it is __single threaded__. Roby's design is based on the reactor pattern. In
|
|
14
|
+
other words, the Roby applications are structured in a receive_event =>
|
|
15
|
+
react_to_event loop, where the reactions should not block. Roby's programming
|
|
16
|
+
interface is the tool that makes this single threaded structure usable.
|
|
17
|
+
* it is __structured__. Unlike other implementations of the reactor patterns,
|
|
18
|
+
events are heavily structured, allowing to understand more easily what
|
|
19
|
+
is happening to the system and -- in the long run -- autonomously adapting
|
|
20
|
+
during execution.
|
|
21
|
+
* it is __plan based__. It is possible, inside Roby, to represent both what
|
|
22
|
+
happened to the system in the past, but also what will happen to it in the
|
|
23
|
+
future.
|
|
24
|
+
* it is an __integration framework__. For those that know those terms: Roby is
|
|
25
|
+
not a planner, but is a plan execution layer. It is not a component
|
|
26
|
+
framework, but allows to monitor those.
|
|
27
|
+
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Plans
|
|
3
|
+
sort_info: 20
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Now that we have seen what the [reactor pattern](reactor.html) is about, we will
|
|
7
|
+
dig a bit more into how things are managed inside Roby.
|
|
8
|
+
|
|
9
|
+
The main issue with reactor frameworks in general is their inability to offer a
|
|
10
|
+
high-level structure. Events are the only things that you deal with. This
|
|
11
|
+
becomes tedious when errors happen, as tracking down what caused the errors are
|
|
12
|
+
very hard. Since Roby is designed with the ability, in the long run, to have
|
|
13
|
+
the systems _autonomously_ repair the errors, that's not acceptable.
|
|
14
|
+
|
|
15
|
+
So, in contrast, Roby tries very hard to provide a structure to what happens to the
|
|
16
|
+
system. This page will describe how this is done
|
|
17
|
+
|
|
18
|
+
The root data structure is the __plan__. A plan is basically a collection of plan objects
|
|
19
|
+
(events and tasks, see below) that are linked in different __relations__. Relations,
|
|
20
|
+
in this context, are graphs that link two plan objects together, while adding some
|
|
21
|
+
additional information to describe how they are related.
|
|
22
|
+
|
|
23
|
+
Plan Objects
|
|
24
|
+
------------
|
|
25
|
+
The basic object is the __event__. Events are, obviously, a representation of
|
|
26
|
+
what happens to the system. As we will see later, it is also a way to represent
|
|
27
|
+
which commands can be sent to it.
|
|
28
|
+
|
|
29
|
+
Events are usually (but not necessarily) grouped in **tasks**. While events are
|
|
30
|
+
single-shot, i.e. represent one thing that happened to the system, tasks
|
|
31
|
+
represent what the system (or other systems) do in the long run. For instance,
|
|
32
|
+
one could represent the fact that the battery of a robot gets low with a single
|
|
33
|
+
battery_low event, but would represent the fact that the robot moves to a certain
|
|
34
|
+
position with a move_to_position task. In other words, the event represents a
|
|
35
|
+
single point in time, while tasks represent processes that change in time.
|
|
36
|
+
|
|
37
|
+
As mentionned, plans therefore contain _free events_, i.e. events that are not
|
|
38
|
+
part of a task, and _task events_, i.e. events that are given meaning by the
|
|
39
|
+
task they are in. Building on the example above, the fact that the robot
|
|
40
|
+
reached its destination could be represented by a free reached_destination
|
|
41
|
+
event, but would in effect be represented as the success of the
|
|
42
|
+
move_to_position task, i.e. as the success event of that task.
|
|
43
|
+
|
|
44
|
+
Relations
|
|
45
|
+
---------
|
|
46
|
+
In a Roby plan, relations describe how the events and tasks are related to each
|
|
47
|
+
other.
|
|
48
|
+
|
|
49
|
+
For instance, the most common __task relation__ is the dependency: it says that
|
|
50
|
+
a given task requires "something" from another task. What is actually required
|
|
51
|
+
is added as additional information to each edge in the relation graph. In our
|
|
52
|
+
move_to_position example above, it is very likely that the move_to_position task
|
|
53
|
+
would depend on a localization task (i.e. the robot would need to know where it
|
|
54
|
+
is to go to reach its goal).
|
|
55
|
+
|
|
56
|
+
Common __event relations__ describe how the system should evolve in time: for
|
|
57
|
+
instance, the temporal relation allows to say that an event should happend (a.k.a.
|
|
58
|
+
be emitted) after another, allowing to build sequences by expressing that the stop
|
|
59
|
+
event of a task should happen before the start event of another.
|
|
60
|
+
|
|
61
|
+
Relations are not fixed, i.e. Roby can be augmented with additional relations.
|
|
62
|
+
However, the most standard relations are predefined in the Roby core
|
|
63
|
+
application.
|
|
64
|
+
|
|
65
|
+
Example
|
|
66
|
+
-------
|
|
67
|
+
To put these concepts into play, let's represent what could be a Roby plan to
|
|
68
|
+
represent the following scenario:
|
|
69
|
+
|
|
70
|
+
* go to position (10, 10)
|
|
71
|
+
* then, go to position (20, 10)
|
|
72
|
+
* both movements require localization to run
|
|
73
|
+
* if the battery is low, abort
|
|
74
|
+
|
|
75
|
+
To match the Roby nomenclature, the task types are represented in CamelCase
|
|
76
|
+
(i.e. MoveTo) and the events in snake_case (i.e. battery_low)
|
|
77
|
+
|
|
78
|
+

|
|
79
|
+
{: .center}
|
|
80
|
+
|
|
81
|
+
This example shows another aspect of the events: the event commands. Let's
|
|
82
|
+
explain that.
|
|
83
|
+
|
|
84
|
+
Events as commands
|
|
85
|
+
------------------
|
|
86
|
+
As mentionned earlier, events are both a way to represent what happened __(past
|
|
87
|
+
tense)__ to the system and a way to __command__ the system. The command side of
|
|
88
|
+
the events can be explained as follows: event commands are_a way to make sure
|
|
89
|
+
that the event is going to be emitted_.
|
|
90
|
+
|
|
91
|
+
For instance, in the above example, the stop events of MoveTo has a command.
|
|
92
|
+
This command, when called, ensures that the task gets stopped, i.e. that the
|
|
93
|
+
event is emitted. The __signals__ relation that is added between low_battery and
|
|
94
|
+
stop represents that this command should be called whenever the low_battery
|
|
95
|
+
event is emitted. In other words: the MoveTo tasks should be stopped when the
|
|
96
|
+
battery is low.
|
|
97
|
+
|
|
98
|
+
Conclusion
|
|
99
|
+
----------
|
|
100
|
+
That's all for the description of plans. The [next page](execution.html) will lead you to the
|
|
101
|
+
execution, i.e. what code is executed when, and why.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Policy
|
|
3
|
+
sort_info: 60
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Let's look at the following situation. One creates a plan in which a MoveTo
|
|
7
|
+
task depends on an already running Localization task. In this plan, MoveTo is
|
|
8
|
+
not yet running while Localization already is. **Before** MoveTo gets started,
|
|
9
|
+
Localization fails.
|
|
10
|
+
|
|
11
|
+
Is that an error or not ?
|
|
12
|
+
|
|
13
|
+
In principle, not, as there is time to restart a new Localization task without
|
|
14
|
+
affecting the ability of MoveTo to achieve its goal. However, this assumes that
|
|
15
|
+
there is a high-level process that will exactly do that (which is not the case
|
|
16
|
+
by default in Roby).
|
|
17
|
+
|
|
18
|
+
This kind of "decisions", or policies, that need to be made during execution
|
|
19
|
+
are all centralized in a single component called the decision control component.
|
|
20
|
+
In Roby, this is a single class.
|
|
21
|
+
|
|
22
|
+
This class embeds all of Roby's default policies. It can be modified so as to
|
|
23
|
+
change the default behaviour on these cases where there is not a "one fits
|
|
24
|
+
all" rule.
|
|
25
|
+
|
|
26
|
+
Conclusion
|
|
27
|
+
----------
|
|
28
|
+
This finishes the explanation of Roby concepts. The rest of the documentation
|
|
29
|
+
will guide you through the Roby API so that you can start using it to control
|
|
30
|
+
your own systems ...
|
|
31
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: The Reactor Pattern
|
|
3
|
+
sort_info: 10
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
__Note__ all the code blocks in this page are pseudocode. They are close to what
|
|
7
|
+
you will do in Roby, but are not Roby API.
|
|
8
|
+
{: .warning}
|
|
9
|
+
|
|
10
|
+
The execution layer in Roby can be summarized in a single big loop:
|
|
11
|
+
|
|
12
|
+
{coderay:: ruby}
|
|
13
|
+
loop do
|
|
14
|
+
events = read_events
|
|
15
|
+
react_to_events(events)
|
|
16
|
+
end
|
|
17
|
+
{coderay}
|
|
18
|
+
|
|
19
|
+
Where 'events' can represent anything: from some sensor data (e.g. a button got
|
|
20
|
+
pressed), to some reports from some outside process (e.g. process X crashed), to
|
|
21
|
+
some events internally generated inside the Roby process itself (you're late for
|
|
22
|
+
your 12:00 appointment).
|
|
23
|
+
|
|
24
|
+
The __reaction__ to these events is some code that is being executed. Roby has
|
|
25
|
+
quite a few ways to handle this, but we won't talk about it yet. The important
|
|
26
|
+
point, to understand the concept of the __reactor pattern__ is that the complete
|
|
27
|
+
execution cycle above is __single threaded__. It means that the code that reacts
|
|
28
|
+
to these events should __never block__ (or it will block the complete reactor).
|
|
29
|
+
|
|
30
|
+
Let's assume we have two events: button_pressed and button_released. One could
|
|
31
|
+
(naively) do:
|
|
32
|
+
|
|
33
|
+
{coderay:: ruby}
|
|
34
|
+
button_pressed.on do |event|
|
|
35
|
+
# Wait for the button to be released
|
|
36
|
+
while !button_released.emitted?
|
|
37
|
+
sleep 0.1
|
|
38
|
+
end
|
|
39
|
+
puts "you successfully clicked the button !"
|
|
40
|
+
end
|
|
41
|
+
{coderay}
|
|
42
|
+
|
|
43
|
+
Since the reactor is single threaded, the button_released.emitted? method
|
|
44
|
+
__cannot__ change value: if it has been released in the past, it will return
|
|
45
|
+
true, otherwise it will always return false as the first line of the main loop
|
|
46
|
+
is not executed until the block returns. The right way to code this behaviour in
|
|
47
|
+
a reactor would be:
|
|
48
|
+
|
|
49
|
+
{coderay:: ruby}
|
|
50
|
+
emitted = false
|
|
51
|
+
button_pressed.on do |event|
|
|
52
|
+
emitted = true
|
|
53
|
+
end
|
|
54
|
+
button_released.on do |event|
|
|
55
|
+
if emitted
|
|
56
|
+
puts "you successfully clicked the button !"
|
|
57
|
+
end
|
|
58
|
+
emitted = false
|
|
59
|
+
end
|
|
60
|
+
{coderay}
|
|
61
|
+
|
|
Binary file
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<svg
|
|
3
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
4
|
+
xmlns:cc="http://creativecommons.org/ns#"
|
|
5
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
6
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
9
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
10
|
+
width="3500.26mm"
|
|
11
|
+
height="752.828mm"
|
|
12
|
+
viewBox="0 0 9922 2134"
|
|
13
|
+
version="1.2"
|
|
14
|
+
id="svg2"
|
|
15
|
+
sodipodi:version="0.32"
|
|
16
|
+
inkscape:version="0.48.2 r9819"
|
|
17
|
+
sodipodi:docname="simple_plan_example.svg"
|
|
18
|
+
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
|
19
|
+
inkscape:export-filename="/media/Data/rock/imoby/tools/roby/doc/guide/src/concepts/simple_plan_example.png"
|
|
20
|
+
inkscape:export-xdpi="74.851677"
|
|
21
|
+
inkscape:export-ydpi="74.851677">
|
|
22
|
+
<metadata
|
|
23
|
+
id="metadata3877">
|
|
24
|
+
<rdf:RDF>
|
|
25
|
+
<cc:Work
|
|
26
|
+
rdf:about="">
|
|
27
|
+
<dc:format>image/svg+xml</dc:format>
|
|
28
|
+
<dc:type
|
|
29
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
30
|
+
<dc:title>Qt Svg Document</dc:title>
|
|
31
|
+
</cc:Work>
|
|
32
|
+
</rdf:RDF>
|
|
33
|
+
</metadata>
|
|
34
|
+
<sodipodi:namedview
|
|
35
|
+
inkscape:window-height="898"
|
|
36
|
+
inkscape:window-width="1902"
|
|
37
|
+
inkscape:pageshadow="2"
|
|
38
|
+
inkscape:pageopacity="0.0"
|
|
39
|
+
guidetolerance="10.0"
|
|
40
|
+
gridtolerance="10.0"
|
|
41
|
+
objecttolerance="10.0"
|
|
42
|
+
borderopacity="1.0"
|
|
43
|
+
bordercolor="#666666"
|
|
44
|
+
pagecolor="#ffffff"
|
|
45
|
+
id="base"
|
|
46
|
+
inkscape:zoom="1.4376465"
|
|
47
|
+
inkscape:cx="6407.0027"
|
|
48
|
+
inkscape:cy="895.55018"
|
|
49
|
+
inkscape:window-x="10"
|
|
50
|
+
inkscape:window-y="153"
|
|
51
|
+
inkscape:current-layer="svg2"
|
|
52
|
+
showgrid="false"
|
|
53
|
+
inkscape:window-maximized="0" />
|
|
54
|
+
<title
|
|
55
|
+
id="title4">Qt Svg Document</title>
|
|
56
|
+
<desc
|
|
57
|
+
id="desc6">Generated with Qt</desc>
|
|
58
|
+
<defs
|
|
59
|
+
id="defs8">
|
|
60
|
+
<marker
|
|
61
|
+
inkscape:stockid="TriangleOutL"
|
|
62
|
+
orient="auto"
|
|
63
|
+
refY="0.0"
|
|
64
|
+
refX="0.0"
|
|
65
|
+
id="TriangleOutL"
|
|
66
|
+
style="overflow:visible">
|
|
67
|
+
<path
|
|
68
|
+
id="path6671"
|
|
69
|
+
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
|
|
70
|
+
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
|
|
71
|
+
transform="scale(0.8)" />
|
|
72
|
+
</marker>
|
|
73
|
+
<marker
|
|
74
|
+
inkscape:stockid="TriangleOutM"
|
|
75
|
+
orient="auto"
|
|
76
|
+
refY="0.0"
|
|
77
|
+
refX="0.0"
|
|
78
|
+
id="TriangleOutM"
|
|
79
|
+
style="overflow:visible">
|
|
80
|
+
<path
|
|
81
|
+
id="path6674"
|
|
82
|
+
d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
|
|
83
|
+
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
|
|
84
|
+
transform="scale(0.4)" />
|
|
85
|
+
</marker>
|
|
86
|
+
<marker
|
|
87
|
+
inkscape:stockid="TriangleOutL"
|
|
88
|
+
orient="auto"
|
|
89
|
+
refY="0"
|
|
90
|
+
refX="0"
|
|
91
|
+
id="TriangleOutL-9"
|
|
92
|
+
style="overflow:visible">
|
|
93
|
+
<path
|
|
94
|
+
inkscape:connector-curvature="0"
|
|
95
|
+
id="path6671-8"
|
|
96
|
+
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
|
97
|
+
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
|
98
|
+
transform="scale(0.8,0.8)" />
|
|
99
|
+
</marker>
|
|
100
|
+
<marker
|
|
101
|
+
inkscape:stockid="TriangleOutL"
|
|
102
|
+
orient="auto"
|
|
103
|
+
refY="0"
|
|
104
|
+
refX="0"
|
|
105
|
+
id="TriangleOutL-4"
|
|
106
|
+
style="overflow:visible">
|
|
107
|
+
<path
|
|
108
|
+
inkscape:connector-curvature="0"
|
|
109
|
+
id="path6671-83"
|
|
110
|
+
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
|
111
|
+
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
|
112
|
+
transform="scale(0.8,0.8)" />
|
|
113
|
+
</marker>
|
|
114
|
+
<marker
|
|
115
|
+
inkscape:stockid="TriangleOutL"
|
|
116
|
+
orient="auto"
|
|
117
|
+
refY="0"
|
|
118
|
+
refX="0"
|
|
119
|
+
id="TriangleOutL-8"
|
|
120
|
+
style="overflow:visible">
|
|
121
|
+
<path
|
|
122
|
+
inkscape:connector-curvature="0"
|
|
123
|
+
id="path6671-4"
|
|
124
|
+
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
|
125
|
+
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
|
126
|
+
transform="scale(0.8,0.8)" />
|
|
127
|
+
</marker>
|
|
128
|
+
<marker
|
|
129
|
+
inkscape:stockid="TriangleOutL"
|
|
130
|
+
orient="auto"
|
|
131
|
+
refY="0"
|
|
132
|
+
refX="0"
|
|
133
|
+
id="TriangleOutL-95"
|
|
134
|
+
style="overflow:visible">
|
|
135
|
+
<path
|
|
136
|
+
inkscape:connector-curvature="0"
|
|
137
|
+
id="path6671-1"
|
|
138
|
+
d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
|
|
139
|
+
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
|
140
|
+
transform="scale(0.8,0.8)" />
|
|
141
|
+
</marker>
|
|
142
|
+
</defs>
|
|
143
|
+
<text
|
|
144
|
+
x="4856.8403"
|
|
145
|
+
y="1403.7415"
|
|
146
|
+
font-size="9pt"
|
|
147
|
+
font-weight="400"
|
|
148
|
+
font-style="normal"
|
|
149
|
+
id="text2186-4"
|
|
150
|
+
style="font-size:8.99831295px;font-style:normal;font-weight:400;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;font-family:Sans Serif">MoveTo(:goal=>(10,10))</text>
|
|
151
|
+
<text
|
|
152
|
+
x="5107.4355"
|
|
153
|
+
y="1427.113"
|
|
154
|
+
font-size="9pt"
|
|
155
|
+
font-weight="400"
|
|
156
|
+
font-style="normal"
|
|
157
|
+
id="text2186-4-3"
|
|
158
|
+
style="font-size:8.99831295px;font-style:normal;font-weight:400;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;font-family:Sans Serif">MoveTo(:goal=>(20,10))</text>
|
|
159
|
+
<path
|
|
160
|
+
inkscape:connector-curvature="0"
|
|
161
|
+
d="m 5121.1988,1433.0818 122.6946,0 0,24.0298 -122.6946,0 0,-24.0298"
|
|
162
|
+
id="path2174-8-3"
|
|
163
|
+
style="font-size:11.25px;font-style:normal;font-weight:400;color:#000000;fill:#b0ffa6;fill-opacity:1;fill-rule:evenodd;stroke:#b0ffa6;stroke-width:0.79833692;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans Serif" />
|
|
164
|
+
<text
|
|
165
|
+
x="5165.5713"
|
|
166
|
+
y="1451.3098"
|
|
167
|
+
font-size="9pt"
|
|
168
|
+
font-weight="400"
|
|
169
|
+
font-style="normal"
|
|
170
|
+
id="text2212-1-5"
|
|
171
|
+
style="font-size:8.99831295px;font-style:normal;font-weight:400;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;font-family:Sans Serif">success</text>
|
|
172
|
+
<text
|
|
173
|
+
x="5128.833"
|
|
174
|
+
y="1451.9491"
|
|
175
|
+
font-size="9pt"
|
|
176
|
+
font-weight="400"
|
|
177
|
+
font-style="normal"
|
|
178
|
+
id="text8956-6-3"
|
|
179
|
+
style="font-size:8.99831295px;font-style:normal;font-weight:400;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;font-family:Sans Serif">start</text>
|
|
180
|
+
<path
|
|
181
|
+
inkscape:connector-curvature="0"
|
|
182
|
+
d="m 5184.2495,1440.9601 c 0,1.3252 -1.0744,2.3996 -2.3996,2.3996 -1.3252,0 -2.3995,-1.0744 -2.3995,-2.3996 0,-1.3252 1.0743,-2.3996 2.3995,-2.3996 1.3252,0 2.3996,1.0744 2.3996,2.3996"
|
|
183
|
+
id="path2200-3-3"
|
|
184
|
+
style="font-size:11.25px;font-style:normal;font-weight:400;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7995255;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans Serif" />
|
|
185
|
+
<path
|
|
186
|
+
inkscape:connector-curvature="0"
|
|
187
|
+
d="m 5142.8323,1440.9602 c 0,1.3252 -1.0744,2.3995 -2.3996,2.3995 -1.3252,0 -2.3995,-1.0743 -2.3995,-2.3995 0,-1.3252 1.0743,-2.3996 2.3995,-2.3996 1.3252,0 2.3996,1.0744 2.3996,2.3996"
|
|
188
|
+
id="path8952-6-6"
|
|
189
|
+
style="font-size:11.25px;font-style:normal;font-weight:400;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.79984999;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1;font-family:Sans Serif" />
|
|
190
|
+
<text
|
|
191
|
+
xml:space="preserve"
|
|
192
|
+
style="font-size:9.60000324px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
|
|
193
|
+
x="4973.1294"
|
|
194
|
+
y="1437.7238"
|
|
195
|
+
id="text7155"
|
|
196
|
+
sodipodi:linespacing="125%"><tspan
|
|
197
|
+
sodipodi:role="line"
|
|
198
|
+
id="tspan7157"
|
|
199
|
+
x="4973.1294"
|
|
200
|
+
y="1437.7238"
|
|
201
|
+
style="font-style:italic;-inkscape-font-specification:Arial Italic">Event relation:</tspan><tspan
|
|
202
|
+
sodipodi:role="line"
|
|
203
|
+
x="4973.1294"
|
|
204
|
+
y="1449.7238"
|
|
205
|
+
style="font-style:normal;-inkscape-font-specification:Arial"
|
|
206
|
+
id="tspan7161">start <tspan
|
|
207
|
+
style="font-weight:bold;-inkscape-font-specification:Arial Bold"
|
|
208
|
+
id="tspan7163">should_emit_after</tspan> success</tspan><tspan
|
|
209
|
+
sodipodi:role="line"
|
|
210
|
+
x="4973.1294"
|
|
211
|
+
y="1461.7238"
|
|
212
|
+
style="font-style:normal;-inkscape-font-specification:Arial"
|
|
213
|
+
id="tspan7159" /></text>
|
|
214
|
+
<path
|
|
215
|
+
style="fill:none;stroke:#000000;stroke-width:0.80000025px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#TriangleOutL)"
|
|
216
|
+
d="m 4927.3322,1462.7659 81.0514,80.448"
|
|
217
|
+
id="path5755-7"
|
|
218
|
+
inkscape:connector-curvature="0" />
|
|
219
|
+
<path
|
|
220
|
+
style="fill:none;stroke:#000000;stroke-width:0.80000025px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#TriangleOutL)"
|
|
221
|
+
d="m 5162.3629,1457.7577 -91.293,85.2993"
|
|
222
|
+
id="path5755-7-2"
|
|
223
|
+
inkscape:connector-curvature="0" />
|
|
224
|
+
<g
|
|
225
|
+
id="g5712-9-3"
|
|
226
|
+
transform="translate(131.88223,272.23447)">
|
|
227
|
+
<path
|
|
228
|
+
style="font-size:11.25px;font-style:normal;font-weight:400;color:#000000;fill:#b0ffa6;fill-opacity:1;fill-rule:evenodd;stroke:#b0ffa6;stroke-width:0.79833692;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans Serif"
|
|
229
|
+
id="path2174-8-3-6"
|
|
230
|
+
d="m 4868.378,1275.4792 78.1773,0 0,29.5944 -78.1773,0 0,-29.5944"
|
|
231
|
+
inkscape:connector-curvature="0" />
|
|
232
|
+
</g>
|
|
233
|
+
<text
|
|
234
|
+
x="5012.4229"
|
|
235
|
+
y="1587.8778"
|
|
236
|
+
font-size="9pt"
|
|
237
|
+
font-weight="400"
|
|
238
|
+
font-style="normal"
|
|
239
|
+
id="text2186-4-1"
|
|
240
|
+
style="font-size:8.99831295px;font-style:normal;font-weight:400;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;font-family:Sans Serif">Localization</text>
|
|
241
|
+
<text
|
|
242
|
+
xml:space="preserve"
|
|
243
|
+
style="font-size:9.60000324px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
|
|
244
|
+
x="4968.1147"
|
|
245
|
+
y="1489.4395"
|
|
246
|
+
id="text7155-9"
|
|
247
|
+
sodipodi:linespacing="125%"><tspan
|
|
248
|
+
sodipodi:role="line"
|
|
249
|
+
id="tspan7157-9"
|
|
250
|
+
x="4968.1147"
|
|
251
|
+
y="1489.4395"
|
|
252
|
+
style="font-style:italic;-inkscape-font-specification:Arial Italic">Task relation:</tspan><tspan
|
|
253
|
+
sodipodi:role="line"
|
|
254
|
+
x="4968.1147"
|
|
255
|
+
y="1501.4395"
|
|
256
|
+
style="font-style:normal;font-weight:normal;-inkscape-font-specification:Arial Bold"
|
|
257
|
+
id="tspan7161-2">MoveTo <tspan
|
|
258
|
+
style="font-weight:bold"
|
|
259
|
+
id="tspan7326">depends_on </tspan>Localization</tspan><tspan
|
|
260
|
+
sodipodi:role="line"
|
|
261
|
+
x="4968.1147"
|
|
262
|
+
y="1513.4395"
|
|
263
|
+
style="font-style:normal;-inkscape-font-specification:Arial"
|
|
264
|
+
id="tspan7159-9" /></text>
|
|
265
|
+
<text
|
|
266
|
+
x="4933.9927"
|
|
267
|
+
y="1332.0088"
|
|
268
|
+
font-size="9pt"
|
|
269
|
+
font-weight="400"
|
|
270
|
+
font-style="normal"
|
|
271
|
+
id="text2212-1-3"
|
|
272
|
+
style="font-size:8.99831295px;font-style:normal;font-weight:400;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;font-family:Sans Serif">battery_low</text>
|
|
273
|
+
<path
|
|
274
|
+
inkscape:connector-curvature="0"
|
|
275
|
+
d="m 4996.4255,1329.367 c 0,1.3252 -1.0744,2.3996 -2.3996,2.3996 -1.3252,0 -2.3995,-1.0744 -2.3995,-2.3996 0,-1.3252 1.0743,-2.3996 2.3995,-2.3996 1.3252,0 2.3996,1.0744 2.3996,2.3996"
|
|
276
|
+
id="path2200-3-8"
|
|
277
|
+
style="font-size:11.25px;font-style:normal;font-weight:400;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7995255;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans Serif" />
|
|
278
|
+
<path
|
|
279
|
+
style="fill:none;stroke:#000000;stroke-width:0.80000019px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#TriangleOutL)"
|
|
280
|
+
d="m 4995.4874,1330.7901 181.4334,106.8121"
|
|
281
|
+
id="path5755-8"
|
|
282
|
+
inkscape:connector-curvature="0" />
|
|
283
|
+
<text
|
|
284
|
+
x="5217.0273"
|
|
285
|
+
y="1451.0769"
|
|
286
|
+
font-size="9pt"
|
|
287
|
+
font-weight="400"
|
|
288
|
+
font-style="normal"
|
|
289
|
+
id="text2212-1-5-8"
|
|
290
|
+
style="font-size:8.99831295px;font-style:normal;font-weight:400;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;font-family:Sans Serif">stop</text>
|
|
291
|
+
<path
|
|
292
|
+
inkscape:connector-curvature="0"
|
|
293
|
+
d="m 5229.0281,1440.9601 c 0,1.3252 -1.0744,2.3996 -2.3996,2.3996 -1.3252,0 -2.3995,-1.0744 -2.3995,-2.3996 0,-1.3252 1.0743,-2.3996 2.3995,-2.3996 1.3252,0 2.3996,1.0744 2.3996,2.3996"
|
|
294
|
+
id="path2200-3-3-9"
|
|
295
|
+
style="font-size:11.25px;font-style:normal;font-weight:400;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7995255;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans Serif" />
|
|
296
|
+
<text
|
|
297
|
+
xml:space="preserve"
|
|
298
|
+
style="font-size:9.60000324px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
|
|
299
|
+
x="4969.2271"
|
|
300
|
+
y="1369.7993"
|
|
301
|
+
id="text7155-0"
|
|
302
|
+
sodipodi:linespacing="125%"><tspan
|
|
303
|
+
sodipodi:role="line"
|
|
304
|
+
id="tspan7157-6"
|
|
305
|
+
x="4969.2271"
|
|
306
|
+
y="1369.7993"
|
|
307
|
+
style="font-style:italic;-inkscape-font-specification:Arial Italic">Event relation:</tspan><tspan
|
|
308
|
+
sodipodi:role="line"
|
|
309
|
+
x="4969.2271"
|
|
310
|
+
y="1381.7993"
|
|
311
|
+
style="font-style:normal;font-weight:bold;-inkscape-font-specification:Arial Bold"
|
|
312
|
+
id="tspan7161-20"><tspan
|
|
313
|
+
style="font-weight:normal"
|
|
314
|
+
id="tspan7437">battery_low</tspan> signals <tspan
|
|
315
|
+
style="font-weight:normal"
|
|
316
|
+
id="tspan7439">stop</tspan></tspan><tspan
|
|
317
|
+
sodipodi:role="line"
|
|
318
|
+
x="4969.2271"
|
|
319
|
+
y="1393.7993"
|
|
320
|
+
style="font-style:normal;-inkscape-font-specification:Arial"
|
|
321
|
+
id="tspan7159-2" /></text>
|
|
322
|
+
<path
|
|
323
|
+
inkscape:connector-curvature="0"
|
|
324
|
+
d="m 4856.8778,1411.9362 99.3231,0 0,45.1754 -99.3231,0 0,-45.1754"
|
|
325
|
+
id="path2174-8-3-3"
|
|
326
|
+
style="font-size:11.25px;font-style:normal;font-weight:400;color:#000000;fill:#b0ffa6;fill-opacity:1;fill-rule:evenodd;stroke:#b0ffa6;stroke-width:0.79833686;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans Serif" />
|
|
327
|
+
<text
|
|
328
|
+
x="4902.3633"
|
|
329
|
+
y="1451.3098"
|
|
330
|
+
font-size="9pt"
|
|
331
|
+
font-weight="400"
|
|
332
|
+
font-style="normal"
|
|
333
|
+
id="text2212-1-5-9"
|
|
334
|
+
style="font-size:8.99831295px;font-style:normal;font-weight:400;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;font-family:Sans Serif">success</text>
|
|
335
|
+
<text
|
|
336
|
+
x="4865.625"
|
|
337
|
+
y="1451.9491"
|
|
338
|
+
font-size="9pt"
|
|
339
|
+
font-weight="400"
|
|
340
|
+
font-style="normal"
|
|
341
|
+
id="text8956-6-3-7"
|
|
342
|
+
style="font-size:8.99831295px;font-style:normal;font-weight:400;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;font-family:Sans Serif">start</text>
|
|
343
|
+
<path
|
|
344
|
+
inkscape:connector-curvature="0"
|
|
345
|
+
d="m 4921.0415,1440.9601 c 0,1.3252 -1.0744,2.3996 -2.3996,2.3996 -1.3252,0 -2.3995,-1.0744 -2.3995,-2.3996 0,-1.3252 1.0743,-2.3996 2.3995,-2.3996 1.3252,0 2.3996,1.0744 2.3996,2.3996"
|
|
346
|
+
id="path2200-3-3-4"
|
|
347
|
+
style="font-size:11.25px;font-style:normal;font-weight:400;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7995255;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans Serif" />
|
|
348
|
+
<path
|
|
349
|
+
inkscape:connector-curvature="0"
|
|
350
|
+
d="m 4879.6243,1440.9602 c 0,1.3252 -1.0744,2.3995 -2.3996,2.3995 -1.3252,0 -2.3995,-1.0743 -2.3995,-2.3995 0,-1.3252 1.0743,-2.3996 2.3995,-2.3996 1.3252,0 2.3996,1.0744 2.3996,2.3996"
|
|
351
|
+
id="path8952-6-6-0"
|
|
352
|
+
style="font-size:11.25px;font-style:normal;font-weight:400;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:0.79984999;stroke-linecap:square;stroke-linejoin:bevel;stroke-opacity:1;font-family:Sans Serif" />
|
|
353
|
+
<text
|
|
354
|
+
x="4933.23"
|
|
355
|
+
y="1429.9313"
|
|
356
|
+
font-size="9pt"
|
|
357
|
+
font-weight="400"
|
|
358
|
+
font-style="normal"
|
|
359
|
+
id="text2212-1-5-8-1"
|
|
360
|
+
style="font-size:8.99831295px;font-style:normal;font-weight:400;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;font-family:Sans Serif">stop</text>
|
|
361
|
+
<path
|
|
362
|
+
inkscape:connector-curvature="0"
|
|
363
|
+
d="m 4945.2309,1419.8144 c 0,1.3252 -1.0744,2.3996 -2.3996,2.3996 -1.3252,0 -2.3995,-1.0744 -2.3995,-2.3996 0,-1.3252 1.0743,-2.3996 2.3995,-2.3996 1.3252,0 2.3996,1.0744 2.3996,2.3996"
|
|
364
|
+
id="path2200-3-3-9-0"
|
|
365
|
+
style="font-size:11.25px;font-style:normal;font-weight:400;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7995255;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans Serif" />
|
|
366
|
+
<path
|
|
367
|
+
style="fill:none;stroke:#000000;stroke-width:0.80000025px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#TriangleOutL)"
|
|
368
|
+
d="m 4921.3783,1441.2014 210.9016,0"
|
|
369
|
+
id="path5755"
|
|
370
|
+
inkscape:connector-curvature="0" />
|
|
371
|
+
<path
|
|
372
|
+
style="fill:none;stroke:#000000;stroke-width:0.80000019px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#TriangleOutL)"
|
|
373
|
+
d="m 4992.066,1331.3061 -46.5047,83.6243"
|
|
374
|
+
id="path5755-8-3"
|
|
375
|
+
inkscape:connector-curvature="0" />
|
|
376
|
+
</svg>
|