16
16
TriggerInfo ,
17
17
set_and_wait_for_value ,
18
18
soft_signal_r_and_setter ,
19
+ wait_for_value ,
19
20
)
20
21
from ophyd_async .epics .adcore import (
21
22
ADHDFWriter ,
@@ -86,11 +87,9 @@ class TetrammController(DetectorController):
86
87
"""The TetrAMM always digitizes at 100 kHz"""
87
88
_base_sample_rate : int = 100_000
88
89
89
- def __init__ (
90
- self ,
91
- driver : TetrammDriver ,
92
- ) -> None :
90
+ def __init__ (self , driver : TetrammDriver , file_io : NDFileHDFIO ) -> None :
93
91
self .driver = driver
92
+ self ._file_io = file_io
94
93
self ._arm_status : AsyncStatus | None = None
95
94
96
95
def get_deadtime (self , exposure : float | None ) -> float :
@@ -111,9 +110,21 @@ async def prepare(self, trigger_info: TriggerInfo) -> None:
111
110
await self .driver .trigger_mode .set (
112
111
self ._supported_trigger_types [trigger_info .trigger ]
113
112
)
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
+
114
124
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 ),
117
128
)
118
129
119
130
# raise an error if asked to trigger faster than the max.
@@ -133,9 +144,9 @@ async def arm(self):
133
144
self ._arm_status = await self .start_acquiring_driver_and_ensure_status ()
134
145
135
146
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 )
139
150
140
151
async def disarm (self ):
141
152
# We can't use caput callback as we already used it in arm() and we can't have
@@ -223,7 +234,7 @@ def __init__(
223
234
):
224
235
self .driver = TetrammDriver (prefix + drv_suffix )
225
236
self .file_io = NDFileHDFIO (prefix + fileio_suffix )
226
- controller = TetrammController (self .driver )
237
+ controller = TetrammController (self .driver , self . file_io )
227
238
228
239
writer = ADHDFWriter (
229
240
fileio = self .file_io ,
0 commit comments