EMF_Camp_Badge/trains/departure_screen.py

118 lines
3.6 KiB
Python

import sleep
import ugfx
import database
from time import time
from homescreen import time_as_string
from tilda import Buttons
from trains.screen import Screen, S_CONTINUE, S_TO_SETTINGS, S_EXIT
from trains.api import get_trains
from trains.utils import get_departure, get_title, is_red
UPDATE_INTERVAL_SECS = 30
class DepartureScreen(Screen):
def __init__(self):
self.station_data = None
self.has_error = False
self.last_update = 0
self.should_redraw = True
self._names = None
self._old_names = None
def enter(self):
self.next_state = S_CONTINUE
self.station_code = database.get('trains.station_code', 'LBG')
self.last_update = 0
Buttons.enable_interrupt(
Buttons.BTN_A,
lambda t: self.set_next_state(S_TO_SETTINGS),
on_press=True,
on_release=False
)
Buttons.enable_interrupt(
Buttons.BTN_Menu,
lambda t: self.set_next_state(S_EXIT),
on_press=True,
on_release=False
)
def set_next_state(self, s):
self.next_state = s
def update(self):
now = time()
if self.last_update < (now - UPDATE_INTERVAL_SECS):
print('trains/departure_screen: Updating data')
new_station_data = get_trains(self.station_code)
if new_station_data == None:
self.has_error = True
self.should_redraw = True
else:
self.station_data = new_station_data
self.has_error = False
self.should_redraw = True
self.last_update = now
def tick(self):
self.update()
if self.should_redraw:
if self.station_data == None:
self.show_error()
else:
self.show_trains()
else:
self._destroy_old_names()
sleep.sleep_ms(500)
return self.next_state
def _get_names_container(self):
if self._names != None:
self._names.hide()
self._old_names = self._names
names = ugfx.Container(0, 25, 190, 295)
self._names = names
return names
def _destroy_old_names(self):
if self._old_names != None:
self._old_names.destroy()
self._old_names = None
def _destroy_names(self):
if self._names != None:
self._names.destroy()
self._names = None
def show_trains(self):
ugfx.clear()
ugfx.area(0, 0, 240, 25, ugfx.RED if self.has_error else ugfx.GRAY)
title = get_title(self.station_data['locationName'], self.has_error)
ugfx.text(5, 5, title, ugfx.WHITE if self.has_error else ugfx.BLACK)
ugfx.text(195, 5, time_as_string(), ugfx.BLUE)
names = self._get_names_container()
names.show()
row_num = 0
for service in self.station_data['trainServices']:
departure = get_departure(service)
if departure:
names.text(5, 15 * row_num, service['destination'][0]['locationName'], ugfx.BLACK)
ugfx.text(195, 25 + (15 * row_num), departure,ugfx.RED if is_red(service) else ugfx.BLUE)
row_num += 1
ugfx.display_image(0, 300, 'trains/bottom.gif')
self.should_redraw = False
def show_error(self):
ugfx.clear()
ugfx.text(5, 5, 'Error :(', ugfx.RED)
self.should_redraw = False
def exit(self):
self._destroy_old_names()
self._destroy_names()
Buttons.disable_all_interrupt()