w
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user