diff options
| author | Gary Bressler <gbressle@swan5.cs.unc.edu> | 2010-03-09 18:18:54 -0500 |
|---|---|---|
| committer | Gary Bressler <gbressle@swan5.cs.unc.edu> | 2010-03-09 18:18:54 -0500 |
| commit | b8dcd0a4ae440794f43981c86ba10596d3321633 (patch) | |
| tree | 33b6bbf0b85d005bee4ac0edcf3e58de3aa7a442 | |
| parent | 883f9dfe38ab081025220aafbf47f722b540d003 (diff) | |
Some minor updates and optimizations, including support for keypresses
| -rw-r--r-- | viz/draw.py | 4 | ||||
| -rw-r--r-- | viz/schedule.py | 40 | ||||
| -rw-r--r-- | viz/viewer.py | 65 |
3 files changed, 89 insertions, 20 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..18fa900 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 | ||
| @@ -321,8 +377,11 @@ class MainWindow(gtk.Window): | |||
| 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.last_page >= 0: |
| 324 | hvalue = self.notebook.get_nth_page(self.notebook.last_page).get_hadjustment().get_value() | 380 | old_value = self.notebook.get_nth_page(self.notebook.last_page).get_hadjustment().get_value() |
| 325 | self.notebook.get_nth_page(page_num).get_hadjustment().set_value(hvalue) | 381 | old_ofs = self.notebook.get_nth_page(self.notebook.last_page).get_graph_area().get_graph().get_origin()[0] |
| 382 | new_ofs = self.notebook.get_nth_page(page_num).get_graph_area().get_graph().get_origin()[0] | ||
| 383 | new_value = old_value - old_ofs + new_ofs | ||
| 384 | self.notebook.get_nth_page(page_num).get_hadjustment().set_value(new_value) | ||
| 326 | 385 | ||
| 327 | self.notebook.last_page = page_num | 386 | self.notebook.last_page = page_num |
| 328 | 387 | ||
