From 970fa9bcd3f0d656d5122a24ae0b0701ca0021c3 Mon Sep 17 00:00:00 2001 From: appel_c Date: Wed, 10 Dec 2025 07:05:02 +0100 Subject: [PATCH] w --- .../devices/epics/mcs_card/mcs_card_csaxs.py | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/csaxs_bec/devices/epics/mcs_card/mcs_card_csaxs.py b/csaxs_bec/devices/epics/mcs_card/mcs_card_csaxs.py index 300bf58..ba5ef4d 100644 --- a/csaxs_bec/devices/epics/mcs_card/mcs_card_csaxs.py +++ b/csaxs_bec/devices/epics/mcs_card/mcs_card_csaxs.py @@ -4,6 +4,7 @@ from __future__ import annotations import threading import time +from functools import partial from threading import RLock from typing import TYPE_CHECKING, Callable, Literal @@ -434,6 +435,12 @@ class MCSCardCSAXS(PSIDeviceBase, MCSCard): return signal: EpicsSignalRO attr_name = signal.attr_name + + # Ignore updates for channels that are not setup through num_connected_channels + index = int(attr_name[3:]) # Extract index from 'mcaX' + if index > self.num_connected_channels: + return + mca_channel = getattr(self, attr_name, None) if mca_channel is None: logger.error(f"Could not find matching MCA channel for signal {signal.name}") @@ -472,7 +479,7 @@ class MCSCardCSAXS(PSIDeviceBase, MCSCard): """ Called when the device is staged. """ - self.erase_all.set(1).wait(timeout=self._pv_timeout) + triggers = self.scan_info.msg.scan_parameters.get("frames_per_trigger", 1) num_points = self.scan_info.msg.num_points self._num_total_triggers = triggers * num_points @@ -480,6 +487,8 @@ class MCSCardCSAXS(PSIDeviceBase, MCSCard): self.preset_real.set(0).wait(timeout=self._pv_timeout) self.num_use_all.set(triggers).wait(timeout=self._pv_timeout) + self.erase_all.put(1) # Reset the MCS card + # Reset data self._received_updates.clear() @@ -493,7 +502,7 @@ class MCSCardCSAXS(PSIDeviceBase, MCSCard): Called when the device is unstaged. """ self.stop_all.put(1) - self.erase_all.set(0).wait(timeout=self._pv_timeout) + self.erase_all.put(1) # Reset the MCS card def _monitor_async_data_emission(self, timeout: int = 10) -> bool: """Monitor data emission after scan is done.""" @@ -518,10 +527,16 @@ class MCSCardCSAXS(PSIDeviceBase, MCSCard): def on_complete(self) -> CompareStatus: """On scan completion.""" - # Check Acquiring is DONE + # Prepare callback for data emission done status_async_data = StatusBase(obj=self) - status_async_data.add_callback(self._status_callback) + self._scan_done_callbacks.append(partial(self._status_callback, status_async_data)) + + # Start done callback loop + self._start_monitor_async_data_emission.set() + # Add CompareStatus for Acquiring DONE status = CompareStatus(self.acquiring, ACQUIRING.DONE) + + # Combine both statuses ret_status = status & status_async_data ret_status.add_callback(self._status_failed_callback) self.cancel_on_stop(ret_status)