roby 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (236) hide show
  1. data/History.txt +7 -5
  2. data/Manifest.txt +91 -16
  3. data/README.txt +24 -24
  4. data/Rakefile +92 -64
  5. data/app/config/app.yml +42 -43
  6. data/app/config/init.rb +26 -0
  7. data/benchmark/alloc_misc.rb +123 -0
  8. data/benchmark/discovery_latency.rb +67 -0
  9. data/benchmark/garbage_collection.rb +48 -0
  10. data/benchmark/genom.rb +31 -0
  11. data/benchmark/transactions.rb +62 -0
  12. data/bin/roby +1 -1
  13. data/bin/roby-log +16 -6
  14. data/doc/guide/.gitignore +2 -0
  15. data/doc/guide/config.yaml +34 -0
  16. data/doc/guide/ext/init.rb +14 -0
  17. data/doc/guide/ext/previous_next.rb +40 -0
  18. data/doc/guide/ext/rdoc_links.rb +33 -0
  19. data/doc/guide/index.rdoc +16 -0
  20. data/doc/guide/overview.rdoc +62 -0
  21. data/doc/guide/plan_modifications.rdoc +67 -0
  22. data/doc/guide/src/abstraction/achieve_with.page +8 -0
  23. data/doc/guide/src/abstraction/forwarding.page +8 -0
  24. data/doc/guide/src/abstraction/hierarchy.page +19 -0
  25. data/doc/guide/src/abstraction/index.page +28 -0
  26. data/doc/guide/src/abstraction/task_models.page +13 -0
  27. data/doc/guide/src/basics.template +6 -0
  28. data/doc/guide/src/basics/app.page +139 -0
  29. data/doc/guide/src/basics/code_examples.page +33 -0
  30. data/doc/guide/src/basics/dry.page +69 -0
  31. data/doc/guide/src/basics/errors.page +443 -0
  32. data/doc/guide/src/basics/events.page +179 -0
  33. data/doc/guide/src/basics/hierarchy.page +275 -0
  34. data/doc/guide/src/basics/index.page +11 -0
  35. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  36. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  37. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  38. data/doc/guide/src/basics/log_replay/goForward_4.png +0 -0
  39. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  40. data/doc/guide/src/basics/log_replay/hierarchy_error_1.png +0 -0
  41. data/doc/guide/src/basics/log_replay/hierarchy_error_2.png +0 -0
  42. data/doc/guide/src/basics/log_replay/hierarchy_error_3.png +0 -0
  43. data/doc/guide/src/basics/log_replay/plan_repair_1.png +0 -0
  44. data/doc/guide/src/basics/log_replay/plan_repair_2.png +0 -0
  45. data/doc/guide/src/basics/log_replay/plan_repair_3.png +0 -0
  46. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  47. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  48. data/doc/guide/src/basics/log_replay/roby_log_relation_window.png +0 -0
  49. data/doc/guide/src/basics/log_replay/roby_replay_event_representation.png +0 -0
  50. data/doc/guide/src/basics/plan_objects.page +71 -0
  51. data/doc/guide/src/basics/relations_display.page +203 -0
  52. data/doc/guide/src/basics/roby_cycle_overview.png +0 -0
  53. data/doc/guide/src/basics/shell.page +102 -0
  54. data/doc/guide/src/basics/summary.page +32 -0
  55. data/doc/guide/src/basics/tasks.page +357 -0
  56. data/doc/guide/src/basics_shell_header.txt +16 -0
  57. data/doc/guide/src/cycle/cycle-overview.png +0 -0
  58. data/doc/guide/src/cycle/cycle-overview.svg +208 -0
  59. data/doc/guide/src/cycle/error_handling.page +168 -0
  60. data/doc/guide/src/cycle/error_instantaneous_repair.png +0 -0
  61. data/doc/guide/src/cycle/error_instantaneous_repair.svg +1224 -0
  62. data/doc/guide/src/cycle/garbage_collection.page +10 -0
  63. data/doc/guide/src/cycle/index.page +23 -0
  64. data/doc/guide/src/cycle/propagation.page +154 -0
  65. data/doc/guide/src/cycle/propagation_diamond.png +0 -0
  66. data/doc/guide/src/cycle/propagation_diamond.svg +1279 -0
  67. data/doc/guide/src/default.css +319 -0
  68. data/doc/guide/src/default.template +74 -0
  69. data/doc/guide/src/htmldoc.metainfo +20 -0
  70. data/doc/guide/src/htmldoc.virtual +18 -0
  71. data/doc/guide/src/images/bodybg.png +0 -0
  72. data/doc/guide/src/images/contbg.png +0 -0
  73. data/doc/guide/src/images/footerbg.png +0 -0
  74. data/doc/guide/src/images/gradient1.png +0 -0
  75. data/doc/guide/src/images/gradient2.png +0 -0
  76. data/doc/guide/src/index.page +7 -0
  77. data/doc/guide/src/introduction/index.page +29 -0
  78. data/doc/guide/src/introduction/install.page +133 -0
  79. data/doc/{papers.rdoc → guide/src/introduction/publications.page} +5 -2
  80. data/doc/{videos.rdoc → guide/src/introduction/videos.page} +4 -2
  81. data/doc/guide/src/plugins/fault_tolerance.page +44 -0
  82. data/doc/guide/src/plugins/index.page +11 -0
  83. data/doc/guide/src/plugins/subsystems.page +45 -0
  84. data/doc/guide/src/relations/dependency.page +89 -0
  85. data/doc/guide/src/relations/index.page +12 -0
  86. data/doc/misc/update_github +24 -0
  87. data/doc/tutorials/02-GoForward.rdoc +3 -3
  88. data/ext/graph/graph.cc +46 -0
  89. data/lib/roby.rb +57 -22
  90. data/lib/roby/app.rb +132 -112
  91. data/lib/roby/app/plugins/rake.rb +21 -0
  92. data/lib/roby/app/rake.rb +0 -7
  93. data/lib/roby/app/run.rb +1 -1
  94. data/lib/roby/app/scripts/distributed.rb +1 -2
  95. data/lib/roby/app/scripts/generate/bookmarks.rb +1 -1
  96. data/lib/roby/app/scripts/results.rb +2 -1
  97. data/lib/roby/app/scripts/run.rb +6 -2
  98. data/lib/roby/app/scripts/shell.rb +11 -11
  99. data/lib/roby/config.rb +1 -1
  100. data/lib/roby/decision_control.rb +62 -3
  101. data/lib/roby/distributed.rb +4 -0
  102. data/lib/roby/distributed/base.rb +8 -0
  103. data/lib/roby/distributed/communication.rb +12 -8
  104. data/lib/roby/distributed/connection_space.rb +61 -44
  105. data/lib/roby/distributed/distributed_object.rb +1 -1
  106. data/lib/roby/distributed/notifications.rb +22 -30
  107. data/lib/roby/distributed/peer.rb +13 -8
  108. data/lib/roby/distributed/proxy.rb +5 -5
  109. data/lib/roby/distributed/subscription.rb +4 -4
  110. data/lib/roby/distributed/transaction.rb +3 -3
  111. data/lib/roby/event.rb +176 -110
  112. data/lib/roby/exceptions.rb +12 -4
  113. data/lib/roby/execution_engine.rb +1604 -0
  114. data/lib/roby/external_process_task.rb +225 -0
  115. data/lib/roby/graph.rb +0 -6
  116. data/lib/roby/interface.rb +221 -137
  117. data/lib/roby/log/console.rb +5 -3
  118. data/lib/roby/log/data_stream.rb +94 -16
  119. data/lib/roby/log/dot.rb +8 -8
  120. data/lib/roby/log/event_stream.rb +13 -3
  121. data/lib/roby/log/file.rb +43 -18
  122. data/lib/roby/log/gui/basic_display_ui.rb +89 -0
  123. data/lib/roby/log/gui/chronicle_view_ui.rb +90 -0
  124. data/lib/roby/log/gui/data_displays.rb +4 -5
  125. data/lib/roby/log/gui/data_displays_ui.rb +146 -0
  126. data/lib/roby/log/gui/relations.rb +18 -18
  127. data/lib/roby/log/gui/relations_ui.rb +120 -0
  128. data/lib/roby/log/gui/relations_view_ui.rb +144 -0
  129. data/lib/roby/log/gui/replay.rb +41 -13
  130. data/lib/roby/log/gui/replay_controls.rb +3 -0
  131. data/lib/roby/log/gui/replay_controls.ui +133 -110
  132. data/lib/roby/log/gui/replay_controls_ui.rb +249 -0
  133. data/lib/roby/log/hooks.rb +19 -18
  134. data/lib/roby/log/logger.rb +7 -6
  135. data/lib/roby/log/notifications.rb +4 -4
  136. data/lib/roby/log/plan_rebuilder.rb +20 -22
  137. data/lib/roby/log/relations.rb +44 -16
  138. data/lib/roby/log/server.rb +1 -4
  139. data/lib/roby/log/timings.rb +88 -19
  140. data/lib/roby/plan-object.rb +135 -11
  141. data/lib/roby/plan.rb +408 -224
  142. data/lib/roby/planning/loops.rb +32 -25
  143. data/lib/roby/planning/model.rb +157 -51
  144. data/lib/roby/planning/task.rb +47 -20
  145. data/lib/roby/query.rb +128 -92
  146. data/lib/roby/relations.rb +254 -136
  147. data/lib/roby/relations/conflicts.rb +6 -9
  148. data/lib/roby/relations/dependency.rb +358 -0
  149. data/lib/roby/relations/ensured.rb +0 -1
  150. data/lib/roby/relations/error_handling.rb +0 -1
  151. data/lib/roby/relations/events.rb +0 -2
  152. data/lib/roby/relations/executed_by.rb +26 -11
  153. data/lib/roby/relations/planned_by.rb +14 -14
  154. data/lib/roby/robot.rb +46 -0
  155. data/lib/roby/schedulers/basic.rb +34 -0
  156. data/lib/roby/standalone.rb +4 -0
  157. data/lib/roby/standard_errors.rb +21 -15
  158. data/lib/roby/state/events.rb +5 -4
  159. data/lib/roby/support.rb +107 -6
  160. data/lib/roby/task-operations.rb +23 -19
  161. data/lib/roby/task.rb +522 -148
  162. data/lib/roby/task_index.rb +80 -0
  163. data/lib/roby/test/common.rb +283 -44
  164. data/lib/roby/test/distributed.rb +53 -37
  165. data/lib/roby/test/testcase.rb +9 -204
  166. data/lib/roby/test/tools.rb +3 -3
  167. data/lib/roby/transactions.rb +154 -111
  168. data/lib/roby/transactions/proxy.rb +40 -7
  169. data/manifest.xml +20 -0
  170. data/plugins/fault_injection/README.txt +0 -3
  171. data/plugins/fault_injection/Rakefile +2 -8
  172. data/plugins/fault_injection/app.rb +1 -1
  173. data/plugins/fault_injection/fault_injection.rb +3 -3
  174. data/plugins/fault_injection/test/test_fault_injection.rb +19 -25
  175. data/plugins/subsystems/README.txt +0 -3
  176. data/plugins/subsystems/Rakefile +2 -7
  177. data/plugins/subsystems/app.rb +27 -16
  178. data/plugins/subsystems/test/app/config/init.rb +3 -0
  179. data/plugins/subsystems/test/app/planners/main.rb +1 -1
  180. data/plugins/subsystems/test/app/tasks/services.rb +1 -1
  181. data/plugins/subsystems/test/test_subsystems.rb +23 -16
  182. data/test/distributed/test_communication.rb +32 -15
  183. data/test/distributed/test_connection.rb +28 -26
  184. data/test/distributed/test_execution.rb +59 -54
  185. data/test/distributed/test_mixed_plan.rb +34 -34
  186. data/test/distributed/test_plan_notifications.rb +26 -26
  187. data/test/distributed/test_protocol.rb +57 -48
  188. data/test/distributed/test_query.rb +11 -7
  189. data/test/distributed/test_remote_plan.rb +71 -71
  190. data/test/distributed/test_transaction.rb +50 -47
  191. data/test/mockups/external_process +28 -0
  192. data/test/planning/test_loops.rb +163 -119
  193. data/test/planning/test_model.rb +3 -3
  194. data/test/planning/test_task.rb +27 -7
  195. data/test/relations/test_conflicts.rb +3 -3
  196. data/test/relations/test_dependency.rb +324 -0
  197. data/test/relations/test_ensured.rb +2 -2
  198. data/test/relations/test_executed_by.rb +94 -19
  199. data/test/relations/test_planned_by.rb +11 -9
  200. data/test/suite_core.rb +6 -3
  201. data/test/suite_distributed.rb +1 -0
  202. data/test/suite_planning.rb +1 -0
  203. data/test/suite_relations.rb +2 -2
  204. data/test/tasks/test_external_process.rb +126 -0
  205. data/test/{test_thread_task.rb → tasks/test_thread_task.rb} +17 -20
  206. data/test/test_bgl.rb +21 -1
  207. data/test/test_event.rb +229 -155
  208. data/test/test_exceptions.rb +79 -80
  209. data/test/test_execution_engine.rb +987 -0
  210. data/test/test_gui.rb +1 -1
  211. data/test/test_interface.rb +11 -5
  212. data/test/test_log.rb +18 -7
  213. data/test/test_log_server.rb +1 -0
  214. data/test/test_plan.rb +229 -395
  215. data/test/test_query.rb +193 -35
  216. data/test/test_relations.rb +88 -8
  217. data/test/test_state.rb +55 -37
  218. data/test/test_support.rb +1 -1
  219. data/test/test_task.rb +371 -218
  220. data/test/test_testcase.rb +32 -16
  221. data/test/test_transactions.rb +211 -170
  222. data/test/test_transactions_proxy.rb +37 -19
  223. metadata +169 -71
  224. data/.gitignore +0 -29
  225. data/doc/styles/allison.css +0 -314
  226. data/doc/styles/allison.js +0 -316
  227. data/doc/styles/allison.rb +0 -276
  228. data/doc/styles/jamis.rb +0 -593
  229. data/lib/roby/control.rb +0 -746
  230. data/lib/roby/executives/simple.rb +0 -30
  231. data/lib/roby/propagation.rb +0 -562
  232. data/lib/roby/relations/hierarchy.rb +0 -239
  233. data/lib/roby/transactions/updates.rb +0 -139
  234. data/test/relations/test_hierarchy.rb +0 -158
  235. data/test/test_control.rb +0 -399
  236. data/test/test_propagation.rb +0 -210
