From c6c33fa3ddb792c2461d35323fb3682a76352436 Mon Sep 17 00:00:00 2001 From: wellenvogel Date: Thu, 18 Nov 2021 22:46:16 +0100 Subject: [PATCH] convert n2k to RMB --- doc/Conversions.odt | Bin 19997 -> 20018 bytes lib/nmea2kto0183/N2kDataToNMEA0183.cpp | 78 +++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/doc/Conversions.odt b/doc/Conversions.odt index fc9afe76dc7f2f1dbf7c0cd41b94bf25f1377eb0..6c57b7bb6259b40cee70060c96f4e992d0b29af0 100644 GIT binary patch delta 5974 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 diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp index 31acd92..0244b86 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp @@ -1075,6 +1075,83 @@ private: SendMessage(nmeamsg); } + void HandleNavigation(const tN2kMsg &msg){ + unsigned char SID=0; + double DistanceToWaypoint=N2kDoubleNA; + tN2kHeadingReference BearingReference; + bool PerpendicularCrossed=false; + bool ArrivalCircleEntered=false; + tN2kDistanceCalculationType CalculationType; + double ETATime=N2kDoubleNA; + int16_t ETADate=0; + double BearingOriginToDestinationWaypoint=N2kDoubleNA; + double BearingPositionToDestinationWaypoint=N2kDoubleNA; + uint8_t OriginWaypointNumber; + uint8_t DestinationWaypointNumber; + double DestinationLatitude=N2kDoubleNA; + double DestinationLongitude=N2kDoubleNA; + double WaypointClosingVelocity=N2kDoubleNA; + if (! ParseN2kNavigationInfo(msg,SID,DistanceToWaypoint,BearingReference, + PerpendicularCrossed, ArrivalCircleEntered,CalculationType, + ETATime, ETADate, BearingOriginToDestinationWaypoint, BearingPositionToDestinationWaypoint, + OriginWaypointNumber, DestinationWaypointNumber, + DestinationLatitude, DestinationLongitude,WaypointClosingVelocity)){ + LOG_DEBUG(GwLog::DEBUG,"unable to parse PGN %d",msg.PGN); + return; + } + if (CalculationType != N2kdct_GreatCircle){ + LOG_DEBUG(GwLog::DEBUG,"can only handle %d with great circle type",msg.PGN); + return; + } + if (BearingReference != N2khr_true && BearingReference != N2khr_magnetic){ + LOG_DEBUG(GwLog::DEBUG,"invalid bearing ref %d for %d ",(int)BearingReference, msg.PGN); + return; + } + if (BearingReference == N2khr_magnetic){ + if (! boatData->Variation->isValid()){ + LOG_DEBUG(GwLog::DEBUG,"missing variation to compute true heading for %d ", msg.PGN); + return; + } + BearingPositionToDestinationWaypoint-=boatData->Variation->getData(); + + } + if (! updateDouble(boatData->DTW,DistanceToWaypoint)) return; + if (! updateDouble(boatData->BTW,BearingPositionToDestinationWaypoint)) return; + if (! updateDouble(boatData->WPLatitude,DestinationLatitude)) return; + if (! updateDouble(boatData->WPLongitude,DestinationLongitude)) return; + tNMEA0183Msg nmeaMsg; + if (! nmeaMsg.Init("RMB",talkerId)) return; + if (! nmeaMsg.AddStrField("A")) return; + const char *dir="L"; + double xte=boatData->XTE->getDataWithDefault(NMEA0183DoubleNA); + if (xte != NMEA0183DoubleNA){ + if (xte < 0){ + xte=-xte; + dir="R"; + } + xte=mtr2nm(xte); + if (xte > 9.99) xte=9.99; + } + if (! nmeaMsg.AddDoubleField(xte,1.0,"%.2f",dir)) return; + //TODO: handle waypoint names + if (! nmeaMsg.AddUInt32Field(OriginWaypointNumber)) return; + if (! nmeaMsg.AddUInt32Field(DestinationWaypointNumber)) return; + if (! nmeaMsg.AddLatitudeField(DestinationLatitude)) return; + if (! nmeaMsg.AddLongitudeField(DestinationLongitude)) return; + double distance=mtr2nm(DistanceToWaypoint); + if (distance > 999.9) distance=999.9; + if (! nmeaMsg.AddDoubleField(distance,1,"%.1f")) return; + if (! nmeaMsg.AddDoubleField(formatCourse(BearingPositionToDestinationWaypoint))) return; + if (WaypointClosingVelocity != N2kDoubleNA){ + if (!nmeaMsg.AddDoubleField(msToKnots(WaypointClosingVelocity))) return; + } + else{ + if (!nmeaMsg.AddEmptyField()) return; + } + if (! nmeaMsg.AddStrField(ArrivalCircleEntered?"A":"V")) return; + SendMessage(nmeaMsg); + } + void registerConverters() { @@ -1100,6 +1177,7 @@ private: converters.registerConverter(129540UL, &N2kToNMEA0183Functions::HandleSats); converters.registerConverter(127251UL, &N2kToNMEA0183Functions::HandleROT); converters.registerConverter(129283UL, &N2kToNMEA0183Functions::HandleXTE); + converters.registerConverter(129284UL, &N2kToNMEA0183Functions::HandleNavigation); #define HANDLE_AIS #ifdef HANDLE_AIS converters.registerConverter(129038UL, &N2kToNMEA0183Functions::HandleAISClassAPosReport); // AIS Class A Position Report, Message Type 1