roby 0.8.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Code Examples
3
3
  sort_info: 10
4
- --- pipeline:tags,markdown
4
+ ---
5
5
  Notations
6
6
  ---------
7
7
  In the following pages, the example code is meant to be run either in a Ruby
@@ -24,10 +24,11 @@ Setting up the Ruby shell
24
24
  Moreover, before typing in the Roby shell, you will need to prepare it a bit. Do
25
25
  the following:
26
26
 
27
- $ irb
27
+ {coderay:: text}
28
+ $ irb -rroby/standalone
29
+ {coderay}
30
+
28
31
  {coderay:: ruby}
29
- >> require 'roby/standalone'
30
- >> include Roby
31
- >> plan = Roby.plan
32
+ >> plan = Roby.plan
32
33
  {coderay}
33
34
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Don't repeat yourself !
3
3
  sort_info: 800
4
- --- pipeline:tags,markdown,blocks
4
+ ---
5
5
 
6
6
  Unlike most (all ?) other supervision system, Roby is *not* a domain-specific
7
7
  language (DSL). Instead, it uses the facilities offered by the Ruby programming
@@ -16,24 +16,24 @@ MyTask task model that way:
16
16
 
17
17
  {coderay:: ruby}
18
18
  class MyTask < Roby::Task
19
- event :start do
19
+ event :start do |context|
20
20
  puts "start event called"
21
21
  emit :start
22
22
  end
23
- event :controlable do
23
+ event :controlable do |context|
24
24
  puts "controlable event called"
25
25
  emit :controlable
26
26
  end
27
27
  event :contingent
28
28
 
29
- on(:start) { puts "start event emitted" }
30
- on(:controlable) { puts "controlable event emitted" }
31
- on(:contingent) { puts "contingent event emitted" }
32
- on(:failed) { puts "failed event emitted" }
33
- on(:stop) { puts "stop event emitted" }
29
+ on(:start) { |event| puts "start event emitted" }
30
+ on(:controlable) { |event| puts "controlable event emitted" }
31
+ on(:contingent) { |event| puts "contingent event emitted" }
32
+ on(:failed) { |event| puts "failed event emitted" }
33
+ on(:stop) { |event| puts "stop event emitted" }
34
34
 
35
35
  event :finished, :terminal => true
36
- on(:finished) { puts "finished event emitted" }
36
+ on(:finished) { |event| puts "finished event emitted" }
37
37
  end
38
38
  {coderay}
39
39
 
@@ -41,29 +41,29 @@ Full of repetitions ... Now, one could have written, instead:
41
41
 
42
42
  {coderay:: ruby}
43
43
  class MyTask < Roby::Task
44
- event :start do
44
+ event :start do |context|
45
45
  puts "start event called"
46
46
  emit :start
47
47
  end
48
- event :controlable do
48
+ event :controlable do |context|
49
49
  puts "controlable event called"
50
50
  emit :controlable
51
51
  end
52
52
  event :finished, :terminal => true
53
53
 
54
54
  each_event do |ev|
55
- on(ev.symbol) { puts "#{ev.symbol} event emitted" }
55
+ on(ev.symbol) { |event| puts "#{ev.symbol} event emitted" }
56
56
  end
57
57
  end
58
58
  {coderay}
59
59
 
60
60
  This way:
61
+
61
62
  * if we want to display more information, changing one line does the trick
62
63
  * if a new event is added, it gets displayed automatically
63
64
 
64
-
65
-
66
65
  **Don't forget !**: every piece of text you write in a Roby application is Ruby
67
66
  code, so you have the means to avoid ugly repetitions.
68
- {.warning}
67
+ {: .warning}
68
+
69
69
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Error handling
3
3
  sort_info: 700
4
- --- pipeline:tags,markdown,blocks
4
+ ---
5
5
 
6
6
  One thing about robotics, and in particular plan execution, is that Murphy's
7
7
  rule applies quite well. This is due to a few things. Among them, the first is
