From 0e5de107cecc2038c441775db72bcf188f836422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Fri, 22 Jun 2018 00:27:30 +0200 Subject: [PATCH] code added --- .gitignore | 109 +++++++++++++++++++++++++++++++++++++ UNITS.ini | 70 ++++++++++++++++++++++++ gex-client-py => gex | 0 main.py | 126 +++++++++++++++++++++++++++++++++---------- 4 files changed, 278 insertions(+), 27 deletions(-) create mode 100644 .gitignore create mode 100644 UNITS.ini rename gex-client-py => gex (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07701d5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,109 @@ +# Created by .ignore support plugin (hsz.mobi) +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +.idea/ + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + diff --git a/UNITS.ini b/UNITS.ini new file mode 100644 index 0000000..2143ed8 --- /dev/null +++ b/UNITS.ini @@ -0,0 +1,70 @@ +## UNITS.INI +## GEX v0.3.1 on STM32F072-ZERO +## built May 22 2018 at 12:05:33 + +[UNITS] +# Create units by adding their names next to a type (e.g. DO=A,B), +# remove the same way. Reload to update the unit sections below. + +# Digital output +DO=trig +# Digital input with triggers +DI= +# Neopixel RGB LED strip +NPX= +# I2C master +I2C= +# SPI master +SPI= +# Serial port +USART= +# 1-Wire master +1WIRE= +# Analog/digital converter +ADC=adc +# Shift register driver (595, 4094) +SIPO= +# Frequency and pulse measurement +FCAP= +# Capacitive touch sensing +TOUCH= +# Simple PWM output +PWMDIM= +# Two-channel analog output with waveforms +DAC= + +[DO:trig@1] +# Port name +port=B +# Pins (comma separated, supports ranges) +pins=1 +# Initially high pins +initial= +# Open-drain pins +open-drain= + +[ADC:adc@2] +# Enabled channels, comma separated +# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 +# A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 C0 C1 C2 C3 C4 C5 Tsens Vref +channels=0-1 + +# Sampling time (0-7) +sample_time=2 +# Sampling frequency (Hz) +frequency=20000 + +# Sample buffer size +# - shared by all enabled channels +# - defines the maximum pre-trigger size (divide by # of channels) +# - captured data is sent in half-buffer chunks +# - buffer overrun aborts the data capture +buffer_size=500 + +# Enable continuous sampling with averaging +# Caution: This can cause DAC output glitches +averaging=N +# Exponential averaging coefficient (permil, range 0-1000 ~ 0.000-1.000) +# - used formula: y[t]=(1-k)*y[t-1]+k*u[t] +# - not available when a capture is running +avg_factor=500 diff --git a/gex-client-py b/gex similarity index 100% rename from gex-client-py rename to gex diff --git a/main.py b/main.py index 5e4d64e..6f73f48 100644 --- a/main.py +++ b/main.py @@ -1,52 +1,124 @@ +import time + from PyQt4 import QtCore, QtGui, Qt from PyQt4.QtGui import QApplication, QMainWindow import sys, math +import gex class MyMainScreen(QMainWindow): - def __init__(self, parent=None): + def __init__(self, client=None, parent=None): QtGui.QMainWindow.__init__(self, parent) + self.resize(800, 600) + + self.samples = None self.timer = QtCore.QTimer(self) - self.timer.setInterval(100) - self.timer.timeout.connect(self.blink) + self.timer.setInterval(20) + self.timer.timeout.connect(self.measure) self.timer.start() - self.resize(500, 500) - self.centralwidget = QtGui.QWidget(self) - self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget) + self.timer2 = QtCore.QTimer(self) + self.timer2.setInterval(30) + self.timer2.timeout.connect(self.updatedisp) + self.timer2.start() + + self.pending = False + + # init GEX + self.client = client + self.trig = gex.DOut(client, 'trig') + self.adc = gex.ADC(client, 'adc') + + self.adc.set_sample_rate(75000) + + self.failcount = 0 + self.skipcount = 0 + self.wantredraw = False + + # self.fcap = gex.FCAP(client, 'fcap') + + def closeEvent(self,event): + self.timer.stop() + self.client.close() + self.close() + + def measure(self): + if self.pending: + self.failcount += 1 + if self.failcount > 2: + self.pending = False + self.adc.disarm() + self.skipcount = 0 + return - self.setCentralWidget(self.centralwidget) - self.menubar = QtGui.QMenuBar(self) - self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 22)) + if self.skipcount < 5: + self.skipcount += 1 + return + else: + self.skipcount = 0 - self.setMenuBar(self.menubar) + self.pending = True - self.statusbar = QtGui.QStatusBar(self) - self.setStatusBar(self.statusbar) - QtCore.QMetaObject.connectSlotsByName(self) + self.failcount = 0 - self.n = 0 + self.adc.setup_trigger(1, level=1000, edge='rising', count=1000, handler=self.handle_meas) + self.adc.arm() - def blink(self): - self.n += 0.1 - self.n = self.n % 20 - self.repaint() + self.trig.pulse_us(10) + + def handle_meas(self, report): + self.samples = report.data[50:] + self.pending = False + self.wantredraw = True + + def updatedisp(self): + if self.wantredraw: + self.repaint() + self.wantredraw = False def paintEvent(self, event): + if self.samples is None: + return + + W = self.width() + H = self.height() + painter = QtGui.QPainter(self) painter.setRenderHint(QtGui.QPainter.Antialiasing) painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing) - painter.setPen(QtGui.QPen(QtCore.Qt.red, 2)) + painter.fillRect(0,0, W,H, QtCore.Qt.black) + painter.setPen(QtGui.QPen(QtCore.Qt.green, 1)) + + step = round(W / len(self.samples)) + if step == 0: + step = 1 + + mult = 0.12*H/500 + n = 0 + for i in range(0, W, step): + if n == len(self.samples)-1: + break + + v = self.samples[n][0] + w = self.samples[n+1][0] + if v <= 0: v = 0.000000001 + if w <= 0: w = 0.000000001 + y0 = H - v*mult + y1 = H - w*mult + n += 1 + painter.drawLine(QtCore.QLine(i, round(y0), i+step, round(y1))) + + font = painter.font() + font.setPointSize(22) + font.setWeight(QtGui.QFont.DemiBold) + painter.setFont(font) - step = 2 - amp = (self.height()/2)*0.8 - for i in range(0, self.width(), step): - y0 = round(self.height()/2 + amp * math.sin(2*math.pi*self.n*(i/180))) - y1 = round(self.height()/2 + amp * math.sin(2*math.pi*self.n*((i+step)/180))) - painter.drawLine(QtCore.QLine(i, y0, i+step, y1)) + # label - Raw HC-SR04 signal + painter.drawText(W-370, 50, "Surový signál přijímače") + painter.drawText(W-370, 85, "HC-SR04") -if __name__ == "__main__": +with gex.Client(gex.TrxSerialThread()) as client: app = QApplication(sys.argv) - mainscreen = MyMainScreen() + mainscreen = MyMainScreen(client) mainscreen.show() app.exec_()