@@ -30,14 +30,16 @@ module Roby::Log
30
30
  def arg_to_s(arg)
31
31
  case arg
32
32
  when Time then Time.at(arg - @reftime).to_hms
33
- when Array then arg.map(&method(:arg_to_s)).to_s
33
+ when Array then arg.map { |v| arg_to_s(v) }.to_s
34
34
  when Hash then arg.map { |k, v| [arg_to_s(k), arg_to_s(v)].join(" => ") }.to_s
35
35
  else arg.to_s
36
36
  end
37
37
  end
38
38
 
39
39
 
40
- def display(m, time, *args) # :nodoc:
40
+ def logs_message?(m); true end
41
+ def close; end
42
+ def dump_method(m, time, *args) # :nodoc:
41
43
  @reftime ||= time
42
44
 
43
45
  args.map! { |a| arg_to_s(a) }
@@ -65,7 +67,7 @@ module Roby::Log
65
67
  private :display
66
68
 
67
69
  Roby::Log.each_hook do |klass, m|
68
- define_method(m) { |args| display(m, *args) }
70
+ define_method(m) { |time, args| dump_method(m, time, args) }
69
71
  end
70
72
  end
71
73
  end
@@ -46,6 +46,12 @@ module Roby::Log
46
46
  @decoders = []
