Appdata für Header, Flaggensymbole laden
This commit is contained in:
parent
f3c9ced477
commit
766b191109
35
appdata.py
35
appdata.py
|
@ -2,13 +2,48 @@
|
|||
Generische Applikationsdaten
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
from tracker import Tracker
|
||||
|
||||
class AppData():
|
||||
|
||||
def __init__(self):
|
||||
self.shutdown = False # Globaler Ausschalter
|
||||
self.track = Tracker('NONE')
|
||||
self.frontend = None
|
||||
|
||||
# Für u.a. Header-Indikatoren
|
||||
# TODO
|
||||
self.status = {
|
||||
'AP': False, # Accesspoint
|
||||
'WIFI': False, # Wireless Client
|
||||
'TCP': False, # TCP Network
|
||||
'N2K': False, # NMEA2000
|
||||
'183': False, # NMEA0183
|
||||
'USB': False, # USB Datenverbindung
|
||||
'GPS': False, # GPS-Fix und -daten
|
||||
'TRK': False # Tracker
|
||||
}
|
||||
|
||||
def setFrontend(self, frontend):
|
||||
self.frontend = frontend # Referenz zur GUI
|
||||
|
||||
def refreshStatus(self):
|
||||
self.status['AP'] = False
|
||||
|
||||
self.status['TCP'] = False
|
||||
self.status['WIFI'] = False
|
||||
for intf in os.listdir('/sys/class/net'):
|
||||
statefile = os.path.join('/sys/class/net', interface, 'operstate')
|
||||
wififile = os.path.join('/sys/class/net', interface, 'wireless')
|
||||
if os.path.exists(statefile):
|
||||
with open(statefile) as fh:
|
||||
state = f.read().strip()
|
||||
if state == 'up':
|
||||
if os.path.exists(wififile):
|
||||
self.status['WIFI'] = True
|
||||
else:
|
||||
self.status['TCP'] = True
|
||||
|
||||
self.status['TRK'] = self.track.is_active()
|
||||
|
|
|
@ -235,6 +235,7 @@ def rxd_gps(devname, devspeed):
|
|||
def rxd_network(address, port):
|
||||
# WIP Daten über Netzwerk empfangen
|
||||
# Wir verwenden UDP. Ein verlorenes Paket tut uns nicht weh.
|
||||
setthreadtitle("NETlistener")
|
||||
sock = socket.socket()
|
||||
sock.connect((address, port))
|
||||
while not appdata.shutdown:
|
||||
|
@ -610,7 +611,7 @@ def init_profile(config, cfg, boatdata):
|
|||
if n >= pages_max:
|
||||
break
|
||||
clist = {
|
||||
0: pages.System(0, cfg, boatdata)
|
||||
0: pages.System(0, cfg, appdata, boatdata)
|
||||
}
|
||||
for i, p in pagedef.items():
|
||||
try:
|
||||
|
|
|
@ -37,7 +37,7 @@ from .page import Page
|
|||
class Anchor(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.sym_anchor = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "anchor.png"))
|
||||
self.buttonlabel[1] = 'MODE'
|
||||
self.buttonlabel[2] = 'DROP'
|
||||
|
|
|
@ -6,7 +6,7 @@ from .page import Page
|
|||
class ApparentWind(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.buttonlabel[1] = 'MODE'
|
||||
self.mode = 'L' # (W)ind (L)ens
|
||||
try:
|
||||
|
|
|
@ -12,7 +12,7 @@ from .page import Page
|
|||
class Autobahn(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.xte = self.bd.getRef("XTE")
|
||||
self.cog = self.bd.getRef("COG")
|
||||
self.btw = self.bd.getRef("BTW")
|
||||
|
|
|
@ -41,7 +41,7 @@ from .page import Page
|
|||
class Barograph(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
# Meßwert alle 15 Minuten:
|
||||
# 84 Stunden * 4 Werte je Stunde = 336 Meßwerte
|
||||
self.bd = boatdata
|
||||
|
|
|
@ -23,7 +23,7 @@ import nmea2000.lookup
|
|||
class Fluid(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata, fluidtype):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.fluidtype = int(fluidtype)
|
||||
if self.fluidtype == 0:
|
||||
self.symbol = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "fuelpump.png"))
|
||||
|
|
|
@ -21,7 +21,7 @@ from .page import Page
|
|||
class FourValues(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata, boatvalue1, boatvalue2, boatvalue3, boatvalue4):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.value1 = boatvalue1
|
||||
self.value2 = boatvalue2
|
||||
self.value3 = boatvalue3
|
||||
|
|
|
@ -19,7 +19,7 @@ from .page import Page
|
|||
class FourValues2(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata, boatvalue1, boatvalue2, boatvalue3, boatvalue4):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.value1 = boatvalue1
|
||||
self.value2 = boatvalue2
|
||||
self.value3 = boatvalue3
|
||||
|
|
|
@ -16,7 +16,7 @@ from .page import Page
|
|||
class Keel(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
# Wert für Kielrotation
|
||||
self.valref = self.bd.getRef("xdrRotK")
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ from .page import Page
|
|||
class OneValue(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata, boatvalue):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.ref1 = self.bd.getRef(boatvalue)
|
||||
|
||||
def draw(self, ctx):
|
||||
|
|
|
@ -64,10 +64,11 @@ class Page():
|
|||
c = 2 * asin(sqrt(a))
|
||||
return c * 3440
|
||||
|
||||
def __init__(self, pageno, cfg, boatdata):
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
self.pageno = pageno
|
||||
self.cfg = cfg
|
||||
self.fullscreen = cfg['guistyle'] == 'fullscreen'
|
||||
self.appdata = appdata
|
||||
self.bd = boatdata
|
||||
self.header = True
|
||||
self.footer = True
|
||||
|
@ -126,7 +127,7 @@ class Page():
|
|||
|
||||
def draw_header(self, ctx):
|
||||
"""
|
||||
Mögliche Zeichen für aktivierte Funktionen
|
||||
Mögliche Zeichen für aktivierte Funktionen (max. 8)
|
||||
AP - Accesspoint ist aktiv
|
||||
WIFI - WIFI-Client
|
||||
TCP
|
||||
|
@ -134,6 +135,7 @@ class Page():
|
|||
183
|
||||
USB
|
||||
GPS - GPS Fix vorhanden
|
||||
TRK - Tracking aktiv
|
||||
# TODO Umstellung auf Symbole je 16 Pixel zum Platz sparen
|
||||
Neu: Nummer der aktiven Seite (1 - 10)
|
||||
"""
|
||||
|
@ -143,6 +145,10 @@ class Page():
|
|||
ctx.show_text(f"N2K GPS")
|
||||
ctx.stroke()
|
||||
|
||||
# AP: Nicht implementiert
|
||||
# WIFI:
|
||||
# /proc/net/wireless
|
||||
|
||||
# Tastenstatus
|
||||
ctx.save()
|
||||
if self.keylock:
|
||||
|
|
|
@ -5,7 +5,7 @@ from .page import Page
|
|||
class Rudder(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.buttonlabel[1] = 'MODE'
|
||||
self.mode = 'P'
|
||||
# Werte für Ruderausschlag
|
||||
|
|
|
@ -20,7 +20,7 @@ class SixValues(Page):
|
|||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata, boatvalue1, boatvalue2,
|
||||
boatvalue3, boatvalue4, boatvalue5, boatvalue6):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.value1 = boatvalue1
|
||||
self.value2 = boatvalue2
|
||||
self.value3 = boatvalue3
|
||||
|
|
|
@ -15,7 +15,7 @@ from .page import Page
|
|||
class SkyView(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
|
||||
def pol2cart(azimut, elevation):
|
||||
'''
|
||||
|
|
|
@ -4,8 +4,8 @@ import datetime
|
|||
|
||||
class System(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.buttonlabel[1] = 'MODE'
|
||||
self.buttonlabel[2] = 'STBY'
|
||||
self.mode = ('I', 'N') # (I)nformation (N)MEA2000 Device List
|
||||
|
|
|
@ -4,7 +4,7 @@ from .page import Page
|
|||
class ThreeValues(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata, boatvalue1, boatvalue2, boatvalue3):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.ref1 = self.bd.getRef(boatvalue1)
|
||||
self.ref2 = self.bd.getRef(boatvalue2)
|
||||
self.ref3 = self.bd.getRef(boatvalue3)
|
||||
|
|
|
@ -1,22 +1,32 @@
|
|||
"""
|
||||
Tracker with MQTT client
|
||||
Tracker mit MQTT client
|
||||
|
||||
Es gibt zwei Modi: Track und Race
|
||||
A) Track: Es wird nur der Track gesended / aufgezeichnet
|
||||
B) Race: Es werden zusätzlich Regattadaten angezeigt, das beinhaltet
|
||||
die Auswahl einer Regatta, das Teilnehmen, das Aufgeben und die
|
||||
Signalisierung vor und während einer Wettfahrt.
|
||||
|
||||
Das Tracking kann über eine Taste ein- und ausgeschaltet werden.
|
||||
Um versehentliches Umschalten zu vermeiden ist eine Nachfrage
|
||||
integriert.
|
||||
|
||||
- currentry only Ragatta hero supported
|
||||
|
||||
TODO get data from mqtt thread
|
||||
|
||||
Verbindungsabbrüche
|
||||
Behandlung von Verbindungsabbrüchen:
|
||||
- on_disconnect
|
||||
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
import cairo
|
||||
from .page import Page
|
||||
|
||||
class Tracker(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self._appdata = appdata
|
||||
self.bv_lat = boatdata.getRef("LAT")
|
||||
self.bv_lon = boatdata.getRef("LON")
|
||||
|
@ -25,6 +35,20 @@ class Tracker(Page):
|
|||
self.buttonlabel[2] = 'ON'
|
||||
self.mode = 'N' # (N)ormal, (C)onfiguration
|
||||
|
||||
# Flaggengröße: 96 x 64 Pixel
|
||||
self.flagpos = ((208, 140), (308, 140), (208, 210), (308, 210))
|
||||
|
||||
# Flaggen laden
|
||||
flag = ('alpha', 'answer', 'black', 'blue', 'charlie', 'class',
|
||||
'finish', 'hotel', 'india', 'november', 'orange',
|
||||
'papa', 'repeat_one', 'sierra', 'start', 'uniform',
|
||||
'xray', 'yankee', 'zulu')
|
||||
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)
|
||||
|
||||
def handle_key(self, buttonid):
|
||||
if buttonid == 1:
|
||||
# Modus umschalten
|
||||
|
@ -47,47 +71,57 @@ class Tracker(Page):
|
|||
|
||||
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("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():
|
||||
ctx.move_to(20, 120)
|
||||
ctx.show_text("-00:00")
|
||||
else:
|
||||
ctx.move_to(100, 120)
|
||||
ctx.show_text("off")
|
||||
|
||||
x0 = 8
|
||||
x1 = 104
|
||||
y0 = 150
|
||||
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
|
||||
ctx.set_font_size(16)
|
||||
ctx.move_to(20, 120)
|
||||
ctx.move_to(x0, y0)
|
||||
ctx.show_text("Type: ")
|
||||
ctx.move_to(x1, y0)
|
||||
ctx.show_text(self._appdata.track.ttype)
|
||||
|
||||
ctx.move_to(20, 140)
|
||||
ctx.show_text("active: ")
|
||||
if self._appdata.track.is_active():
|
||||
ctx.show_text("yes")
|
||||
else:
|
||||
ctx.show_text("no")
|
||||
ctx.move_to(x0, y0 + 16)
|
||||
ctx.show_text("Regatta")
|
||||
ctx.move_to(x1, y0 + 16)
|
||||
ctx.show_text('')
|
||||
|
||||
ctx.move_to(20, 160)
|
||||
ctx.move_to(x0, y0 + 32)
|
||||
ctx.show_text("Lat=")
|
||||
ctx.move_to(x1, y0 + 32)
|
||||
ctx.show_text(self.bv_lat.format())
|
||||
ctx.move_to(20, 180)
|
||||
|
||||
ctx.move_to(x0, y0 + 48)
|
||||
ctx.show_text("Lon=")
|
||||
ctx.move_to(x1, y0 + 48)
|
||||
ctx.show_text(self.bv_lon.format())
|
||||
ctx.move_to(20, 200)
|
||||
|
||||
ctx.move_to(x0, y0 + 64)
|
||||
ctx.show_text("Sog=")
|
||||
ctx.move_to(x1, y0 + 64)
|
||||
ctx.show_text(self.bv_sog.format())
|
||||
|
||||
# Ausgewählte Regatta (raceid)
|
||||
x = 250
|
||||
y = 100
|
||||
ctx.move_to(x, y - 24)
|
||||
ctx.show_text("Regatta: ")
|
||||
# if ...
|
||||
# else
|
||||
# "not selected"
|
||||
|
||||
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.show_text("Tracker config")
|
||||
ctx.show_text("Tracker configuration")
|
||||
# Daten aus Konfiguration anzeigen
|
||||
# - boot
|
||||
# - tracker
|
||||
|
@ -109,7 +143,6 @@ class Tracker(Page):
|
|||
ctx.show_text("keine")
|
||||
|
||||
|
||||
|
||||
ctx.move_to(20, 120)
|
||||
ctx.show_text("Type: ")
|
||||
ctx.show_text(self._appdata.track.ttype)
|
||||
|
|
|
@ -17,7 +17,7 @@ from .page import Page
|
|||
class TwoValues(Page):
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata, boatvalue1, boatvalue2):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.ref1 = self.bd.getRef(boatvalue1)
|
||||
self.ref2 = self.bd.getRef(boatvalue2)
|
||||
#print(self.ref1.valname)
|
||||
|
|
|
@ -18,7 +18,7 @@ class Voltage(Page):
|
|||
avg = (1, 10, 60, 300);
|
||||
|
||||
def __init__(self, pageno, cfg, appdata, boatdata):
|
||||
super().__init__(pageno, cfg, boatdata)
|
||||
super().__init__(pageno, cfg, appdata, boatdata)
|
||||
self.trend = True
|
||||
self.mode = 'A'
|
||||
self.avgindex = 0
|
||||
|
|
Loading…
Reference in New Issue