コード例 #1
0
class Window(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.figure = plt.figure()
        self.axes = self.figure.add_subplot(111)
        # We want the axes cleared every time plot() is called
        self.axes.hold(False)
        self.canvas = FigureCanvas(self.figure)

        self.toolbar = NavigationToolbar(self.canvas, self)
        self.toolbar.hide()

        # Just some button
        self.button1 = QtWidgets.QPushButton('Plot')
        self.button1.clicked.connect(self.plot)

        self.button2 = QtWidgets.QPushButton('Zoom')
        self.button2.clicked.connect(self.zoom)

        self.button3 = QtWidgets.QPushButton('Pan')
        self.button3.clicked.connect(self.pan)

        self.button4 = QtWidgets.QPushButton('Home')
        self.button4.clicked.connect(self.home)

        # set the layout
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)

        btnlayout = QtWidgets.QHBoxLayout()
        btnlayout.addWidget(self.button1)
        btnlayout.addWidget(self.button2)
        btnlayout.addWidget(self.button3)
        btnlayout.addWidget(self.button4)
        qw = QtWidgets.QWidget(self)
        qw.setLayout(btnlayout)
        layout.addWidget(qw)

        self.setLayout(layout)

    def home(self):
        self.toolbar.home()
        self.toolbar.forward()

    def zoom(self):
        self.toolbar.zoom()

    def pan(self):
        self.toolbar.pan()

    def plot(self):
        ''' plot some random stuff '''
        data = [random.random() for i in range(25)]
        self.axes.plot(data, '*-')
        self.canvas.draw()
コード例 #2
0
 def forward(self, *args):
     NavigationToolbar2QT.forward(self, *args)
     self.thinning()
