From 766b191109eb39f1acaae7bb7f3093f37a38dc97 Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Mon, 15 Sep 2025 08:30:15 +0200 Subject: [PATCH] =?UTF-8?q?Appdata=20f=C3=BCr=20Header,=20Flaggensymbole?= =?UTF-8?q?=20laden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appdata.py | 35 ++++++++++++++++ obp60v.py | 3 +- pages/anchor.py | 2 +- pages/apparentwind.py | 2 +- pages/autobahn.py | 2 +- pages/barograph.py | 2 +- pages/fluid.py | 2 +- pages/fourvalues.py | 2 +- pages/fourvalues2.py | 2 +- pages/keel.py | 2 +- pages/onevalue.py | 2 +- pages/page.py | 10 ++++- pages/rudder.py | 2 +- pages/sixvalues.py | 2 +- pages/skyview.py | 2 +- pages/system.py | 4 +- pages/threevalues.py | 2 +- pages/tracker.py | 93 +++++++++++++++++++++++++++++-------------- pages/twovalues.py | 2 +- pages/voltage.py | 2 +- 20 files changed, 125 insertions(+), 50 deletions(-) diff --git a/appdata.py b/appdata.py index 2ab9bd2..3e87162 100644 --- a/appdata.py +++ b/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() diff --git a/obp60v.py b/obp60v.py index f5e57e6..26cf2c8 100755 --- a/obp60v.py +++ b/obp60v.py @@ -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: diff --git a/pages/anchor.py b/pages/anchor.py index a2553f4..1c53076 100644 --- a/pages/anchor.py +++ b/pages/anchor.py @@ -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' diff --git a/pages/apparentwind.py b/pages/apparentwind.py index 3b98b72..d45e0ea 100644 --- a/pages/apparentwind.py +++ b/pages/apparentwind.py @@ -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: diff --git a/pages/autobahn.py b/pages/autobahn.py index 1fdcfe2..e1c62ae 100644 --- a/pages/autobahn.py +++ b/pages/autobahn.py @@ -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") diff --git a/pages/barograph.py b/pages/barograph.py index 135a8c4..fe1de1c 100644 --- a/pages/barograph.py +++ b/pages/barograph.py @@ -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 diff --git a/pages/fluid.py b/pages/fluid.py index 78fefad..b5ff3b8 100644 --- a/pages/fluid.py +++ b/pages/fluid.py @@ -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")) diff --git a/pages/fourvalues.py b/pages/fourvalues.py index 0a161f4..2e5cca0 100644 --- a/pages/fourvalues.py +++ b/pages/fourvalues.py @@ -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 diff --git a/pages/fourvalues2.py b/pages/fourvalues2.py index 475b4bd..de18216 100644 --- a/pages/fourvalues2.py +++ b/pages/fourvalues2.py @@ -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 diff --git a/pages/keel.py b/pages/keel.py index 60c1241..104cf28 100644 --- a/pages/keel.py +++ b/pages/keel.py @@ -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") diff --git a/pages/onevalue.py b/pages/onevalue.py index 8f5ee7e..ee1e53e 100644 --- a/pages/onevalue.py +++ b/pages/onevalue.py @@ -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): diff --git a/pages/page.py b/pages/page.py index e83a584..3b1e5d4 100644 --- a/pages/page.py +++ b/pages/page.py @@ -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: diff --git a/pages/rudder.py b/pages/rudder.py index 529971e..9982822 100644 --- a/pages/rudder.py +++ b/pages/rudder.py @@ -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 diff --git a/pages/sixvalues.py b/pages/sixvalues.py index 748337b..d2fec0c 100644 --- a/pages/sixvalues.py +++ b/pages/sixvalues.py @@ -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 diff --git a/pages/skyview.py b/pages/skyview.py index d067bf3..fa14e01 100644 --- a/pages/skyview.py +++ b/pages/skyview.py @@ -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): ''' diff --git a/pages/system.py b/pages/system.py index 89398d5..6c00643 100644 --- a/pages/system.py +++ b/pages/system.py @@ -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 diff --git a/pages/threevalues.py b/pages/threevalues.py index 5de34ba..41bd15e 100644 --- a/pages/threevalues.py +++ b/pages/threevalues.py @@ -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) diff --git a/pages/tracker.py b/pages/tracker.py index 6e2159d..27cb3f5 100644 --- a/pages/tracker.py +++ b/pages/tracker.py @@ -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) diff --git a/pages/twovalues.py b/pages/twovalues.py index 6fb6916..af87a9b 100644 --- a/pages/twovalues.py +++ b/pages/twovalues.py @@ -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) diff --git a/pages/voltage.py b/pages/voltage.py index 724fb90..f4874ab 100644 --- a/pages/voltage.py +++ b/pages/voltage.py @@ -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