美文网首页
基于的matplotlib的采集数据显示

基于的matplotlib的采集数据显示

作者: ww4u | 来源:发表于2018-07-03 19:10 被阅读0次
  • 数据采集的显示需要:
    • 数据格式不同:解析格式
    • 支持缩放,平移等
    • 图片导出
    • 丰富的展示方式
  • 很自然地,从头开发是一个很LOW的选择,借助开源的力量和开放的环境,利用成熟的部分进行堆叠开发
  • 技术栈
    • MISA
    • matplotlib
    • pyqt
    • python
  • matplotlib可以集成到QT中
  • 很自然,和流畅的实现。开放合作才能共赢。
    不要将有限的生命耗费在重复的事情上面
    采集显示
  • 代码量?<300行
import sys
import time

import numpy as np

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

import mrq 
import mrq.MRQ 

import datetime
import time

from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
if is_pyqt5():
    from matplotlib.backends.backend_qt5agg import (
        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
else:
    from matplotlib.backends.backend_qt4agg import (
        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure

class TestItem():
    def __init__(self, deviceName = "", dev=None, ch=0, item = ""):
        self.mCache = 1024

        self.mDeviceName = deviceName 
        self.mHandle = dev
        self.mCH = ch
        self.mItem = item

        self.mInfo=""
        self.mName=""
        self.mT =[]

        self.mSubNames=[]
        self.mSubVals=[ ]

    def setItem( self, dev, ch, item ):
        self.mDev = dev 
        self.mCH = ch 
        self.mItem = item

    def setName( self, n ):
        self.mName = n         
    def name( self ):
        return self.mName 
    def setInfo( self, inf ):
        self.mInfo = inf 
    def info( self ):
        return self.mInfo    

    def shift( self, ary ):
        vecLen = len( ary )
        if ( vecLen >= self.mCache ):
            ary = ary[ vecLen - self.mCache + 1 : ]

    def sampleProc( self ):
        if ( self.mHandle != None and len(self.mItem) > 0 ):
            pass 
        else:
            return 

        ret, val = self.mHandle.getREPORT_DATA( self.mCH, self.mItem )                    
        if ( ret == 0 ):
            self.deParseProc( val )
            self.mT.append( datetime.datetime.now() )
            
    def deParseProc( self, val ):
        if ( self.mItem == "TORQUE" ):
            # the first time
            if ( len(self.mSubNames) < 1 ):
                self.mSubNames.append( "SG" )
                self.mSubNames.append( "SE" )

                self.mSubVals.append( [ (val >> 8) & 0xff ] )
                self.mSubVals.append( [ (val >> 0) & 0xff ] )
            else:
                
                self.shift( self.mSubVals[0] )
                self.shift( self.mSubVals[1] )

                self.mSubVals[0].append( (val >> 8) & 0xff )
                self.mSubVals[1].append( (val >> 0) & 0xff )
        else:
            if ( len(self.mSubNames) < 1 ):
                self.mSubNames.append( "" )
                self.mSubVals.append( [ val ] )
            else:
                self.shift( self.mSubVals[0] )
                self.mSubVals[0].append( val )

class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(ApplicationWindow, self).__init__()
        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)
        layout = QtWidgets.QVBoxLayout(self._main)

        dynamic_canvas = FigureCanvas(Figure(figsize=(5, 3)))
        layout.addWidget(dynamic_canvas)

        # for ui
        self.ui_deviceCombox = QtWidgets.QComboBox() 
        self.ui_chCombox = QtWidgets.QComboBox()
        self.ui_itemCombox = QtWidgets.QComboBox()

        layout.addWidget( self.ui_deviceCombox )
        layout.addWidget( self.ui_chCombox )
        layout.addWidget( self.ui_itemCombox )

        hLayout = QtWidgets.QHBoxLayout()
        layout.addLayout( hLayout )
        self.ui_btnAdd = QtWidgets.QToolButton()
        self.ui_btnDel = QtWidgets.QToolButton()
        self.ui_btnStart = QtWidgets.QToolButton()
        self.ui_btnStop = QtWidgets.QToolButton() 

        hLayout.addWidget(self.ui_btnAdd)
        hLayout.addWidget(self.ui_btnDel)
        hLayout.addWidget(self.ui_btnStart)
        hLayout.addWidget(self.ui_btnStop)

        self.addToolBar( NavigationToolbar(dynamic_canvas, self) )

        self._dynamic_ax = dynamic_canvas.figure.subplots()
        # self._dynamic_ax = dynamic_canvas.figure()
        self._timer = dynamic_canvas.new_timer(
            1000, [(self._update_canvas, (), {})])
        # self._timer.start()

        # member
        self.setupMembers()

        # setup
        self.setupUi( None )

        # build connection
        self.buildConnection()

    def setupMembers( self ):
        self.m_items = []
        self.m_datas = []
        self.m_devices={}   # deviceName: dev

    def setupUi( self, dev ):
        self.ui_deviceCombox.addItem( "device1" )
        self.ui_deviceCombox.addItem( "device2" )

        self.ui_chCombox.addItem( "CH1" )
        self.ui_chCombox.addItem( "CH2" )
        self.ui_chCombox.addItem( "CH3" )
        self.ui_chCombox.addItem( "CH4" )

        self.ui_itemCombox.addItem("TORQUE")

        self.ui_btnAdd.setText( "Add" )
        self.ui_btnDel.setText( "Remove" )
        self.ui_btnStart.setText("Start")
        self.ui_btnStop.setText("Stop")

    def buildConnection( self ):
        self.ui_btnAdd.clicked.connect( self.onAddClicked )
        self.ui_btnDel.clicked.connect( self.onDelClicked )
        self.ui_btnStart.clicked.connect( self.onStartClicked )
        self.ui_btnStop.clicked.connect( self.onStopClicked )

    def findItem( self, deviceName, ch, item ):
        for item in self.m_items:
            if ( item.mDeviceName == deviceName and item.mCH == ch and item.mItem == item ):
                return item
        return None                             

    def addItem( self, deviceName, handle, ch, item ):
        # check exist
        if ( self.findItem( deviceName, ch, item ) ):
            return  
        else:
            pass 

        # add item 
        self.m_items.append( TestItem( deviceName, handle, ch, item) )                        

    def delItem( self, deviceName, ch, item ):
        item = self.findItem( deviceName, ch, item )
        if ( item != None ):
            self.m_items.remove( item )

    def lutDevice( self, deviceName ):
        # device ready
        if ( deviceName in self.m_devices.keys() ):
            return self.m_devices[ deviceName ]

        # open device 
        self.m_devices[ deviceName ] = mrq.MRQ.MRQ( deviceName )
        return self.m_devices[ deviceName ]            

    def onAddClicked( self ):
        selDevice = self.lutDevice( self.ui_deviceCombox.currentText() )
        self.addItem( self.ui_deviceCombox.currentText(),
                      selDevice, 
                      self.ui_chCombox.currentIndex(), 
                      self.ui_itemCombox.currentText() )

    def onDelClicked( self ):
        self.delItem( self.ui_deviceCombox.currentText(),
                      self.ui_chCombox.currentIndex(),
                      self.ui_itemCombox.currentText()  )

    def onStartClicked( self ):
        self._timer.start()
        self.ui_btnStart.setEnabled( False )
        self.ui_btnStop.setEnabled( True )

    def onStopClicked( self ):
        self._timer.stop()
        self.ui_btnStart.setEnabled( True )
        self.ui_btnStop.setEnabled( False )

    def _update_canvas(self):
        self._dynamic_ax.clear()
        self.sampleProc()
        self.updatePlot()

    def sampleProc( self ):
        # sample
        for subItem in self.m_items:
            subItem.sampleProc( )           

    def updatePlot( self ):
        for subItem in self.m_items:
            for i in range( 0, len( subItem.mSubVals) ):
                self._dynamic_ax.plot(  ( subItem.mT ), 
                                        ( subItem.mSubVals[i] ),
                                        ".", 
                                        label="%s.CH%d.%s.%s" % ( subItem.mDeviceName, subItem.mCH, subItem.mItem, subItem.mSubNames[i] ) )
                self._dynamic_ax.legend()

        self._dynamic_ax.figure.canvas.draw() 

if __name__ == "__main__":
    qapp = QtWidgets.QApplication(sys.argv)
    app = ApplicationWindow()
    app.show()
    app.setWindowTitle( "Mega Plot" )
    qapp.exec_()

相关文章

网友评论

      本文标题:基于的matplotlib的采集数据显示

      本文链接:https://www.haomeiwen.com/subject/vwmjuftx.html