summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--viz/draw.py4
-rw-r--r--viz/schedule.py40
-rw-r--r--viz/viewer.py68
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
91class Schedule(object): 97class 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
27class GraphArea(gtk.DrawingArea): 27class 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