@@ -37,7 +37,7 @@ because the event 'failed' was emitted) and who is the culprit (in the
37
37
  ChildFailedError, the child).
38
38
 
39
39
  Let's see an example of such an error. We'll cheat a bit and make our
40
- ComputePath task fail. Edit tasks/compute\_path.rb and add an error at the beginning of the implementation block. Make it so that it looks like the following:
40
+ ComputePath task fail. Edit models/tasks/compute\_path.rb and add an error at the beginning of the implementation block. Make it so that it looks like the following:
41
41
 
42
42
  {coderay:: ruby}
43
43
  implementation do
@@ -51,7 +51,7 @@ Now, start the controller in one console and the roby shell in another and:
51
51
  !Roby::ChildFailedError
52
52
  !at [345013:53:51.812/109] in the failed event of ComputePath:0x7f6ff6a8f0a8
53
53
  !implementation failed ! (RuntimeError)
54
- ! ./tasks/compute_path.rb:19,
54
+ ! ./models/tasks/compute_path.rb:19,
55
55
  ! /home/joyeux/dev/roby/lib/roby/thread_task.rb:63:in `value',
56
56
  ! /home/joyeux/dev/roby/lib/roby/thread_task.rb:63:in the polling handler,
57
57
  ! /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require',
@@ -77,6 +77,7 @@ Now, start the controller in one console and the roby shell in another and:
77
77
  !task MoveTo{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}:0x7f6ff6a8f198[] failed
78
78
 
79
79
  What information is there ?
80
+
80
81
  * we do have a ChildFailedError
81
82
  * the source is the emission at 345013:53:51.812/109 of the 'failed' event of
82
83
  ComputePath. Roby::ThreadTask will automatically emit _failed_ if the
@@ -86,7 +87,7 @@ What information is there ?
86
87
  its backtrace.
87
88
 
88
89
  !implementation failed ! (RuntimeError)
89
- ! ./tasks/compute_path.rb:19,
90
+ ! ./models/tasks/compute_path.rb:19,
90
91
  ! /home/joyeux/dev/roby/lib/roby/thread_task.rb:63:in `value',
91
92
  ! /home/joyeux/dev/roby/lib/roby/thread_task.rb:63:in the polling handler,
92
93
  ! /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require',
@@ -119,10 +120,10 @@ that we can't rely on it). In that case, Roby tries to hang up as cleanly as
119
120
  possible by killing all tasks that are being executed.
120
121
 
121
122
  Let's try one code error. Add the following event handler in the definition of
122
- MoveTo in tasks/move\_to.rb
123
+ MoveTo in models/tasks/move\_to.rb
123
124
 
124
125
  {coderay:: ruby}
125
- on :start do
126
+ on :start do |event|
126
127
  raise "the start handler failed !"
127
128
  end
128
129
  {coderay}
@@ -130,55 +131,30 @@ end
130
131
  Start (or restart) the controller and launch a planned\_move! action in
131
132
  the shell. The following should happen:
132
133
 