47
47
  end
48
48
 
49
+ def each_sample
50
+ while sample = read_and_decode
51
+ yield(sample)
52
+ end
53
+ end
54
+
49
55
  def to_s; "#{name} [#{type}]" end
50
56
  def open; end
51
57
  def close; end
@@ -62,7 +68,9 @@ module Roby::Log
62
68
  def read_all; end
63
69
 
64
70
  def read_and_decode
65
- self.class.decode(read)
71
+ if raw = read
72
+ self.class.decode(raw)
73
+ end
66
74
  end
67
75
 
68
76
  # The [min, max] range of available samples. Initially
@@ -100,12 +108,21 @@ module Roby::Log
100
108
  super if defined? super
101
109
  end
102
110
 
103
- # Do a read - decode - feed cycle
104
- def advance
105
- data = decode(read)
106
- decoders.each do |dec|
107
- dec.process(data)
108
- end
111
+ # Do a read and decode the data
112
+ #
113
+ # It returns false if no decoders have found interesting updates in the
114
+ # decoded data, and true otherwise. The method relies on the decoder's
115
+ # #process method to return true/false when required.
116
+ #
117
+ # See DataDecoder#process
118
+ def advance
119
+ if data = read_and_decode
120
+ !decoders.find_all do |dec|
121
+ dec.process(data)
122
+ end.empty?
123
+ else
124
+ raise EOFError
125
+ end
109
126
  end
