From a26666071a63fe1f1a4ec6dcace6a34798dc5945 Mon Sep 17 00:00:00 2001 From: Filip Znachor Date: Thu, 8 Dec 2022 15:05:35 +0100 Subject: [PATCH] Added rest API --- server/api.py | 36 ++++++++++++++++++++++++++++++++++++ server/departures.py | 14 +++++++++++++- server/lora.py | 1 + server/main.py | 11 ++++++++--- 4 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 server/api.py diff --git a/server/api.py b/server/api.py new file mode 100644 index 0000000..c09b025 --- /dev/null +++ b/server/api.py @@ -0,0 +1,36 @@ +from bottle import route, template, error, run, ServerAdapter +from departures import Departure +import threading + +class Server(ServerAdapter): + server = None + def run(self, handler): + from wsgiref.simple_server import make_server, WSGIRequestHandler + if self.quiet: + class QuietHandler(WSGIRequestHandler): + def log_request(self, *args, **kw): + pass + self.options['handler_class'] = QuietHandler + self.server = make_server(self.host, self.port, handler, **self.options) + self.server.serve_forever() + def stop(self): + self.server.shutdown() + +server = Server(port=8080) + +@route('/departures') +def index(): + resp = [] + for d in Departure.storage: + resp.append(Departure.storage[d].json()) + return {'departures': resp} + +@error(404) +def error404(error): + return '' + +def start(): + run(quiet=True, server=server) + +thread = threading.Thread(target=start) +thread.start() diff --git a/server/departures.py b/server/departures.py index 1a1c244..b925dda 100644 --- a/server/departures.py +++ b/server/departures.py @@ -91,8 +91,20 @@ class Departure: self.delay = delay def get_departure(self): - departure = -round(((datetime.now().timestamp() - (self.departure + self.delay*60))/60)*10) + departure = round(self.get_accurate_departure()*10) return departure + def get_accurate_departure(self): + return -((datetime.now().timestamp() - (self.departure + self.delay*60))/60) + def __repr__(self): return f"{self.id}|{self.type}|{self.line}|{self.last_stop}|{self.get_departure()}" + + def json(self): + return { + 'id': self.id, + 'line': self.line, + 'type': self.type, + 'last_stop': self.last_stop, + 'departure': round(self.get_accurate_departure()) + } \ No newline at end of file diff --git a/server/lora.py b/server/lora.py index 51c3195..5bf6c3a 100644 --- a/server/lora.py +++ b/server/lora.py @@ -15,6 +15,7 @@ class LoraController: def __init__(self): self.storage = dict() self.devices = [] + # TODO: create separated message pool for each device self.message_pool = [] self.thread = None diff --git a/server/main.py b/server/main.py index 50be8ec..1a085cb 100644 --- a/server/main.py +++ b/server/main.py @@ -2,7 +2,8 @@ from departures import Departure from time import sleep from lora import lora_controller import threading - +from api import server +import sys class MainLoop: @@ -35,7 +36,11 @@ class MainLoop: Departure.clear() - sleep(10) + for i in range(10): + sleep(1) + if self.ended: + break + def input_loop(self): while not self.ended: @@ -56,9 +61,9 @@ class MainLoop: if command in ["s", "stop"]: print("Stopping...") + server.stop() self.ended = True self.controller.message_pool = [] - main_loop = MainLoop("40", lora_controller) main_loop.input_loop() \ No newline at end of file