2
0
forked from awendt/pyrelacs

Compare commits

..

No commits in common. "4868b0e196404ef20d4b8ec5f110994b39ccd2ad" and "5dadf1bd7c004303536c913b09628553c5696706" have entirely different histories.

10 changed files with 65 additions and 70 deletions

View File

@ -3,14 +3,12 @@ import sys
from PyQt6.QtCore import QSettings from PyQt6.QtCore import QSettings
from PyQt6.QtWidgets import QApplication from PyQt6.QtWidgets import QApplication
from pyrelacs import info from . import info
from pyrelacs.ui.mainwindow import PyRelacs from .ui.mainwindow import PyRelacs
from pyrelacs.util.logging import config_logging from .util.logging import config_logging
import resources
log = config_logging() log = config_logging()
from . import resources # best created with pyside6-rcc resources.qrc -o resources.py (rcc produces an error...) from . import resources
def main(): def main():
app = QApplication(sys.argv) app = QApplication(sys.argv)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -8,9 +8,9 @@ import nixio as nix
import importlib.util import importlib.util
from pyrelacs.util.logging import config_logging from pyrelacs.util.logging import config_logging
log = config_logging() log = config_logging()
from IPython import embed
class Repro: class Repro:
""" """
@ -25,6 +25,7 @@ class Repro:
def run_repro( def run_repro(
self, nix_file: nix.File, name: str, file: pathlib.Path, *args, **kwargs self, nix_file: nix.File, name: str, file: pathlib.Path, *args, **kwargs
) -> None: ) -> None:
spec = importlib.util.spec_from_file_location("rep", file) spec = importlib.util.spec_from_file_location("rep", file)
if not spec: if not spec:
log.error("Could not load the file") log.error("Could not load the file")
@ -34,10 +35,7 @@ class Repro:
log.error("Could not load the module of the repro") log.error("Could not load the module of the repro")
else: else:
sys.modules[name] = module sys.modules[name] = module
if spec.loader is not None:
spec.loader.exec_module(module) spec.loader.exec_module(module)
else:
log.error(f"{spec.loader} is None")
if hasattr(module, name): if hasattr(module, name):
rep_class = getattr(module, name) rep_class = getattr(module, name)
rep_class.run(nix_file) rep_class.run(nix_file)

View File

@ -5,6 +5,5 @@
<file>icons/disconnect.png</file> <file>icons/disconnect.png</file>
<file>icons/record.png</file> <file>icons/record.png</file>
<file>icons/stop.png</file> <file>icons/stop.png</file>
<file>icons/relacstuxheader.png</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -1,3 +1,5 @@
import pathlib
from PyQt6.QtGui import QPixmap from PyQt6.QtGui import QPixmap
from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QLabel, QVBoxLayout, QWidget from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QLabel, QVBoxLayout, QWidget
from PyQt6.QtCore import Qt from PyQt6.QtCore import Qt
@ -38,7 +40,8 @@ class About(QWidget):
rtd_link.setAlignment(Qt.AlignmentFlag.AlignCenter) rtd_link.setAlignment(Qt.AlignmentFlag.AlignCenter)
iconlabel = QLabel() iconlabel = QLabel()
pixmap = QPixmap(":/icons/relacstuxheader.png") _root = pathlib.Path(__file__).parent.parent
pixmap = QPixmap(str(pathlib.Path.joinpath(_root, "icons/relacstuxheader.png")))
s = pixmap.size() s = pixmap.size()
new_height = int(s.height() * 300/s.width()) new_height = int(s.height() * 300/s.width())
pixmap = pixmap.scaled(300, new_height, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.FastTransformation) pixmap = pixmap.scaled(300, new_height, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.FastTransformation)

View File