コード例 #3
0
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

        # Init 0 for draw...
        plt.rcParams['agg.path.chunksize'] = 0
        matplotlib.rcParams['agg.path.chunksize'] = 0
        matplotlib.rcParams.update(matplotlib.rc_params())

        self.dpi = 100
        self.signalframe = self.widget_Signal_TimeDomain
        self.figure = Figure((11.3, 6.3), dpi=self.dpi)
        self.canvas = FigureCanvas(self.figure)
        self.canvas.setParent(self.signalframe)
        self.axes = self.figure.add_subplot(111)
        #self.axes.set_title('Signal')
        self.axes.set_xlabel('Time(μs)')
        self.axes.set_ylabel('Voltage')
        #plt.subplots_adjust(left=0.2, bottom=0.2, right=0.8, top=0.8, hspace=0.2, wspace=0.3)

        timespan = self.getRecordLength() * 1024 / self.getSampleRate(
        )  # in us
        x = np.linspace(0, timespan, self.getRecordLength() * 1024)
        normalLimY = self.getVoltageScale() * 10
        self.axes.set_ylim(-normalLimY / 2 + self.getOffset(),
                           normalLimY / 2 + self.getOffset())
        ymajorLocator = MultipleLocator(self.getVoltageScale())
        yminorLocator = MultipleLocator(self.getVoltageScale() / 2)
        self.axes.yaxis.set_major_locator(ymajorLocator)
        self.axes.yaxis.set_minor_locator(yminorLocator)
        self.axes.grid(True)

        self.figure.tight_layout()  # Adjust spaces
        #self.NavToolbar = NavigationToolbar(self.canvas, self.signalframe)
        #self.addToolBar(QtCore.Qt.RightToolBarArea, NavigationToolbar(self.canvas, self.signalframe))
        self.toolbar = NavigationToolbar(self.canvas, self.signalframe)
        self.toolbar.hide()

        # Button slots
        self.pushButton_Home.clicked.connect(self.home)
        self.pushButton_Back.clicked.connect(self.back)
        self.pushButton_Forward.clicked.connect(self.forward)
        self.pushButton_Pan.clicked.connect(self.pan)
        self.pushButton_Zoom.clicked.connect(self.zoom)
        self.pushButton_SavePic.clicked.connect(self.savepic)

        # Init Socket
        self.udpSocketClient = UDPSocketClient()

        # Init FrameNum
        self.checkBox_FrameMode.setEnabled(True)
        self.frameNum = self.getFrameNumber()
        # 0x4
        self.sendCmdFramNum(self.frameNum)

        # Init Length 0x8
        self.comboBox_RecordLength.setCurrentIndex(6)  # 64k
        # Set RecordLength
        self.sendCmdRecordLength(self.getRecordLength() *
                                 self.getFrameNumber())

        #Init Trigger 0x2, bit2
        self.comboBox_TriggerDomain.setCurrentIndex(1)  # External
        self.sendCmdTriggerType(self.getTriggerType())

        # Reset PFGA to read to capture data
        if (self.getTriggerType() == 0):
            self.sendCmdWRREG(0x2, 0x20)
            self.sendCmdWRREG(0x2, 0x28)
        else:
            self.sendCmdWRREG(0xa, 0x0)
            self.sendCmdWRREG(0x2, 0x2c)
            self.sendCmdWRREG(0x2, 0x2d)

        # Read sampleRate
        value = self.readCmdSampleRate()
        if value > 5:
            value = 0
        self.comboBox_SampleRate.setCurrentIndex(value)

        # The last data
        self.lastChAData = []
        self.lastChBData = []

        self.realTimeThread = None
        self.externalTriggerThread = None

    def home(self):
        self.toolbar.home()

    def back(self):
        self.toolbar.back()

    def forward(self):
        self.toolbar.forward()

    def zoom(self):
        self.toolbar.zoom()

    def pan(self):
        self.toolbar.pan()

    def savepic(self):
        self.toolbar.save_figure()

    def sendcommand(self, cmdid, status, msgid, len, type, offset, apiversion,
                    pad, CRC16, cmdData):
        cmdid = struct.pack('H', htons(cmdid))
        status = struct.pack('H', htons(status))
        msgid = struct.pack('H', htons(msgid))
        len = struct.pack('H', htons(len))
        type = struct.pack('H', htons(type))
        offset = struct.pack('H', htons(offset))
        apiversion = struct.pack('B', apiversion)  # 1 Byte unsigned char
        pad = struct.pack('B', pad)  # 1 Byte unsigned char
        CRC16 = struct.pack('H', htons(CRC16))  # 2 Byte unsigned short
        cmdHeader = cmdid + status + msgid + len + type + offset + apiversion + pad + CRC16

        if (cmdData != None):
            self.udpSocketClient.mData = cmdHeader + cmdData
        else:
            self.udpSocketClient.mData = cmdHeader

        self.udpSocketClient.sendData()

    def sendCmdTriggerType(self, value):
        regAddr = 0x2  # 0x2, Bit[2], 0: Auto, 1: External
        currentValue = self.readCmdTriggerType()
        if value == 0:  # Auto Trigger
            mask = 0b1111111111111011
            currentValue = currentValue & mask
        elif value == 1:  # External
            mask = 0b100
            currentValue = currentValue | mask

        self.sendCmdWRREG(regAddr, currentValue)

    def readCmdTriggerType(self):
        print("readCmdTriggerType ")
        self.sendCmdRDREG(0x02, 0x00)
        data = self.udpSocketClient.receiveData()
        value = ntohl(int(struct.unpack('L', data[20:24])[0]))
        return value

    def readDataCount(self):
        self.sendCmdRDREG(0x10, 0x00)
        data = self.udpSocketClient.receiveData()
        data = data[20:24]
        lowValue = ntohl(int(struct.unpack('L', data)[0]))
        print("0x10 Value:", hex(lowValue))
        self.sendCmdRDREG(0x12, 0x00)
        data = self.udpSocketClient.receiveData()
        data = data[20:24]
        highValue = ntohl(int(struct.unpack('L', data)[0]))
        print("0x12 Value:", hex(highValue))
        value = highValue << 16 | lowValue
        return value
        #return 1024

    def sendCmdSampleRate(self, value):
        global gSocketBodySize
        gSocketBodySize = 4
        self.udpSocketClient.setBufSize(gSocketBodySize + gSocketHeaderSize)
        cmdData = struct.pack('L', htonl(value))
        self.sendcommand(0x5a09, 0x0000, 0x5a09, 0x0004, 0x0000, 0x0000, 0x00,
                         0x00, 0x0000, cmdData)
        self.udpSocketClient.receiveData()  # Do nothing

    def readCmdSampleRate(self):
        global gSocketBodySize
        gSocketBodySize = 4
        self.udpSocketClient.setBufSize(gSocketBodySize + gSocketHeaderSize)
        # Len is not cared
        self.sendcommand(0x5a0a, 0x0000, 0x5a0a, 0x0004, 0x0000, 0x0000, 0x00,
                         0x00, 0x0000, None)
        data = self.udpSocketClient.receiveData()
        value = ntohl(int(struct.unpack('L', data[16:20])[0]))
        return value

    def sendCmdRecordLength(self, length):
        #recordLength = self.getRecordLength()
        regAddr = 0x8
        regValue = length
        self.sendCmdWRREG(regAddr, regValue)

    def receiveCmdRecordLength(self):
        global gSocketBodySize
        gSocketBodySize = 8
        self.udpSocketClient.setBufSize(gSocketBodySize + gSocketHeaderSize)
        self.udpSocketClient.receiveData()  # Do nothing

    def sendCmdRAW_AD_SAMPLE(self, length):
        #print (sys._getframe().f_code.co_name)
        global gSocketBodySize
        gSocketBodySize = length * 1024
        self.udpSocketClient.setBufSize(gSocketBodySize + gSocketHeaderSize)
        len = 0  #self.getRecordLength()
        self.sendcommand(0x5a04, 0x0000, 0x5a04, len, 0x0000, 0x0000, 0x00,
                         0x00, 0x0000, None)

    def receiveCmdRAW_AD_SAMPLE(self, length):
        global gSocketBodySize
        gSocketBodySize = length * 1024
        self.udpSocketClient.setBufSize(gSocketBodySize + gSocketHeaderSize)
        self.udpSocketClient.receiveData()

    def sendCmdFramNum(self, frameNum):
        if (frameNum <= 2**16 - 1):
            regAddr = 0x4
            regValue = frameNum
            self.sendCmdWRREG(regAddr, regValue)
        else:
            # Low
            regAddr = 0x4
            regValue = frameNum & (2**16 - 1)
            self.sendCmdWRREG(regAddr, regValue)
            # High
            regAddr = 0x6
            regValue = frameNum >> 16
            self.sendCmdWRREG(regAddr, regValue)

    def sendCmdWRREG(self, regAddress, regValue):
        #print (sys._getframe().f_code.co_name)
        global gSocketBodySize
        gSocketBodySize = 8
        self.udpSocketClient.setBufSize(gSocketBodySize + gSocketHeaderSize)
        cmdData = struct.pack('L', htonl(regAddress)) + struct.pack(
            'L', htonl(regValue))
        self.sendcommand(0x5a02, 0x0000, 0x5a02, 0x0008, 0x0000, 0x0000, 0x00,
                         0x00, 0x0000, cmdData)
        self.udpSocketClient.receiveData()  # Do nothing

    def sendCmdRDREG(self, regAddress, regValue):
        #print (sys._getframe().f_code.co_name)
        global gSocketBodySize
        gSocketBodySize = 8
        self.udpSocketClient.setBufSize(gSocketBodySize + gSocketHeaderSize)
        cmdData = struct.pack('L', htonl(regAddress)) + struct.pack(
            'L', htonl(regValue))
        self.sendcommand(0x5a01, 0x0000, 0x5a01, 0x0008, 0x0000, 0x0000, 0x00,
                         0x00, 0x0000, cmdData)

    def getTriggerType(self):
        index = self.comboBox_TriggerDomain.currentIndex()
        return int(index)

    def getSampleRate(self):
        index = self.comboBox_SampleRate.currentText()
        return int(index)

    def getRecordLength(self):
        index = self.comboBox_RecordLength.currentIndex()
        if (index == 18):
            return 40
        else:
            return 2**index

    def getVoltageScale(self):
        volScale = 200
        volScaleStr = self.lineEdit_VolScale.text()
        volScale = 200
        if (('-') == volScaleStr or "" == volScaleStr):
            volScale = 200
        else:
            volScale = int(volScaleStr)

        return volScale

    def getOffset(self):
        offset = 0
        offsetStr = self.lineEdit_Offset.text()
        if (('-') == offsetStr or "" == offsetStr):
            offset = 0
        else:
            offset = int(offsetStr)

        return offset

    def getFrameNumber(self):
        if (self.checkBox_FrameMode.isChecked()
                and self.checkBox_FrameMode.isEnabled()):
            return int(self.lineEdit_FrameNum.text())
        else:
            return 1

    @pyqtSlot()
    def on_pushButton_Stop_TimeDomain_clicked(self):
        """
        Slot documentation goes here.
        """
        if self.realTimeThread != None:
            self.realTimeThread.stop()
        if self.externalTriggerThread != None:
            self.externalTriggerThread.stop()

        self.pushButton_Start_TimeDomain.setEnabled(True)
        self.pushButton_Stop_TimeDomain.setEnabled(False)
        self.pushButton_Save_TimeDomain.setEnabled(True)
        self.comboBox_RecordLength.setEnabled(True)

        # Disable them for zhengzhou
        self.comboBox_SampleRate.setEnabled(True)
        self.comboBox_TriggerDomain.setEnabled(True)

        self.lineEdit_FrameNum.setEnabled(True)

    @pyqtSlot()
    def on_pushButton_Start_TimeDomain_clicked(self):
        """
        Slot documentation goes here.
        """
        # Restart LCD display
        self.lcdNumber_FrameNum.display(0)
        self.pushButton_Start_TimeDomain.setEnabled(False)
        self.pushButton_Stop_TimeDomain.setEnabled(True)
        self.pushButton_Save_TimeDomain.setEnabled(False)
        self.comboBox_RecordLength.setEnabled(False)
        self.comboBox_SampleRate.setEnabled(False)
        self.comboBox_TriggerDomain.setEnabled(False)
        self.lineEdit_FrameNum.setEnabled(False)

        if self.getTriggerType() == 0:  # Auto Trigger Type
            self.realTimeThread = RealTimeThread(
                self.axes, self.canvas, self.radioButton_CHA.isChecked(), 1.0,
                False)
            self.realTimeThread.setDaemon(True)
            self.realTimeThread.start()
        elif self.getTriggerType() == 1:  # External Trigger Type
            self.externalTriggerThread = RealTimeThread(
                self.axes, self.canvas, self.radioButton_CHA.isChecked(), 1.0,
                True)
            self.externalTriggerThread.setDaemon(True)
            self.externalTriggerThread.start()

    @pyqtSlot()
    def on_pushButton_Save_TimeDomain_clicked(self):
        """
        Slot documentation goes here.
        """
        # Write into file
        now = datetime.datetime.now()
        currentTime = now.strftime('%Y-%m-%d-%H-%M-%S')
        if (len(self.lastChAData) == 1):
            FileName_CHA = "ChA-" + currentTime + ".txt"
            File_CHA = open(FileName_CHA, 'w')
            FileName_CHB = "ChB-" + currentTime + ".txt"
            File_CHB = open(FileName_CHB, 'w')

            for pos in range(0, len(self.lastChAData[0])):
                File_CHA.write(str(self.lastChAData[0][pos]))
                File_CHA.write('\n')
                File_CHB.write(str(self.lastChBData[0][pos]))
                File_CHB.write('\n')

            File_CHA.close()
            File_CHB.close()
        else:
            for fileIndex in range(0, len(self.lastChAData)):
                FileName_CHA = "ChA-" + currentTime + "-" + str(fileIndex +
                                                                1) + ".txt"
                File_CHA = open(FileName_CHA, 'w')
                FileName_CHB = "ChB-" + currentTime + "-" + str(fileIndex +
                                                                1) + ".txt"
                File_CHB = open(FileName_CHB, 'w')

                for pos in range(0, len(self.lastChAData[fileIndex])):
                    File_CHA.write(str(self.lastChAData[fileIndex][pos]))
                    File_CHA.write('\n')
                    File_CHB.write(str(self.lastChBData[fileIndex][pos]))
                    File_CHB.write('\n')

                File_CHA.close()
                File_CHB.close()

        # Do not clear it
        #self.lastChAData = []
        #self.lastChBData = []

    @pyqtSlot(int)
    def on_comboBox_TriggerDomain_currentIndexChanged(self, index):

        self.sendCmdTriggerType(index)

        # Enable/Disable Frame Mode
        if index == 1:
            self.checkBox_FrameMode.setEnabled(True)
            self.label_FrameNum.setEnabled(True)
            self.lineEdit_FrameNum.setEnabled(True)
            self.label_FrameNum_Current.setEnabled(True)
            self.lcdNumber_FrameNum.setEnabled(True)
        else:
            self.checkBox_FrameMode.setEnabled(False)
            self.label_FrameNum.setEnabled(False)
            self.lineEdit_FrameNum.setEnabled(False)
            self.label_FrameNum_Current.setEnabled(False)
            self.lcdNumber_FrameNum.setEnabled(False)

        # Restor RecordLength
        self.sendCmdRecordLength(self.getRecordLength() *
                                 self.getFrameNumber())

    @pyqtSlot(int)
    def on_comboBox_SampleRate_currentIndexChanged(self, index):
        if index > -1:
            self.sendCmdSampleRate(index)

    @pyqtSlot(int)
    def on_comboBox_RecordLength_currentIndexChanged(self, index):
        if (index == 18):  # this is 40k
            self.sendCmdRecordLength(40 * self.getFrameNumber())
        else:
            self.sendCmdRecordLength((2**index) * self.getFrameNumber())

    @pyqtSlot()
    def on_lineEdit_FrameNum_editingFinished(self):
        self.frameNum = int(self.lineEdit_FrameNum.text())
        self.sendCmdFramNum(self.frameNum)
        self.sendCmdRecordLength(self.getRecordLength() * self.frameNum)

    @pyqtSlot(bool)
    def on_checkBox_FrameMode_clicked(self, checked):
        """
        Slot documentation goes here.
        
        @param checked DESCRIPTION
        @type bool
        """
        # Set recordLength value to register
        self.frameNum = self.getFrameNumber()
        self.sendCmdFramNum(self.frameNum)
        self.sendCmdRecordLength(self.getRecordLength() * self.frameNum)