From 923da8ca157c69825c9720f0667cf6eae5144c8e Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Wed, 9 Aug 2023 14:19:39 +0200 Subject: [PATCH] interactive client: improve keyboard interrupt - when driving a module with (), keyboard interrupt should send stop() - make sure keyboard interrupt does not only stop the current driving, but also skips other code on the same command line Change-Id: Ib4d2c4111dc0f23bf07385065766fb9b4a611454 Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/31926 Tested-by: Jenkins Automated Tests Reviewed-by: Markus Zolliker --- frappy/client/interactive.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/frappy/client/interactive.py b/frappy/client/interactive.py index ce02317..5614f2d 100644 --- a/frappy/client/interactive.py +++ b/frappy/client/interactive.py @@ -214,18 +214,28 @@ class Module: return self.read() self.target = target # this sets self._is_driving type(self).value.prev = None # show at least one value - try: + + def loop(): while self._is_driving: self._driving_event.wait() self._watch_parameter(self._name, 'value', mininterval=self._secnode.mininterval) self._watch_parameter(self._name, 'status') self._driving_event.clear() - except KeyboardInterrupt: - self.stop() + try: + loop() + except KeyboardInterrupt as e: self._secnode.log.info('-- interrupted --') - self._watch_parameter(self._name, 'status') - self._secnode.readParameter(self._name, 'value') - self._watch_parameter(self._name, 'value', forced=True) + self.stop() + try: + loop() # wait for stopping to be finished + except KeyboardInterrupt: + # interrupted again while stopping -> definitely quit + pass + clientenv.raise_with_short_traceback(e) + finally: + self._watch_parameter(self._name, 'status') + self._secnode.readParameter(self._name, 'value') + self._watch_parameter(self._name, 'value', forced=True) return self.value def __repr__(self): @@ -331,8 +341,8 @@ def watch(*args, **kwds): for mobj in modules: mobj._start_watching() time.sleep(3600) - except KeyboardInterrupt: - pass + except KeyboardInterrupt as e: + clientenv.raise_with_short_traceback(e) finally: for mobj in modules: mobj._stop_watching()