diff --git a/server/departures.py b/server/departures.py index 41ec1db..8d4470d 100644 --- a/server/departures.py +++ b/server/departures.py @@ -45,6 +45,7 @@ class Departure: if len(last_stop) >= 21: last_stop = last_stop[:20].strip() + "..." self.did = did + self.sent = 0 self.stop_id = stop_id self.id = Departure.get_id() self.line = line @@ -53,14 +54,18 @@ class Departure: self.departure = departure self.delay = delay self.controller = lora_controller - self.controller.data(self) + self.send() Departure.storage[did] = self def update(self, delay): if delay != self.delay: - self.controller.data(self) + self.send() self.delay = delay + def send(self): + self.controller.data(self) + self.sent += 1 + def get_departure(self): return -(floor(((datetime.now().timestamp() - (self.departure + self.delay*60))/60)*10)/10) diff --git a/server/lora.py b/server/lora.py index 0aef574..ef81241 100644 --- a/server/lora.py +++ b/server/lora.py @@ -2,9 +2,11 @@ import requests from requests.structures import CaseInsensitiveDict import json import threading +from operator import itemgetter from base64 import b64encode from datetime import datetime -from random import randint +from random import randint, shuffle +from time import sleep import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) @@ -36,15 +38,13 @@ class LoraController: self.devices.append(LoraDevice(self, id, stop_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(to_string) + d.send(lambda: f"TIME|{(datetime.now() - datetime(1970, 1, 1)).total_seconds():.0f}") def data(self, data): for d in self.devices: if d.stop_id == data.stop_id: - d.send(data.__repr__) + d.send_departure(data) class LoraDevice: @@ -54,8 +54,25 @@ class LoraDevice: self.stop_id = stop_id self.message_pool = [] self.thread = None + self.sent_departures = {} self.send(lambda: "CLEAR") + def resend(self): + to_send = [] + for d in self.sent_departures: + if self.sent_departures[d] <= 2: + to_send.append(d) + shuffle(to_send) + for d in to_send[:1]: + self.send_departure(d) + + def send_departure(self, departure): + if departure not in self.sent_departures: + self.sent_departures[departure] = 1 + else: + self.sent_departures[departure] += 1 + self.send(departure.__repr__) + def send(self, msg): self.message_pool.append(msg) if not self.thread or not self.thread.is_alive(): diff --git a/server/main.py b/server/main.py index 96d6aff..bdc56d5 100644 --- a/server/main.py +++ b/server/main.py @@ -68,11 +68,16 @@ class Main: def update_loop(self): refetch = 0 regenerate = 1 + resend = 1 while True: if self.ended: break + if resend == 0: + for d in self.controller.devices: + d.resend() + if regenerate == 0: self.controller.generate_token() @@ -83,6 +88,7 @@ class Main: refetch = (refetch + 1) % 3 regenerate = (regenerate + 1) % (6*30) + resend = (resend + 1) % 7 sleep(.1)