diff options
-rw-r--r-- | viz/draw.py | 4 | ||||
-rw-r--r-- | viz/schedule.py | 40 | ||||
-rw-r--r-- | viz/viewer.py | 68 |
3 files changed, 91 insertions, 21 deletions
diff --git a/viz/draw.py b/viz/draw.py index db246ec..c30ffe7 100644 --- a/viz/draw.py +++ b/viz/draw.py | |||
@@ -743,6 +743,7 @@ class Graph(object): | |||
743 | extra_width = cur_width | 743 | extra_width = cur_width |
744 | 744 | ||
745 | width += extra_width | 745 | width += extra_width |
746 | |||
746 | self.origin = (extra_width + GraphFormat.WIDTH_PAD / 2.0, height - GraphFormat.HEIGHT_PAD / 2.0) | 747 | self.origin = (extra_width + GraphFormat.WIDTH_PAD / 2.0, height - GraphFormat.HEIGHT_PAD / 2.0) |
747 | 748 | ||
748 | self.width = width | 749 | self.width = width |
@@ -762,6 +763,9 @@ class Graph(object): | |||
762 | def get_height(self): | 763 | def get_height(self): |
763 | return self.height | 764 | return self.height |
764 | 765 | ||
766 | def get_origin(self): | ||
767 | return self.origin | ||
768 | |||
765 | def get_attrs(self): | 769 | def get_attrs(self): |
766 | return self.attrs | 770 | return self.attrs |
767 | 771 | ||
diff --git a/viz/schedule.py b/viz/schedule.py index e525b17..ae7284b 100644 --- a/viz/schedule.py +++ b/viz/schedule.py | |||
@@ -35,25 +35,29 @@ class TimeSlotArray(object): | |||
35 | for type in self.list_sizes: | 35 | for type in self.list_sizes: |
36 | num = self.list_sizes[type] | 36 | num = self.list_sizes[type] |
37 | self.array[type] = [] | 37 | self.array[type] = [] |
38 | for i in range(0, int((end - start) // self.time_per_maj + 1)): | 38 | for j in range(0, num): |
39 | # for each slot in the array, we need a list of all events under this type | 39 | # for each slot in the array, we need a list of all events under this type |
40 | # (for example, a list of all events that occur in this time slot, indexed | 40 | # (for example, a list of all events that occur in this time slot, indexed |
41 | # by task). | 41 | # by task). |
42 | self.array[type].append([]) | 42 | for i in range(0, num): |
43 | for j in range(0, num): | 43 | self.array[type].append(dict(zip(EVENT_LIST, \ |
44 | self.array[type][i].append(dict(zip(EVENT_LIST, \ | 44 | [{} for j in range(0, len(EVENT_LIST))]))) |
45 | [[] for j in range(0, len(EVENT_LIST))]))) | ||
46 | 45 | ||
47 | def get_time_slot(self, time): | 46 | def get_time_slot(self, time): |
48 | return int((time - self.start) // self.time_per_maj) | 47 | return int((time - self.start) // self.time_per_maj) |
49 | 48 | ||
49 | def _put_event_in_slot(self, list_type, no, klass, slot, event): | ||
50 | if slot not in self.array[list_type][no][klass]: | ||
51 | self.array[list_type][no][klass][slot] = [] | ||
52 | self.array[list_type][no][klass][slot].append(event) | ||
53 | |||
50 | def add_event_to_time_slot(self, event): | 54 | def add_event_to_time_slot(self, event): |
51 | task_no = event.get_job().get_task().get_task_no() | 55 | task_no = event.get_job().get_task().get_task_no() |
52 | cpu = event.get_cpu() | 56 | cpu = event.get_cpu() |
53 | time_slot = self.get_time_slot(event.get_time()) | 57 | time_slot = self.get_time_slot(event.get_time()) |
54 | 58 | ||
55 | self.array[TimeSlotArray.TASK_LIST][time_slot][task_no][event.__class__].append(event) | 59 | self._put_event_in_slot(TimeSlotArray.TASK_LIST, task_no, event.__class__, time_slot, event) |
56 | self.array[TimeSlotArray.CPU_LIST][time_slot][cpu][event.__class__].append(event) | 60 | self._put_event_in_slot(TimeSlotArray.CPU_LIST, cpu, event.__class__, time_slot, event) |
57 | 61 | ||
58 | span_events = { SwitchAwayEvent : IsRunningDummy, InversionEndEvent : InversionDummy} | 62 | span_events = { SwitchAwayEvent : IsRunningDummy, InversionEndEvent : InversionDummy} |
59 | 63 | ||
@@ -64,8 +68,9 @@ class TimeSlotArray(object): | |||
64 | for slot in range(start_slot + 1, end_slot): | 68 | for slot in range(start_slot + 1, end_slot): |
65 | dummy = span_events[span_event](task_no, cpu) | 69 | dummy = span_events[span_event](task_no, cpu) |
66 | dummy.corresp_start_event = event.corresp_start_event | 70 | dummy.corresp_start_event = event.corresp_start_event |
67 | self.array[TimeSlotArray.TASK_LIST][slot][task_no][dummy.__class__].append(dummy) | 71 | |
68 | self.array[TimeSlotArray.CPU_LIST][slot][cpu][dummy.__class__].append(dummy) | 72 | self._put_event_in_slot(TimeSlotArray.TASK_LIST, task_no, dummy.__class__, slot, dummy) |
73 | self._put_event_in_slot(TimeSlotArray.CPU_LIST, cpu, dummy.__class__, slot, dummy) | ||
69 | 74 | ||
70 | def iter_over_period(self, start, end, start_no, end_no, list_type, event_types): | 75 | def iter_over_period(self, start, end, start_no, end_no, list_type, event_types): |
71 | if self.array is None: | 76 | if self.array is None: |
@@ -76,17 +81,18 @@ class TimeSlotArray(object): | |||
76 | if start_no > end_no: | 81 | if start_no > end_no: |
77 | raise ValueError('start no should be less than end no') | 82 | raise ValueError('start no should be less than end no') |
78 | 83 | ||
79 | start_slot = max(0, self.get_time_slot(start)) | 84 | start_slot = self.get_time_slot(start) |
80 | end_slot = min(len(self.array[list_type]), self.get_time_slot(end) + 2) | 85 | end_slot = self.get_time_slot(end) + 2 |
81 | 86 | ||
82 | start_no = max(0, start_no) | 87 | start_no = max(0, start_no) |
83 | end_no = min(self.list_sizes[list_type] - 1, end_no) | 88 | end_no = min(self.list_sizes[list_type] - 1, end_no) |
84 | 89 | ||
85 | for slot in range(start_slot, end_slot): | 90 | for no in range(start_no, end_no + 1): |
86 | for no in range(start_no, end_no + 1): | 91 | for type in event_types: |
87 | for type in event_types: | 92 | for slot in range(start_slot, end_slot): |
88 | for event in self.array[list_type][slot][no][type]: | 93 | if slot in self.array[list_type][no][type]: |
89 | yield event | 94 | for event in self.array[list_type][no][type][slot]: |
95 | yield event | ||
90 | 96 | ||
91 | class Schedule(object): | 97 | class Schedule(object): |
92 | """The total schedule (task system), consisting of a certain number of | 98 | """The total schedule (task system), consisting of a certain number of |
diff --git a/viz/viewer.py b/viz/viewer.py index a7871a7..ee5c230 100644 --- a/viz/viewer.py +++ b/viz/viewer.py | |||
@@ -25,7 +25,7 @@ class GraphContextMenu(gtk.Menu): | |||
25 | item.show() | 25 | item.show() |
26 | 26 | ||
27 | class GraphArea(gtk.DrawingArea): | 27 | class GraphArea(gtk.DrawingArea): |
28 | HORIZ_PAGE_SCROLL_FACTOR = 4.8 | 28 | HORIZ_PAGE_SCROLL_FACTOR = 10.8 |
29 | HORIZ_STEP_SCROLL_FACTOR = 0.8 | 29 | HORIZ_STEP_SCROLL_FACTOR = 0.8 |
30 | VERT_PAGE_SCROLL_FACTOR = 3.0 | 30 | VERT_PAGE_SCROLL_FACTOR = 3.0 |
31 | VERT_STEP_SCROLL_FACTOR = 0.5 | 31 | VERT_STEP_SCROLL_FACTOR = 0.5 |
@@ -75,7 +75,13 @@ class GraphArea(gtk.DrawingArea): | |||
75 | ctx.set_line_width(thickness) | 75 | ctx.set_line_width(thickness) |
76 | ctx.set_source_rgb(color[0], color[1], color[2]) | 76 | ctx.set_source_rgb(color[0], color[1], color[2]) |
77 | ctx.stroke() | 77 | ctx.stroke() |
78 | |||
79 | def get_renderer(self): | ||
80 | return self.renderer | ||
78 | 81 | ||
82 | def get_graph(self): | ||
83 | return self.renderer.get_graph() | ||
84 | |||
79 | def set_scroll_adjustments(self, widget, horizontal, vertical, data=None): | 85 | def set_scroll_adjustments(self, widget, horizontal, vertical, data=None): |
80 | graph = self.renderer.get_graph() | 86 | graph = self.renderer.get_graph() |
81 | width = graph.get_width() | 87 | width = graph.get_width() |
@@ -243,10 +249,60 @@ class GraphWindow(gtk.ScrolledWindow): | |||
243 | def __init__(self, renderer): | 249 | def __init__(self, renderer): |
244 | super(GraphWindow, self).__init__(None, None) | 250 | super(GraphWindow, self).__init__(None, None) |
245 | 251 | ||
252 | self.add_events(gtk.gdk.KEY_PRESS_MASK) | ||
253 | |||
254 | self.ctr = 0 | ||
255 | self.connect('key-press-event', self.key_press) | ||
256 | |||
246 | self.garea = GraphArea(renderer) | 257 | self.garea = GraphArea(renderer) |
247 | self.add(self.garea) | 258 | self.add(self.garea) |
248 | self.garea.show() | 259 | self.garea.show() |
249 | 260 | ||
261 | def key_press(self, widget, key_event): | ||
262 | hadj = self.get_hadjustment() | ||
263 | vadj = self.get_vadjustment() | ||
264 | if hadj is None or vadj is None: | ||
265 | return | ||
266 | |||
267 | hupper = hadj.get_upper() | ||
268 | hlower = hadj.get_lower() | ||
269 | hpincr = hadj.get_page_increment() | ||
270 | hsincr = hadj.get_step_increment() | ||
271 | hpsize = hadj.get_page_size() | ||
272 | hval = hadj.get_value() | ||
273 | vupper = vadj.get_upper() | ||
274 | vlower = vadj.get_lower() | ||
275 | vval = vadj.get_value() | ||
276 | vpincr = vadj.get_page_increment() | ||
277 | vsincr = vadj.get_step_increment() | ||
278 | vpsize = vadj.get_page_size() | ||
279 | |||
280 | ctrl_clicked = key_event.state & gtk.gdk.CONTROL_MASK | ||
281 | |||
282 | adj_tuple = {'up' : (vadj, -vsincr, 0, vval, max), | ||
283 | 'ctrl-up' : (vadj, -vpincr, 0, vval, max), | ||
284 | 'down' : (vadj, vsincr, vupper - vpsize, vval, min), | ||
285 | 'ctrl-down' : (vadj, vpincr, vupper - vpsize, vval, min), | ||
286 | 'left' : (hadj, -hsincr, 0, hval, max), | ||
287 | 'ctrl-left' : (hadj, -hpincr, 0, hval, max), | ||
288 | 'right' : (hadj, hsincr, hupper - hpsize, hval, min), | ||
289 | 'ctrl-right' : (hadj, hpincr, hupper - hpsize, hval, min)} | ||
290 | |||
291 | keystr = None | ||
292 | keymap = {gtk.keysyms.Up : 'up', gtk.keysyms.Down : 'down', | ||
293 | gtk.keysyms.Left : 'left', gtk.keysyms.Right : 'right'} | ||
294 | if key_event.keyval in keymap: | ||
295 | keystr = keymap[key_event.keyval] | ||
296 | |||
297 | if ctrl_clicked: | ||
298 | keystr = 'ctrl-' + keystr | ||
299 | |||
300 | if keystr is not None: | ||
301 | adj, inc, lim, val, extr = adj_tuple[keystr] | ||
302 | adj.set_value(extr(val + inc, lim)) | ||
303 | |||
304 | return True | ||
305 | |||
250 | def get_graph_area(self): | 306 | def get_graph_area(self): |
251 | return self.garea | 307 | return self.garea |
252 | 308 | ||
@@ -320,9 +376,13 @@ class MainWindow(gtk.Window): | |||
320 | self.notebook.append_page(gwindow, gtk.Label(title)) | 376 | self.notebook.append_page(gwindow, gtk.Label(title)) |
321 | 377 | ||
322 | def switch_page(self, widget, page, page_num): | 378 | def switch_page(self, widget, page, page_num): |
323 | if self.notebook.last_page >= 0: | 379 | if self.notebook.get_nth_page(self.notebook.last_page) is not None: |
324 | hvalue = self.notebook.get_nth_page(self.notebook.last_page).get_hadjustment().get_value() | 380 | hadj = self.notebook.get_nth_page(self.notebook.last_page).get_hadjustment() |
325 | self.notebook.get_nth_page(page_num).get_hadjustment().set_value(hvalue) | 381 | old_value = hadj.get_value() |
382 | old_ofs = self.notebook.get_nth_page(self.notebook.last_page).get_graph_area().get_graph().get_origin()[0] | ||
383 | new_ofs = self.notebook.get_nth_page(page_num).get_graph_area().get_graph().get_origin()[0] | ||
384 | new_value = old_value - old_ofs + new_ofs | ||
385 | hadj.set_value(new_value) | ||
326 | 386 | ||
327 | self.notebook.last_page = page_num | 387 | self.notebook.last_page = page_num |
328 | 388 | ||