Logging und Tracker GUI weiterprogrammiert

This commit is contained in:
2025-09-17 20:37:12 +02:00
parent d3a984075e
commit eab6cdf4c9
8 changed files with 403 additions and 186 deletions

View File

@@ -32,10 +32,10 @@ from .dst810 import DST810
from .epropulsion import EPropulsion
from .keel import Keel
from .mob import MOB
from .racetracker import RaceTracker
from .rollpitch import RollPitch
from .skyview import SkyView
from .solar import Solar
from .tracker import Tracker
from .rudder import Rudder
from .voltage import Voltage
from .wind import Wind

View File

@@ -68,7 +68,7 @@ class Page():
self.pageno = pageno
self.cfg = cfg
self.fullscreen = cfg['guistyle'] == 'fullscreen'
self.appdata = appdata
self.app = appdata
self.bd = boatdata
self.header = True
self.footer = True
@@ -142,7 +142,7 @@ class Page():
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
ctx.set_font_size(16)
ctx.move_to(0.5, 14.5)
ctx.show_text(' '.join([s for s in self.appdata.status if self.appdata.status[s]]))
ctx.show_text(' '.join([s for s in self.app.status if self.app.status[s]]))
ctx.stroke()
# Tastenstatus

View File

@@ -25,7 +25,7 @@ import os
import cairo
from .page import Page
class Tracker(Page):
class RaceTracker(Page):
def __init__(self, pageno, cfg, appdata, boatdata):
super().__init__(pageno, cfg, appdata, boatdata)
@@ -33,7 +33,7 @@ class Tracker(Page):
self.bv_lon = boatdata.getRef("LON")
self.bv_sog = boatdata.getRef("SOG")
self.races = None
self.raceid = None # Ausgewählte Regatta
self.raceid = self.app.track.hero_raceid # Ausgewählte Regatta
self.menupos = 0
self.buttonlabel[1] = 'MODE'
self.buttonlabel[2] = 'INFO'
@@ -45,9 +45,9 @@ class Tracker(Page):
# Flaggen laden
flag = ('alpha', 'answer', 'black', 'blue', 'charlie', 'class',
'finish', 'hotel', 'india', 'november', 'orange',
'papa', 'repeat_one', 'sierra', 'start', 'uniform',
'xray', 'yankee', 'zulu')
'finish', 'foxtrot', 'hotel', 'india', 'november',
'orange', 'papa', 'repeat_one', 'sierra', 'start',
'uniform', 'xray', 'yankee', 'zulu')
# Mapping
self.flagmap = {
3: 'blue', # Zielflagge
@@ -81,7 +81,7 @@ class Tracker(Page):
self.buttonlabel[2] = '#UP'
self.buttonlabel[3] = '#DOWN'
self.buttonlabel[4] = 'SET'
if self.appdata.track.is_active():
if self.app.track.is_active():
self.buttonlabel[5] = 'OFF'
else:
self.buttonlabel[5] = 'ON'
@@ -118,38 +118,33 @@ class Tracker(Page):
# Set / Select regatta
if self.menupos > 0:
self.raceid = self.races[self.menupos - 1] # Nullbasiert
self.appdata.track.hero_raceid = self.raceid
self.app.track.hero_raceid = self.raceid
print(f"Selected race '{self.raceid}'")
return True
elif buttonid == 5:
if self.mode == 'C':
# Tracking ein/-ausschalten
if self.appdata.track.is_active():
self.appdata.track.set_active(False)
if self.app.track.is_active():
self.app.track.set_active(False)
self.buttonlabel[5] = 'ON'
else:
self.appdata.track.set_active(True)
self.app.track.set_active(True)
self.buttonlabel[5] = 'OFF'
elif self.mode == 'M':
self.appdata.frontend.flashled.setColor('yellow')
#self.appdata.frontend.flashled.switchOn(4)
self.appdata.frontend.flashled.doFlash(2)
self.app.frontend.flashled.setColor('yellow')
#self.app.frontend.flashled.switchOn(4)
self.app.frontend.flashled.doFlash(2)
return True
return False
def draw_normal(self, ctx):
# Name
#ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
#ctx.set_font_size(32)
#ctx.move_to(20, 80)
#ctx.show_text("Tracker")
ctx.select_font_face("DSEG7 Classic")
ctx.set_font_size(80)
if self.appdata.track.is_active():
if self.appdata.track.hero_racestatus:
counter = self.appdata.track.hero_racestatus['time']
if self.app.track.is_active():
if self.app.track.hero_racestatus:
counter = self.app.track.hero_racestatus['time']
minutes, seconds = divmod(abs(counter), 60)
if counter < 0:
ctx.move_to(16, 120)
@@ -164,11 +159,11 @@ class Tracker(Page):
ctx.move_to(100, 120)
ctx.show_text("off")
if self.appdata.track.hero_timedelta > 5:
if self.app.track.hero_timedelta > 5:
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
ctx.set_font_size(16)
ctx.move_to(8, 260)
ctx.show_text(f"!!! Time drift of {self.appdata.track.hero_timedelta} seconds")
ctx.show_text(f"!!! Time drift of {self.app.track.hero_timedelta} seconds")
x0 = 8
x1 = 96
@@ -179,20 +174,20 @@ class Tracker(Page):
ctx.move_to(x0, y0)
ctx.show_text("Type")
ctx.move_to(x1, y0)
ctx.show_text(self.appdata.track.ttype)
ctx.show_text(self.app.track.ttype)
y0 += yoffset
ctx.move_to(x0, y0)
ctx.show_text("Regatta")
ctx.move_to(x1, y0)
ctx.show_text(self.appdata.track.hero_raceid or '[not selected]')
ctx.show_text(self.app.track.hero_raceid or '[not selected]')
y0 += yoffset
ctx.move_to(x0, y0)
ctx.show_text("Course")
ctx.move_to(x1, y0)
if self.appdata.track.hero_orgstatus and self.appdata.track.hero_raceid:
ctx.show_text(self.appdata.track.hero_orgstatus['races'][self.appdata.track.hero_raceid]['courseid'])
if self.app.track.hero_orgstatus and self.app.track.hero_raceid:
ctx.show_text(self.app.track.hero_orgstatus['races'][self.app.track.hero_raceid]['courseid'])
else:
ctx.show_text('[not selected]')
@@ -215,9 +210,9 @@ class Tracker(Page):
ctx.show_text(self.bv_sog.format())
# Flaggen
if self.appdata.track.hero_racestatus:
if self.app.track.hero_racestatus:
pos = 0
for f in self.appdata.track.hero_racestatus['flags']:
for f in self.app.track.hero_racestatus['flags']:
if f in self.flagmap:
# TODO Context save/restore erforderlich?
ctx.save()
@@ -234,14 +229,19 @@ class Tracker(Page):
ctx.move_to(4, 42)
ctx.show_text("Tracker configuration")
x0 = 8
x1 = 88
y0 = 96
# Linke Spalte mit Daten
x0 = 8 # Labelspalte
x1 = 88 # Datenspalte
y0 = 75
yoffset = 16
# Bootsdaten
ctx.set_font_size(20)
ctx.move_to(x0, 75)
ctx.move_to(x0, y0)
ctx.show_text("Boat data")
y0 += yoffset + 5
ctx.set_font_size(16)
ctx.move_to(x0, y0)
@@ -249,48 +249,50 @@ class Tracker(Page):
ctx.move_to(x1, y0)
ctx.show_text(self.cfg['boat']['name'])
ctx.move_to(x0, y0 + 16)
y0 += yoffset
ctx.move_to(x0, y0)
ctx.show_text("Class")
ctx.move_to(x1, y0 + 16)
ctx.move_to(x1, y0)
ctx.show_text(self.cfg['boat']['class'])
ctx.move_to(x0, y0 + 32)
y0 += yoffset
ctx.move_to(x0, y0)
ctx.show_text("Handicap")
ctx.move_to(x1, y0 + 32)
ctx.move_to(x1, y0)
ctx.show_text(str(self.cfg['boat']['handicap']))
ctx.move_to(x0, y0 + 48)
y0 += yoffset
ctx.move_to(x0, y0)
ctx.show_text("Club")
ctx.move_to(x1, y0 + 48)
ctx.move_to(x1, y0)
ctx.show_text(self.cfg['boat']['club'])
ctx.move_to(x0, y0 + 64)
y0 += yoffset
ctx.move_to(x0, y0)
ctx.show_text("Sailno.")
ctx.move_to(x1, y0 + 64)
ctx.move_to(x1, y0)
ctx.show_text(self.cfg['boat']['sailno'])
x0 = 208
x1 = 272
y0 = 96
yoffset = 16
# Trackerdaten
y0 += yoffset + 10
ctx.set_font_size(20)
ctx.move_to(x0, 75)
ctx.move_to(x0, y0)
ctx.show_text("Tracker info")
y0 += yoffset + 5
ctx.set_font_size(16)
ctx.move_to(x0, y0)
ctx.show_text("Type")
ctx.move_to(x1, y0)
ctx.show_text(self.appdata.track.ttype)
ctx.show_text(self.app.track.ttype)
y0 += yoffset
ctx.move_to(x0, y0)
ctx.show_text("Org.")
ctx.move_to(x1, y0)
if self.appdata.track.hero_orgstatus:
ctx.show_text(self.appdata.track.hero_orgstatus['orgname'])
if self.app.track.hero_orgstatus:
ctx.show_text(self.app.track.hero_orgstatus['orgname'])
else:
ctx.show_text("n/a")
@@ -298,7 +300,7 @@ class Tracker(Page):
ctx.move_to(x0, y0)
ctx.show_text("Status")
ctx.move_to(x1, y0)
if not self.appdata.track.hero_racestatus:
if not self.app.track.hero_racestatus:
ctx.show_text("inactive")
else:
#TODO Mehr Details
@@ -308,18 +310,29 @@ class Tracker(Page):
ctx.move_to(x0, y0)
ctx.show_text("Team")
ctx.move_to(x1, y0)
if self.appdata.track.hero_racestatus:
ctx.show_text(self.appdata.track.hero_racestatus['team'])
ctx.show_text(self.app.track.team)
y0 += yoffset
ctx.move_to(x0, y0)
ctx.show_text("Server")
ctx.move_to(x1, y0)
if self.app.track.mqtt_connected:
ctx.show_text("MQTT")
else:
ctx.show_text("n/a")
ctx.show_text("offline")
# Rechte Spalte mit Regattaauswahl
x = 208
y = 75
yoffset = 16
# Mögliche Regatten
self.races = self.appdata.track.hero_get_races()
self.races = self.app.track.hero_get_races()
if len(self.races) == 1:
self.raceid = self.races[0]
self.hero_raceid = self.races[0]
self.menupos = 1
x = 208
y = 180
ctx.set_font_size(20)
ctx.move_to(x, y)
ctx.show_text("Select Regatta")
@@ -333,7 +346,7 @@ class Tracker(Page):
for r in self.races:
i += 1
if r == self.raceid:
r += '*'
r = f"\xbb {r} \xab"
self.draw_text_boxed(ctx, x, y, 180, 20, r, (self.menupos == i))
y += 20
if i == 0:
@@ -350,11 +363,11 @@ class Tracker(Page):
ctx.show_text("Message from race officers")
ctx.set_font_size(16)
if not self.appdata.track.hero_orgstatus:
if not self.app.track.hero_orgstatus or self.app.track.hero_orgstatus['message'] == '':
ctx.move_to(8, 72)
ctx.show_text("[ empty ]")
else:
lines = self.appdata.track.hero_orgstatus['message'].splitlines()
lines = self.app.track.hero_orgstatus['message'].splitlines()
y = 72
for l in lines:
ctx.move_to(8, y)