110
127
 
111
128
  def init(data)
@@ -115,13 +132,26 @@ module Roby::Log
115
132
  self.class.decode(data)
116
133
  end
117
134
 
135
+ # Displays may have the ability to not display a per-cycle information,
136
+ # but to add information as it is coming over. This call asks them to
137
+ # remove the information integrated until now.
138
+ #
139
+ # It forwards the call to the decoders' #clear_integrated call. These
140
+ # methods should return true if a change has been needed on any of their
141
+ # display, and false otherwise.
118
142
  def clear_integrated
119
- decoders.each do |decoder|
143
+ !decoders.find_all do |decoder|
120
144
  decoder.clear_integrated
121
- end
145
+ end.empty?
122
146
  end
123
147
 
124
148
  # Update the displays
149
+ #
150
+ # It returns false if all decoders have reported that no display update
151
+ # was required, and true otherwise. The method relies on the decoder's
152
+ # #display method to return true/false when required.
153
+ #
154
+ # See DataDecoder#display
125
155
  def display
126
156
  decoders.each do |decoder|
127
157
  decoder.display
@@ -137,10 +167,16 @@ module Roby::Log
137
167
  def hash; [name, type].hash end
138
168
  end
139
169
 
170
+ # In the data flow model we're using, a data decoder gets data from a
171
+ # DataStream object and builds a representation that can be used by
172
+ # displays.
140
173
  class DataDecoder
