roby 0.8.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (644) hide show
  1. checksums.yaml +7 -0
  2. data/.deep-cover.rb +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +24 -0
  5. data/.simplecov +10 -0
  6. data/.travis.yml +17 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +15 -0
  9. data/README.md +11 -0
  10. data/Rakefile +47 -177
  11. data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
  12. data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
  13. data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
  14. data/benchmark/{genom.rb → attic/genom.rb} +0 -0
  15. data/benchmark/attic/transactions.rb +62 -0
  16. data/benchmark/plan_basic_operations.rb +28 -0
  17. data/benchmark/relations/graph.rb +63 -0
  18. data/benchmark/ruby/identity.rb +18 -0
  19. data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
  20. data/benchmark/ruby/yield_vs_block.rb +35 -0
  21. data/benchmark/run +5 -0
  22. data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
  23. data/benchmark/transactions.rb +99 -51
  24. data/bin/roby +38 -197
  25. data/bin/roby-display +14 -0
  26. data/bin/roby-log +3 -176
  27. data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
  28. data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
  29. data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
  30. data/doc/guide/{src → attic}/abstraction/index.page +1 -1
  31. data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
  32. data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
  33. data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
  34. data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
  35. data/doc/guide/attic/cycle/error_handling.page +98 -0
  36. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
  37. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
  38. data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
  39. data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
  40. data/doc/guide/{src → attic}/cycle/index.page +1 -1
  41. data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
  42. data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
  43. data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
  44. data/doc/guide/attic/plans/building_plans.page +89 -0
  45. data/doc/guide/attic/plans/code.page +192 -0
  46. data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
  47. data/doc/guide/attic/plans/index.page +7 -0
  48. data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
  49. data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
  50. data/doc/guide/attic/plans/querying_plans.page +5 -0
  51. data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
  52. data/doc/guide/config.yaml +7 -4
  53. data/doc/guide/ext/extended_menu.rb +29 -0
  54. data/doc/guide/ext/init.rb +6 -0
  55. data/doc/guide/ext/rdoc_links.rb +7 -6
  56. data/doc/guide/src/advanced_concepts/history.page +5 -0
  57. data/doc/guide/src/advanced_concepts/index.page +11 -0
  58. data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
  59. data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
  60. data/doc/guide/src/advanced_concepts/transactions.page +5 -0
  61. data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
  62. data/doc/guide/src/base.template +96 -0
  63. data/doc/guide/src/basics_shell_header.txt +5 -7
  64. data/doc/guide/src/building/action_coordination.page +96 -0
  65. data/doc/guide/src/building/actions.page +124 -0
  66. data/doc/guide/src/building/file_layout.page +71 -0
  67. data/doc/guide/src/building/index.page +50 -0
  68. data/doc/guide/src/building/patterns.page +86 -0
  69. data/doc/guide/src/building/patterns_forwarding.png +0 -0
  70. data/doc/guide/src/building/patterns_forwarding.svg +277 -0
  71. data/doc/guide/src/building/runtime.page +95 -0
  72. data/doc/guide/src/building/task_models.page +94 -0
  73. data/doc/guide/src/building/tasks.page +284 -0
  74. data/doc/guide/src/concepts/error_handling.page +100 -0
  75. data/doc/guide/src/concepts/exception_propagation.png +0 -0
  76. data/doc/guide/src/concepts/exception_propagation.svg +445 -0
  77. data/doc/guide/src/concepts/execution.page +85 -0
  78. data/doc/guide/src/concepts/execution.png +0 -0
  79. data/doc/guide/src/concepts/execution.svg +573 -0
  80. data/doc/guide/src/concepts/execution_cycle.png +0 -0
  81. data/doc/guide/src/concepts/garbage_collection.page +57 -0
  82. data/doc/guide/src/concepts/index.page +27 -0
  83. data/doc/guide/src/concepts/plans.page +101 -0
  84. data/doc/guide/src/concepts/policy.page +31 -0
  85. data/doc/guide/src/concepts/reactor.page +61 -0
  86. data/doc/guide/src/concepts/simple_plan_example.png +0 -0
  87. data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
  88. data/doc/guide/src/default.template +9 -74
  89. data/doc/guide/src/event_relations/forward.page +71 -0
  90. data/doc/guide/src/event_relations/index.page +12 -0
  91. data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
  92. data/doc/guide/src/event_relations/signal.page +55 -0
  93. data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
  94. data/doc/guide/src/htmldoc.metainfo +21 -8
  95. data/doc/guide/src/index.page +8 -3
  96. data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
  97. data/doc/guide/src/installation/publications.page +14 -0
  98. data/doc/guide/src/{introduction → installation}/videos.page +14 -7
  99. data/doc/guide/src/interacting/index.page +16 -0
  100. data/doc/guide/src/interacting/run.page +33 -0
  101. data/doc/guide/src/interacting/shell.page +95 -0
  102. data/doc/guide/src/plugins/creating_plugins.page +72 -0
  103. data/doc/guide/src/plugins/index.page +27 -5
  104. data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
  105. data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
  106. data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
  107. data/doc/guide/src/style_screen.css +687 -0
  108. data/doc/guide/src/task_relations/dependency.page +107 -0
  109. data/doc/guide/src/task_relations/executed_by.page +77 -0
  110. data/doc/guide/src/task_relations/index.page +12 -0
  111. data/doc/guide/src/task_relations/new_relations.page +119 -0
  112. data/doc/guide/src/task_relations/planned_by.page +46 -0
  113. data/doc/guide/src/tutorial/app.page +117 -0
  114. data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
  115. data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
  116. data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
  117. data/doc/guide/src/tutorial/events.page +195 -0
  118. data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
  119. data/doc/guide/src/tutorial/index.page +13 -0
  120. data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
  121. data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
  122. data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
  123. data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
  124. data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
  125. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
  126. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
  127. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
  128. data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
  129. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
  130. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
  131. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
  132. data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
  133. data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
  134. data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
  135. data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
  136. data/doc/guide/src/tutorial/relations_display.page +153 -0
  137. data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
  138. data/doc/guide/src/tutorial/shell.page +121 -0
  139. data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
  140. data/doc/guide/src/tutorial/tasks.page +374 -0
  141. data/lib/roby.rb +102 -47
  142. data/lib/roby/actions.rb +17 -0
  143. data/lib/roby/actions/action.rb +80 -0
  144. data/lib/roby/actions/interface.rb +45 -0
  145. data/lib/roby/actions/library.rb +23 -0
  146. data/lib/roby/actions/models/action.rb +224 -0
  147. data/lib/roby/actions/models/coordination_action.rb +58 -0
  148. data/lib/roby/actions/models/interface.rb +22 -0
  149. data/lib/roby/actions/models/interface_base.rb +294 -0
  150. data/lib/roby/actions/models/library.rb +12 -0
  151. data/lib/roby/actions/models/method_action.rb +90 -0
  152. data/lib/roby/actions/task.rb +114 -0
  153. data/lib/roby/and_generator.rb +125 -0
  154. data/lib/roby/app.rb +2795 -829
  155. data/lib/roby/app/autotest_console_reporter.rb +138 -0
  156. data/lib/roby/app/base.rb +21 -0
  157. data/lib/roby/app/cucumber.rb +2 -0
  158. data/lib/roby/app/cucumber/controller.rb +439 -0
  159. data/lib/roby/app/cucumber/helpers.rb +280 -0
  160. data/lib/roby/app/cucumber/world.rb +32 -0
  161. data/lib/roby/app/debug.rb +136 -0
  162. data/lib/roby/app/gen.rb +2 -0
  163. data/lib/roby/app/rake.rb +178 -38
  164. data/lib/roby/app/robot_config.rb +9 -0
  165. data/lib/roby/app/robot_names.rb +115 -0
  166. data/lib/roby/app/run.rb +3 -2
  167. data/lib/roby/app/scripts.rb +72 -0
  168. data/lib/roby/app/scripts/autotest.rb +173 -0
  169. data/lib/roby/app/scripts/display.rb +2 -0
  170. data/lib/roby/app/scripts/restart.rb +52 -0
  171. data/lib/roby/app/scripts/results.rb +17 -8
  172. data/lib/roby/app/scripts/run.rb +155 -24
  173. data/lib/roby/app/scripts/shell.rb +147 -62
  174. data/lib/roby/app/scripts/test.rb +107 -22
  175. data/lib/roby/app/test_reporter.rb +74 -0
  176. data/lib/roby/app/test_server.rb +159 -0
  177. data/lib/roby/app/vagrant.rb +47 -0
  178. data/lib/roby/backports.rb +16 -0
  179. data/lib/roby/cli/display.rb +190 -0
  180. data/lib/roby/cli/exceptions.rb +17 -0
  181. data/lib/roby/cli/gen/actions/class.rb +5 -0
  182. data/lib/roby/cli/gen/actions/test.rb +6 -0
  183. data/lib/roby/cli/gen/app/.yardopts +6 -0
  184. data/lib/roby/cli/gen/app/README.md +28 -0
  185. data/lib/roby/cli/gen/app/Rakefile +15 -0
  186. data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
  187. data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
  188. data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
  189. data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
  190. data/lib/roby/cli/gen/class/class.rb +6 -0
  191. data/lib/roby/cli/gen/class/test.rb +7 -0
  192. data/lib/roby/cli/gen/helpers.rb +203 -0
  193. data/lib/roby/cli/gen/module/module.rb +5 -0
  194. data/lib/roby/cli/gen/module/test.rb +6 -0
  195. data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
  196. data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
  197. data/lib/roby/cli/gen/task/class.rb +44 -0
  198. data/lib/roby/cli/gen/task/test.rb +6 -0
  199. data/lib/roby/cli/gen_main.rb +120 -0
  200. data/lib/roby/cli/log.rb +276 -0
  201. data/lib/roby/cli/log/flamegraph.html +499 -0
  202. data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
  203. data/lib/roby/cli/main.rb +153 -0
  204. data/lib/roby/coordination.rb +60 -0
  205. data/lib/roby/coordination/action_script.rb +25 -0
  206. data/lib/roby/coordination/action_state_machine.rb +125 -0
  207. data/lib/roby/coordination/actions.rb +106 -0
  208. data/lib/roby/coordination/base.rb +145 -0
  209. data/lib/roby/coordination/calculus.rb +40 -0
  210. data/lib/roby/coordination/child.rb +28 -0
  211. data/lib/roby/coordination/event.rb +29 -0
  212. data/lib/roby/coordination/fault_handler.rb +25 -0
  213. data/lib/roby/coordination/fault_handling_task.rb +13 -0
  214. data/lib/roby/coordination/fault_response_table.rb +110 -0
  215. data/lib/roby/coordination/models/action_script.rb +64 -0
  216. data/lib/roby/coordination/models/action_state_machine.rb +224 -0
  217. data/lib/roby/coordination/models/actions.rb +191 -0
  218. data/lib/roby/coordination/models/arguments.rb +55 -0
  219. data/lib/roby/coordination/models/base.rb +176 -0
  220. data/lib/roby/coordination/models/capture.rb +86 -0
  221. data/lib/roby/coordination/models/child.rb +35 -0
  222. data/lib/roby/coordination/models/event.rb +41 -0
  223. data/lib/roby/coordination/models/exceptions.rb +42 -0
  224. data/lib/roby/coordination/models/fault_handler.rb +219 -0
  225. data/lib/roby/coordination/models/fault_response_table.rb +77 -0
  226. data/lib/roby/coordination/models/root.rb +22 -0
  227. data/lib/roby/coordination/models/script.rb +283 -0
  228. data/lib/roby/coordination/models/task.rb +184 -0
  229. data/lib/roby/coordination/models/task_from_action.rb +50 -0
  230. data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
  231. data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
  232. data/lib/roby/coordination/models/task_from_variable.rb +27 -0
  233. data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
  234. data/lib/roby/coordination/models/variable.rb +32 -0
  235. data/lib/roby/coordination/script.rb +200 -0
  236. data/lib/roby/coordination/script_instruction.rb +12 -0
  237. data/lib/roby/coordination/task.rb +45 -0
  238. data/lib/roby/coordination/task_base.rb +69 -0
  239. data/lib/roby/coordination/task_script.rb +293 -0
  240. data/lib/roby/coordination/task_state_machine.rb +308 -0
  241. data/lib/roby/decision_control.rb +33 -21
  242. data/lib/roby/distributed_object.rb +76 -0
  243. data/lib/roby/droby.rb +17 -0
  244. data/lib/roby/droby/droby_id.rb +6 -0
  245. data/lib/roby/droby/enable.rb +153 -0
  246. data/lib/roby/droby/event_logger.rb +189 -0
  247. data/lib/roby/droby/event_logging.rb +57 -0
  248. data/lib/roby/droby/exceptions.rb +14 -0
  249. data/lib/roby/droby/identifiable.rb +22 -0
  250. data/lib/roby/droby/logfile.rb +141 -0
  251. data/lib/roby/droby/logfile/client.rb +176 -0
  252. data/lib/roby/droby/logfile/file_format.md +97 -0
  253. data/lib/roby/droby/logfile/index.rb +117 -0
  254. data/lib/roby/droby/logfile/reader.rb +139 -0
  255. data/lib/roby/droby/logfile/server.rb +199 -0
  256. data/lib/roby/droby/logfile/writer.rb +114 -0
  257. data/lib/roby/droby/marshal.rb +264 -0
  258. data/lib/roby/droby/marshallable.rb +12 -0
  259. data/lib/roby/droby/null_event_logger.rb +25 -0
  260. data/lib/roby/droby/object_manager.rb +205 -0
  261. data/lib/roby/droby/peer_id.rb +6 -0
  262. data/lib/roby/droby/plan_rebuilder.rb +373 -0
  263. data/lib/roby/droby/rebuilt_plan.rb +160 -0
  264. data/lib/roby/droby/remote_droby_id.rb +6 -0
  265. data/lib/roby/droby/timepoints.rb +205 -0
  266. data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
  267. data/lib/roby/droby/timepoints_ctf.rb +125 -0
  268. data/lib/roby/droby/v5.rb +14 -0
  269. data/lib/roby/droby/v5/builtin.rb +120 -0
  270. data/lib/roby/droby/v5/droby_class.rb +45 -0
  271. data/lib/roby/droby/v5/droby_constant.rb +81 -0
  272. data/lib/roby/droby/v5/droby_dump.rb +1026 -0
  273. data/lib/roby/droby/v5/droby_id.rb +44 -0
  274. data/lib/roby/droby/v5/droby_model.rb +82 -0
  275. data/lib/roby/droby/v5/peer_id.rb +10 -0
  276. data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
  277. data/lib/roby/event.rb +79 -957
  278. data/lib/roby/event_constraints.rb +835 -0
  279. data/lib/roby/event_generator.rb +1047 -0
  280. data/lib/roby/event_structure/causal_link.rb +6 -0
  281. data/lib/roby/event_structure/forwarding.rb +6 -0
  282. data/lib/roby/event_structure/precedence.rb +7 -0
  283. data/lib/roby/event_structure/signal.rb +8 -0
  284. data/lib/roby/event_structure/temporal_constraints.rb +640 -0
  285. data/lib/roby/exceptions.rb +446 -152
  286. data/lib/roby/executable_plan.rb +549 -0
  287. data/lib/roby/execution_engine.rb +1997 -950
  288. data/lib/roby/filter_generator.rb +26 -0
  289. data/lib/roby/gui/chronicle_view.rb +225 -0
  290. data/lib/roby/gui/chronicle_widget.rb +925 -0
  291. data/lib/roby/gui/dot_id.rb +11 -0
  292. data/lib/roby/gui/exception_view.rb +44 -0
  293. data/lib/roby/gui/log_display.rb +273 -0
  294. data/lib/roby/gui/model_views.rb +2 -0
  295. data/lib/roby/gui/model_views/action_interface.rb +53 -0
  296. data/lib/roby/gui/model_views/task.rb +47 -0
  297. data/lib/roby/gui/model_views/task.rhtml +41 -0
  298. data/lib/roby/gui/object_info_view.rb +89 -0
  299. data/lib/roby/gui/plan_dot_layout.rb +427 -0
  300. data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
  301. data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
  302. data/lib/roby/gui/relations_view.rb +278 -0
  303. data/lib/roby/gui/relations_view/relations.ui +139 -0
  304. data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
  305. data/lib/roby/gui/relations_view/relations_config.rb +292 -0
  306. data/lib/roby/gui/relations_view/relations_view.ui +53 -0
  307. data/lib/roby/gui/scheduler_view.css +24 -0
  308. data/lib/roby/gui/scheduler_view.rb +46 -0
  309. data/lib/roby/gui/scheduler_view.rhtml +53 -0
  310. data/lib/roby/gui/stepping.rb +93 -0
  311. data/lib/roby/gui/stepping.ui +181 -0
  312. data/lib/roby/gui/styles.rb +81 -0
  313. data/lib/roby/gui/task_display_configuration.rb +42 -0
  314. data/lib/roby/gui/task_state_at.rb +38 -0
  315. data/lib/roby/hooks.rb +26 -0
  316. data/lib/roby/interface.rb +136 -469
  317. data/lib/roby/interface/async.rb +20 -0
  318. data/lib/roby/interface/async/action_monitor.rb +188 -0
  319. data/lib/roby/interface/async/interface.rb +498 -0
  320. data/lib/roby/interface/async/job_monitor.rb +213 -0
  321. data/lib/roby/interface/async/log.rb +238 -0
  322. data/lib/roby/interface/async/new_job_listener.rb +79 -0
  323. data/lib/roby/interface/async/ui_connector.rb +183 -0
  324. data/lib/roby/interface/client.rb +553 -0
  325. data/lib/roby/interface/command.rb +24 -0
  326. data/lib/roby/interface/command_argument.rb +16 -0
  327. data/lib/roby/interface/command_library.rb +92 -0
  328. data/lib/roby/interface/droby_channel.rb +174 -0
  329. data/lib/roby/interface/exceptions.rb +22 -0
  330. data/lib/roby/interface/interface.rb +655 -0
  331. data/lib/roby/interface/job.rb +47 -0
  332. data/lib/roby/interface/rest.rb +10 -0
  333. data/lib/roby/interface/rest/api.rb +29 -0
  334. data/lib/roby/interface/rest/helpers.rb +24 -0
  335. data/lib/roby/interface/rest/server.rb +212 -0
  336. data/lib/roby/interface/server.rb +154 -0
  337. data/lib/roby/interface/shell_client.rb +468 -0
  338. data/lib/roby/interface/shell_subcommand.rb +24 -0
  339. data/lib/roby/interface/subcommand_client.rb +35 -0
  340. data/lib/roby/interface/tcp.rb +168 -0
  341. data/lib/roby/models/arguments.rb +112 -0
  342. data/lib/roby/models/plan_object.rb +83 -0
  343. data/lib/roby/models/task.rb +835 -0
  344. data/lib/roby/models/task_event.rb +62 -0
  345. data/lib/roby/models/task_service.rb +78 -0
  346. data/lib/roby/or_generator.rb +88 -0
  347. data/lib/roby/plan.rb +1751 -864
  348. data/lib/roby/plan_object.rb +611 -0
  349. data/lib/roby/plan_service.rb +200 -0
  350. data/lib/roby/promise.rb +332 -0
  351. data/lib/roby/queries.rb +23 -0
  352. data/lib/roby/queries/and_matcher.rb +32 -0
  353. data/lib/roby/queries/any.rb +27 -0
  354. data/lib/roby/queries/code_error_matcher.rb +58 -0
  355. data/lib/roby/queries/event_generator_matcher.rb +9 -0
  356. data/lib/roby/queries/execution_exception_matcher.rb +165 -0
  357. data/lib/roby/queries/index.rb +165 -0
  358. data/lib/roby/queries/localized_error_matcher.rb +149 -0
  359. data/lib/roby/queries/matcher_base.rb +107 -0
  360. data/lib/roby/queries/none.rb +27 -0
  361. data/lib/roby/queries/not_matcher.rb +30 -0
  362. data/lib/roby/queries/op_matcher.rb +8 -0
  363. data/lib/roby/queries/or_matcher.rb +30 -0
  364. data/lib/roby/queries/plan_object_matcher.rb +363 -0
  365. data/lib/roby/queries/query.rb +188 -0
  366. data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
  367. data/lib/roby/queries/task_matcher.rb +344 -0
  368. data/lib/roby/relations.rb +42 -678
  369. data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
  370. data/lib/roby/relations/directed_relation_support.rb +268 -0
  371. data/lib/roby/relations/event_relation_graph.rb +19 -0
  372. data/lib/roby/relations/fork_merge_visitor.rb +154 -0
  373. data/lib/roby/relations/graph.rb +533 -0
  374. data/lib/roby/relations/models/directed_relation_support.rb +11 -0
  375. data/lib/roby/relations/models/graph.rb +75 -0
  376. data/lib/roby/relations/models/task_relation_graph.rb +18 -0
  377. data/lib/roby/relations/space.rb +380 -0
  378. data/lib/roby/relations/task_relation_graph.rb +20 -0
  379. data/lib/roby/robot.rb +85 -38
  380. data/lib/roby/schedulers/basic.rb +155 -25
  381. data/lib/roby/schedulers/null.rb +20 -0
  382. data/lib/roby/schedulers/reporting.rb +31 -0
  383. data/lib/roby/schedulers/state.rb +129 -0
  384. data/lib/roby/schedulers/temporal.rb +91 -0
  385. data/lib/roby/singletons.rb +87 -0
  386. data/lib/roby/standalone.rb +4 -2
  387. data/lib/roby/standard_errors.rb +405 -82
  388. data/lib/roby/state.rb +6 -3
  389. data/lib/roby/state/conf_model.rb +5 -0
  390. data/lib/roby/state/events.rb +181 -95
  391. data/lib/roby/state/goal_model.rb +77 -0
  392. data/lib/roby/state/open_struct.rb +591 -0
  393. data/lib/roby/state/open_struct_model.rb +68 -0
  394. data/lib/roby/state/pos.rb +45 -45
  395. data/lib/roby/state/shapes.rb +11 -11
  396. data/lib/roby/state/state_model.rb +303 -0
  397. data/lib/roby/state/task.rb +43 -0
  398. data/lib/roby/support.rb +88 -148
  399. data/lib/roby/task.rb +1361 -1750
  400. data/lib/roby/task_arguments.rb +428 -0
  401. data/lib/roby/task_event.rb +127 -0
  402. data/lib/roby/task_event_generator.rb +337 -0
  403. data/lib/roby/task_service.rb +6 -0
  404. data/lib/roby/task_structure/conflicts.rb +104 -0
  405. data/lib/roby/task_structure/dependency.rb +932 -0
  406. data/lib/roby/task_structure/error_handling.rb +118 -0
  407. data/lib/roby/task_structure/executed_by.rb +234 -0
  408. data/lib/roby/task_structure/planned_by.rb +90 -0
  409. data/lib/roby/tasks/aggregator.rb +37 -0
  410. data/lib/roby/tasks/external_process.rb +275 -0
  411. data/lib/roby/tasks/group.rb +27 -0
  412. data/lib/roby/tasks/null.rb +19 -0
  413. data/lib/roby/tasks/parallel.rb +43 -0
  414. data/lib/roby/tasks/sequence.rb +88 -0
  415. data/lib/roby/tasks/simple.rb +21 -0
  416. data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
  417. data/lib/roby/tasks/timeout.rb +17 -0
  418. data/lib/roby/tasks/virtual.rb +55 -0
  419. data/lib/roby/template_plan.rb +7 -0
  420. data/lib/roby/test/aruba_minitest.rb +74 -0
  421. data/lib/roby/test/assertion.rb +16 -0
  422. data/lib/roby/test/assertions.rb +490 -0
  423. data/lib/roby/test/common.rb +368 -591
  424. data/lib/roby/test/dsl.rb +149 -0
  425. data/lib/roby/test/error.rb +18 -0
  426. data/lib/roby/test/event_reporter.rb +83 -0
  427. data/lib/roby/test/execution_expectations.rb +1134 -0
  428. data/lib/roby/test/expect_execution.rb +151 -0
  429. data/lib/roby/test/minitest_helpers.rb +166 -0
  430. data/lib/roby/test/roby_app_helpers.rb +200 -0
  431. data/lib/roby/test/run_planners.rb +155 -0
  432. data/lib/roby/test/self.rb +112 -0
  433. data/lib/roby/test/spec.rb +198 -0
  434. data/lib/roby/test/tasks/empty_task.rb +4 -4
  435. data/lib/roby/test/tasks/goto.rb +28 -27
  436. data/lib/roby/test/teardown_plans.rb +100 -0
  437. data/lib/roby/test/testcase.rb +239 -307
  438. data/lib/roby/test/tools.rb +159 -155
  439. data/lib/roby/test/validate_state_machine.rb +75 -0
  440. data/lib/roby/transaction.rb +1125 -0
  441. data/lib/roby/transaction/event_generator_proxy.rb +63 -0
  442. data/lib/roby/transaction/plan_object_proxy.rb +99 -0
  443. data/lib/roby/transaction/plan_service_proxy.rb +43 -0
  444. data/lib/roby/transaction/proxying.rb +120 -0
  445. data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
  446. data/lib/roby/transaction/task_proxy.rb +135 -0
  447. data/lib/roby/until_generator.rb +30 -0
  448. data/lib/roby/version.rb +5 -0
  449. data/lib/roby/yard.rb +169 -0
  450. data/lib/yard-roby.rb +1 -0
  451. data/manifest.xml +32 -6
  452. data/roby.gemspec +59 -0
  453. metadata +788 -587
  454. data/Manifest.txt +0 -321
  455. data/NOTES +0 -4
  456. data/README.txt +0 -166
  457. data/TODO.txt +0 -146
  458. data/app/README.txt +0 -24
  459. data/app/Rakefile +0 -8
  460. data/app/config/ROBOT.rb +0 -5
  461. data/app/config/init.rb +0 -33
  462. data/app/config/roby.yml +0 -3
  463. data/app/controllers/ROBOT.rb +0 -2
  464. data/app/planners/ROBOT/main.rb +0 -6
  465. data/app/planners/main.rb +0 -5
  466. data/app/scripts/distributed +0 -3
  467. data/app/scripts/generate/bookmarks +0 -3
  468. data/app/scripts/replay +0 -3
  469. data/app/scripts/results +0 -3
  470. data/app/scripts/run +0 -3
  471. data/app/scripts/server +0 -3
  472. data/app/scripts/shell +0 -3
  473. data/app/scripts/test +0 -3
  474. data/app/tasks/.gitattributes +0 -0
  475. data/app/tasks/ROBOT/.gitattributes +0 -0
  476. data/bin/roby-shell +0 -25
  477. data/doc/guide/src/basics/app.page +0 -139
  478. data/doc/guide/src/basics/index.page +0 -11
  479. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  480. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  481. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  482. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  483. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  484. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  485. data/doc/guide/src/basics/relations_display.page +0 -203
  486. data/doc/guide/src/basics/shell.page +0 -102
  487. data/doc/guide/src/default.css +0 -319
  488. data/doc/guide/src/introduction/index.page +0 -29
  489. data/doc/guide/src/introduction/publications.page +0 -14
  490. data/doc/guide/src/relations/dependency.page +0 -89
  491. data/doc/guide/src/relations/index.page +0 -12
  492. data/ext/droby/dump.cc +0 -175
  493. data/ext/droby/extconf.rb +0 -3
  494. data/ext/graph/algorithm.cc +0 -746
  495. data/ext/graph/extconf.rb +0 -7
  496. data/ext/graph/graph.cc +0 -575
  497. data/ext/graph/graph.hh +0 -183
  498. data/ext/graph/iterator_sequence.hh +0 -102
  499. data/ext/graph/undirected_dfs.hh +0 -226
  500. data/ext/graph/undirected_graph.hh +0 -421
  501. data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
  502. data/lib/roby/app/scripts/replay.rb +0 -31
  503. data/lib/roby/app/scripts/server.rb +0 -18
  504. data/lib/roby/basic_object.rb +0 -151
  505. data/lib/roby/config.rb +0 -14
  506. data/lib/roby/distributed.rb +0 -36
  507. data/lib/roby/distributed/base.rb +0 -448
  508. data/lib/roby/distributed/communication.rb +0 -875
  509. data/lib/roby/distributed/connection_space.rb +0 -616
  510. data/lib/roby/distributed/distributed_object.rb +0 -206
  511. data/lib/roby/distributed/drb.rb +0 -62
  512. data/lib/roby/distributed/notifications.rb +0 -531
  513. data/lib/roby/distributed/peer.rb +0 -555
  514. data/lib/roby/distributed/protocol.rb +0 -529
  515. data/lib/roby/distributed/proxy.rb +0 -343
  516. data/lib/roby/distributed/subscription.rb +0 -311
  517. data/lib/roby/distributed/transaction.rb +0 -498
  518. data/lib/roby/external_process_task.rb +0 -225
  519. data/lib/roby/graph.rb +0 -160
  520. data/lib/roby/log.rb +0 -3
  521. data/lib/roby/log/chronicle.rb +0 -303
  522. data/lib/roby/log/console.rb +0 -74
  523. data/lib/roby/log/data_stream.rb +0 -275
  524. data/lib/roby/log/dot.rb +0 -279
  525. data/lib/roby/log/event_stream.rb +0 -161
  526. data/lib/roby/log/file.rb +0 -396
  527. data/lib/roby/log/gui/basic_display.ui +0 -83
  528. data/lib/roby/log/gui/basic_display_ui.rb +0 -89
  529. data/lib/roby/log/gui/chronicle.rb +0 -26
  530. data/lib/roby/log/gui/chronicle_view.rb +0 -40
  531. data/lib/roby/log/gui/chronicle_view.ui +0 -70
  532. data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
  533. data/lib/roby/log/gui/data_displays.rb +0 -171
  534. data/lib/roby/log/gui/data_displays.ui +0 -155
  535. data/lib/roby/log/gui/data_displays_ui.rb +0 -146
  536. data/lib/roby/log/gui/notifications.rb +0 -26
  537. data/lib/roby/log/gui/relations.rb +0 -269
  538. data/lib/roby/log/gui/relations.ui +0 -123
  539. data/lib/roby/log/gui/relations_ui.rb +0 -120
  540. data/lib/roby/log/gui/relations_view.rb +0 -185
  541. data/lib/roby/log/gui/relations_view.ui +0 -149
  542. data/lib/roby/log/gui/relations_view_ui.rb +0 -144
  543. data/lib/roby/log/gui/replay.rb +0 -366
  544. data/lib/roby/log/gui/replay_controls.rb +0 -206
  545. data/lib/roby/log/gui/replay_controls.ui +0 -282
  546. data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
  547. data/lib/roby/log/gui/runtime.rb +0 -130
  548. data/lib/roby/log/hooks.rb +0 -186
  549. data/lib/roby/log/logger.rb +0 -203
  550. data/lib/roby/log/notifications.rb +0 -244
  551. data/lib/roby/log/plan_rebuilder.rb +0 -468
  552. data/lib/roby/log/relations.rb +0 -1084
  553. data/lib/roby/log/server.rb +0 -547
  554. data/lib/roby/log/sqlite.rb +0 -47
  555. data/lib/roby/log/timings.rb +0 -233
  556. data/lib/roby/plan-object.rb +0 -371
  557. data/lib/roby/planning.rb +0 -13
  558. data/lib/roby/planning/loops.rb +0 -309
  559. data/lib/roby/planning/model.rb +0 -1012
  560. data/lib/roby/planning/task.rb +0 -180
  561. data/lib/roby/query.rb +0 -655
  562. data/lib/roby/relations/conflicts.rb +0 -67
  563. data/lib/roby/relations/dependency.rb +0 -358
  564. data/lib/roby/relations/ensured.rb +0 -19
  565. data/lib/roby/relations/error_handling.rb +0 -22
  566. data/lib/roby/relations/events.rb +0 -7
  567. data/lib/roby/relations/executed_by.rb +0 -208
  568. data/lib/roby/relations/influence.rb +0 -10
  569. data/lib/roby/relations/planned_by.rb +0 -63
  570. data/lib/roby/state/information.rb +0 -55
  571. data/lib/roby/state/state.rb +0 -367
  572. data/lib/roby/task-operations.rb +0 -186
  573. data/lib/roby/task_index.rb +0 -80
  574. data/lib/roby/test/distributed.rb +0 -230
  575. data/lib/roby/test/tasks/simple_task.rb +0 -23
  576. data/lib/roby/transactions.rb +0 -507
  577. data/lib/roby/transactions/proxy.rb +0 -325
  578. data/plugins/fault_injection/History.txt +0 -4
  579. data/plugins/fault_injection/README.txt +0 -34
  580. data/plugins/fault_injection/Rakefile +0 -12
  581. data/plugins/fault_injection/TODO.txt +0 -0
  582. data/plugins/fault_injection/app.rb +0 -52
  583. data/plugins/fault_injection/fault_injection.rb +0 -89
  584. data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
  585. data/plugins/subsystems/README.txt +0 -37
  586. data/plugins/subsystems/Rakefile +0 -13
  587. data/plugins/subsystems/app.rb +0 -182
  588. data/plugins/subsystems/test/app/README +0 -24
  589. data/plugins/subsystems/test/app/Rakefile +0 -8
  590. data/plugins/subsystems/test/app/config/app.yml +0 -71
  591. data/plugins/subsystems/test/app/config/init.rb +0 -12
  592. data/plugins/subsystems/test/app/config/roby.yml +0 -3
  593. data/plugins/subsystems/test/app/planners/main.rb +0 -20
  594. data/plugins/subsystems/test/app/scripts/distributed +0 -3
  595. data/plugins/subsystems/test/app/scripts/replay +0 -3
  596. data/plugins/subsystems/test/app/scripts/results +0 -3
  597. data/plugins/subsystems/test/app/scripts/run +0 -3
  598. data/plugins/subsystems/test/app/scripts/server +0 -3
  599. data/plugins/subsystems/test/app/scripts/shell +0 -3
  600. data/plugins/subsystems/test/app/scripts/test +0 -3
  601. data/plugins/subsystems/test/app/tasks/services.rb +0 -15
  602. data/plugins/subsystems/test/test_subsystems.rb +0 -78
  603. data/test/distributed/test_communication.rb +0 -195
  604. data/test/distributed/test_connection.rb +0 -284
  605. data/test/distributed/test_execution.rb +0 -378
  606. data/test/distributed/test_mixed_plan.rb +0 -341
  607. data/test/distributed/test_plan_notifications.rb +0 -238
  608. data/test/distributed/test_protocol.rb +0 -525
  609. data/test/distributed/test_query.rb +0 -106
  610. data/test/distributed/test_remote_plan.rb +0 -491
  611. data/test/distributed/test_transaction.rb +0 -466
  612. data/test/mockups/external_process +0 -28
  613. data/test/mockups/tasks.rb +0 -27
  614. data/test/planning/test_loops.rb +0 -432
  615. data/test/planning/test_model.rb +0 -427
  616. data/test/planning/test_task.rb +0 -126
  617. data/test/relations/test_conflicts.rb +0 -42
  618. data/test/relations/test_dependency.rb +0 -324
  619. data/test/relations/test_ensured.rb +0 -38
  620. data/test/relations/test_executed_by.rb +0 -224
  621. data/test/relations/test_planned_by.rb +0 -56
  622. data/test/suite_core.rb +0 -29
  623. data/test/suite_distributed.rb +0 -10
  624. data/test/suite_planning.rb +0 -4
  625. data/test/suite_relations.rb +0 -8
  626. data/test/tasks/test_external_process.rb +0 -126
  627. data/test/tasks/test_thread_task.rb +0 -70
  628. data/test/test_bgl.rb +0 -528
  629. data/test/test_event.rb +0 -969
  630. data/test/test_exceptions.rb +0 -591
  631. data/test/test_execution_engine.rb +0 -987
  632. data/test/test_gui.rb +0 -20
  633. data/test/test_interface.rb +0 -43
  634. data/test/test_log.rb +0 -125
  635. data/test/test_log_server.rb +0 -133
  636. data/test/test_plan.rb +0 -418
  637. data/test/test_query.rb +0 -424
  638. data/test/test_relations.rb +0 -260
  639. data/test/test_state.rb +0 -432
  640. data/test/test_support.rb +0 -16
  641. data/test/test_task.rb +0 -1181
  642. data/test/test_testcase.rb +0 -138
  643. data/test/test_transactions.rb +0 -610
  644. data/test/test_transactions_proxy.rb +0 -216
