mirror of
https://github.com/bec-project/ophyd_devices.git
synced 2025-06-11 22:07:14 +02:00
fix(bec_signals): fix validation of async signals
This commit is contained in:
@ -90,7 +90,7 @@ class SimWaveform(Device):
|
|||||||
compute_readback=True,
|
compute_readback=True,
|
||||||
kind=Kind.hinted,
|
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
|
# Can be extend or append
|
||||||
async_update = Cpt(AsyncUpdateSignal, value="add", kind=Kind.config)
|
async_update = Cpt(AsyncUpdateSignal, value="add", kind=Kind.config)
|
||||||
slice_size = Cpt(SetableSignal, value=100, dtype=np.int32, 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."""
|
"""Delay updates in-between slices specified by waveform_shape and slice_size."""
|
||||||
return self._delay_slice_update
|
return self._delay_slice_update
|
||||||
|
|
||||||
@typechecked
|
|
||||||
@delay_slice_update.setter
|
@delay_slice_update.setter
|
||||||
|
@typechecked
|
||||||
def delay_slice_update(self, value: bool) -> None:
|
def delay_slice_update(self, value: bool) -> None:
|
||||||
self._delay_slice_update = value
|
self._delay_slice_update = value
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def registered_proxies(self) -> None:
|
def registered_proxies(self) -> dict[str, Any]:
|
||||||
"""Dictionary of registered signal_names and proxies."""
|
"""Dictionary of registered signal_names and proxies."""
|
||||||
return self._registered_proxies
|
return self._registered_proxies
|
||||||
|
|
||||||
@ -229,6 +229,11 @@ class SimWaveform(Device):
|
|||||||
signals={self.waveform.name: {"value": value, "timestamp": time.time()}},
|
signals={self.waveform.name: {"value": value, "timestamp": time.time()}},
|
||||||
metadata=metadata,
|
metadata=metadata,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.data.put(
|
||||||
|
{self.data.name: {"value": value, "timestamp": time.time()}}, metadata=metadata
|
||||||
|
)
|
||||||
|
|
||||||
# Send the message to BEC
|
# Send the message to BEC
|
||||||
self.connector.xadd(
|
self.connector.xadd(
|
||||||
MessageEndpoints.device_async_readback(
|
MessageEndpoints.device_async_readback(
|
||||||
|
@ -695,7 +695,13 @@ class DynamicSignal(BECMessageSignal):
|
|||||||
|
|
||||||
def _check_signals(self, msg: messages.DeviceMessage) -> None:
|
def _check_signals(self, msg: messages.DeviceMessage) -> None:
|
||||||
"""Check if all signals are valid."""
|
"""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 self.strict_signal_validation:
|
||||||
if set(msg.signals.keys()) != set(available_signals):
|
if set(msg.signals.keys()) != set(available_signals):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
@ -744,6 +750,7 @@ class AsyncSignal(DynamicSignal):
|
|||||||
*,
|
*,
|
||||||
name: str,
|
name: str,
|
||||||
ndim: Literal[0, 1, 2],
|
ndim: Literal[0, 1, 2],
|
||||||
|
max_size: int,
|
||||||
value: messages.DeviceMessage | dict | None = None,
|
value: messages.DeviceMessage | dict | None = None,
|
||||||
async_update: dict | None = None,
|
async_update: dict | None = None,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
@ -753,7 +760,10 @@ class AsyncSignal(DynamicSignal):
|
|||||||
|
|
||||||
Args:
|
Args:
|
||||||
name (str): The name of the signal.
|
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.
|
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
|
kwargs.pop("kind", None) # Ignore kind if specified
|
||||||
super().__init__(
|
super().__init__(
|
||||||
@ -766,5 +776,6 @@ class AsyncSignal(DynamicSignal):
|
|||||||
value=value,
|
value=value,
|
||||||
bec_message_type=messages.DeviceMessage,
|
bec_message_type=messages.DeviceMessage,
|
||||||
async_update=async_update,
|
async_update=async_update,
|
||||||
|
signal_metadata={"max_size": max_size},
|
||||||
**kwargs,
|
**kwargs,
|
||||||
)
|
)
|
||||||
|
@ -282,7 +282,7 @@ def test_utils_dynamic_signal():
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Put works with Message
|
# 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)
|
msg = messages.DeviceMessage(signals=msg_dict)
|
||||||
signal.put(msg)
|
signal.put(msg)
|
||||||
reading = signal.read()
|
reading = signal.read()
|
||||||
|
Reference in New Issue
Block a user