From b0684fc65afb08131bd8728e5299d58f9a0be6a5 Mon Sep 17 00:00:00 2001 From: andreas Date: Fri, 5 Nov 2021 21:14:39 +0100 Subject: [PATCH] allow to set the nmea0183 talker id --- lib/nmea2kto0183/N2kDataToNMEA0183.cpp | 43 ++++++++++++++------------ lib/nmea2kto0183/N2kDataToNMEA0183.h | 5 +-- src/main.cpp | 4 +-- web/config.json | 8 +++++ 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp index 62a0330..7dd8244 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp @@ -33,10 +33,12 @@ N2kDataToNMEA0183::N2kDataToNMEA0183(GwLog * logger, GwBoatData *boatData, tNMEA2000 *NMEA2000, - tSendNMEA0183MessageCallback callback, int id) + tSendNMEA0183MessageCallback callback, int id,String talkerId) : tNMEA2000::tMsgHandler(0,NMEA2000){ SendNMEA0183MessageCallback=0; this->SendNMEA0183MessageCallback=callback; + strncpy(this->talkerId,talkerId.c_str(),2); + talkerId[2]=0; sourceId=id; } @@ -136,13 +138,13 @@ private: //no variation if (ref == N2khr_magnetic){ updateDouble(boatData->MagneticHeading,Heading); - if (NMEA0183SetHDM(NMEA0183Msg,Heading)){ + if (NMEA0183SetHDM(NMEA0183Msg,Heading,talkerId)){ SendMessage(NMEA0183Msg); } } if (ref == N2khr_true){ updateDouble(boatData->Heading,Heading); - if (NMEA0183SetHDT(NMEA0183Msg,Heading)){ + if (NMEA0183SetHDT(NMEA0183Msg,Heading,talkerId)){ SendMessage(NMEA0183Msg); } } @@ -160,13 +162,13 @@ private: updateDouble(boatData->Heading,Heading); if (!N2kIsNA(MagneticHeading)){ if (NMEA0183SetHDG(NMEA0183Msg, MagneticHeading,_Deviation, - Variation)) + Variation,talkerId)) { SendMessage(NMEA0183Msg); } } if (!N2kIsNA(Heading)){ - if (NMEA0183SetHDT(NMEA0183Msg, Heading)) + if (NMEA0183SetHDT(NMEA0183Msg, Heading,talkerId)) { SendMessage(NMEA0183Msg); } @@ -203,7 +205,7 @@ private: updateDouble(boatData->STW, WaterReferenced); unsigned long now = millis(); double MagneticHeading = (boatData->Heading->isValid(now) && boatData->Variation->isValid(now)) ? boatData->Heading->getData() + boatData->Variation->getData() : NMEA0183DoubleNA; - if (NMEA0183SetVHW(NMEA0183Msg, boatData->Heading->getData(), MagneticHeading, WaterReferenced)) + if (NMEA0183SetVHW(NMEA0183Msg, boatData->Heading->getData(), MagneticHeading, WaterReferenced,talkerId)) { SendMessage(NMEA0183Msg); } @@ -224,11 +226,11 @@ private: WaterDepth = DepthBelowTransducer + Offset; updateDouble(boatData->WaterDepth, WaterDepth); tNMEA0183Msg NMEA0183Msg; - if (NMEA0183SetDPT(NMEA0183Msg, DepthBelowTransducer, Offset)) + if (NMEA0183SetDPT(NMEA0183Msg, DepthBelowTransducer, Offset,talkerId)) { SendMessage(NMEA0183Msg); } - if (NMEA0183SetDBx(NMEA0183Msg, DepthBelowTransducer, Offset)) + if (NMEA0183SetDBx(NMEA0183Msg, DepthBelowTransducer, Offset,talkerId)) { SendMessage(NMEA0183Msg); } @@ -269,7 +271,7 @@ private: updateDouble(boatData->COG, COG); } } - if (NMEA0183SetVTG(NMEA0183Msg, COG, MCOG, SOG)) + if (NMEA0183SetVTG(NMEA0183Msg, COG, MCOG, SOG,talkerId)) { SendMessage(NMEA0183Msg); } @@ -354,12 +356,12 @@ private: if (NMEA0183SetMWV(NMEA0183Msg, formatCourse(boatData->TWD->getData()), NMEA0183Reference, - boatData->TWS->getDataWithDefault(NMEA0183DoubleNA))) + boatData->TWS->getDataWithDefault(NMEA0183DoubleNA),talkerId)) SendMessage(NMEA0183Msg); double magnetic = boatData->TWD->getData(); if (boatData->Variation->isValid()) magnetic -= boatData->Variation->getData(); - if (!NMEA0183Msg.Init("MWD", "GP")) + if (!NMEA0183Msg.Init("MWD", talkerId)) return; if (!NMEA0183Msg.AddDoubleField(formatCourse(boatData->TWD->getData()))) return; @@ -400,7 +402,8 @@ private: boatData->COG->getDataWithDefault(NMEA0183DoubleNA), boatData->SOG->getDataWithDefault(NMEA0183DoubleNA), boatData->DaysSince1970->getDataWithDefault(NMEA0183UInt32NA), - boatData->Variation->getDataWithDefault(NMEA0183DoubleNA))) + boatData->Variation->getDataWithDefault(NMEA0183DoubleNA), + talkerId)) { SendMessage(NMEA0183Msg); } @@ -424,7 +427,7 @@ private: boatData->DaysSince1970->update(DaysSince1970,sourceId); tNMEA0183Msg NMEA0183Msg; - if (!NMEA0183Msg.Init("VLW", "GP")) + if (!NMEA0183Msg.Init("VLW", talkerId)) return; if (!NMEA0183Msg.AddDoubleField(Log / 1852.0)) return; @@ -457,7 +460,7 @@ private: tNMEA0183Msg NMEA0183Msg; - if (!NMEA0183Msg.Init("RSA", "GP")) + if (!NMEA0183Msg.Init("RSA", talkerId)) return; if (!NMEA0183Msg.AddDoubleField(formatCourse(RudderPosition))) return; @@ -486,7 +489,7 @@ private: updateDouble(boatData->WaterTemperature, WaterTemperature); tNMEA0183Msg NMEA0183Msg; - if (!NMEA0183Msg.Init("MTW", "GP")) + if (!NMEA0183Msg.Init("MTW", talkerId)) return; if (!NMEA0183Msg.AddDoubleField(KelvinToC(WaterTemperature))) return; @@ -886,8 +889,10 @@ private: } public: - N2kToNMEA0183Functions(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000, tSendNMEA0183MessageCallback callback, int sourceId) - : N2kDataToNMEA0183(logger, boatData, NMEA2000, callback,sourceId) + N2kToNMEA0183Functions(GwLog *logger, GwBoatData *boatData, + tNMEA2000 *NMEA2000, tSendNMEA0183MessageCallback callback, int sourceId, + String talkerId) + : N2kDataToNMEA0183(logger, boatData, NMEA2000, callback,sourceId,talkerId) { LastPosSend = 0; lastLoopTime = 0; @@ -910,8 +915,8 @@ private: N2kDataToNMEA0183* N2kDataToNMEA0183::create(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000, - tSendNMEA0183MessageCallback callback, int sourceId){ + tSendNMEA0183MessageCallback callback, int sourceId,String talkerId){ LOG_DEBUG(GwLog::LOG,"creating N2kToNMEA0183"); - return new N2kToNMEA0183Functions(logger,boatData,NMEA2000,callback, sourceId); + return new N2kToNMEA0183Functions(logger,boatData,NMEA2000,callback, sourceId,talkerId); } //***************************************************************************** diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.h b/lib/nmea2kto0183/N2kDataToNMEA0183.h index 339d32a..4ece985 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.h +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.h @@ -39,12 +39,13 @@ protected: GwLog *logger; GwBoatData *boatData; int sourceId; + char talkerId[3]; tSendNMEA0183MessageCallback SendNMEA0183MessageCallback; void SendMessage(const tNMEA0183Msg &NMEA0183Msg); - N2kDataToNMEA0183(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000, tSendNMEA0183MessageCallback callback, int sourceId); + N2kDataToNMEA0183(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000, tSendNMEA0183MessageCallback callback, int sourceId,String talkerId); public: - static N2kDataToNMEA0183* create(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000, tSendNMEA0183MessageCallback callback, int sourceId); + static N2kDataToNMEA0183* create(GwLog *logger, GwBoatData *boatData, tNMEA2000 *NMEA2000, tSendNMEA0183MessageCallback callback, int sourceId,String talkerId); virtual void HandleMsg(const tN2kMsg &N2kMsg) = 0; virtual void loop(); virtual ~N2kDataToNMEA0183(){} diff --git a/src/main.cpp b/src/main.cpp index 821c49f..a4c7de1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,7 +12,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#define VERSION "0.5.2" +#define VERSION "0.5.4" // #define GW_MESSAGE_DEBUG_ENABLED // #define FALLBACK_SERIAL @@ -388,7 +388,7 @@ void setup() { webserver.begin(); nmea0183Converter= N2kDataToNMEA0183::create(&logger, &boatData,&NMEA2000, - SendNMEA0183Message, N2K_CHANNEL_ID); + SendNMEA0183Message, N2K_CHANNEL_ID,config.getString(config.talkerId,String("GP"))); toN2KConverter= NMEA0183DataToN2K::create(&logger,&boatData,[](const tN2kMsg &msg)->bool{ logger.logDebug(GwLog::DEBUG+2,"send N2K %ld",msg.PGN); diff --git a/web/config.json b/web/config.json index 5b24802..588c62f 100644 --- a/web/config.json +++ b/web/config.json @@ -7,6 +7,14 @@ "check": "checkSystemName", "description": "system name, used for the access point and for services" }, + { + "name":"talkerId", + "label":"NMEA0183 ID", + "type":"list", + "default":"GP", + "list":["AB","AD","AG","AP","AI","AN","AR","AS","AT","AX","BI","BN","CA","CD","CR","CS","CT","CV","CX","DF","DU","DP","EC","EI","EP","ER","FD","FE","FR","FS","GA","GB","GI","GL","GN","GP","GQ","HC","HE","HF","HN","HD","HS","II","IN","JA","JB","JC","JD","JE","JF","JG","JH","LC","NL","NV","RA","RB","RC","RI","SA","SC","SD","SG","SN","SS","TC","TI","UP","VD","VM","VW","VA","VS","VT","VR","WD","WI","WL","YX","ZA","ZC","ZQ","ZV"], + "description":"the talkerId used in generated NMEA0183 records" + }, { "name": "usbBaud", "label": "USB baud rate",