1
0
mirror of https://github.com/thooge/esp32-nmea2000-obp60.git synced 2025-12-14 06:23:07 +01:00

allow to configure sendRMC

This commit is contained in:
andreas
2024-03-03 18:37:38 +01:00
parent e10432dae4
commit 47a2eb52f5
7 changed files with 206 additions and 145 deletions

View File

@@ -43,7 +43,7 @@ N2kDataToNMEA0183::N2kDataToNMEA0183(GwLog * logger, GwBoatData *boatData,
//*****************************************************************************
void N2kDataToNMEA0183::loop() {
void N2kDataToNMEA0183::loop(unsigned long) {
}
//*****************************************************************************
@@ -65,10 +65,10 @@ private:
GwXDRMappings *xdrMappings;
ConverterList<N2kToNMEA0183Functions,tN2kMsg> converters;
std::map<String,unsigned long> lastSendTransducers;
static const unsigned long RMCPeriod = 500;
tNMEA0183Msg xdrMessage;
bool xdrOpened=false;
int xdrCount=0;
unsigned long lastRmcSent=0;
bool addToXdr(GwXDRFoundMapping::XdrEntry entry){
auto it=lastSendTransducers.find(entry.transducer);
@@ -133,9 +133,6 @@ private:
return boatData->update((double)value,sourceId,mapping);
}
unsigned long LastPosSend;
unsigned long NextRMCSend;
unsigned long lastLoopTime;
virtual unsigned long *handledPgns()
{
@@ -165,7 +162,6 @@ private:
{
return converters.numConverters();
}
void SetNextRMCSend() { NextRMCSend = millis() + RMCPeriod; }
//*************** the converters ***********************
void HandleHeading(const tN2kMsg &N2kMsg)
@@ -545,11 +541,9 @@ private:
void SendRMC()
{
long now = millis();
if (NextRMCSend <= millis() &&
boatData->LAT->isValid(now) &&
boatData->LAT->getLastSource() == sourceId
)
if (boatData->LAT->isValid(now) && boatData->LON->isValid(now))
{
lastRmcSent=now;
tNMEA0183Msg NMEA0183Msg;
if (NMEA0183SetRMC(NMEA0183Msg,
@@ -564,7 +558,6 @@ private:
{
SendMessage(NMEA0183Msg);
}
SetNextRMCSend();
}
}
@@ -610,10 +603,8 @@ private:
if (ParseN2kRudder(N2kMsg, RudderPosition, Instance, RudderDirectionOrder, AngleOrder))
{
bool main=false;
if (Instance == config.starboardRudderInstance){
updateDouble(boatData->RPOS, RudderPosition);
main=true;
}
else if (Instance == config.portRudderInstance){
updateDouble(boatData->PRPOS, RudderPosition);
@@ -626,18 +617,24 @@ private:
if (!NMEA0183Msg.Init("RSA", talkerId))
return;
if (main){
if (!NMEA0183Msg.AddDoubleField(formatWind(RudderPosition)))return;
auto rpos=boatData->RPOS;
if (rpos->isValid()){
if (!NMEA0183Msg.AddDoubleField(formatWind(rpos->getData())))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;
}
auto prpos=boatData->PRPOS;
if (prpos->isValid()){
if (!NMEA0183Msg.AddDoubleField(formatWind(prpos->getData())))return;
if (!NMEA0183Msg.AddStrField("A"))return;
}
else{
if (!NMEA0183Msg.AddDoubleField(0.0))return;
if (!NMEA0183Msg.AddStrField("V"))return;
}
SendMessage(NMEA0183Msg);
}
}
@@ -1517,34 +1514,29 @@ private:
public:
N2kToNMEA0183Functions(GwLog *logger, GwBoatData *boatData,
SendNMEA0183MessageCallback callback,
String talkerId, GwXDRMappings *xdrMappings, const Config &cfg)
String talkerId, GwXDRMappings *xdrMappings, const GwConverterConfig &cfg)
: N2kDataToNMEA0183(logger, boatData, callback,talkerId)
{
LastPosSend = 0;
lastLoopTime = 0;
NextRMCSend = millis() + RMCPeriod;
this->logger = logger;
this->boatData = boatData;
this->xdrMappings=xdrMappings;
this->config=cfg;
registerConverters();
}
virtual void loop()
virtual void loop(unsigned long lastExtRmc) override
{
N2kDataToNMEA0183::loop();
N2kDataToNMEA0183::loop(lastExtRmc);
unsigned long now = millis();
if (now < (lastLoopTime + 100))
return;
lastLoopTime = now;
SendRMC();
if (config.rmcInterval > 0 && (lastExtRmc + config.rmcCheckTime) <= now && (lastRmcSent + config.rmcInterval) <= now){
SendRMC();
}
}
};
N2kDataToNMEA0183* N2kDataToNMEA0183::create(GwLog *logger, GwBoatData *boatData,
SendNMEA0183MessageCallback callback, String talkerId, GwXDRMappings *xdrMappings,
const N2kDataToNMEA0183::Config &cfg){
const GwConverterConfig &cfg){
LOG_DEBUG(GwLog::LOG,"creating N2kToNMEA0183");
return new N2kToNMEA0183Functions(logger,boatData,callback, talkerId,xdrMappings,cfg);
}

View File

@@ -26,9 +26,10 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <NMEA0183.h>
#include <NMEA2000.h>
#include <GwLog.h>
#include <GwBoatData.h>
#include <GwXDRMappings.h>
#include "GwLog.h"
#include "GwBoatData.h"
#include "GwXDRMappings.h"
#include "GwConverterConfig.h"
//------------------------------------------------------------------------------
class GwJsonDocument;
@@ -36,14 +37,8 @@ class N2kDataToNMEA0183
{
public:
typedef std::function<void(const tNMEA0183Msg &NMEA0183Msg,int id)> SendNMEA0183MessageCallback;
class Config{
public:
int minXdrInterval=100;
int starboardRudderInstance=0;
int portRudderInstance=-1; //ignore
};
protected:
Config config;
GwConverterConfig config;
GwLog *logger;
GwBoatData *boatData;
int sourceId=0;
@@ -55,9 +50,9 @@ protected:
public:
static N2kDataToNMEA0183* create(GwLog *logger, GwBoatData *boatData, SendNMEA0183MessageCallback callback,
String talkerId, GwXDRMappings *xdrMappings,const Config &cfg);
String talkerId, GwXDRMappings *xdrMappings,const GwConverterConfig &cfg);
virtual void HandleMsg(const tN2kMsg &N2kMsg, int sourceId) = 0;
virtual void loop();
virtual void loop(unsigned long lastRmc);
virtual ~N2kDataToNMEA0183(){}
virtual unsigned long* handledPgns()=0;
virtual int numPgns()=0;