Updated Metadatainput, added MeasurementSettings Widget, Layoutchanges, Make buttons inactive

This commit is contained in:
CPD 2025-03-04 17:55:08 +01:00
parent 405bf4935f
commit 43fb406920

View File

@ -1,11 +1,13 @@
''' app/ui/main_window.py ''' ''' app/ui/main_window.py '''
from PyQt6.QtCore import Qt, QTimer from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtWidgets import QMainWindow, QWidget, QHBoxLayout, QTextEdit, QLabel, QDialog from PyQt6.QtWidgets import QMainWindow, QWidget, QHBoxLayout, QTextEdit, QLabel, QDialog, QToolButton, QStatusBar
from PyQt6.QtWidgets import QToolBox
from PyQt6.QtGui import QIcon from PyQt6.QtGui import QIcon
from .widgets.menubar import MenuBar from .widgets.menubar import MenuBar
from .widgets.toolbar import ToolBar from .widgets.toolbar import ToolBar
from .widgets.statusbar import StatusBar from .widgets.statusbar import StatusBar
from .widgets.metadata_input import MetadataInput2 from .widgets.metadata_input import MetadataInput
from .widgets.measurement_settings import ScriptSelection, MeasurementSettings
from .widgets.plot import Plot from .widgets.plot import Plot
from .widgets.device_select import ListChoice from .widgets.device_select import ListChoice
# from .widgets.treeview import TreeView # from .widgets.treeview import TreeView
@ -42,10 +44,10 @@ class MainWindow(QMainWindow):
central_widget = QWidget(self) central_widget = QWidget(self)
self.setCentralWidget(central_widget) self.setCentralWidget(central_widget)
layout = QHBoxLayout(central_widget) layout = QHBoxLayout(central_widget)
central_widget.setLayout(layout) central_widget.setLayout(layout)
# Create Widgets
# self.treeview = self.create_treeview() # self.treeview = self.create_treeview()
self.editbox = self.create_edit() self.editbox = self.create_edit()
@ -53,12 +55,21 @@ class MainWindow(QMainWindow):
# Add Widgets to Window # Add Widgets to Window
self.setMenuBar(MenuBar(self)) self.setMenuBar(MenuBar(self))
self.setStatusBar(StatusBar(self)) self.setStatusBar(StatusBar(QStatusBar(self)))
self.w_leftbox = QToolBox(self)
layout.addWidget(self.w_leftbox)
init_elements = [("name1", "val1"), ("name2", "val2"), ("interval", 0.5)] init_elements = [("name1", "val1"), ("name2", "val2"), ("interval", 0.5)]
layout.addWidget(MetadataInput2(init_elements)) self.w_metadata = MetadataInput(init_elements)
self.plot_widget = Plot() self.w_leftbox.addItem(self.w_metadata, "Measurement metadata")
layout.addWidget(self.plot_widget) # Measurement settings
self.w_measurement_settings = MeasurementSettings()
self.w_leftbox.addItem(self.w_measurement_settings, "Measurement settings")
self.w_measurement_settings.set_value("interval", AppConfig.MAIN_CFG.get_or("interval", 0.5))
self.w_plot = Plot()
layout.addWidget(self.w_plot)
self.verbose = True self.verbose = True
@ -75,6 +86,11 @@ class MainWindow(QMainWindow):
self.data_queue = None self.data_queue = None
self.proc_measure = None self.proc_measure = None
self.set_status("Ready")
def set_status(self, msg):
self.statusBar().showMessage(msg)
def create_toolbars(self) -> None: def create_toolbars(self) -> None:
""" """
Creates and adds the top and right toolbars to the main window. Creates and adds the top and right toolbars to the main window.
@ -84,24 +100,23 @@ class MainWindow(QMainWindow):
style=Qt.ToolButtonStyle.ToolButtonTextUnderIcon, icon_size=(24, 24)) style=Qt.ToolButtonStyle.ToolButtonTextUnderIcon, icon_size=(24, 24))
# Top Toolbar Buttons # Top Toolbar Buttons
self.topbar.add_button("Devices", QIcon.fromTheme(QIcon.ThemeIcon.Printer), self.vmdev_connect_from_dialog) self.topbar.add_button("meas_devices", "Devices", QIcon.fromTheme(QIcon.ThemeIcon.Printer), self.vmdev_connect_from_dialog)
self.topbar.add_button("Start", QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart), self.measure_start) self.topbar.add_button("meas_start", "Start", QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStart), self.measure_start)
self.topbar.add_button("Stop", QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStop), self.measure_stop) self.topbar.add_button("meas_stop", "Stop", QIcon.fromTheme(QIcon.ThemeIcon.MediaPlaybackStop), self.measure_stop)
self.topbar.add_button("Save", "resources/assets/icons/windows/shell32-259.ico", self.save_file) self.topbar.add_button("meas_save", "Save", QIcon.fromTheme(QIcon.ThemeIcon.DocumentSaveAs), self.save_file)
self.topbar.add_separator() self.topbar.add_separator()
self.topbar.add_button("Exit", "resources/assets/icons/windows/shell32-220.ico", self.exit_app) self.topbar.add_button("app_exit", "Exit", QIcon.fromTheme(QIcon.ThemeIcon.ApplicationExit), self.exit_app)
self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.topbar)
# disable the Stop and Save buttons
self.topbar.disable_button("meas_stop")
self.topbar.disable_button("meas_save")
# Right Toolbar [PyQt6.QtWidgets.QToolBar] # Right Toolbar [PyQt6.QtWidgets.QToolBar]
self.rightbar = ToolBar(self, orientation=Qt.Orientation.Vertical, # self.rightbar = ToolBar(self, orientation=Qt.Orientation.Vertical, style=Qt.ToolButtonStyle.ToolButtonIconOnly, icon_size=(24, 24))
style=Qt.ToolButtonStyle.ToolButtonIconOnly, # self.rightbar.add_separator()
icon_size=(24, 24)) # self.rightbar.add_button("Settings", "resources/assets/icons/windows/shell32-315.ico", self.settings_window)
# self.addToolBar(Qt.ToolBarArea.RightToolBarArea, self.rightbar)
# Right Toolbar Buttons
self.rightbar.add_separator()
self.rightbar.add_button("Settings", "resources/assets/icons/windows/shell32-315.ico", self.settings_window)
self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.topbar)
self.addToolBar(Qt.ToolBarArea.RightToolBarArea, self.rightbar)
# def create_treeview(self) -> TreeView: # def create_treeview(self) -> TreeView:
""" """
@ -109,7 +124,6 @@ class MainWindow(QMainWindow):
""" """
# return TreeView(self) # return TreeView(self)
def leddev_connect(self, leddev_type, leddev_name): def leddev_connect(self, leddev_type, leddev_name):
self.leddev = ledd.connect_device(leddev_type, leddev_name) self.leddev = ledd.connect_device(leddev_type, leddev_name)
AppConfig.MAIN_CFG.set("led_device_last.type", leddev_type) AppConfig.MAIN_CFG.set("led_device_last.type", leddev_type)
@ -138,6 +152,7 @@ class MainWindow(QMainWindow):
self.vmdev = vmd.connect_device(vmdev_type, vmdev_name) self.vmdev = vmd.connect_device(vmdev_type, vmdev_name)
AppConfig.MAIN_CFG.set("voltage_measurement_device_last.type", vmdev_type) AppConfig.MAIN_CFG.set("voltage_measurement_device_last.type", vmdev_type)
AppConfig.MAIN_CFG.set("voltage_measurement_device_last.name", vmdev_name) AppConfig.MAIN_CFG.set("voltage_measurement_device_last.name", vmdev_name)
def vmdev_autoconnect(self): def vmdev_autoconnect(self):
if AppConfig.MAIN_CFG.get_or("voltage_measurement_device_auto_reconnect", False): if AppConfig.MAIN_CFG.get_or("voltage_measurement_device_auto_reconnect", False):
try: try:
@ -146,6 +161,8 @@ class MainWindow(QMainWindow):
self.vmdev_connect(vmdev_type, vmdev_name) self.vmdev_connect(vmdev_type, vmdev_name)
except KeyError: except KeyError:
pass pass
except Exception as e:
print(f"Failed to auto-connect to voltage measurement device: {e}")
def vmdev_connect_from_dialog(self): def vmdev_connect_from_dialog(self):
""" """
Open a dialog that lets the user choose a voltage measurement device, Open a dialog that lets the user choose a voltage measurement device,
@ -168,20 +185,29 @@ class MainWindow(QMainWindow):
self.leddev_connect_from_dialog() self.leddev_connect_from_dialog()
if self.leddev is None: if self.leddev is None:
raise ValueError("No led control device selected") raise ValueError("No led control device selected")
self.topbar.disable_button("meas_start")
self.topbar.disable_button("meas_devices")
self.topbar.enable_button("meas_stop")
script = 100 script = 100
measurement_name = "guitest" measurement_name = "guitest"
led_script = LedScript(script=script) led_script = LedScript(script=script)
flush_after = AppConfig.MAIN_CFG.get_or("flush_after", None) flush_after = self.w_measurement_settings.get_value("flush_after")
use_buffer = AppConfig.MAIN_CFG.get_or("use_buffer", False) use_buffer = self.w_measurement_settings.get_value("use_buffer")
max_measurements = AppConfig.MAIN_CFG.get_or("max_measurements", None) max_measurements = self.w_measurement_settings.get_value("max_measurements")
stop_on_script_end = AppConfig.MAIN_CFG.get_or("stop_on_script_end", False) stop_on_script_end = self.w_measurement_settings.get_value("stop_on_script_end")
interval = AppConfig.MAIN_CFG.get_or("measurement_interval_s", 1.0) interval = self.w_measurement_settings.get_value("interval")
metadata = {} metadata = self.w_metadata.get_dict()
metadata["interval"] = str(interval) metadata["interval"] = str(interval)
metadata["name"] = measurement_name metadata["name"] = measurement_name
metadata["led"] = "led" metadata["led"] = "led"
metadata["led_script"] = str(script) metadata["led_script"] = str(script)
self.w_metadata.update_from_dict({
"interval": str(interval),
"led_script": str(script)
})
if self.verbose: if self.verbose:
print(f"Starting measurement with:\n\tinterval = {interval}\n\tflush_after = {flush_after}\n\tuse_buffer = {use_buffer}\n\tmax_measurements = {max_measurements}\n\tstop_on_script_end = {stop_on_script_end}") print(f"Starting measurement with:\n\tinterval = {interval}\n\tflush_after = {flush_after}\n\tuse_buffer = {use_buffer}\n\tmax_measurements = {max_measurements}\n\tstop_on_script_end = {stop_on_script_end}")
@ -216,13 +242,16 @@ class MainWindow(QMainWindow):
self.command_queue.put("stop") self.command_queue.put("stop")
self.measurement_timer.stop() self.measurement_timer.stop()
self.proc_measure.join() self.proc_measure.join()
print("Measurement stopped" + " " * 50) self.set_status("Ready")
self.led_script.stop_updating() # stop watching for file updates (if enabled) self.led_script.stop_updating() # stop watching for file updates (if enabled)
self.data_collector.save_csv(verbose=True) self.data_collector.save_csv(verbose=True)
data, metadata = self.data_collector.get_data() data, metadata = self.data_collector.get_data()
self.proc_measure = None self.proc_measure = None
self.led_script = None self.led_script = None
self.topbar.enable_button("meas_start")
self.topbar.enable_button("meas_devices")
self.topbar.enable_button("meas_save")
self.topbar.disable_button("meas_stop")
def measure_update(self): def measure_update(self):
if self.proc_measure.is_alive(): if self.proc_measure.is_alive():
@ -231,8 +260,9 @@ class MainWindow(QMainWindow):
current_data = self.data_queue.get(block=False) current_data = self.data_queue.get(block=False)
i, tval, vval, led_val = current_data i, tval, vval, led_val = current_data
print(f"Data {i:03}: {tval}s, {vval}V, {led_val}%") print(f"Data {i:03}: {tval}s, {vval}V, {led_val}%")
self.set_status(f"Data {i:03}: {tval}s, {vval}V, {led_val}%")
# update the plot # update the plot
self.plot_widget.update_plot(tval, vval, led_val) self.w_plot.update_plot(tval, vval, led_val)
def measurement_is_running(self): def measurement_is_running(self):
return self.proc_measure is not None return self.proc_measure is not None