First Commit

This commit is contained in:
jens 2023-03-22 21:49:55 +01:00
parent f3e05e8d91
commit 4caf4a476e
6 changed files with 634 additions and 0 deletions

View File

@ -1,6 +1,7 @@
# jfsCounter
GUI für den jfsESP_counter
` s1000 sets timebase to 1ms
o10000 sets output to 10kHz
output is >Value<\n in Hertz

255
counter.py Normal file
View File

@ -0,0 +1,255 @@
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import QMainWindow, QApplication
import sys,time,os
import serial
from serial.tools.list_ports import comports
import glob
import pyqtgraph as pg
import traceback
import gui
class MainWindow(QtWidgets.QMainWindow,gui.Ui_MainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.ui = gui.Ui_MainWindow()
self.ui.setupUi(self)
## Plotwindow
self.x = []
self.y = []
self.grafwd = pg.PlotWidget()
self.ui.gridLayout_3.addWidget(self.grafwd,0,1,1,1)
self.data_line = self.grafwd.plot(self.x,self.y, pen=(0,255,0))
## Threads
self.timebase = 50
self.thdx ={}
self.threadpool = QtCore.QThreadPool()
## serial
self.populate_ports()
## gui
self.ui.pushButton.pressed.connect(self.connect2board)
self.ui.pushButton_2.pressed.connect(self.disconnect2board)
self.ui.pushButton_3.pressed.connect(self.startesp32)
self.ui.pushButton_4.pressed.connect(self.stopesp32)
self.ui.pushButton_5.pressed.connect(self.clearPlot)
self.ui.pushButton_6.pressed.connect(self.setFrequency)
times = ['1','5','10','50','100','500','10000']
self.ui.comboBox_2.addItems(times)
self.ui.comboBox_2.setCurrentText(str(self.timebase))
self.ui.comboBox_2.currentIndexChanged['QString'].connect(self.setTimebase)
self.ui.checkBox.stateChanged.connect(self.testLauf)
self.closeButtons()
### Link zur Doku
#self.webEngineView.setUrl(QtCore.QUrl("file:///C:/Users/jens/ownCloud/www/jfs/git2022/jfsPoseidon/test.html"))
file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "doku\\testMd.html"))
file_path = file_path.replace("\\",'/')
file_path = 'file:///'+file_path
self.ui.webEngineView.setUrl(QtCore.QUrl(file_path))
# Populate the available ports
def populate_ports(self):
result = []
for port in comports():
result.append(port.name)
self.ui.comboBox.addItems(result)
self.globports = result
print("Ports have been populated.",self.globports)
def setTimebase(self):
self.timebase=int(self.ui.comboBox_2.currentText())
def closeButtons(self):
self.ui.pushButton.setEnabled(True)
self.ui.pushButton_2.setEnabled(False)
self.ui.pushButton_3.setEnabled(False)
self.ui.pushButton_4.setEnabled(False)
self.ui.pushButton_5.setEnabled(False)
self.ui.pushButton_6.setEnabled(False)
self.ui.checkBox.setEnabled(False)
def openButtons(self):
self.ui.pushButton.setEnabled(False)
self.ui.pushButton_2.setEnabled(True)
self.ui.pushButton_3.setEnabled(True)
#self.ui.pushButton_4.setEnabled(True)
self.ui.pushButton_5.setEnabled(True)
self.ui.pushButton_6.setEnabled(True)
self.ui.checkBox.setEnabled(True)
def connect2board(self):
self.esp32_port = self.ui.comboBox.currentText()
self.statusBar().showMessage("You clicked CONNECT TO Esp32")
try:
port_declared = self.esp32_port in vars()
try:
print("connect to .. ",self.esp32_port)
self.esp32_serial = serial.Serial()
self.esp32_serial.port = self.esp32_port
self.esp32_serial.baudrate = 115200
self.esp32_serial.parity = serial.PARITY_NONE
self.esp32_serial.stopbits = serial.STOPBITS_ONE
self.esp32_serial.bytesize = serial.EIGHTBITS
self.esp32_serial.timeout = 1
self.esp32_serial.open()
self.openButtons()
time.sleep(0.1)
self.statusBar().showMessage("Successfully connected to esp32 board.")
except:
self.statusBar().showMessage("Cannot connect to board. Try again..")
except AttributeError:
self.statusBar().showMessage("Please plug in the board and select a proper port, then press connect.")
def disconnect2board(self):
self.statusBar().showMessage("You clicked DISCONNECT FROM ESP32")
print("Disconnecting from board..")
time.sleep(0.1)
self.esp32_serial.close()
self.closeButtons()
print("Board has been disconnected")
def startesp32(self):
self.clearPlot()
self.thdx[0]= ThC(index=1,port = self.esp32_serial,base=self.timebase)
self.threadpool.start(self.thdx[0])
self.thdx[0].signals.datasignal.connect(self.updateData)
self.ui.pushButton_3.setEnabled(False)
self.ui.pushButton_4.setEnabled(True)
self.ui.comboBox_2.setEnabled(False)
def stopesp32(self):
self.thdx[0].stop()
self.ui.pushButton_3.setEnabled(True)
self.ui.pushButton_4.setEnabled(False)
self.ui.comboBox_2.setEnabled(True)
def updateData(self,x,y):
self.x.append(x)
self.y.append(y)
self.data_line.setData(self.x,self.y)
def clearPlot(self):
self.x.clear()
self.y.clear()
self.data_line.setData(self.x,self.y)
def setFrequency(self):
s = self.ui.lineEdit.text()
cmd='o'+str(s)+'\n'
self.statusBar().showMessage(cmd)
thread = Thread(self.sendToEsp32, cmd)
thread.signals.finished.connect(lambda:self.thread_finished(thread))
self.threadpool.start(thread)
def sendToEsp32(self, sendStr):
print(f" sending {sendStr}")
self.esp32_serial.write(sendStr.encode('utf-8'))
self.esp32_serial.flushInput()
def testLauf(self,state):
if state == QtCore.Qt.Checked:
self.thdx[1] = ThC_2(port = self.esp32_serial)
self.threadpool.start(self.thdx[1])
else:
self.thdx[1].stop()
def thread_finished(self, th):
print("Your thread has completed. Now terminating..")
th.stop()
print("Thread has been terminated.")
print("=============================\n\n")
###############################
# MULTITHREADING : SIGNALS CLASS
# ##############################
class WorkerSignals(QtCore.QObject):
finished = QtCore.pyqtSignal()
error = QtCore.pyqtSignal(tuple)
result = QtCore.pyqtSignal(object)
progress = QtCore.pyqtSignal(int)
datasignal = QtCore.pyqtSignal(int,float)
class Thread(QtCore.QRunnable):
def __init__(self, fn, *args, **kwargs):
super().__init__()
self.runs = True
self.fn = fn
self.args = args
self.kwargs = kwargs
self.signals = WorkerSignals()
def run(self):
try:
result = self.fn(*self.args, **self.kwargs)
except:
traceback.print_exc()
exctype, value = sys.exc_info()[:2]
self.signals.error.emit((exctype, value, traceback.format_exc()))
else:
self.signals.result.emit(result) # Return the result of the processing
finally:
self.signals.finished.emit()
self.stop()
def stop(self):
self.runs = False
class ThC(QtCore.QRunnable):
#datasignal = QtCore.pyqtSignal(int,float)
def __init__(self,port=None,index=0,base=100):
super().__init__()
self.index = index
self.is_running = True
self.port = port
self.base = base
self.signals = WorkerSignals()
def run(self):
print(f"Thread {self.index} started")
self.port.flushOutput()
self.port.flushInput()
i = self.base*1000
cmd = 's'+str(i)+'\n'
self.port.write(cmd.encode('utf-8'))
cnt = 0;
while True:
cnt+=1
inp = self.port.readline()
try:
if inp[0] == 62 and inp[-3] == 60 :
inp = inp[1:-3]
try:
y = float(inp.decode('utf-8'))
self.signals.datasignal.emit(cnt,y)
except ValueError:
pass
except IndexError:
pass
time.sleep(0.001)
if self.is_running==False:
break
def stop(self):
self.is_running=False
print(f"Thread {self.index} stopped")
class ThC_2(QtCore.QRunnable):
def __init__(self,port=None):
super().__init__()
self.is_running = True
self.port=port
def run(self):
cnt=0
while True:
cnt+= 1
if cnt >= 100 : cnt = 1
cmd = 'o'+str(cnt*10000)+'\n'
print(cmd)
self.port.write(cmd.encode('utf-8'))
time.sleep(1)
if self.is_running==False:
break
def stop(self):
self.is_running=False
print(f'Thread ThC-2 stopped')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

195
counter.ui Normal file
View File

@ -0,0 +1,195 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1260</width>
<height>871</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Counter</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Port</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBox"/>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>open Port</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>close Port</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Timebase [ms]</string>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QComboBox" name="comboBox_2"/>
</item>
<item row="0" column="6">
<widget class="QPushButton" name="pushButton_3">
<property name="text">
<string>start</string>
</property>
</widget>
</item>
<item row="0" column="7">
<widget class="QPushButton" name="pushButton_4">
<property name="text">
<string>stop</string>
</property>
</widget>
</item>
<item row="0" column="8">
<widget class="QPushButton" name="pushButton_5">
<property name="text">
<string>clear Display</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QPushButton" name="pushButton_6">
<property name="text">
<string>set Frequency</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit"/>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Testlauf</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>on</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QWidget" name="widget" native="true"/>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Doku</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWebEngineView" name="webEngineView">
<property name="url">
<url>
<string>about:blank</string>
</url>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1260</width>
<height>26</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<customwidgets>
<customwidget>
<class>QWebEngineView</class>
<extends>QWidget</extends>
<header location="global">QtWebEngineWidgets/QWebEngineView</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

BIN
doku/jens.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

48
doku/testMd.html Normal file
View File

@ -0,0 +1,48 @@
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title></title></head><body><h3>Erster Test</h3>
<ol>
<li>lets go</li>
<li>oder was</li>
<li>naja</li>
</ol>
<hr />
<img src="jens.jpg" width="200">
<br>
<hr />
<blockquote>
<p>Aufbau</p>
<ul>
<li>Syringe</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>Photomultiplyer</li>
</ul>
<p><strong>Abbau</strong></p>
</blockquote>
<pre><code>This is a python THing
lets do it now
</code></pre>
<p><code>ok in an imperial way</code> then</p>
<p>I Love My <strong><a href="https://science.jefro.de">science</a></strong></p>
<h4>Entwicklung</h4>
<pre><code>- [ ] Juni 2022
- [ ] This creates an Environment for the Software based on
- [ ] poseidon https://github.com/pachterlab/poseidon
- [ ] PyQtGraph https://www.pyqtgraph.org/
conda create --name piPyGra
conda activate piPyGra
conda install -c conda-forge pyqtgraph
conda install pyserial
pip install pyinstaller pyqt5
pip install PyQtWebEngine
.... work ...
conda deactivate
conda activate PiPyGra
Ananconda prompt designer
pyuic5 -x gui2.ui -o gui2.py
</code></pre>
</body></html>

135
gui.py Normal file
View File

@ -0,0 +1,135 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'counter.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1260, 871)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_6 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_6.setObjectName("gridLayout_6")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.gridLayout_5 = QtWidgets.QGridLayout(self.tab)
self.gridLayout_5.setObjectName("gridLayout_5")
self.gridLayout_4 = QtWidgets.QGridLayout()
self.gridLayout_4.setObjectName("gridLayout_4")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(self.tab)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.comboBox = QtWidgets.QComboBox(self.tab)
self.comboBox.setObjectName("comboBox")
self.gridLayout.addWidget(self.comboBox, 0, 1, 1, 1)
self.pushButton = QtWidgets.QPushButton(self.tab)
self.pushButton.setObjectName("pushButton")
self.gridLayout.addWidget(self.pushButton, 0, 2, 1, 1)
self.pushButton_2 = QtWidgets.QPushButton(self.tab)
self.pushButton_2.setObjectName("pushButton_2")
self.gridLayout.addWidget(self.pushButton_2, 0, 3, 1, 1)
self.label_2 = QtWidgets.QLabel(self.tab)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 0, 4, 1, 1)
self.comboBox_2 = QtWidgets.QComboBox(self.tab)
self.comboBox_2.setObjectName("comboBox_2")
self.gridLayout.addWidget(self.comboBox_2, 0, 5, 1, 1)
self.pushButton_3 = QtWidgets.QPushButton(self.tab)
self.pushButton_3.setObjectName("pushButton_3")
self.gridLayout.addWidget(self.pushButton_3, 0, 6, 1, 1)
self.pushButton_4 = QtWidgets.QPushButton(self.tab)
self.pushButton_4.setObjectName("pushButton_4")
self.gridLayout.addWidget(self.pushButton_4, 0, 7, 1, 1)
self.pushButton_5 = QtWidgets.QPushButton(self.tab)
self.pushButton_5.setObjectName("pushButton_5")
self.gridLayout.addWidget(self.pushButton_5, 0, 8, 1, 1)
self.gridLayout_4.addLayout(self.gridLayout, 0, 0, 1, 1)
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
self.pushButton_6 = QtWidgets.QPushButton(self.tab)
self.pushButton_6.setObjectName("pushButton_6")
self.gridLayout_2.addWidget(self.pushButton_6, 0, 0, 1, 1)
self.lineEdit = QtWidgets.QLineEdit(self.tab)
self.lineEdit.setObjectName("lineEdit")
self.gridLayout_2.addWidget(self.lineEdit, 0, 1, 1, 1)
self.label_3 = QtWidgets.QLabel(self.tab)
self.label_3.setObjectName("label_3")
self.gridLayout_2.addWidget(self.label_3, 0, 2, 1, 1)
self.checkBox = QtWidgets.QCheckBox(self.tab)
self.checkBox.setObjectName("checkBox")
self.gridLayout_2.addWidget(self.checkBox, 0, 3, 1, 1)
self.gridLayout_4.addLayout(self.gridLayout_2, 0, 1, 1, 1)
self.gridLayout_5.addLayout(self.gridLayout_4, 0, 0, 1, 1)
self.gridLayout_3 = QtWidgets.QGridLayout()
self.gridLayout_3.setObjectName("gridLayout_3")
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout_3.addItem(spacerItem, 0, 0, 1, 1)
self.widget = QtWidgets.QWidget(self.tab)
self.widget.setObjectName("widget")
self.gridLayout_3.addWidget(self.widget, 0, 1, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout_3.addItem(spacerItem1, 1, 1, 1, 1)
self.gridLayout_5.addLayout(self.gridLayout_3, 1, 0, 1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.verticalLayout = QtWidgets.QVBoxLayout(self.tab_2)
self.verticalLayout.setObjectName("verticalLayout")
self.webEngineView = QtWebEngineWidgets.QWebEngineView(self.tab_2)
self.webEngineView.setUrl(QtCore.QUrl("about:blank"))
self.webEngineView.setObjectName("webEngineView")
self.verticalLayout.addWidget(self.webEngineView)
self.tabWidget.addTab(self.tab_2, "")
self.gridLayout_6.addWidget(self.tabWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1260, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Port"))
self.pushButton.setText(_translate("MainWindow", "open Port"))
self.pushButton_2.setText(_translate("MainWindow", "close Port"))
self.label_2.setText(_translate("MainWindow", "Timebase [ms]"))
self.pushButton_3.setText(_translate("MainWindow", "start"))
self.pushButton_4.setText(_translate("MainWindow", "stop"))
self.pushButton_5.setText(_translate("MainWindow", "clear Display"))
self.pushButton_6.setText(_translate("MainWindow", "set Frequency"))
self.label_3.setText(_translate("MainWindow", "Testlauf"))
self.checkBox.setText(_translate("MainWindow", "on"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Counter"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Doku"))
from PyQt5 import QtWebEngineWidgets
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())