Guest User

Untitled

a guest
Apr 7th, 2021
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.63 KB | None | 0 0
  1. from PyQt5.QtCore import QDateTime, Qt, QTimer
  2. from PyQt5.QtWidgets import (QApplication, QCheckBox, QComboBox, QDateTimeEdit,
  3. QDial, QDialog, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit,
  4. QProgressBar, QPushButton, QRadioButton, QScrollBar, QSizePolicy,
  5. QSlider, QSpinBox, QStyleFactory, QTableWidget, QTabWidget, QTextEdit,
  6. QTableWidgetItem, QVBoxLayout, QWidget, QHeaderView)
  7. from PyQt5.QtGui import *
  8. import time
  9. import serial
  10. from QLed import QLed
  11.  
  12. from PyQt5 import uic, QtCore, QtWidgets
  13. from PyQt5.QtCore import QObject, QThread, pyqtSignal, pyqtSlot
  14. from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
  15. from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
  16. from matplotlib.figure import Figure
  17.  
  18. import math
  19.  
  20. import matplotlib
  21. matplotlib.use('Qt5Agg')
  22. from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
  23.  
  24. import sys
  25. from PyQt5.QtCore import *
  26. from PyQt5.QtGui import *
  27. from PyQt5.QtWidgets import *
  28.  
  29. class list_holder():
  30.  
  31. def __init__(self, enc_zero_cnt, frs_zero_cnt, init_deg, enc_val, rt_val, frs_val, rt_arr, n_cnt):
  32. self.enc_zero_cnt = enc_zero_cnt
  33. self.frs_zero_cnt = frs_zero_cnt
  34. self.init_deg = init_deg
  35. self.enc_val = enc_val
  36. self.rt_val = rt_val
  37. self.frs_val = frs_val
  38. self.rt_arr = rt_arr
  39. self.n_cnt = n_cnt
  40.  
  41. class fetchData(QObject):
  42.  
  43. finished = pyqtSignal(list_holder)
  44. #progress = pyqtSignal(list_holder)
  45.  
  46. def __init__(self):
  47. QThread.__init__(self)
  48. active = True
  49.  
  50. def __del__(self):
  51. self.wait()
  52.  
  53. def _fetch(self):
  54. n_cnt = 0
  55.  
  56. enc_list = []
  57. init_deg = [0, 0, 0, 0, 0]
  58.  
  59. enc_val = [[], [], [], [], []]
  60. rt_val = [[], [], [], [], []]
  61. rt_arr = [[], [], [], [], []]
  62.  
  63. frs_list = []
  64. frs_val = [[], [], [], []]
  65.  
  66. enc_zero_cnt = [0, 0, 0, 0, 0]
  67. frs_zero_cnt = [0, 0, 0, 0, 0]
  68.  
  69. ser=serial.Serial('COM3',9600)
  70.  
  71. print("Start reading...")
  72.  
  73. while(n_cnt<=700):
  74. line = ser.readline()
  75. line_arr = str(line).split("&")
  76.  
  77. frs = line_arr[0]
  78. #if (len(frs)<2 or not ("fs" in frs)):
  79. # print("input not valid")
  80. # break
  81. print(frs)
  82. if ("fs" in frs):
  83. frs_list = frs.split("|", 5)
  84. for i in range(1, 4):
  85. if float(frs_list[i])==0.0:
  86. frs_zero_cnt[i] += 1
  87. frs_val[i].append(float(frs_list[i]))
  88.  
  89. enc = line_arr[1]
  90. print(enc)
  91. if ("enc" in enc):
  92. enc_list = enc.split("|", 10)
  93. if (n_cnt == 0):
  94. init_deg[1:5] = enc_list[1:5]
  95.  
  96. for i in range(1, 5):
  97. if int(enc_list[i])==0:
  98. enc_zero_cnt[i] += 1
  99. enc_val[i].append(int(enc_list[i]))
  100.  
  101. if ":" in enc_list[i+4]:
  102. val = enc_list[i+4]
  103. rt_arr[i] = val.split(":",2)
  104. rt_val[i].append(int(rt_arr[i][1]))
  105.  
  106. if (self.active != True or enc_list[9]=="off"):
  107. self.enc_last = enc_list
  108. if enc_list[9]=="off":
  109. print("Limit reached. Please rotate in different direction")
  110. break;
  111.  
  112. n_cnt = n_cnt + 1
  113.  
  114. ser.close()
  115. print("End")
  116.  
  117. self.ret_lists = list_holder(enc_zero_cnt, frs_zero_cnt, init_deg, enc_val, rt_val, frs_val, rt_arr, n_cnt)
  118. return self.ret_lists
  119.  
  120. def run(self):
  121. self.active = True
  122. obj_lists = self._fetch()
  123. self.finished.emit(obj_lists)
  124.  
  125. def stop(self):
  126. self.active = False
  127.  
  128. class MplCanvas(FigureCanvasQTAgg):
  129. def __init__(self, parent=None, width=5, height=4, dpi=120):
  130. fig = Figure(figsize=(width, height), dpi=dpi)
  131. self.axes = fig.add_subplot(111)
  132. super(MplCanvas, self).__init__(fig)
  133.  
  134. class tabdemo(QTabWidget):
  135. def __init__(self, parent = None):
  136. super(tabdemo, self).__init__(parent)
  137. self.tab1 = QWidget()
  138. self.tab2 = QWidget()
  139.  
  140. self.addTab(self.tab1,"Tab 1")
  141. self.addTab(self.tab2,"Tab 2")
  142.  
  143. self.tab1UI()
  144. self.tab2UI()
  145.  
  146. #self.setWindowTitle("tab demo")
  147. self.setFixedHeight(800)
  148. self.setFixedWidth(1300)
  149. styleComboBox = QComboBox()
  150.  
  151. styleLabel = QLabel("Style:")
  152.  
  153. self.useStylePaletteCheckBox = QCheckBox("&Use style's standard palette")
  154. self.useStylePaletteCheckBox.setChecked(True)
  155. disableWidgetsCheckBox = QCheckBox("&Disable widgets")
  156. self.createTopLeftGroupBox()
  157. self.createTopRightGroupBox()
  158. self.createBottomLeftTabWidget()
  159. self.bottomLeftTabWidget.setFixedHeight(220)
  160. self.createBottomRightGroupBox()
  161. self.createProgressBar()
  162.  
  163. topLayout = QHBoxLayout()
  164.  
  165. mainLayout = QGridLayout()
  166. mainLayout.addWidget(self.topLeftGroupBox, 1, 0)
  167. mainLayout.addWidget(self.topRightGroupBox, 1, 1)
  168.  
  169. mainLayout.addWidget(self.bottomLeftTabWidget, 2, 0)
  170. mainLayout.addWidget(self.bottomRightGroupBox, 2, 1)
  171. self.setLayout(mainLayout)
  172. self.setWindowTitle("Styles")
  173. self.changeStyle('Windows')
  174. self.createThreads()
  175.  
  176. def tab1UI(self):
  177. layout = QFormLayout()
  178. layout.addRow("Name",QLineEdit())
  179. layout.addRow("Address",QLineEdit())
  180. self.setTabText(0,"Contact Details")
  181. self.tab1.setLayout(layout)
  182. self.topLeftGroupBox = QGroupBox("Dynamic Graph")
  183. self.figure = Figure(figsize=(8,6), dpi=80)
  184. gs = self.figure.add_gridspec(2,1)
  185. self.ax1 = self.figure.add_subplot(gs[0, 0])
  186. self.ax2 = self.figure.add_subplot(gs[1, 0])
  187. self.ax1.grid(True)
  188. self.ax2.grid(True)
  189. self.canvas = FigureCanvas(self.figure)
  190. self.toolbar = NavigationToolbar(self.canvas, self)
  191. self.ax1.set_ylabel("Degrees", fontsize = 11)
  192. self.ax1.set_xlabel("Time, 100*milliseconds", fontsize = 11)
  193. self.ax1.set_title("Encoder measurements", fontsize = 11)
  194. self.ax1.set_ybound(-540, 540)
  195. self.ax1.set_yticks([-480, -360, -240, -120, 0, 120, 240, 360, 480])
  196. self.ax1.set_yticklabels(('-480', '-360', '-240', '-120', '0', '120', '240', '360', '480'))
  197.  
  198. #self.ax2.set_ylim(auto=True)
  199. self.ax2.set_ybound(-10, 500)
  200. self.ax2.set_ylabel('Force, 0.01*Newtons', fontsize = 11)
  201. self.ax2.set_xlabel("Time, 100*milliseconds", fontsize = 11)
  202. self.ax2.set_title("Force sensor measurements", fontsize = 11)
  203.  
  204. self.ax1.set_position([0.1, 0.6, 0.85, 0.35])
  205. self.ax2.set_position([0.1, 0.1, 0.85, 0.35])
  206.  
  207. layout = QVBoxLayout()
  208. layout.addWidget(self.toolbar)
  209. layout.addWidget(self.canvas)
  210.  
  211. self.show()
  212. self.topLeftGroupBox.setLayout(layout)
  213. def tab2UI(self):
  214. layout = QFormLayout()
  215. sex = QHBoxLayout()
  216. sex.addWidget(QRadioButton("Male"))
  217. sex.addWidget(QRadioButton("Female"))
  218. layout.addRow(QLabel("Sex"),sex)
  219. layout.addRow("Date of Birth",QLineEdit())
  220. self.setTabText(1,"Personal Details")
  221. self.tab2.setLayout(layout)
  222. def createThreads(self):
  223. self.threads = []
  224. self.workers = []
  225. self.threads.append(0)
  226. self.workers.append(0)
  227. for i in range(1,5):
  228. self.threads.append(QThread())
  229. self.workers.append(fetchData())
  230. self.workers[i].moveToThread(self.threads[i])
  231. self.threads[i].started.connect(self.workers[i].run)
  232. self.workers[i].finished.connect(lambda: self.stop_thread(i))
  233. #self.workers[i].finished.connect(self.workers[i].deleteLater)
  234. #self.threads[i].finished.connect(self.threads[i].deleteLater)
  235. #self.workers[i].progress.connect(self.drawEncFrs)
  236. self.workers[i].finished.connect(self.drawEncFrs)
  237.  
  238. def stop_thread(self, opt):
  239. self.workers[opt].stop()
  240. self.threads[opt].quit()
  241. self.threads[opt].wait()
  242.  
  243. def changeStyle(self, styleName):
  244. QApplication.setStyle(QStyleFactory.create(styleName))
  245. self.changePalette()
  246.  
  247. def changePalette(self):
  248. if (self.useStylePaletteCheckBox.isChecked()):
  249. QApplication.setPalette(QApplication.style().standardPalette())
  250. else:
  251. QApplication.setPalette(self.originalPalette)
  252.  
  253. def advanceProgressBar(self):
  254. curVal = self.progressBar.value()
  255. maxVal = self.progressBar.maximum()
  256. self.progressBar.setValue(curVal + (maxVal - curVal) // 100)
  257. def createTopLeftGroupBox(self):
  258. self.topLeftGroupBox = QGroupBox("Dynamic Graph")
  259.  
  260. self.figure = Figure(figsize=(8,6), dpi=80)
  261. gs = self.figure.add_gridspec(2,1)
  262. self.ax1 = self.figure.add_subplot(gs[0, 0])
  263. self.ax2 = self.figure.add_subplot(gs[1, 0])
  264. self.ax1.grid(True)
  265. self.ax2.grid(True)
  266. self.canvas = FigureCanvas(self.figure)
  267. self.toolbar = NavigationToolbar(self.canvas, self)
  268. self.ax1.set_ylabel("Degrees", fontsize = 11)
  269. self.ax1.set_xlabel("Time, 100*milliseconds", fontsize = 11)
  270. self.ax1.set_title("Encoder measurements", fontsize = 11)
  271. self.ax1.set_ybound(-540, 540)
  272. self.ax1.set_yticks([-480, -360, -240, -120, 0, 120, 240, 360, 480])
  273. self.ax1.set_yticklabels(('-480', '-360', '-240', '-120', '0', '120', '240', '360', '480'))
  274.  
  275. #self.ax2.set_ylim(auto=True)
  276. self.ax2.set_ybound(-10, 500)
  277. self.ax2.set_ylabel('Force, 0.01*Newtons', fontsize = 11)
  278. self.ax2.set_xlabel("Time, 100*milliseconds", fontsize = 11)
  279. self.ax2.set_title("Force sensor measurements", fontsize = 11)
  280.  
  281. self.ax1.set_position([0.1, 0.6, 0.85, 0.35])
  282. self.ax2.set_position([0.1, 0.1, 0.85, 0.35])
  283.  
  284. layout = QVBoxLayout()
  285. layout.addWidget(self.toolbar)
  286. layout.addWidget(self.canvas)
  287.  
  288. self.show()
  289. self.topLeftGroupBox.setLayout(layout)
  290.  
  291. def main():
  292. app = QApplication(sys.argv)
  293. ex = tabdemo()
  294. ex.show()
  295. sys.exit(app.exec_())
  296.  
  297. if __name__ == '__main__':
  298. main()
  299.  
Advertisement
Add Comment
Please, Sign In to add comment