Weiterarbeit am Tracker
This commit is contained in:
parent
b1d0687952
commit
612783454e
|
@ -4,6 +4,10 @@ Tracker with MQTT client
|
||||||
|
|
||||||
TODO get data from mqtt thread
|
TODO get data from mqtt thread
|
||||||
|
|
||||||
|
Verbindungsabbrüche
|
||||||
|
- on_disconnect
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import cairo
|
import cairo
|
||||||
|
@ -14,27 +18,64 @@ class Tracker(Page):
|
||||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||||
super().__init__(pageno, cfg, boatdata)
|
super().__init__(pageno, cfg, boatdata)
|
||||||
self._appdata = appdata
|
self._appdata = appdata
|
||||||
|
self.bv_lat = boatdata.getRef("LAT")
|
||||||
|
self.bv_lon = boatdata.getRef("LON")
|
||||||
|
self.bv_sog = boatdata.getRef("SOG")
|
||||||
self.buttonlabel[1] = 'MODE'
|
self.buttonlabel[1] = 'MODE'
|
||||||
print(cfg)
|
self.buttonlabel[2] = 'ON'
|
||||||
|
|
||||||
def handle_key(self, buttonid):
|
def handle_key(self, buttonid):
|
||||||
if buttonid == 1:
|
if buttonid == 1:
|
||||||
|
|
||||||
|
pass
|
||||||
|
elif buttonid == 2:
|
||||||
|
# Tracking ein/-ausschalten
|
||||||
if self._appdata.track.is_active():
|
if self._appdata.track.is_active():
|
||||||
self._appdata.track.set_active(False)
|
self._appdata.track.set_active(False)
|
||||||
|
self.buttonlabel[2] = 'ON'
|
||||||
else:
|
else:
|
||||||
self._appdata.track.set_active(True)
|
self._appdata.track.set_active(True)
|
||||||
|
self.buttonlabel[2] = 'OFF'
|
||||||
|
|
||||||
def draw(self, ctx):
|
def draw(self, ctx):
|
||||||
# Name
|
# Name
|
||||||
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
|
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
|
||||||
ctx.set_font_size(32)
|
ctx.set_font_size(32)
|
||||||
ctx.move_to(20, 100)
|
ctx.move_to(20, 80)
|
||||||
ctx.show_text("Tracker")
|
ctx.show_text("Tracker")
|
||||||
|
|
||||||
ctx.set_font_size(16)
|
ctx.set_font_size(16)
|
||||||
|
ctx.move_to(20, 120)
|
||||||
|
ctx.show_text("Type: ")
|
||||||
|
ctx.show_text(self._appdata.track.ttype)
|
||||||
|
|
||||||
ctx.move_to(20, 140)
|
ctx.move_to(20, 140)
|
||||||
ctx.show_text("active: ")
|
ctx.show_text("active: ")
|
||||||
if self._appdata.track.is_active():
|
if self._appdata.track.is_active():
|
||||||
ctx.show_text("yes")
|
ctx.show_text("yes")
|
||||||
else:
|
else:
|
||||||
ctx.show_text("no")
|
ctx.show_text("no")
|
||||||
|
|
||||||
|
ctx.move_to(20, 160)
|
||||||
|
ctx.show_text("Lat=")
|
||||||
|
ctx.show_text(self.bv_lat.format())
|
||||||
|
ctx.move_to(20, 180)
|
||||||
|
ctx.show_text("Lon=")
|
||||||
|
ctx.show_text(self.bv_lon.format())
|
||||||
|
ctx.move_to(20, 200)
|
||||||
|
ctx.show_text("Sog=")
|
||||||
|
ctx.show_text(self.bv_sog.format())
|
||||||
|
|
||||||
|
# Mögliche Regatten
|
||||||
|
x = 250
|
||||||
|
y = 160
|
||||||
|
ctx.move_to(x, y - 24)
|
||||||
|
ctx.show_text("Regatten")
|
||||||
|
for r in self._appdata.track.hero_get_races():
|
||||||
|
ctx.move_to(x, y)
|
||||||
|
ctx.show_text(r)
|
||||||
|
y += 20
|
||||||
|
if y == 160:
|
||||||
|
ctx.move_to(x, y)
|
||||||
|
ctx.show_text("keine")
|
||||||
|
|
||||||
|
|
37
tracker.py
37
tracker.py
|
@ -17,6 +17,7 @@ import os
|
||||||
import time
|
import time
|
||||||
import paho.mqtt.client as mqtt
|
import paho.mqtt.client as mqtt
|
||||||
import json
|
import json
|
||||||
|
import socket
|
||||||
|
|
||||||
class Tracker():
|
class Tracker():
|
||||||
|
|
||||||
|
@ -26,6 +27,9 @@ class Tracker():
|
||||||
if trackertype not in validtypes:
|
if trackertype not in validtypes:
|
||||||
raise TypeError(f"Invalid tracker type: '{valtype}'. Only supported: {validtypes}")
|
raise TypeError(f"Invalid tracker type: '{valtype}'. Only supported: {validtypes}")
|
||||||
self.ttype = trackertype
|
self.ttype = trackertype
|
||||||
|
|
||||||
|
self.appdata = None
|
||||||
|
|
||||||
self.activated = False
|
self.activated = False
|
||||||
self.trace = False # Debugging
|
self.trace = False # Debugging
|
||||||
self.trace_fh = None # File Handle der Tracedatei
|
self.trace_fh = None # File Handle der Tracedatei
|
||||||
|
@ -38,6 +42,22 @@ class Tracker():
|
||||||
self.tspos = None # timestamp (hh:ss:mm) as datetime.time
|
self.tspos = None # timestamp (hh:ss:mm) as datetime.time
|
||||||
self.sog = None
|
self.sog = None
|
||||||
|
|
||||||
|
self.hero_orgstatus = None
|
||||||
|
self.hero_racestatus = None # Akluelle Regatta
|
||||||
|
|
||||||
|
def is_server_active(self, hostname, port):
|
||||||
|
"""
|
||||||
|
ohne Netzwerkverbindung wirft socket.gethostbyname eine Exception,
|
||||||
|
ggf. "Erro -3 temporary failure in name resolution"
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
host = socket.gethostbyname(hostname) # DNS Lookup
|
||||||
|
s = socket.create_connection((host, port), 2)
|
||||||
|
s.close()
|
||||||
|
return True
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return False
|
||||||
|
|
||||||
def is_active(self):
|
def is_active(self):
|
||||||
return self.activated
|
return self.activated
|
||||||
|
@ -49,12 +69,17 @@ class Tracker():
|
||||||
# Positionsabfrage für die Payload
|
# Positionsabfrage für die Payload
|
||||||
# LAT, LON, TSPOS, SOG
|
# LAT, LON, TSPOS, SOG
|
||||||
return (self.lat, self.lon, self.tspos, self.sog)
|
return (self.lat, self.lon, self.tspos, self.sog)
|
||||||
|
"""
|
||||||
def hero_add_race(self, raceid):
|
def hero_add_race(self, raceid):
|
||||||
self.races.add(raceid)
|
self.races.add(raceid)
|
||||||
|
|
||||||
def hero_set_races(self, newraces):
|
def hero_set_races(self, newraces):
|
||||||
self.races = set(newraces)
|
self.races = set(newraces)
|
||||||
|
"""
|
||||||
|
def hero_get_races(self):
|
||||||
|
if not self.hero_orgstatus:
|
||||||
|
return []
|
||||||
|
return [r for r in self.hero_orgstatus['races']]
|
||||||
|
|
||||||
def mqtt_on_connect(self, client, userdata, flags, rc):
|
def mqtt_on_connect(self, client, userdata, flags, rc):
|
||||||
print(f"MQTT connected with result code {rc}")
|
print(f"MQTT connected with result code {rc}")
|
||||||
|
@ -85,18 +110,15 @@ class Tracker():
|
||||||
self.trace_fh.flush()
|
self.trace_fh.flush()
|
||||||
if msg.topic == "regattahero/orgstatus/thomas":
|
if msg.topic == "regattahero/orgstatus/thomas":
|
||||||
# kommt alle 10s
|
# kommt alle 10s
|
||||||
orgstatus = json.loads(msg.payload)
|
self.hero_orgstatus = json.loads(msg.payload)
|
||||||
if orgstatus['allLogout']:
|
if self.hero_orgstatus['allLogout']:
|
||||||
print("All logout received!")
|
print("All logout received!")
|
||||||
client.disconnect()
|
client.disconnect()
|
||||||
sys.exit(0) # TODO nur die MQTT-Task beenden
|
sys.exit(0) # TODO nur die MQTT-Task beenden
|
||||||
if orgstatus['message']:
|
if self.hero_orgstatus['message']:
|
||||||
# TODO Alarm-Funktion nutzen?
|
# TODO Alarm-Funktion nutzen?
|
||||||
print("Nachricht der Wettfahrtkeitung:")
|
print("Nachricht der Wettfahrtkeitung:")
|
||||||
print(orgstatus['message'])
|
print(orgstatus['message'])
|
||||||
print(orgstatus['races'])
|
|
||||||
#for r in orgstatus['races']:
|
|
||||||
# print(f"Race: {r}")
|
|
||||||
elif msg.topic.startswith("regattahero/racestatus/thomas"):
|
elif msg.topic.startswith("regattahero/racestatus/thomas"):
|
||||||
# kommt alle 1s
|
# kommt alle 1s
|
||||||
# dem Topic angehängt ist noch die raceid
|
# dem Topic angehängt ist noch die raceid
|
||||||
|
@ -136,6 +158,7 @@ class Tracker():
|
||||||
|
|
||||||
def mqtt_tracker(self, cfg, boat, appdata, boatdata):
|
def mqtt_tracker(self, cfg, boat, appdata, boatdata):
|
||||||
print("MQTT tracker enabled")
|
print("MQTT tracker enabled")
|
||||||
|
self.appdata = appdata
|
||||||
self.trace = cfg['trace']
|
self.trace = cfg['trace']
|
||||||
client = mqtt.Client()
|
client = mqtt.Client()
|
||||||
client.on_connect = self.mqtt_on_connect
|
client.on_connect = self.mqtt_on_connect
|
||||||
|
|
Loading…
Reference in New Issue