diff --git a/bec_widgets/widgets/plots/waveform/waveform.py b/bec_widgets/widgets/plots/waveform/waveform.py index 2d8e777e..fa98c01a 100644 --- a/bec_widgets/widgets/plots/waveform/waveform.py +++ b/bec_widgets/widgets/plots/waveform/waveform.py @@ -1191,7 +1191,7 @@ class Waveform(PlotBase): logger.info(f"Setup async curve {name}") @SafeSlot(dict, dict) - def on_async_readback(self, msg, metadata): + def on_async_readback(self, msg, metadata, skip_sender_validation: bool = False): """ Get async data readback. This code needs to be fast, therefor we try to reduce the number of copies in between cycles. Be careful when refactoring @@ -1208,6 +1208,7 @@ class Waveform(PlotBase): Args: msg(dict): Message with the async data. metadata(dict): Metadata of the message. + skip_sender_validation(bool): Skip sender validation. Used for testing. Default is False. """ sender = self.sender() if sender and hasattr(sender, "cb_info"): @@ -1216,9 +1217,10 @@ class Waveform(PlotBase): logger.warning("Scan ID mismatch, ignoring async readback.") return logger.info(f"Async readback for scan ID {scan_id}.") - else: + elif not skip_sender_validation: stack_trace = traceback.extract_stack() logger.warning(f"Async readback without scan ID, stack trace: {stack_trace}") + return instruction = metadata.get("async_update", {}).get("type") if instruction not in ["add", "add_slice", "replace"]: logger.warning(f"Invalid async update instruction: {instruction}") diff --git a/tests/unit_tests/test_waveform_next_gen.py b/tests/unit_tests/test_waveform_next_gen.py index 2aa934d7..e88fba7a 100644 --- a/tests/unit_tests/test_waveform_next_gen.py +++ b/tests/unit_tests/test_waveform_next_gen.py @@ -541,7 +541,7 @@ def test_on_async_readback_add_update(qtbot, mocked_client): msg = {"signals": {"async_device": {"value": [100, 200], "timestamp": [1001, 1002]}}} metadata = {"async_update": {"max_shape": [None], "type": "add"}} - wf.on_async_readback(msg, metadata) + wf.on_async_readback(msg, metadata, skip_sender_validation=True) x_data, y_data = c.get_data() assert len(x_data) == 5 @@ -553,7 +553,7 @@ def test_on_async_readback_add_update(qtbot, mocked_client): # instruction='replace' msg2 = {"signals": {"async_device": {"value": [999], "timestamp": [555]}}} metadata2 = {"async_update": {"max_shape": [None], "type": "replace"}} - wf.on_async_readback(msg2, metadata2) + wf.on_async_readback(msg2, metadata2, skip_sender_validation=True) x_data2, y_data2 = c.get_data() np.testing.assert_array_equal(x_data2, [0]) @@ -568,7 +568,7 @@ def test_on_async_readback_add_update(qtbot, mocked_client): metadata = { "async_update": {"max_shape": [None, waveform_shape], "index": 0, "type": "add_slice"} } - wf.on_async_readback(msg, metadata) + wf.on_async_readback(msg, metadata, skip_sender_validation=True) # Old data should be deleted since the slice_index did not match x_data, y_data = c.get_data() @@ -595,7 +595,7 @@ def test_on_async_readback_add_update(qtbot, mocked_client): metadata = { "async_update": {"max_shape": [None, waveform_shape], "index": 0, "type": "add_slice"} } - wf.on_async_readback(msg, metadata) + wf.on_async_readback(msg, metadata, skip_sender_validation=True) x_data, y_data = c.get_data() assert len(y_data) == waveform_shape assert len(x_data) == waveform_shape @@ -616,8 +616,7 @@ def test_on_async_readback_add_update(qtbot, mocked_client): } } metadata = {"async_update": {"type": "replace"}} - wf.on_async_readback(msg, metadata) - + wf.on_async_readback(msg, metadata, skip_sender_validation=True) x_data, y_data = c.get_data() assert np.array_equal(y_data, np.array(range(waveform_shape))) assert len(x_data) == waveform_shape