Add timeout to get_trains

This commit is contained in:
Julian Metzler 2021-04-02 23:26:04 +02:00
parent 624a339c8d
commit 421d764b07
2 changed files with 36 additions and 1 deletions

9
run.py
View File

@ -8,6 +8,8 @@ from splitflap.krone import Krone8200Controller
from splitflap.display import SplitFlapDisplay, CustomMapField
from splitflap.exceptions import CommunicationError
from util import timeout
RX_ADDRESS = (0x41, 0x41)
MAP_ROUTE = {
@ -204,6 +206,11 @@ class BerlinSplitFlapDisplay(SplitFlapDisplay):
destination = CustomMapField(MAP_DESTINATION, start_address=3, x=4, y=1, module_width=16, module_height=1, home_pos=99)
@timeout(10)
def get_trains(dbi, station):
return dbi.get_trains(station)
def main():
controller = Krone8200Controller("/dev/ttyUSB1", RX_ADDRESS, debug=True)
display = BerlinSplitFlapDisplay(controller)
@ -228,7 +235,7 @@ def main():
print("\n" + "=" * 60 + "\n")
try:
trains = dbi.get_trains("Berlin Westkreuz")
trains = get_trains(dbi, "Berlin Westkreuz")
trains = dbi.calc_real_times(trains)
if not trains:
display.clear()

28
util.py Normal file
View File

@ -0,0 +1,28 @@
import errno
import os
import signal
from functools import wraps
class TimeoutError(Exception):
pass
def timeout(seconds, error_message = os.strerror(errno.ETIME)):
def decorator(func):
def _handle_timeout(signum, frame):
raise TimeoutError(error_message)
def wrapper(*args, **kwargs):
signal.signal(signal.SIGALRM, _handle_timeout)
signal.alarm(seconds)
try:
result = func(*args, **kwargs)
finally:
signal.alarm(0)
return result
return wraps(func)(wrapper)
return decorator