From e5f2e7827680ecac735fe0d877c9a176116996bd Mon Sep 17 00:00:00 2001 From: appel_c Date: Mon, 13 Apr 2026 11:28:33 +0200 Subject: [PATCH] fix(dynamic-pseudo): fix signal_callback runs before compute method --- ophyd_devices/utils/dynamic_pseudo.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/ophyd_devices/utils/dynamic_pseudo.py b/ophyd_devices/utils/dynamic_pseudo.py index 3dcf306..a1034b5 100644 --- a/ophyd_devices/utils/dynamic_pseudo.py +++ b/ophyd_devices/utils/dynamic_pseudo.py @@ -78,7 +78,10 @@ class ComputedSignal(SignalRO): self._compute_method_str = None def _signal_callback(self, *args, **kwargs): - self._run_subs(sub_type=self.SUB_VALUE, old_value=None, value=self.get()) + old_value = self._readback + val = self.get() + if val is not None: + self._run_subs(sub_type=self.SUB_VALUE, old_value=old_value, value=val) @property def compute_method(self) -> Callable | None: @@ -147,21 +150,25 @@ class ComputedSignal(SignalRO): if self._signal_subs: for signal, sub_id in self._signal_subs: signal.unsubscribe(sub_id) + self._signal_subs.clear() signals = [] for signal in input_vars: if isinstance(signal, str): obj = rgetattr(self._device_manager.devices, signal) - sub_id = obj.subscribe(self._signal_callback) + sub_id = obj.subscribe(self._signal_callback, run=False) self._signal_subs.append((obj, sub_id)) signals.append(obj) else: signals.append(signal) self._input_signals = signals - def get(self): + def get(self, **kwargs): + return_value = None if self._compute_method: # pylint: disable=not-callable if self.input_signals: - return self._compute_method(*self.input_signals) - return self._compute_method() - return None + return_value = self._compute_method(*self.input_signals) + else: + return_value = self._compute_method() + self._readback = return_value if return_value is not None else self._readback + return return_value