From d0256fd37cab52e7195c69b945a1834fe7e18a20 Mon Sep 17 00:00:00 2001 From: free-x Date: Mon, 24 Feb 2025 19:01:13 +0100 Subject: [PATCH 1/3] #103: Initial VWR --- lib/nmea2kto0183/N2kDataToNMEA0183.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp index 1056c87..11854f1 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp @@ -528,6 +528,30 @@ private: { SendMessage(NMEA0183Msg); } + + if (shouldSend && NMEA0183Reference == NMEA0183Wind_Apparent) + { + if (!NMEA0183Msg.Init("VWR", talkerId)) + return; + if (!NMEA0183Msg.AddUInt32Field((abs(WindAngle) > 180 ) ? 360-abs(WindAngle) : abs(WindAngle) )) + return; + if (!NMEA0183Msg.AddStrField((WindAngle >= 0 && WindAngle <= 180) ? 'R' : 'L')) + return; + if (!NMEA0183Msg.AddDoubleField(WindSpeed * 3600.0/1852.0)) + return; + if (!NMEA0183Msg.AddStrField("N")) + return; + if (!NMEA0183Msg.AddDoubleField(WindSpeed)) + return; + if (!NMEA0183Msg.AddStrField("M")) + return; + if (!NMEA0183Msg.AddDoubleField(WindSpeed * 3600.0/1000.0)) + return; + if (!NMEA0183Msg.AddStrField("K")) + return; + + SendMessage(NMEA0183Msg); + } } /* if (WindReference == N2kWind_Apparent && boatData->SOG->isValid()) From 6a2c623ea03c387595c6a6348034e28193acee04 Mon Sep 17 00:00:00 2001 From: free-x Date: Tue, 25 Feb 2025 18:54:00 +0100 Subject: [PATCH 2/3] #103: using formatters --- lib/boatData/GwBoatData.cpp | 7 ++++++- lib/boatData/GwBoatData.h | 3 ++- lib/nmea2kto0183/N2kDataToNMEA0183.cpp | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/boatData/GwBoatData.cpp b/lib/boatData/GwBoatData.cpp index 39d22c8..424ebe4 100644 --- a/lib/boatData/GwBoatData.cpp +++ b/lib/boatData/GwBoatData.cpp @@ -493,6 +493,11 @@ double formatKnots(double cv) return cv * 3600.0 / 1852.0; } +double formatKmh(double cv) +{ + return cv *3600.0 / 1000.0; +} + uint32_t mtr2nm(uint32_t m) { return m / 1852; @@ -523,4 +528,4 @@ public: }; static XWriter xwriter; ARDUINOJSON_NAMESPACE::TextFormatter testWriter(xwriter); -#endif \ No newline at end of file +#endif diff --git a/lib/boatData/GwBoatData.h b/lib/boatData/GwBoatData.h index a4df3b4..ae50b3f 100644 --- a/lib/boatData/GwBoatData.h +++ b/lib/boatData/GwBoatData.h @@ -129,6 +129,7 @@ double formatCourse(double cv); double formatDegToRad(double deg); double formatWind(double cv); double formatKnots(double cv); +double formatKmh(double cv); uint32_t mtr2nm(uint32_t m); double mtr2nm(double m); @@ -251,4 +252,4 @@ class GwBoatData{ }; -#endif \ No newline at end of file +#endif diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp index 11854f1..278c71e 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp @@ -537,7 +537,7 @@ private: return; if (!NMEA0183Msg.AddStrField((WindAngle >= 0 && WindAngle <= 180) ? 'R' : 'L')) return; - if (!NMEA0183Msg.AddDoubleField(WindSpeed * 3600.0/1852.0)) + if (!NMEA0183Msg.AddDoubleField(formatKnots(WindSpeed))) return; if (!NMEA0183Msg.AddStrField("N")) return; @@ -545,7 +545,7 @@ private: return; if (!NMEA0183Msg.AddStrField("M")) return; - if (!NMEA0183Msg.AddDoubleField(WindSpeed * 3600.0/1000.0)) + if (!NMEA0183Msg.AddDoubleField(formatKmh(WindSpeed))) return; if (!NMEA0183Msg.AddStrField("K")) return; From 5e41c64dd39e74a20fd5e9f38d9bb55270f806ba Mon Sep 17 00:00:00 2001 From: free-x Date: Thu, 27 Feb 2025 19:44:19 +0100 Subject: [PATCH 3/3] #103: fix units logic --- lib/nmea2kto0183/N2kDataToNMEA0183.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp index 278c71e..afafcd6 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp @@ -531,11 +531,12 @@ private: if (shouldSend && NMEA0183Reference == NMEA0183Wind_Apparent) { + double wa = formatCourse(WindAngle); if (!NMEA0183Msg.Init("VWR", talkerId)) return; - if (!NMEA0183Msg.AddUInt32Field((abs(WindAngle) > 180 ) ? 360-abs(WindAngle) : abs(WindAngle) )) + if (!NMEA0183Msg.AddDoubleField(( wa > 180 ) ? 360-wa : wa)) return; - if (!NMEA0183Msg.AddStrField((WindAngle >= 0 && WindAngle <= 180) ? 'R' : 'L')) + if (!NMEA0183Msg.AddStrField(( wa >= 0 && wa <= 180) ? 'R' : 'L')) return; if (!NMEA0183Msg.AddDoubleField(formatKnots(WindSpeed))) return;