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 Aufgaben- und Planungs- und Ideenliste
- Satelliten: SatelliteList verwenden und dieses auch in
nmea2000 implementieren
- datareader für mehrere I²C-Sensoren. History muß entsprechend - datareader für mehrere I²C-Sensoren. History muß entsprechend
eine Liste sein. eine Liste sein.

View File

@ -13,6 +13,17 @@ def DBT(boatdata, msg):
pass pass
#boatdata.setValue("DBT", msg.depth) #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): def GGA(boatdata, msg):
# Time, position, and fix related data # Time, position, and fix related data
# msg.num_sats # msg.num_sats
@ -36,30 +47,44 @@ def GLL(boatdata, msg):
boatdata.setValue("LON", msg.longitude) boatdata.setValue("LON", msg.longitude)
def GSA(boatdata, msg): def GSA(boatdata, msg):
print("-> GSA") # Satellites
print(msg.fields) for i in range(1, 13):
print(msg.data) 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): def GSV(boatdata, msg):
# Satellites in view # Satellites in view
# mgs_num msg.num_messages # Nachricht n von m # mgs_num msg.num_messages # Nachricht n von m
# msg.num_sv_in_view # Anzahl sichtbarer Satelliten # msg.num_sv_in_view # Anzahl sichtbarer Satelliten
rres = None # range residuals 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: 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 == '': if msg.snr_1 == '':
status = 1 status = 1
msg.snr_1 = 0 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) 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: 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 == '': if msg.snr_2 == '':
status = 1 status = 1
msg.snr_2 = 0 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) 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: 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 == '': if msg.snr_3 == '':
status = 1 status = 1
msg.snr_3 = 0 msg.snr_3 = 0
@ -68,8 +93,8 @@ def GSV(boatdata, msg):
if msg.snr_4 == '': if msg.snr_4 == '':
status = 1 status = 1
msg.snr_4 = 0 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) 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): def HDG(boatdata, msg):
# UNUSED: Heading - Deviation & Variation # UNUSED: Heading - Deviation & Variation
@ -166,9 +191,21 @@ def VPW(boatdata, msg):
def VTG(boatdata, msg): def VTG(boatdata, msg):
# Track made good and speed over ground # 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("-> VTG")
print(msg.fields) # msg.true_track true_track_sym
boatdata.setValue("COG", int(msg.true_track)) # msg.mag_track mag_track_sym
# msg.faa_mode
#TODO klären was für Typen hier ankommen können #TODO klären was für Typen hier ankommen können
# bytearray, str, decimal.Decimal? # bytearray, str, decimal.Decimal?
sog = float(msg.spd_over_grnd_kts) sog = float(msg.spd_over_grnd_kts)
@ -223,11 +260,22 @@ def ZDA(boatdata, msg):
#boatdata.gpsd #boatdata.gpsd
#boatdata.gpst #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 # 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,
"GBS": GBS,
"GGA": GGA, "GGA": GGA,
"GLL": GLL, "GLL": GLL,
"GSA": GSA, "GSA": GSA,
@ -252,5 +300,7 @@ decoder = {
"XDR": XDR, "XDR": XDR,
"XTE": XTE, "XTE": XTE,
"XTR": XTR, "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 = threading.Thread(target=rxd_n2k, args=(cfg['can_intf'],))
t_rxd_n2k.start() t_rxd_n2k.start()
if cfg['nmea0183']: 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 = threading.Thread(target=rxd_0183, args=(cfg['0183_port'],))
t_rxd_0183.start() t_rxd_0183.start()
if cfg['gps']: if cfg['gps']: