Noch mehr NMEA0183 code

This commit is contained in:
Thomas Hooge 2025-07-19 21:41:50 +02:00
parent ae38d2b681
commit 5d8b33b086
3 changed files with 65 additions and 12 deletions

3
TODO
View File

@ -1,5 +1,8 @@
Aufgaben- und Planungs- und Ideenliste
- Satelliten: SatelliteList verwenden und dieses auch in
nmea2000 implementieren
- datareader für mehrere I²C-Sensoren. History muß entsprechend
eine Liste sein.

View File

@ -13,6 +13,17 @@ def DBT(boatdata, msg):
pass
#boatdata.setValue("DBT", msg.depth)
def GBS(boatdata, msg):
# GNSS satellite fault detection
"""
(('Timestamp', 'timestamp', <function timestamp at 0x7f59cb0b65c0>), ('Expected error in latitude', 'lat_err'), ('Expected error in longitude', 'lon_err'), ('Expected error in altitude', 'alt_err'), ('PRN of most likely failed satellite', 'sat_prn_num_f'), ('Probability of missed detection for most likely failed satellite', 'pro_miss', <class 'decimal.Decimal'>), ('Estimate of bias in meters on most likely failed satellite', 'est_bias'), ('Standard deviation of bias estimate', 'est_bias_dev'))
['213024.00', '0.9', '0.6', '2.5', '', '', '', '']
NMEA0183: Parse-Error: !AIVDM,1,1,,A,H3ti3hPpDhiT0 """
print("-> GBS")
print(msg.fields)
print(msg.data)
#boatdata.setValue("LAT", msg.latitude)
def GGA(boatdata, msg):
# Time, position, and fix related data
# msg.num_sats
@ -36,30 +47,44 @@ def GLL(boatdata, msg):
boatdata.setValue("LON", msg.longitude)
def GSA(boatdata, msg):
print("-> GSA")
print(msg.fields)
print(msg.data)
# Satellites
for i in range(1, 13):
satno = getattr(msg, f"sv_id{i:02}")
if (len(satno) > 0) and not satno in boatdata.sat:
boatdata.addSatellite(int(satno))
boatdata.setValue("PDOP", float(msg.pdop))
boatdata.setValue("PDOP", float(msg.hdop))
boatdata.setValue("PDOP", float(msg.vdop))
def GSV(boatdata, msg):
# Satellites in view
# mgs_num msg.num_messages # Nachricht n von m
# msg.num_sv_in_view # Anzahl sichtbarer Satelliten
rres = None # range residuals
status = 2 # lookup -> prnusage; 1=tracked 2=used
for i in range(1, 5):
prn_num = getattr(msg, f"sv_prn_num_{i}")
if len(prn_num) > 0:
elevation = float(getattr(msg, f"elevation_deg_{i}"))
azimuth = float(getattr(msg, f"azimuth_{i}"))
snr = getattr(msg, f"snr_{i}")
if len(snr) == 0:
snr = 0
status = 1 # prnusage tracked
else:
status = 2 # prnusage used
boatdata.updateSatellite(int(prn_num), elevation, azimuth, int(snr), rres, status)
"""
if msg.sv_prn_num_1:
print(msg.sv_prn_num_1, msg.elevation_deg_1, msg.azimuth_1, msg.snr_1)
if msg.snr_1 == '':
status = 1
msg.snr_1 = 0
boatdata.updateSatellite(int(msg.sv_prn_num_1), float(msg.elevation_deg_1), float(msg.azimuth_1), int(msg.snr_1), rres, status)
if msg.sv_prn_num_2:
print(msg.sv_prn_num_2, msg.elevation_deg_2, msg.azimuth_2, msg.snr_2)
if msg.snr_2 == '':
status = 1
msg.snr_2 = 0
boatdata.updateSatellite(int(msg.sv_prn_num_2), float(msg.elevation_deg_2), float(msg.azimuth_2), int(msg.snr_2), rres, status)
if msg.sv_prn_num_3:
print(msg.sv_prn_num_3, msg.elevation_deg_3, msg.azimuth_3, msg.snr_3)
if msg.snr_3 == '':
status = 1
msg.snr_3 = 0
@ -68,8 +93,8 @@ def GSV(boatdata, msg):
if msg.snr_4 == '':
status = 1
msg.snr_4 = 0
print(msg.sv_prn_num_4, msg.elevation_deg_4, msg.azimuth_4, msg.snr_4)
boatdata.updateSatellite(int(msg.sv_prn_num_4), float(msg.elevation_deg_4), float(msg.azimuth_4), int(msg.snr_4), rres, status)
"""
def HDG(boatdata, msg):
# UNUSED: Heading - Deviation & Variation
@ -166,9 +191,21 @@ def VPW(boatdata, msg):
def VTG(boatdata, msg):
# Track made good and speed over ground
"""
(('True Track made good', 'true_track', <class 'float'>),
('True Track made good symbol', 'true_track_sym'),
('Magnetic Track made good', 'mag_track', <class 'decimal.Decimal'>),
('Magnetic Track symbol', 'mag_track_sym'),
('Speed over ground knots', 'spd_over_grnd_kts', <class 'decimal.Decimal'>),
('Speed over ground symbol', 'spd_over_grnd_kts_sym'),
('Speed over ground kmph', 'spd_over_grnd_kmph', <class 'float'>),
('Speed over ground kmph symbol', 'spd_over_grnd_kmph_sym'),
('FAA mode indicator', 'faa_mode'))
['', 'T', '', 'M', '0.117', 'N', '0.216', 'K', 'A'] """
print("-> VTG")
print(msg.fields)
boatdata.setValue("COG", int(msg.true_track))
# msg.true_track true_track_sym
# msg.mag_track mag_track_sym
# msg.faa_mode
#TODO klären was für Typen hier ankommen können
# bytearray, str, decimal.Decimal?
sog = float(msg.spd_over_grnd_kts)
@ -223,11 +260,22 @@ def ZDA(boatdata, msg):
#boatdata.gpsd
#boatdata.gpst
# AIS
def VDM(boatdata, msg):
print("-> VDM")
print(msg.fields)
print(msg.data)
def VDO(boatdata, msg):
print("-> VDO")
# 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,
"GBS": GBS,
"GGA": GGA,
"GLL": GLL,
"GSA": GSA,
@ -252,5 +300,7 @@ decoder = {
"XDR": XDR,
"XTE": XTE,
"XTR": XTR,
"ZDA": ZDA
"ZDA": ZDA,
"VDM": VDM
}

View File

@ -708,7 +708,7 @@ if __name__ == "__main__":
t_rxd_n2k = threading.Thread(target=rxd_n2k, args=(cfg['can_intf'],))
t_rxd_n2k.start()
if cfg['nmea0183']:
print("NMEA0183 enabled")
print("NMEA0183 enabled, library version {}".format(pynmea2.version))
t_rxd_0183 = threading.Thread(target=rxd_0183, args=(cfg['0183_port'],))
t_rxd_0183.start()
if cfg['gps']: