master
Ondřej Hruška 6 years ago
parent 73385bb33e
commit 0e5de107ce
Signed by: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 109
      .gitignore
  2. 70
      UNITS.ini
  3. 0
      gex
  4. 126
      main.py

109
.gitignore vendored

@ -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/

@ -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

@ -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_()

Loading…
Cancel
Save