From f0ebdd0201fe240128685df6c9b2ee2c394bcb82 Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Sun, 21 Sep 2025 10:00:56 +0200 Subject: [PATCH] Tracker verbessert, lokales Tracking vorbereitet --- obp60v.conf-sample | 4 ++-- obp60v.py | 9 +++++++-- pages/racetracker.py | 16 +++++++++++++++- tracker.py | 38 ++++++++++++++++++++++++++++++++++++-- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/obp60v.conf-sample b/obp60v.conf-sample index e10d60c..4b56e1c 100644 --- a/obp60v.conf-sample +++ b/obp60v.conf-sample @@ -41,12 +41,13 @@ config = ~/.opencpn/opencpn.conf type = NONE host = 127.0.0.1 port = 80 +path = / ssl = false username = demo password = secret mqtt_host = 127.0.0.1 mqtt_port = 1883 -mqtt_ssl = False +mqtt_ssl = false mqtt_user = demo mqtt_pass = 123456 trace = false @@ -134,4 +135,3 @@ type = Rudder [page10] type = SkyView - diff --git a/obp60v.py b/obp60v.py index 19b5afa..45dabea 100755 --- a/obp60v.py +++ b/obp60v.py @@ -120,6 +120,7 @@ __email__ = "thomas@hoogi.de" __status__ = "Development" # Standardkonfiguration, kann durch Konfigdatei überschrieben werden +# TODO prüfen ob defaults ziehen wenn kein Eintrag in Konfigdatei cfg = { 'cfgfile': 'obp60v.conf', 'logdir': '~/.local/share/obp60v', @@ -127,6 +128,7 @@ cfg = { 'loglevel': 3, 'imgpath': os.path.join(sys.path[0], 'images'), 'audiopath': os.path.join(sys.path[0], 'audio'), + 'histpath' = '~/.local/lib/obp60v', 'deviceid': 100, 'manufcode': 2046, # Open Boat Projects (OBP) 'devfunc': 120, # Display @@ -804,10 +806,13 @@ if __name__ == "__main__": log.info("Networking enabled") t_rxd_net = threading.Thread(target=rxd_network, args=(cfg['net_port'],cfg['net_addr'])) t_rxd_net.start() - if cfg['tracker']['type'] != 'NONE': + if cfg['tracker']['type'] == 'NONE': log.info(f"Tracking enabled, mode {cfg['tracker']['type']}") #appdata.track.set_type( cfg['tracker']['type']) - t_tracker = threading.Thread(target=appdata.track.mqtt_tracker, args=(cfg['tracker'],cfg['boat'],appdata,boatdata)) + if cfg['tracker']['type'] == 'HERO': + t_tracker = threading.Thread(target=appdata.track.mqtt_tracker, args=(cfg['tracker'],cfg['boat'],appdata,boatdata)) + elif cfg['tracker']['type'] IN ['LOCAL', 'SDCARD']: + t_tracker = threading.Thread(target=appdata.track.local_tracker, args=(cfg['tracker'],cfg['boat'],appdata,boatdata)) t_tracker.start() if not cfg['simulation']: if cfg['bme280']: diff --git a/pages/racetracker.py b/pages/racetracker.py index e299bc5..3d0fbc0 100644 --- a/pages/racetracker.py +++ b/pages/racetracker.py @@ -11,7 +11,7 @@ Es gibt zwei Modi: Track und Race Um versehentliches Umschalten zu vermeiden ist eine Nachfrage integriert. - - currentry only Ragatta hero supported + - Momentan wird nur Regatta Hero unterstützt Behandlung von Verbindungsabbrüchen: - on_disconnect @@ -196,6 +196,20 @@ class RaceTracker(Page): ctx.move_to(x, y) ctx.show_text("race officer to get configuration data.") + def draw_local(self, ctx): + x = 8 + y = 50 + ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) + ctx.set_font_size(24) + ctx.move_to(x, y) + ctx.show_text("Local Tracking") + + # Anzeige + # - LAT, LON + # - bisher gespeicherte Anzahl Positionen + # - Zeitabstand zwischen den einzelnen Messungen + # - Hinweis wo gespeichert wird + def draw_normal(self, ctx): ctx.select_font_face("DSEG7 Classic") diff --git a/tracker.py b/tracker.py index d0d4a2a..fa04706 100644 --- a/tracker.py +++ b/tracker.py @@ -3,9 +3,17 @@ Tracker-Daten Mögliche Typen: HERO - Regatta Hero - SDCARD - LOCAL - gpx Datei + SDCARD - nur für ESP32 relevant + LOCAL - Logdatei. GPX ist ungeeignet, weil das Gerät zu jedem Zeitpunkt + ausgeschaltet werden kann und somit die Datei in einem + ungültigen Zustand sein kann. + Es wird eine Datei track.log.geschrieben. + Um fehlende Daten festzustellen wird ein fortlaufender Zähler + geschrieben. SERVER - spezielle Software benötigt, kann auch ein Raspi an Bord sein + Der Tracker sendet einen HTTP-POST. Der Server speichert + die Daten für mehrere Geräte. Vorläufiger Servername: + trackserver NONE - kein Tracking Wenn die Verbindung zum Server im Internet nicht funktioniert, werden @@ -119,6 +127,32 @@ class Tracker(): def set_active(self, newval): self.activated = newval + def local_tracker(self, cfg, boat, appdata, boatdata): + # TODO / WIP + self.log.info("Local tracker enabled") + + # Zugriff auf Boatdata: Referenzen für leichten schnellen Zugriff + bv_lat = boatdata.getRef("LAT") + bv_lon = boatdata.getRef("LON") + bv_hdop = boatdata.getRef("HDOP") + bv_tspos = boatdata.getRef("TSPOS") + + self.local_dt = 15 + self.local_lfdno = 0 + trackerfile = "/tmp/test.log" # TODO Konfiguration lesen + fh = open(trackerfile, 'a+') + while not appdata.shutdown: + time.sleep(self.local_dt) + self.local_lfdno += 1 + data = f"{},{},{},{}\n".format( + self.local_lfdno, + bv_tspos.getValueRaw(), + bv_lat.getValueRaw(), + bv_lon.getValueRaw(), + bv_hdop.getValueRaw()) + fh.write(data) + fh.close() + def set_hero_raceid(self, newraceid): self.hero_raceid = newraceid