[ui] adding plot that reads after pressing run the input of the daqproducer

This commit is contained in:
wendtalexander 2024-10-03 14:06:23 +02:00
parent e555573f09
commit e43bb16bd4

View File

@ -1,5 +1,7 @@
from pathlib import Path as path
from PyQt6.QtGui import QAction, QIcon, QKeySequence from PyQt6.QtGui import QAction, QIcon, QKeySequence
from PyQt6.QtCore import Qt, QSize, QThreadPool from PyQt6.QtCore import Qt, QSize, QThreadPool, QTimer
from PyQt6.QtWidgets import ( from PyQt6.QtWidgets import (
QGridLayout, QGridLayout,
QPushButton, QPushButton,
@ -13,12 +15,13 @@ from PyQt6.QtWidgets import (
import uldaq import uldaq
import nixio as nix import nixio as nix
import pyqtgraph as pg import pyqtgraph as pg
import numpy as np
from pathlib import Path as path
from pyrelacs.dataio.daq_producer import DaqProducer
from pyrelacs.worker import Worker from pyrelacs.worker import Worker
from pyrelacs.repros.repros import Repro from pyrelacs.repros.repros import Repro
from pyrelacs.dataio.buffer import DataBuffer from pyrelacs.dataio.circbuffer import CircBuffer
from pyrelacs.ui.about import AboutDialog from pyrelacs.ui.about import AboutDialog
from pyrelacs.ui.plots.calibration import CalibrationPlot from pyrelacs.ui.plots.calibration import CalibrationPlot
@ -44,15 +47,14 @@ class PyRelacs(QMainWindow):
filename = path.joinpath(path.cwd(), "data.nix") filename = path.joinpath(path.cwd(), "data.nix")
if filename.exists(): if filename.exists():
self.nix_file = nix.File.open(str(filename), nix.FileMode.ReadOnly) self.nix_file = nix.File.open(str(filename), nix.FileMode.ReadOnly)
else: filename = path.joinpath(path.cwd(), "calibration.nix")
self.nix_file = nix.File.open(str(filename), nix.FileMode.Overwrite) self.nix_calibration = nix.File.open(str(filename), nix.FileMode.Overwrite)
self.calibration_plot = CalibrationPlot(self.figure, self.nix_file) self.calibration_plot = CalibrationPlot(self.figure, self.nix_file)
self.threadpool = QThreadPool() self.threadpool = QThreadPool()
self.repros = Repro() self.repros = Repro()
# self.buffers = DataBuffer(channels=1, samples=100_000)
self.text = QPlainTextEdit() self.text = QPlainTextEdit()
self.text.setReadOnly(True) self.text.setReadOnly(True)
@ -70,6 +72,11 @@ class PyRelacs(QMainWindow):
widget.setLayout(layout) widget.setLayout(layout)
self.setCentralWidget(widget) self.setCentralWidget(widget)
self.buffer = CircBuffer(size=500)
self.connect_dac()
self.daq_producer = DaqProducer(self.buffer, self.daq_device)
self.plot_daq()
def create_actions(self): def create_actions(self):
self._rlx_exitaction = QAction(QIcon(":/icons/exit.png"), "Exit", self) self._rlx_exitaction = QAction(QIcon(":/icons/exit.png"), "Exit", self)
self._rlx_exitaction.setStatusTip("Close relacs") self._rlx_exitaction.setStatusTip("Close relacs")
@ -101,6 +108,10 @@ class PyRelacs(QMainWindow):
self._daq_calibaction.setStatusTip("Calibrate the attenuator device") self._daq_calibaction.setStatusTip("Calibrate the attenuator device")
# self._daq_calibaction.setShortcut(QKeySequence("Alt+d")) # self._daq_calibaction.setShortcut(QKeySequence("Alt+d"))
self._daq_calibaction.triggered.connect(self.calibration_plot.plot) self._daq_calibaction.triggered.connect(self.calibration_plot.plot)
self._run_action = QAction(QIcon(":/icons/calibration.png"), "Run", self)
self._run_action.triggered.connect(self.run_daq)
self.create_menu() self.create_menu()
def create_menu(self): def create_menu(self):
@ -119,6 +130,7 @@ class PyRelacs(QMainWindow):
device_menu.addAction(self._daq_disconnectaction) device_menu.addAction(self._daq_disconnectaction)
device_menu.addSeparator() device_menu.addSeparator()
device_menu.addAction(self._daq_calibaction) device_menu.addAction(self._daq_calibaction)
device_menu.addAction(self._run_action)
if help_menu is not None: if help_menu is not None:
help_menu.addSeparator() help_menu.addSeparator()
@ -139,6 +151,7 @@ class PyRelacs(QMainWindow):
daq_toolbar.addAction(self._daq_connectaction) daq_toolbar.addAction(self._daq_connectaction)
daq_toolbar.addAction(self._daq_disconnectaction) daq_toolbar.addAction(self._daq_disconnectaction)
daq_toolbar.addAction(self._daq_calibaction) daq_toolbar.addAction(self._daq_calibaction)
daq_toolbar.addAction(self._run_action)
self.addToolBar(Qt.ToolBarArea.TopToolBarArea, daq_toolbar) self.addToolBar(Qt.ToolBarArea.TopToolBarArea, daq_toolbar)
repro_toolbar = QToolBar("Repros") repro_toolbar = QToolBar("Repros")
@ -150,7 +163,7 @@ class PyRelacs(QMainWindow):
lambda checked, n=rep, f=fn: self.run_repro(n, f) lambda checked, n=rep, f=fn: self.run_repro(n, f)
) )
repro_toolbar.addAction(repro_action) repro_toolbar.addAction(repro_action)
self.addToolBar(Qt.ToolBarArea.TopToolBarArea, repro_toolbar) self.addToolBar(Qt.ToolBarArea.BottomToolBarArea, repro_toolbar)
def create_buttons(self): def create_buttons(self):
self.daq_connect_button = QPushButton("Connect Daq") self.daq_connect_button = QPushButton("Connect Daq")
@ -165,11 +178,50 @@ class PyRelacs(QMainWindow):
self.plot_calibration_button.setCheckable(True) self.plot_calibration_button.setCheckable(True)
self.plot_calibration_button.clicked.connect(self.calibration_plot.plot) self.plot_calibration_button.clicked.connect(self.calibration_plot.plot)
self.daq_run_button = QPushButton("Run")
self.daq_run_button.setCheckable(True)
self.daq_run_button.clicked.connect(self.run_daq)
def plot_daq(self):
self.figure.setBackground("w")
self.daq_plot = self.figure.addPlot(row=0, col=0)
self.time = list(range(10))
pen = pg.mkPen("red")
self.data = list(range(10))
self.line = self.daq_plot.plot(self.time, self.data, pen=pen)
self.timer = QTimer()
self.timer.setInterval(50)
self.timer.timeout.connect(self.update_plot)
self.timer.start()
# self.update_plot()
def update_plot(self):
self.time = self.time[1:]
self.time.append(self.time[-1] + 1)
self.data = self.data[1:]
try:
item = self.buffer.get(self.buffer.write_index() - 1)
except IndexError:
item = 0
self.data.append(item)
self.line.setData(self.time, self.data)
def run_daq(self):
read_daq = Worker(self.daq_producer.read_analog_continously)
read_daq.signals.result.connect(self.print_output)
read_daq.signals.finished.connect(self.thread_complete)
read_daq.signals.progress.connect(self.progress_fn)
self.threadpool.start(read_daq)
def connect_dac(self): def connect_dac(self):
devices = uldaq.get_daq_device_inventory(uldaq.InterfaceType.USB) devices = uldaq.get_daq_device_inventory(uldaq.InterfaceType.USB)
try: try:
self.daq_device = uldaq.DaqDevice(devices[0]) self.daq_device = uldaq.DaqDevice(devices[0])
log.debug(f"Found daq devices {len(devices)}, connecting to the first one") log.debug(f"Found daq devices {len(devices)}, connecting to the first one")
self.daq_device.connect()
log.debug("connected")
except IndexError: except IndexError:
log.error("DAQ is not connected") log.error("DAQ is not connected")
log.error("Please connect a DAQ device to the system") log.error("Please connect a DAQ device to the system")
@ -195,7 +247,7 @@ class PyRelacs(QMainWindow):
def run_repro(self, n, fn): def run_repro(self, n, fn):
self.text.appendPlainText(f"started Repro {n}, {fn}") self.text.appendPlainText(f"started Repro {n}, {fn}")
worker = Worker(self.repros.run_repro, self.nix_file, n, fn) worker = Worker(self.repros.run_repro, self.nix_calibration, n, fn)
worker.signals.result.connect(self.print_output) worker.signals.result.connect(self.print_output)
worker.signals.finished.connect(self.thread_complete) worker.signals.finished.connect(self.thread_complete)
worker.signals.progress.connect(self.progress_fn) worker.signals.progress.connect(self.progress_fn)