parent
73385bb33e
commit
0e5de107ce
@ -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 import QtCore, QtGui, Qt |
||||||
from PyQt4.QtGui import QApplication, QMainWindow |
from PyQt4.QtGui import QApplication, QMainWindow |
||||||
import sys, math |
import sys, math |
||||||
|
import gex |
||||||
|
|
||||||
class MyMainScreen(QMainWindow): |
class MyMainScreen(QMainWindow): |
||||||
def __init__(self, parent=None): |
def __init__(self, client=None, parent=None): |
||||||
QtGui.QMainWindow.__init__(self, parent) |
QtGui.QMainWindow.__init__(self, parent) |
||||||
|
self.resize(800, 600) |
||||||
|
|
||||||
|
self.samples = None |
||||||
|
|
||||||
self.timer = QtCore.QTimer(self) |
self.timer = QtCore.QTimer(self) |
||||||
self.timer.setInterval(100) |
self.timer.setInterval(20) |
||||||
self.timer.timeout.connect(self.blink) |
self.timer.timeout.connect(self.measure) |
||||||
self.timer.start() |
self.timer.start() |
||||||
|
|
||||||
self.resize(500, 500) |
self.timer2 = QtCore.QTimer(self) |
||||||
self.centralwidget = QtGui.QWidget(self) |
self.timer2.setInterval(30) |
||||||
self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget) |
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) |
if self.skipcount < 5: |
||||||
self.menubar = QtGui.QMenuBar(self) |
self.skipcount += 1 |
||||||
self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 22)) |
return |
||||||
|
else: |
||||||
|
self.skipcount = 0 |
||||||
|
|
||||||
self.setMenuBar(self.menubar) |
self.pending = True |
||||||
|
|
||||||
self.statusbar = QtGui.QStatusBar(self) |
self.failcount = 0 |
||||||
self.setStatusBar(self.statusbar) |
|
||||||
QtCore.QMetaObject.connectSlotsByName(self) |
|
||||||
|
|
||||||
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.trig.pulse_us(10) |
||||||
self.n += 0.1 |
|
||||||
self.n = self.n % 20 |
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.repaint() |
||||||
|
self.wantredraw = False |
||||||
|
|
||||||
def paintEvent(self, event): |
def paintEvent(self, event): |
||||||
|
if self.samples is None: |
||||||
|
return |
||||||
|
|
||||||
|
W = self.width() |
||||||
|
H = self.height() |
||||||
|
|
||||||
painter = QtGui.QPainter(self) |
painter = QtGui.QPainter(self) |
||||||
painter.setRenderHint(QtGui.QPainter.Antialiasing) |
painter.setRenderHint(QtGui.QPainter.Antialiasing) |
||||||
painter.setRenderHint(QtGui.QPainter.HighQualityAntialiasing) |
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 |
# label - Raw HC-SR04 signal |
||||||
amp = (self.height()/2)*0.8 |
painter.drawText(W-370, 50, "Surový signál přijímače") |
||||||
for i in range(0, self.width(), step): |
painter.drawText(W-370, 85, "HC-SR04") |
||||||
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)) |
|
||||||
|
|
||||||
if __name__ == "__main__": |
with gex.Client(gex.TrxSerialThread()) as client: |
||||||
app = QApplication(sys.argv) |
app = QApplication(sys.argv) |
||||||
mainscreen = MyMainScreen() |
mainscreen = MyMainScreen(client) |
||||||
mainscreen.show() |
mainscreen.show() |
||||||
app.exec_() |
app.exec_() |
||||||
|
Loading…
Reference in new issue