diff --git a/server/departures.py b/server/departures.py index 6ff29f3..1a1c244 100644 --- a/server/departures.py +++ b/server/departures.py @@ -74,24 +74,25 @@ class Departure: if -(datetime.now().timestamp() - (departure + delay*60))/60 <= -1: return Departure.storage[did] = self + if len(last_stop) >= 21: + last_stop = last_stop[:20].strip() + "..." self.did = did self.id = Departure.get_id() self.line = line - if len(last_stop) >= 21: - last_stop = last_stop[:20].strip() + "..." + self.type = type self.last_stop = last_stop self.departure = departure - self.type = type - self.update(delay) + self.delay = delay lora_controller.data(self) def update(self, delay): + if delay != self.delay: + lora_controller.data(self) self.delay = delay - lora_controller.data(self) def get_departure(self): departure = -round(((datetime.now().timestamp() - (self.departure + self.delay*60))/60)*10) return departure def __repr__(self): - return f"{self.id}|{self.type}|{self.line}|{self.last_stop}|{floor(self.get_departure()/10)}" + return f"{self.id}|{self.type}|{self.line}|{self.last_stop}|{self.get_departure()}" diff --git a/server/lora.py b/server/lora.py index 388518a..51c3195 100644 --- a/server/lora.py +++ b/server/lora.py @@ -37,23 +37,14 @@ class LoraController: self.devices.append(LoraDevice(self, id)) def time(self): + def to_string(): + return f"TIME|{(datetime.now() - datetime(1970, 1, 1)).total_seconds():.0f}" for d in self.devices: - d.send(f"TIME|{(datetime.now() - datetime(1970, 1, 1)).total_seconds():.0f}") + d.send(to_string) def data(self, data): - sent = True - if data.id in self.storage: - d = self.storage[data.id] - if data.line != d["line"] or data.last_stop != d["last_stop"] or data.delay != d["delay"]: - sent = False - else: - sent = False - self.storage[data.id] = { 'line': data.line, 'last_stop': data.last_stop, 'delay': data.delay } - if sent: - return - string = f"{data.id}|{data.type}|{data.line}|{data.last_stop}|{data.get_departure()}" for d in self.devices: - d.send(f"{string}") + d.send(data.__repr__) def send(self, id, port, msg): self.message_pool.append((id, port, msg)) @@ -67,17 +58,18 @@ class LoraController: break data = self.message_pool.pop() url = f"https://lora.plzen.eu/api/v2/nodes/{data[0]:0>16x}/queue" - print(f"Sending {data[2]}") + string = data[2]() headers = CaseInsensitiveDict() headers["Content-Type"] = "application/json" headers["Authorization"] = f"Bearer {config.lora_api_token}" payload = { "confirmed": True, - "data": b64encode(data[2].encode("utf-8")).decode("ascii"), + "data": b64encode(string.encode("utf-8")).decode("ascii"), "fPort": data[1], "reference": "string" } requests.post(url, verify=False, headers=headers, data=json.dumps(payload)) + sleep(2) class LoraDevice: @@ -86,7 +78,7 @@ class LoraDevice: self.id = deveui self.port = 0 - def send(self, msg: str): + def send(self, msg): self.controller.send(self.id, self.port+1, msg) self.port = (self.port + 1) % 15 diff --git a/server/main.py b/server/main.py index 5996b25..31a7708 100644 --- a/server/main.py +++ b/server/main.py @@ -1,31 +1,64 @@ from departures import Departure from time import sleep from lora import lora_controller +import threading -refetch = 0 -regenerate = 0 -while True: +class MainLoop: - if regenerate == 0: - lora_controller.generate_token() + def __init__(self, stop_id, controller): + self.ended = False + self.stop_id = stop_id + self.controller = controller + self.thread = threading.Thread(target=self.update_loop) + self.thread.start() - if refetch == 0: - lora_controller.time() - Departure.fetch("40", 10) - - refetch = (refetch + 1) % 3 - regenerate = (regenerate + 1) % (6*30) - - sleep(.1) + def update_loop(self): + refetch = 0 + regenerate = 0 + while True: - Departure.clear() - - sleep(.1) + if self.ended: + break - print("") - for did in Departure.storage: - print(Departure.storage[did]) - print("") - - sleep(10) \ No newline at end of file + if regenerate == 0: + self.controller.generate_token() + + if refetch == 0: + self.controller.time() + Departure.fetch(self.stop_id, 10) + + refetch = (refetch + 1) % 3 + regenerate = (regenerate + 1) % (6*30) + + sleep(.1) + + Departure.clear() + + sleep(10) + + def input_loop(self): + while not self.ended: + print("> ", end="") + command = input() + + if command == "d": + print("") + for did in Departure.storage: + print(Departure.storage[did]) + print("") + + if command == "q": + print("") + for m in self.controller.message_pool: + print(m) + print("") + + if command == "s": + print("Stopping...") + self.ended = True + self.controller.message_pool = [] + + +main_loop = MainLoop("40", lora_controller) +main_loop.input_loop() \ No newline at end of file