From aa0d22aab3d1fbd928862b6b06b671d0bb32dc51 Mon Sep 17 00:00:00 2001 From: wellenvogel Date: Thu, 18 Nov 2021 17:27:40 +0100 Subject: [PATCH] convert xte 2 way --- doc/Conversions.odt | Bin 19963 -> 19997 bytes lib/boatData/GwBoatData.cpp | 2 +- lib/boatData/GwBoatData.h | 3 +- lib/nmea0183ton2k/NMEA0183DataToN2K.cpp | 57 ++++++++++++++++-------- lib/nmea2kto0183/N2kDataToNMEA0183.cpp | 45 +++++++++++++++++++ web/index.js | 8 ++++ 6 files changed, 95 insertions(+), 20 deletions(-) diff --git a/doc/Conversions.odt b/doc/Conversions.odt index 86e03acdc0ba810a9bd19d0f058b30a2a6bb10fa..fc9afe76dc7f2f1dbf7c0cd41b94bf25f1377eb0 100644 GIT binary patch delta 15596 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 O?MWj;n~DE3)BgcT#y3O& delta 15632 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, item, msg.sourceId) #define UI(item) updateUint32(boatData->item, item, msg.sourceId) + tN2kXTEMode xteMode(const char modeChar){ + switch(modeChar){ + case 'D': + return N2kxtem_Differential; + case 'E': + return N2kxtem_Estimated; + case 'M': + return N2kxtem_Manual; + case 'S': + return N2kxtem_Simulator; + default: + break; + } + return N2kxtem_Autonomous; + } void convertRMB(const SNMEA0183Msg &msg) { LOG_DEBUG(GwLog::DEBUG + 1, "convert RMB"); @@ -141,23 +156,7 @@ private: tN2kXTEMode mode=N2kxtem_Autonomous; if (msg.FieldCount() > 13){ const char *modeChar=msg.Field(13); - switch(*modeChar){ - case 'D': - mode=N2kxtem_Differential; - break; - case 'E': - mode=N2kxtem_Estimated; - break; - case 'M': - mode=N2kxtem_Manual; - break; - case 'S': - mode=N2kxtem_Simulator; - break; - default: - break; - - } + mode=xteMode(*modeChar); } SetN2kXTE(n2kMsg,1,mode,false,rmb.xte); send(n2kMsg); @@ -725,6 +724,25 @@ private: SetN2kRateOfTurn(n2kMsg,1,ROT); send(n2kMsg); } + void convertXTE(const SNMEA0183Msg &msg){ + if (msg.FieldCount() < 6){ + LOG_DEBUG(GwLog::DEBUG,"unable to parse XTE %s",msg.line); + return; + } + if (msg.Field(0)[0] != 'A') return; + if (msg.Field(1)[0] != 'A') return; + if (msg.Field(4)[0] != 'N') return; //nm only + if (msg.FieldLen(2) < 1) return; + const char dir=msg.Field(3)[0]; + if (dir != 'L' && dir != 'R') return; + double xte=atof(msg.Field(2)) * nmTom; + if (dir == 'R') xte=-xte; + if (! updateDouble(boatData->XTE,xte,msg.sourceId)) return; + tN2kMsg n2kMsg; + tN2kXTEMode mode=xteMode(msg.Field(5)[0]); + SetN2kXTE(n2kMsg,1,mode,false,xte); + send(n2kMsg); + } //shortcut for lambda converters #define CVL [](const SNMEA0183Msg &msg, NMEA0183DataToN2KFunctions *p) -> void @@ -791,7 +809,10 @@ private: String(F("GLL")), &NMEA0183DataToN2KFunctions::convertGLL); converters.registerConverter( 127251UL, - String(F("ROT")), &NMEA0183DataToN2KFunctions::convertROT); + String(F("ROT")), &NMEA0183DataToN2KFunctions::convertROT); + converters.registerConverter( + 129283UL, + String(F("XTE")), &NMEA0183DataToN2KFunctions::convertXTE); 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 94403c7..31acd92 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp @@ -1030,6 +1030,50 @@ private: SendMessage(nmeamsg); } } + void HandleXTE(const tN2kMsg &msg){ + unsigned char SID=0; + tN2kXTEMode XTEMode; + bool NavigationTerminated=false; + double XTE=N2kDoubleNA; + if (! ParseN2kXTE(msg,SID,XTEMode,NavigationTerminated,XTE)){ + LOG_DEBUG(GwLog::DEBUG,"unable to parse PGN %d",msg.PGN); + return; + } + if (NavigationTerminated) return; + if (! updateDouble(boatData->XTE,XTE)) return; + tNMEA0183Msg nmeamsg; + if (!nmeamsg.Init("XTE",talkerId)) return; + const char *mode="A"; + switch(XTEMode){ + case N2kxtem_Differential: + mode="D"; + break; + case N2kxtem_Estimated: + mode="E"; + break; + case N2kxtem_Simulator: + mode="S"; + break; + case N2kxtem_Manual: + mode="M"; + break; + default: + break; + } + if (!nmeamsg.AddStrField("A")) return; + if (!nmeamsg.AddStrField("A")) return; + double val=mtr2nm(XTE); + const char *dir="L"; + if (val < 0) { + dir="R"; + val=-val; + } + if (! nmeamsg.AddDoubleField(val,1.0,"%.4f")) return; + if (! nmeamsg.AddStrField(dir)) return; + if (! nmeamsg.AddStrField("N")) return; + if (! nmeamsg.AddStrField(mode)) return; + SendMessage(nmeamsg); + } void registerConverters() @@ -1055,6 +1099,7 @@ private: converters.registerConverter(129539UL, &N2kToNMEA0183Functions::HandleDop); converters.registerConverter(129540UL, &N2kToNMEA0183Functions::HandleSats); converters.registerConverter(127251UL, &N2kToNMEA0183Functions::HandleROT); + converters.registerConverter(129283UL, &N2kToNMEA0183Functions::HandleXTE); #define HANDLE_AIS #ifdef HANDLE_AIS converters.registerConverter(129038UL, &N2kToNMEA0183Functions::HandleAISClassAPosReport); // AIS Class A Position Report, Message Type 1 diff --git a/web/index.js b/web/index.js index 9816c76..d83230c 100644 --- a/web/index.js +++ b/web/index.js @@ -548,6 +548,14 @@ let valueFormatters = { return x.toFixed(2); }, u:'°/s' + }, + formatXte:{ + f: function(v){ + let x=parseFloat(v); + if (isNaN(x)) return '---'; + return x.toFixed(0); + }, + u:'m' } } function createDashboardItem(name, def, parent) {