1430 def __init__(self, parent, producer, window): |
1430 def __init__(self, parent, producer, window): |
1431 wx.Panel.__init__(self, parent, style=wx.SP_3D|wx.TAB_TRAVERSAL) |
1431 wx.Panel.__init__(self, parent, style=wx.SP_3D|wx.TAB_TRAVERSAL) |
1432 |
1432 |
1433 self.ParentWindow = window |
1433 self.ParentWindow = window |
1434 |
1434 |
1435 DebugViewer.__init__(self, producer, True) |
|
1436 |
|
1437 self.HasNewData = False |
1435 self.HasNewData = False |
1438 self.Force = False |
1436 self.Force = False |
1439 |
1437 |
1440 if USE_MPL: |
1438 if USE_MPL: |
1441 self.SetBackgroundColour(wx.WHITE) |
1439 self.SetBackgroundColour(wx.WHITE) |
1464 self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange) |
1462 self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange) |
1465 graphics_button_sizer.AddWindow(self.CanvasRange, 1, |
1463 graphics_button_sizer.AddWindow(self.CanvasRange, 1, |
1466 border=5, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL) |
1464 border=5, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL) |
1467 |
1465 |
1468 self.CanvasRange.Clear() |
1466 self.CanvasRange.Clear() |
1469 for text, value in RANGE_VALUES: |
1467 default_range_idx = 0 |
|
1468 for idx, (text, value) in enumerate(RANGE_VALUES): |
1470 self.CanvasRange.Append(text) |
1469 self.CanvasRange.Append(text) |
1471 self.CanvasRange.SetStringSelection(RANGE_VALUES[6][0]) |
1470 if text == "1s": |
1472 self.CurrentRange = RANGE_VALUES[6][1] / self.Ticktime |
1471 default_range_idx = idx |
|
1472 self.CanvasRange.SetSelection(default_range_idx) |
1473 |
1473 |
1474 for name, bitmap, help in [ |
1474 for name, bitmap, help in [ |
1475 ("CurrentButton", "current", _("Go to current value")), |
1475 ("CurrentButton", "current", _("Go to current value")), |
1476 ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]: |
1476 ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]: |
1477 button = wx.lib.buttons.GenBitmapButton(self, |
1477 button = wx.lib.buttons.GenBitmapButton(self, |
1584 self.VariablesGrid.SetColSize(col, self.GridColSizes[col]) |
1584 self.VariablesGrid.SetColSize(col, self.GridColSizes[col]) |
1585 |
1585 |
1586 self.Table.ResetView(self.VariablesGrid) |
1586 self.Table.ResetView(self.VariablesGrid) |
1587 self.VariablesGrid.RefreshButtons() |
1587 self.VariablesGrid.RefreshButtons() |
1588 |
1588 |
|
1589 DebugViewer.__init__(self, producer, True) |
|
1590 |
1589 self.SetSizer(main_sizer) |
1591 self.SetSizer(main_sizer) |
1590 |
1592 |
|
1593 def SetTickTime(self, ticktime=0): |
|
1594 if USE_MPL: |
|
1595 self.Ticktime = ticktime |
|
1596 if self.Ticktime == 0: |
|
1597 self.Ticktime = MILLISECOND |
|
1598 self.CurrentRange = RANGE_VALUES[ |
|
1599 self.CanvasRange.GetSelection()][1] / self.Ticktime |
|
1600 |
1591 def SetDataProducer(self, producer): |
1601 def SetDataProducer(self, producer): |
1592 DebugViewer.SetDataProducer(self, producer) |
1602 DebugViewer.SetDataProducer(self, producer) |
1593 |
1603 |
1594 if USE_MPL: |
1604 if USE_MPL: |
1595 if self.DataProducer is not None: |
1605 if self.DataProducer is not None: |
1596 self.Ticktime = self.DataProducer.GetTicktime() |
1606 self.SetTickTime(self.DataProducer.GetTicktime()) |
1597 else: |
|
1598 self.Ticktime = MILLISECOND |
|
1599 |
1607 |
1600 def RefreshNewData(self, *args, **kwargs): |
1608 def RefreshNewData(self, *args, **kwargs): |
1601 if self.HasNewData or self.Force: |
1609 if self.HasNewData or self.Force: |
1602 self.HasNewData = False |
1610 self.HasNewData = False |
1603 self.RefreshView(only_values=True) |
1611 self.RefreshView(only_values=True) |
1642 def MoveCursorTick(self, move): |
1650 def MoveCursorTick(self, move): |
1643 if self.CursorTick is not None: |
1651 if self.CursorTick is not None: |
1644 cursor_tick = max(self.Ticks[0], |
1652 cursor_tick = max(self.Ticks[0], |
1645 min(self.CursorTick + move, |
1653 min(self.CursorTick + move, |
1646 self.Ticks[-1])) |
1654 self.Ticks[-1])) |
1647 self.CursorTick = self.Ticks[ |
1655 cursor_tick_idx = numpy.argmin(numpy.abs(self.Ticks - cursor_tick)) |
1648 numpy.argmin(numpy.abs(self.Ticks - cursor_tick))] |
1656 if self.Ticks[cursor_tick_idx] == self.CursorTick: |
|
1657 cursor_tick_idx = max(0, |
|
1658 min(cursor_tick_idx + abs(move) / move, |
|
1659 len(self.Ticks) - 1)) |
|
1660 self.CursorTick = self.Ticks[cursor_tick_idx] |
1649 self.StartTick = max(self.Ticks[ |
1661 self.StartTick = max(self.Ticks[ |
1650 numpy.argmin(numpy.abs(self.Ticks - |
1662 numpy.argmin(numpy.abs(self.Ticks - |
1651 self.CursorTick + self.CurrentRange))], |
1663 self.CursorTick + self.CurrentRange))], |
1652 min(self.StartTick, self.CursorTick)) |
1664 min(self.StartTick, self.CursorTick)) |
1653 self.RefreshCanvasPosition() |
1665 self.RefreshCanvasPosition() |
1804 tick = self.Ticks[-1] |
1816 tick = self.Ticks[-1] |
1805 else: |
1817 else: |
1806 tick = None |
1818 tick = None |
1807 if tick is not None: |
1819 if tick is not None: |
1808 self.TickLabel.SetLabel("Tick: %d" % tick) |
1820 self.TickLabel.SetLabel("Tick: %d" % tick) |
1809 if self.Ticktime > 0: |
1821 tick_duration = int(tick * self.Ticktime) |
1810 tick_duration = int(tick * self.Ticktime) |
1822 not_null = False |
1811 not_null = False |
1823 duration = "" |
1812 duration = "" |
1824 for value, format in [(tick_duration / DAY, "%dd"), |
1813 for value, format in [(tick_duration / DAY, "%dd"), |
1825 ((tick_duration % DAY) / HOUR, "%dh"), |
1814 ((tick_duration % DAY) / HOUR, "%dh"), |
1826 ((tick_duration % HOUR) / MINUTE, "%dm"), |
1815 ((tick_duration % HOUR) / MINUTE, "%dm"), |
1827 ((tick_duration % MINUTE) / SECOND, "%ds")]: |
1816 ((tick_duration % MINUTE) / SECOND, "%ds")]: |
|
1817 |
|
1818 if value > 0 or not_null: |
|
1819 duration += format % value |
|
1820 not_null = True |
|
1821 |
1828 |
1822 duration += "%gms" % (float(tick_duration % SECOND) / MILLISECOND) |
1829 if value > 0 or not_null: |
1823 self.TickTimeLabel.SetLabel("t: %s" % duration) |
1830 duration += format % value |
1824 else: |
1831 not_null = True |
1825 self.TickTimeLabel.SetLabel("") |
1832 |
|
1833 duration += "%gms" % (float(tick_duration % SECOND) / MILLISECOND) |
|
1834 self.TickTimeLabel.SetLabel("t: %s" % duration) |
1826 else: |
1835 else: |
1827 self.TickLabel.SetLabel("") |
1836 self.TickLabel.SetLabel("") |
1828 self.TickTimeLabel.SetLabel("") |
1837 self.TickTimeLabel.SetLabel("") |
1829 self.TickSizer.Layout() |
1838 self.TickSizer.Layout() |
1830 else: |
1839 else: |
1843 |
1852 |
1844 def UnregisterObsoleteData(self): |
1853 def UnregisterObsoleteData(self): |
1845 self.SubscribeAllDataConsumers() |
1854 self.SubscribeAllDataConsumers() |
1846 if USE_MPL: |
1855 if USE_MPL: |
1847 if self.DataProducer is not None: |
1856 if self.DataProducer is not None: |
1848 self.Ticktime = self.DataProducer.GetTicktime() |
1857 if self.DataProducer is not None: |
|
1858 self.SetTickTime(self.DataProducer.GetTicktime()) |
1849 |
1859 |
1850 for panel in self.GraphicPanels: |
1860 for panel in self.GraphicPanels: |
1851 panel.UnregisterObsoleteData() |
1861 panel.UnregisterObsoleteData() |
1852 if panel.IsEmpty(): |
1862 if panel.IsEmpty(): |
1853 if panel.HasCapture(): |
1863 if panel.HasCapture(): |