From f832e40898107ff6b6ebf1eee9069bf2c360c559 Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Mon, 17 Nov 2025 16:06:07 +0100 Subject: [PATCH] add shortcut for acquisition modules acq() sets goal, starts and waits for completion --- frappy/client/interactive.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/frappy/client/interactive.py b/frappy/client/interactive.py index 2b604af3..a212692e 100644 --- a/frappy/client/interactive.py +++ b/frappy/client/interactive.py @@ -64,6 +64,8 @@ LOG_LEVELS = { 'off': logging.ERROR+1} CLR = '\r\x1b[K' # code to move to the left and clear current line +UNDEF = object() + class Handler(logging.StreamHandler): def emit(self, record): @@ -213,8 +215,8 @@ class Module: clientenv.raise_with_short_traceback(error) return value - def __call__(self, target=None): - if target is None: + def __call__(self, target=UNDEF): + if target is UNDEF: return self.read() watch_params = ['value', 'status'] for pname in watch_params: @@ -222,7 +224,15 @@ class Module: updateEvent=self._watch_parameter, callimmediately=False) - self.target = target # this sets self._is_driving + if 'go' in self._commands: + if 'goal' in self._parameters and target is not None: + self.goal_enable = True + self.goal = target + if 'target' in self._parameters: + self.target = target + self.go() + elif 'target' in self._parameters: + self.target = target # this sets self._is_driving def loop(): while self._is_driving: @@ -232,7 +242,10 @@ class Module: loop() except KeyboardInterrupt as e: self._secnode.log.info('-- interrupted --') - self.stop() + try: + self.stop() + except Exception as e: + print(f'while stopping: {e!r}') try: loop() # wait for stopping to be finished except KeyboardInterrupt: @@ -297,6 +310,8 @@ class Param: class Command: + _obj = None + def __init__(self, name, modname, secnode): self.name = name self.modname = modname @@ -311,11 +326,14 @@ class Command: result, _ = self.exec(self.modname, self.name, *args) else: result, _ = self.exec(self.modname, self.name, args or None) + if self.name == 'go' and self._obj: + self._obj._is_driving = self._obj._isBusy() return result def __get__(self, obj, owner=None): if obj is None: return self + self._obj = obj return self.call