Source code for ophyd_async.epics.adcore._acquire_logic
import asyncio
from ophyd_async.core import (
DEFAULT_TIMEOUT,
AsyncStatus,
DetectorAcquireLogic,
SignalR,
set_and_wait_for_other_value,
set_and_wait_for_value,
wait_for_value,
)
from ophyd_async.epics.core import stop_busy_record, wait_for_good_state
from ._io import ADBaseIO, ADState, NDCircularBuffIO
[docs]
class ADAcquireLogic(DetectorAcquireLogic):
def __init__(
self,
driver: ADBaseIO,
driver_armed_signal: SignalR[bool] | None = None,
timeout: float = DEFAULT_TIMEOUT,
):
self.driver = driver
if driver_armed_signal is not None:
self.driver_armed_signal = driver_armed_signal
else:
self.driver_armed_signal = driver.acquire
self.timeout = timeout
self.acquire_status: AsyncStatus | None = None
[docs]
async def start_acquiring(self):
self.acquire_status = await set_and_wait_for_other_value(
set_signal=self.driver.acquire,
set_value=True,
match_signal=self.driver_armed_signal,
match_value=True,
wait_for_set_completion=False,
timeout=self.timeout,
)
[docs]
async def wait_for_idle(self):
if self.acquire_status:
await self.acquire_status
await wait_for_good_state(
self.driver.detector_state,
{ADState.IDLE, ADState.ABORTED},
timeout=self.timeout,
)
[docs]
async def ensure_stopped(self):
await stop_busy_record(self.driver.acquire)
[docs]
class ADContAcqAcquireLogic(DetectorAcquireLogic):
def __init__(self, driver: ADBaseIO, cb_plugin: NDCircularBuffIO):
self.driver = driver
self.cb_plugin = cb_plugin
self.acquire_status: AsyncStatus | None = None
[docs]
async def ensure_ready(self):
await set_and_wait_for_value(
self.cb_plugin.capture,
True,
wait_for_set_completion=False,
timeout=DEFAULT_TIMEOUT,
)
[docs]
async def start_acquiring(self):
await self.cb_plugin.trigger_.set(True)
[docs]
async def wait_for_idle(self):
num_images, acquire_time = await asyncio.gather(
self.cb_plugin.post_count.get_value(),
self.driver.acquire_time.get_value(),
)
await wait_for_value(
self.cb_plugin.trigger_,
False,
timeout=num_images * acquire_time + DEFAULT_TIMEOUT,
)
[docs]
async def ensure_stopped(self):
await stop_busy_record(self.cb_plugin.capture)