Arbeit an Ankerseite und NMEA0183

This commit is contained in:
Thomas Hooge 2025-07-18 09:06:19 +02:00
parent df04c9ad8e
commit 9e4622aeef
2 changed files with 122 additions and 9 deletions

View File

@ -6,16 +6,22 @@ NMEA0183 verarbeiten
def DBS(boatdata, msg): def DBS(boatdata, msg):
# Wassertiefe unter der Oberfläche # Wassertiefe unter der Oberfläche
pass pass
#boatdata.setValue("DBS", msg.depth)
def DBT(boatdata, msg): def DBT(boatdata, msg):
# Wassertiefe unter Geber # Wassertiefe unter Geber
pass pass
#boatdata.setValue("DBT", msg.depth)
def GLL(boatdata, msg): def GLL(boatdata, msg):
print("-> GLL") print("-> GLL")
boatdata.setValue("LAT", msg.latitude) boatdata.setValue("LAT", msg.latitude)
boatdata.setValue("LON", msg.longitude) boatdata.setValue("LON", msg.longitude)
def GSV(boatdata, msg):
# Satellites in view
print("-> GSV")
def HDT(boatdata, msg): def HDT(boatdata, msg):
# Heading True # Heading True
print("-> HDT") print("-> HDT")
@ -27,6 +33,22 @@ def MWV(boatdata, msg):
boatdata.setValue("AWA", msg.wind_angle) boatdata.setValue("AWA", msg.wind_angle)
boatdata.setValue("AWS", msg.wind_speed) boatdata.setValue("AWS", msg.wind_speed)
def MTW(boatdata, msg):
# Wassertemperatur
# boatdata.setValue("WTemp", msg.xxx)
print("-> MTW Wassertemperatur")
def RMB(boatdata, msg):
# Recommended Minimum Navigation Information
# Informationen bzgl. Erreichen des nächsten Wegepunkts
#
print("-> RMB")
def RMC(boatdata, msg):
print("-> RMC")
#boatdata.setValue("LAT", msg.lat)
#boatdata.setValue("LON", msg.lon)
def RSA(boatdata, msg): def RSA(boatdata, msg):
# Rudder Sensor Angle # Rudder Sensor Angle
# negative Werte bedeuten Backbord # negative Werte bedeuten Backbord
@ -39,6 +61,9 @@ def RTE(boatdata, msg):
print("-> RTE") print("-> RTE")
print(msg.fields) print(msg.fields)
def VBW(boatdata, msg):
print("-> VBW")
def VHW(boatdata, msg): def VHW(boatdata, msg):
boatdata.setValue("STW", float(msg.water_speed_knots)) boatdata.setValue("STW", float(msg.water_speed_knots))
@ -54,16 +79,38 @@ def WPL(boatdata, msg):
print("-> WPL") print("-> WPL")
print(msg.fields) print(msg.fields)
def XTE(boatdata, msg):
# Cross Track error measured
print("-> XTE")
def XTR(boatdata, msg):
# Cross Track error gekoppelt
print("-> XTR")
def ZDA(boatdata, msg):
# Time and date
print("-> XTE")
#boatdata.gpsd
#boatdata.gpst
# Aus Performancegründen eine direkte Sprungtabelle, ggf. können # Aus Performancegründen eine direkte Sprungtabelle, ggf. können
# zukünftig außer der Funktion noch weitere Daten gespeichert werdeb # zukünftig außer der Funktion noch weitere Daten gespeichert werdeb
decoder = { decoder = {
"DBS": DBS, "DBS": DBS,
"DBT": DBT, "DBT": DBT,
"GLL": GLL, "GLL": GLL,
"GSV": GSV,
"MWV": MWV, "MWV": MWV,
"MTW": MTW,
"RMB": RMB,
"RMC": RMC,
"RSA": RSA, "RSA": RSA,
"RTE": RTE, "RTE": RTE,
"VBW": VBW,
"VHW": VHW, "VHW": VHW,
"VTG": VTG, "VTG": VTG,
"WPL": WPL "WPL": WPL,
"XTE": XTE,
"XTR": XTR,
"ZDA": ZDA
} }

View File

