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,55 @@
1
+ module Roby
2
+ module Coordination
3
+ module Models
4
+ module Arguments
5
+ extend MetaRuby::Attributes
6
+
7
+ Argument = Struct.new :name, :required, :default
8
+
9
+ # The set of arguments available to this execution context
10
+ # @return [Array<Symbol>]
11
+ inherited_attribute(:argument, :arguments, map: true) { Hash.new }
12
+
13
+ # Define a new argument for this coordination model
14
+ #
15
+ # Arguments are made available within the coordination model as
16
+ # Variable objects
17
+ #
18
+ # @param [String,Symbol] name the argument name
19
+ # @param [Hash] options
20
+ # @option options :default a default value for this argument. Note
21
+ # that 'nil' is considered as a proper default value.
22
+ # @return [Argument] the new argument object
23
+ def argument(name, options = Hash.new)
24
+ options = Kernel.validate_options options, :default
25
+ arguments[name.to_sym] = Argument.new(name.to_sym, !options.has_key?(:default), options[:default])
26
+ end
27
+
28
+ # Validates that the provided argument hash is valid for this
29
+ # particular coordination model
30
+ #
31
+ # @raise ArgumentError if some given arguments are not known to this
32
+ # model, or if some required arguments are not set
33
+ def validate_arguments(arguments)
34
+ arguments = Kernel.normalize_options arguments
35
+ arguments.keys.each do |arg_name|
36
+ if !find_argument(arg_name)
37
+ raise ArgumentError, "#{arg_name} is not an argument on #{self}"
38
+ end
39
+ end
40
+ each_argument do |_, arg|
41
+ if !arguments.has_key?(arg.name)
42
+ if arg.required
43
+ raise ArgumentError, "#{arg.name} is required by #{self}, but is not provided (given arguments: #{arguments})"
44
+ end
45
+ arguments[arg.name] = arg.default
46
+ end
47
+ end
48
+ arguments
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+
@@ -0,0 +1,176 @@
1
+ module Roby
2
+ module Coordination
3
+ module Models
4
+ # Model part of Base
5
+ module Base
6
+ include MetaRuby::ModelAsClass
7
+ include Arguments
8
+
9
+ # Name of this coordination object
10
+ #
11
+ # For debugging purposes. It is usually set by the enclosing context
12
+ #
13
+ # @return [String,nil]
14
+ attr_accessor :name
15
+
16
+ # Gets or sets the root task model
17
+ #
18
+ # @return [Root] the root task model, i.e. a representation of the
19
+ # task this execution context is going to be run on
20
+ def root(*new_root)
21
+ if !new_root.empty?
22
+ @root = Root.new(new_root.first, self)
23
+ elsif @root then @root
24
+ elsif superclass.respond_to?(:root)
25
+ @root = superclass.root.rebind(self)
26
+ end
27
+ end
28
+
29
+ # @deprecated use {#root} instead, as it is a more DSL-like API
30
+ attr_writer :root
31
+
32
+ # @return [Model<Roby::Task>] the task model this execution context
33
+ # is attached to
34
+ def task_model; root.model end
35
+
36
+ # Gives direct access to the root's events
37
+ #
38
+ # This is needed to be able to use a coordination model as model for
39
+ # a coordination task, which in turn gives access to e.g. states in
40
+ # an action state machine
41
+ def find_event(name)
42
+ root.find_event(name)
43
+ end
44
+
45
+ # Returns the task for the given name, if found, nil otherwise
46
+ #
47
+ # @return Roby::Coordination::Models::TaskFromAction
48
+ def find_task_by_name(name)
49
+ tasks.find do |m|
50
+ m.name == name.to_s
51
+ end
52
+ end
53
+
54
+ # The set of defined tasks
55
+ # @return [Array<Task>]
56
+ inherited_attribute(:task, :tasks) { Array.new }
57
+
58
+ # The set of fault response tables that should be active when this
59
+ # coordination model is
60
+ # @return [Array<(FaultResponseTable,Hash)>]
61
+ inherited_attribute(:used_fault_response_table, :used_fault_response_tables) { Array.new }
62
+
63
+ # Creates a new execution context model as a submodel of self
64
+ #
65
+ # @param [Model<Roby::Task>] subclass the
66
+ # task model that is going to be used as a toplevel task for the
67
+ # state machine
68
+ # @return [Model<StateMachine>] a subclass of StateMachine
69
+ def setup_submodel(subclass, options = Hash.new)
70
+ options = Kernel.validate_options options, root: Roby::Task
71
+ subclass.root(options[:root])
72
+ super
73
+ end
74
+
75
+ # Creates a state from an object
76
+ def task(object, task_model = Roby::Task)
77
+ if object.respond_to?(:to_coordination_task)
78
+ task = object.to_coordination_task(task_model)
79
+ tasks << task
80
+ task
81
+ elsif object.respond_to?(:as_plan)
82
+ task = TaskFromAsPlan.new(object, task_model)
83
+ tasks << task
84
+ task
85
+ else raise ArgumentError, "cannot create a task from #{object}"
86
+ end
87
+ end
88
+
89
+ # @api private
90
+ #
91
+ # Transform the model by exchanging tasks
92
+ #
93
+ # @param [#[]] mapping a mapping that replaces an existing task by a
94
+ # new one. All tasks must be mapped
95
+ def map_tasks(mapping)
96
+ @root = mapping.fetch(root)
97
+ @tasks = tasks.map do |t|
98
+ new_task = mapping.fetch(t)
99
+ new_task.map_tasks(mapping)
100
+ new_task
101
+ end
102
+ end
103
+
104
+ # Assigns names to tasks based on the name of the local variables
105
+ # they are assigned to
106
+ #
107
+ # This must be called by methods that are themselves called during
108
+ # parsing
109
+ #
110
+ # @param [String] suffix that should be added to all the names
111
+ def parse_names(suffixes)
112
+ definition_context = binding.callers.find { |b| b.frame_type == :block }
113
+ return if !definition_context
114
+
115
+ # Assign names to tasks using the local variables
116
+ vars = definition_context.eval "local_variables"
117
+ values = definition_context.eval "[#{vars.map { |n| "#{n}" }.join(", ")}]"
118
+ vars.zip(values).each do |name, object|
119
+ suffixes.each do |klass, suffix|
120
+ if object.kind_of?(klass)
121
+ object.name = "#{name}#{suffix}"
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ def respond_to_missing?(m, include_private)
128
+ has_argument?(m) ||
129
+ (m =~ /_event$|_child$/ && root.respond_to?(m)) ||
130
+ super
131
+ end
132
+
133
+ def method_missing(m, *args, &block)
134
+ if has_argument?(m)
135
+ if !args.empty?
136
+ raise ArgumentError, "expected zero arguments to #{m}, got #{args.size}"
137
+ end
138
+ Variable.new(m)
139
+ elsif m =~ /(.*)(?:_event$|_child$)/
140
+ return root.send(m, *args, &block)
141
+ else return super
142
+ end
143
+ end
144
+
145
+ def validate_task(object)
146
+ if !object.kind_of?(Coordination::Models::Task)
147
+ raise ArgumentError, "expected a state object, got #{object}. States need to be created from e.g. actions by calling #state before they can be used in the state machine"
148
+ end
149
+ object
150
+ end
151
+
152
+ def validate_or_create_task(task)
153
+ if !task.kind_of?(Coordination::Models::Task)
154
+ task(task)
155
+ else task
156
+ end
157
+ end
158
+
159
+ def validate_event(object)
160
+ if !object.kind_of?(Coordination::Models::Event)
161
+ raise ArgumentError, "expected an action-event object, got #{object}. Acceptable events need to be created from e.g. actions by calling #task(action).my_event"
162
+ end
163
+ object
164
+ end
165
+
166
+ # Declare that this fault response table should be active as long as
167
+ # this coordination model is
168
+ def use_fault_response_table(table_model, arguments = Hash.new)
169
+ arguments = table_model.validate_arguments(arguments)
170
+ used_fault_response_tables << [table_model, arguments]
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
176
+
@@ -0,0 +1,86 @@
1
+ module Roby
2
+ module Coordination
3
+ module Models
4
+ # Object that is used to represent the context of an event context
5
+ class Capture
6
+ # The capture name
7
+ #
8
+ # Only used for debugging purposes
9
+ #
10
+ # @return [String]
11
+ attr_accessor :name
12
+
13
+ # Create a new capture object
14
+ #
15
+ # @param [#call] filter an object that is used to process the
16
+ # event's context. It is passed the context as-is (i.e. as an
17
+ # array) and should return the value that should be captured
18
+ def initialize(filter = lambda { |event| event.context })
19
+ @filter = filter
20
+ end
21
+
22
+ # Filter the context through the filter object passed to
23
+ # {#initialize}
24
+ def filter(state_machine, event)
25
+ CaptureEvaluationContext.new(state_machine).
26
+ instance_exec(event, &@filter)
27
+ end
28
+
29
+ class CaptureEvaluationContext < Object
30
+ def initialize(state_machine)
31
+ @state_machine = state_machine
32
+ end
33
+
34
+ def respond_to_missing?(m, include_private)
35
+ @state_machine.model.has_argument?(m) || super
36
+ end
37
+
38
+ def method_missing(m, *args)
39
+ if @state_machine.arguments.has_key?(m)
40
+ if args.empty?
41
+ return @state_machine.arguments[m]
42
+ else
43
+ raise ArgumentError, "expected zero argument to #{m}, got #{args.size}"
44
+ end
45
+ elsif @state_machine.model.has_argument?(m)
46
+ raise ArgumentError, "#{m} is not set"
47
+ end
48
+ super
49
+ end
50
+ end
51
+
52
+ # Exception raised when trying to evaluate a capture whose
53
+ # backing event has not yet happened
54
+ class Unbound < RuntimeError
55
+ attr_reader :capture
56
+ def initialize(capture)
57
+ @capture = capture
58
+ end
59
+ end
60
+
61
+ def evaluate_delayed_argument(task)
62
+ throw :no_value
63
+ end
64
+
65
+ # Evaluate the capture
66
+ #
67
+ # @param [Hash] variables the underlying coordination object's
68
+ # bound variables
69
+ # @raise Unbound if the capture's backing event has not yet been
70
+ # emitted
71
+ def evaluate(variables)
72
+ if variables.has_key?(self)
73
+ variables[self]
74
+ else
75
+ raise Unbound.new(self), "#{self} is not bound yet"
76
+ end
77
+ end
78
+
79
+ def to_s
80
+ "capture:#{name || '<unnamed>'}"
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+
@@ -0,0 +1,35 @@
1
+ module Roby
2
+ module Coordination
3
+ module Models
4
+ # A representation of a task of the execution context's task
5
+ class Child < Task
6
+ # @return [Base,Child] the child's parent
7
+ attr_reader :parent
8
+ # @return [String] the child's role, relative to its parent
9
+ attr_reader :role
10
+ # The child's model
11
+ attr_reader :model
12
+
13
+ def initialize(parent, role, model)
14
+ @parent, @role, @model = parent, role, model
15
+ end
16
+
17
+ def ==(other)
18
+ other.kind_of?(Child) &&
19
+ other.parent == parent &&
20
+ other.role == role &&
21
+ other.model == model
22
+ end
23
+
24
+ # @return [Coordination::Child]
25
+ def new(execution_context)
26
+ Coordination::Child.new(execution_context, self)
27
+ end
28
+
29
+ def to_s; "#{parent}.#{role}_child[#{model}]" end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+
@@ -0,0 +1,41 @@
1
+ module Roby
2
+ module Coordination
3
+ module Models
4
+ # A representation of an event on the execution context's task
5
+ class Event
6
+ # @return [Coordination::Models::Task] The task this event is defined on
7
+ attr_reader :task
8
+ # @return [Symbol] the event's symbol
9
+ attr_reader :symbol
10
+
11
+ def initialize(task, symbol)
12
+ @task, @symbol = task, symbol.to_sym
13
+ end
14
+
15
+ # @return [Coordination::Base::Event]
16
+ def new(execution_context)
17
+ Coordination::Event.new(execution_context, self)
18
+ end
19
+
20
+ def ==(other)
21
+ other.kind_of?(self.class) &&
22
+ other.symbol == symbol &&
23
+ other.task == task
24
+ end
25
+
26
+ # When running in this event's state, forward this event to the
27
+ # given root task event
28
+ def forward_to(root_event)
29
+ if !root_event.task.respond_to?(:coordination_model)
30
+ raise NotRootEvent, "can only forward to a root event"
31
+ end
32
+ root_event.task.coordination_model.
33
+ forward task, self, root_event
34
+ end
35
+
36
+ def to_s; "#{task}.#{symbol}_event" end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
@@ -0,0 +1,42 @@
1
+ module Roby
2
+ module Coordination
3
+ module Models
4
+ # Base class for model validation errors
5
+ class CoordinationModelError < Exception; end
6
+
7
+ # Exception thrown when using a non-root event in a context where
8
+ # only root events are allowed
9
+ class NotRootEvent < CoordinationModelError; end
10
+
11
+ # Exception raised in state machine definitions when a state is used
12
+ # in a transition, that cannot be reached in the first place
13
+ class UnreachableStateUsed < RuntimeError
14
+ # The set of unreachable states
15
+ attr_reader :states
16
+
17
+ def initialize(states)
18
+ @states = states
19
+ end
20
+
21
+ def pretty_print(pp)
22
+ pp.text "#{states.size} states are unreachable but used in transitions anyways"
23
+ pp.nest(2) do
24
+ pp.seplist(states) do |s|
25
+ pp.breakable
26
+ s.pretty_print(pp)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ # Exception thrown when a toplevel state was expected but a
33
+ # dependency was given
34
+ class NotToplevelState < CoordinationModelError; end
35
+
36
+ # Exception thrown when using an event in a context where it is not
37
+ # active
38
+ class EventNotActiveInState < CoordinationModelError; end
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,219 @@
1
+ module Roby
2
+ module Coordination
3
+ module Models
4
+ # Definition of a single fault handler in a FaultResponseTable
5
+ module FaultHandler
6
+ include Actions
7
+ include Script
8
+
9
+ # @return [FaultResponseTable] the table this handler is part of
10
+ def fault_response_table; action_interface end
11
+ # @return [Queries::ExecutionExceptionMatcher] the object
12
+ # defining for which faults this handler should be activated
13
+ inherited_single_value_attribute(:execution_exception_matcher) { Queries.none }
14
+ # @return [Integer] this handler's priority
15
+ inherited_single_value_attribute(:priority) { 0 }
16
+ # @return [:missions,:actions,:origin] the fault response
17
+ # location
18
+ inherited_single_value_attribute(:response_location) { :actions }
19
+ # @return [Boolean] if true, the action location will be retried
20
+ # after the fault response table, otherwise whatever should
21
+ # happen will happen (other error handling, ...)
22
+ inherited_single_value_attribute(:__carry_on) { false }
23
+ # @return [Boolean] if true, the last action of the response
24
+ # will be to retry whichever action/missions/tasks have been
25
+ # interrupted by the fault
26
+ def carry_on?; !!__carry_on end
27
+ # @deprecated use {#carry_on?}
28
+ def try_again?; carry_on? end
29
+ # @return [#instanciate] an object that allows to create the
30
+ # toplevel task of the fault response
31
+ inherited_single_value_attribute :action
32
+
33
+ def to_s
34
+ "#{fault_response_table}.on_fault(#{execution_exception_matcher})"
35
+ end
36
+
37
+ def locate_on_missions
38
+ response_location :missions
39
+ self
40
+ end
41
+
42
+ def locate_on_actions
43
+ response_location :actions
44
+ self
45
+ end
46
+
47
+ def locate_on_origin
48
+ response_location :origin
49
+ self
50
+ end
51
+
52
+ # Try the repaired action again when the fault handler
53
+ # successfully finishes
54
+ #
55
+ # It can be called anytime in the script, but will have an
56
+ # effect only at the end of the fault handler
57
+ def carry_on
58
+ __carry_on(true)
59
+ terminal
60
+ end
61
+
62
+ # @deprecated use {#carry_on}
63
+ def try_again; carry_on end
64
+
65
+ # Script element that implements the replacement part of
66
+ # {#replace_by}
67
+ class ReplaceBy < Coordination::ScriptInstruction
68
+ attr_reader :replacement_task
69
+
70
+ def initialize(replacement_task)
71
+ @replacement_task = replacement_task
72
+ end
73
+
74
+ def new(fault_handler)
75
+ ReplaceBy.new(fault_handler.instance_for(replacement_task))
76
+ end
77
+
78
+ def execute(fault_handler)
79
+ response_task = fault_handler.root_task
80
+ plan = response_task.plan
81
+ replacement_task = self.replacement_task.resolve
82
+
83
+ response_task.each_parent_object(Roby::TaskStructure::ErrorHandling) do |repaired_task|
84
+ repaired_task_parents = repaired_task.each_parent_task.map do |parent_task|
85
+ [parent_task, parent_task[repaired_task, Roby::TaskStructure::Dependency]]
86
+ end
87
+ plan.replace(repaired_task, replacement_task)
88
+ repaired_task_parents.each do |parent_t, dependency_options|
89
+ parent_t.add_child repaired_task, dependency_options
90
+ end
91
+ end
92
+ true
93
+ end
94
+
95
+ def to_s; "start(#{task}, #{dependency_options})" end
96
+ end
97
+
98
+ class FinalizeReplacement < Coordination::ScriptInstruction
99
+ def new(fault_handler)
100
+ self
101
+ end
102
+
103
+ def execute(fault_handler)
104
+ response_task = fault_handler.root_task
105
+ response_task.each_parent_object(Roby::TaskStructure::ErrorHandling) do |repaired_task|
106
+ repaired_task_parents = repaired_task.each_parent_task.to_a
107
+ repaired_task_parents.each do |parent|
108
+ parent.remove_child repaired_task
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ # Replace the response's location by this task when the fault
115
+ # handler script is finished
116
+ #
117
+ # It terminates the script, i.e. no instructions can be added
118
+ # after it is called
119
+ #
120
+ # @raise ArgumentError if there is already a replacement task
121
+ def replace_by(task, until_event = nil)
122
+ __carry_on(false)
123
+ replacement_task = validate_or_create_task(task)
124
+ start replacement_task
125
+ instructions << ReplaceBy.new(replacement_task)
126
+ wait(until_event || replacement_task.success_event)
127
+ instructions << FinalizeReplacement.new
128
+ emit success_event
129
+ terminal
130
+ end
131
+
132
+ class ResponseLocationVisitor < RGL::DFSVisitor
133
+ attr_reader :predicate, :selected
134
+
135
+ def initialize(graph, predicate)
136
+ super(graph)
137
+ @predicate = predicate
138
+ @selected = Set.new
139
+ end
140
+
141
+ def handle_examine_vertex(u)
142
+ if predicate.call(u)
143
+ selected << u
144
+ end
145
+ end
146
+
147
+ def follow_edge?(u, v)
148
+ if selected.include?(u)
149
+ false
150
+ else super
151
+ end
152
+ end
153
+ end
154
+
155
+ def find_response_locations(origin)
156
+ if response_location == :origin
157
+ return [origin].to_set
158
+ end
159
+
160
+ predicate =
161
+ if response_location == :missions
162
+ proc { |t| t.mission? && t.running? }
163
+ elsif response_location == :actions
164
+ proc { |t| t.running? && t.planning_task && t.planning_task.kind_of?(Roby::Actions::Task) }
165
+ end
166
+
167
+ search_graph = origin.plan.
168
+ task_relation_graph_for(TaskStructure::Dependency).
169
+ reverse
170
+ visitor = ResponseLocationVisitor.new(search_graph, predicate)
171
+ search_graph.depth_first_visit(origin, visitor) {}
172
+ visitor.selected
173
+ end
174
+
175
+ # @api private
176
+ #
177
+ # Activate this fault handler for the given exception and
178
+ # arguments. It creates the {FaultHandlingTask} and attaches the
179
+ # handler on it as an action script.
180
+ #
181
+ # @param [ExecutionException] exception
182
+ # @param [Hash] arguments
183
+ def activate(exception, arguments = Hash.new)
184
+ locations = find_response_locations(exception.origin)
185
+ if locations.empty?
186
+ Roby.warn "#{self} did match an exception, but the response location #{response_location} does not match anything"
187
+ return
188
+ end
189
+
190
+ plan = exception.origin.plan
191
+
192
+ # Create the response task
193
+ plan.add(response_task = FaultHandlingTask.new)
194
+ response_task.fault_handler = self
195
+ new(response_task, arguments)
196
+ response_task.start!
197
+ locations.each do |task|
198
+ # Mark :stop as handled by the response task and kill
199
+ # the task
200
+ #
201
+ # In addition, if origin == task, we need to handle the
202
+ # error events as well
203
+ task.add_error_handler response_task,
204
+ [task.stop_event.to_execution_exception_matcher, execution_exception_matcher].to_set
205
+ end
206
+ locations.each do |task|
207
+ # This should not be needed. However, the current GC
208
+ # implementation in ExecutionEngine does not stop at
209
+ # finished tasks, and therefore would not GC the
210
+ # underlying tasks
211
+ task.remove_children(Roby::TaskStructure::Dependency)
212
+ task.stop! if task.running?
213
+ end
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end
219
+