@@ -0,0 +1,357 @@
1
+ require 'roby/gui/qt4_toMSecsSinceEpoch'
2
+ require 'roby/droby/plan_rebuilder'
3
+ require 'roby/gui/stepping'
4
+
5
+ module Roby
6
+ module GUI
7
+ # This widget displays information about the event history in a list,
8
+ # allowing to switch between the "important events" in this history
9
+ class PlanRebuilderWidget < Qt::Widget
10
+ # The list used to display all the cycles in the history
11
+ attr_reader :list
12
+ # The history, as a mapping from the cycle index to a (time,
13
+ # snapshot, list_item) triple
14
+ attr_reader :history
15
+ # The PlanRebuilder object we use to process the log data
16
+ attr_reader :plan_rebuilder
17
+ # The current plan managed by the widget
18
+ attr_reader :current_plan
19
+ # The underlying log file
20
+ # @return [DRoby::Logfile::Reader]
21
+ attr_reader :logfile
22
+ # The last processed cycle
23
+ # @return [Integer]
24
+ attr_reader :last_cycle
25
+
26
+ # Signal emitted when an informational message is meant to be
27
+ # displayed
28
+ signals 'info(QString)'
29
+ # Signal emitted when a warning message is meant to be displayed
30
+ signals 'warn(QString)'
31
+ # Signal emitted when the currently displayed cycle changed, i.e.
32
+ # when displays are supposed to be updated
33
+ signals 'appliedSnapshot(QDateTime)'
34
+
35
+ def initialize(parent, plan_rebuilder)
36
+ super(parent)
37
+ @list = Qt::ListWidget.new(self)
38
+ @layout = Qt::VBoxLayout.new(self)
39
+
40
+ def list.mouseReleaseEvent(event)
41
+ if event.button == Qt::RightButton
42
+ event.accept
43
+
44
+ menu = Qt::Menu.new
45
+ inspect_cycle = menu.add_action("Step-by-step from there")
46
+ if action = menu.exec(event.globalPos)
47
+ cycle_index = currentItem.data(Qt::UserRole).toInt
48
+
49
+ rebuilder_widget = self.parentWidget
50
+ stepping = Stepping.new(
51
+ rebuilder_widget,
52
+ rebuilder_widget.current_plan,
53
+ rebuilder_widget.logfile.dup,
54
+ cycle_index)
55
+ stepping.exec
56
+ end
57
+ end
58
+ end
59
+
60
+ @layout.add_widget(@btn_create_display)
61
+ @history = Hash.new
62
+ @logfile = nil # set by #open
63
+ @plan_rebuilder = plan_rebuilder
64
+ @current_plan = DRoby::RebuiltPlan.new
65
+ @layout.add_widget(list)
66
+
67
+ Qt::Object.connect(list, SIGNAL('currentItemChanged(QListWidgetItem*,QListWidgetItem*)'),
68
+ self, SLOT('currentItemChanged(QListWidgetItem*,QListWidgetItem*)'))
69
+ end
70
+
71
+
72
+ # Info about all tasks known within the stored history
73
+ #
74
+ # @return [(Set<Roby::Task>,Hash<Roby::Task,Roby::Task>)] returns
75
+ # the set of all tasks stored in the history, as well as a mapping
76
+ # from job placeholder tasks to the corresponding job task
77
+ def tasks_info
78
+ all_tasks = Set.new
79
+ all_job_info = Hash.new
80
+ history.each_key do |cycle_index|
81
+ tasks, job_info = tasks_info_of_snapshot(cycle_index)
82
+ all_tasks.merge(tasks)
83
+ all_job_info.merge!(job_info)
84
+ end
85
+ return all_tasks, all_job_info
86
+ end
87
+
88
+ # Returns the set of tasks that are present in the given snapshot
89
+ #
90
+ # @return [Set<Roby::Task>]
91
+ def tasks_info_of_snapshot(cycle)
92
+ _, snapshot, * = history[cycle]
93
+ tasks = snapshot.plan.tasks.to_set
94
+ job_info = Hash.new
95
+ tasks.each do |t|
96
+ if t.kind_of?(Roby::Interface::Job)
97
+ planned_by_graph = snapshot.plan.task_relation_graph_for(Roby::TaskStructure::PlannedBy)
98
+ placeholder_task = planned_by_graph.enum_for(:each_out_neighbour, t).first
99
+ if placeholder_task
100
+ job_info[placeholder_task] = t
101
+ end
102
+ end
103
+ end
104
+ return tasks, job_info
105
+ end
106
+
107
+ # Returns the job information for the given task in the given cycle
108
+ def job_placeholder_of(task, cycle)
109
+ if task.kind_of?(Roby::Interface::Job)
110
+ _, snapshot, * = history[cycle]
111
+ task.
112
+ enum_parent_objects(snapshot.relations[Roby::TaskStructure::PlannedBy]).
113
+ first
114
+ end
115
+ end
116
+
117
+ def add_missing_cycles(count)
118
+ item = Qt::ListWidgetItem.new(list)
119
+ item.setBackground(Qt::Brush.new(Qt::Color::fromHsv(33, 111, 255)))
120
+ item.flags = Qt::NoItemFlags
121
+ item.text = "[#{count} cycles missing]"
122
+ end
123
+
124
+ Snapshot = Struct.new :stats, :plan
125
+
126
+ def append_to_history
127
+ snapshot = Snapshot.new plan_rebuilder.stats.dup,
128
+ DRoby::RebuiltPlan.new
129
+ snapshot.plan.merge(plan_rebuilder.plan)
130
+ if @last_snapshot
131
+ snapshot.plan.dedupe(@last_snapshot.plan)
132
+ end
133
+ @last_snapshot = snapshot
134
+
135
+ cycle = snapshot.stats[:cycle_index]
136
+ time = Time.at(*snapshot.stats[:start]) + snapshot.stats[:actual_start]
137
+
138
+ item = Qt::ListWidgetItem.new(list)
139
+ item.text = "@#{cycle} - #{Roby.format_time(time)}"
140
+ item.setData(Qt::UserRole, Qt::Variant.new(cycle))
141
+ history[cycle] = [time, snapshot, item]
142
+ emit addedSnapshot(cycle)
143
+ end
144
+
145
+ signals 'addedSnapshot(int)'
146
+
147
+ slots 'currentItemChanged(QListWidgetItem*,QListWidgetItem*)'
148
+ def currentItemChanged(new_item, previous_item)
149
+ data = new_item.data(Qt::UserRole).toInt
150
+ apply(history[data][1])
151
+ end
152
+
153
+ def apply(snapshot)
154
+ @display_time = Time.at(*snapshot.stats[:start]) + snapshot.stats[:end]
155
+ @current_plan.clear
156
+ @current_plan.merge(snapshot.plan)
157
+ emit appliedSnapshot(Qt::DateTime.new(@display_time))
158
+ end
159
+
160
+ def seek(time)
161
+ # Convert from QDateTime to allow seek() to be a slot
162
+ if time.kind_of?(Qt::DateTime)
163
+ time = Time.at(Float(time.toMSecsSinceEpoch) / 1000)
164
+ end
165
+
166
+ result = nil
167
+ history.each_value do |cycle_time, snapshot, item|
168
+ if cycle_time < time
169
+ if !result || result[0] < cycle_time
170
+ result = [cycle_time, snapshot]
171
+ end
172
+ end
173
+ end
174
+ if result
175
+ apply(result[1])
176
+ end
177
+ end
178
+ slots 'seek(QDateTime)'
179
+
180
+ def push_cycle(snapshot: true)
181
+ cycle = plan_rebuilder.stats[:cycle_index]
182
+ if last_cycle && (cycle != last_cycle + 1)
183
+ add_missing_cycles(cycle - last_cycle - 1)
184
+ end
185
+ needs_snapshot =
186
+ (plan_rebuilder.has_structure_updates? ||
187
+ plan_rebuilder.has_event_propagation_updates?)
188
+ if snapshot && needs_snapshot
189
+ append_to_history
190
+ end
191
+ @last_cycle = cycle
192
+ Time.at(*plan_rebuilder.stats[:start]) + plan_rebuilder.stats[:actual_start]
193
+ end
194
+ signals 'liveUpdate(QDateTime)'
195
+
196
+ def redraw(time = plan_rebuilder.current_time)
197
+ emit appliedSnapshot(Qt::DateTime.new(time))
198
+ end
199
+
200
+ # Opens +filename+ and reads the data from there
201
+ def open(filename)
202
+ @logfile = DRoby::Logfile::Reader.open(filename)
203
+ self.window_title = "roby-display: #{filename}"
204
+ emit sourceChanged
205
+ analyze
206
+ if !history.empty?
207
+ apply(history[history.keys.sort.first][1])
208
+ end
209
+ end
210
+
211
+ signals 'sourceChanged()'
212
+
213
+ def self.analyze(plan_rebuilder, logfile, until_cycle: nil)
214
+ start_time, end_time = logfile.index.range
215
+
216
+ start = Time.now
217
+ puts "log file is #{(end_time - start_time).ceil}s long"
218
+ dialog = Qt::ProgressDialog.new("Analyzing log file", "Quit", 0, (end_time - start_time))
219
+ dialog.setWindowModality(Qt::WindowModal)
220
+ dialog.show
221
+
222
+ while !logfile.eof? && (!until_cycle || !plan_rebuilder.cycle_index || plan_rebuilder.cycle_index < until_cycle)
223
+ data = logfile.load_one_cycle
224
+ plan_rebuilder.process_one_cycle(data)
225
+ if block_given?
226
+ needs_snapshot =
227
+ (plan_rebuilder.has_structure_updates? ||
228
+ plan_rebuilder.has_event_propagation_updates?)
229
+ yield(needs_snapshot, data)
230
+ end
231
+ plan_rebuilder.clear_integrated
232
+ dialog.setValue(plan_rebuilder.cycle_start_time - start_time)
233
+ if dialog.wasCanceled
234
+ Kernel.raise Interrupt
235
+ end
236
+ end
237
+ dialog.dispose
238
+ puts "analyzed log file in %.2fs" % [Time.now - start]
239
+ end
240
+
241
+ def analyze(until_cycle: nil)
242
+ PlanRebuilderWidget.analyze(plan_rebuilder, logfile, until_cycle: until_cycle) do
243
+ push_cycle
244
+ end
245
+ end
246
+
247
+ # Called when the connection to the log server failed, either
248
+ # because it has been closed or because creating the connection
249
+ # failed
250
+ def connection_failed(e, client, options)
251
+ @connection_error = e
252
+ emit warn("connection failed: #{e.message}")
253
+ if @reconnection_timer
254
+ return
255
+ end
256
+
257
+ @reconnection_timer = Qt::Timer.new(self)
258
+ @connect_client = client.dup
259
+ @connect_options = options.dup
260
+ @reconnection_timer.connect(SIGNAL('timeout()')) do
261
+ puts "trying to reconnect to #{@connect_client} #{@connect_options}"
262
+ if connect(@connect_client, @connect_options)
263
+ emit info("Connected")
264
+ @reconnection_timer.stop
265
+ @reconnection_timer.dispose
266
+ @reconnection_timer = nil
267
+ end
268
+ end
269
+ @reconnection_timer.start(1000)
270
+ end
271
+
272
+ DEFAULT_REMOTE_POLL_PERIOD = 0.05
273
+
274
+ # Displays the data incoming from +client+
275
+ #
276
+ # +client+ is assumed to be a {DRoby::Logfile::Client} instance
277
+ #
278
+ # +update_period+ is, in seconds, the period at which the
279
+ # display will check whether there is new data on the port.
280
+ def connect(client, options = Hash.new)
281
+ options = Kernel.validate_options options,
282
+ port: DRoby::Logfile::Server::DEFAULT_PORT,
283
+ update_period: DEFAULT_REMOTE_POLL_PERIOD
284
+
285
+ if client.respond_to?(:to_str)
286
+ self.window_title = "roby-display: #{client}"
287
+ emit sourceChanged
288
+
289
+ begin
290
+ hostname = client
291
+ client = DRoby::Logfile::Client.new(client, options[:port])
292
+ rescue Exception => e
293
+ connection_failed(e, client, options)
294
+ return false
295
+ end
296
+ end
297
+
298
+
299
+ @client = client
300
+ client.add_listener do |data|
301
+ plan_rebuilder.clear_integrated
302
+ plan_rebuilder.process_one_cycle(data)
303
+ time = push_cycle
304
+ emit liveUpdate(Qt::DateTime.new(time))
305
+
306
+ cycle = plan_rebuilder.cycle_index
307
+ time = plan_rebuilder.cycle_start_time
308
+ emit info("@#{cycle} - #{time.strftime('%H:%M:%S.%3N')}")
309
+ end
310
+ @connection_pull = timer = Qt::Timer.new(self)
311
+ timer.connect(SIGNAL('timeout()')) do
312
+ begin
313
+ client.read_and_process_pending(max: 0.1)
314
+ rescue Exception => e
315
+ disconnect
316
+ emit warn("Disconnected: #{e.message}")
317
+ puts e.message
318
+ puts " " + e.backtrace.join("\n ")
319
+ if hostname
320
+ connect(hostname, options)
321
+ end
322
+ end
323
+ end
324
+ timer.start(Integer(options[:update_period] * 1000))
325
+ return true
326
+ end
327
+
328
+ def disconnect
329
+ @client.disconnect
330
+ @connection_pull.stop
331
+ @connection_pull.dispose
332
+ @connection_pull = nil
333
+ end
334
+
335
+ def cycle_start_time
336
+ plan_rebuilder.cycle_start_time
337
+ end
338
+
339
+ # The start time of the first received cycle
340
+ def start_time
341
+ plan_rebuilder.start_time
342
+ end
343
+
344
+ # The end time of the last received cycle
345
+ def current_time
346
+ plan_rebuilder.current_time
347
+ end
348
+
349
+ # The time of the currently selected snapshot
350
+ def display_time
351
+ @display_time || start_time
352
+ end
353
+ end
354
+ end
355
+ end
356
+
357
+
@@ -0,0 +1,8 @@
1
+ if !Qt::DateTime.method_defined?('toMSecsSinceEpoch')
2
+ class Qt::DateTime
3
+ def toMSecsSinceEpoch
4
+ toTime_t * 1000 + time.msec
5
+ end
6
+ end
7
+ end
8
+
@@ -0,0 +1,278 @@
1
+ require 'roby/gui/relations_view/relations_config'
2
+ require 'roby/gui/relations_view/relations_view_ui'
3
+ require 'roby/gui/relations_view/relations_canvas'
4
+
5
+ require 'roby/gui/plan_rebuilder_widget'
6
+ require 'roby/gui/object_info_view'
7
+ require 'roby/gui/scheduler_view'
8
+
9
+ module Roby
10
+ module GUI
11
+ # Plan display that shows a snapshot of the event/task structure, as
12
+ # well as the events emitted within the last cycle
13
+ class RelationsView < Qt::Widget
14
+ attr_reader :ui
15
+ attr_reader :view
16
+ attr_reader :scheduler_view
17
+ attr_reader :history_widget
18
+
19
+ # In remote connections, this is he period between checking if
20
+ # there is data on the socket, in seconds
21
+ #
22
+ # See #connect
23
+ def initialize(history_widget, parent = nil)
24
+ super(parent)
25
+ @ui = Ui::RelationsView.new
26
+ ui.setupUi(self)
27
+ @scheduler_view = SchedulerView.new(ui.scheduler_view_holder)
28
+ @scheduler_view_layout = Qt::VBoxLayout.new(ui.scheduler_view_holder)
29
+ @scheduler_view_layout.add_widget scheduler_view
30
+ scheduler_view.show
31
+
32
+ @history_widget = history_widget
33
+ @view = RelationsCanvas.new([history_widget.current_plan])
34
+ ui.setupActions(self)
35
+ ui.graphics.scene = view.scene
36
+
37
+ resize 500, 500
38
+ end
39
+
40
+ # Slot used to make the widget update its title when e.g. the
41
+ # underlying history widget changed its source
42
+ def updateWindowTitle
43
+ if parent_title = history_widget.window_title
44
+ self.window_title = history_widget.window_title + ": Relations"
45
+ else
46
+ self.window_title = "roby-display: Relations"
47
+ end
48
+ end
49
+ slots 'updateWindowTitle()'
50
+
51
+ def setDisplayTime(time)
52
+ scheduler_view.display(history_widget.current_plan.consolidated_scheduler_state)
53
+ view.update(time)
54
+ end
55
+ slots 'setDisplayTime(QDateTime)'
56
+
57
+ def update_time_range(start_time, current_time)
58
+ end
59
+ def update_display_time(time)
60
+ scheduler_view.display(history_widget.current_plan.consolidated_scheduler_state)
61
+ view.update(time)
62
+ end
63
+
64
+ def save_options
65
+ view.save_options
66
+ end
67
+
68
+ def apply_options(options)
69
+ view.apply_options(options)
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+
76
+ class Ui::RelationsView
77
+ def scene; graphics.scene end
78
+
79
+ # The underlying RelationsCanvas object
80
+ attr_reader :display
81
+ attr_reader :prefixActions
82
+ attr_reader :verticalLayout
83
+ attr_reader :graphics
84
+
85
+ # Module used to extend the relation view GraphicsView object, to add
86
+ # double-click and context-menu events
87
+ module GraphicsViewBehaviour
88
+ attr_accessor :display
89
+
90
+ def mouseDoubleClickEvent(event)
91
+ item = itemAt(event.pos)
92
+ if item
93
+ obj = display.object_of(item) ||
94
+ display.relation_of(item)
95
+
96
+ if !obj
97
+ return super(event)
98
+ end
99
+ end
100
+
101
+ @object_info ||= Roby::GUI::ObjectInfoView.new
102
+ if @object_info.display(obj)
103
+ @object_info.activate
104
+ end
105
+ end
106
+
107
+ def contextMenuEvent(event)
108
+ item = itemAt(event.pos)
109
+ if item
110
+ unless obj = display.object_of(item)
111
+ return super(event)
112
+ end
113
+ end
114
+
115
+ return unless obj.kind_of?(Roby::Task)
116
+
117
+ menu = Qt::Menu.new
118
+ hide_this = menu.add_action("Hide")
119
+ hide_children = menu.add_action("Hide children")
120
+ show_children = menu.add_action("Show children")
121
+ return unless action = menu.exec(event.globalPos)
122
+
123
+ case action.text
124
+ when "Hide"
125
+ display.selected_objects.delete(obj)
126
+ when "Hide children"
127
+ obj.plan.compute_useful_tasks([obj]).each do |child|
128
+ if child != obj
129
+ display.selected_objects.delete(child)
130
+ end
131
+ end
132
+ when "Show children"
133
+ obj.plan.compute_useful_tasks([obj]).each do |child|
134
+ if child != obj
135
+ display.selected_objects << child
136
+ end
137
+ end
138
+ end
139
+
140
+ display.update
141
+ end
142
+ end
143
+
144
+ ZOOM_STEP = 0.25
145
+ def setupActions(view)
146
+ @display = display = view.view
147
+
148
+ @actionShowAll = Qt::Action.new(view)
149
+ @actionShowAll.objectName = "actionShowAll"
150
+ @actionShowAll.text = "Show All"
151
+ @actionRedraw = Qt::Action.new(view)
152
+ @actionRedraw.objectName = "actionRedraw"
153
+ @actionRedraw.text = "Redraw"
154
+ @actionZoom = Qt::Action.new(view)
155
+ @actionZoom.objectName = "actionZoom"
156
+ @actionZoom.text = "Zoom +"
157
+ @actionUnzoom = Qt::Action.new(view)
158
+ @actionUnzoom.objectName = "actionUnzoom"
159
+ @actionUnzoom.text = "Zoom -"
160
+ @actionFit = Qt::Action.new(view)
161
+ @actionFit.objectName = "actionFit"
162
+ @actionFit.text = "Fit View"
163
+ @actionOwnership = Qt::Action.new(view)
164
+ @actionOwnership.objectName = "actionOwnership"
165
+ @actionOwnership.text = "Display Ownership"
166
+ @actionOwnership.checkable = true
167
+ @actionOwnership.checked = true
168
+ @actionSVGExport = Qt::Action.new(view)
169
+ @actionSVGExport.objectName = "actionSVGExport"
170
+ @actionSVGExport.text = "SVG Export"
171
+ @actionPrint = Qt::Action.new(view)
172
+ @actionPrint.objectName = "actionPrint"
173
+ @actionPrint.text = "Print"
174
+ @actionKeepSignals = Qt::Action.new(view)
175
+ @actionKeepSignals.objectName = "actionKeepSignals"
176
+ @actionKeepSignals.text = "Keep Signals"
177
+ @actionKeepSignals.checkable = true
178
+ @actionKeepSignals.checked = false
179
+ @actionBookmarksAdd = Qt::Action.new(view)
180
+ @actionBookmarksAdd.objectName = "actionBookmarksAdd"
181
+ @actionBookmarksAdd.text = "Add Bookmark"
182
+ @actionHideFinalized = Qt::Action.new(view)
183
+ @actionHideFinalized.objectName = "actionHideFinalized"
184
+ @actionHideFinalized.text = "Hide Finalized"
185
+ @actionHideFinalized.checkable = true
186
+ @actionHideFinalized.checked = true
187
+ @actionConfigure = Qt::Action.new(view)
188
+ @actionConfigure.objectName = "actionConfigure"
189
+ @actionConfigure.text = "Configure"
190
+
191
+ @menubar = Qt::MenuBar.new(view)
192
+ @menubar.objectName = "menubar"
193
+ @menubar.geometry = Qt::Rect.new(0, 0, 800, 21)
194
+ @menuView = Qt::Menu.new("View", @menubar)
195
+ @menuView.objectName = "menuView"
196
+
197
+ @menubar.addAction(@menuView.menuAction())
198
+ @menuView.addAction(@actionKeepSignals)
199
+ @menuView.addAction(@actionShowAll)
200
+ @menuView.addSeparator()
201
+ @menuView.addAction(@actionZoom)
202
+ @menuView.addAction(@actionUnzoom)
203
+ @menuView.addAction(@actionFit)
204
+ @menuView.addSeparator()
205
+ @menuView.addAction(@actionSVGExport)
206
+ @menuView.addAction(@actionPrint)
207
+ @menuView.addAction(@actionConfigure)
208
+
209
+ @verticalLayout.setMenuBar(@menubar)
210
+
211
+ @actionConfigure.connect(SIGNAL(:triggered)) do
212
+ if !@configuration_widget
213
+ @configuration_widget = Qt::Widget.new
214
+ @configuration_widget_ui = Ui::RelationsConfig.new(@configuration_widget, display)
215
+ end
216
+ @configuration_widget.show
217
+ end
218
+
219
+ #############################################################
220
+ # Handle the other toolbar's buttons
221
+ graphics.extend GraphicsViewBehaviour
222
+ graphics.display = display
223
+
224
+ @actionShowAll.connect(SIGNAL(:triggered)) do
225
+ display.graphics.keys.each do |obj|
226
+ display.set_visibility(obj, true) if obj.kind_of?(Roby::Task::DRoby) || (obj.kind_of?(Roby::EventGenerator::DRoby) && !obj.respond_to?(:task))
227
+ end
228
+ display.update
229
+ end
230
+
231
+ @actionZoom.connect(SIGNAL(:triggered)) do
232
+ scale = graphics.matrix.m11
233
+ if scale + ZOOM_STEP > 1
234
+ scale = 1 - ZOOM_STEP
235
+ end
236
+ graphics.resetMatrix
237
+ graphics.scale scale + ZOOM_STEP, scale + ZOOM_STEP
238
+ end
239
+ @actionUnzoom.connect(SIGNAL(:triggered)) do
240
+ scale = graphics.matrix.m11
241
+ graphics.resetMatrix
242
+ graphics.scale scale - ZOOM_STEP, scale - ZOOM_STEP
243
+ end
244
+ @actionFit.connect(SIGNAL(:triggered)) do
245
+ graphics.fitInView(graphics.scene.items_bounding_rect, Qt::KeepAspectRatio)
246
+ end
247
+
248
+ @actionKeepSignals.connect(SIGNAL(:triggered)) do
249
+ display.keep_signals = @actionKeepSignals.checked?
250
+ end
251
+
252
+ @actionPrint.connect(SIGNAL(:triggered)) do
253
+ return unless scene
254
+ printer = Qt::Printer.new;
255
+ if Qt::PrintDialog.new(printer).exec() == Qt::Dialog::Accepted
256
+ painter = Qt::Painter.new(printer);
257
+ painter.setRenderHint(Qt::Painter::Antialiasing);
258
+ scene.render(painter);
259
+ end
260
+ end
261
+
262
+ @actionSVGExport.connect(SIGNAL(:triggered)) do
263
+ return unless scene
264
+
265
+ if path = Qt::FileDialog.get_save_file_name(nil, "SVG Export")
266
+ svg = Qt::SvgGenerator.new
267
+ svg.file_name = path
268
+ svg.size = Qt::Size.new(Integer(scene.width * 0.8), Integer(scene.height * 0.8))
269
+ painter = Qt::Painter.new
270
+ painter.begin(svg)
271
+ scene.render(painter)
272
+ painter.end
273
+ end
274
+ end
275
+ @actionSVGExport.enabled = defined?(Qt::SvgGenerator)
276
+ end
277
+ end
278
+