From 71f0bfa6f3599a09483d2cc9d96e9c99f571ca6f Mon Sep 17 00:00:00 2001 From: andreas Date: Sat, 2 Mar 2024 19:59:00 +0100 Subject: [PATCH] allow to convert 2 rudder instances --- lib/boatData/GwBoatData.h | 3 +- lib/nmea2kto0183/N2kDataToNMEA0183.cpp | 45 +++++++++++++++----------- lib/nmea2kto0183/N2kDataToNMEA0183.h | 10 ++++-- lib/spitask/GWDMS22B.cpp | 5 ++- lib/spitask/GwSpiSensor.h | 1 + lib/spitask/config.json | 15 +++++++-- src/main.cpp | 7 ++-- web/config.json | 22 +++++++++++++ 8 files changed, 82 insertions(+), 26 deletions(-) diff --git a/lib/boatData/GwBoatData.h b/lib/boatData/GwBoatData.h index 67052dc..6d3ab19 100644 --- a/lib/boatData/GwBoatData.h +++ b/lib/boatData/GwBoatData.h @@ -192,7 +192,8 @@ class GwBoatData{ GWBOATDATA(double,HDOP,4000,formatDop) GWBOATDATA(double,PDOP,4000,formatDop) GWBOATDATA(double,VDOP,4000,formatDop) - GWBOATDATA(double,RPOS,4000,formatCourse) //RudderPosition + GWBOATDATA(double,RPOS,4000,formatWind) //RudderPosition + GWBOATDATA(double,PRPOS,4000,formatWind) //second rudder pos GWBOATDATA(double,LAT,4000,formatLatitude) GWBOATDATA(double,LON,4000,formatLongitude) GWBOATDATA(double,ALT,4000,formatFixed0) //altitude diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp index 1f490df..e8b150f 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.cpp +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.cpp @@ -62,7 +62,6 @@ class N2kToNMEA0183Functions : public N2kDataToNMEA0183 { private: - int minXdrInterval=100; //minimal interval between 2 sends of the same transducer GwXDRMappings *xdrMappings; ConverterList converters; std::map lastSendTransducers; @@ -75,7 +74,7 @@ private: auto it=lastSendTransducers.find(entry.transducer); unsigned long now=millis(); if (it != lastSendTransducers.end()){ - if ((it->second + minXdrInterval) > now) return false; + if ((it->second + config.minXdrInterval) > now) return false; } lastSendTransducers[entry.transducer]=now; if (! xdrOpened){ @@ -611,24 +610,34 @@ private: if (ParseN2kRudder(N2kMsg, RudderPosition, Instance, RudderDirectionOrder, AngleOrder)) { - - updateDouble(boatData->RPOS, RudderPosition); - if (Instance != 0) + bool main=false; + if (Instance == config.starboardRudderInstance){ + updateDouble(boatData->RPOS, RudderPosition); + main=true; + } + else if (Instance == config.portRudderInstance){ + updateDouble(boatData->PRPOS, RudderPosition); + } + else{ return; + } tNMEA0183Msg NMEA0183Msg; if (!NMEA0183Msg.Init("RSA", talkerId)) return; - if (!NMEA0183Msg.AddDoubleField(formatCourse(RudderPosition))) - return; - if (!NMEA0183Msg.AddStrField("A")) - return; - if (!NMEA0183Msg.AddDoubleField(0.0)) - return; - if (!NMEA0183Msg.AddStrField("A")) - return; - + if (main){ + if (!NMEA0183Msg.AddDoubleField(formatWind(RudderPosition)))return; + if (!NMEA0183Msg.AddStrField("A"))return; + if (!NMEA0183Msg.AddDoubleField(0.0))return; + if (!NMEA0183Msg.AddStrField("V"))return; + } + else{ + if (!NMEA0183Msg.AddDoubleField(0.0))return; + if (!NMEA0183Msg.AddStrField("V"))return; + if (!NMEA0183Msg.AddDoubleField(formatWind(RudderPosition)))return; + if (!NMEA0183Msg.AddStrField("A"))return; + } SendMessage(NMEA0183Msg); } } @@ -1508,7 +1517,7 @@ private: public: N2kToNMEA0183Functions(GwLog *logger, GwBoatData *boatData, SendNMEA0183MessageCallback callback, - String talkerId, GwXDRMappings *xdrMappings, int minXdrInterval) + String talkerId, GwXDRMappings *xdrMappings, const Config &cfg) : N2kDataToNMEA0183(logger, boatData, callback,talkerId) { LastPosSend = 0; @@ -1518,7 +1527,7 @@ private: this->logger = logger; this->boatData = boatData; this->xdrMappings=xdrMappings; - this->minXdrInterval=minXdrInterval; + this->config=cfg; registerConverters(); } virtual void loop() @@ -1535,8 +1544,8 @@ private: N2kDataToNMEA0183* N2kDataToNMEA0183::create(GwLog *logger, GwBoatData *boatData, SendNMEA0183MessageCallback callback, String talkerId, GwXDRMappings *xdrMappings, - int minXdrInterval){ + const N2kDataToNMEA0183::Config &cfg){ LOG_DEBUG(GwLog::LOG,"creating N2kToNMEA0183"); - return new N2kToNMEA0183Functions(logger,boatData,callback, talkerId,xdrMappings,minXdrInterval); + return new N2kToNMEA0183Functions(logger,boatData,callback, talkerId,xdrMappings,cfg); } //***************************************************************************** diff --git a/lib/nmea2kto0183/N2kDataToNMEA0183.h b/lib/nmea2kto0183/N2kDataToNMEA0183.h index a317cdd..ec37429 100644 --- a/lib/nmea2kto0183/N2kDataToNMEA0183.h +++ b/lib/nmea2kto0183/N2kDataToNMEA0183.h @@ -36,8 +36,14 @@ class N2kDataToNMEA0183 { public: typedef std::function SendNMEA0183MessageCallback; - + class Config{ + public: + int minXdrInterval=100; + int starboardRudderInstance=0; + int portRudderInstance=-1; //ignore + }; protected: + Config config; GwLog *logger; GwBoatData *boatData; int sourceId=0; @@ -49,7 +55,7 @@ protected: public: static N2kDataToNMEA0183* create(GwLog *logger, GwBoatData *boatData, SendNMEA0183MessageCallback callback, - String talkerId, GwXDRMappings *xdrMappings,int minXdrInterval=100); + String talkerId, GwXDRMappings *xdrMappings,const Config &cfg); virtual void HandleMsg(const tN2kMsg &N2kMsg, int sourceId) = 0; virtual void loop(); virtual ~N2kDataToNMEA0183(){} diff --git a/lib/spitask/GWDMS22B.cpp b/lib/spitask/GWDMS22B.cpp index 51ad88c..2327415 100644 --- a/lib/spitask/GWDMS22B.cpp +++ b/lib/spitask/GWDMS22B.cpp @@ -89,6 +89,7 @@ class GWDMS22B : public SSISensor{ int zero=2047; + bool invt=false; public: using SSISensor::SSISensor; virtual bool preinit(GwApi * api){ @@ -105,7 +106,8 @@ class GWDMS22B : public SSISensor{ LOG_DEBUG(GwLog::ERROR,"unable to measure %s: %d",prefix.c_str(),(int)res); } double resolved=(((int)value-zero)*360.0/mask); - LOG_DEBUG(GwLog::LOG,"measure %s : %d, resolved: %f",prefix.c_str(),value,(float)resolved); + if (invt) resolved=-resolved; + LOG_DEBUG(GwLog::DEBUG,"measure %s : %d, resolved: %f",prefix.c_str(),value,(float)resolved); tN2kMsg msg; SetN2kRudder(msg,DegToRad(resolved),iid); api->sendN2kMessage(msg); @@ -116,6 +118,7 @@ class GWDMS22B : public SSISensor{ CFG_GET(iid,PRFX); \ CFG_GET(fintv,PRFX); \ CFG_GET(zero,PRFX); \ + CFG_GET(invt,PRFX); \ bits=12; \ clock=500000; \ cs=GW ## PRFX ## _CS; \ diff --git a/lib/spitask/GwSpiSensor.h b/lib/spitask/GwSpiSensor.h index 3b42594..48e4a78 100644 --- a/lib/spitask/GwSpiSensor.h +++ b/lib/spitask/GwSpiSensor.h @@ -12,6 +12,7 @@ License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +//for SSI refer to https://www.posital.com/media/posital_media/documents/AbsoluteEncoders_Context_Technology_SSI_AppNote.pdf #ifndef _GWSPISENSOR_H #define _GWSPISENSOR_H #include diff --git a/lib/spitask/config.json b/lib/spitask/config.json index 8827fca..3beabeb 100644 --- a/lib/spitask/config.json +++ b/lib/spitask/config.json @@ -6,12 +6,12 @@ { "b": "1", "i": "11", - "n": "11" + "n": "0" }, { "b": "1", "i": "12", - "n": "12" + "n": "1" }, { "b": "1", @@ -86,6 +86,17 @@ "capabilities": { "DMS22B$i": "true" } + }, + { + "name": "DMS22B$iinvt", + "label": "DMS22BX$i invert", + "type": "boolean", + "default": "false", + "description": "Invert the direction of the $i. SSI DMS22B rotary encoder (bus $b)", + "category": "spisensors$b", + "capabilities": { + "DMS22B$i": "true" + } } ] } diff --git a/src/main.cpp b/src/main.cpp index 0c33a9a..30026c0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -808,7 +808,10 @@ void setup() { webserver.begin(); xdrMappings.begin(); logger.flush(); - + N2kDataToNMEA0183::Config n2kTo183cfg; + n2kTo183cfg.minXdrInterval=config.getInt(config.minXdrInterval,100); + n2kTo183cfg.starboardRudderInstance=config.getInt(config.stbRudderI,0); + n2kTo183cfg.portRudderInstance=config.getInt(config.portRudderI,-1); nmea0183Converter= N2kDataToNMEA0183::create(&logger, &boatData, [](const tNMEA0183Msg &msg, int sourceId){ SendNMEA0183Message(msg,sourceId,false); @@ -816,7 +819,7 @@ void setup() { , config.getString(config.talkerId,String("GP")), &xdrMappings, - config.getInt(config.minXdrInterval,100) + n2kTo183cfg ); toN2KConverter= NMEA0183DataToN2K::create(&logger,&boatData,[](const tN2kMsg &msg, int sourceId)->bool{ diff --git a/web/config.json b/web/config.json index 8ad556f..2b74c0d 100644 --- a/web/config.json +++ b/web/config.json @@ -210,6 +210,28 @@ "description":"send out the converted data on the NMEA2000 bus\nIf set to off the converted data will still be shown at the data tab.", "category":"converter" }, + { + "name": "stbRudderI", + "label":"stb rudder instance", + "type": "number", + "default": "0", + "check": "checkMinMax", + "min": 0, + "max": 253, + "description": "the n2k instance to be used as starboard(main) rudder 0...253", + "category": "converter" + }, + { + "name": "portRudderI", + "label":"port rudder instance", + "type": "number", + "default": "-1", + "check": "checkMinMax", + "min": -1, + "max": 253, + "description": "the n2k instance to be used as port rudder 0...253, -1 to disable", + "category": "converter" + }, { "name": "usbActisense", "label": "USB mode",