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:
parent
7a2e764262
commit
923da8ca15
@ -214,18 +214,28 @@ 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._watch_parameter(self._name, 'status')
|
self.stop()
|
||||||
self._secnode.readParameter(self._name, 'value')
|
try:
|
||||||
self._watch_parameter(self._name, 'value', forced=True)
|
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
|
return self.value
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user