diff --git a/TODO b/TODO index 03ba003..8b38faa 100644 --- a/TODO +++ b/TODO @@ -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. diff --git a/nmea0183.py b/nmea0183.py index 72cf2bc..3e78744 100644 --- a/nmea0183.py +++ b/nmea0183.py @@ -13,6 +13,17 @@ def DBT(boatdata, msg): pass #boatdata.setValue("DBT", msg.depth) +def GBS(boatdata, msg): + # GNSS satellite fault detection + """ +(('Timestamp', 'timestamp', ), ('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', ), ('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', ), +('True Track made good symbol', 'true_track_sym'), +('Magnetic Track made good', 'mag_track', ), + ('Magnetic Track symbol', 'mag_track_sym'), + ('Speed over ground knots', 'spd_over_grnd_kts', ), + ('Speed over ground symbol', 'spd_over_grnd_kts_sym'), + ('Speed over ground kmph', 'spd_over_grnd_kmph', ), + ('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 } diff --git a/obp60v.py b/obp60v.py index 2c0586f..ba98204 100755 --- a/obp60v.py +++ b/obp60v.py @@ -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']: