refactor(bec-signals): cleanup and fix logic for unify signal in BECMessageSignal

This commit is contained in:
2025-10-22 10:11:00 +02:00
committed by Christian Appel
parent 051d665490
commit 5523ead87c
3 changed files with 21 additions and 39 deletions

View File

@@ -158,7 +158,8 @@ class BECMessageSignal(Signal):
out = [] out = []
for signal in signals: for signal in signals:
if isinstance(signal, str): if isinstance(signal, str):
out.append((signal, Kind.normal.value)) kind = Kind.hinted.value if len(signals) == 1 else Kind.normal.value
out.append((signal, kind))
elif isinstance(signal, tuple) and len(signal) == 2: elif isinstance(signal, tuple) and len(signal) == 2:
if isinstance(signal[1], Kind): if isinstance(signal[1], Kind):
out.append((signal[0], signal[1].value)) out.append((signal[0], signal[1].value))

View File

@@ -838,15 +838,6 @@ def test_waveform_send_async_update(waveform, mode, index, expected_md):
wv_shape, wv_shape,
) )
# assert np.array_equal(reading[waveform.data.name]["value"], value)
# assert waveform.data.get()
# with mock.patch.object(waveform.connector, "xadd") as mock_xadd:
# waveform._send_async_update(index=index, value=value)
# # Check here that metadata is properly set
# args, kwargs = mock_xadd.call_args
# msg = args[1]["data"]
# assert msg.metadata == expected_md
##################################### #####################################
### Test PSiComponent test device ### ### Test PSiComponent test device ###
@@ -864,29 +855,7 @@ def test_simulation_sim_camera_with_psi_component(test_device):
assert test_device.name == "test_device" assert test_device.name == "test_device"
assert all( assert all(
element in test_device._signals element in test_device._signals
for element in [ for element in ["preview_2d", "preview_1d", "file_event", "progress", "dynamic_signal"]
"preview_2d",
"preview_1d",
"file_event",
"progress",
"dynamic_signal",
# "async_1d",
# "async_2d",
]
) )
# No signals are shown when read is called on the device # No signals are shown when read is called on the device
assert test_device.read() == {} assert test_device.read() == {}
### Commented out because the async signals are not implemented yet, cf. issue #104
# Hinted and normal signals
# assert list(test_device.async_1d.read().keys()) == [
# "test_device_async_1d_signal1",
# "test_device_async_1d_signal2",
# ]
# assert list(test_device.async_2d.read().keys()) == [
# "test_device_async_2d_signal1",
# "test_device_async_2d_signal2",
# ]
# # Config signals
# assert "test_device_async_1d_signal3" in test_device.async_1d.read_configuration()
# assert "test_device_async_2d_signal3" in test_device.async_2d.read_configuration()

View File

@@ -1,5 +1,6 @@
import threading import threading
import time import time
from functools import partial
from unittest import mock from unittest import mock
import numpy as np import numpy as np
@@ -10,7 +11,7 @@ from ophyd import Device, EpicsSignalRO, Signal
from ophyd.status import WaitTimeoutError from ophyd.status import WaitTimeoutError
from typeguard import TypeCheckError from typeguard import TypeCheckError
from ophyd_devices.tests.utils import MockPV, patch_dual_pvs from ophyd_devices.tests.utils import MockPV
from ophyd_devices.utils.bec_signals import ( from ophyd_devices.utils.bec_signals import (
AsyncMultiSignal, AsyncMultiSignal,
AsyncSignal, AsyncSignal,
@@ -333,17 +334,23 @@ def test_utils_dynamic_signal():
def test_utils_dynamic_signal_with_defaults(): def test_utils_dynamic_signal_with_defaults():
"""Test DynamicSignal with async_update and acquisition group defaults""" """
Test DynamicSignal with async_update and acquisition group defaults. If only
one sub-signal is provided for the dynamic signal, the name of the sub-signal
will be used in the signals dict and a warning will be issued that the sub-signal
name is being ignored.
"""
dev = Device(name="device") dev = Device(name="device")
signal = DynamicSignal( create_signal = partial(
DynamicSignal,
name="dynamic_signal", name="dynamic_signal",
parent=dev,
ndim=1, ndim=1,
signals=["sig1", "sig2"], value=None,
async_update={"type": "add", "max_shape": [None, 1000]}, async_update={"type": "add", "max_shape": [None, 1000]},
acquisition_group="fly-scanning", acquisition_group="fly-scanning",
value=None,
parent=dev,
) )
signal = create_signal(signals=["sig1", "sig2"])
val = np.random.random(1000) val = np.random.random(1000)
msg_dict = {"dynamic_signal_sig1": {"value": val}} msg_dict = {"dynamic_signal_sig1": {"value": val}}
signal.put(msg_dict) signal.put(msg_dict)
@@ -357,6 +364,11 @@ def test_utils_dynamic_signal_with_defaults():
reading = signal.read() reading = signal.read()
assert reading[signal.name]["value"].metadata["acquisition_group"] == "different-group" assert reading[signal.name]["value"].metadata["acquisition_group"] == "different-group"
# Test init variations for single signal
for signal in [["sig1"], "sig1", None]:
signal = create_signal(signals=signal)
assert signal.signals == [(signal.name, ophyd.Kind.hinted.value)]
def test_utils_async_multi_signal(): def test_utils_async_multi_signal():
"""Test AsyncMultiSignal, which is a DynamicSignal with strict signal validation.""" """Test AsyncMultiSignal, which is a DynamicSignal with strict signal validation."""