From ed17af9dec20c463dc94c4262b3b98e7881298a3 Mon Sep 17 00:00:00 2001 From: appleb_m Date: Fri, 1 May 2026 14:28:49 +0200 Subject: [PATCH] GUI: park and dry toggle when automation finishes. --- src/aare/daq/server.py | 10 ++++----- src/aare/gui/main_window.py | 1 + src/aare/gui/panels/sample_queue_panel.py | 25 ++++++++++++++--------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/aare/daq/server.py b/src/aare/daq/server.py index 3a22bb8f..e7076a1f 100644 --- a/src/aare/daq/server.py +++ b/src/aare/daq/server.py @@ -634,7 +634,6 @@ async def samcam_autoexposure(token: str = Depends(oauth2_scheme)): Returns: "OK" on success. """ - logger.debug(f"SamCam settings: {s}") auth.check_jwt_rw(cfg, auth.parse_token(token)) daq.auto_exposure() return "OK" @@ -725,6 +724,8 @@ async def sample(token: str = Depends(oauth2_scheme)) -> SampleShortInfo: location=s.location ) + +@app.post("/sample/park_and_dry") async def park_and_dry(token: str = Depends(oauth2_scheme)): """ Execute the 'park and dry' procedure for the sample changer (TELL). @@ -735,12 +736,11 @@ async def park_and_dry(token: str = Depends(oauth2_scheme)): Returns: Dictionary with status and message. """ - token_data = auth.parse_token(token) - auth.check_jwt_ro(cfg, auth.parse_token(token)) + auth.check_jwt_rw(cfg, auth.parse_token(token)) daq.park_and_dry() - return { + return { "ok": True, - "message": "TELL has been dryed and parked", + "message": "TELL has been dried and parked", } diff --git a/src/aare/gui/main_window.py b/src/aare/gui/main_window.py index 61ae7669..15d0ace6 100644 --- a/src/aare/gui/main_window.py +++ b/src/aare/gui/main_window.py @@ -526,6 +526,7 @@ class MainWindow(QMainWindow): self.job_list_panel.auto_scan.connect(self.daq.automated_scan) self.job_list_panel.unmount.connect(self.daq.unmount) + self.job_list_panel.park_and_dry.connect(self.daq.park_and_dry) self.tell_samples.mount.connect(self.daq.mount) self.tell_samples.unmount.connect(self.daq.unmount) diff --git a/src/aare/gui/panels/sample_queue_panel.py b/src/aare/gui/panels/sample_queue_panel.py index 0471aae0..73b1b804 100644 --- a/src/aare/gui/panels/sample_queue_panel.py +++ b/src/aare/gui/panels/sample_queue_panel.py @@ -1,6 +1,6 @@ from PySide6.QtCore import Signal, Slot, Qt, QTimer from PySide6.QtWidgets import QFrame, QVBoxLayout, QHBoxLayout, QPushButton, QHeaderView, QSizePolicy, \ - QTableView, QMessageBox + QTableView, QMessageBox, QCheckBox from PySide6.QtGui import QKeySequence, QShortcut from aare.common.models import SampleShortInfoList, SampleShortInfo, BeamlineStateEnum @@ -19,6 +19,7 @@ CHECK_ENABLED = False class SampleQueuePanel(QFrame): auto_scan = Signal(SampleShortInfo) unmount = Signal() + park_and_dry = Signal() viewer_track_online = Signal() def __init__(self, parent=None, samples: SampleShortInfoList | None = None): @@ -83,11 +84,13 @@ class SampleQueuePanel(QFrame): self.clear_button = QPushButton("✖ Clear list", self) self.clear_button.clicked.connect(self.clear) - self.clear_button.clicked.connect(self.table_model.clearSamples) + self.park_and_dry_when_cleared = QCheckBox("Park and dry when automation finishes", self) + self.park_and_dry_when_cleared.setChecked(True) button_layout.addWidget(self.play_button) button_layout.addWidget(self.remove_button) button_layout.addWidget(self.clear_button) + button_layout.addWidget(self.park_and_dry_when_cleared) # Add the button layout to the main layout layout.addLayout(button_layout) @@ -157,6 +160,15 @@ class SampleQueuePanel(QFrame): def is_running(self): return not self.__pause + def _finish_empty_queue(self): + self.pause_automation() + if self.park_and_dry_when_cleared.isChecked(): + logger.info("Automation queue empty; parking and drying TELL.") + self.park_and_dry.emit() + else: + logger.info("Automation queue empty; unmounting current sample.") + self.unmount.emit() + def run(self): self.__recovery_timer.stop() if CHECK_ENABLED: @@ -260,12 +272,6 @@ class SampleQueuePanel(QFrame): self._current_db_id = None self.pause_automation() logger.critical("TELL Critical Error: Stopping automation.") - self.show_error_dialog(title=reply,msg="Critical Error", info="Repeated mount failuers.\n" - "Please check to see if pins" - " are loaded in these postions." - "\n If not please continue with new " - "samples.\nOtherwise contact your" - " local contact for support") self.show_error_dialog(title=reply, msg="Critical Error", info="Repeated mount failuers.\n" "Please check to see if pins" " are loaded in these postions." @@ -285,5 +291,4 @@ class SampleQueuePanel(QFrame): self._current_db_id = next_item.db_id self.auto_scan.emit(next_item) else: - self.pause_automation() - self.unmount.emit() \ No newline at end of file + self._finish_empty_queue() \ No newline at end of file