141
174
  # The set of displays attached to this decoder
142
175
  attr_reader :displays
176
+ # The decoder name
143
177
  attr_reader :name
178
+
179
+ # The DataStream object we're getting our data from
144
180
  attr_accessor :stream
145
181
 
146
182
  def initialize(name)
@@ -148,24 +184,54 @@ module Roby::Log
148
184
  @displays = []
149
185
  end
150
186
 
187
+ # Clear the stream data
151
188
  def clear
152
189
  displays.each { |d| d.clear }
153
190
  end
154
191
 
192
+ # Displays may have the ability to not display a per-cycle information,
193
+ # but to add information as it is coming over. This call asks them to
194
+ # remove the information integrated until now.
195
+ #
196
+ # It forwards the call to the displays' #clear_integrated call(if any). These
197
+ # methods should return true if a change has been needed on any of their
198
+ # display, and false otherwise.
155
199
  def clear_integrated
156
- displays.each do |display|
157
- display.clear_integrated if display.respond_to?(:clear_integrated)
158
- end
200
+ !displays.find_all do |display|
201
+ if display.respond_to?(:clear_integrated)
202
+ display.clear_integrated
203
+ end
204
+ end.empty?
159
205
  end
160
206
 
161
- # Update the display to the current state of the decoder
207
+ # Updates the displays that are associated with this decoder. Returns
208
+ # true if one of the displays have been changed, and false otherwise.
209
+ #
210
+ # It relies on the display's #update method to return true if something
211
+ # has changed on the display and false otherwise.
162
212
  def display
163
- displays.each do |display|
213
+ !displays.find_all do |display|
164
214
  display.update
165
- end
215
+ end.empty?
166
216
  end
167
217
  end
168
218
 
219
+ # This module gets mixed-in the display classes. It creates the necessary
220
+ # stream => decoder => display link, reusing (if possible) a decoder that
221
+ # already exists.
222
+ #
223
+ # One should use it that way:
224
+ #
225
+ # class Display
226
+ # include DataDisplay
227
+ # decoder DecoderClass
228
+ # end
229
+ #
230
+ # Then, one can do
231
+ # display = Display.new
232
+ # display.stream = data_stream
233
+ #
234
+ # and leave the rest to the DataDisplay implementation.
169
235
  module DataDisplay
170
236
  module ClassExtension
171
237
  def decoder(new_type = nil)
@@ -177,11 +243,23 @@ module Roby::Log
177
243
  end
178
244
  end
179
245
 
246
+ # The decoder object. That object gets data from a DataStream object and
247
+ # decodes it into the format required by the display.
248
+ #
249
+ # Examples: PlanRebuilder
180
250
  attr_reader :decoder
181
251
  attr_reader :main
252
+
253
+ # The configuration UI object. Usually a subclass of Qt::Widget
182
254
  attr_accessor :config_ui
183
- def splat?; true end
184
255
 
256
+
257
+ def splat? #:nodoc:
258
+ true
259
+ end
260
+
261
+ # Sets the data stream that this display listens to. It creates or gets
262
+ # the decoder that is necessary between the raw stream and the display
185
263
  def stream=(data_stream)
