Skip to content

Commit a4363b7

Browse files
committed
allow tetramm to recieve n triggers
1 parent 2ba8878 commit a4363b7

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

src/dodal/devices/tetramm.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
TriggerInfo,
1717
set_and_wait_for_value,
1818
soft_signal_r_and_setter,
19+
wait_for_value,
1920
)
2021
from ophyd_async.epics.adcore import (
2122
ADHDFWriter,
@@ -86,11 +87,9 @@ class TetrammController(DetectorController):
8687
"""The TetrAMM always digitizes at 100 kHz"""
8788
_base_sample_rate: int = 100_000
8889

89-
def __init__(
90-
self,
91-
driver: TetrammDriver,
92-
) -> None:
90+
def __init__(self, driver: TetrammDriver, file_io: NDFileHDFIO) -> None:
9391
self.driver = driver
92+
self._file_io = file_io
9493
self._arm_status: AsyncStatus | None = None
9594

9695
def get_deadtime(self, exposure: float | None) -> float:
@@ -111,9 +110,21 @@ async def prepare(self, trigger_info: TriggerInfo) -> None:
111110
await self.driver.trigger_mode.set(
112111
self._supported_trigger_types[trigger_info.trigger]
113112
)
113+
114+
total_triggers = (
115+
sum(trigger_info.number_of_events)
116+
if isinstance(trigger_info.number_of_events, list | tuple)
117+
else int(trigger_info.number_of_events)
118+
)
119+
120+
# Tetramms do not use a typical cam plugin, so we need to work out
121+
# the time per trigger
122+
averaging_time = trigger_info.livetime / total_triggers
123+
114124
await asyncio.gather(
115-
self.driver.averaging_time.set(trigger_info.livetime),
116-
self.set_exposure(trigger_info.livetime),
125+
self.driver.averaging_time.set(averaging_time),
126+
self.set_exposure(averaging_time),
127+
self._file_io.num_capture.set(total_triggers),
117128
)
118129

119130
# raise an error if asked to trigger faster than the max.
@@ -133,9 +144,9 @@ async def arm(self):
133144
self._arm_status = await self.start_acquiring_driver_and_ensure_status()
134145

135146
async def wait_for_idle(self):
136-
if self._arm_status and not self._arm_status.done:
137-
await self._arm_status
138-
self._arm_status = None
147+
# tetramm never goes idle really, actually it is always acquiring
148+
# so need to wait for the capture to finish instead
149+
await wait_for_value(self._file_io.capture, False, timeout=DEFAULT_TIMEOUT)
139150

140151
async def disarm(self):
141152
# We can't use caput callback as we already used it in arm() and we can't have
@@ -223,7 +234,7 @@ def __init__(
223234
):
224235
self.driver = TetrammDriver(prefix + drv_suffix)
225236
self.file_io = NDFileHDFIO(prefix + fileio_suffix)
226-
controller = TetrammController(self.driver)
237+
controller = TetrammController(self.driver, self.file_io)
227238

228239
writer = ADHDFWriter(
229240
fileio=self.file_io,

0 commit comments

Comments
 (0)