Added rest API
This commit is contained in:
parent
e404753714
commit
a26666071a
36
server/api.py
Normal file
36
server/api.py
Normal file
|
@ -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()
|
|
@ -91,8 +91,20 @@ class Departure:
|
||||||
self.delay = delay
|
self.delay = delay
|
||||||
|
|
||||||
def get_departure(self):
|
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
|
return departure
|
||||||
|
|
||||||
|
def get_accurate_departure(self):
|
||||||
|
return -((datetime.now().timestamp() - (self.departure + self.delay*60))/60)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"{self.id}|{self.type}|{self.line}|{self.last_stop}|{self.get_departure()}"
|
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())
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ class LoraController:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.storage = dict()
|
self.storage = dict()
|
||||||
self.devices = []
|
self.devices = []
|
||||||
|
# TODO: create separated message pool for each device
|
||||||
self.message_pool = []
|
self.message_pool = []
|
||||||
self.thread = None
|
self.thread = None
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,8 @@ from departures import Departure
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from lora import lora_controller
|
from lora import lora_controller
|
||||||
import threading
|
import threading
|
||||||
|
from api import server
|
||||||
|
import sys
|
||||||
|
|
||||||
class MainLoop:
|
class MainLoop:
|
||||||
|
|
||||||
|
@ -35,7 +36,11 @@ class MainLoop:
|
||||||
|
|
||||||
Departure.clear()
|
Departure.clear()
|
||||||
|
|
||||||
sleep(10)
|
for i in range(10):
|
||||||
|
sleep(1)
|
||||||
|
if self.ended:
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
def input_loop(self):
|
def input_loop(self):
|
||||||
while not self.ended:
|
while not self.ended:
|
||||||
|
@ -56,9 +61,9 @@ class MainLoop:
|
||||||
|
|
||||||
if command in ["s", "stop"]:
|
if command in ["s", "stop"]:
|
||||||
print("Stopping...")
|
print("Stopping...")
|
||||||
|
server.stop()
|
||||||
self.ended = True
|
self.ended = True
|
||||||
self.controller.message_pool = []
|
self.controller.message_pool = []
|
||||||
|
|
||||||
|
|
||||||
main_loop = MainLoop("40", lora_controller)
|
main_loop = MainLoop("40", lora_controller)
|
||||||
main_loop.input_loop()
|
main_loop.input_loop()
|
Loading…
Reference in a new issue