From 616010a0e9e4c634d3f1b307121da13ec7175acc Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Fri, 28 Nov 2025 23:01:48 +0100 Subject: [PATCH] feat(sim_waveform): add progress and async multi data signals to SimWaveform --- ophyd_devices/sim/sim_waveform.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/ophyd_devices/sim/sim_waveform.py b/ophyd_devices/sim/sim_waveform.py index 89ceacd..914d117 100644 --- a/ophyd_devices/sim/sim_waveform.py +++ b/ophyd_devices/sim/sim_waveform.py @@ -17,7 +17,7 @@ from typeguard import typechecked from ophyd_devices.sim.sim_data import SimulatedDataWaveform from ophyd_devices.sim.sim_signals import ReadOnlySignal, SetableSignal from ophyd_devices.utils import bec_utils -from ophyd_devices.utils.bec_signals import AsyncSignal +from ophyd_devices.utils.bec_signals import AsyncMultiSignal, AsyncSignal, ProgressSignal from ophyd_devices.utils.errors import DeviceStopError logger = bec_logger.logger @@ -94,6 +94,10 @@ class SimWaveform(Device): data = Cpt(AsyncSignal, name="data", ndim=1, max_size=1000) # Can be extend or append async_update = Cpt(AsyncUpdateSignal, value="add", kind=Kind.config) + progress = Cpt(ProgressSignal, name="progress") + async_multi_data = Cpt( + AsyncMultiSignal, name="async_multi_data", signals=["data1", "data2"], ndim=1, max_size=1000 + ) slice_size = Cpt(SetableSignal, value=100, dtype=np.int32, kind=Kind.config) def __init__( @@ -122,6 +126,7 @@ class SimWaveform(Device): self.stopped = False self._staged = Staged.no self._trigger_thread = None + self._trigger_received = 0 self.scan_info = scan_info self._delay_slice_update = False if self.sim_init: @@ -197,6 +202,12 @@ class SimWaveform(Device): self._trigger_thread = threading.Thread(target=acquire, args=(status,), daemon=True) self._trigger_thread.start() + self._trigger_received += 1 + self.progress.put( + value=self._trigger_received, + max_value=self.frames.get(), + done=self.frames.get() == self._trigger_received, + ) return status def _send_async_update(self, value: Any, index: int | None = None) -> None: @@ -239,6 +250,9 @@ class SimWaveform(Device): expire=self._stream_ttl, ) self.data.put(value, async_update=async_update) + self.async_multi_data.put( + {"data1": {"value": value}, "data2": {"value": value}}, async_update=async_update + ) def stage(self) -> list[object]: """Stage the camera for upcoming scan @@ -264,6 +278,7 @@ class SimWaveform(Device): self.burst.set(self.scan_info.msg.scan_parameters["frames_per_trigger"]) self.stopped = False self._slice_index = 0 + self._trigger_received = 0 logger.warning(f"Staged {self.name}, scan_id : {self.scan_info.msg.scan_id}") return super().stage()