Example #1
0
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))
Example #2
0
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)