interactive client: improve keyboard interrupt

- when driving a module with <module>(<target>),
  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 <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
zolliker 2023-08-09 14:19:39 +02:00
parent 7a2e764262
commit 923da8ca15

View File

@ -214,15 +214,25 @@ class Module:
return self.read() return self.read()
self.target = target # this sets self._is_driving self.target = target # this sets self._is_driving
type(self).value.prev = None # show at least one value type(self).value.prev = None # show at least one value
try:
def loop():
while self._is_driving: while self._is_driving:
self._driving_event.wait() self._driving_event.wait()
self._watch_parameter(self._name, 'value', mininterval=self._secnode.mininterval) self._watch_parameter(self._name, 'value', mininterval=self._secnode.mininterval)
self._watch_parameter(self._name, 'status') self._watch_parameter(self._name, 'status')
self._driving_event.clear() self._driving_event.clear()
except KeyboardInterrupt: try:
self.stop() loop()
except KeyboardInterrupt as e:
self._secnode.log.info('-- interrupted --') self._secnode.log.info('-- interrupted --')
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._watch_parameter(self._name, 'status')
self._secnode.readParameter(self._name, 'value') self._secnode.readParameter(self._name, 'value')
self._watch_parameter(self._name, 'value', forced=True) self._watch_parameter(self._name, 'value', forced=True)
@ -331,8 +341,8 @@ def watch(*args, **kwds):
for mobj in modules: for mobj in modules:
mobj._start_watching() mobj._start_watching()
time.sleep(3600) time.sleep(3600)
except KeyboardInterrupt: except KeyboardInterrupt as e:
pass clientenv.raise_with_short_traceback(e)
finally: finally:
for mobj in modules: for mobj in modules:
mobj._stop_watching() mobj._stop_watching()