From 2d7fbf34792c53629a66dce11e6249d06065aa2a Mon Sep 17 00:00:00 2001 From: jupfi Date: Sat, 16 Dec 2023 13:20:33 +0100 Subject: [PATCH] Added saving and loading of S11 measurements. --- src/nqrduck_autotm/controller.py | 29 +++++++++++++++ src/nqrduck_autotm/model.py | 1 + src/nqrduck_autotm/resources/autotm_widget.ui | 35 +++++++++++++++++++ src/nqrduck_autotm/view.py | 29 +++++++++++++++ src/nqrduck_autotm/widget.py | 16 +++++++++ 5 files changed, 110 insertions(+) diff --git a/src/nqrduck_autotm/controller.py b/src/nqrduck_autotm/controller.py index a2f39c9..bcc9515 100644 --- a/src/nqrduck_autotm/controller.py +++ b/src/nqrduck_autotm/controller.py @@ -512,6 +512,35 @@ class AutoTMController(ModuleController): self.module.model.open_calibration = S11Data.from_json(data["open"]) self.module.model.load_calibration = S11Data.from_json(data["load"]) + def save_measurement(self, filename: str) -> None: + """Save measurement to file. + + Args: + filename (str): Path to file. + """ + logger.debug("Saving measurement.") + if not self.module.model.measurement: + logger.debug("No measurement to save.") + return + + measurement = self.module.model.measurement.to_json() + + with open(filename, "w") as f: + json.dump(measurement, f) + + def load_measurement(self, filename: str) -> None: + """Load measurement from file. + + Args: + filename (str): Path to file. + """ + + logger.debug("Loading measurement.") + + with open(filename, "r") as f: + measurement = json.load(f) + self.module.model.measurement = S11Data.from_json(measurement) + ### Voltage Control ### def set_voltages(self, tuning_voltage: str, matching_voltage: str) -> None: diff --git a/src/nqrduck_autotm/model.py b/src/nqrduck_autotm/model.py index 13672f3..26fd7c3 100644 --- a/src/nqrduck_autotm/model.py +++ b/src/nqrduck_autotm/model.py @@ -10,6 +10,7 @@ logger = logging.getLogger(__name__) class S11Data: + FILE_EXTENSION = "s11" # Conversion factors - the data is generally sent and received in mV # These values are used to convert the data to dB and degrees CENTER_POINT_MAGNITUDE = 900 # mV diff --git a/src/nqrduck_autotm/resources/autotm_widget.ui b/src/nqrduck_autotm/resources/autotm_widget.ui index dcef9b2..ec69b53 100644 --- a/src/nqrduck_autotm/resources/autotm_widget.ui +++ b/src/nqrduck_autotm/resources/autotm_widget.ui @@ -547,6 +547,41 @@ + + + + + + + + Import Measurement + + + + + + + Export Measurement + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + diff --git a/src/nqrduck_autotm/view.py b/src/nqrduck_autotm/view.py index 8929ce2..d7030c6 100644 --- a/src/nqrduck_autotm/view.py +++ b/src/nqrduck_autotm/view.py @@ -21,6 +21,7 @@ from nqrduck.contrib.mplwidget import MplWidget from nqrduck.assets.icons import Logos from nqrduck.assets.animations import DuckAnimations from .widget import Ui_Form +from .model import S11Data logger = logging.getLogger(__name__) @@ -138,6 +139,16 @@ class AutoTMView(ModuleView): # Position Button self._ui_form.positionButton.clicked.connect(self.on_position_button_clicked) + # Import and export buttons + + self._ui_form.exportButton.setIcon(Logos.Save16x16()) + self._ui_form.exportButton.setIconSize(self._ui_form.exportButton.size()) + self._ui_form.exportButton.clicked.connect(self.on_export_button_clicked) + + self._ui_form.importButton.setIcon(Logos.Load16x16()) + self._ui_form.importButton.setIconSize(self._ui_form.importButton.size()) + self._ui_form.importButton.clicked.connect(self.on_import_button_clicked) + self.init_plot() self.init_labels() @@ -384,6 +395,24 @@ class AutoTMView(ModuleView): self.lut_window = self.LutWindow(self.module) self.lut_window.show() + @pyqtSlot() + def on_export_button_clicked(self) -> None: + """Slot for when the export button is clicked.""" + logger.debug("Export button clicked") + file_manager = self.QFileManager(S11Data.FILE_EXTENSION, parent=self.widget) + file_name = file_manager.saveFileDialog() + if file_name: + self.module.controller.save_measurement(file_name) + + @pyqtSlot() + def on_import_button_clicked(self) -> None: + """Slot for when the import button is clicked.""" + logger.debug("Import button clicked") + file_manager = self.QFileManager(S11Data.FILE_EXTENSION, parent=self.widget) + file_name = file_manager.loadFileDialog() + if file_name: + self.module.controller.load_measurement(file_name) + class StepperSavedPositionsWindow(QDialog): def __init__(self, module, parent=None): super().__init__(parent) diff --git a/src/nqrduck_autotm/widget.py b/src/nqrduck_autotm/widget.py index 18fe98a..9758e6b 100644 --- a/src/nqrduck_autotm/widget.py +++ b/src/nqrduck_autotm/widget.py @@ -283,6 +283,20 @@ class Ui_Form(object): self.S11Plot.setSizePolicy(sizePolicy) self.S11Plot.setObjectName("S11Plot") self.verticalLayout_5.addWidget(self.S11Plot) + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.verticalLayout_4 = QtWidgets.QVBoxLayout() + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.importButton = QtWidgets.QPushButton(parent=Form) + self.importButton.setObjectName("importButton") + self.verticalLayout_4.addWidget(self.importButton) + self.exportButton = QtWidgets.QPushButton(parent=Form) + self.exportButton.setObjectName("exportButton") + self.verticalLayout_4.addWidget(self.exportButton) + self.horizontalLayout.addLayout(self.verticalLayout_4) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout.addItem(spacerItem1) + self.verticalLayout_5.addLayout(self.horizontalLayout) self.horizontalLayout_2.addLayout(self.verticalLayout_5) self.horizontalLayout_2.setStretch(1, 1) @@ -342,4 +356,6 @@ class Ui_Form(object): self.calibrationButton.setText(_translate("Form", "Calibrate")) self.pushButton_3.setText(_translate("Form", "T&M Settings")) self.titleinfoLabel.setText(_translate("Form", "Info Box:")) + self.importButton.setText(_translate("Form", "Import Measurement")) + self.exportButton.setText(_translate("Form", "Export Measurement")) from nqrduck.contrib.mplwidget import MplWidget