@ -8,7 +8,7 @@ from PyQt6.QtWidgets import (
QMainWindow, QMainWindow,
QPlainTextEdit, QPlainTextEdit,
QMenuBar, QMenuBar,
QStatusBar, QStatusBar
) )
import uldaq import uldaq
import numpy as np import numpy as np
@ -18,23 +18,19 @@ import pyqtgraph as pg
from pathlib import Path as path from pathlib import Path as path
from scipy.signal import welch, find_peaks from scipy.signal import welch, find_peaks
from pyrelacs.worker import Worker from ..worker import Worker
from pyrelacs.repros.repros import Repro from ..repros.repros import Repro
from pyrelacs.util.logging import config_logging from ..util.logging import config_logging
from pyrelacs.ui.about import AboutDialog from .about import AboutDialog
log = config_logging() log = config_logging()
_root = path(__file__).parent.parent _root = path(__file__).parent.parent
from IPython import embed from IPython import embed
class PyRelacs(QMainWindow): class PyRelacs(QMainWindow):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.setToolButtonStyle( # self.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon) # Ensure icons are displayed with text
Qt.ToolButtonStyle.ToolButtonTextBesideIcon
) # Ensure icons are displayed with text
self.setWindowTitle("PyRelacs") self.setWindowTitle("PyRelacs")
self.beat_plot = pg.PlotWidget() self.beat_plot = pg.PlotWidget()
self.power_plot = pg.PlotWidget() self.power_plot = pg.PlotWidget()
@ -52,19 +48,27 @@ class PyRelacs(QMainWindow):
self.create_toolbars() self.create_toolbars()
layout = QGridLayout() layout = QGridLayout()
layout.addWidget(self.beat_plot, 0, 0, 1, 2) layout.addWidget(self.plot_calibration_button, 0, 0)
layout.addWidget(self.power_plot, 1, 0, 1, 2) layout.addWidget(self.daq_disconnect_button, 0, 1)
layout.addWidget(self.text, 2, 0, 1, 2) layout.addWidget(self.beat_plot, 2, 0, 1, 2)
layout.addWidget(self.power_plot, 3, 0, 1, 2)
self.toolbar = QToolBar("Repros")
self.addToolBar(self.toolbar)
self.repros_to_toolbar()
# self.setFixedSize(QSize(400, 300))
widget = QWidget() widget = QWidget()
widget.setLayout(layout) widget.setLayout(layout)
self.setCentralWidget(widget) self.setCentralWidget(widget)
filename = path.joinpath(path.cwd(), "data") filename = path.joinpath(path.cwd(), "data.nix")
self.nix_file = nix.File.open(str(filename), nix.FileMode.Overwrite) self.nix_file = nix.File.open(
str(filename), nix.FileMode.Overwrite
)
def create_actions(self): def create_actions(self):
self._rlx_exitaction = QAction(QIcon(":/icons/exit.png"), "Exit", self) self._rlx_exitaction = QAction(QIcon(str(path.joinpath(_root, "icons/exit.png"))), "Exit", self)
self._rlx_exitaction.setStatusTip("Close relacs") self._rlx_exitaction.setStatusTip("Close relacs")
self._rlx_exitaction.setShortcut(QKeySequence("Alt+q")) self._rlx_exitaction.setShortcut(QKeySequence("Alt+q"))
self._rlx_exitaction.triggered.connect(self.on_exit) self._rlx_exitaction.triggered.connect(self.on_exit)
@ -74,17 +78,17 @@ class PyRelacs(QMainWindow):
self._rlx_aboutaction.setEnabled(True) self._rlx_aboutaction.setEnabled(True)
self._rlx_aboutaction.triggered.connect(self.on_about) self._rlx_aboutaction.triggered.connect(self.on_about)
self._daq_connectaction = QAction(QIcon(":icons/connect.png"), "Connect DAQ", self) self._daq_connectaction = QAction(QIcon(str(path.joinpath(_root, "icons/connect.png"))), "Connect DAQ", self)
self._daq_connectaction.setStatusTip("Connect to daq device") self._daq_connectaction.setStatusTip("Connect to daq device")
# self._daq_connectaction.setShortcut(QKeySequence("Alt+d")) # self._daq_connectaction.setShortcut(QKeySequence("Alt+d"))
self._daq_connectaction.triggered.connect(self.connect_dac) self._daq_connectaction.triggered.connect(self.connect_dac)
self._daq_disconnectaction = QAction(QIcon(":/icons/disconnect.png"), "Disconnect DAQ", self) self._daq_disconnectaction = QAction(QIcon(str(path.joinpath(_root, "icons/disconnect.png"))), "Disconnect DAQ", self)
self._daq_disconnectaction.setStatusTip("Disconnect the DAQ device") self._daq_disconnectaction.setStatusTip("Disconnect the DAQ device")
# self._daq_connectaction.setShortcut(QKeySequence("Alt+d")) # self._daq_connectaction.setShortcut(QKeySequence("Alt+d"))
self._daq_disconnectaction.triggered.connect(self.disconnect_dac) self._daq_disconnectaction.triggered.connect(self.disconnect_dac)
self._daq_calibaction = QAction(QIcon(":/icons/calibration.png"), "Plot calibration", self) self._daq_calibaction = QAction(QIcon(str(path.joinpath(_root, "icons/calibration.png"))), "Plot calibration", self)
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.plot_calibration) self._daq_calibaction.triggered.connect(self.plot_calibration)
@ -92,28 +96,19 @@ class PyRelacs(QMainWindow):
def create_menu(self): def create_menu(self):
menu = self.menuBar() menu = self.menuBar()
if menu is not None:
file_menu = menu.addMenu("&File") file_menu = menu.addMenu("&File")
device_menu = menu.addMenu("&DAQ")
help_menu = menu.addMenu("&Help")
if file_menu is not None:
file_menu.addAction(self._rlx_exitaction) file_menu.addAction(self._rlx_exitaction)
file_menu.addAction(self._rlx_aboutaction) file_menu.addAction(self._rlx_aboutaction)
if device_menu is not None: device_menu = menu.addMenu("&DAQ")
device_menu.addAction(self._daq_connectaction) device_menu.addAction(self._daq_connectaction)
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)
if help_menu is not None: help_menu = menu.addMenu("&Help")
help_menu.addSeparator() help_menu.addSeparator()
# help_menu.addAction(self._help_action) # help_menu.addAction(self._help_action)
else:
log.error("could not create file menu and device menu")
self.on_exit()
self.setMenuBar(menu) self.setMenuBar(menu)
def create_toolbars(self): def create_toolbars(self):
@ -220,20 +215,12 @@ class PyRelacs(QMainWindow):
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")
except IndexError:
log.error("DAQ is not connected")
log.error("Please connect a DAQ device to the system")
if hasattr(PyRelacs, "daq_device"):
try:
self.daq_device.connect() self.daq_device.connect()
log.debug("Connected") log.debug("Connected")
except uldaq.ul_exception.ULException as e: except IndexError:
log.error(f"Could not Connect to DAQ: {e}") log.debug("DAQ is not connected, closing")
self.on_exit()
self.daq_connect_button.setDisabled(True) self.daq_connect_button.setDisabled(True)
else:
log.debug("Already handeld the error")
pass
def disconnect_dac(self): def disconnect_dac(self):
try: try:
@ -246,6 +233,16 @@ class PyRelacs(QMainWindow):
except AttributeError: except AttributeError:
log.debug("DAQ was not connected") log.debug("DAQ was not connected")
def repros_to_toolbar(self):
repro_names, file_names = self.repros.names_of_repros()
for rep, fn in zip(repro_names, file_names):
individual_repro_button = QAction(rep, self)
individual_repro_button.setStatusTip("Button")
individual_repro_button.triggered.connect(
lambda checked, n=rep, f=fn: self.run_repro(n, f)
)
self.toolbar.addAction(individual_repro_button)
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_file, n, fn)