Tracker verbessert, lokales Tracking vorbereitet

This commit is contained in:
Thomas Hooge 2025-09-21 10:00:56 +02:00
parent e5646b6f27
commit f0ebdd0201
4 changed files with 60 additions and 7 deletions

View File

@ -41,12 +41,13 @@ config = ~/.opencpn/opencpn.conf
type = NONE type = NONE
host = 127.0.0.1 host = 127.0.0.1
port = 80 port = 80
path = /
ssl = false ssl = false
username = demo username = demo
password = secret password = secret
mqtt_host = 127.0.0.1 mqtt_host = 127.0.0.1
mqtt_port = 1883 mqtt_port = 1883
mqtt_ssl = False mqtt_ssl = false
mqtt_user = demo mqtt_user = demo
mqtt_pass = 123456 mqtt_pass = 123456
trace = false trace = false
@ -134,4 +135,3 @@ type = Rudder
[page10] [page10]
type = SkyView type = SkyView

View File

@ -120,6 +120,7 @@ __email__ = "thomas@hoogi.de"
__status__ = "Development" __status__ = "Development"
# Standardkonfiguration, kann durch Konfigdatei überschrieben werden # Standardkonfiguration, kann durch Konfigdatei überschrieben werden
# TODO prüfen ob defaults ziehen wenn kein Eintrag in Konfigdatei
cfg = { cfg = {
'cfgfile': 'obp60v.conf', 'cfgfile': 'obp60v.conf',
'logdir': '~/.local/share/obp60v', 'logdir': '~/.local/share/obp60v',
@ -127,6 +128,7 @@ cfg = {
'loglevel': 3, 'loglevel': 3,
'imgpath': os.path.join(sys.path[0], 'images'), 'imgpath': os.path.join(sys.path[0], 'images'),
'audiopath': os.path.join(sys.path[0], 'audio'), 'audiopath': os.path.join(sys.path[0], 'audio'),
'histpath' = '~/.local/lib/obp60v',
'deviceid': 100, 'deviceid': 100,
'manufcode': 2046, # Open Boat Projects (OBP) 'manufcode': 2046, # Open Boat Projects (OBP)
'devfunc': 120, # Display 'devfunc': 120, # Display
@ -804,10 +806,13 @@ if __name__ == "__main__":
log.info("Networking enabled") log.info("Networking enabled")
t_rxd_net = threading.Thread(target=rxd_network, args=(cfg['net_port'],cfg['net_addr'])) t_rxd_net = threading.Thread(target=rxd_network, args=(cfg['net_port'],cfg['net_addr']))
t_rxd_net.start() t_rxd_net.start()
if cfg['tracker']['type'] != 'NONE': if cfg['tracker']['type'] == 'NONE':
log.info(f"Tracking enabled, mode {cfg['tracker']['type']}") log.info(f"Tracking enabled, mode {cfg['tracker']['type']}")
#appdata.track.set_type( 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() t_tracker.start()
if not cfg['simulation']: if not cfg['simulation']:
if cfg['bme280']: if cfg['bme280']:

View File

@ -11,7 +11,7 @@ Es gibt zwei Modi: Track und Race
Um versehentliches Umschalten zu vermeiden ist eine Nachfrage Um versehentliches Umschalten zu vermeiden ist eine Nachfrage
integriert. integriert.
- currentry only Ragatta hero supported - Momentan wird nur Regatta Hero unterstützt
Behandlung von Verbindungsabbrüchen: Behandlung von Verbindungsabbrüchen:
- on_disconnect - on_disconnect
@ -196,6 +196,20 @@ class RaceTracker(Page):
ctx.move_to(x, y) ctx.move_to(x, y)
ctx.show_text("race officer to get configuration data.") 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): def draw_normal(self, ctx):
ctx.select_font_face("DSEG7 Classic") ctx.select_font_face("DSEG7 Classic")

View File

@ -3,9 +3,17 @@ Tracker-Daten
Mögliche Typen: Mögliche Typen:
HERO - Regatta Hero HERO - Regatta Hero
SDCARD SDCARD - nur für ESP32 relevant
LOCAL - gpx Datei 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 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 NONE - kein Tracking
Wenn die Verbindung zum Server im Internet nicht funktioniert, werden Wenn die Verbindung zum Server im Internet nicht funktioniert, werden
@ -119,6 +127,32 @@ class Tracker():
def set_active(self, newval): def set_active(self, newval):
self.activated = 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): def set_hero_raceid(self, newraceid):
self.hero_raceid = newraceid self.hero_raceid = newraceid