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
@@ -1,74 +0,0 @@
1
- require 'utilrb/time/to_hms'
2
- require 'roby/log/logger'
3
-
4
- module Roby::Log
5
- # A logger object which dumps events in a human-readable form to an IO object.
6
- class ConsoleLogger
7
- def splat?; false end
8
- def self.filter_names(name)
9
- name.gsub(/Roby::(?:Genom::)?/, '')
10
- end
11
- # Name of an event generator source
12
- def self.gen_source(gen)
13
- if gen.respond_to?(:task) then gen.task.name
14
- else 'toplevel'
15
- end
16
- end
17
- # Human readable name for event generators
18
- def self.gen_name(gen)
19
- if gen.respond_to?(:symbol) then "[#{gen.symbol}]"
20
- else gen.name
21
- end
22
- end
23
-
24
- attr_reader :io, :columns
25
- def initialize(io)
26
- @io = io
27
- @columns = Hash.new { |h, k| h[k] = Array.new }
28
- end
29
-
30
- def arg_to_s(arg)
31
- case arg
32
- when Time then Time.at(arg - @reftime).to_hms
33
- when Array then arg.map { |v| arg_to_s(v) }.to_s
34
- when Hash then arg.map { |k, v| [arg_to_s(k), arg_to_s(v)].join(" => ") }.to_s
35
- else arg.to_s
36
- end
37
- end
38
-
39
-
40
- def logs_message?(m); true end
41
- def close; end
42
- def dump_method(m, time, *args) # :nodoc:
43
- @reftime ||= time
44
-
45
- args.map! { |a| arg_to_s(a) }
46
- args.map!(&ConsoleLogger.method(:filter_names))
47
- args.unshift(m).
48
- unshift(Time.at(time - @reftime).to_hms)
49
-
50
- columns = self.columns[m]
51
- args.each_with_index do |str, i|
52
- str = str.to_s
53
- if !columns[i] || (str.length > columns[i])
54
- columns[i] = str.length
55
- end
56
- end
57
-
58
- args.each_with_index do |arg, i|
59
- w = columns[i]
60
- io << ("%-#{w}s " % arg)
61
- end
62
- io << "\n"
63
- rescue
64
- STDERR.puts "#{time} #{m} #{args}"
65
- raise
66
- end
67
- private :display
68
-
69
- Roby::Log.each_hook do |klass, m|
70
- define_method(m) { |time, args| dump_method(m, time, args) }
71
- end
72
- end
73
- end
74
-
@@ -1,275 +0,0 @@
1
- require 'roby/log'
2
- module Roby::Log
3
- # == Displaying log data
4
- #
5
- # Data display is done in three objects:
6
- # * a DataStream object which is the data source itself. It gives
7
- # information about available samples, time of samples and extracts raw
8
- # data. An example of data stream is the EventStream object which reads
9
- # Roby's event logs, returning one cycle worth of data at a time.
10
- # * a DataDecoder object which takes the raw data returned by a DataStream
11
- # object and turns it into a more usable representation. For instance, the PlanBuilder
12
- # decoder takes an event stream from an EventStream object and rebuilds a plan-like
13
- # structure from it.
14
- # * a display which takes its information from the decoder. The RelationDisplay displays
15
- # the information included in the PlanRebuilder decoder and displays it as a graph.
16
- class DataStream
17
- # The stream ID, which has to be unique on a single Roby core
18
- attr_reader :id
19
- # The stream name. A [name, type] has to be globally unique
20
- attr_reader :name
21
- # The stream type, as a string.
22
- attr_reader :type
23
-
24
- def self.open(basename)
25
- stream = new(basename)
26
- stream.open
27
-
28
- if block_given?
29
- begin
30
- yield(stream)
31
- ensure
32
- stream.logfile.close
33
- end
34
- else
35
- stream
36
- end
37
- end
38
-
39
-
40
- def initialize(name, type)
41
- @id = object_id
42
- @name = name
43
- @type = type
44
- @range = [nil, nil]
45
-
46
- @decoders = []
47
- end
48
-
49
- def each_sample
50
- while sample = read_and_decode
51
- yield(sample)
52
- end
53
- end
54
-
55
- def to_s; "#{name} [#{type}]" end
56
- def open; end
57
- def close; end
58
-
59
- def has_sample?; false end
60
- attr_predicate :reinit, true
61
- def reinit?; end
62
- def reinit!
63
- @range = [nil, nil]
64
- @reinit = false
65
-
66
- clear
67
- end
68
- def read_all; end
69
-
70
- def read_and_decode
71
- if raw = read
72
- self.class.decode(raw)
73
- end
74
- end
75
-
76
- # The [min, max] range of available samples. Initially
77
- # [nil, nil]
78
- attr_reader :range
79
-
80
- # The set of decoders attached to this stream
81
- attr_reader :decoders
82
-
83
- def clear
84
- decoders.each { |dec| dec.clear }
85
- end
86
-
87
- # True if there is at least one display attached to this data stream
88
- def displayed?
89
- decoders.any? do |dec|
90
- !dec.displays.empty?
91
- end
92
- end
93
-
94
- # Reuse or creates a decoder of the given class for this data
95
- # stream
96
- def decoder(klass)
97
- if dec = decoders.find { |d| d.kind_of?(klass) }
98
- dec
99
- else
100
- decoders << (dec = klass.new(name))
101
- dec.stream = self
102
- added_decoder(dec)
103
- dec
104
- end
105
- end
106
-
107
- def added_decoder(dec)
108
- super if defined? super
109
- end
110
-
111
- # Do a read and decode the data
112
- #
113
- # It returns false if no decoders have found interesting updates in the
114
- # decoded data, and true otherwise. The method relies on the decoder's
115
- # #process method to return true/false when required.
116
- #
117
- # See DataDecoder#process
118
- def advance
119
- if data = read_and_decode
120
- !decoders.find_all do |dec|
121
- dec.process(data)
122
- end.empty?
123
- else
124
- raise EOFError
125
- end
126
- end
127
-
128
- def init(data)
129
- self.class.init(data)
130
- end
131
- def decode(data)
132
- self.class.decode(data)
133
- end
134
-
135
- # Displays may have the ability to not display a per-cycle information,
136
- # but to add information as it is coming over. This call asks them to
137
- # remove the information integrated until now.
138
- #
139
- # It forwards the call to the decoders' #clear_integrated call. These
140
- # methods should return true if a change has been needed on any of their
141
- # display, and false otherwise.
142
- def clear_integrated
143
- !decoders.find_all do |decoder|
144
- decoder.clear_integrated
145
- end.empty?
146
- end
147
-
148
- # Update the displays
149
- #
150
- # It returns false if all decoders have reported that no display update
151
- # was required, and true otherwise. The method relies on the decoder's
152
- # #display method to return true/false when required.
153
- #
154
- # See DataDecoder#display
155
- def display
156
- decoders.each do |decoder|
157
- decoder.display
158
- end
159
- end
160
-
161
- def ==(other)
162
- other.kind_of?(DataStream) &&
163
- name == other.name &&
164
- type == other.type
165
- end
166
- def eql?(other); self == other end
167
- def hash; [name, type].hash end
168
- end
169
-
170
- # In the data flow model we're using, a data decoder gets data from a
171
- # DataStream object and builds a representation that can be used by
172
- # displays.
173
- class DataDecoder
174
- # The set of displays attached to this decoder
175
- attr_reader :displays
176
- # The decoder name
177
- attr_reader :name
178
-
179
- # The DataStream object we're getting our data from
180
- attr_accessor :stream
181
-
182
- def initialize(name)
183
- @name = name
184
- @displays = []
185
- end
186
-
187
- # Clear the stream data
188
- def clear
189
- displays.each { |d| d.clear }
190
- end
191
-
192
- # Displays may have the ability to not display a per-cycle information,
193
- # but to add information as it is coming over. This call asks them to
194
- # remove the information integrated until now.
195
- #
196
- # It forwards the call to the displays' #clear_integrated call(if any). These
197
- # methods should return true if a change has been needed on any of their
198
- # display, and false otherwise.
199
- def clear_integrated
200
- !displays.find_all do |display|
201
- if display.respond_to?(:clear_integrated)
202
- display.clear_integrated
203
- end
204
- end.empty?
205
- end
206
-
207
- # Updates the displays that are associated with this decoder. Returns
208
- # true if one of the displays have been changed, and false otherwise.
209
- #
210
- # It relies on the display's #update method to return true if something
211
- # has changed on the display and false otherwise.
212
- def display
213
- !displays.find_all do |display|
214
- display.update
215
- end.empty?
216
- end
217
- end
218
-
219
- # This module gets mixed-in the display classes. It creates the necessary
220
- # stream => decoder => display link, reusing (if possible) a decoder that
221
- # already exists.
222
- #
223
- # One should use it that way:
224
- #
225
- # class Display
226
- # include DataDisplay
227
- # decoder DecoderClass
228
- # end
229
- #
230
- # Then, one can do
231
- # display = Display.new
232
- # display.stream = data_stream
233
- #
234
- # and leave the rest to the DataDisplay implementation.
235
- module DataDisplay
236
- module ClassExtension
237
- def decoder(new_type = nil)
238
- if new_type
239
- @decoder_class = new_type
240
- else
241
- @decoder_class
242
- end
243
- end
244
- end
245
-
246
- # The decoder object. That object gets data from a DataStream object and
247
- # decodes it into the format required by the display.
248
- #
249
- # Examples: PlanRebuilder
250
- attr_reader :decoder
251
- attr_reader :main
252
-
253
- # The configuration UI object. Usually a subclass of Qt::Widget
254
- attr_accessor :config_ui
255
-
256
-
257
- def splat? #:nodoc:
258
- true
259
- end
260
-
261
- # Sets the data stream that this display listens to. It creates or gets
262
- # the decoder that is necessary between the raw stream and the display
263
- def stream=(data_stream)
264
- if decoder
265
- clear
266
- end
267
-
268
- @decoder = data_stream.decoder(self.class.decoder)
269
- decoder.displays << self
270
- end
271
-
272
- def clear; end
273
- end
274
- end
275
-
@@ -1,279 +0,0 @@
1
- require 'roby/distributed/protocol'
2
- require 'roby/log'
3
- require 'tempfile'
4
- require 'fileutils'
5
-
6
- module Roby
7
- module LoggedPlan
8
- attr_accessor :layout_level
9
- def all_events(display)
10
- known_tasks.inject(free_events.dup) do |events, task|
11
- if display.displayed?(task)
12
- events.merge(task.events.values.to_value_set)
13
- else
14
- events
15
- end
16
- end
17
- end
18
-
19
- attr_reader :dot_id
20
- def to_dot(display, io, level)
21
- @layout_level = level
22
- id = io.layout_id(self)
23
- @dot_id = "plan_#{id}"
24
- io << "subgraph cluster_#{dot_id} {\n"
25
- (known_tasks | finalized_tasks | free_events | finalized_events).
26
- each do |obj|
27
- obj.to_dot(display, io) if display.displayed?(obj)
28
- end
29
-
30
- io << "};\n"
31
-
32
- transactions.each do |trsc|
33
- trsc.to_dot(display, io, level + 1)
34
- end
35
-
36
- relations_to_dot(display, io, Roby::Log::RelationsDisplay.all_task_relations, known_tasks)
37
- end
38
-
39
- def each_displayed_relation(display, relations, objects)
40
- relations.each do |rel|
41
- next unless display.relation_enabled?(rel)
42
-
43
- objects.each do |from|
44
- next unless display.displayed?(from)
45
- unless display[from]
46
- Roby::Log.warn "no display item for #{from} in #each_displayed_relation"
47
- next
48
- end
49
-
50
- from.each_child_object(rel) do |to|
51
- next unless display.displayed?(to)
52
- unless display[to]
53
- Roby::Log.warn "no display item for child in #{from} <#{rel}> #{to} in #each_displayed_relation"
54
- next
55
- end
56
-
57
- yield(rel, from, to)
58
- end
59
- end
60
- end
61
- end
62
-
63
- def relations_to_dot(display, io, all_relations, objects)
64
- each_displayed_relation(display, all_relations, objects) do |rel, from, to|
65
- from_id, to_id = from.dot_id, to.dot_id
66
- if from_id && to_id
67
- io << " #{from_id} -> #{to_id}\n"
68
- else
69
- Roby::Log.warn "ignoring #{from}(#{from.object_id} #{from_id}) -> #{to}(#{to.object_id} #{to_id}) in #{rel} in #{caller(1).join("\n ")}"
70
- end
71
- end
72
- end
73
-
74
- def layout_relations(positions, display, all_relations, objects)
75
- each_displayed_relation(display, all_relations, objects) do |rel, from, to|
76
- display.task_relation(from, to, rel, from[to, rel])
77
- end
78
- end
79
-
80
- # The distance from the root plan
81
- attr_reader :depth
82
-
83
- # Computes the plan depths and max_depth for this plan and all its
84
- # children. +depth+ is this plan depth
85
- #
86
- # Returns max_depth
87
- def compute_depth(depth)
88
- @depth = depth
89
- child_depth = transactions.
90
- map { |trsc| trsc.compute_depth(depth + 1) }.
91
- max
92
- child_depth || depth
93
- end
94
-
95
- def apply_layout(bounding_rects, positions, display, max_depth = nil)
96
- max_depth ||= compute_depth(0)
97
-
98
- if rect = bounding_rects[dot_id]
99
- item = display[self]
100
- rect[2] *= 1.2
101
- rect[3] *= 1.2
102
- item.z_value = Log::PLAN_LAYER + depth - max_depth
103
- item.set_rect *rect
104
- else
105
- Roby::Log.warn "no bounding rectangle for #{self} (#{dot_id})"
106
- end
107
-
108
-
109
- (known_tasks | finalized_tasks | free_events | finalized_events).
110
- each do |obj|
111
- obj.apply_layout(positions, display)
112
- end
113
-
114
- transactions.each do |trsc|
115
- trsc.apply_layout(bounding_rects, positions, display, max_depth)
116
- end
117
- layout_relations(positions, display, Roby::Log::RelationsDisplay.all_task_relations, known_tasks)
118
- end
119
- end
120
-
121
- module LoggedPlanObject
122
- attr_reader :dot_id
123
-
124
- def dot_label(display); display_name(display) end
125
-
126
- # Adds the dot definition for this object in +io+
127
- def to_dot(display, io)
128
- return unless display.displayed?(self)
129
- @dot_id ||= "plan_object_#{io.layout_id(self)}"
130
- io << " #{dot_id}[label=\"#{dot_label(display).split("\n").join('\n')}\"];\n"
131
- end
132
-
133
- # Applys the layout in +positions+ to this particular object
134
- def apply_layout(positions, display)
135
- return unless display.displayed?(self)
136
- if p = positions[dot_id]
137
- raise "no graphics for #{self}" unless graphics_item = display[self]
138
- graphics_item.pos = p
139
- else
140
- STDERR.puts "WARN: #{self} has not been layouted"
141
- end
142
- end
143
- end
144
-
145
- class PlanObject::DRoby
146
- include LoggedPlanObject
147
- end
148
-
149
- class TaskEventGenerator::DRoby
150
- def dot_label(display); symbol.to_s end
151
- def dot_id; task.dot_id end
152
- end
153
-
154
- module LoggedTask
155
- include LoggedPlanObject
156
- def dot_label(display)
157
- event_names = events.values.find_all { |ev| display.displayed?(ev) }.
158
- map { |ev| ev.dot_label(display) }.
159
- join(" ")
160
-
161
- own = super
162
- if own.size > event_names.size then own
163
- else event_names
164
- end
165
- end
166
- end
167
-
168
- module Log
169
- class Layout
170
- @@bkpindex = 0
171
-
172
- def layout_id(object)
173
- id = Object.address_from_id(object.object_id).to_s
174
- object_ids[id] = object
175
- id
176
- end
177
-
178
- attribute(:object_ids) { Hash.new }
179
- attr_reader :dot_input
180
-
181
- def <<(string); dot_input << string end
182
- def layout(display, plan)
183
- @@index ||= 0
184
- @@index += 1
185
-
186
- # Dot input file
187
- @dot_input = Tempfile.new("roby_dot")
188
- # Dot output file
189
- dot_output = Tempfile.new("roby_layout")
190
-
191
- dot_input << "digraph relations {\n"
192
- display.layout_options.each do |k, v|
193
- dot_input << " #{k}=#{v};\n"
194
- end
195
- plan.to_dot(display, self, 0)
196
-
197
- # Take the signalling into account for the layout
198
- display.propagated_events.each do |_, sources, to, _|
199
- sources.each do |from|
200
- from_id, to_id = from.dot_id, to.dot_id
201
- if from_id && to_id
202
- dot_input << " #{from.dot_id} -> #{to.dot_id}\n"
203
- end
204
- end
205
- end
206
-
207
- dot_input << "\n};"
208
- dot_input.flush
209
-
210
- # Make sure the GUI keeps being updated while dot is processing
211
- FileUtils.cp dot_input.path, "/tmp/dot-input-#{@@index}.dot"
212
- system("#{display.layout_method} #{dot_input.path} > #{dot_output.path}")
213
- #pid = fork do
214
- # exec("#{display.layout_method} #{dot_input.path} > #{dot_output.path}")
215
- #end
216
- #while !Process.waitpid(pid, Process::WNOHANG)
217
- # if Qt::Application.has_pending_events
218
- # Qt::Application.process_events
219
- # else
220
- # sleep(0.05)
221
- # end
222
- #end
223
- FileUtils.cp dot_output.path, "/tmp/dot-output-#{@@index}.dot"
224
-
225
- # Load only task bounding boxes from dot, update arrows later
226
- current_graph_id = nil
227
- bounding_rects = Hash.new
228
- object_pos = Hash.new
229
- lines = File.open(dot_output.path) { |io| io.readlines }
230
- full_line = ""
231
- lines.each do |line|
232
- line.chomp!
233
- full_line << line
234
- if line[-1] == ?\\
235
- full_line.chop!
236
- next
237
- end
238
-
239
- case full_line
240
- when /((?:\w+_)+\d+) \[.*pos="(\d+),(\d+)"/
241
- object_pos[$1] = Qt::PointF.new(Integer($2), Integer($3))
242
- when /subgraph cluster_(plan_\d+)/
243
- current_graph_id = $1
244
- when /graph \[bb="(\d+),(\d+),(\d+),(\d+)"\]/
245
- bb = [$1, $2, $3, $4].map do |c|
246
- c = Integer(c)
247
- end
248
- bounding_rects[current_graph_id] = [bb[0], bb[1], bb[2] - bb[0], bb[3] - bb[1]]
249
- end
250
- full_line = ""
251
- end
252
-
253
- graph_bb = bounding_rects.delete(nil)
254
- bounding_rects.each_value do |coords|
255
- coords[0] -= graph_bb[0]
256
- coords[1] = graph_bb[1] - coords[1] - coords[3]
257
- end
258
- object_pos.each do |id, pos|
259
- pos.x -= graph_bb[0]
260
- pos.y = graph_bb[1] - pos.y
261
- end
262
-
263
- @display = display
264
- @plan = plan
265
- @object_pos = object_pos
266
- @bounding_rects = bounding_rects
267
-
268
- ensure
269
- dot_input.close! if dot_input
270
- dot_output.close! if dot_output
271
- end
272
-
273
- attr_reader :bounding_rects, :object_pos, :display, :plan
274
- def apply
275
- plan.apply_layout(bounding_rects, object_pos, display)
276
- end
277
- end
278
- end
279
- end