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,474 +1,141 @@
1
- require 'utilrb/column_formatter'
2
-
1
+ require 'roby'
3
2
  module Roby
4
- # An augmented DRbObject which allow to properly interface with remotely
5
- # running plan objects.
6
- class RemoteObjectProxy < DRbObject
7
- attr_accessor :remote_interface
8
-
9
- def to_s
10
- __method_missing__(:to_s)
3
+ # High-level command and control of a Roby controller
4
+ #
5
+ # The {Interface} module provides a high-level control interface to a
6
+ # running Roby controller. It is the basis for all remote Roby UIs such as
7
+ # the Syskit IDE or the Roby shell. The following documentation aims at
8
+ # giving a bird eye's view of the module's structure
9
+ #
10
+ # == Jobs
11
+ #
12
+ # The high-level construct used in the Roby interface is the job. Jobs are
13
+ # representation of the high-level goals that a user gave to the system. A
14
+ # task represents a job if:
15
+ #
16
+ # - it provides the {Interface::Job} service
17
+ # - it has a non-nil {Interface::Job#job_id} argument
18
+ # - itself or its planned task is a mission
19
+ #
20
+ # In case a job task is a planning task, the job itself will be represented
21
+ # by the job's planned task. Across the job-related APIs, one will see that
22
+ # jobs are therefore associated with two tasks: the task or placeholder
23
+ # task, and the job task itself.
24
+ #
25
+ # The interface APIs provide ways to track the progress of jobs. Each job
26
+ # transition is represented by a Interface::JOB_* constant (e.g.
27
+ # {Interface::JOB_READY}), and notifications are sent to remote endpoints
28
+ # about the current state and progress of jobs.
29
+ #
30
+ # == Synchronous Client/Server API
31
+ #
32
+ # A Roby application will in most cases create an {Interface::Interface}
33
+ # object, which is the endpoint for all interface-related matters. A
34
+ # client/server mechanism allows to access the app's interface.
35
+ # {Interface::Server} provides the server-side and {Interface::Client} the
36
+ # client-side. Both classes are independent of the communication channel
37
+ # used. The communication is based on marshalling and demarshalling of an
38
+ # array that represents a method name and arguments on the
39
+ # {Interface::Interface} class. The marshalling/demarshalling and the exact
40
+ # packet format is left to the channel class given to Client and Server at
41
+ # construction time (see below)
42
+ #
43
+ # The core of the method calls on {Interface::Client} are the calls
44
+ # available on {Interface::Interface}. Check the latter to figure out what
45
+ # you can do with the former. In addition, it supports starting actions (and
46
+ # jobs) using an action_name!(arguments) syntax. This is meant as syntactic
47
+ # sugar for use in interactive implementations, but one should use
48
+ # {Interface::Interface#start_job} when starting jobs programmatically.
49
+ #
50
+ # In addition to the remote method calls, the Client API provides
51
+ # notifications pushed by the interface:
52
+ #
53
+ # - {Interface::Client#pop_notification}: general log messages from
54
+ # {Application#notify}. By default, all log messages generated from {Robot}
55
+ # are forwarded this way
56
+ # - {Interface::Client#pop_job_progress}: job progress
57
+ # - {Interface::Client#pop_exception}: about exceptions
58
+ #
59
+ # == Asynchronous API
60
+ #
61
+ # To connect to the client/server API, one has to have a remote Roby app to
62
+ # connect to. Moreoover, the API is really designed as a request/response
63
+ # scheme, which is not a very nice format to build UIs from.
64
+ #
65
+ # For these, reasons, a higher level, event-based API has been built on top
66
+ # of the client/server functionality. The main entrypoint for this
67
+ # asynchronous API is {Interface::Async::Interface}. In addition to properly
68
+ # handling (re)connections, this API provides also a nicer interface to job
69
+ # tracking.
70
+ #
71
+ # Jobs are represented by {Async::JobMonitor} objects, which track the job
72
+ # state and provide operations on them such as killing, dropping and
73
+ # restarting them as well as registering hooks to track their progress. One
74
+ # usually gets these job monitor objects by listening for new jobs using
75
+ # {Async::Interface#on_job}.
76
+ #
77
+ # Note that in most cases, new job monitor objects are inactive (i.e. won't
78
+ # get notifications) until you explicitely call {Async::JobMonitor#start} on
79
+ # them. Whether this is the case or not is documented on each method that
80
+ # return or yield a job monitor object.
81
+ #
82
+ # == Asynchronous log stream API
83
+ #
84
+ # In addition to the notifications provided by {Interface::Client}, one can
85
+ # use the Roby logging to build a complete representation of a plan. The
86
+ # {Interface::Async::Log} class gives easy-to-use access to such a rebuilt
87
+ # plan, along with the ability to disconnect and reconnect to a remote
88
+ # Roby app.
89
+ #
90
+ # == Event Loop Integration
91
+ #
92
+ # {Interface::Interface} hooks itself in the app's main event loop, as does
93
+ # {Interface::TCPServer}. On the client side, processing is done in
94
+ # {Interface::Client#poll} which therefore needs to be called periodically
95
+ # within your app's main loop. In Qt, it usually means starting a timer
96
+ #
97
+ # timer = Qt::Timer.new(self)
98
+ # timer.connect(SIGNAL('timeout()')) do
99
+ # client.poll
100
+ # end
101
+ #
102
+ # == Communication Channel
103
+ #
104
+ # {Interface::DRobyChannel} provides a default implementation, using the
105
+ # DRoby marshalling/demarshalling for object-to-binary translation,
106
+ # WebSockets for framing and a subclass of IO as the underlying
107
+ # communication medium. The most common usage is to spawn a TCP server based
108
+ # on this channel with {Interface::TCPServer}, and connect to it from the
109
+ # client side with {Interface.connect_with_tcp_to}. A Roby application
110
+ # spawns such a server automatically by calling
111
+ # {Roby::Application#setup_shell_interface} if
112
+ # {Roby::Application#public_shell_interface?} is true.
113
+ #
114
+
115
+ module Interface
116
+ DEFAULT_PORT = 20201
117
+ DEFAULT_REST_PORT = 20202
118
+
119
+ extend Logger::Hierarchy
120
+
121
+ module Async
122
+ extend Logger::Hierarchy
11
123
  end
