diff --git a/pyproject.toml b/pyproject.toml index 58bd29f..401b4d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,7 @@ dependencies = [ "matplotlib", "pyqt6", "NQRduck", + "pyserial", ] [project.entry-points."nqrduck"] diff --git a/src/nqrduck_autotm/controller.py b/src/nqrduck_autotm/controller.py index d16d5e5..81a1e88 100644 --- a/src/nqrduck_autotm/controller.py +++ b/src/nqrduck_autotm/controller.py @@ -1,4 +1,17 @@ +import logging +from serial.tools.list_ports import comports from nqrduck.module.module_controller import ModuleController +logger = logging.getLogger(__name__) + class AutoTMController(ModuleController): - pass \ No newline at end of file + + + def find_devices(self): + """Scan for available serial devices and add them to the model as available devices. """ + logger.debug("Scanning for available serial devices") + ports = comports() + self.module.model.available_devices = [port.device for port in ports] + logger.debug("Found %s devices", len(self.module.model.available_devices)) + for device in self.module.model.available_devices: + logger.debug("Found device: %s", device) diff --git a/src/nqrduck_autotm/model.py b/src/nqrduck_autotm/model.py index 04c195e..8db4226 100644 --- a/src/nqrduck_autotm/model.py +++ b/src/nqrduck_autotm/model.py @@ -1,4 +1,14 @@ +from PyQt6.QtCore import pyqtSignal from nqrduck.module.module_model import ModuleModel class AutoTMModel(ModuleModel): - pass \ No newline at end of file + available_devices_changed = pyqtSignal(list) + + @property + def available_devices(self): + return self._available_devices + + @available_devices.setter + def available_devices(self, value): + self._available_devices = value + self.available_devices_changed.emit(value) diff --git a/src/nqrduck_autotm/resources/autotm_widget.ui b/src/nqrduck_autotm/resources/autotm_widget.ui index 56feca3..e24edbe 100644 --- a/src/nqrduck_autotm/resources/autotm_widget.ui +++ b/src/nqrduck_autotm/resources/autotm_widget.ui @@ -54,6 +54,13 @@ + + + + Refresh + + + diff --git a/src/nqrduck_autotm/view.py b/src/nqrduck_autotm/view.py index 5a3971b..a513975 100644 --- a/src/nqrduck_autotm/view.py +++ b/src/nqrduck_autotm/view.py @@ -1,5 +1,6 @@ import logging from PyQt6.QtWidgets import QWidget +from PyQt6.QtCore import pyqtSlot from nqrduck.module.module_view import ModuleView from .widget import Ui_Form @@ -13,4 +14,18 @@ class AutoTMView(ModuleView): widget = QWidget() self._ui_form = Ui_Form() self._ui_form.setupUi(self) - self.widget = widget \ No newline at end of file + self.widget = widget + + # On clicking of the refresh button scan for available usb devices + self._ui_form.refreshButton.clicked.connect(self.module.controller.find_devices) + + # Connect the available devices changed signal to the on_available_devices_changed slot + self.module.model.available_devices_changed.connect(self.on_available_devices_changed) + + @pyqtSlot(list) + def on_available_devices_changed(self, available_devices): + """Update the available devices list in the view. """ + logger.debug("Updating available devices list") + self._ui_form.portBox.clear() + self._ui_form.portBox.addItems(available_devices) + logger.debug("Updated available devices list") \ No newline at end of file diff --git a/src/nqrduck_autotm/widget.py b/src/nqrduck_autotm/widget.py index 92c66b7..8027ca3 100644 --- a/src/nqrduck_autotm/widget.py +++ b/src/nqrduck_autotm/widget.py @@ -40,6 +40,9 @@ class Ui_Form(object): self.pushButton = QtWidgets.QPushButton(parent=Form) self.pushButton.setObjectName("pushButton") self.gridLayout_2.addWidget(self.pushButton, 1, 1, 1, 1) + self.refreshButton = QtWidgets.QPushButton(parent=Form) + self.refreshButton.setObjectName("refreshButton") + self.gridLayout_2.addWidget(self.refreshButton, 1, 0, 1, 1) self.verticalLayout_2.addLayout(self.gridLayout_2) self.label_3 = QtWidgets.QLabel(parent=Form) font = QtGui.QFont() @@ -123,6 +126,7 @@ class Ui_Form(object): self.label_2.setText(_translate("Form", "Connection Settings:")) self.label.setText(_translate("Form", "Port:")) self.pushButton.setText(_translate("Form", "Connect")) + self.refreshButton.setText(_translate("Form", "Refresh")) self.label_3.setText(_translate("Form", "T&M Type:")) self.label_4.setText(_translate("Form", "Frequency Sweep:")) self.label_8.setText(_translate("Form", "MHz"))