@ -9,10 +9,20 @@ Daten
- aktuelle Position des Schiffs - aktuelle Position des Schiffs
- aktuelle Wassertiefe an Schiffsposition - aktuelle Wassertiefe an Schiffsposition
- aktuelle Schiffsausrichtung bearing/heading - aktuelle Schiffsausrichtung bearing/heading
- aktuelle Windrichtung - aktuelle Windrichtung (wahr)
- aktuelle Windstärke - aktuelle Windstärke (wahr)
- Alarm aktiv J/N - Alarm aktiv J/N
- Alarmradius - Alarmradius
- GPS Abweichung/ Fehler in der Horizontalen
Darstellung:
- Modi:
- Anker oben / unten
- Nord ist oben
Es gibt verschiedene Unterseiten
- Normalansicht
- Konfigurationsseite
""" """
@ -26,9 +36,13 @@ class Anchor(Page):
def __init__(self, pageno, cfg, boatdata): def __init__(self, pageno, cfg, boatdata):
super().__init__(pageno, cfg, boatdata) super().__init__(pageno, cfg, boatdata)
self.sym_anchor = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "anchor.png")) self.sym_anchor = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "anchor.png"))
self.buttonlabel[1] = 'DEC' self.buttonlabel[1] = 'MODE'
self.buttonlabel[2] = 'INC' self.buttonlabel[2] = 'SET'
self.buttonlabel[5] = 'SET' self.buttonlabel[5] = 'ALARM'
self.mode = 'N' # (N)ormal, (C)onfiguration
self._bd = boatdata
# Der sinnvolle Abstand ist abhängig von der Länge der gesteckten Kette # Der sinnvolle Abstand ist abhängig von der Länge der gesteckten Kette
# Die initial eingegebene Position des Ankers sollte nactträglich justiert # Die initial eingegebene Position des Ankers sollte nactträglich justiert
@ -36,6 +50,7 @@ class Anchor(Page):
self.chain_length = 60 # maximale Länge die ausgesteckt werden kann self.chain_length = 60 # maximale Länge die ausgesteckt werden kann
self.chain = 35 # aktuell gesteckte Länge self.chain = 35 # aktuell gesteckte Länge
self.anchor_set = False
self.anchor_lat = 0 self.anchor_lat = 0
self.anchor_lon = 0 self.anchor_lon = 0
self.anchor_depth = -1 self.anchor_depth = -1
@ -44,12 +59,50 @@ class Anchor(Page):
self.heading = -1 self.heading = -1
self.depth = -1 self.depth = -1
self.alarm_range = 20 self.alarm_range = 20
self.alarm_armed = False self.alarm_enabled = False
self.alarm = False # Alarm ist ausgelöst und aktiv self.alarm = False # Alarm ist ausgelöst und aktiv
self.wind_angle = -1 self.wind_angle = -1
def handle_key(self, buttonid):
if buttonid == 1:
if self.mode == 'N':
self.mode = 'C'
else:
self.mode = 'N'
return True
if buttonid == 2:
if not self.anchor_set:
self.anchor_lat = self._bd.lat
self.anchor_lon = self._bd.lon
self.anchor_set = True
else:
self.anchor_set = False
if self.buttonid == 5:
# Bei aktivem Alarm kann mit dieser Taste der Alarm zurückgesetzt
# werden
if self.alarm:
self.alarm = False
self.buttonlabel[5] = 'ALARM'
if self.alarm_enabled:
self.alarm_enabled = False
self.buttonlabel[5] = 'ALARM'
else:
self.buttonlabel[5] = 'OFF'
return False
def draw(self, ctx): def draw(self, ctx):
"""
value1 = LAT
value2 = LON
value3 = HDOP
value4 = DBS
value5 = TWD
value6 = TWS
"""
# self.anchor_lat =
# Name # Name
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
ctx.set_font_size(20) ctx.set_font_size(20)
@ -63,10 +116,9 @@ class Anchor(Page):
ctx.move_to(2, 70) ctx.move_to(2, 70)
ctx.show_text("Alarm: off") ctx.show_text("Alarm: off")
ctx.move_to(320, 70) ctx.move_to(320, 70)
ctx.show_text("45 m") ctx.show_text(f"{self.chain} m")
ctx.stroke() ctx.stroke()
# Spezialseite # Spezialseite
cx = 200 cx = 200
cy = 150 cy = 150
@ -80,3 +132,17 @@ class Anchor(Page):
ctx.set_source_surface(self.sym_anchor, cx-8, cy-8) ctx.set_source_surface(self.sym_anchor, cx-8, cy-8)
ctx.paint() ctx.paint()
ctx.restore() ctx.restore()
# Boot zeichnen
# Heading beachten
# Windpfeil zeichnen
# TWD / TWS
# boatdata.value(TWD)
p = ((cx, cy - r + 25), (cx - 12, cy - r - 4), (cx, cy - r + 6), (cx + 12, cy - r - 4), (cx, cy - r + 25))
wind = self.rotate((cx, cy), p, 62)
ctx.move_to(*wind[0])
for point in wind[1:]:
ctx.line_to(*point)
ctx.fill()