Improved main loop, added input & better departure update check
This commit is contained in:
parent
ddb585c7be
commit
9bbace17e6
|
@ -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()}"
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
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()
|
Loading…
Reference in a new issue