133
- !Roby::EventHandlerError: user code raised an exception at [336641:28:04.607/23] in the start event of MoveTo:0x2b4330b4fae8
134
- !
135
- !
136
- !the start handler failed ! (RuntimeError)
137
- !./tasks/move_to.rb:10:in event handler for 'start',
138
- ! /home/joyeux/system/rubygems/lib/rubygems/custom_require.rb:27:in `gem_original_require',
139
- ! /home/joyeux/system/rubygems/lib/rubygems/custom_require.rb:27:in `require',
140
- ! scripts/run:3
141
- !
142
- !The following tasks have been killed:
143
- ! MoveTo:0x2b4330b4fae8
134
+ = fatal exception 1: uncaught exception in an event handler of the start event of MoveTo:0x7f2c665a24b0
135
+ | called during the propagation of [16:10:25.191 @2] MoveTo:0x7f2c665a24b0{goal => Vector3D(x=10.000000,y=20.000000,z=0.000000)}[]/start
136
+ | /media/Data/rock/imoby/tutorials/roby/models/tasks/move_to.rb:10:in `event_handler_start_7f2c67500010': bla (RuntimeError)
137
+ | ./models/tasks/move_to.rb:10:in event handler for 'start',
138
+ | /media/Data/rock/imoby/tools/roby/bin/roby:7
139
+ | The following tasks have been killed:
140
+ | MoveTo:0x7f2c665a24b0
144
141
 
145
142
  Now, what happens during execution: how Roby does react to that error ? What we
146
- can see in the relation display is the following three successive steps. **Don't
147
- forget to uncheck _View/Hide finalized_**.
148
-
149
- ![](log_replay/hierarchy_error_1.png)
150
- {.fullfigure}
143
+ can see in the relation display is that, just after the action got expanded, the
144
+ following happens:
151
145
 
152
- **Starting point**: the MoveTo is started and so is the ComputePath task, as it
153
- is an event handler that fails (i.e. the error appears _after_ the event is
154
- emitted).
155
- {.figurecaption}
146
+ ![](log_replay/moveto_code_error.png)
147
+ {: .fullfigure}
156
148
 
157
- ![](log_replay/hierarchy_error_2.png)
158
- {.fullfigure}
159
-
160
- **Next cycle**: MoveTo is killed because of the error in the previous cycle.
161
- ComputePath took only one cycle to complete, so ExecutePath is started as well.
162
- {.figurecaption}
163
-
164
- ![](log_replay/hierarchy_error_3.png)
165
- {.fullfigure}
166
-
167
- **Killing useless tasks**: the now useless ExecutePath is killed as well.
168
- {.figurecaption}
169
-
170
- From Roby's point of view, the event has already happened when the event
171
- handlers get called. Therefore, the event propagation should go on even though
172
- one of the event handlers failed, and therefore ComputePath is started.
173
-
174
- However, since an error occured and has not been handled, the MoveTo task cannot
175
- keep running and is stopped at the next cycle. The tasks that are now useless
176
- are also stopped (in this particular execution, ComputePath took only one cycle
177
- to execute and therefore only ExecutePath is stopped).
149
+ The MoveTo is started, and therefore the event handler is called. Note that the
150
+ event is still propagated as it __already happened__. Because of the failure,
151
+ the task is killed by the garbage collection mechanism and the children are
152
+ stopped as well since they are not useful anymore
153
+ {: .caption}
178
154
 
179
155
  For event commands, all depends on where the exception actually appears. If
180
156
  'emit' has already been called, then the event will be emitted and propagated.
181
- Otherwise, it counts as a cancelling of the event command -- which is an error
157
+ Otherwise, it counts as a cancelling of the event command -- which is also an error
182
158
  itself.
183
159
 
184
160
  Handling errors
@@ -224,7 +200,7 @@ possible to actually restart the failing child directly in the event handler of
224
200
  _failed_ and replace the failed task through this new one. This is as simple as:
225
201
 
226
202
  {coderay:: ruby}
227
- on(:failed) do
203
+ on(:failed) do |event|
228
204
  plan.respawn(self)
229
205
  end
230
206
  {coderay}
@@ -234,14 +210,14 @@ error:
234
210
 
235
211
  {coderay:: ruby}
236
212
  attr_accessor :should_pass
237
- event :start do
213
+ event :start do |context|
238
214
  if !should_pass
239
215
  forward :start, self, :failed, :delay => 0.2
240
216
  end
241
217
  emit :start
242
218
  end
243
219
 
244
- on :failed do
220
+ on :failed do |event|
245
221
  if !should_pass
246
222
  Robot.info "respawning ..."
247
223
  new_task = plan.respawn(self)
@@ -262,8 +238,6 @@ Note that doing such a thing on the failed event is a bad idea, as failed is
262
238
  emitted when the task gets interrupted. You would, in general, do that on a more
263
239
  specific error event (i.e. an event that is forwarded to _failed_).
264
240
 
265
- TODO: figure.
266
-
267
241
  Asynchronous repairs
268
242
  --------------------
269
243
 
@@ -281,12 +255,13 @@ task.event(error_event_name).handle_with(my_repair_task)
281
255
  {coderay}
282
256
 
283
257
  Let's try it in our application. What we will do is the following:
258
+
284
259
  * add a _blocked_ fault event to the model of ExecutePath, and make the poll
285
260
  block of ExecutePath emit _blocked_ randomly.
286
261
  * have a repair task wait 2 seconds and either (randomly) respawn the path
287
262
  execution after those two seconds, or emit _failed_.
288
263
 
289
- The first point is straightforward: just change tasks/execute\_path.rb so that
264
+ The first point is straightforward: just change models/tasks/execute\_path.rb so that
290
265
  the bottom of it looks like the following code. Changed lines are 4, 5, 10 and
291
266
  11.
292
267
 
@@ -304,27 +279,27 @@ the bottom of it looks like the following code. Changed lines are 4, 5, 10 and
304
279
  end
305
280
  {coderay}
306
281
 
307
- A new RepairTask model has to be added. Open tasks/repair\_task.rb and add the
282
+ A new RepairTask model has to be added. Open models/tasks/repair\_task.rb and add the
308
283
  following:
309
284
 
310
285
  {coderay:: ruby}
311
286
  class RepairTask < Roby::Task
312
287
  terminates
313
288
 
314
- event :start do
289
+ event :start do |context|
315
290
  Robot.info "repair will succeed in 2 seconds"
316
291
  forward_to :start, self, :success, :delay => 2
317
292
  emit :start
318
293
  end
319
294
 
320
- on :success do
295
+ on :success do |event|
321
296
  current = failed_task.current_waypoint
322
297
  execute = plan.respawn(failed_task)
323
298
  repair = plan.recreate(self)
299
+ execute.blocked_event.handle_with(repair)
324
300
 
325
- # Get the path object, and remove from the points that have already been
326
- # done
327
- path = execute.path_task.path
301
+ # Get the path object, and remove the points that have already been done
302
+ path = execute.parent_task.path
328
303
  while !path.empty? && path[0] != current
329
304
  path.shift
330
305
  end
@@ -381,30 +356,30 @@ more details in the plan display (note that this time, you need to display the
381
356
  ErrorHandling relation as well).
382
357
 
383
358
  ![](log_replay/plan_repair_1.png)
384
- {.fullfigure}
359
+ {: .fullfigure}
385
360
 
386
361
  **Nominal execution**: the plan repair (in blue) is not executed yet and the ExecutePath is running
387
- {.figurecaption}
362
+ {: .caption}
388
363
 
389
364
  ![](log_replay/plan_repair_2.png)
390
- {.fullfigure}
365
+ {: .fullfigure}
391
366
 
392
367
  **ExecutePath fails**: the plan repair is queued for starting, and will actually start in the next cycle
393
- {.figurecaption}
368
+ {: .caption}
394
369
 
395
370
  ![](log_replay/plan_repair_3.png)
396
- {.fullfigure}
371
+ {: .fullfigure}
397
372
 
398
373
  **Repair started**
399
- {.figurecaption}
374
+ {: .caption}
400
375
 
401
376
  ![](log_replay/plan_repair_4.png)
402
- {.fullfigure}
377
+ {: .fullfigure}
403
378
 
404
379
  **Repair successful**: a new ExecutePath task is added with a new repair. The
405
380
  new task's start event is queued, and will therefore start at the beginning of
406
381
  the next cycle.
407
- {.figurecaption}
382
+ {: .figurecaption}
408
383
 
409
384
  A simple real-world example is
410
385
  [here](http://roby.rubyforge.org/videos/rflex_repaired.avi) In this video, the
@@ -0,0 +1,195 @@
1
+ ---
2
+ title: Events
3
+ sort_info: 100
4
+ ---
5
+
6
+ This page will present the basic tools that allow to define and manipulate
7
+ events. In [the concepts section](../concepts/plans.html), we saw that
8
+ events are two sided objects: one the one hand, they represent the situations
9
+ the system is in (event _emission_). On the other hand, they represent the
10
+ commands that the system accepts (event _commands_). We'll see in this page
11
+ how this is translated in the Roby API: how to add a command block to an event
12
+ (event command), how to call code when an event is emitted (event handlers),
13
+ how to call it and how to emit it.
14
+
15
+ {include_file: {filename: src/basics_shell_header.txt, escape_html: false}}
16
+
17
+ The basics
18
+ ----------
19
+ Two classes are used to represent "events". The first is the event generator
20
+ {rdoc_class: EventGenerator}. Event generators are the objects that will emit
21
+ events. In other words, they represent __the event sources__. When a generator
22
+ does emit an event, an instance of {rdoc_class: Event} is created to represent
23
+ this event, with timestamp and additional information.
24
+
25
+ To simplify the discourse, event generators and events are often both called
26
+ events. We will try to make the difference in this tutorial, though, to ease
27
+ the understanding.
28
+
29
+ A free event generator that has no command, also called _contingent_ or
30
+ _non-controllable_ generators are created with:
31
+
32
+ {coderay:: ruby}
33
+ >> ev1 = Roby::EventGenerator.new
34
+ {coderay}
35
+
36
+ Then, before using it, you need to include it in a plan, which is simply done
37
+ with
38
+
39
+ {coderay:: ruby}
40
+ >> plan.add(ev1)
41
+ {coderay}
42
+
43
+ Finally, to be able to see the event's emission, we would display some text
44
+ using an _event handler_: a piece of code that is executed when the event is
45
+ emitted.
46
+
47
+ {coderay:: ruby}
48
+ >> ev1.on { |e| puts "ev1 emitted with context=#{e.context.inspect}" }
49
+ {coderay}
50
+
51
+ The event handler's block gets an argument which is the actual event (the
52
+ instance of {rdoc_class: Event}). See the API documentation for what you can
53
+ get out of it.
54
+
55
+ Let's try to emit it. The event _emission_ says "the event happened just now".
56
+
57
+ {coderay:: ruby}
58
+ >> ev1.emit
59
+ ev1 emitted with context=nil
60
+ {coderay}
61
+
62
+ And if you would like to associate data with the event (what is called the event
63
+ context), you would do
64
+
65
+ {coderay:: ruby}
66
+ >> ev1.emit(10)
67
+ ev1 emitted with context=[10]
68
+ {coderay}
69
+
70
+ Let's now create a second event
71
+
72
+ {coderay:: ruby}
73
+ >> ev2 = Roby::EventGenerator.new do |argument|
74
+ ?> puts "ev2 called with argument=#{argument.inspect}"
75
+ ?> ev2.emit(argument.first + 1)
76
+ >> end
77
+ >> plan.add(ev2)
78
+ >> ev2.on { |ev| puts "ev2 emitted with context=#{ev.context.inspect}" }
79
+ {coderay}
80
+
81
+ This second event is _controllable_. It has a block of code associated to it
82
+ (the event command) whose purpose it to make sure that the event will _happen_
83
+ (be emitted). As you can see above, a command accepts an argument. In this
84
+ example, the emission is done by calling emit directly. More complex
85
+ (asynchronous) schemes can also be built, but in general they would be
86
+ represented by tasks (that we will see later on).
87
+
88
+ Let's try our controllable event
89
+
90
+ {coderay:: ruby}
91
+ >> ev2.call(10)
92
+ ev2 called with argument=[10]
93
+ ev2 emitted with context=[11]
94
+ {coderay}
95
+
96
+ Reacting to events
97
+ ------------------
98
+ The whole point of having a *plan* is to be able to describe _reactions_: i.e.
99
+ what the system should do when something happens. The basic tool to do that,
100
+ is to create a _signal_ between two events:
101
+
102
+ {coderay:: ruby}
103
+ >> ev1.signals ev2
104
+ {coderay}
105
+
106
+ Try it:
107
+
108
+ {coderay:: ruby}
109
+ >> ev1.emit(10)
110
+ ev1 emitted with context=10
111
+ ev2 called with argument=10
112
+ ev2 emitted with context=11
113
+ {coderay}
114
+
115
+ You can therefore see that
116
+
117
+ * because of the signal, the _emission_ of the first event caused the second
118
+ event's command to be called. The signal therefore means "when ev1 happens,
119
+ call ev2"
120
+ * the signalling transforms the event's context into the target command's
121
+ argument.
122
+
123
+ Composing events
124
+ ----------------
125
+
126
+ Another important capability built around events is the ability to _compose_ them. Two
127
+ basic operators exist.
128
+
129
+ For instance, in the following snippet, "and\_ev" is emitted when _both_ ev1
130
+ __and__ ev2 have been emitted and "or\_ev" is emitted as soon as _one of_ ev1
131
+ __or__ ev2 have been emitted.
132
+
133
+ {coderay:: ruby}
134
+ >> plan.add(ev1 = EventGenerator.new)
135
+ >> plan.add(ev2 = EventGenerator.new)
136
+ >> and_ev = ev1 & ev2
137
+ >> or_ev = ev1 | ev2
138
+ >> and_ev.on { |ev| puts "AND" }
139
+ >> or_ev.on { |ev| puts "OR" }
140
+ >> ev1.emit
141
+ OR
142
+ >> ev2.emit
143
+ AND
144
+ {coderay}
145
+
146
+ You did not have to add the and\_ev and or\_ev events to the plan. This is because
147
+ they are linked to ev1 and ev2, so Roby added them to the plan automatically.
148
+ {: .info}
149
+
150
+ You can see that the "OR" event is emitted only once. If you want it to be
151
+ emitted every time one of its sources are, you would do:
152
+
153
+ {coderay:: ruby}
154
+ >> or_ev = ev1 | ev2
155
+ >> or_ev.on { |ev| puts "OR" }
156
+ >> or_ev.on { |ev| or_ev.reset }
157
+ >> ev2.emit
158
+ OR
159
+ >> ev2.emit
160
+ OR
161
+ >> ev1.emit
162
+ OR
163
+ {coderay}
164
+
165
+ In the same way, the "AND" event is emitted only once. You can also use #reset
166
+ to make it emit again.
167
+
168
+ Common errors when manipulating events
169
+ ---------------------------------------
170
+
171
+ A common error is to try to manipulate an event which is not included in a
172
+ plan (objects are included in plans through the #add call). In that case,
173
+ the event is not executable and you will get the following error:
174
+
175
+ {coderay:: ruby}
176
+ >> ev = EventGenerator.new { }
177
+ >> ev.call
178
+ Roby::EventNotExecutable: #call called on #<Roby::EventGenerator:0x484aa3c0> which is a non-executable event
179
+ >> ev.emit
180
+ Roby::EventNotExecutable: #emit called on #<Roby::EventGenerator:0x484aa3c0> which is a non-executable event
181
+ {coderay}
182
+
183
+ Another common error is to try to call (or signal) and event that is non
184
+ controllable. In that case, Roby raises a {rdoc_class: EventNotControlable}
185
+ exception.
186
+
187
+ {coderay:: ruby}
188
+ >> plan.add(ev = EventGenerator.new)
189
+ >> ev.call
190
+ Roby::EventNotControlable: #call called on a non-controllable event
191
+ >> source = EventGenerator.new
192
+ >> source.signal(ev)
193
+ Roby::EventNotControlable: trying to establish a signal from #<Roby::EventGenerator:0x484a77f8> to #<Roby::EventGenerator:0x484aab88> which is not controllable
194
+ {coderay}
195
+