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.
Files changed (644) hide show
  1. checksums.yaml +7 -0
  2. data/.deep-cover.rb +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +24 -0
  5. data/.simplecov +10 -0
  6. data/.travis.yml +17 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +15 -0
  9. data/README.md +11 -0
  10. data/Rakefile +47 -177
  11. data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
  12. data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
  13. data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
  14. data/benchmark/{genom.rb → attic/genom.rb} +0 -0
  15. data/benchmark/attic/transactions.rb +62 -0
  16. data/benchmark/plan_basic_operations.rb +28 -0
  17. data/benchmark/relations/graph.rb +63 -0
  18. data/benchmark/ruby/identity.rb +18 -0
  19. data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
  20. data/benchmark/ruby/yield_vs_block.rb +35 -0
  21. data/benchmark/run +5 -0
  22. data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
  23. data/benchmark/transactions.rb +99 -51
  24. data/bin/roby +38 -197
  25. data/bin/roby-display +14 -0
  26. data/bin/roby-log +3 -176
  27. data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
  28. data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
  29. data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
  30. data/doc/guide/{src → attic}/abstraction/index.page +1 -1
  31. data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
  32. data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
  33. data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
  34. data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
  35. data/doc/guide/attic/cycle/error_handling.page +98 -0
  36. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
  37. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
  38. data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
  39. data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
  40. data/doc/guide/{src → attic}/cycle/index.page +1 -1
  41. data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
  42. data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
  43. data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
  44. data/doc/guide/attic/plans/building_plans.page +89 -0
  45. data/doc/guide/attic/plans/code.page +192 -0
  46. data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
  47. data/doc/guide/attic/plans/index.page +7 -0
  48. data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
  49. data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
  50. data/doc/guide/attic/plans/querying_plans.page +5 -0
  51. data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
  52. data/doc/guide/config.yaml +7 -4
  53. data/doc/guide/ext/extended_menu.rb +29 -0
  54. data/doc/guide/ext/init.rb +6 -0
  55. data/doc/guide/ext/rdoc_links.rb +7 -6
  56. data/doc/guide/src/advanced_concepts/history.page +5 -0
  57. data/doc/guide/src/advanced_concepts/index.page +11 -0
  58. data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
  59. data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
  60. data/doc/guide/src/advanced_concepts/transactions.page +5 -0
  61. data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
  62. data/doc/guide/src/base.template +96 -0
  63. data/doc/guide/src/basics_shell_header.txt +5 -7
  64. data/doc/guide/src/building/action_coordination.page +96 -0
  65. data/doc/guide/src/building/actions.page +124 -0
  66. data/doc/guide/src/building/file_layout.page +71 -0
  67. data/doc/guide/src/building/index.page +50 -0
  68. data/doc/guide/src/building/patterns.page +86 -0
  69. data/doc/guide/src/building/patterns_forwarding.png +0 -0
  70. data/doc/guide/src/building/patterns_forwarding.svg +277 -0
  71. data/doc/guide/src/building/runtime.page +95 -0
  72. data/doc/guide/src/building/task_models.page +94 -0
  73. data/doc/guide/src/building/tasks.page +284 -0
  74. data/doc/guide/src/concepts/error_handling.page +100 -0
  75. data/doc/guide/src/concepts/exception_propagation.png +0 -0
  76. data/doc/guide/src/concepts/exception_propagation.svg +445 -0
  77. data/doc/guide/src/concepts/execution.page +85 -0
  78. data/doc/guide/src/concepts/execution.png +0 -0
  79. data/doc/guide/src/concepts/execution.svg +573 -0
  80. data/doc/guide/src/concepts/execution_cycle.png +0 -0
  81. data/doc/guide/src/concepts/garbage_collection.page +57 -0
  82. data/doc/guide/src/concepts/index.page +27 -0
  83. data/doc/guide/src/concepts/plans.page +101 -0
  84. data/doc/guide/src/concepts/policy.page +31 -0
  85. data/doc/guide/src/concepts/reactor.page +61 -0
  86. data/doc/guide/src/concepts/simple_plan_example.png +0 -0
  87. data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
  88. data/doc/guide/src/default.template +9 -74
  89. data/doc/guide/src/event_relations/forward.page +71 -0
  90. data/doc/guide/src/event_relations/index.page +12 -0
  91. data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
  92. data/doc/guide/src/event_relations/signal.page +55 -0
  93. data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
  94. data/doc/guide/src/htmldoc.metainfo +21 -8
  95. data/doc/guide/src/index.page +8 -3
  96. data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
  97. data/doc/guide/src/installation/publications.page +14 -0
  98. data/doc/guide/src/{introduction → installation}/videos.page +14 -7
  99. data/doc/guide/src/interacting/index.page +16 -0
  100. data/doc/guide/src/interacting/run.page +33 -0
  101. data/doc/guide/src/interacting/shell.page +95 -0
  102. data/doc/guide/src/plugins/creating_plugins.page +72 -0
  103. data/doc/guide/src/plugins/index.page +27 -5
  104. data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
  105. data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
  106. data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
  107. data/doc/guide/src/style_screen.css +687 -0
  108. data/doc/guide/src/task_relations/dependency.page +107 -0
  109. data/doc/guide/src/task_relations/executed_by.page +77 -0
  110. data/doc/guide/src/task_relations/index.page +12 -0
  111. data/doc/guide/src/task_relations/new_relations.page +119 -0
  112. data/doc/guide/src/task_relations/planned_by.page +46 -0
  113. data/doc/guide/src/tutorial/app.page +117 -0
  114. data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
  115. data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
  116. data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
  117. data/doc/guide/src/tutorial/events.page +195 -0
  118. data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
  119. data/doc/guide/src/tutorial/index.page +13 -0
  120. data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
  121. data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
  122. data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
  123. data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
  124. data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
  125. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
  126. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
  127. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
  128. data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
  129. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
  130. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
  131. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
  132. data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
  133. data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
  134. data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
  135. data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
  136. data/doc/guide/src/tutorial/relations_display.page +153 -0
  137. data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
  138. data/doc/guide/src/tutorial/shell.page +121 -0
  139. data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
  140. data/doc/guide/src/tutorial/tasks.page +374 -0
  141. data/lib/roby.rb +102 -47
  142. data/lib/roby/actions.rb +17 -0
  143. data/lib/roby/actions/action.rb +80 -0
  144. data/lib/roby/actions/interface.rb +45 -0
  145. data/lib/roby/actions/library.rb +23 -0
  146. data/lib/roby/actions/models/action.rb +224 -0
  147. data/lib/roby/actions/models/coordination_action.rb +58 -0
  148. data/lib/roby/actions/models/interface.rb +22 -0
  149. data/lib/roby/actions/models/interface_base.rb +294 -0
  150. data/lib/roby/actions/models/library.rb +12 -0
  151. data/lib/roby/actions/models/method_action.rb +90 -0
  152. data/lib/roby/actions/task.rb +114 -0
  153. data/lib/roby/and_generator.rb +125 -0
  154. data/lib/roby/app.rb +2795 -829
  155. data/lib/roby/app/autotest_console_reporter.rb +138 -0
  156. data/lib/roby/app/base.rb +21 -0
  157. data/lib/roby/app/cucumber.rb +2 -0
  158. data/lib/roby/app/cucumber/controller.rb +439 -0
  159. data/lib/roby/app/cucumber/helpers.rb +280 -0
  160. data/lib/roby/app/cucumber/world.rb +32 -0
  161. data/lib/roby/app/debug.rb +136 -0
  162. data/lib/roby/app/gen.rb +2 -0
  163. data/lib/roby/app/rake.rb +178 -38
  164. data/lib/roby/app/robot_config.rb +9 -0
  165. data/lib/roby/app/robot_names.rb +115 -0
  166. data/lib/roby/app/run.rb +3 -2
  167. data/lib/roby/app/scripts.rb +72 -0
  168. data/lib/roby/app/scripts/autotest.rb +173 -0
  169. data/lib/roby/app/scripts/display.rb +2 -0
  170. data/lib/roby/app/scripts/restart.rb +52 -0
  171. data/lib/roby/app/scripts/results.rb +17 -8
  172. data/lib/roby/app/scripts/run.rb +155 -24
  173. data/lib/roby/app/scripts/shell.rb +147 -62
  174. data/lib/roby/app/scripts/test.rb +107 -22
  175. data/lib/roby/app/test_reporter.rb +74 -0
  176. data/lib/roby/app/test_server.rb +159 -0
  177. data/lib/roby/app/vagrant.rb +47 -0
  178. data/lib/roby/backports.rb +16 -0
  179. data/lib/roby/cli/display.rb +190 -0
  180. data/lib/roby/cli/exceptions.rb +17 -0
  181. data/lib/roby/cli/gen/actions/class.rb +5 -0
  182. data/lib/roby/cli/gen/actions/test.rb +6 -0
  183. data/lib/roby/cli/gen/app/.yardopts +6 -0
  184. data/lib/roby/cli/gen/app/README.md +28 -0
  185. data/lib/roby/cli/gen/app/Rakefile +15 -0
  186. data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
  187. data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
  188. data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
  189. data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
  190. data/lib/roby/cli/gen/class/class.rb +6 -0
  191. data/lib/roby/cli/gen/class/test.rb +7 -0
  192. data/lib/roby/cli/gen/helpers.rb +203 -0
  193. data/lib/roby/cli/gen/module/module.rb +5 -0
  194. data/lib/roby/cli/gen/module/test.rb +6 -0
  195. data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
  196. data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
  197. data/lib/roby/cli/gen/task/class.rb +44 -0
  198. data/lib/roby/cli/gen/task/test.rb +6 -0
  199. data/lib/roby/cli/gen_main.rb +120 -0
  200. data/lib/roby/cli/log.rb +276 -0
  201. data/lib/roby/cli/log/flamegraph.html +499 -0
  202. data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
  203. data/lib/roby/cli/main.rb +153 -0
  204. data/lib/roby/coordination.rb +60 -0
  205. data/lib/roby/coordination/action_script.rb +25 -0
  206. data/lib/roby/coordination/action_state_machine.rb +125 -0
  207. data/lib/roby/coordination/actions.rb +106 -0
  208. data/lib/roby/coordination/base.rb +145 -0
  209. data/lib/roby/coordination/calculus.rb +40 -0
  210. data/lib/roby/coordination/child.rb +28 -0
  211. data/lib/roby/coordination/event.rb +29 -0
  212. data/lib/roby/coordination/fault_handler.rb +25 -0
  213. data/lib/roby/coordination/fault_handling_task.rb +13 -0
  214. data/lib/roby/coordination/fault_response_table.rb +110 -0
  215. data/lib/roby/coordination/models/action_script.rb +64 -0
  216. data/lib/roby/coordination/models/action_state_machine.rb +224 -0
  217. data/lib/roby/coordination/models/actions.rb +191 -0
  218. data/lib/roby/coordination/models/arguments.rb +55 -0
  219. data/lib/roby/coordination/models/base.rb +176 -0
  220. data/lib/roby/coordination/models/capture.rb +86 -0
  221. data/lib/roby/coordination/models/child.rb +35 -0
  222. data/lib/roby/coordination/models/event.rb +41 -0
  223. data/lib/roby/coordination/models/exceptions.rb +42 -0
  224. data/lib/roby/coordination/models/fault_handler.rb +219 -0
  225. data/lib/roby/coordination/models/fault_response_table.rb +77 -0
  226. data/lib/roby/coordination/models/root.rb +22 -0
  227. data/lib/roby/coordination/models/script.rb +283 -0
  228. data/lib/roby/coordination/models/task.rb +184 -0
  229. data/lib/roby/coordination/models/task_from_action.rb +50 -0
  230. data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
  231. data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
  232. data/lib/roby/coordination/models/task_from_variable.rb +27 -0
  233. data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
  234. data/lib/roby/coordination/models/variable.rb +32 -0
  235. data/lib/roby/coordination/script.rb +200 -0
  236. data/lib/roby/coordination/script_instruction.rb +12 -0
  237. data/lib/roby/coordination/task.rb +45 -0
  238. data/lib/roby/coordination/task_base.rb +69 -0
  239. data/lib/roby/coordination/task_script.rb +293 -0
  240. data/lib/roby/coordination/task_state_machine.rb +308 -0
  241. data/lib/roby/decision_control.rb +33 -21
  242. data/lib/roby/distributed_object.rb +76 -0
  243. data/lib/roby/droby.rb +17 -0
  244. data/lib/roby/droby/droby_id.rb +6 -0
  245. data/lib/roby/droby/enable.rb +153 -0
  246. data/lib/roby/droby/event_logger.rb +189 -0
  247. data/lib/roby/droby/event_logging.rb +57 -0
  248. data/lib/roby/droby/exceptions.rb +14 -0
  249. data/lib/roby/droby/identifiable.rb +22 -0
  250. data/lib/roby/droby/logfile.rb +141 -0
  251. data/lib/roby/droby/logfile/client.rb +176 -0
  252. data/lib/roby/droby/logfile/file_format.md +97 -0
  253. data/lib/roby/droby/logfile/index.rb +117 -0
  254. data/lib/roby/droby/logfile/reader.rb +139 -0
  255. data/lib/roby/droby/logfile/server.rb +199 -0
  256. data/lib/roby/droby/logfile/writer.rb +114 -0
  257. data/lib/roby/droby/marshal.rb +264 -0
  258. data/lib/roby/droby/marshallable.rb +12 -0
  259. data/lib/roby/droby/null_event_logger.rb +25 -0
  260. data/lib/roby/droby/object_manager.rb +205 -0
  261. data/lib/roby/droby/peer_id.rb +6 -0
  262. data/lib/roby/droby/plan_rebuilder.rb +373 -0
  263. data/lib/roby/droby/rebuilt_plan.rb +160 -0
  264. data/lib/roby/droby/remote_droby_id.rb +6 -0
  265. data/lib/roby/droby/timepoints.rb +205 -0
  266. data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
  267. data/lib/roby/droby/timepoints_ctf.rb +125 -0
  268. data/lib/roby/droby/v5.rb +14 -0
  269. data/lib/roby/droby/v5/builtin.rb +120 -0
  270. data/lib/roby/droby/v5/droby_class.rb +45 -0
  271. data/lib/roby/droby/v5/droby_constant.rb +81 -0
  272. data/lib/roby/droby/v5/droby_dump.rb +1026 -0
  273. data/lib/roby/droby/v5/droby_id.rb +44 -0
  274. data/lib/roby/droby/v5/droby_model.rb +82 -0
  275. data/lib/roby/droby/v5/peer_id.rb +10 -0
  276. data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
  277. data/lib/roby/event.rb +79 -957
  278. data/lib/roby/event_constraints.rb +835 -0
  279. data/lib/roby/event_generator.rb +1047 -0
  280. data/lib/roby/event_structure/causal_link.rb +6 -0
  281. data/lib/roby/event_structure/forwarding.rb +6 -0
  282. data/lib/roby/event_structure/precedence.rb +7 -0
  283. data/lib/roby/event_structure/signal.rb +8 -0
  284. data/lib/roby/event_structure/temporal_constraints.rb +640 -0
  285. data/lib/roby/exceptions.rb +446 -152
  286. data/lib/roby/executable_plan.rb +549 -0
  287. data/lib/roby/execution_engine.rb +1997 -950
  288. data/lib/roby/filter_generator.rb +26 -0
  289. data/lib/roby/gui/chronicle_view.rb +225 -0
  290. data/lib/roby/gui/chronicle_widget.rb +925 -0
  291. data/lib/roby/gui/dot_id.rb +11 -0
  292. data/lib/roby/gui/exception_view.rb +44 -0
  293. data/lib/roby/gui/log_display.rb +273 -0
  294. data/lib/roby/gui/model_views.rb +2 -0
  295. data/lib/roby/gui/model_views/action_interface.rb +53 -0
  296. data/lib/roby/gui/model_views/task.rb +47 -0
  297. data/lib/roby/gui/model_views/task.rhtml +41 -0
  298. data/lib/roby/gui/object_info_view.rb +89 -0
  299. data/lib/roby/gui/plan_dot_layout.rb +427 -0
  300. data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
  301. data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
  302. data/lib/roby/gui/relations_view.rb +278 -0
  303. data/lib/roby/gui/relations_view/relations.ui +139 -0
  304. data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
  305. data/lib/roby/gui/relations_view/relations_config.rb +292 -0
  306. data/lib/roby/gui/relations_view/relations_view.ui +53 -0
  307. data/lib/roby/gui/scheduler_view.css +24 -0
  308. data/lib/roby/gui/scheduler_view.rb +46 -0
  309. data/lib/roby/gui/scheduler_view.rhtml +53 -0
  310. data/lib/roby/gui/stepping.rb +93 -0
  311. data/lib/roby/gui/stepping.ui +181 -0
  312. data/lib/roby/gui/styles.rb +81 -0
  313. data/lib/roby/gui/task_display_configuration.rb +42 -0
  314. data/lib/roby/gui/task_state_at.rb +38 -0
  315. data/lib/roby/hooks.rb +26 -0
  316. data/lib/roby/interface.rb +136 -469
  317. data/lib/roby/interface/async.rb +20 -0
  318. data/lib/roby/interface/async/action_monitor.rb +188 -0
  319. data/lib/roby/interface/async/interface.rb +498 -0
  320. data/lib/roby/interface/async/job_monitor.rb +213 -0
  321. data/lib/roby/interface/async/log.rb +238 -0
  322. data/lib/roby/interface/async/new_job_listener.rb +79 -0
  323. data/lib/roby/interface/async/ui_connector.rb +183 -0
  324. data/lib/roby/interface/client.rb +553 -0
  325. data/lib/roby/interface/command.rb +24 -0
  326. data/lib/roby/interface/command_argument.rb +16 -0
  327. data/lib/roby/interface/command_library.rb +92 -0
  328. data/lib/roby/interface/droby_channel.rb +174 -0
  329. data/lib/roby/interface/exceptions.rb +22 -0
  330. data/lib/roby/interface/interface.rb +655 -0
  331. data/lib/roby/interface/job.rb +47 -0
  332. data/lib/roby/interface/rest.rb +10 -0
  333. data/lib/roby/interface/rest/api.rb +29 -0
  334. data/lib/roby/interface/rest/helpers.rb +24 -0
  335. data/lib/roby/interface/rest/server.rb +212 -0
  336. data/lib/roby/interface/server.rb +154 -0
  337. data/lib/roby/interface/shell_client.rb +468 -0
  338. data/lib/roby/interface/shell_subcommand.rb +24 -0
  339. data/lib/roby/interface/subcommand_client.rb +35 -0
  340. data/lib/roby/interface/tcp.rb +168 -0
  341. data/lib/roby/models/arguments.rb +112 -0
  342. data/lib/roby/models/plan_object.rb +83 -0
  343. data/lib/roby/models/task.rb +835 -0
  344. data/lib/roby/models/task_event.rb +62 -0
  345. data/lib/roby/models/task_service.rb +78 -0
  346. data/lib/roby/or_generator.rb +88 -0
  347. data/lib/roby/plan.rb +1751 -864
  348. data/lib/roby/plan_object.rb +611 -0
  349. data/lib/roby/plan_service.rb +200 -0
  350. data/lib/roby/promise.rb +332 -0
  351. data/lib/roby/queries.rb +23 -0
  352. data/lib/roby/queries/and_matcher.rb +32 -0
  353. data/lib/roby/queries/any.rb +27 -0
  354. data/lib/roby/queries/code_error_matcher.rb +58 -0
  355. data/lib/roby/queries/event_generator_matcher.rb +9 -0
  356. data/lib/roby/queries/execution_exception_matcher.rb +165 -0
  357. data/lib/roby/queries/index.rb +165 -0
  358. data/lib/roby/queries/localized_error_matcher.rb +149 -0
  359. data/lib/roby/queries/matcher_base.rb +107 -0
  360. data/lib/roby/queries/none.rb +27 -0
  361. data/lib/roby/queries/not_matcher.rb +30 -0
  362. data/lib/roby/queries/op_matcher.rb +8 -0
  363. data/lib/roby/queries/or_matcher.rb +30 -0
  364. data/lib/roby/queries/plan_object_matcher.rb +363 -0
  365. data/lib/roby/queries/query.rb +188 -0
  366. data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
  367. data/lib/roby/queries/task_matcher.rb +344 -0
  368. data/lib/roby/relations.rb +42 -678
  369. data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
  370. data/lib/roby/relations/directed_relation_support.rb +268 -0
  371. data/lib/roby/relations/event_relation_graph.rb +19 -0
  372. data/lib/roby/relations/fork_merge_visitor.rb +154 -0
  373. data/lib/roby/relations/graph.rb +533 -0
  374. data/lib/roby/relations/models/directed_relation_support.rb +11 -0
  375. data/lib/roby/relations/models/graph.rb +75 -0
  376. data/lib/roby/relations/models/task_relation_graph.rb +18 -0
  377. data/lib/roby/relations/space.rb +380 -0
  378. data/lib/roby/relations/task_relation_graph.rb +20 -0
  379. data/lib/roby/robot.rb +85 -38
  380. data/lib/roby/schedulers/basic.rb +155 -25
  381. data/lib/roby/schedulers/null.rb +20 -0
  382. data/lib/roby/schedulers/reporting.rb +31 -0
  383. data/lib/roby/schedulers/state.rb +129 -0
  384. data/lib/roby/schedulers/temporal.rb +91 -0
  385. data/lib/roby/singletons.rb +87 -0
  386. data/lib/roby/standalone.rb +4 -2
  387. data/lib/roby/standard_errors.rb +405 -82
  388. data/lib/roby/state.rb +6 -3
  389. data/lib/roby/state/conf_model.rb +5 -0
  390. data/lib/roby/state/events.rb +181 -95
  391. data/lib/roby/state/goal_model.rb +77 -0
  392. data/lib/roby/state/open_struct.rb +591 -0
  393. data/lib/roby/state/open_struct_model.rb +68 -0
  394. data/lib/roby/state/pos.rb +45 -45
  395. data/lib/roby/state/shapes.rb +11 -11
  396. data/lib/roby/state/state_model.rb +303 -0
  397. data/lib/roby/state/task.rb +43 -0
  398. data/lib/roby/support.rb +88 -148
  399. data/lib/roby/task.rb +1361 -1750
  400. data/lib/roby/task_arguments.rb +428 -0
  401. data/lib/roby/task_event.rb +127 -0
  402. data/lib/roby/task_event_generator.rb +337 -0
  403. data/lib/roby/task_service.rb +6 -0
  404. data/lib/roby/task_structure/conflicts.rb +104 -0
  405. data/lib/roby/task_structure/dependency.rb +932 -0
  406. data/lib/roby/task_structure/error_handling.rb +118 -0
  407. data/lib/roby/task_structure/executed_by.rb +234 -0
  408. data/lib/roby/task_structure/planned_by.rb +90 -0
  409. data/lib/roby/tasks/aggregator.rb +37 -0
  410. data/lib/roby/tasks/external_process.rb +275 -0
  411. data/lib/roby/tasks/group.rb +27 -0
  412. data/lib/roby/tasks/null.rb +19 -0
  413. data/lib/roby/tasks/parallel.rb +43 -0
  414. data/lib/roby/tasks/sequence.rb +88 -0
  415. data/lib/roby/tasks/simple.rb +21 -0
  416. data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
  417. data/lib/roby/tasks/timeout.rb +17 -0
  418. data/lib/roby/tasks/virtual.rb +55 -0
  419. data/lib/roby/template_plan.rb +7 -0
  420. data/lib/roby/test/aruba_minitest.rb +74 -0
  421. data/lib/roby/test/assertion.rb +16 -0
  422. data/lib/roby/test/assertions.rb +490 -0
  423. data/lib/roby/test/common.rb +368 -591
  424. data/lib/roby/test/dsl.rb +149 -0
  425. data/lib/roby/test/error.rb +18 -0
  426. data/lib/roby/test/event_reporter.rb +83 -0
  427. data/lib/roby/test/execution_expectations.rb +1134 -0
  428. data/lib/roby/test/expect_execution.rb +151 -0
  429. data/lib/roby/test/minitest_helpers.rb +166 -0
  430. data/lib/roby/test/roby_app_helpers.rb +200 -0
  431. data/lib/roby/test/run_planners.rb +155 -0
  432. data/lib/roby/test/self.rb +112 -0
  433. data/lib/roby/test/spec.rb +198 -0
  434. data/lib/roby/test/tasks/empty_task.rb +4 -4
  435. data/lib/roby/test/tasks/goto.rb +28 -27
  436. data/lib/roby/test/teardown_plans.rb +100 -0
  437. data/lib/roby/test/testcase.rb +239 -307
  438. data/lib/roby/test/tools.rb +159 -155
  439. data/lib/roby/test/validate_state_machine.rb +75 -0
  440. data/lib/roby/transaction.rb +1125 -0
  441. data/lib/roby/transaction/event_generator_proxy.rb +63 -0
  442. data/lib/roby/transaction/plan_object_proxy.rb +99 -0
  443. data/lib/roby/transaction/plan_service_proxy.rb +43 -0
  444. data/lib/roby/transaction/proxying.rb +120 -0
  445. data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
  446. data/lib/roby/transaction/task_proxy.rb +135 -0
  447. data/lib/roby/until_generator.rb +30 -0
  448. data/lib/roby/version.rb +5 -0
  449. data/lib/roby/yard.rb +169 -0
  450. data/lib/yard-roby.rb +1 -0
  451. data/manifest.xml +32 -6
  452. data/roby.gemspec +59 -0
  453. metadata +788 -587
  454. data/Manifest.txt +0 -321
  455. data/NOTES +0 -4
  456. data/README.txt +0 -166
  457. data/TODO.txt +0 -146
  458. data/app/README.txt +0 -24
  459. data/app/Rakefile +0 -8
  460. data/app/config/ROBOT.rb +0 -5
  461. data/app/config/init.rb +0 -33
  462. data/app/config/roby.yml +0 -3
  463. data/app/controllers/ROBOT.rb +0 -2
  464. data/app/planners/ROBOT/main.rb +0 -6
  465. data/app/planners/main.rb +0 -5
  466. data/app/scripts/distributed +0 -3
  467. data/app/scripts/generate/bookmarks +0 -3
  468. data/app/scripts/replay +0 -3
  469. data/app/scripts/results +0 -3
  470. data/app/scripts/run +0 -3
  471. data/app/scripts/server +0 -3
  472. data/app/scripts/shell +0 -3
  473. data/app/scripts/test +0 -3
  474. data/app/tasks/.gitattributes +0 -0
  475. data/app/tasks/ROBOT/.gitattributes +0 -0
  476. data/bin/roby-shell +0 -25
  477. data/doc/guide/src/basics/app.page +0 -139
  478. data/doc/guide/src/basics/index.page +0 -11
  479. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  480. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  481. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  482. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  483. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  484. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  485. data/doc/guide/src/basics/relations_display.page +0 -203
  486. data/doc/guide/src/basics/shell.page +0 -102
  487. data/doc/guide/src/default.css +0 -319
  488. data/doc/guide/src/introduction/index.page +0 -29
  489. data/doc/guide/src/introduction/publications.page +0 -14
  490. data/doc/guide/src/relations/dependency.page +0 -89
  491. data/doc/guide/src/relations/index.page +0 -12
  492. data/ext/droby/dump.cc +0 -175
  493. data/ext/droby/extconf.rb +0 -3
  494. data/ext/graph/algorithm.cc +0 -746
  495. data/ext/graph/extconf.rb +0 -7
  496. data/ext/graph/graph.cc +0 -575
  497. data/ext/graph/graph.hh +0 -183
  498. data/ext/graph/iterator_sequence.hh +0 -102
  499. data/ext/graph/undirected_dfs.hh +0 -226
  500. data/ext/graph/undirected_graph.hh +0 -421
  501. data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
  502. data/lib/roby/app/scripts/replay.rb +0 -31
  503. data/lib/roby/app/scripts/server.rb +0 -18
  504. data/lib/roby/basic_object.rb +0 -151
  505. data/lib/roby/config.rb +0 -14
  506. data/lib/roby/distributed.rb +0 -36
  507. data/lib/roby/distributed/base.rb +0 -448
  508. data/lib/roby/distributed/communication.rb +0 -875
  509. data/lib/roby/distributed/connection_space.rb +0 -616
  510. data/lib/roby/distributed/distributed_object.rb +0 -206
  511. data/lib/roby/distributed/drb.rb +0 -62
  512. data/lib/roby/distributed/notifications.rb +0 -531
  513. data/lib/roby/distributed/peer.rb +0 -555
  514. data/lib/roby/distributed/protocol.rb +0 -529
  515. data/lib/roby/distributed/proxy.rb +0 -343
  516. data/lib/roby/distributed/subscription.rb +0 -311
  517. data/lib/roby/distributed/transaction.rb +0 -498
  518. data/lib/roby/external_process_task.rb +0 -225
  519. data/lib/roby/graph.rb +0 -160
  520. data/lib/roby/log.rb +0 -3
  521. data/lib/roby/log/chronicle.rb +0 -303
  522. data/lib/roby/log/console.rb +0 -74
  523. data/lib/roby/log/data_stream.rb +0 -275
  524. data/lib/roby/log/dot.rb +0 -279
  525. data/lib/roby/log/event_stream.rb +0 -161
  526. data/lib/roby/log/file.rb +0 -396
  527. data/lib/roby/log/gui/basic_display.ui +0 -83
  528. data/lib/roby/log/gui/basic_display_ui.rb +0 -89
  529. data/lib/roby/log/gui/chronicle.rb +0 -26
  530. data/lib/roby/log/gui/chronicle_view.rb +0 -40
  531. data/lib/roby/log/gui/chronicle_view.ui +0 -70
  532. data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
  533. data/lib/roby/log/gui/data_displays.rb +0 -171
  534. data/lib/roby/log/gui/data_displays.ui +0 -155
  535. data/lib/roby/log/gui/data_displays_ui.rb +0 -146
  536. data/lib/roby/log/gui/notifications.rb +0 -26
  537. data/lib/roby/log/gui/relations.rb +0 -269
  538. data/lib/roby/log/gui/relations.ui +0 -123
  539. data/lib/roby/log/gui/relations_ui.rb +0 -120
  540. data/lib/roby/log/gui/relations_view.rb +0 -185
  541. data/lib/roby/log/gui/relations_view.ui +0 -149
  542. data/lib/roby/log/gui/relations_view_ui.rb +0 -144
  543. data/lib/roby/log/gui/replay.rb +0 -366
  544. data/lib/roby/log/gui/replay_controls.rb +0 -206
  545. data/lib/roby/log/gui/replay_controls.ui +0 -282
  546. data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
  547. data/lib/roby/log/gui/runtime.rb +0 -130
  548. data/lib/roby/log/hooks.rb +0 -186
  549. data/lib/roby/log/logger.rb +0 -203
  550. data/lib/roby/log/notifications.rb +0 -244
  551. data/lib/roby/log/plan_rebuilder.rb +0 -468
  552. data/lib/roby/log/relations.rb +0 -1084
  553. data/lib/roby/log/server.rb +0 -547
  554. data/lib/roby/log/sqlite.rb +0 -47
  555. data/lib/roby/log/timings.rb +0 -233
  556. data/lib/roby/plan-object.rb +0 -371
  557. data/lib/roby/planning.rb +0 -13
  558. data/lib/roby/planning/loops.rb +0 -309
  559. data/lib/roby/planning/model.rb +0 -1012
  560. data/lib/roby/planning/task.rb +0 -180
  561. data/lib/roby/query.rb +0 -655
  562. data/lib/roby/relations/conflicts.rb +0 -67
  563. data/lib/roby/relations/dependency.rb +0 -358
  564. data/lib/roby/relations/ensured.rb +0 -19
  565. data/lib/roby/relations/error_handling.rb +0 -22
  566. data/lib/roby/relations/events.rb +0 -7
  567. data/lib/roby/relations/executed_by.rb +0 -208
  568. data/lib/roby/relations/influence.rb +0 -10
  569. data/lib/roby/relations/planned_by.rb +0 -63
  570. data/lib/roby/state/information.rb +0 -55
  571. data/lib/roby/state/state.rb +0 -367
  572. data/lib/roby/task-operations.rb +0 -186
  573. data/lib/roby/task_index.rb +0 -80
  574. data/lib/roby/test/distributed.rb +0 -230
  575. data/lib/roby/test/tasks/simple_task.rb +0 -23
  576. data/lib/roby/transactions.rb +0 -507
  577. data/lib/roby/transactions/proxy.rb +0 -325
  578. data/plugins/fault_injection/History.txt +0 -4
  579. data/plugins/fault_injection/README.txt +0 -34
  580. data/plugins/fault_injection/Rakefile +0 -12
  581. data/plugins/fault_injection/TODO.txt +0 -0
  582. data/plugins/fault_injection/app.rb +0 -52
  583. data/plugins/fault_injection/fault_injection.rb +0 -89
  584. data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
  585. data/plugins/subsystems/README.txt +0 -37
  586. data/plugins/subsystems/Rakefile +0 -13
  587. data/plugins/subsystems/app.rb +0 -182
  588. data/plugins/subsystems/test/app/README +0 -24
  589. data/plugins/subsystems/test/app/Rakefile +0 -8
  590. data/plugins/subsystems/test/app/config/app.yml +0 -71
  591. data/plugins/subsystems/test/app/config/init.rb +0 -12
  592. data/plugins/subsystems/test/app/config/roby.yml +0 -3
  593. data/plugins/subsystems/test/app/planners/main.rb +0 -20
  594. data/plugins/subsystems/test/app/scripts/distributed +0 -3
  595. data/plugins/subsystems/test/app/scripts/replay +0 -3
  596. data/plugins/subsystems/test/app/scripts/results +0 -3
  597. data/plugins/subsystems/test/app/scripts/run +0 -3
  598. data/plugins/subsystems/test/app/scripts/server +0 -3
  599. data/plugins/subsystems/test/app/scripts/shell +0 -3
  600. data/plugins/subsystems/test/app/scripts/test +0 -3
  601. data/plugins/subsystems/test/app/tasks/services.rb +0 -15
  602. data/plugins/subsystems/test/test_subsystems.rb +0 -78
  603. data/test/distributed/test_communication.rb +0 -195
  604. data/test/distributed/test_connection.rb +0 -284
  605. data/test/distributed/test_execution.rb +0 -378
  606. data/test/distributed/test_mixed_plan.rb +0 -341
  607. data/test/distributed/test_plan_notifications.rb +0 -238
  608. data/test/distributed/test_protocol.rb +0 -525
  609. data/test/distributed/test_query.rb +0 -106
  610. data/test/distributed/test_remote_plan.rb +0 -491
  611. data/test/distributed/test_transaction.rb +0 -466
  612. data/test/mockups/external_process +0 -28
  613. data/test/mockups/tasks.rb +0 -27
  614. data/test/planning/test_loops.rb +0 -432
  615. data/test/planning/test_model.rb +0 -427
  616. data/test/planning/test_task.rb +0 -126
  617. data/test/relations/test_conflicts.rb +0 -42
  618. data/test/relations/test_dependency.rb +0 -324
  619. data/test/relations/test_ensured.rb +0 -38
  620. data/test/relations/test_executed_by.rb +0 -224
  621. data/test/relations/test_planned_by.rb +0 -56
  622. data/test/suite_core.rb +0 -29
  623. data/test/suite_distributed.rb +0 -10
  624. data/test/suite_planning.rb +0 -4
  625. data/test/suite_relations.rb +0 -8
  626. data/test/tasks/test_external_process.rb +0 -126
  627. data/test/tasks/test_thread_task.rb +0 -70
  628. data/test/test_bgl.rb +0 -528
  629. data/test/test_event.rb +0 -969
  630. data/test/test_exceptions.rb +0 -591
  631. data/test/test_execution_engine.rb +0 -987
  632. data/test/test_gui.rb +0 -20
  633. data/test/test_interface.rb +0 -43
  634. data/test/test_log.rb +0 -125
  635. data/test/test_log_server.rb +0 -133
  636. data/test/test_plan.rb +0 -418
  637. data/test/test_query.rb +0 -424
  638. data/test/test_relations.rb +0 -260
  639. data/test/test_state.rb +0 -432
  640. data/test/test_support.rb +0 -16
  641. data/test/test_task.rb +0 -1181
  642. data/test/test_testcase.rb +0 -138
  643. data/test/test_transactions.rb +0 -610
  644. data/test/test_transactions_proxy.rb +0 -216
@@ -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
+ ![Simple plan example](simple_plan_example.png)
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
+
@@ -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=&gt;(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=&gt;(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>