186
264
  if decoder
187
265
  clear
@@ -33,11 +33,11 @@ module Roby
33
33
  trsc.to_dot(display, io, level + 1)
34
34
  end
35
35
 
36
- relations_to_dot(display, io, TaskStructure, known_tasks)
36
+ relations_to_dot(display, io, Roby::Log::RelationsDisplay.all_task_relations, known_tasks)
37
37
  end
38
38
 
39
- def each_displayed_relation(display, space, objects)
40
- space.relations.each do |rel|
39
+ def each_displayed_relation(display, relations, objects)
40
+ relations.each do |rel|
41
41
  next unless display.relation_enabled?(rel)
42
42
 
43
43
  objects.each do |from|
@@ -60,8 +60,8 @@ module Roby
60
60
  end
61
61
  end
62
62
 
63
- def relations_to_dot(display, io, space, objects)
64
- each_displayed_relation(display, space, objects) do |rel, from, to|
63
+ def relations_to_dot(display, io, all_relations, objects)
64
+ each_displayed_relation(display, all_relations, objects) do |rel, from, to|
65
65
  from_id, to_id = from.dot_id, to.dot_id
66
66
  if from_id && to_id
67
67
  io << " #{from_id} -> #{to_id}\n"
@@ -71,8 +71,8 @@ module Roby
71
71
  end
72
72
  end
73
73
 
74
- def layout_relations(positions, display, space, objects)
75
- each_displayed_relation(display, space, objects) do |rel, from, to|
74
+ def layout_relations(positions, display, all_relations, objects)
75
+ each_displayed_relation(display, all_relations, objects) do |rel, from, to|
76
76
  display.task_relation(from, to, rel, from[to, rel])
77
77
  end
78
78
  end
@@ -114,7 +114,7 @@ module Roby
114
114
  transactions.each do |trsc|
115
115
  trsc.apply_layout(bounding_rects, positions, display, max_depth)
116
116
  end
117
- layout_relations(positions, display, TaskStructure, known_tasks)
117
+ layout_relations(positions, display, Roby::Log::RelationsDisplay.all_task_relations, known_tasks)
118
118
  end
119
119
  end
120
120
 
@@ -17,7 +17,11 @@ module Roby
17
17
  attr_reader :start_cycle
18
18
  # A [min, max] array of the minimum and maximum times for this
19
19
  # stream
20
- def range; [start_time, logfile.range.last] end
20
+ def range
21
+ if range = logfile.range
22
+ [start_time, logfile.range.last]
23
+ end
24
+ end
21
25
 
22
26
  def initialize(basename, file = nil)
23
27
  super(basename, "roby-events")
@@ -104,6 +108,10 @@ module Roby
104
108
  reinit!
105
109
  end
106
110
 
111
+ if current_cycle >= index_data.size
112
+ return
113
+ end
114
+
107
115
  start_pos = index_data[current_cycle][:pos]
108
116
  end_pos = if index_data.size > current_cycle + 1
109
117
  index_data[current_cycle + 1][:pos]
@@ -128,8 +136,10 @@ module Roby
128
136
  rescue EOFError
129
137
  end
130
138
 
131
- # Unmarshalls one cycle of data returned by #read and feeds
132
- # it to the decoders
139
+ # Unmarshalls one cycle of data returned by #read
140
+ #
141
+ # In the case of the event stream, this is one array dumped with
142
+ # Marshal.dump
133
143
  def self.decode(data)
134
144
  Marshal.load(data)
135
145
  end
@@ -10,8 +10,10 @@ module Roby::Log
10
10
  attr_reader :index_data
11
11
  attr_reader :basename
12
12
  def range
13
- [Time.at(*index_data.first[:start]),
14
- Time.at(*index_data.last[:start]) + index_data.last[:end]]
13
+ if !index_data.empty?
14
+ [Time.at(*index_data.first[:start]),
15
+ Time.at(*index_data.last[:start]) + index_data.last[:end]]
16
+ end
15
17
  end
16
18
 
17
19
  def initialize(file, allow_old_format = false, force_rebuild_index = false)
@@ -30,6 +32,14 @@ module Roby::Log
30
32
  FileLogger.check_format(@event_io)
31
33
  end
32
34
 
