fix(bec_signals): fix validation of async signals

This commit is contained in:
wakonig_k 2025-06-04 14:54:15 +02:00 committed by Jan Wyzula
parent 8e76ad63cb
commit b76acfebb4
3 changed files with 21 additions and 5 deletions

View File

@ -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(

View File

@ -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,
)

View File

@ -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()