""" 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 GSA(boatdata, msg): print("-> GSA") print(msg.fields) print(msg.data) 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 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 boatdata.updateSatellite(int(msg.sv_prn_num_3), float(msg.elevation_deg_3), float(msg.azimuth_3), int(msg.snr_3), rres, status) if msg.sv_prn_num_4: 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 # 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): # Track made good and speed over ground print("-> VTG") print(msg.fields) 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, "GSA": GSA, "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 }