Erste funktionsfähige Tracker-Version
This commit is contained in:
@@ -142,13 +142,9 @@ 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(f"N2K GPS")
|
||||
ctx.show_text(' '.join([s for s in self.appdata.status if self.appdata.status[s]]))
|
||||
ctx.stroke()
|
||||
|
||||
# AP: Nicht implementiert
|
||||
# WIFI:
|
||||
# /proc/net/wireless
|
||||
|
||||
# Tastenstatus
|
||||
ctx.save()
|
||||
if self.keylock:
|
||||
@@ -325,6 +321,7 @@ class Page():
|
||||
ctx.stroke()
|
||||
|
||||
def draw_text_boxed(self, ctx, x, y, w, h, content, inverted=False, border=False):
|
||||
ctx.save()
|
||||
ctx.set_line_width(1)
|
||||
# Background fill
|
||||
ctx.set_source_rgb(*self.fgcolor)
|
||||
@@ -343,6 +340,7 @@ class Page():
|
||||
ctx.move_to(x + 4, y + h - 5 + 0.5)
|
||||
ctx.show_text(content)
|
||||
ctx.stroke()
|
||||
ctx.restore()
|
||||
|
||||
def wordwrap(text, wrap):
|
||||
# Wrap long line to multiple lines, monospaced character set
|
||||
|
||||
231
pages/tracker.py
231
pages/tracker.py
@@ -22,17 +22,20 @@ Behandlung von Verbindungsabbrüchen:
|
||||
import os
|
||||
import cairo
|
||||
from .page import Page
|
||||
from cfgmenu import Menu
|
||||
|
||||
|
||||
class Tracker(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self._appdata = appdata
|
||||
self.bv_lat = boatdata.getRef("LAT")
|
||||
self.bv_lon = boatdata.getRef("LON")
|
||||
self.bv_sog = boatdata.getRef("SOG")
|
||||
self.races = None
|
||||
self.raceid = None # Ausgewählte Regatta
|
||||
self.menupos = 0
|
||||
self.buttonlabel[1] = 'MODE'
|
||||
self.buttonlabel[2] = 'ON'
|
||||
self.mode = 'N' # (N)ormal, (C)onfiguration
|
||||
|
||||
# Flaggengröße: 96 x 64 Pixel
|
||||
@@ -43,31 +46,88 @@ class Tracker(Page):
|
||||
'finish', 'hotel', 'india', 'november', 'orange',
|
||||
'papa', 'repeat_one', 'sierra', 'start', 'uniform',
|
||||
'xray', 'yankee', 'zulu')
|
||||
# Mapping
|
||||
self.flagmap = {
|
||||
3: 'blue', #
|
||||
8: 'sierra', # Bahnverkürzung
|
||||
9: 'november', # Abbruch
|
||||
10: 'yankee', # Schwimmwesten
|
||||
11: 'repeat_one', # Rückruf
|
||||
12: 'answer', # Startverschiebung
|
||||
14: 'start',
|
||||
15: 'class', # Klassenflagge
|
||||
100: 'papa', # Vorbereitung, Frühstart: Zurückfallen über Startlinie
|
||||
101: 'india', # Vorbereitung, Frühstart: Starttonne umrunden
|
||||
102: 'zulu', # Frühstart: 20%-Strafe
|
||||
103: 'uniform', # Frühstart: Disqualifikation, Wiederholung erlaubt
|
||||
104: 'black' # Frühstart: Disqualifikation, Wiederholung nicht erlaubt
|
||||
}
|
||||
self.sym_flag = {}
|
||||
for f in flag:
|
||||
flagfile = os.path.join(cfg['imgpath'], 'flags', f + '.png')
|
||||
self.sym_flag[f] = cairo.ImageSurface.create_from_png(flagfile)
|
||||
print(self.sym_flag)
|
||||
|
||||
self._menu = Menu("Regattas", 200, 250)
|
||||
self._menu.setItemDimension(120, 20)
|
||||
|
||||
def handle_key(self, buttonid):
|
||||
if buttonid == 1:
|
||||
# Modus umschalten
|
||||
if self.mode == 'N':
|
||||
self.mode = 'C'
|
||||
self.buttonlabel[2] = '#UP'
|
||||
self.buttonlabel[3] = '#DOWN'
|
||||
self.buttonlabel[4] = 'SET'
|
||||
if self.appdata.track.is_active():
|
||||
self.buttonlabel[5] = 'OFF'
|
||||
else:
|
||||
self.buttonlabel[5] = 'ON'
|
||||
else:
|
||||
self.mode = 'N'
|
||||
self.buttonlabel[2] = ''
|
||||
self.buttonlabel[3] = '#PREV'
|
||||
self.buttonlabel[4] = '#NEXT'
|
||||
self.buttonlabel[5] = ''
|
||||
return True
|
||||
elif buttonid == 2:
|
||||
# Tracking ein/-ausschalten
|
||||
if self._appdata.track.is_active():
|
||||
self._appdata.track.set_active(False)
|
||||
self.buttonlabel[2] = 'ON'
|
||||
else:
|
||||
self._appdata.track.set_active(True)
|
||||
self.buttonlabel[2] = 'OFF'
|
||||
if self.mode == 'C':
|
||||
# Up
|
||||
if self.menupos > 1:
|
||||
self.menupos -= 1
|
||||
else:
|
||||
self.menupos = len(self.races)
|
||||
return True
|
||||
elif buttonid == 3:
|
||||
if self.mode == 'C':
|
||||
# Down
|
||||
if self.menupos < len(self.races):
|
||||
self.menupos += 1
|
||||
else:
|
||||
self.menupos = 1
|
||||
return True
|
||||
elif buttonid == 4:
|
||||
if self.mode == 'C':
|
||||
# Set / Select regatta
|
||||
if self.menupos > 0:
|
||||
self.raceid = self.races[self.menupos - 1] # Nullbasiert
|
||||
self.appdata.track.hero_raceid = self.raceid
|
||||
print(f"Selected race '{self.raceid}'")
|
||||
return True
|
||||
elif buttonid == 5:
|
||||
self._appdata.frontend.flashled.setColor('yellow')
|
||||
#self._appdata.frontend.flashled.switchOn(4)
|
||||
self._appdata.frontend.flashled.doFlash(2)
|
||||
if self.mode == 'C':
|
||||
# Tracking ein/-ausschalten
|
||||
if self.appdata.track.is_active():
|
||||
self.appdata.track.set_active(False)
|
||||
self.buttonlabel[5] = 'ON'
|
||||
else:
|
||||
self.appdata.track.set_active(True)
|
||||
self.buttonlabel[5] = 'OFF'
|
||||
else:
|
||||
self.appdata.frontend.flashled.setColor('yellow')
|
||||
#self.appdata.frontend.flashled.switchOn(4)
|
||||
self.appdata.frontend.flashled.doFlash(2)
|
||||
return True
|
||||
return False
|
||||
|
||||
def draw_normal(self, ctx):
|
||||
# Name
|
||||
@@ -79,9 +139,19 @@ class Tracker(Page):
|
||||
ctx.select_font_face("DSEG7 Classic")
|
||||
ctx.set_font_size(80)
|
||||
|
||||
if self._appdata.track.is_active():
|
||||
ctx.move_to(20, 120)
|
||||
ctx.show_text("-00:00")
|
||||
if self.appdata.track.is_active():
|
||||
if self.appdata.track.hero_racestatus:
|
||||
counter = self.appdata.track.hero_racestatus['time']
|
||||
minutes, seconds = divmod(abs(counter), 60)
|
||||
if counter < 0:
|
||||
ctx.move_to(16, 120)
|
||||
ctx.show_text(f"-{minutes:02d}:{seconds:02d}")
|
||||
else:
|
||||
ctx.move_to(28, 120)
|
||||
ctx.show_text(f"{minutes:03d}:{seconds:02d}")
|
||||
else:
|
||||
ctx.move_to(48, 120)
|
||||
ctx.show_text("--:--")
|
||||
else:
|
||||
ctx.move_to(100, 120)
|
||||
ctx.show_text("off")
|
||||
@@ -94,58 +164,133 @@ 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.appdata.track.ttype)
|
||||
|
||||
ctx.move_to(x0, y0 + 16)
|
||||
ctx.show_text("Regatta")
|
||||
ctx.move_to(x1, y0 + 16)
|
||||
ctx.show_text('')
|
||||
ctx.show_text(self.appdata.track.hero_raceid or '[not selected]')
|
||||
|
||||
ctx.move_to(x0, y0 + 32)
|
||||
ctx.show_text("Lat=")
|
||||
ctx.show_text("Course")
|
||||
ctx.move_to(x1, y0 + 32)
|
||||
ctx.show_text(self.bv_lat.format())
|
||||
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'])
|
||||
else:
|
||||
ctx.show_text('[not selected]')
|
||||
|
||||
ctx.move_to(x0, y0 + 48)
|
||||
ctx.show_text("Lon=")
|
||||
ctx.show_text("Latitude")
|
||||
ctx.move_to(x1, y0 + 48)
|
||||
ctx.show_text(self.bv_lon.format())
|
||||
ctx.show_text(self.bv_lat.format())
|
||||
|
||||
ctx.move_to(x0, y0 + 64)
|
||||
ctx.show_text("Sog=")
|
||||
ctx.show_text("Longitude")
|
||||
ctx.move_to(x1, y0 + 64)
|
||||
ctx.show_text(self.bv_lon.format())
|
||||
|
||||
ctx.move_to(x0, y0 + 80)
|
||||
ctx.show_text("Speed")
|
||||
ctx.move_to(x1, y0 + 80)
|
||||
ctx.show_text(self.bv_sog.format())
|
||||
|
||||
# Flaggen
|
||||
if self.appdata.track.hero_racestatus:
|
||||
pos = 0
|
||||
for f in self.appdata.track.hero_racestatus['flags']:
|
||||
if f in self.flagmap:
|
||||
# TODO Context save/restore erforderlich?
|
||||
ctx.save()
|
||||
ctx.set_source_surface(self.sym_flag[self.flagmap[f]], *self.flagpos[pos])
|
||||
ctx.paint()
|
||||
ctx.restore()
|
||||
pos += 1
|
||||
|
||||
|
||||
def draw_config(self, ctx):
|
||||
|
||||
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
|
||||
ctx.set_font_size(32)
|
||||
ctx.move_to(20, 80)
|
||||
ctx.set_font_size(24)
|
||||
ctx.move_to(4, 42)
|
||||
ctx.show_text("Tracker configuration")
|
||||
# Daten aus Konfiguration anzeigen
|
||||
# - boot
|
||||
# - tracker
|
||||
|
||||
x0 = 8
|
||||
x1 = 88
|
||||
y0 = 96
|
||||
|
||||
ctx.set_font_size(20)
|
||||
ctx.move_to(x0, 75)
|
||||
ctx.show_text("Boat data")
|
||||
|
||||
ctx.set_font_size(16)
|
||||
|
||||
# Mögliche Regatten
|
||||
# -> auf Konfigurationsmodus verschieben
|
||||
x = 250
|
||||
y = 100
|
||||
ctx.move_to(x, y - 24)
|
||||
ctx.show_text("Regattas")
|
||||
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")
|
||||
ctx.move_to(x0, y0)
|
||||
ctx.show_text("Name")
|
||||
ctx.move_to(x1, y0)
|
||||
ctx.show_text(self.cfg['boat']['name'])
|
||||
|
||||
ctx.move_to(x0, y0 + 16)
|
||||
ctx.show_text("Class")
|
||||
ctx.move_to(x1, y0 + 16)
|
||||
ctx.show_text(self.cfg['boat']['class'])
|
||||
|
||||
ctx.move_to(20, 120)
|
||||
ctx.move_to(x0, y0 + 32)
|
||||
ctx.show_text("Handicap")
|
||||
ctx.move_to(x1, y0 + 32)
|
||||
ctx.show_text(str(self.cfg['boat']['handicap']))
|
||||
|
||||
ctx.move_to(x0, y0 + 48)
|
||||
ctx.show_text("Club")
|
||||
ctx.move_to(x1, y0 + 48)
|
||||
ctx.show_text(self.cfg['boat']['club'])
|
||||
|
||||
ctx.move_to(x0, y0 + 64)
|
||||
ctx.show_text("Sailno.")
|
||||
ctx.move_to(x1, y0 + 64)
|
||||
ctx.show_text(self.cfg['boat']['sailno'])
|
||||
|
||||
x0 = 208
|
||||
x1 = 272
|
||||
|
||||
ctx.set_font_size(20)
|
||||
ctx.move_to(x0, 75)
|
||||
ctx.show_text("Tracker info")
|
||||
|
||||
ctx.set_font_size(16)
|
||||
|
||||
ctx.move_to(x0, y0)
|
||||
ctx.show_text("Type: ")
|
||||
ctx.show_text(self._appdata.track.ttype)
|
||||
ctx.show_text(self.appdata.track.ttype)
|
||||
ctx.move_to(x0, y0 + 16)
|
||||
ctx.show_text("Status")
|
||||
ctx.move_to(x0, y0 + 32)
|
||||
ctx.show_text("Org.")
|
||||
ctx.move_to(x0, y0 + 48)
|
||||
ctx.show_text("Team")
|
||||
|
||||
# Mögliche Regatten
|
||||
self.races = self.appdata.track.hero_get_races()
|
||||
x = 208
|
||||
y = 180
|
||||
ctx.set_font_size(20)
|
||||
ctx.move_to(x, y)
|
||||
ctx.show_text("Regattas")
|
||||
ctx.set_font_size(16)
|
||||
y += 4
|
||||
if self.menupos > len(self.races):
|
||||
# Nichts auswählen
|
||||
self.menupos = 0
|
||||
self.raceid = None
|
||||
i = 0
|
||||
for r in self.races:
|
||||
i += 1
|
||||
if r == self.raceid:
|
||||
r += '*'
|
||||
self.draw_text_boxed(ctx, x, y, 180, 20, r, (self.menupos == i))
|
||||
y += 20
|
||||
if i == 0:
|
||||
ctx.move_to(x, y + 20)
|
||||
ctx.show_text("[ none ]")
|
||||
|
||||
def draw(self, ctx):
|
||||
if self.mode == 'N':
|
||||
|
||||
Reference in New Issue
Block a user