From 9230b1728f04a692020fc9bf17dbe518b9c0a7c2 Mon Sep 17 00:00:00 2001 From: Pavel Lutskov Date: Sat, 30 Jun 2018 10:54:40 +0200 Subject: [PATCH] Forbid interrupt when initializing --- pykick/__main__.py | 15 ++++++++------- pykick/colorpicker.py | 27 ++++++++++++++------------- pykick/utils.py | 17 ++++++++++++++++- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/pykick/__main__.py b/pykick/__main__.py index 3c9214c..898a4c8 100644 --- a/pykick/__main__.py +++ b/pykick/__main__.py @@ -4,7 +4,7 @@ from time import time, sleep from math import cos, pi from .striker import Striker -from .utils import read_config +from .utils import read_config, InterruptDelayed @@ -59,12 +59,13 @@ if __name__ == '__main__': try: # Hit Ctrl-C to stop, cleanup and exit cfg = read_config() - striker = Striker( - nao_ip=cfg['ip'], nao_port=cfg['port'], - res=cfg['res'], ball_hsv=cfg['ball'], - goal_hsv=cfg['goal'], field_hsv=cfg['field'], - ball_min_radius=cfg['ball_min_radius'], - ) + with InterruptDelayed(): + striker = Striker( + nao_ip=cfg['ip'], nao_port=cfg['port'], + res=cfg['res'], ball_hsv=cfg['ball'], + goal_hsv=cfg['goal'], field_hsv=cfg['field'], + ball_min_radius=cfg['ball_min_radius'], + ) state = 'init' init_soll = 0.0 diff --git a/pykick/colorpicker.py b/pykick/colorpicker.py index a64ef95..7b40da6 100644 --- a/pykick/colorpicker.py +++ b/pykick/colorpicker.py @@ -8,7 +8,7 @@ import cv2 from .imagereaders import VideoReader, NaoImageReader, PictureReader from .finders import GoalFinder, BallFinder, FieldFinder -from .utils import read_config, imresize, hsv_mask +from .utils import read_config, imresize, hsv_mask, InterruptDelayed class Colorpicker(object): @@ -203,18 +203,19 @@ if __name__ == '__main__': if args.input_config: cp.load(args.input_config, args.target) - if args.video_file: - rdr = VideoReader(args.video_file, loop=True) - elif args.image_file: - rdr = PictureReader(args.image_file) - elif args.nao_ip: - rdr = NaoImageReader( - args.nao_ip, - cam_id=args.nao_cam, - res=args.nao_res - ) - else: - rdr = VideoReader(0) + with InterruptDelayed(): + if args.video_file: + rdr = VideoReader(args.video_file, loop=True) + elif args.image_file: + rdr = PictureReader(args.image_file) + elif args.nao_ip: + rdr = NaoImageReader( + args.nao_ip, + cam_id=args.nao_cam, + res=args.nao_res + ) + else: + rdr = VideoReader(0) try: if args.still: diff --git a/pykick/utils.py b/pykick/utils.py index cbb949b..5dee47e 100644 --- a/pykick/utils.py +++ b/pykick/utils.py @@ -2,9 +2,9 @@ from __future__ import division import os import json +import signal import cv2 -import numpy as np HERE = os.path.dirname(os.path.realpath(__file__)) @@ -40,3 +40,18 @@ def hsv_mask(hsv, hsv_lower, hsv_upper): return cv2.add(mask_l, mask_u) else: return cv2.inRange(hsv, tuple(hsv_lower), tuple(hsv_upper)) + +class InterruptDelayed(object): + + def __enter__(self): + self.signal_received = False + self.old_handler = signal.signal(signal.SIGINT, self.handler) + + def handler(self, sig, frame): + self.signal_received = (sig, frame) + print('SIGINT received. Delaying KeyboardInterrupt.') + + def __exit__(self, type, value, traceback): + signal.signal(signal.SIGINT, self.old_handler) + if self.signal_received: + self.old_handler(*self.signal_received)