12
- def pretty_print(pp)
13
- pp.text to_s
14
- end
15
-
16
- alias __method_missing__ method_missing
17
- def method_missing(*args, &block)
18
- if remote_interface
19
- remote_interface.call(self, *args, &block)
20
- else
21
- super
22
- end
23
- end
24
- end
25
-
26
- # RemoteInterface objects are used as local representation of remote
27
- # interface objects. They offer a seamless interface to a remotely running
28
- # Roby controller.
29
- class RemoteInterface
30
- # Create a RemoteInterface object for the remote object represented by
31
- # +interface+, where +interface+ is a DRbObject for a remote Interface
32
- # object.
33
- def initialize(interface)
34
- @interface = interface
35
- reconnect
36
- end
37
-
38
- def reconnect
39
- remote_models = @interface.task_models
40
- remote_models.map do |klass|
41
- klass = klass.proxy(nil)
42
-
43
- if klass.respond_to?(:remote_name)
44
- # This is a local proxy for a remote model. Add it in our
45
- # namespace as well.
46
- path = klass.remote_name.split '::'
47
- klass_name = path.pop
48
- mod = Object
49
- while !path.empty?
50
- name = path.shift
51
- mod = begin
52
- mod.const_get(name)
53
- rescue NameError
54
- mod.const_set(name, Module.new)
55
- end
56
- end
57
- mod.const_set(klass_name, klass)
58
- end
59
- end
60
- end
61
-
62
- # Returns a Query object which can be used to interactively query the
63
- # running plan
64
- def find_tasks(model = nil, args = nil)
65
- q = Query.new(self)
66
- if model
67
- q.which_fullfills(model, args)
68
- end
69
- q
70
- end
71
-
72
- # Defined for remotes queries to work
73
- def query_result_set(query) # :nodoc:
74
- @interface.remote_query_result_set(Distributed.format(query)).each do |t|
75
- t.remote_interface = self
76
- end
77
- end
78
- # Defined for remotes queries to work
79
- def query_each(result_set) # :nodoc:
80
- result_set.each do |t|
81
- yield(t)
82
- end
83
- end
84
- # Defined for remotes queries to work
85
- def query_roots(result_set, relation) # :nodoc:
86
- @interface.remote_query_roots(result_set, Distributed.format(relation)).each do |t|
87
- t.remote_interface = self
88
- end
89
- end
90
-
91
- # Returns the DRbObject for the remote controller state object
92
- def state
93
- remote_constant('State')
94
- end
95
-
96
- def instance_methods(include_super = false) # :nodoc:
97
- Interface.instance_methods(false).
98
- actions.map { |name| "#{name}!" }
99
- end
100
-
101
- def actions_summary(with_advanced = false)
102
- methods = @interface.actions
103
- if !with_advanced
104
- methods = methods.delete_if { |m| m.description.advanced? }
105
- end
106
-
107
- if !methods.empty?
108
- puts
109
- desc = methods.map do |p|
110
- doc = p.description.doc || ["(no description set)"]
111
- Hash['Name' => "#{p.name}!", 'Description' => doc.join("\n")]
112
- end
113
-
114
- ColumnFormatter.from_hashes(desc, STDOUT,
115
- :header_delimiter => true,
116
- :column_delimiter => "|",
117
- :order => %w{Name Description})
118
- puts
119
- end
120
-
121
- nil
122
- end
123
-
124
- def actions(with_advanced = false)
125
- @interface.actions.each do |m|
126
- next if m.description.advanced? if !with_advanced
127
- display_action_description(m)
128
- puts
129
- end
130
- nil
131
- end
132
-
133
- # Standard way to display a set of tasks
134
- def task_set_to_s(task_set) # :nodoc:
135
- if task_set.empty?
136
- return "no tasks"
137
- end
138
-
139
- task = task_set.map do |task|
140
- state_name = %w{pending starting running finishing finished}.find do |state_name|
141
- task.send("#{state_name}?")
142
- end
143
-
144
- since = task.start_time
145
- lifetime = task.lifetime
146
- Hash['Task' => task.to_s,
147
- 'State' => state_name,
148
- 'Since' => (since.asctime if since),
149
- 'Lifetime' => (Time.at(lifetime).to_hms if lifetime)
150
- ]
151
- end
152
-
153
- io = StringIO.new
154
- ColumnFormatter.from_hashes(task, STDOUT,
155
- :header_delimiter => true,
156
- :column_delimiter => "|",
157
- :order => %w{Task State Lifetime Since})
158
- end
159
-
160
- # Displays information about the plan's missions
161
- def missions
162
- missions = find_tasks.mission.to_a
163
- task_set_to_s(missions)
164
- nil
165
- end
166
-
167
- # Displays information about the running tasks
168
- def running_tasks
169
- tasks = find_tasks.running.to_a
170
- task_set_to_s(tasks)
171
- nil
172
- end
173
-
174
- # Displays details about the actions matching 'regex'
175
- def describe(name, with_advanced = false)
176
- name = Regexp.new(name)
177
- m = @interface.actions.find_all { |p| name === p.name }
178
-
179
- if !with_advanced
180
- filtered = m.find_all { |m| !m.description.advanced? }
181
- m = filtered if !filtered.empty?
182
- end
183
-
184
- if m.empty?
185
- puts "no such method"
186
- else
187
- m.each do |desc|
188
- puts
189
- display_action_description(desc)
190
- puts
191
- end
192
- end
193
- nil
194
- end
195
-
196
- # Displays a help message
197
- def help
198
- puts
199
- puts "Available Actions"
200
- puts "================="
201
- actions_summary
202
- puts ""
203
-
204
-
205
- puts <<-EOHELP
206
- each action is started with action_name!(:arg1 => value1, :arg2 => value2, ...)
207
- and returns the corresponding task object. A message is displayed in the shell
208
- when the task finishes."
209
-
210
- Shell Commands
211
- ==============
212
- Command | Help
213
- ---------------------------------------------------------------------------------------------
214
- actions_summary(advanced = false) | displays the list of actions with a short documentation |
215
- actions(advanced = false) | displays details for each available actions |
216
- describe(regex) | displays details about the actions matching 'regex' |
217
- missions | displays the set of running missions with their status |
218
- running_tasks | displays the set of running tasks with their status |
219
- | |
220
- help | this help message |
221
-
222
- EOHELP
223
- end
224
-
225
- # Standard display of an action description. +m+ is a PlanningMethod
226
- # object.
227
- def display_action_description(m) # :nodoc:
228
- args = m.description.arguments.
229
- sort_by { |arg_desc| arg_desc.name }
230
-
231
- first = true
232
- args_summary = args.map do |arg_desc|
233
- name = arg_desc.name
234
- is_required = arg_desc.required
235
- format = if is_required then "%s"
236
- else "[%s]"
237
- end
238
- text = format % ["#{", " if !first}:#{name} => #{name}"]
239
- first = false
240
- text
241
- end
242
-
243
- args_table = args.
244
- map do |arg_desc|
245
- Hash['Argument' => arg_desc.name,
246
- 'Description' => (arg_desc.doc || "(no description set)")]
247
- end
248
-
249
- method_doc = m.description.doc || [""]
250
- puts "#{m.name}! #{args_summary.join("")}\n#{method_doc.join("\n")}"
251
- if m.description.arguments.empty?
252
- puts "No arguments"
253
- else
254
- ColumnFormatter.from_hashes(args_table, STDOUT,
255
- :left_padding => " ",
256
- :header_delimiter => true,
257
- :column_delimiter => "|",
258
- :order => %w{Argument Description})
259
- end
260
- end
261
-
262
-
263
- def method_missing(m, *args) # :nodoc:
264
- result = @interface.send(m, *args)
265
- if result.kind_of?(RemoteObjectProxy)
266
- result.remote_interface = @interface
267
- end
268
- result
269
-
270
- rescue Exception => e
271
- raise e, e.message, Roby.filter_backtrace(e.backtrace)
272
- end
273
- end
274
-
275
- # This class is used to interface with the Roby event loop and plan. It is the
276
- # main front object when accessing a Roby core remotely
277
- class Interface
278
- # This module defines the hooks needed to plug Interface objects onto
279
- # ExecutionEngine
280
- module GatherExceptions
281
- # The set of Interface objects that have been registered to us
282
- attribute(:interfaces) { Array.new }
283
-
284
- # Register a new Interface object so that it gets feedback information
285
- # from the running controller.
286
- def register_interface(iface)
287
- Roby.synchronize do
288
- interfaces << iface
289
- end
290
- end
291
-
292
- # Pushes a exception message to all the already registered remote interfaces.
293
- def push_exception_message(name, error, tasks)
294
- Roby.synchronize do
295
- msg = Roby.format_exception(error.exception).join("\n")
296
- msg << "\nThe following tasks have been killed:\n"
297
- tasks.each do |t|
298
- msg << " "
299
- if error.exception.involved_plan_object?(t)
300
- msg << "#{t.class}:0x#{t.address.to_s(16)}\n"
301
- else
302
- PP.pp(t, msg)
303
- end
304
- end
305
-
306
- interfaces.each do |iface|
307
- iface.pending_messages << msg
308
- end
309
- end
310
- end
311
-
312
- # Pushes an exception information on all remote interfaces connected to us
313
- def handled_exception(error, task)
314
- super if defined? super
315
- push_exception_message("exception", error, [task])
316
- end
317
-
318
- # Pushes an exception information on all remote interfaces connected to us
319
- def fatal_exception(error, tasks)
320
- super if defined? super
321
- push_exception_message("fatal exception", error, tasks)
322
- end
323
- end
324
-
325
- # The engine this interface is tied to
326
- attr_reader :engine
327
- # The set of pending messages that are to be displayed on the remote interface
328
- attr_reader :pending_messages
329
- # Creates a local server for a remote interface, acting on +control+
330
- def initialize(engine)
331
- @pending_messages = Queue.new
332
- @engine = engine
333
-
334
- engine.extend GatherExceptions
335
- engine.register_interface self
336
- end
337
-
338
- # Clear the current plan: remove all running and permanent tasks.
339
- def clear
340
- engine.execute do
341
- plan.missions.dup.each { |t| plan.discard(t) }
342
- plan.permanent_tasks.dup.each { |t| plan.auto(t) }
343
- plan.permanent_events.dup.each { |t| plan.auto(t) }
344
- end
345
- end
346
-
347
- # Make the Roby event loop quit
348
- def stop; engine.quit; nil end
349
- # The Roby plan
350
- def plan; engine.plan end
351
-
352
- # Synchronously call +m+ on +tasks+ with the given arguments. This,
353
- # along with the implementation of RemoteInterface#method_missing,
354
- # ensures that no interactive operations are performed outside the
355
- # control thread.
356
- def call(task, m, *args)
357
- engine.execute do
358
- if m.to_s =~ /!$/
359
- event_name = $`
360
- # Check if the called event is terminal. If it is the case,
361
- # discard the task before calling it, and make sure the user
362
- # will get a message
363
- #
364
- if task.event(event_name).terminal?
365
- plan.unmark_mission(task)
366
- task.on(:stop) { |ev| pending_messages << "task #{ev.task} stopped by user request" }
367
- else
368
- task.on(event_name) { |ev| pending_messages << "done emitting #{ev.generator}" }
369
- end
370
- end
371
-
372
- task.send(m, *args)
373
- end
374
- end
375
-
376
- def find_tasks(model = nil, args = nil)
377
- plan.find_tasks(model, args)
378
- end
379
-
380
- # For using Query on Interface objects
381
- def remote_query_result_set(m_query) # :nodoc:
382
- plan.query_result_set(m_query.to_query(plan)).
383
- map { |t| RemoteObjectProxy.new(t) }
384
- end
385
- # For using Query on Interface objects
386
- def remote_query_roots(result_set, m_relation) # :nodoc:
387
- plan.query_roots(result_set, m_relation.proxy(nil)).
388
- map { |t| RemoteObjectProxy.new(t) }
389
- end
390
-
391
- # Returns a DRbObject on the given named constant. Use this to get a
392
- # remote interface to a given object, not taking into account its
393
- # 'marshallability'
394
- def remote_constant(name)
395
- DRbObject.new(name.to_s.constantize)
396
- end
397
-
398
- # Reload the Roby framework code
399
- #
400
- # WARNING: does not work for now
401
- def reload
402
- Roby.app.reload
403
- nil
404
- end
405
-
406
- # Returns the set of task models as DRobyTaskModel objects. The standard
407
- # Roby task models are excluded.
408
- def task_models
409
- task_models = []
410
- engine.execute do
411
- ObjectSpace.each_object(Class) do |obj|
412
- if obj <= Roby::Task && obj.name !~ /^Roby::/
413
- task_models << obj
414
- end
415
- end
416
- end
417
- task_models.map { |t| t.droby_dump(nil) }
418
- end
419
-
420
- # Returns the set of PlanningMethod objects that describe the methods
421
- # exported in the application's planners.
422
- def actions
423
- Roby.app.planners.
424
- map do |p|
425
- p.planning_methods
426
- end.flatten.sort_by { |p| p.name }
427
- end
428
-
429
- # Called every once in a while by RemoteInterface to read and clear the
430
- # set of pending messages.
431
- def poll_messages
432
- result = []
433
- while !pending_messages.empty?
434
- msg = pending_messages.pop
435
- result << msg
436
- end
437
- result
438
- end
439
-
440
- # Tries to find a planner method which matches +name+ with +args+. If it finds
441
- # one, creates a task planned by a planning task and yields both
442
- def method_missing(name, *args)
443
- if name.to_s =~ /!$/
444
- name = $`.to_sym
445
- else
446
- super
447
- end
448
-
449
- if args.size > 1
450
- raise ArgumentError, "wrong number of arguments (#{args.size} for 1) in #{name}!"
451
- end
452
-
453
- options = args.first || {}
454
- task, planner = Robot.prepare_action(name, options)
455
- begin
456
- engine.wait_until(planner.event(:success)) do
457
- plan.add_mission(task)
458
- yield(task, planner) if block_given?
459
- end
460
- rescue Roby::UnreachableEvent
461
- raise RuntimeError, "cannot start #{name}: #{planner.terminal_event.context.first}"
462
- end
463
-
464
- engine.execute do
465
- result = planner.result
466
- result.on(:failed) { |ev| pending_messages << "task #{ev.task} failed" }
467
- result.on(:success) { |ev| pending_messages << "task #{ev.task} finished successfully" }
468
- RemoteObjectProxy.new(result)
469
- end
470
- end
471
124
  end
472
125
  end
473
126
 
474
-
127
+ require 'websocket'
128
+ require 'utilrb/hash'
129
+ require 'roby/interface/job'
130
+ require 'roby/interface/exceptions'
131
+ require 'roby/interface/command_argument'
132
+ require 'roby/interface/command'
133
+ require 'roby/interface/command_library'
134
+ require 'roby/interface/interface'
135
+ require 'roby/interface/droby_channel'
136
+ require 'roby/interface/server'
137
+ require 'roby/interface/client'
138
+ require 'roby/interface/subcommand_client'
139
+ require 'roby/interface/tcp'
140
+ require 'roby/interface/shell_client'
141
+ require 'roby/interface/shell_subcommand'