diff --git a/ophyd_devices/sim/sim_waveform.py b/ophyd_devices/sim/sim_waveform.py index 884a0e9..22581b1 100644 --- a/ophyd_devices/sim/sim_waveform.py +++ b/ophyd_devices/sim/sim_waveform.py @@ -90,7 +90,7 @@ class SimWaveform(Device): compute_readback=True, kind=Kind.hinted, ) - data = Cpt(AsyncSignal, name="data", ndim=1) + data = Cpt(AsyncSignal, name="data", ndim=1, max_size=1000) # Can be extend or append async_update = Cpt(AsyncUpdateSignal, value="add", kind=Kind.config) slice_size = Cpt(SetableSignal, value=100, dtype=np.int32, kind=Kind.config) @@ -132,13 +132,13 @@ class SimWaveform(Device): """Delay updates in-between slices specified by waveform_shape and slice_size.""" return self._delay_slice_update - @typechecked @delay_slice_update.setter + @typechecked def delay_slice_update(self, value: bool) -> None: self._delay_slice_update = value @property - def registered_proxies(self) -> None: + def registered_proxies(self) -> dict[str, Any]: """Dictionary of registered signal_names and proxies.""" return self._registered_proxies @@ -229,6 +229,11 @@ class SimWaveform(Device): signals={self.waveform.name: {"value": value, "timestamp": time.time()}}, metadata=metadata, ) + + self.data.put( + {self.data.name: {"value": value, "timestamp": time.time()}}, metadata=metadata + ) + # Send the message to BEC self.connector.xadd( MessageEndpoints.device_async_readback( diff --git a/ophyd_devices/utils/bec_signals.py b/ophyd_devices/utils/bec_signals.py index d7b115e..59a3f74 100644 --- a/ophyd_devices/utils/bec_signals.py +++ b/ophyd_devices/utils/bec_signals.py @@ -695,7 +695,13 @@ class DynamicSignal(BECMessageSignal): def _check_signals(self, msg: messages.DeviceMessage) -> None: """Check if all signals are valid.""" - available_signals = [name for name, _ in self.signals] + if len(self.signals) == 1: + if self.name not in msg.signals: + raise ValueError( + f"Signal {self.name} not found in message {list(msg.signals.keys())}" + ) + return + available_signals = [f"{self.name}_{name}" for name, _ in self.signals] if self.strict_signal_validation: if set(msg.signals.keys()) != set(available_signals): raise ValueError( @@ -744,6 +750,7 @@ class AsyncSignal(DynamicSignal): *, name: str, ndim: Literal[0, 1, 2], + max_size: int, value: messages.DeviceMessage | dict | None = None, async_update: dict | None = None, **kwargs, @@ -753,7 +760,10 @@ class AsyncSignal(DynamicSignal): Args: name (str): The name of the signal. + ndim (Literal[0, 1, 2]): The number of dimensions of the signal(s). + max_size (int): The maximum size of the signal buffer. value (AsyncMessage | dict | None): The initial value of the signal. Defaults to None. + async_update (dict | None): Additional metadata for asynchronous updates. Defaults to None. """ kwargs.pop("kind", None) # Ignore kind if specified super().__init__( @@ -766,5 +776,6 @@ class AsyncSignal(DynamicSignal): value=value, bec_message_type=messages.DeviceMessage, async_update=async_update, + signal_metadata={"max_size": max_size}, **kwargs, ) diff --git a/tests/test_utils.py b/tests/test_utils.py index eb909c1..b22695c 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -282,7 +282,7 @@ def test_utils_dynamic_signal(): } # Put works with Message - msg_dict = {"sig1": {"value": 1}, "sig2": {"value": 2}} + msg_dict = {"dynamic_signal_sig1": {"value": 1}, "dynamic_signal_sig2": {"value": 2}} msg = messages.DeviceMessage(signals=msg_dict) signal.put(msg) reading = signal.read()