Add timeout to get_trains
This commit is contained in:
parent
624a339c8d
commit
421d764b07
9
run.py
9
run.py
|
@ -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()
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue