From c12ac513ba8e3e32cce6d4b9c99bd1efed707851 Mon Sep 17 00:00:00 2001 From: andreas Date: Fri, 12 Nov 2021 19:25:57 +0100 Subject: [PATCH] send/receive gga --- lib/boatData/GwBoatData.h | 3 ++ lib/nmea0183ton2k/NMEA0183DataToN2K.cpp | 39 ++++++++++++++++++++++++- lib/nmea2kto0183/N2kDataToNMEA0183.cpp | 10 +++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/lib/boatData/GwBoatData.h b/lib/boatData/GwBoatData.h index 2fc9f18..a7fa511 100644 --- a/lib/boatData/GwBoatData.h +++ b/lib/boatData/GwBoatData.h @@ -20,6 +20,7 @@ class GwBoatItemBase{ GWSC(formatDepth); GWSC(kelvinToC); GWSC(mtr2nm); + GWSC(formatDop); typedef std::vector GwBoatItemMap; protected: unsigned long lastSet=0; @@ -128,6 +129,8 @@ class GwBoatData{ GWBOATDATA(double,MagneticHeading,4000,formatCourse) GWBOATDATA(double,Variation,4000,formatCourse) GWBOATDATA(double,Deviation,4000,formatCourse) + GWBOATDATA(double,HDOP,4000,formatDop) + GWBOATDATA(double,PDOP,4000,formatDop) GWBOATDATA(double,RudderPosition,4000,formatCourse) GWBOATDATA(double,Latitude,4000,formatLatitude) GWBOATDATA(double,Longitude,4000,formatLongitude) diff --git a/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp b/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp index 2c43c4c..cb6af00 100644 --- a/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp +++ b/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp @@ -578,6 +578,40 @@ private: SetN2kSystemTime(n2kMsg,1,DaysSince1970,SecondsSinceMidnight); send(n2kMsg); } + void convertGGA(const SNMEA0183Msg &msg){ + double GPSTime=NMEA0183DoubleNA; + double Latitude=NMEA0183DoubleNA; + double Longitude=NMEA0183DoubleNA; + int GPSQualityIndicator=NMEA0183Int32NA; + int SatelliteCount=NMEA0183Int32NA; + double HDOP=NMEA0183DoubleNA; + double Altitude=NMEA0183DoubleNA; + double GeoidalSeparation=NMEA0183DoubleNA; + double DGPSAge=NMEA0183DoubleNA; + int DGPSReferenceStationID=NMEA0183Int32NA; + if (! NMEA0183ParseGGA_nc(msg,GPSTime, Latitude,Longitude, + GPSQualityIndicator, SatelliteCount, HDOP, Altitude,GeoidalSeparation, + DGPSAge, DGPSReferenceStationID)){ + LOG_DEBUG(GwLog::DEBUG, "failed to parse GGA %s", msg.line); + return; + } + if (! updateDouble(boatData->SecondsSinceMidnight,GPSTime,msg.sourceId)) return; + if (! updateDouble(boatData->Latitude,Latitude,msg.sourceId)) return; + if (! updateDouble(boatData->Longitude,Longitude,msg.sourceId)) return; + if (! updateDouble(boatData->Altitude,Altitude,msg.sourceId)) return; + if (! updateDouble(boatData->HDOP,HDOP,msg.sourceId)) return; + if (! boatData->DaysSince1970->isValid()) return; + tN2kMsg n2kMsg; + tN2kGNSSmethod method=N2kGNSSm_noGNSS; + if (GPSQualityIndicator <=5 ) method= (tN2kGNSSmethod)GPSQualityIndicator; + SetN2kGNSS(n2kMsg,1, boatData->DaysSince1970->getData(), + GPSTime, Latitude, Longitude, Altitude, + N2kGNSSt_GPS, method, + SatelliteCount, HDOP, boatData->PDOP->getDataWithDefault(N2kDoubleNA), 0, + 0, N2kGNSSt_GPS, DGPSReferenceStationID, + DGPSAge); + send(n2kMsg); + } //shortcut for lambda converters #define CVL [](const SNMEA0183Msg &msg, NMEA0183DataToN2KFunctions *p) -> void @@ -629,7 +663,10 @@ private: String(F("VTG")), &NMEA0183DataToN2KFunctions::convertVTG); converters.registerConverter( 129033UL,126992UL, - String(F("ZDA")), &NMEA0183DataToN2KFunctions::convertZDA); + String(F("ZDA")), &NMEA0183DataToN2KFunctions::convertZDA); + converters.registerConverter( + 129029UL, + String(F("GGA")), &NMEA0183DataToN2KFunctions::convertGGA); unsigned long *aispgns=new unsigned long[7]{129810UL,129809UL,129040UL,129039UL,129802UL,129794UL,129038UL}; converters.registerConverter(7,&aispgns[0], String(F("AIVDM")),&NMEA0183DataToN2KFunctions::convertAIVDX); diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp index 8ab2e0f..996dc9a 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp @@ -309,8 +309,18 @@ private: updateDouble(boatData->Longitude, Longitude); updateDouble(boatData->Altitude, Altitude); updateDouble(boatData->SecondsSinceMidnight, SecondsSinceMidnight); + updateDouble(boatData->HDOP,HDOP); + updateDouble(boatData->PDOP,PDOP); if (DaysSince1970 != N2kUInt16NA && DaysSince1970 != 0) boatData->DaysSince1970->update(DaysSince1970,sourceId); + int quality=0; + if ((int)GNSSmethod <= 5) quality=(int)GNSSmethod; + tNMEA0183AISMsg nmeaMsg; + if (NMEA0183SetGGA(nmeaMsg,SecondsSinceMidnight,Latitude,Longitude, + quality,nSatellites,HDOP,Altitude,GeoidalSeparation,AgeOfCorrection, + ReferenceSationID,talkerId)){ + SendMessage(nmeaMsg); + } } }