class PlotTest(QtGui.QWidget): def __init__(self): super(PlotTest, self).__init__() self.timer = QtCore.QTimer() self.timer.setInterval(10) self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.adddata) self.initUI() def initUI(self): #QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10)) self.fp = PlotWidget(title="A nice test plot") self.cosDataSet = PlotDataSet("Graph showing cos", QtCore.Qt.black, [180, -180]) self.sinDataSet = PlotDataSet("One showing sin", QtCore.Qt.blue, [180, -180]) self.negcosDataSet = PlotDataSet("Another one showing -cos", QtCore.Qt.green, [180, -180]) self.negsinDataSet = PlotDataSet("And the last one showing -sin", QtCore.Qt.magenta, [180, -180]) self.fp.addDataset(self.cosDataSet) self.fp.addDataset(self.sinDataSet) self.fp.addDataset(self.negcosDataSet) self.fp.addDataset(self.negsinDataSet) self.setGeometry(100, 100, 800, 500) self.setWindowTitle('FastPlotTest') layout = QtGui.QGridLayout(self) layout.addWidget(self.fp) self.setLayout(layout) self.show() self.timer.start() self.mod = 0.0 def adddata(self): self.mod = self.mod + 0.01 if (self.mod > math.pi): self.mod = -math.pi self.cosDataSet.addData(360 * math.cos(self.mod)) self.sinDataSet.addData(180 * math.sin(self.mod)) self.negcosDataSet.addData(-180 * math.cos(self.mod)) self.negsinDataSet.addData(-180 * math.sin(self.mod))
class PlotTab(Tab, plot_tab_class): """Tab for plotting logging data""" logDataSignal = pyqtSignal(object) colors = [ QtCore.Qt.green, QtCore.Qt.blue, QtCore.Qt.magenta, QtCore.Qt.red, QtCore.Qt.black ] dsList = [] connectedSignal = pyqtSignal(str) def __init__(self, tabWidget, helper, *args): super(PlotTab, self).__init__(*args) self.setupUi(self) self.tabName = "Plotter" self.menuName = "Plotter" self.previousLog = None self.dsList = helper.logConfigReader.getLogConfigs() self.plot = PlotWidget(fps=50) self.dataSelector.currentIndexChanged.connect(self.newLogSetupSelected) self.logDataSignal.connect(self.logDataReceived) self.tabWidget = tabWidget self.helper = helper # self.layout().addWidget(self.dataSelector) self.plotLayout.addWidget(self.plot) # Connect external signals self.helper.cf.connectSetupFinished.add_callback( self.connectedSignal.emit) self.connectedSignal.connect(self.connected) self.datasets = [] self.logEntrys = [] self.plot.saveToFileSignal.connect(self.saveToFile) self.plot.stopSavingSignal.connect(self.savingStopped) self.saveFile = None def saveToFile(self): filename = "%s-%s" % (datetime.datetime.now(), self.dataSelector.currentText()) logger.info("Saving logdata to [%s]", filename) self.saveFile = open(filename, 'w') s = "" for v in self.dsList[self.dataSelector.currentIndex()].getVariables(): s += v.getName() + "," s += '\n' self.saveFile.write(s) self.plot.isSavingToFile() def savingStopped(self): self.saveFile.close() logger.ionfo("Stopped saving logdata") self.saveFile = None def newLogSetupSelected(self, item): if (len(self.logEntrys) > 0): log = self.logEntrys[item] if (self.previousLog != None): self.previousLog.stop() log.start() self.previousLog = log # Setup the plot self.plot.removeAllDatasets() self.datasets = [] colorSelector = 0 info = self.dsList[self.dataSelector.currentIndex()] self.plot.setTitle(info.getName()) minVal = info.getDataRangeMin() maxVal = info.getDataRangeMax() for d in info.getVariables(): ds = PlotDataSet(d.getName(), self.colors[colorSelector], [minVal, maxVal]) self.datasets.append(ds) self.plot.addDataset(ds) colorSelector += 1 pprint(ds) if (self.saveFile != None): self.plot.stopSaving() def loggingError(self, err): logger.warning("logging error: %s", err) def connected(self, link): self.logEntrys = [] self.dataSelector.clear() for d in self.dsList: logEntry = self.helper.cf.log.create_log_packet(d) if (logEntry != None): self.dataSelector.addItem(d.getName()) self.logEntrys.append(logEntry) logEntry.dataReceived.add_callback(self.logDataSignal.emit) logEntry.error.add_callback(self.loggingError) else: logger.warning("Could not setup log configuration!") # TODO: Make this pretty ? if (len(self.logEntrys) > 0): # self.newLogSetupSelected(self.dataSelector.currentIndex()) self.dataSelector.currentIndexChanged.emit(0) def logDataReceived(self, data): try: dataIndex = 0 s = "" for d in data: self.datasets[dataIndex].addData(data[d]) s += str(data[d]) + "," dataIndex += 1 s += '\n' if (self.saveFile != None): self.saveFile.write(s) except Exception as e: # When switching what to log we might still get logging packets... # and that will not be pretty so let's just ignore the probolem ;-) logger.warning("Exception for plot data: %s", e)
class PlotTab(Tab, plot_tab_class): """Tab for plotting logging data""" logDataSignal = pyqtSignal(object) colors = [QtCore.Qt.green, QtCore.Qt.blue, QtCore.Qt.magenta, QtCore.Qt.red, QtCore.Qt.black] dsList = [] connectedSignal = pyqtSignal(str) def __init__(self, tabWidget, helper, *args): super(PlotTab, self).__init__(*args) self.setupUi(self) self.tabName = "Plotter" self.menuName = "Plotter" self.previousLog = None self.dsList = helper.logConfigReader.getLogConfigs() self.plot = PlotWidget(fps=50) self.dataSelector.currentIndexChanged.connect(self.newLogSetupSelected) self.logDataSignal.connect(self.logDataReceived) self.tabWidget = tabWidget self.helper = helper #self.layout().addWidget(self.dataSelector) self.plotLayout.addWidget(self.plot) # Connect external signals self.helper.cf.connectSetupFinished.add_callback(self.connectedSignal.emit) self.connectedSignal.connect(self.connected) self.datasets = [] self.logEntrys = [] self.plot.saveToFileSignal.connect(self.saveToFile) self.plot.stopSavingSignal.connect(self.savingStopped) self.saveFile = None def saveToFile(self): filename = "%s-%s" % (datetime.datetime.now(), self.dataSelector.currentText()) logger.info("Saving logdata to [%s]", filename) self.saveFile = open(filename, 'w') s = "" for v in self.dsList[self.dataSelector.currentIndex()].getVariables(): s += v.getName() + "," s += '\n' self.saveFile.write(s) self.plot.isSavingToFile() def savingStopped(self): self.saveFile.close() logger.ionfo("Stopped saving logdata") self.saveFile = None def newLogSetupSelected(self, item): if (len(self.logEntrys) > 0): log = self.logEntrys[item] if (self.previousLog != None): self.previousLog.stop() log.start() self.previousLog = log # Setup the plot self.plot.removeAllDatasets() self.datasets = [] colorSelector = 0 info = self.dsList[self.dataSelector.currentIndex()] self.plot.setTitle(info.getName()) minVal = info.getDataRangeMin() maxVal = info.getDataRangeMax() for d in info.getVariables(): ds = PlotDataSet(d.getName(), self.colors[colorSelector], [minVal, maxVal]) self.datasets.append(ds) self.plot.addDataset(ds) colorSelector += 1 pprint(ds) if (self.saveFile != None): self.plot.stopSaving() def loggingError(self, err): logger.warning("logging error: %s", err) def connected(self, link): self.logEntrys = [] self.dataSelector.clear() for d in self.dsList: logEntry = self.helper.cf.log.create_log_packet(d) if (logEntry != None): self.dataSelector.addItem(d.getName()) self.logEntrys.append(logEntry) logEntry.dataReceived.add_callback(self.logDataSignal.emit) logEntry.error.add_callback(self.loggingError) else: logger.warning("Could not setup log configuration!") # TODO: Make this pretty ? if (len(self.logEntrys) > 0): #self.newLogSetupSelected(self.dataSelector.currentIndex()) self.dataSelector.currentIndexChanged.emit(0) def logDataReceived(self, data): try: dataIndex = 0 s = "" for d in data: self.datasets[dataIndex].addData(data[d]) s += str(data[d]) + "," dataIndex += 1 s += '\n' if (self.saveFile != None): self.saveFile.write(s) except Exception as e: # When switching what to log we might still get logging packets... and # that will not be pretty so let's just ignore the probolem ;-) logger.warning("Exception for plot data: %s", e)