35
+ @event_io.rewind
36
+ file_header = Marshal.load(@event_io)
37
+ if file_header[:plugins]
38
+ file_header[:plugins].each do |plugin_name|
39
+ Roby.app.using plugin_name
40
+ end
41
+ end
42
+
33
43
  index_path = "#{basename}-index.log"
34
44
  if force_rebuild_index || !File.file?(index_path)
35
45
  rebuild_index
@@ -88,8 +98,13 @@ module Roby::Log
88
98
  return false
89
99
  end
90
100
 
91
- if cycle[-4] != :cycle_end ||
92
- cycle[-1].first != index
101
+ stats = cycle.last[0].dup
102
+ stats.delete(:state)
103
+ index = index.dup
104
+ index.delete(:state)
105
+ if stats != index
106
+ STDERR.puts stats.inspect
107
+ STDERR.puts index.inspect
93
108
  return false
94
109
  end
95
110
  end
@@ -127,7 +142,7 @@ module Roby::Log
127
142
 
128
143
  # A logger object which marshals all available events in two files. The
129
144
  # event log is the full log, the index log contains only the timings given
130
- # to Control#cycle_end, along with the corresponding position in the event
145
+ # to ExecutionEngine#cycle_end, along with the corresponding position in the event
131
146
  # log file.
132
147
  #
133
148
  # You can use FileLogger.replay(io) to send the events back into the
@@ -151,19 +166,28 @@ module Roby::Log
151
166
  # StringIO object on which we dump the data
152
167
  attr_reader :dump_io
153
168
 
154
- def initialize(basename)
169
+ def initialize(basename, options)
155
170
  @current_pos = 0
156
171
  @dump_io = StringIO.new('', 'w')
157
172
  @current_cycle = Array.new
158
173
  @event_log = File.open("#{basename}-events.log", 'w')
159
174
  event_log.sync = true
160
- FileLogger.write_header(@event_log)
175
+ FileLogger.write_header(@event_log, options)
161
176
  @index_log = File.open("#{basename}-index.log", 'w')
162
177
  index_log.sync = true
163
178
  end
164
179
 
165
180
  attr_accessor :stats_mode
166
181
  def splat?; false end
182
+ def logs_message?(m)
183
+ m == :cycle_end || !stats_mode
184
+ end
185
+
186
+ def close
187
+ dump_method(:cycle_end, Time.now, [])
188
+ @event_log.close
189
+ @index_log.close
190
+ end
167
191
 
168
192
  def dump_method(m, time, args)
169
193
  if m == :cycle_end || !stats_mode
@@ -172,7 +196,7 @@ module Roby::Log
172
196
  if m == :cycle_end
173
197
  info = args.first
174
198
  info[:pos] = event_log.tell
175
- info[:event_count] = current_cycle.size
199
+ info[:event_count] = current_cycle.size / 4
176
200
  Marshal.dump(current_cycle, event_log)
177
201
 
178
202
  dump_io.truncate(0)
@@ -184,13 +208,16 @@ module Roby::Log
184
208
  end
185
209
 
186
210
  rescue
187
- puts "failed to dump #{m}#{args}: #{$!.full_message}"
188
- args.each do |obj|
189
- unless (Marshal.dump(obj) rescue nil)
190
- puts "there is a problem with"
191
- pp obj
211
+ current_cycle.each_slice(4) do |m, sec, usec, args|
212
+ unless (Marshal.dump(args) rescue nil)
213
+ args.each do |obj|
214
+ unless (Marshal.dump(obj) rescue nil)
215
+ puts "cannot dump the following object in #{m}(#{args.join(", ")}):"
216
+ pp obj
217
+ end
218
+ end
192
219
  end
193
- end
220
+ end
194
221
  end
195
222
 
196
223
  Roby::Log.each_hook do |klass, m|
@@ -209,8 +236,6 @@ module Roby::Log
209
236
  loop do
210
237
  cycle = Marshal.load(event_log)
211
238
  info = cycle.last.last
212
- info[:pos] = current_pos
213
- info[:event_count] = cycle.size
214
239
 
215
240
  dump_io.truncate(0)
216
241
  dump_io.seek(0)
@@ -262,8 +287,8 @@ module Roby::Log
262
287
  end
263
288
  end
264
289
 
265
- def self.write_header(io)
266
- header = { :log_format => FORMAT_VERSION }
290
+ def self.write_header(io, options = Hash.new)
291
+ header = { :log_format => FORMAT_VERSION }.merge(options)
267
292
  Marshal.dump(header, io)
