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,1084 +0,0 @@
1
- require 'Qt4'
2
- require 'utilrb/module/attr_predicate'
3
- require 'roby/distributed/protocol'
4
- require 'roby/log/dot'
5
- require 'roby/log/plan_rebuilder'
6
- require 'roby/log/gui/relations_view'
7
-
8
- module Roby
9
- class PlanObject::DRoby
10
- def display_parent; end
11
- def display_create(display); end
12
- def display_events; ValueSet.new end
13
- def display_name(display); remote_name end
14
- def display(display, graphics_item)
15
- end
16
- end
17
-
18
- module EventGeneratorDisplay
19
- def self.style(object, flags)
20
- # This is for backward compatibility only. All events are now marshalled
21
- # with their controllability.
22
- if !object.controlable.nil?
23
- flags |= (object.controlable ? Log::EVENT_CONTROLABLE : Log::EVENT_CONTINGENT)
24
- elsif (flags & Log::EVENT_CALLED) != 0
25
- flags |= Log::EVENT_CONTROLABLE
26
- end
27
-
28
- if !styles.has_key?(flags)
29
- raise ArgumentError, "event flags #{flags} have not style"
30
- end
31
-
32
- styles[flags]
33
- end
34
-
35
- def self.styles
36
- if defined? @@event_styles
37
- return @@event_styles
38
- end
39
-
40
- @@event_styles = Hash.new
41
- @@event_styles[Log::EVENT_CONTROLABLE | Log::EVENT_CALLED] =
42
- [Qt::Brush.new(Qt::Color.new(Log::PENDING_EVENT_COLOR)),
43
- Qt::Pen.new(Qt::Color.new(Log::PENDING_EVENT_COLOR))]
44
- @@event_styles[Log::EVENT_CONTROLABLE | Log::EVENT_EMITTED] =
45
- [Qt::Brush.new(Qt::Color.new(Log::FIRED_EVENT_COLOR)),
46
- Qt::Pen.new(Qt::Color.new(Log::FIRED_EVENT_COLOR))]
47
- @@event_styles[Log::EVENT_CONTROLABLE | Log::EVENT_CALLED_AND_EMITTED] =
48
- [Qt::Brush.new(Qt::Color.new(Log::FIRED_EVENT_COLOR)),
49
- Qt::Pen.new(Qt::Color.new(Log::PENDING_EVENT_COLOR))]
50
- @@event_styles[Log::EVENT_CONTINGENT | Log::EVENT_EMITTED] =
51
- [Qt::Brush.new(Qt::Color.new('white')), Qt::Pen.new(Qt::Color.new(Log::FIRED_EVENT_COLOR))]
52
- @@event_styles
53
- end
54
-
55
- def self.priorities
56
- @@priorities ||= Hash.new
57
- end
58
-
59
- def display_create(display)
60
- scene = display.scene
61
- circle = scene.add_ellipse(-Log::EVENT_CIRCLE_RADIUS, -Log::EVENT_CIRCLE_RADIUS, Log::EVENT_CIRCLE_RADIUS * 2, Log::EVENT_CIRCLE_RADIUS * 2)
62
- text = scene.add_text(display_name(display))
63
- circle.singleton_class.class_eval { attr_accessor :text }
64
- circle.z_value = Log::EVENT_LAYER
65
-
66
- text.parent_item = circle
67
- text_width = text.bounding_rect.width
68
- text.set_pos(-text_width / 2, 0)
69
- circle.text = text
70
- circle
71
- end
72
-
73
- def display_time_start(circle, pos); circle.translate(pos) end
74
- def display_time_end(circle, pos); end
75
- end
76
-
77
- class EventGenerator::DRoby
78
- include EventGeneratorDisplay
79
-
80
- def display_name(display)
81
- name = if model.ancestors[0][0] != 'Roby::EventGenerator'
82
- [display.filter_prefixes(model.ancestors[0][0].dup)]
83
- else
84
- []
85
- end
86
-
87
- if display.show_ownership
88
- name << owners_to_s
89
- end
90
- name.join("\n")
91
- end
92
-
93
- def display(display, graphics_item)
94
- graphics_item.text.plain_text = display_name(display).to_s
95
- end
96
- end
97
-
98
- class TaskEventGenerator::DRoby
99
- include EventGeneratorDisplay
100
- def display_parent; task end
101
- def display_name(display); symbol.to_s end
102
-
103
- def display(display, graphics_item)
104
- end
105
- end
106
-
107
- module LoggedTask
108
- def layout_events(display)
109
- graphics_item = display[self]
110
-
111
- width, height = 0, 0
112
- events = self.events.map do |_, e|
113
- next unless display.displayed?(e)
114
- next unless circle = display[e]
115
- br = (circle.bounding_rect | circle.children_bounding_rect)
116
- [e, circle, br]
117
- end
118
- events.compact!
119
- events = events.sort_by { |ev, _| EventGeneratorDisplay.priorities[ev] }
120
-
121
- events.each do |_, circle, br|
122
- w, h = br.width, br.height
123
- height = h if h > height
124
- width += w
125
- end
126
- width += Log::TASK_EVENT_SPACING * (events.size + 1)
127
- height += Log::TASK_EVENT_SPACING
128
-
129
- x = -width / 2 + Log::TASK_EVENT_SPACING
130
- events.each do |e, circle, br|
131
- w = br.width
132
- circle.set_pos(x + w / 2, -br.height / 2 + Log::EVENT_CIRCLE_RADIUS + Log::TASK_EVENT_SPACING)
133
- x += w + Log::TASK_EVENT_SPACING
134
- end
135
-
136
- width = Log::DEFAULT_TASK_WIDTH unless width > Log::DEFAULT_TASK_WIDTH
137
- height = Log::DEFAULT_TASK_HEIGHT unless height > Log::DEFAULT_TASK_HEIGHT
138
-
139
- if @width != width || @height != height
140
- @width, @height = width, height
141
- coords = Qt::RectF.new -(width / 2), -(height / 2), width, height
142
- graphics_item.rect = coords
143
- end
144
-
145
- text = graphics_item.text
146
- text.set_pos(- text.bounding_rect.width / 2, height / 2 + Log::TASK_EVENT_SPACING)
147
- end
148
-
149
- def display_create(display)
150
- scene = display.scene
151
- rect = scene.add_rect Qt::RectF.new(0, 0, 0, 0)
152
- text = scene.add_text display_name(display)
153
- rect.brush = Qt::Brush.new(Log::TASK_BRUSH_COLORS[:pending])
154
- rect.pen = Qt::Pen.new(Log::TASK_PEN_COLORS[:pending])
155
- @displayed_state = :pending
156
- text.parent_item = rect
157
- rect.singleton_class.class_eval { attr_accessor :text }
158
- rect.text = text
159
- rect.z_value = Log::TASK_LAYER
160
-
161
- rect.set_data(0, Qt::Variant.new(self.object_id.to_s))
162
- rect
163
- end
164
-
165
- def display_time_start(rect, pos); rect.left = pos end
166
- def display_time_end(rect, pos); rect.right = pos end
167
- end
168
-
169
- class Task::DRoby
170
- include LoggedTask
171
- attr_accessor :last_event
172
-
173
- def display_name(display)
174
- name = display.filter_prefixes(model.ancestors[0][0].dup)
175
- if display.show_ownership
176
- name << "\n#{owners_to_s}"
177
- end
178
- name
179
- end
180
-
181
- def current_state
182
- new_state = if plan && plan.finalized_tasks.include?(self)
183
- :finalized
184
- else
185
- [:success, :finished, :started, :pending].
186
- find { |flag| flags[flag] }
187
- end
188
- new_state || :pending
189
- end
190
-
191
- attr_reader :displayed_state
192
- def update_graphics(display, graphics_item)
193
- new_state = current_state
194
- if displayed_state != new_state
195
- graphics_item.brush = Qt::Brush.new(Log::TASK_BRUSH_COLORS[new_state])
196
- graphics_item.pen = Qt::Pen.new(Log::TASK_PEN_COLORS[new_state])
197
- displayed_state = new_state
198
- end
199
-
200
- graphics_item.text.plain_text = display_name(display).to_s
201
-
202
- end
203
-
204
- def display(display, graphics_item)
205
- update_graphics(display, graphics_item)
206
- super
207
- layout_events(display)
208
- end
209
- end
210
-
211
- class Transaction::Proxy::DRoby
212
- include LoggedTask
213
-
214
- attr_writer :real_object
215
- def flags; real_object.flags end
216
-
217
- def display_parent; end
218
- def display_name(display); real_object.display_name(display) end
219
- def display_create(display)
220
- scene = display.scene
221
- item = super
222
-
223
- brush = item.brush
224
- brush.style = Qt::BDiagPattern
225
- item.brush = brush
226
- item
227
- end
228
- def display(display, graphics_item)
229
- graphics_item.text.plain_text = display_name(display).to_s
230
- layout_events(display)
231
- end
232
- end
233
-
234
- module LoggedPlan
235
- PLAN_STROKE_WIDTH = 5
236
- # The plan depth, i.e. its distance from the root plan
237
- attr_reader :depth
238
- # The max depth of the plan tree in this branch
239
- attr_reader :max_depth
240
-
241
- def display_create(display)
242
- scene = display.scene
243
- pen = Qt::Pen.new
244
- pen.width = PLAN_STROKE_WIDTH
245
- pen.style = Qt::SolidLine
246
- pen.cap_style = Qt::SquareCap
247
- pen.join_style = Qt::RoundJoin
248
- scene.add_rect Qt::RectF.new(0, 0, 0, 0), pen
249
- end
250
- def display_parent; parent_plan end
251
- def display(display, item)
252
- #STDERR.puts "DISPLAYING PLAN\n #{caller.join("\n ")}"
253
- end
254
- end
255
-
256
- module Log
257
- EVENT_CIRCLE_RADIUS = 3
258
- TASK_EVENT_SPACING = 5
259
- DEFAULT_TASK_WIDTH = 20
260
- DEFAULT_TASK_HEIGHT = 10
261
- ARROW_COLOR = Qt::Color.new('black')
262
- ARROW_OPENING = 30
263
- ARROW_SIZE = 10
264
-
265
- PROPAG_SIGNAL = 1
266
- PROPAG_FORWARD = 2
267
- PROPAG_CALLING = 3
268
- PROPAG_EMITTING = 4
269
-
270
- EVENT_CONTINGENT = 0
271
- EVENT_CONTROLABLE = 1
272
- EVENT_CALLED = 2
273
- EVENT_EMITTED = 4
274
- EVENT_CALLED_AND_EMITTED = EVENT_CALLED | EVENT_EMITTED
275
-
276
- TASK_BRUSH_COLORS = {
277
- :pending => Qt::Color.new('#6DF3FF'),
278
- :started => Qt::Color.new('#B0FFA6'),
279
- :success => Qt::Color.new('#E2E2E2'),
280
- :finished => Qt::Color.new('#E2A8A8'),
281
- :finalized => Qt::Color.new('#555555')
282
- }
283
- TASK_PEN_COLORS = {
284
- :pending => Qt::Color.new('#6DF3FF'),
285
- :started => Qt::Color.new('#B0FFA6'),
286
- :success => Qt::Color.new('#E2E2E2'),
287
- :finished => Qt::Color.new('#E2A8A8'),
288
- :finalized => Qt::Color.new('#555555')
289
- }
290
- TASK_NAME_COLOR = 'black'
291
- TASK_FONTSIZE = 10
292
-
293
- PENDING_EVENT_COLOR = 'black' # default color for events
294
- FIRED_EVENT_COLOR = 'red'
295
- EVENT_FONTSIZE = 8
296
-
297
- PLAN_LAYER = 0
298
- TASK_LAYER = PLAN_LAYER + 20
299
- EVENT_LAYER = PLAN_LAYER + 30
300
-
301
- FIND_MARGIN = 10
302
-
303
- class Qt::GraphicsScene
304
- attr_reader :default_arrow_pen
305
- attr_reader :default_arrow_brush
306
- def add_arrow(size, pen = nil, brush = nil)
307
- @default_arrow_pen ||= Qt::Pen.new(ARROW_COLOR)
308
- @default_arrow_brush ||= Qt::Brush.new(ARROW_COLOR)
309
-
310
- @arrow_points ||= (1..4).map { Qt::PointF.new(0, 0) }
311
- @arrow_points[1].x = -size
312
- @arrow_points[1].y = size / 2
313
- @arrow_points[2].x = -size
314
- @arrow_points[2].y = -size / 2
315
- polygon = Qt::PolygonF.new(@arrow_points)
316
- @arrow_line ||= Qt::LineF.new(-1, 0, 0, 0)
317
-
318
- ending = add_polygon polygon, (pen || default_arrow_pen), (brush || default_arrow_brush)
319
- line = add_line @arrow_line
320
-
321
- line.parent_item = ending
322
- ending.singleton_class.class_eval { attr_accessor :line }
323
- ending.line = line
324
- ending
325
- end
326
- end
327
-
328
- def self.intersect_rect(w, h, from, to)
329
- to_x, to_y = *to
330
- from_x, from_y = *from
331
-
332
- # We only use half dimensions since 'to' is supposed to be be the
333
- # center of the rectangle we are intersecting
334
- w /= 2
335
- h /= 2
336
-
337
- dx = (to_x - from_x)
338
- dy = (to_y - from_y)
339
- delta_x = dx / dy * h
340
- if dy != 0 && delta_x.abs < w
341
- if dy > 0
342
- [to_x - delta_x, to_y - h]
343
- else
344
- [to_x + delta_x, to_y + h]
345
- end
346
- elsif dx != 0
347
- delta_y = dy / dx * w
348
- if dx > 0
349
- [to_x - w, to_y - delta_y]
350
- else
351
- [to_x + w, to_y + delta_y]
352
- end
353
- else
354
- [0, 0]
355
- end
356
- end
357
-
358
- def self.correct_line(from, to, rect)
359
- intersect_rect(rect.width, rect.height, from, to)
360
- end
361
-
362
- def self.arrow_set(arrow, start_object, end_object)
363
- start_br = start_object.scene_bounding_rect
364
- end_br = end_object.scene_bounding_rect
365
- start_point = start_br.center
366
- end_point = end_br.center
367
-
368
- #from = intersect_rect(start_br.width, start_br.height, end_point, start_point)
369
- from = [start_point.x, start_point.y]
370
- to = intersect_rect(end_br.width, end_br.height, from, [end_point.x, end_point.y])
371
-
372
- dy = to[1] - from[1]
373
- dx = to[0] - from[0]
374
- alpha = Math.atan2(dy, dx)
375
- length = Math.sqrt(dx ** 2 + dy ** 2)
376
-
377
- #arrow.line.set_line from[0], from[1], to[0], to[1]
378
- arrow.resetMatrix
379
- arrow.line.set_line(-length, 0, 0, 0)
380
- arrow.translate to[0], to[1]
381
- arrow.rotate(alpha * 180 / Math::PI)
382
- end
383
-
384
- module TaskDisplaySupport
385
- # A regex => boolean map of prefixes that should be removed from
386
- # the task names
387
- attribute :removed_prefixes do
388
- { "Roby::" => false,
389
- "Roby::Genom::" => false }
390
- end
391
-
392
- # Compute the prefixes to remove from in filter_prefixes:
393
- # enable only the ones that are flagged, and sort them by
394
- # prefix length
395
- def update_prefixes_removal
396
- @prefixes_removal = removed_prefixes.find_all { |p, b| b }.
397
- map { |p, b| p }.
398
- sort_by { |p| p.length }.
399
- reverse
400
- end
401
-
402
- def filter_prefixes(string)
403
- # @prefixes_removal is computed in RelationsDisplay#update
404
- for prefix in @prefixes_removal
405
- string = string.gsub(prefix, '')
406
- end
407
- string
408
- end
409
-
410
- # If true, show the ownership in the task descriptions
411
- attribute(:show_ownership) { true }
412
- # If true, show the arguments in the task descriptions
413
- attribute(:show_arguments) { false }
414
- end
415
-
416
- class RelationsDisplay < Qt::Object
417
- include DataDisplay
418
- decoder PlanRebuilder
419
-
420
- include TaskDisplaySupport
421
-
422
- def self.all_task_relations
423
- if @all_task_relations
424
- @all_task_relations
425
- else
426
- result = []
427
- ObjectSpace.each_object(Roby::RelationSpace) do |space|
428
- result.concat(space.relations) if space.applied.find { |t| t <= Roby::Task }
429
- end
430
- @all_task_relations = result
431
- end
432
- end
433
-
434
- attr_reader :ui, :scene
435
-
436
- # A [DRbObject, DRbObject] => GraphicsItem mapping of arrows
437
- attr_reader :arrows
438
-
439
- # A DRbObject => GraphicsItem mapping
440
- attr_reader :graphics
441
-
442
- # The set of objects that are to be shown permanently
443
- attr_reader :visible_objects
444
-
445
- # A set of events that are shown during only two calls of #update
446
- attr_reader :flashing_objects
447
-
448
- # The set of signals since the last call to #update
449
- # Each element is [flag, from, to, event_id]
450
- attr_reader :propagated_events
451
-
452
- # The array of events for which a command has been called, or which
453
- # have been emitted. The order in this array is the arrival order
454
- # of the corresponding events.
455
- #
456
- # An array element is [fired, event], when fired is true if the
457
- # event has been fired, and false if it is pending
458
- attr_reader :execution_events
459
-
460
- # The set of postponed events that have occured since the last call
461
- # to #update. Each element is [postponed_generator,
462
- # until_generator]
463
- attr_reader :postponed_events
464
-
465
- # A pool of arrows items used to display the event signalling
466
- attr_reader :signal_arrows
467
-
468
- # True if the finalized tasks should not be displayed
469
- attr_accessor :hide_finalized
470
-
471
- def initialize
472
- @scene = Qt::GraphicsScene.new
473
- super()
474
-
475
- @main = Qt::MainWindow.new
476
- @ui = Ui::RelationsView.new
477
-
478
- @graphics = Hash.new
479
- @visible_objects = ValueSet.new
480
- @flashing_objects = Hash.new
481
- @arrows = Hash.new
482
- @enabled_relations = Set.new
483
- @layout_relations = Set.new
484
- @relation_colors = Hash.new
485
- @relation_pens = Hash.new(Qt::Pen.new(Qt::Color.new(ARROW_COLOR)))
486
- @relation_brushes = Hash.new(Qt::Brush.new(Qt::Color.new(ARROW_COLOR)))
487
- @current_color = 0
488
-
489
- @propagated_events = []
490
- @execution_events = []
491
- @postponed_events = ValueSet.new
492
- @signal_arrows = []
493
- @hide_finalized = true
494
-
495
- ui.setupUi(self)
496
- ui.graphics.scene = scene
497
-
498
- default_colors = {
499
- Roby::TaskStructure::Hierarchy => 'grey',
500
- Roby::TaskStructure::PlannedBy => '#32ba21',
501
- Roby::TaskStructure::ExecutionAgent => '#5d95cf',
502
- Roby::TaskStructure::ErrorHandling => '#ff2727'
503
- }
504
- default_colors.each do |rel, color|
505
- update_relation_color(rel, color)
506
- end
507
-
508
- @shortcuts = []
509
- shortcut = Qt::Shortcut.new(Qt::KeySequence.new('f'), main)
510
- connect(shortcut, SIGNAL('activated()'), self, SLOT('find()'))
511
- @shortcuts << shortcut
512
- main.resize 500, 500
513
- end
514
-
515
- def object_of(item)
516
- return if !(id = item.data(0).to_int).valid?
517
- id = id.to_int
518
-
519
- obj, _ = graphics.find do |obj, obj_item|
520
- obj.object_id == id
521
- end
522
- obj
523
- end
524
-
525
- # Initializes the display with the data already decoded from the
526
- # given data stream, and binds this display to the stream.
527
- def stream=(data_stream)
528
- super
529
-
530
- # Initialize the display ...
531
- decoder.plans.each do |plan|
532
- added_tasks(Time.now, plan, plan.known_tasks)
533
- added_events(Time.now, plan, plan.free_events)
534
- end
535
- display
536
- end
537
-
538
- def [](item); graphics[item] end
539
-
540
- # Returns a canvas object that represents this relation
541
- def task_relation(from, to, rel, info)
542
- arrow(from, to, rel, info, TASK_LAYER)
543
- end
544
- # Returns a canvas object that represents this relation
545
- def event_relation(form, to, rel, info)
546
- arrow(from, to, rel, info, EVENT_LAYER)
547
- end
548
-
549
- # Creates or reuses an arrow object to represent the given relation
550
- def arrow(from, to, rel, info, base_layer)
551
- id = [from, to, rel]
552
- unless item = arrows[id]
553
- item = (arrows[id] ||= scene.add_arrow(ARROW_SIZE))
554
- item.z_value = base_layer - 1
555
- item.pen = item.line.pen = relation_pens[rel]
556
- item.brush = relation_brushes[rel]
557
- end
558
- Log.arrow_set item, self[from], self[to]
559
- end
560
-
561
- # Centers the view on the set of object found which matches
562
- # +regex+. If +regex+ is nil, ask one to the user
563
- def find(regex = nil)
564
- unless regex
565
- regex = Qt::InputDialog.get_text main, 'Find objects in relation view', 'Object name'
566
- return unless regex && !regex.empty?
567
- end
568
- regex = /#{regex.to_str}/i if regex.respond_to?(:to_str)
569
-
570
- # Get the tasks and events matching the string
571
- objects = []
572
- for p in decoder.plans
573
- objects.concat p.known_tasks.
574
- find_all { |object| displayed?(object) && regex === object.display_name(self) }
575
- objects.concat p.free_events.
576
- find_all { |object| displayed?(object) && regex === object.display_name(self) }
577
- end
578
-
579
- return if objects.empty?
580
-
581
- # Find the graphics items
582
- bb = objects.inject(Qt::RectF.new) do |bb, object|
583
- if item = self[object]
584
- item.selected = true
585
- bb | item.scene_bounding_rect | item.map_to_scene(item.children_bounding_rect).bounding_rect
586
- else
587
- bb
588
- end
589
- end
590
- bb.adjust -FIND_MARGIN, -FIND_MARGIN, FIND_MARGIN, FIND_MARGIN
591
- ui.graphics.fit_in_view bb, Qt::KeepAspectRatio
592
- scale = ui.graphics.matrix.m11
593
- if scale > 1
594
- ui.graphics.resetMatrix
595
- ui.graphics.scale 1, 1
596
- end
597
- end
598
- slots 'find()'
599
-
600
- attr_accessor :keep_signals
601
-
602
- COLORS = %w{'black' #800000 #008000 #000080 #C05800 #6633FF #CDBE70 #CD8162 #A2B5CD}
603
- attr_reader :current_color
604
- # returns the next color in COLORS, cycles if at the end of the array
605
- def allocate_color
606
- @current_color = (current_color + 1) % COLORS.size
607
- COLORS[current_color]
608
- end
609
-
610
- # True if this relation should be displayed
611
- def relation_enabled?(relation); @enabled_relations.include?(relation) end
612
- # True if this relation should be used for layout
613
- #
614
- # See also #relation_enabled?, #layout_relation, #ignore_relation
615
- def layout_relation?(relation); relation_enabled?(relation) || @layout_relations.include?(relation) end
616
-
617
- # Display this relation
618
- def enable_relation(relation)
619
- return if relation_enabled?(relation)
620
- @enabled_relations << relation
621
- arrows.each do |(_, _, rel), arrow|
622
- if rel == relation
623
- arrow.visible = true
624
- end
625
- end
626
- end
627
-
628
- # The set of relations that should be displayed
629
- attr_reader :enabled_relations
630
-
631
- # Use this relation for layout but not for display
632
- #
633
- # See also #ignore_relation
634
- def layout_relation(relation)
635
- disable_relation(relation)
636
- @layout_relations << relation
637
- end
638
- # Don't use this relation at all
639
- def ignore_relation(relation)
640
- disable_relation(relation)
641
- @layout_relations.delete(relation)
642
- end
643
-
644
- def disable_relation(relation)
645
- return unless relation_enabled?(relation)
646
- @enabled_relations.delete(relation)
647
- arrows.each do |(_, _, rel), arrow|
648
- if rel == relation
649
- arrow.visible = false
650
- end
651
- end
652
- end
653
-
654
- attr_reader :relation_colors
655
- attr_reader :relation_pens
656
- attr_reader :relation_brushes
657
- def relation_color(relation)
658
- if !relation_colors.has_key?(relation)
659
- update_relation_color(relation, allocate_color)
660
- end
661
- relation_colors[relation]
662
- end
663
- def update_relation_color(relation, color)
664
- relation_colors[relation] = color
665
- color = Qt::Color.new(color)
666
- pen = relation_pens[relation] = Qt::Pen.new(color)
667
- brush = relation_brushes[relation] = Qt::Brush.new(color)
668
- arrows.each do |(_, _, rel), arrow|
669
- if rel == relation
670
- arrow.pen = arrow.line.pen = pen
671
- arrow.brush = brush
672
- end
673
- end
674
- end
675
-
676
- def layout_method=(new_method)
677
- return if new_method == @layout_method
678
-
679
- @layout_method = nil
680
- @layout_options = nil
681
- if new_method
682
- new_method =~ /^(\w+)(?: \[(.*)\])?$/
683
- @layout_method = $1
684
- if $2
685
- @layout_options = $2.split(",").inject(Hash.new) do |h, v|
686
- k, v = v.split("=")
687
- h[k] = v
688
- h
689
- end
690
- end
691
- end
692
- display
693
- end
694
- def layout_options
695
- return @layout_options if @layout_options
696
- { :rankdir => 'TB' }
697
- end
698
- def layout_method
699
- return @layout_method if @layout_method
700
- "dot"
701
- end
702
-
703
- def displayed?(object)
704
- visible_objects.include?(object) ||
705
- flashing_objects.has_key?(object)
706
- end
707
- def set_visibility(object, flag)
708
- return if visible_objects.include?(object) == flag
709
-
710
- if item = graphics[object]
711
- item.visible = flag
712
- end
713
-
714
- if flag
715
- visible_objects << object
716
- else
717
- visible_objects.delete(object)
718
- end
719
- end
720
-
721
- def create_or_get_item(object)
722
- unless item = graphics[object]
723
- item = graphics[object] = object.display_create(self)
724
- if item
725
- item.parent_item = self[object.display_parent] if object.display_parent
726
- yield(item) if block_given?
727
-
728
- if !displayed?(object)
729
- item.visible = false
730
- end
731
- end
732
- end
733
-
734
- item.visible = displayed?(object)
735
- item
736
- end
737
-
738
- # Add +object+ to the list of objects temporarily displayed. If a
739
- # block is given, the object is removed when the block returns
740
- # false. Otherwise, it is removed at the next display update
741
- #
742
- # If this method is called more than once for the same object, the
743
- # object is removed when *all* blocks have returned false at least
744
- # once
745
- def add_flashing_object(object, &block)
746
- if block
747
- flashing_objects[object] ||= []
748
- flashing_objects[object] << block
749
- else
750
- flashing_objects[object] ||= nil
751
- end
752
-
753
- create_or_get_item(object)
754
- end
755
- def clear_flashing_objects
756
- (flashing_objects.keys.to_value_set - visible_objects).each do |object|
757
- if blocks = flashing_objects[object]
758
- blocks.delete_if { |block| !block.call }
759
- next unless blocks.empty?
760
- end
761
-
762
- if item = graphics[object]
763
- item.visible = false
764
- end
765
- flashing_objects.delete(object)
766
- end
767
- end
768
-
769
- def propagation_style(arrow, flag)
770
- unless defined? @@propagation_styles
771
- @@propagation_styles = Hash.new
772
- @@propagation_styles[PROPAG_FORWARD] =
773
- [Qt::Brush.new(Qt::Color.new('black')), (forward_pen = Qt::Pen.new)]
774
- forward_pen.style = Qt::DotLine
775
- @@propagation_styles[PROPAG_SIGNAL] =
776
- [Qt::Brush.new(Qt::Color.new('black')), Qt::Pen.new]
777
- @@propagation_styles[PROPAG_EMITTING] =
778
- [Qt::Brush.new(Qt::Color.new('blue')), (emitting_pen = Qt::Pen.new(Qt::Color.new('blue')))]
779
- emitting_pen.style = Qt::DotLine
780
- @@propagation_styles[PROPAG_CALLING] =
781
- [Qt::Brush.new(Qt::Color.new('blue')), Qt::Pen.new(Qt::Color.new('blue'))]
782
- end
783
- arrow.brush, pen = @@propagation_styles[flag]
784
- arrow.pen = arrow.line.pen = pen
785
- end
786
-
787
- def clear_integrated
788
- unless keep_signals
789
- last_propagated_events, @propagated_events = propagated_events, Array.new
790
- last_execution_events, @execution_events =
791
- execution_events.partition { |fired, ev| fired }
792
- end
793
- !(last_propagated_events.empty? && last_execution_events.empty?)
794
- end
795
-
796
- # Update the display with new data that has come from the data
797
- # stream.
798
- #
799
- # It would be too complex at this stage to know if the plan has been
800
- # updated, so the method always returns true
801
- def update
802
- return unless decoder
803
-
804
- update_prefixes_removal
805
- clear_flashing_objects
806
-
807
- # The sets of tasks and events know to the data stream
808
- all_tasks = decoder.plans.inject(ValueSet.new) do |all_tasks, plan|
809
- all_tasks.merge plan.known_tasks
810
- all_tasks.merge plan.finalized_tasks
811
- end
812
- all_events = decoder.plans.inject(ValueSet.new) do |all_events, plan|
813
- all_events.merge plan.free_events
814
- all_events.merge plan.finalized_events
815
- end
816
-
817
- # Remove the items for objects that don't exist anymore
818
- (graphics.keys.to_value_set - all_tasks - all_events).each do |obj|
819
- visible_objects.delete(obj)
820
- remove_graphics(graphics.delete(obj))
821
- clear_arrows(obj)
822
- end
823
-
824
- visible_objects.merge(decoder.plans)
825
-
826
- decoder.plans.each do |plan|
827
- if hide_finalized
828
- @visible_objects = visible_objects - plan.finalized_tasks
829
- @visible_objects = visible_objects - plan.finalized_events
830
-
831
- all_finalized = plan.finalized_tasks | plan.finalized_events
832
- flashing_objects.delete_if { |obj, _| all_finalized.include?(obj) }
833
- else
834
- visible_objects.merge(plan.finalized_tasks)
835
- visible_objects.merge(plan.finalized_events)
836
- end
837
- end
838
-
839
- # Create graphics items for tasks and events if necessary, and
840
- # update their visibility according to the visible_objects set
841
- [all_tasks, all_events, decoder.plans].each do |object_set|
842
- object_set.each do |object|
843
- if displayed?(object)
844
- create_or_get_item(object)
845
- elsif !object.display_parent
846
- if item = graphics[object]
847
- item.visible = false
848
- end
849
- end
850
- end
851
- end
852
-
853
- EventGeneratorDisplay.priorities.clear
854
- event_priority = 0
855
- execution_events.each_with_index do |(flags, object), event_priority|
856
- EventGeneratorDisplay.priorities[object] = event_priority
857
- next if object.respond_to?(:task) && !displayed?(object.task)
858
-
859
- graphics = if flashing_objects.has_key?(object)
860
- self.graphics[object]
861
- else
862
- add_flashing_object(object)
863
- end
864
-
865
- graphics.brush, graphics.pen = EventGeneratorDisplay.style(object, flags)
866
- end
867
-
868
- propagated_events.each do |_, sources, to, _|
869
- sources.each do |from|
870
- if !EventGeneratorDisplay.priorities.has_key?(from)
871
- EventGeneratorDisplay.priorities[from] = (event_priority += 1)
872
- end
873
- if !EventGeneratorDisplay.priorities.has_key?(to)
874
- EventGeneratorDisplay.priorities[to] = (event_priority += 1)
875
- end
876
-
877
- if from.respond_to?(:task)
878
- next if !displayed?(from.task)
879
- else
880
- next if !all_events.include?(from)
881
- end
882
- if to.respond_to?(:task)
883
- next if !displayed?(to.task)
884
- else
885
- next if !all_events.include?(to)
886
- end
887
-
888
- add_flashing_object from
889
- add_flashing_object to
890
- end
891
- end
892
-
893
-
894
- [all_tasks, all_events, decoder.plans].each do |object_set|
895
- object_set.each do |object|
896
- next unless displayed?(object)
897
- object.display(self, graphics[object])
898
- end
899
- end
900
-
901
- # Update arrow visibility
902
- arrows.each do |(from, to, rel), item|
903
- item.visible = (displayed?(from) && displayed?(to))
904
- end
905
-
906
- # Layout the graph
907
- layouts = decoder.plans.find_all { |p| p.root_plan? }.
908
- map do |p|
909
- dot = Layout.new
910
- dot.layout(self, p)
911
- dot
912
- end
913
- layouts.each { |dot| dot.apply }
914
-
915
- # Display the signals
916
- signal_arrow_idx = -1
917
- propagated_events.each_with_index do |(flag, sources, to), signal_arrow_idx|
918
- sources.each do |from|
919
- unless arrow = signal_arrows[signal_arrow_idx]
920
- arrow = signal_arrows[signal_arrow_idx] = scene.add_arrow(ARROW_SIZE)
921
- arrow.z_value = EVENT_LAYER + 1
922
- arrow.line.z_value = EVENT_LAYER - 1
923
- end
924
-
925
- # It is possible that the objects have been removed in the
926
- # same display cycle than they have been signalled. Do not
927
- # display them if it is the case
928
- unless displayed?(from) && displayed?(to)
929
- arrow.visible = false
930
- next
931
- end
932
- puts from if !self[from]
933
- puts to if !self[to]
934
-
935
- arrow.visible = true
936
- propagation_style(arrow, flag)
937
- Log.arrow_set(arrow, self[from], self[to])
938
- end
939
- end
940
- # ... and hide the remaining arrows that are not used anymore
941
- if signal_arrow_idx + 1 < signal_arrows.size
942
- signal_arrows[(signal_arrow_idx + 1)..-1].each do |arrow|
943
- arrow.visible = false
944
- end
945
- end
946
-
947
- true
948
- end
949
-
950
- def remove_graphics(item, scene = nil)
951
- return unless item
952
- scene ||= item.scene
953
- scene.remove_item(item) if scene
954
- end
955
-
956
- def local_task(obj); decoder.local_task(obj) end
957
- def local_event(obj); decoder.local_event(obj) end
958
- def local_plan(obj); decoder.local_plan(obj) end
959
- def local_object(obj); decoder.local_object(obj) end
960
-
961
- def add_internal_propagation(flag, generator, source_generators)
962
- generator = local_event(generator)
963
- if source_generators && !source_generators.empty?
964
- source_generators = source_generators.map { |source_generator| local_event(source_generator) }
965
- source_generators.delete_if do |ev|
966
- ev == generator ||
967
- propagated_events.find { |_, from, to| to == generator && from.include?(ev) }
968
- end
969
- unless source_generators.empty?
970
- propagated_events << [flag, source_generators, generator]
971
- end
972
- end
973
- end
974
- def generator_calling(*args)
975
- if args.size == 3
976
- time, generator, context = *args
977
- source_generators = []
978
- else
979
- time, generator, source_generators, context = *args
980
- end
981
-
982
- add_internal_propagation(PROPAG_CALLING, generator, source_generators)
983
- end
984
- def generator_emitting(*args)
985
- if args.size == 3
986
- time, generator, context = *args
987
- source_generators = []
988
- else
989
- time, generator, source_generators, context = *args
990
- end
991
-
992
- add_internal_propagation(PROPAG_EMITTING, generator, source_generators)
993
- end
994
- def generator_signalling(time, flag, from, to, event_id, event_time, event_context)
995
- propagated_events << [PROPAG_SIGNAL, [local_event(from)], local_event(to)]
996
- end
997
- def generator_forwarding(time, flag, from, to, event_id, event_time, event_context)
998
- propagated_events << [PROPAG_FORWARD, [local_event(from)], local_event(to)]
999
- end
1000
-
1001
- def generator_called(time, generator, context)
1002
- execution_events << [EVENT_CALLED, local_event(generator)]
1003
- end
1004
- def generator_fired(time, generator, event_id, event_time, event_context)
1005
- generator = local_event(generator)
1006
-
1007
- found_pending = false
1008
- execution_events.delete_if do |flags, ev|
1009
- if flags == EVENT_CALLED && generator == ev
1010
- found_pending = true
1011
- end
1012
- end
1013
- execution_events << [(found_pending ? EVENT_CALLED_AND_EMITTED : EVENT_EMITTED), generator]
1014
- end
1015
- def generator_postponed(time, generator, context, until_generator, reason)
1016
- postponed_events << [local_event(generator), local_event(until_generator)]
1017
- end
1018
-
1019
-
1020
- def removed_task_child(time, parent, rel, child)
1021
- remove_graphics(arrows.delete([local_task(parent), local_task(child), rel]))
1022
- end
1023
- def removed_event_child(time, parent, rel, child)
1024
- remove_graphics(arrows.delete([local_event(parent), local_event(child), rel]))
1025
- end
1026
- def added_tasks(time, plan, tasks)
1027
- tasks.each do |obj|
1028
- obj.flags[:pending] = true if obj.respond_to?(:flags)
1029
- task = local_task(obj)
1030
-
1031
- set_visibility(task, true)
1032
- task.events.each_value do |ev|
1033
- if item = self[ev]
1034
- item.visible = false
1035
- end
1036
- end
1037
- end
1038
- end
1039
- def clear_arrows(object)
1040
- arrows.delete_if do |(from, to, _), arrow|
1041
- if from == object || to == object
1042
- remove_graphics(arrow)
1043
- true
1044
- end
1045
- end
1046
- end
1047
-
1048
- def clear
1049
- arrows.dup.each_value(&method(:remove_graphics))
1050
- graphics.dup.each_value(&method(:remove_graphics))
1051
- arrows.clear
1052
- graphics.clear
1053
-
1054
- signal_arrows.each do |arrow|
1055
- arrow.visible = false
1056
- end
1057
-
1058
- visible_objects.clear
1059
- flashing_objects.clear
1060
- propagated_events.clear
1061
- execution_events.clear
1062
- postponed_events.clear
1063
-
1064
- scene.update(scene.scene_rect)
1065
- end
1066
- end
1067
- end
1068
- end
1069
-
1070
-
1071
- if $0 == __FILE__
1072
- require 'roby/log/file'
1073
- include Roby::Log
1074
- app = Qt::Application.new(ARGV)
1075
- builder = PlanRebuild.new
1076
- rel = RelationsDisplay.new(builder)
1077
- rel.main_widget.show
1078
- Roby::Log.replay(ARGV[0]) do |method_name, method_args|
1079
- builder.send(method_name, *method_args) if builder.respond_to?(method_name)
1080
- rel.send(method_name, *method_args) if rel.respond_to?(method_name)
1081
- end
1082
- app.exec
1083
- end
1084
-