OBP60v/nmea0183.py

222 lines
5.3 KiB
Python

"""
NMEA0183 verarbeiten
"""
def DBS(boatdata, msg):
# Wassertiefe unter der Oberfläche
pass
#boatdata.setValue("DBS", msg.depth)
def DBT(boatdata, msg):
# Wassertiefe unter Geber
pass
#boatdata.setValue("DBT", msg.depth)
def GGA(boatdata, msg):
# Time, position, and fix related data
# msg.num_sats
# msg.timestamp
if msg.gps_qual == 0:
# No fix
return
if msg.lat_dir == 'N':
boatdata.setValue("LAT", msg.latitude)
else:
boatdata.setValue("LAT", msg.latitude * -1)
if msg.lon_dir == 'E':
boatdata.setValue("LON", msg.longitude)
else:
boatdata.setValue("LON", msg.longitude * -1)
boatdata.setValue("HDOP", msg.horizontal_dil)
def GLL(boatdata, msg):
print("-> GLL")
boatdata.setValue("LAT", msg.latitude)
boatdata.setValue("LON", msg.longitude)
def GSV(boatdata, msg):
# Satellites in view
print("-> GSV")
def HDG(boatdata, msg):
# UNUSED: Heading - Deviation & Variation
# Magnetic Sensor heading in degrees
# msg.heading
# .deviation, dev_dir E/W
# .variation, var_dir E/W
pass
def HDM(boatdata, msg):
# Heading magnetic
if msg.magnetic == 'M':
boatdata.setValue("HDM", msg.heading)
else:
print("HDM: M not set!")
def HDT(boatdata, msg):
# Heading True
print("-> HDT")
print(msg.fields)
def HTD(boatdata, msg):
# Heading/Track control data
# e.g. $YDHTD,V,1.5,,R,N,,,,,,,,,A,,,*48
print("-> HTD")
print(msg.fields)
def MWV(boatdata, msg):
# Windgeschwindigkeit und -winkel
print(f"Wind: {msg.wind_angle}° {msg.wind_speed}kt")
boatdata.setValue("AWA", msg.wind_angle)
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):
# Recommended Minimum Navigation Information
# print("-> RMC")
# print(msg.timestamp, msg.datestamp)
# print(msg.status) # V=Warning, P=Precise, A=?
# mag_variation, mag_var_dir E/W
# true_course
if msg.lat_dir == 'N':
boatdata.setValue("LAT", msg.lat)
else:
boatdata.setValue("LAT", msg.lat) * -1
if msg.lon_dir == 'E':
boatdata.setValue("LON", msg.lon)
else:
boatdata.setValue("LON", msg.lon) * -1
boatdata.setValue("SOG", msg.spd_over_grnd)
def ROT(boatdata, msg):
# Rate Of Turn
# print("-> ROT")
if msg.status == 'A':
boatdata.setValue("ROT", msg.rate_of_turn)
def RSA(boatdata, msg):
# Rudder Sensor Angle
# negative Werte bedeuten Backbord
#print("-> RSA")
# Boatdata: RPOS primär, PRPOS sekundär
if msg.rsa_starboard_status== 'A':
boatdata.setValue("RPOS", msg.rsa_starboard)
if msg.rsa_port_status == 'A':
boatdata.setValue("PRPOS", msg.rsa_port)
def RTE(boatdata, msg):
# Route
print("-> RTE")
print(msg.fields)
def VBW(boatdata, msg):
print("-> VBW")
def VHW(boatdata, msg):
print("-> VHW")
boatdata.setValue("STW", float(msg.water_speed_knots))
def VPW(boatdata, msg):
# UNUSED: Speed - Measured Parallel to Wind
# print(f"-> VPW: {msg.speed_kn} kn")
pass
def VTG(boatdata, msg):
print("-> VTG")
boatdata.setValue("COG", int(msg.true_track))
#TODO klären was für Typen hier ankommen können
# bytearray, str, decimal.Decimal?
sog = float(msg.spd_over_grnd_kts)
#str von OpenCPN: sog = float(msg.spd_over_grnd_kts[:-1])
boatdata.setValue("SOG", sog)
def VWR(boatdata, msg):
# Relative Wind Speed and Angle
#print("-> VWR")
if msg.l_r == "R":
angle = msg.deg_r
else:
angle = 360 - msg.deg_r
boatdata.setValue("AWA", angle)
boatdata.setValue("AWS", msg.wind_speed_ms)
def WPL(boatdata, msg):
print("-> WPL")
print(msg.fields)
def VWT(boatdata, msg):
# True Wind Speed and Angle
if msg.direction == "R":
angle = msg.wind_angle_vessel
else:
angle = 360 - msg.wind_angle_vessel
boatdata.setValue("TWA", angle)
boatdata.setValue("TWS", msg.wind_speed_meters)
def XDR(boatdata, msg):
# Extra sensor data / Transducer Measurement
# type, value, units, id
# type: A
# units: D
# id: Yaw
if msg.id.lower() == 'yaw':
boatdata.setValue("YAW", msg.value)
else:
print(f"-> XDR: {msg.type}, {msg.value}, {msg.units}, {msg.id}")
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
# zukünftig außer der Funktion noch weitere Daten gespeichert werdeb
decoder = {
"DBS": DBS,
"DBT": DBT,
"GGA": GGA,
"GLL": GLL,
"GSV": GSV,
"HDG": HDG,
"HDM": HDM,
"HTD": HTD,
"MWV": MWV,
"MTW": MTW,
"RMB": RMB,
"ROT": ROT,
"RMC": RMC,
"RSA": RSA,
"RTE": RTE,
"VBW": VBW,
"VHW": VHW,
"VPW": VPW,
"VTG": VTG,
"VWR": VWR,
"VWT": VWT,
"WPL": WPL,
"XDR": XDR,
"XTE": XTE,
"XTR": XTR,
"ZDA": ZDA
}