268
293
  end
269
294
 
@@ -0,0 +1,89 @@
1
+ =begin
2
+ ** Form generated from reading ui file 'basic_display.ui'
3
+ **
4
+ ** Created: Mon Jan 25 15:21:37 2010
5
+ ** by: Qt User Interface Compiler version 4.5.3
6
+ **
7
+ ** WARNING! All changes made in this file will be lost when recompiling ui file!
8
+ =end
9
+
10
+ class Ui_BasicDisplayConfig
11
+ attr_reader :gridLayout
12
+ attr_reader :gridLayout1
13
+ attr_reader :label
14
+ attr_reader :close
15
+ attr_reader :spacerItem
16
+ attr_reader :stream
17
+
18
+ def setupUi(basicDisplayConfig)
19
+ if basicDisplayConfig.objectName.nil?
20
+ basicDisplayConfig.objectName = "basicDisplayConfig"
21
+ end
22
+ basicDisplayConfig.resize(333, 77)
23
+ @gridLayout = Qt::GridLayout.new(basicDisplayConfig)
24
+ @gridLayout.spacing = 6
25
+ @gridLayout.margin = 9
26
+ @gridLayout.objectName = "gridLayout"
27
+ @gridLayout1 = Qt::GridLayout.new()
28
+ @gridLayout1.spacing = 6
29
+ @gridLayout1.margin = 0
30
+ @gridLayout1.objectName = "gridLayout1"
31
+ @label = Qt::Label.new(basicDisplayConfig)
32
+ @label.objectName = "label"
33
+ @sizePolicy = Qt::SizePolicy.new(1, 5)
34
+ @sizePolicy.setHorizontalStretch(0)
35
+ @sizePolicy.setVerticalStretch(0)
36
+ @sizePolicy.heightForWidth = @label.sizePolicy.hasHeightForWidth
37
+ @label.sizePolicy = @sizePolicy
38
+
39
+ @gridLayout1.addWidget(@label, 1, 0, 1, 1)
40
+
41
+ @close = Qt::PushButton.new(basicDisplayConfig)
42
+ @close.objectName = "close"
43
+
44
+ @gridLayout1.addWidget(@close, 0, 2, 1, 1)
45
+
46
+ @spacerItem = Qt::SpacerItem.new(161, 20, Qt::SizePolicy::Expanding, Qt::SizePolicy::Minimum)
47
+
48
+ @gridLayout1.addItem(@spacerItem, 0, 0, 1, 2)
49
+
50
+ @stream = Qt::ComboBox.new(basicDisplayConfig)
51
+ @stream.objectName = "stream"
52
+ @sizePolicy1 = Qt::SizePolicy.new(3, 0)
53
+ @sizePolicy1.setHorizontalStretch(0)
54
+ @sizePolicy1.setVerticalStretch(0)
55
+ @sizePolicy1.heightForWidth = @stream.sizePolicy.hasHeightForWidth
56
+ @stream.sizePolicy = @sizePolicy1
57
+
58
+ @gridLayout1.addWidget(@stream, 1, 1, 1, 2)
59
+
60
+
61
+ @gridLayout.addLayout(@gridLayout1, 0, 0, 1, 1)
62
+
63
+
64
+ retranslateUi(basicDisplayConfig)
65
+
66
+ Qt::MetaObject.connectSlotsByName(basicDisplayConfig)
67
+ end # setupUi
68
+
69
+ def setup_ui(basicDisplayConfig)
70
+ setupUi(basicDisplayConfig)
71
+ end
72
+
73
+ def retranslateUi(basicDisplayConfig)
74
+ basicDisplayConfig.windowTitle = Qt::Application.translate("BasicDisplayConfig", "Form", nil, Qt::Application::UnicodeUTF8)
75
+ @label.text = Qt::Application.translate("BasicDisplayConfig", "Data stream", nil, Qt::Application::UnicodeUTF8)
76
+ @close.text = Qt::Application.translate("BasicDisplayConfig", "Close", nil, Qt::Application::UnicodeUTF8)
77
+ end # retranslateUi
78
+
79
+ def retranslate_ui(basicDisplayConfig)
80
+ retranslateUi(basicDisplayConfig)
81
+ end
82
+
83
+ end
84
+
85
+ module Ui
86
+ class BasicDisplayConfig < Ui_BasicDisplayConfig
87
+ end
88
+ end # module Ui
89
+