From 6214d0817412c046982b870f14be227babea677f Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Sat, 5 Jul 2025 10:12:57 +0200 Subject: [PATCH] GPS-Code von NMEA0183 getrennt, NMEA0183 weiterprogrammiert --- obp60v.py | 68 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 17 deletions(-) diff --git a/obp60v.py b/obp60v.py index 65dceb9..a2be270 100755 --- a/obp60v.py +++ b/obp60v.py @@ -77,7 +77,7 @@ Version Datum Änderung(en) von -------- ----------- ------------------------------------------------------ ---- 0.1 2024-10-31 Entwicklung begonnen tho 0.2 2024-12-24 Veröffentlichung als Git-Repository tho - +0.3 2025 WIP tho """ @@ -195,13 +195,56 @@ def rxd_n2k(device): bus.shutdown() def rxd_0183(devname): - # Prüfe ob Port vorhanden ist und sich öffnen läßt + # Prüfe ob NMEA0183-Port vorhanden ist und sich öffnen läßt try: ser = serial.Serial(devname, 115200, timeout=3) except serial.SerialException as e: print("NMEA0183 serial port not available") return setthreadtitle("0183listener") + while not shutdown: + try: + raw = ser.readline().decode('ascii') + msg = pynmea2.parse(raw) + except pynmea2.nmea.ParseError: + print(f"NMEA0183: Parse-Error: {raw}") + continue + # sentence_type kann fehlen + try: + stype = msg.sentence_type + except: + print(f"NMEA0183: Sentence type missing: {raw}") + continue + if stype == 'GLL': + boatdata.setValue("LAT", msg.latitude) + boatdata.setValue("LON", msg.longitude) + elif stype == '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) + elif stype == 'VHW': + boatdata.setValue("STW", float(msg.water_speed_knots)) + elif stype == 'WPL': + # Wegepunkt + print(msg.fields) + elif stype == 'RTE': + # Route + print(msg.fields) + else: + print(msg) + ser.close() + +def rxd_gps(devname, devspeed): + # Prüfe ob GPS-Port vorhanden ist und sich öffnen läßt + try: + ser = serial.Serial(devname, devspeed, timeout=3) + except serial.SerialException as e: + print("GPS serial port not available") + return + setthreadtitle("GPSlistener") while not shutdown: try: msg = pynmea2.parse(ser.readline().decode('ascii')) @@ -210,19 +253,9 @@ def rxd_0183(devname): if msg.sentence_type == 'GLL': boatdata.setValue("LAT", msg.latitude) boatdata.setValue("LON", msg.longitude) - elif msg.sentence_type == 'VTG': - boatdata.setValue("COG", int(msg.true_track)) - boatdata.setValue("SOG", float(msg.spd_over_grnd_kts[:-1])) - elif msg.sentence_type == 'VHW': - boatdata.setValue("STW", float(msg.water_speed_knots)) - elif msg.sentence_type == 'WPL': - # Wegepunkt - print(msg.fields) - elif msg.sentence_type == 'RTE': - # Route - print(msg.fields) else: print(msg) + print(msg.fields) ser.close() def datareader(histpath, history): @@ -274,10 +307,6 @@ def datareader(histpath, history): for k, v in history.series.items(): if n % k == 0: v.add(pval) - # Lokales GPS abfragen - # TODO - if cfg['gps']: - pass n += 1 for s in history.series.values(): @@ -663,6 +692,9 @@ if __name__ == "__main__": if cfg['nmea0183']: t_rxd_0183 = threading.Thread(target=rxd_0183, args=(cfg['0183_port'],)) t_rxd_0183.start() + if cfg['gps']: + t_rxd_gps = threading.Thread(target=rxd_gps, args=(cfg['gps_port'],)) + t_rxd_gps.start() if not cfg['simulation']: t_data = threading.Thread(target=datareader, args=(cfg['histpath'], history)) t_data.start() @@ -674,6 +706,8 @@ if __name__ == "__main__": t_rxd_n2k.join() if cfg['nmea0183']: t_rxd_0183.join() + if cfg['gps']: + t_rxd_gps.join() if not cfg['simulation']: t_data.join() print("Another fine product of the Sirius Cybernetics Corporation.")