# HG changeset patch # User laurent # Date 1329261905 -3600 # Node ID f2325ebd67f4a51e2f66a1dc7bbe3d0f7215ac60 # Parent e9295622ce9b44f146cd9ff0c714f3cb836fd68b Fixed wrong time scale in debug graph display when some samples are missed diff -r e9295622ce9b -r f2325ebd67f4 GraphicViewer.py --- a/GraphicViewer.py Tue Feb 07 19:12:25 2012 +0100 +++ b/GraphicViewer.py Wed Feb 15 00:25:05 2012 +0100 @@ -24,6 +24,7 @@ import wx import wx.lib.plot as plot +import numpy from graphics.GraphicCommons import DebugViewer from controls import EditorPanel @@ -156,7 +157,9 @@ self.RangeValues = None self.Datas = [] - self.CurrentValue = 0 + self.StartValue = 0 + self.EndValue = 0 + self.Fixed = False self.Ticktime = self.DataProducer.GetTicktime() self.RefreshCanvasRange() @@ -173,13 +176,15 @@ def ResetView(self): self.Datas = [] - self.CurrentValue = 0 + self.StartValue = 0 + self.EndValue = 0 + self.Fixed = False self.Ticktime = self.DataProducer.GetTicktime() self.RefreshCanvasRange() self.RefreshView() - def RefreshNewData(self): - self.RefreshView(False) + def RefreshNewData(self, *args, **kwargs): + self.RefreshView(*args, **kwargs) DebugViewer.RefreshNewData(self) def RefreshCanvasRange(self): @@ -202,23 +207,18 @@ def RefreshView(self, force=True): self.Freeze() - if force or self.CurrentValue + self.CurrentRange == len(self.Datas) or self.CurrentValue + len(self.Datas) < self.CurrentRange: + if force or not self.Fixed: var_name = self.InstancePath.split(".")[-1] - self.VariableGraphic = plot.PolyLine(self.Datas[self.CurrentValue:self.CurrentValue + self.CurrentRange], + self.VariableGraphic = plot.PolyLine(self.Datas[self.StartValue:self.EndValue + 1], legend=var_name, colour=colours[0]) self.GraphicsObject = plot.PlotGraphics([self.VariableGraphic], _("%s Graphics") % var_name, _("Tick"), _("Values")) datas_length = len(self.Datas) if datas_length > 1: - start = self.Datas[self.CurrentValue][0] - if self.CurrentValue + self.CurrentRange > datas_length: - end = start + (self.Datas[datas_length - 1][0] - start) * self.CurrentRange / (datas_length - self.CurrentValue - 1) - else: - end = self.Datas[self.CurrentValue + self.CurrentRange - 1][0] + start = self.Datas[self.StartValue][0] else: start = 0. - end = 25. - self.Canvas.Draw(self.GraphicsObject, xAxis=(start, end)) + self.Canvas.Draw(self.GraphicsObject, xAxis=(start, start + self.CurrentRange)) self.RefreshScrollBar() self.Thaw() @@ -228,14 +228,31 @@ def IsViewing(self, tagname): return self.InstancePath == tagname + def GetNearestData(self, tick, adjust): + ticks = numpy.array(zip(*self.Datas)[0]) + new_cursor = numpy.argmin(abs(ticks - tick)) + if adjust == -1 and ticks[new_cursor] > tick and new_cursor > 0: + new_cursor -= 1 + elif adjust == 1 and ticks[new_cursor] < tick and new_cursor < len(self.Datas): + new_cursor += 1 + return new_cursor + def NewValue(self, tick, value, forced=False): self.Datas.append((float(tick), {True:1., False:0.}.get(value, float(value)))) - if self.CurrentValue + self.CurrentRange == len(self.Datas) - 1: - self.CurrentValue += 1 + if not self.Fixed: + while int(self.Datas[self.StartValue][0]) < tick - self.CurrentRange: + self.StartValue += 1 + self.EndValue += 1 self.NewDataAvailable() def RefreshScrollBar(self): - self.CanvasPosition.SetScrollbar(self.CurrentValue, self.CurrentRange, len(self.Datas), self.CurrentRange) + if len(self.Datas) > 0: + pos = int(self.Datas[self.StartValue][0] - self.Datas[0][0]) + range = int(self.Datas[-1][0] - self.Datas[0][0]) + else: + pos = 0 + range = 0 + self.CanvasPosition.SetScrollbar(pos, self.CurrentRange, range, self.CurrentRange) def OnRangeChanged(self, event): old_range = self.CurrentRange @@ -246,22 +263,33 @@ self.CurrentRange = self.RangeValues_dict[self.CanvasRange.GetValue()] / self.Ticktime except ValueError, e: self.CanvasRange.SetValue(str(self.CurrentRange)) - self.CurrentValue = max(0, min(self.CurrentValue + old_range - self.CurrentRange, - len(self.Datas) - self.CurrentRange)) - self.RefreshView() + if self.Fixed and self.Datas[-1][0] - self.Datas[0][0] < self.CurrentRange: + self.Fixed = False + if self.Fixed: + self.StartValue = min(self.StartValue, self.GetNearestData(self.Datas[-1][0] - self.CurrentRange, -1)) + self.EndValue = self.GetNearestData(self.StartValue + self.CurrentRange, 1) + else: + self.StartValue = self.GetNearestData(self.Datas[-1][0] - self.CurrentRange - 1, -1) + self.EndValue = len(self.Datas) - 1 + self.NewDataAvailable(True) event.Skip() def OnPositionChanging(self, event): - self.CurrentValue = event.GetPosition() - self.RefreshView() + self.StartValue = self.GetNearestData(self.Datas[0][0] + event.GetPosition(), -1) + self.EndValue = self.GetNearestData(self.Datas[self.StartValue][0] + self.CurrentRange, 1) + self.Fixed = True + self.NewDataAvailable(True) event.Skip() def OnResetButton(self, event): - self.ResetView() + self.Fixed = False + self.ResteView() event.Skip() def OnCurrentButton(self, event): - self.CurrentValue = max(0, len(self.Datas) - self.CurrentRange) - self.RefreshView() - event.Skip() - + self.StartValue = self.GetNearestData(self.Datas[-1][0] - self.CurrentRange, -1) + self.EndValue = self.GetNearestData(self.Datas[self.StartValue][0] + self.CurrentRange, 1) + self.Fixed = False + self.NewDataAvailable(True) + event.Skip() +