Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PyQt5.QtCore import QDateTime, Qt, QTimer
- from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QDateTimeEdit,
- QDial, QDialog, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit,
- QProgressBar, QPushButton, QRadioButton, QScrollBar, QSizePolicy,
- QSlider, QSpinBox, QStyleFactory, QTableWidget, QTabWidget, QTextEdit,
- QTableWidgetItem, QVBoxLayout, QWidget, QHeaderView)
- from PyQt5.QtGui import *
- import time
- import serial
- from QLed import QLed
- from PyQt5 import uic, QtCore, QtWidgets
- from PyQt5.QtCore import QObject, QThread, pyqtSignal, pyqtSlot
- from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
- from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
- from matplotlib.figure import Figure
- import math
- import matplotlib
- matplotlib.use('Qt5Agg')
- from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
- import sys
- from PyQt5.QtCore import *
- from PyQt5.QtGui import *
- from PyQt5.QtWidgets import *
- class list_holder():
- def __init__(self, enc_zero_cnt, frs_zero_cnt, init_deg, enc_val, rt_val, frs_val, rt_arr, n_cnt):
- self.enc_zero_cnt = enc_zero_cnt
- self.frs_zero_cnt = frs_zero_cnt
- self.init_deg = init_deg
- self.enc_val = enc_val
- self.rt_val = rt_val
- self.frs_val = frs_val
- self.rt_arr = rt_arr
- self.n_cnt = n_cnt
- class fetchData(QObject):
- finished = pyqtSignal(list_holder)
- #progress = pyqtSignal(list_holder)
- def __init__(self):
- QThread.__init__(self)
- active = True
- def __del__(self):
- self.wait()
- def _fetch(self):
- n_cnt = 0
- enc_list = []
- init_deg = [0, 0, 0, 0, 0]
- enc_val = [[], [], [], [], []]
- rt_val = [[], [], [], [], []]
- rt_arr = [[], [], [], [], []]
- frs_list = []
- frs_val = [[], [], [], []]
- enc_zero_cnt = [0, 0, 0, 0, 0]
- frs_zero_cnt = [0, 0, 0, 0, 0]
- ser=serial.Serial('COM3',9600)
- print("Start reading...")
- while(n_cnt<=700):
- line = ser.readline()
- line_arr = str(line).split("&")
- frs = line_arr[0]
- #if (len(frs)<2 or not ("fs" in frs)):
- # print("input not valid")
- # break
- print(frs)
- if ("fs" in frs):
- frs_list = frs.split("|", 5)
- for i in range(1, 4):
- if float(frs_list[i])==0.0:
- frs_zero_cnt[i] += 1
- frs_val[i].append(float(frs_list[i]))
- enc = line_arr[1]
- print(enc)
- if ("enc" in enc):
- enc_list = enc.split("|", 10)
- if (n_cnt == 0):
- init_deg[1:5] = enc_list[1:5]
- for i in range(1, 5):
- if int(enc_list[i])==0:
- enc_zero_cnt[i] += 1
- enc_val[i].append(int(enc_list[i]))
- if ":" in enc_list[i+4]:
- val = enc_list[i+4]
- rt_arr[i] = val.split(":",2)
- rt_val[i].append(int(rt_arr[i][1]))
- if (self.active != True or enc_list[9]=="off"):
- self.enc_last = enc_list
- if enc_list[9]=="off":
- print("Limit reached. Please rotate in different direction")
- break;
- n_cnt = n_cnt + 1
- ser.close()
- print("End")
- self.ret_lists = list_holder(enc_zero_cnt, frs_zero_cnt, init_deg, enc_val, rt_val, frs_val, rt_arr, n_cnt)
- return self.ret_lists
- def run(self):
- self.active = True
- obj_lists = self._fetch()
- self.finished.emit(obj_lists)
- def stop(self):
- self.active = False
- class MplCanvas(FigureCanvasQTAgg):
- def __init__(self, parent=None, width=5, height=4, dpi=120):
- fig = Figure(figsize=(width, height), dpi=dpi)
- self.axes = fig.add_subplot(111)
- super(MplCanvas, self).__init__(fig)
- class tabdemo(QTabWidget):
- def __init__(self, parent = None):
- super(tabdemo, self).__init__(parent)
- self.tab1 = QWidget()
- self.tab2 = QWidget()
- self.addTab(self.tab1,"Tab 1")
- self.addTab(self.tab2,"Tab 2")
- self.tab1UI()
- self.tab2UI()
- #self.setWindowTitle("tab demo")
- self.setFixedHeight(800)
- self.setFixedWidth(1300)
- styleComboBox = QComboBox()
- styleLabel = QLabel("Style:")
- self.useStylePaletteCheckBox = QCheckBox("&Use style's standard palette")
- self.useStylePaletteCheckBox.setChecked(True)
- disableWidgetsCheckBox = QCheckBox("&Disable widgets")
- self.createTopLeftGroupBox()
- self.createTopRightGroupBox()
- self.createBottomLeftTabWidget()
- self.bottomLeftTabWidget.setFixedHeight(220)
- self.createBottomRightGroupBox()
- self.createProgressBar()
- topLayout = QHBoxLayout()
- mainLayout = QGridLayout()
- mainLayout.addWidget(self.topLeftGroupBox, 1, 0)
- mainLayout.addWidget(self.topRightGroupBox, 1, 1)
- mainLayout.addWidget(self.bottomLeftTabWidget, 2, 0)
- mainLayout.addWidget(self.bottomRightGroupBox, 2, 1)
- self.setLayout(mainLayout)
- self.setWindowTitle("Styles")
- self.changeStyle('Windows')
- self.createThreads()
- def tab1UI(self):
- layout = QFormLayout()
- layout.addRow("Name",QLineEdit())
- layout.addRow("Address",QLineEdit())
- self.setTabText(0,"Contact Details")
- self.tab1.setLayout(layout)
- self.topLeftGroupBox = QGroupBox("Dynamic Graph")
- self.figure = Figure(figsize=(8,6), dpi=80)
- gs = self.figure.add_gridspec(2,1)
- self.ax1 = self.figure.add_subplot(gs[0, 0])
- self.ax2 = self.figure.add_subplot(gs[1, 0])
- self.ax1.grid(True)
- self.ax2.grid(True)
- self.canvas = FigureCanvas(self.figure)
- self.toolbar = NavigationToolbar(self.canvas, self)
- self.ax1.set_ylabel("Degrees", fontsize = 11)
- self.ax1.set_xlabel("Time, 100*milliseconds", fontsize = 11)
- self.ax1.set_title("Encoder measurements", fontsize = 11)
- self.ax1.set_ybound(-540, 540)
- self.ax1.set_yticks([-480, -360, -240, -120, 0, 120, 240, 360, 480])
- self.ax1.set_yticklabels(('-480', '-360', '-240', '-120', '0', '120', '240', '360', '480'))
- #self.ax2.set_ylim(auto=True)
- self.ax2.set_ybound(-10, 500)
- self.ax2.set_ylabel('Force, 0.01*Newtons', fontsize = 11)
- self.ax2.set_xlabel("Time, 100*milliseconds", fontsize = 11)
- self.ax2.set_title("Force sensor measurements", fontsize = 11)
- self.ax1.set_position([0.1, 0.6, 0.85, 0.35])
- self.ax2.set_position([0.1, 0.1, 0.85, 0.35])
- layout = QVBoxLayout()
- layout.addWidget(self.toolbar)
- layout.addWidget(self.canvas)
- self.show()
- self.topLeftGroupBox.setLayout(layout)
- def tab2UI(self):
- layout = QFormLayout()
- sex = QHBoxLayout()
- sex.addWidget(QRadioButton("Male"))
- sex.addWidget(QRadioButton("Female"))
- layout.addRow(QLabel("Sex"),sex)
- layout.addRow("Date of Birth",QLineEdit())
- self.setTabText(1,"Personal Details")
- self.tab2.setLayout(layout)
- def createThreads(self):
- self.threads = []
- self.workers = []
- self.threads.append(0)
- self.workers.append(0)
- for i in range(1,5):
- self.threads.append(QThread())
- self.workers.append(fetchData())
- self.workers[i].moveToThread(self.threads[i])
- self.threads[i].started.connect(self.workers[i].run)
- self.workers[i].finished.connect(lambda: self.stop_thread(i))
- #self.workers[i].finished.connect(self.workers[i].deleteLater)
- #self.threads[i].finished.connect(self.threads[i].deleteLater)
- #self.workers[i].progress.connect(self.drawEncFrs)
- self.workers[i].finished.connect(self.drawEncFrs)
- def stop_thread(self, opt):
- self.workers[opt].stop()
- self.threads[opt].quit()
- self.threads[opt].wait()
- def changeStyle(self, styleName):
- QApplication.setStyle(QStyleFactory.create(styleName))
- self.changePalette()
- def changePalette(self):
- if (self.useStylePaletteCheckBox.isChecked()):
- QApplication.setPalette(QApplication.style().standardPalette())
- else:
- QApplication.setPalette(self.originalPalette)
- def advanceProgressBar(self):
- curVal = self.progressBar.value()
- maxVal = self.progressBar.maximum()
- self.progressBar.setValue(curVal + (maxVal - curVal) // 100)
- def createTopLeftGroupBox(self):
- self.topLeftGroupBox = QGroupBox("Dynamic Graph")
- self.figure = Figure(figsize=(8,6), dpi=80)
- gs = self.figure.add_gridspec(2,1)
- self.ax1 = self.figure.add_subplot(gs[0, 0])
- self.ax2 = self.figure.add_subplot(gs[1, 0])
- self.ax1.grid(True)
- self.ax2.grid(True)
- self.canvas = FigureCanvas(self.figure)
- self.toolbar = NavigationToolbar(self.canvas, self)
- self.ax1.set_ylabel("Degrees", fontsize = 11)
- self.ax1.set_xlabel("Time, 100*milliseconds", fontsize = 11)
- self.ax1.set_title("Encoder measurements", fontsize = 11)
- self.ax1.set_ybound(-540, 540)
- self.ax1.set_yticks([-480, -360, -240, -120, 0, 120, 240, 360, 480])
- self.ax1.set_yticklabels(('-480', '-360', '-240', '-120', '0', '120', '240', '360', '480'))
- #self.ax2.set_ylim(auto=True)
- self.ax2.set_ybound(-10, 500)
- self.ax2.set_ylabel('Force, 0.01*Newtons', fontsize = 11)
- self.ax2.set_xlabel("Time, 100*milliseconds", fontsize = 11)
- self.ax2.set_title("Force sensor measurements", fontsize = 11)
- self.ax1.set_position([0.1, 0.6, 0.85, 0.35])
- self.ax2.set_position([0.1, 0.1, 0.85, 0.35])
- layout = QVBoxLayout()
- layout.addWidget(self.toolbar)
- layout.addWidget(self.canvas)
- self.show()
- self.topLeftGroupBox.setLayout(layout)
- def main():
- app = QApplication(sys.argv)
- ex = tabdemo()
- ex.show()
- sys.exit(app.exec_())
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment