Updated Metadatainput, added MeasurementSettings Widget, Layoutchanges, Make buttons inactive
This commit is contained in:
parent
405bf4935f
commit
43fb406920
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user