390 MINUTE = 60 * SECOND |
390 MINUTE = 60 * SECOND |
391 HOUR = 60 * MINUTE |
391 HOUR = 60 * MINUTE |
392 DAY = 24 * HOUR |
392 DAY = 24 * HOUR |
393 |
393 |
394 ZOOM_VALUES = map(lambda x:("x %.1f" % x, x), [math.sqrt(2) ** i for i in xrange(8)]) |
394 ZOOM_VALUES = map(lambda x:("x %.1f" % x, x), [math.sqrt(2) ** i for i in xrange(8)]) |
395 RANGE_VALUES = map(lambda x: (str(x), x), [25 * 2 ** i for i in xrange(6)]) |
395 RANGE_VALUES = \ |
396 TIME_RANGE_VALUES = [("%ds" % i, i * SECOND) for i in (1, 2, 5, 10, 20, 30)] + \ |
396 [("%dms" % i, i * MILLISECOND) for i in (10, 20, 50, 100, 200, 500)] + \ |
397 [("%dm" % i, i * MINUTE) for i in (1, 2, 5, 10, 20, 30)] + \ |
397 [("%ds" % i, i * SECOND) for i in (1, 2, 5, 10, 20, 30)] + \ |
398 [("%dh" % i, i * HOUR) for i in (1, 2, 3, 6, 12, 24)] |
398 [("%dm" % i, i * MINUTE) for i in (1, 2, 5, 10, 20, 30)] + \ |
|
399 [("%dh" % i, i * HOUR) for i in (1, 2, 3, 6, 12, 24)] |
399 |
400 |
400 GRAPH_PARALLEL, GRAPH_ORTHOGONAL = range(2) |
401 GRAPH_PARALLEL, GRAPH_ORTHOGONAL = range(2) |
401 |
402 |
402 SCROLLBAR_UNIT = 10 |
403 SCROLLBAR_UNIT = 10 |
403 |
404 |
1440 self.SetBackgroundColour(wx.WHITE) |
1441 self.SetBackgroundColour(wx.WHITE) |
1441 |
1442 |
1442 main_sizer = wx.BoxSizer(wx.VERTICAL) |
1443 main_sizer = wx.BoxSizer(wx.VERTICAL) |
1443 |
1444 |
1444 self.Ticks = numpy.array([]) |
1445 self.Ticks = numpy.array([]) |
1445 self.RangeValues = None |
|
1446 self.StartTick = 0 |
1446 self.StartTick = 0 |
1447 self.Fixed = False |
1447 self.Fixed = False |
1448 self.CursorTick = None |
1448 self.CursorTick = None |
1449 self.DraggingAxesPanel = None |
1449 self.DraggingAxesPanel = None |
1450 self.DraggingAxesBoundingBox = None |
1450 self.DraggingAxesBoundingBox = None |
1462 |
1462 |
1463 self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY) |
1463 self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY) |
1464 self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange) |
1464 self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange) |
1465 graphics_button_sizer.AddWindow(self.CanvasRange, 1, |
1465 graphics_button_sizer.AddWindow(self.CanvasRange, 1, |
1466 border=5, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL) |
1466 border=5, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL) |
|
1467 |
|
1468 self.CanvasRange.Clear() |
|
1469 for text, value in RANGE_VALUES: |
|
1470 self.CanvasRange.Append(text) |
|
1471 self.CanvasRange.SetStringSelection(RANGE_VALUES[6][0]) |
|
1472 self.CurrentRange = RANGE_VALUES[6][1] / self.Ticktime |
1467 |
1473 |
1468 for name, bitmap, help in [ |
1474 for name, bitmap, help in [ |
1469 ("CurrentButton", "current", _("Go to current value")), |
1475 ("CurrentButton", "current", _("Go to current value")), |
1470 ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]: |
1476 ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]: |
1471 button = wx.lib.buttons.GenBitmapButton(self, |
1477 button = wx.lib.buttons.GenBitmapButton(self, |
1513 main_sizer.AddWindow(self.GraphicsWindow, 1, flag=wx.GROW) |
1519 main_sizer.AddWindow(self.GraphicsWindow, 1, flag=wx.GROW) |
1514 |
1520 |
1515 self.GraphicsSizer = wx.BoxSizer(wx.VERTICAL) |
1521 self.GraphicsSizer = wx.BoxSizer(wx.VERTICAL) |
1516 self.GraphicsWindow.SetSizer(self.GraphicsSizer) |
1522 self.GraphicsWindow.SetSizer(self.GraphicsSizer) |
1517 |
1523 |
1518 self.RefreshCanvasRange() |
|
1519 |
|
1520 else: |
1524 else: |
1521 main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) |
1525 main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) |
1522 main_sizer.AddGrowableCol(0) |
1526 main_sizer.AddGrowableCol(0) |
1523 main_sizer.AddGrowableRow(1) |
1527 main_sizer.AddGrowableRow(1) |
1524 |
1528 |
1588 DebugViewer.SetDataProducer(self, producer) |
1592 DebugViewer.SetDataProducer(self, producer) |
1589 |
1593 |
1590 if USE_MPL: |
1594 if USE_MPL: |
1591 if self.DataProducer is not None: |
1595 if self.DataProducer is not None: |
1592 self.Ticktime = self.DataProducer.GetTicktime() |
1596 self.Ticktime = self.DataProducer.GetTicktime() |
1593 self.RefreshCanvasRange() |
1597 else: |
1594 else: |
1598 self.Ticktime = MILLISECOND |
1595 self.Ticktime = 0 |
|
1596 |
1599 |
1597 def RefreshNewData(self, *args, **kwargs): |
1600 def RefreshNewData(self, *args, **kwargs): |
1598 if self.HasNewData or self.Force: |
1601 if self.HasNewData or self.Force: |
1599 self.HasNewData = False |
1602 self.HasNewData = False |
1600 self.RefreshView(only_values=True) |
1603 self.RefreshView(only_values=True) |
1841 def UnregisterObsoleteData(self): |
1844 def UnregisterObsoleteData(self): |
1842 self.SubscribeAllDataConsumers() |
1845 self.SubscribeAllDataConsumers() |
1843 if USE_MPL: |
1846 if USE_MPL: |
1844 if self.DataProducer is not None: |
1847 if self.DataProducer is not None: |
1845 self.Ticktime = self.DataProducer.GetTicktime() |
1848 self.Ticktime = self.DataProducer.GetTicktime() |
1846 self.RefreshCanvasRange() |
|
1847 |
1849 |
1848 for panel in self.GraphicPanels: |
1850 for panel in self.GraphicPanels: |
1849 panel.UnregisterObsoleteData() |
1851 panel.UnregisterObsoleteData() |
1850 if panel.IsEmpty(): |
1852 if panel.IsEmpty(): |
1851 if panel.HasCapture(): |
1853 if panel.HasCapture(): |
1887 self.Freeze() |
1889 self.Freeze() |
1888 self.Table.ResetView(self.VariablesGrid) |
1890 self.Table.ResetView(self.VariablesGrid) |
1889 self.VariablesGrid.RefreshButtons() |
1891 self.VariablesGrid.RefreshButtons() |
1890 self.Thaw() |
1892 self.Thaw() |
1891 |
1893 |
1892 def RefreshCanvasRange(self): |
|
1893 if self.Ticktime == 0 and self.RangeValues != RANGE_VALUES: |
|
1894 self.RangeValues = RANGE_VALUES |
|
1895 self.CanvasRange.Clear() |
|
1896 for text, value in RANGE_VALUES: |
|
1897 self.CanvasRange.Append(text) |
|
1898 self.CanvasRange.SetStringSelection(RANGE_VALUES[0][0]) |
|
1899 self.CurrentRange = RANGE_VALUES[0][1] |
|
1900 self.RefreshView(True) |
|
1901 elif self.Ticktime != 0 and self.RangeValues != TIME_RANGE_VALUES: |
|
1902 self.RangeValues = TIME_RANGE_VALUES |
|
1903 self.CanvasRange.Clear() |
|
1904 for text, value in TIME_RANGE_VALUES: |
|
1905 self.CanvasRange.Append(text) |
|
1906 self.CanvasRange.SetStringSelection(TIME_RANGE_VALUES[0][0]) |
|
1907 self.CurrentRange = TIME_RANGE_VALUES[0][1] / self.Ticktime |
|
1908 self.RefreshView(True) |
|
1909 |
|
1910 def RefreshCanvasPosition(self): |
1894 def RefreshCanvasPosition(self): |
1911 if len(self.Ticks) > 0: |
1895 if len(self.Ticks) > 0: |
1912 pos = int(self.StartTick - self.Ticks[0]) |
1896 pos = int(self.StartTick - self.Ticks[0]) |
1913 range = int(self.Ticks[-1] - self.Ticks[0]) |
1897 range = int(self.Ticks[-1] - self.Ticks[0]) |
1914 else: |
1898 else: |
1965 event.Skip() |
1949 event.Skip() |
1966 |
1950 |
1967 def ChangeRange(self, dir, tick=None): |
1951 def ChangeRange(self, dir, tick=None): |
1968 current_range = self.CurrentRange |
1952 current_range = self.CurrentRange |
1969 current_range_idx = self.CanvasRange.GetSelection() |
1953 current_range_idx = self.CanvasRange.GetSelection() |
1970 new_range_idx = max(0, min(current_range_idx + dir, len(self.RangeValues) - 1)) |
1954 new_range_idx = max(0, min(current_range_idx + dir, len(RANGE_VALUES) - 1)) |
1971 if new_range_idx != current_range_idx: |
1955 if new_range_idx != current_range_idx: |
1972 self.CanvasRange.SetSelection(new_range_idx) |
1956 self.CanvasRange.SetSelection(new_range_idx) |
1973 if self.Ticktime == 0: |
1957 self.CurrentRange = RANGE_VALUES[new_range_idx][1] / self.Ticktime |
1974 self.CurrentRange = self.RangeValues[new_range_idx][1] |
|
1975 else: |
|
1976 self.CurrentRange = self.RangeValues[new_range_idx][1] / self.Ticktime |
|
1977 if len(self.Ticks) > 0: |
1958 if len(self.Ticks) > 0: |
1978 if tick is None: |
1959 if tick is None: |
1979 tick = self.StartTick + self.CurrentRange / 2. |
1960 tick = self.StartTick + self.CurrentRange / 2. |
1980 new_start_tick = tick - (tick - self.StartTick) * self.CurrentRange / current_range |
1961 new_start_tick = tick - (tick - self.StartTick) * self.CurrentRange / current_range |
1981 self.StartTick = self.Ticks[numpy.argmin(numpy.abs(self.Ticks - new_start_tick))] |
1962 self.StartTick = self.Ticks[numpy.argmin(numpy.abs(self.Ticks - new_start_tick))] |
1992 self.StartTick = max(self.Ticks[0], self.Ticks[-1] - self.CurrentRange) |
1973 self.StartTick = max(self.Ticks[0], self.Ticks[-1] - self.CurrentRange) |
1993 self.ForceRefresh() |
1974 self.ForceRefresh() |
1994 |
1975 |
1995 def OnRangeChanged(self, event): |
1976 def OnRangeChanged(self, event): |
1996 try: |
1977 try: |
1997 if self.Ticktime == 0: |
1978 self.CurrentRange = RANGE_VALUES[self.CanvasRange.GetSelection()][1] / self.Ticktime |
1998 self.CurrentRange = self.RangeValues[self.CanvasRange.GetSelection()][1] |
|
1999 else: |
|
2000 self.CurrentRange = self.RangeValues[self.CanvasRange.GetSelection()][1] / self.Ticktime |
|
2001 except ValueError, e: |
1979 except ValueError, e: |
2002 self.CanvasRange.SetValue(str(self.CurrentRange)) |
1980 self.CanvasRange.SetValue(str(self.CurrentRange)) |
2003 wx.CallAfter(self.RefreshRange) |
1981 wx.CallAfter(self.RefreshRange) |
2004 event.Skip() |
1982 event.Skip() |
2005 |
1983 |