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"))