55from event_model import DataKey # type: ignore
66
77from ophyd_async .core import (
8+ DEFAULT_TIMEOUT ,
89 DetectorWriter ,
910 Device ,
1011 DeviceVector ,
1112 PathProvider ,
1213 StrictEnum ,
1314 observe_value ,
15+ set_and_wait_for_other_value ,
1416 set_and_wait_for_value ,
17+ wait_for_value ,
1518)
1619from ophyd_async .epics .core import (
1720 epics_signal_r ,
2124
2225
2326class Writing (StrictEnum ):
24- ON = "ON "
25- OFF = "OFF "
27+ CAPTURE = "Capture "
28+ DONE = "Done "
2629
2730
2831class OdinNode (Device ):
2932 def __init__ (self , prefix : str , name : str = "" ) -> None :
30- self .writing = epics_signal_r (Writing , f"{ prefix } HDF:Writing" )
31- self .connected = epics_signal_r (bool , f"{ prefix } Connected" )
33+ self .writing = epics_signal_r (str , f"{ prefix } Writing_RBV" )
34+ self .frames_dropped = epics_signal_r (int , f"{ prefix } FramesDropped_RBV" )
35+ self .frames_time_out = epics_signal_r (int , f"{ prefix } FramesTimedOut_RBV" )
36+ self .error_status = epics_signal_r (str , f"{ prefix } FPErrorState_RBV" )
37+ self .fp_initialised = epics_signal_r (int , f"{ prefix } FPProcessConnected_RBV" )
38+ self .fr_initialised = epics_signal_r (int , f"{ prefix } FRProcessConnected_RBV" )
39+ self .num_captured = epics_signal_r (int , f"{ prefix } NumCaptured_RBV" )
40+ self .clear_errors = epics_signal_rw (int , f"{ prefix } FPClearErrors" )
41+ self .error_message = epics_signal_rw (str , f"{ prefix } FPErrorMessage_RBV" )
3242
3343 super ().__init__ (name )
3444
3545
3646class Odin (Device ):
3747 def __init__ (self , prefix : str , name : str = "" ) -> None :
38- self .nodes = DeviceVector ({i : OdinNode (f"{ prefix } FP{ i } :" ) for i in range (4 )})
39-
40- self .capture = epics_signal_rw (
41- Writing , f"{ prefix } Writing" , f"{ prefix } ConfigHdfWrite"
48+ self .nodes = DeviceVector (
49+ {i : OdinNode (f"{ prefix [:- 1 ]} { i + 1 } :" ) for i in range (4 )}
4250 )
43- self .num_captured = epics_signal_r (int , f"{ prefix } FramesWritten" )
44- self .num_to_capture = epics_signal_rw_rbv (int , f"{ prefix } ConfigHdfFrames" )
4551
46- self .start_timeout = epics_signal_rw_rbv (int , f"{ prefix } TimeoutTimerPeriod" )
52+ self .capture = epics_signal_rw (Writing , f"{ prefix } Capture" )
53+ self .capture_rbv = epics_signal_r (str , prefix + "Capture_RBV" )
54+ self .num_captured = epics_signal_r (int , f"{ prefix } NumCapture_RBV" )
55+ self .num_to_capture = epics_signal_rw_rbv (int , f"{ prefix } NumCapture" )
4756
48- self .image_height = epics_signal_rw_rbv ( int , f"{ prefix } DatasetDataDims0 " )
49- self .image_width = epics_signal_rw_rbv ( int , f"{ prefix } DatasetDataDims1 " )
57+ self .start_timeout = epics_signal_rw ( str , f"{ prefix } StartTimeout " )
58+ self .timeout_active_rbv = epics_signal_r ( str , f"{ prefix } TimeoutActive_RBV " )
5059
51- self .num_row_chunks = epics_signal_rw_rbv (int , f"{ prefix } DatasetDataChunks1 " )
52- self .num_col_chunks = epics_signal_rw_rbv (int , f"{ prefix } DatasetDataChunks2 " )
60+ self .image_height = epics_signal_rw_rbv (int , f"{ prefix } ImageHeight " )
61+ self .image_width = epics_signal_rw_rbv (int , f"{ prefix } ImageWidth " )
5362
54- self .file_path = epics_signal_rw_rbv (str , f"{ prefix } ConfigHdfFilePath " )
55- self .file_name = epics_signal_rw_rbv (str , f"{ prefix } ConfigHdfFilePrefix " )
63+ self .num_row_chunks = epics_signal_rw_rbv (int , f"{ prefix } NumRowChunks " )
64+ self .num_col_chunks = epics_signal_rw_rbv (int , f"{ prefix } NumColChunks " )
5665
57- self .acquisition_id = epics_signal_rw_rbv (
58- str , f"{ prefix } ConfigHdfAcquisitionId"
59- )
66+ self .file_path = epics_signal_rw_rbv (str , f"{ prefix } FilePath" )
67+ self .file_name = epics_signal_rw_rbv (str , f"{ prefix } FileName" )
68+
69+ self .num_frames_chunks = epics_signal_rw (int , prefix + "NumFramesChunks" )
70+ self .meta_active = epics_signal_r (str , prefix + "META:AcquisitionActive_RBV" )
71+ self .meta_writing = epics_signal_r (str , prefix + "META:Writing_RBV" )
6072
61- self .data_type = epics_signal_rw_rbv (str , f"{ prefix } DatasetDataDatatype " )
73+ self .data_type = epics_signal_rw_rbv (str , f"{ prefix } DataType " )
6274
6375 super ().__init__ (name )
6476
@@ -81,12 +93,23 @@ async def open(self, name: str, exposures_per_event: int = 1) -> dict[str, DataK
8193 self ._drv .file_path .set (str (info .directory_path )),
8294 self ._drv .file_name .set (info .filename ),
8395 self ._drv .data_type .set (
84- "uint16 "
96+ "UInt16 "
8597 ), # TODO: Get from eiger https://github.com/bluesky/ophyd-async/issues/529
8698 self ._drv .num_to_capture .set (0 ),
8799 )
88100
89- await self ._drv .capture .set (Writing .ON )
101+ await wait_for_value (self ._drv .meta_active , "Active" , timeout = DEFAULT_TIMEOUT )
102+
103+ await set_and_wait_for_other_value (
104+ self ._drv .capture ,
105+ Writing .CAPTURE ,
106+ self ._drv .capture_rbv ,
107+ "Capturing" ,
108+ set_timeout = None ,
109+ wait_for_set_completion = False ,
110+ ) # TODO: Investigate why we do not get a put callback when setting capture pv https://github.com/bluesky/ophyd-async/issues/866
111+
112+ await wait_for_value (self ._drv .meta_writing , "Writing" , timeout = DEFAULT_TIMEOUT )
90113
91114 return await self ._describe ()
92115
@@ -122,4 +145,4 @@ def collect_stream_docs(
122145 raise NotImplementedError ()
123146
124147 async def close (self ) -> None :
125- await set_and_wait_for_value (self ._drv .capture , Writing .OFF )
148+ await set_and_wait_for_value (self ._drv .capture , Writing .DONE )
0 commit comments