0

I am using Python, PyQt5, QThread. İ have GUİ which displays registered objects from sensor. Connection scheme - sensor + Arduino + PC.

import serial
import glob
import datetime
# from serial import Serial
import sys

from PyQt5.QtWidgets import (QDialog, QApplication, QWidget, QPushButton,
                             QComboBox, QVBoxLayout, QCheckBox, QLCDNumber,
                             QSlider, QProgressBar, QHBoxLayout, QLabel)
from PyQt5 import QtCore
from PyQt5.QtCore import QThread, pyqtSignal, QTimer

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt

timespan = 10000
load = [0] * timespan
production = [0] * timespan
pdc = [0] * timespan


class WorkerThread(QThread):
    # mysignal_i=pyqtSignal( int, name='Signal_i') ### 1) declare the signal
    measurements_signals = pyqtSignal(int, float, name='m_signals')

    def __init__(self, parent=None):
        QThread.__init__(self)


    def run(self):
        print('reading')
        a = 100  # 
        fq = [0] * a
        tot = 0
        sum = 0
        v = 0.0
        ser = serial.Serial(
            port='COM4',  # use "dmesg | grep tty" to find out the port
            baudrate=9600,
            bytesize=serial.EIGHTBITS,
            parity=serial.PARITY_NONE,
            stopbits=serial.STOPBITS_ONE
        )
        while ser.isOpen():

            c = ser.readline().decode('ASCII')
            if c == '':
                pass
            else:
                i = int(c)
                sum -= fq[0]
                for j in range(1, a):
                    fq[j - 1] = fq[j]
                tot += i
                fq[a - 1] = i * 10
                sum += fq[a - 1]
                v = float(sum) / a
                self.measurements_signals.emit(int(tot), float(v))

        ser.close()
    def pause(self):
        self.sleep(10)
        print('sleep')
    def stop(self):
        # self.ser.close()
        self.terminate()
        print("stop")

class Window(QWidget):
    def __init__(self, parent=None):

        super(Window, self).__init__(parent)
        self.setGeometry(100, 100, 300, 200)  # pos pos width height

        self.PortLabel = QLabel("Port:")
        self.LabelProd = QLabel("Total:")
        self.LabelLoad = QLabel("Frequency:")

        port_selectBox = QComboBox(self)
        ports = self.available_serial_ports()

        for port in ports:
            port_selectBox.addItem(port)

        self.buttonConnect = QPushButton('Start')
        self.buttonPause = QPushButton('Pause')
        self.buttonStop = QPushButton('Stop')

        self.lcdProd = QLCDNumber(self)
        self.lcdLoad = QLCDNumber(self)
        self.lcdProd.setFixedHeight(100)
        self.lcdLoad.setFixedHeight(100)

        self.figure_timeseries = plt.figure()

        self.canvas_timeseries = FigureCanvas(self.figure_timeseries)
        # --------------------------- Layout

        col1 = QVBoxLayout()
        col1.addWidget(self.PortLabel)
        col1.addWidget(port_selectBox)
        col1.addWidget(self.buttonConnect)
        col1.addWidget(self.buttonPause)
        col1.addWidget(self.buttonStop)


        col2 = QVBoxLayout()
        col2.addWidget(self.LabelProd)
        col2.addWidget(self.lcdProd)
        col2.addWidget(self.LabelLoad)
        col2.addWidget(self.lcdLoad)

        toprow = QHBoxLayout()
        toprow.addLayout(col1)
        toprow.addLayout(col2)

        layout = QVBoxLayout()
        layout.addLayout(toprow)
        layout.addWidget(self.canvas_timeseries)

        self.setLayout(layout)

        # --------------------------------------
        self.wt = WorkerThread()  # This is the thread object
        self.buttonConnect.clicked.connect(self.wt.start)
        # Connect the signal from the thread to the slot_method
        self.wt.measurements_signals.connect(self.slot_method)  ### 3) connect to the slot

        self.buttonPause.clicked.connect(self.wt.pause)
        self.buttonStop.clicked.connect(self.wt.stop)


        timespan = 600
        load = [0] * timespan
        production = [550] * timespan
        pdc = [0] * timespan

    def slot_method(self, p, l):
        print("p =", p)
        print('l =', l)
        self.lcdProd.display(p)
        self.lcdLoad.display(l)
        self.update_chart_timeseries(p, l)

    def update_chart_timeseries(self, produzione, carico):  # time series
        # load.pop(0)
        # load.append(carico)
        production.pop(0)
        production.append(produzione)

        self.figure_timeseries.clear() 
        plt.figure(num=self.figure_timeseries.number)  
        plt.plot(production, color="b")
        # plt.plot(load, color="r")
        # plt.set_ylim([0,max(load, production)])
        plt.ylim(ymin=0)
        plt.legend(['PV'], loc='upper left')
        self.canvas_timeseries.draw()

    def available_serial_ports(self):
        ports = ['COM%s' % (i + 1) for i in range(256)]
        result = []
        for port in ports:
            try:
                s = serial.Serial(port)
                s.close()
                result.append(port)
            except (OSError, serial.SerialException):
                pass
        return result


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Window()
    main.show()
    sys.exit(app.exec_())

But I am trying to Pause and Resume thread. I want that when I click button pause then registering will stop and after clicking start registering will continue. For Example: Before clicking reg obj: 56 and after clicking start will continue 56+..... I tried to use wait() and sleep() QThread functions, but it does not work correctly.

Jason Aller
  • 3,541
  • 28
  • 38
  • 38

0 Answers0