allow receiving seasmart messages, correctly handle source for actisense and seasmart in converter

This commit is contained in:
wellenvogel 2022-01-03 18:05:14 +01:00
parent cca050eca6
commit 73eee8461e
4 changed files with 32 additions and 22 deletions

View File

@ -34,12 +34,11 @@
N2kDataToNMEA0183::N2kDataToNMEA0183(GwLog * logger, GwBoatData *boatData, N2kDataToNMEA0183::N2kDataToNMEA0183(GwLog * logger, GwBoatData *boatData,
tSendNMEA0183MessageCallback callback, int id,String talkerId) SendNMEA0183MessageCallback callback, String talkerId)
{ {
this->SendNMEA0183MessageCallback=callback; this->sendNMEA0183MessageCallback=callback;
strncpy(this->talkerId,talkerId.c_str(),2); strncpy(this->talkerId,talkerId.c_str(),2);
this->talkerId[2]=0; this->talkerId[2]=0;
sourceId=id;
} }
@ -50,7 +49,7 @@ void N2kDataToNMEA0183::loop() {
//***************************************************************************** //*****************************************************************************
void N2kDataToNMEA0183::SendMessage(const tNMEA0183Msg &NMEA0183Msg) { void N2kDataToNMEA0183::SendMessage(const tNMEA0183Msg &NMEA0183Msg) {
if ( SendNMEA0183MessageCallback != 0 ) SendNMEA0183MessageCallback(NMEA0183Msg, sourceId); sendNMEA0183MessageCallback(NMEA0183Msg, sourceId);
} }
/** /**
@ -148,8 +147,9 @@ private:
virtual String handledKeys(){ virtual String handledKeys(){
return converters.handledKeys(); return converters.handledKeys();
} }
virtual void HandleMsg(const tN2kMsg &N2kMsg) virtual void HandleMsg(const tN2kMsg &N2kMsg, int sourceId)
{ {
this->sourceId=sourceId;
String key=String(N2kMsg.PGN); String key=String(N2kMsg.PGN);
bool rt=converters.handleMessage(key,N2kMsg,this); bool rt=converters.handleMessage(key,N2kMsg,this);
if (! rt){ if (! rt){
@ -1489,9 +1489,9 @@ private:
public: public:
N2kToNMEA0183Functions(GwLog *logger, GwBoatData *boatData, N2kToNMEA0183Functions(GwLog *logger, GwBoatData *boatData,
tSendNMEA0183MessageCallback callback, int sourceId, SendNMEA0183MessageCallback callback,
String talkerId, GwXDRMappings *xdrMappings, int minXdrInterval) String talkerId, GwXDRMappings *xdrMappings, int minXdrInterval)
: N2kDataToNMEA0183(logger, boatData, callback,sourceId,talkerId) : N2kDataToNMEA0183(logger, boatData, callback,talkerId)
{ {
LastPosSend = 0; LastPosSend = 0;
lastLoopTime = 0; lastLoopTime = 0;
@ -1516,9 +1516,9 @@ private:
N2kDataToNMEA0183* N2kDataToNMEA0183::create(GwLog *logger, GwBoatData *boatData, N2kDataToNMEA0183* N2kDataToNMEA0183::create(GwLog *logger, GwBoatData *boatData,
tSendNMEA0183MessageCallback callback, int sourceId,String talkerId, GwXDRMappings *xdrMappings, SendNMEA0183MessageCallback callback, String talkerId, GwXDRMappings *xdrMappings,
int minXdrInterval){ int minXdrInterval){
LOG_DEBUG(GwLog::LOG,"creating N2kToNMEA0183"); LOG_DEBUG(GwLog::LOG,"creating N2kToNMEA0183");
return new N2kToNMEA0183Functions(logger,boatData,callback, sourceId,talkerId,xdrMappings,minXdrInterval); return new N2kToNMEA0183Functions(logger,boatData,callback, talkerId,xdrMappings,minXdrInterval);
} }
//***************************************************************************** //*****************************************************************************

View File

@ -22,6 +22,7 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
#ifndef _N2KDATATONMEA0183_H #ifndef _N2KDATATONMEA0183_H
#define _N2KDATATONMEA0183_H #define _N2KDATATONMEA0183_H
#include <functional>
#include <NMEA0183.h> #include <NMEA0183.h>
#include <NMEA2000.h> #include <NMEA2000.h>
@ -34,22 +35,22 @@ class GwJsonDocument;
class N2kDataToNMEA0183 class N2kDataToNMEA0183
{ {
public: public:
using tSendNMEA0183MessageCallback = void (*)(const tNMEA0183Msg &NMEA0183Msg, int id); typedef std::function<void(const tNMEA0183Msg &NMEA0183Msg,int id)> SendNMEA0183MessageCallback;
protected: protected:
GwLog *logger; GwLog *logger;
GwBoatData *boatData; GwBoatData *boatData;
int sourceId; int sourceId=0;
char talkerId[3]; char talkerId[3];
tSendNMEA0183MessageCallback SendNMEA0183MessageCallback; SendNMEA0183MessageCallback sendNMEA0183MessageCallback;
void SendMessage(const tNMEA0183Msg &NMEA0183Msg); void SendMessage(const tNMEA0183Msg &NMEA0183Msg);
N2kDataToNMEA0183(GwLog *logger, GwBoatData *boatData, N2kDataToNMEA0183(GwLog *logger, GwBoatData *boatData,
tSendNMEA0183MessageCallback callback, int sourceId,String talkerId); SendNMEA0183MessageCallback callback, String talkerId);
public: public:
static N2kDataToNMEA0183* create(GwLog *logger, GwBoatData *boatData, tSendNMEA0183MessageCallback callback, static N2kDataToNMEA0183* create(GwLog *logger, GwBoatData *boatData, SendNMEA0183MessageCallback callback,
int sourceId,String talkerId, GwXDRMappings *xdrMappings,int minXdrInterval=100); String talkerId, GwXDRMappings *xdrMappings,int minXdrInterval=100);
virtual void HandleMsg(const tN2kMsg &N2kMsg) = 0; virtual void HandleMsg(const tN2kMsg &N2kMsg, int sourceId) = 0;
virtual void loop(); virtual void loop();
virtual ~N2kDataToNMEA0183(){} virtual ~N2kDataToNMEA0183(){}
virtual unsigned long* handledPgns()=0; virtual unsigned long* handledPgns()=0;

View File

@ -22,7 +22,7 @@ typedef size_t (*GwBufferHandleFunction)(uint8_t *buffer, size_t len, void *para
class GwBuffer{ class GwBuffer{
public: public:
static const size_t TX_BUFFER_SIZE=1620; // app. 20 NMEA messages static const size_t TX_BUFFER_SIZE=1620; // app. 20 NMEA messages
static const size_t RX_BUFFER_SIZE=400; // enough for 1 NMEA message or actisense message static const size_t RX_BUFFER_SIZE=600; // enough for 1 NMEA message or actisense message or seasmart message
typedef enum { typedef enum {
OK, OK,
ERROR, ERROR,

View File

@ -68,7 +68,7 @@ const unsigned long HEAP_REPORT_TIME=2000; //set to 0 to disable heap reporting
#define MAX_NMEA2000_MESSAGE_SEASMART_SIZE 500 #define MAX_NMEA2000_MESSAGE_SEASMART_SIZE 500
#define MAX_NMEA0183_MESSAGE_SIZE 150 // For AIS #define MAX_NMEA0183_MESSAGE_SIZE MAX_NMEA2000_MESSAGE_SEASMART_SIZE
//https://curiouser.cheshireeng.com/2014/08/19/c-compile-time-assert/ //https://curiouser.cheshireeng.com/2014/08/19/c-compile-time-assert/
#define CASSERT(predicate, text) _impl_CASSERT_LINE(predicate,__LINE__) #define CASSERT(predicate, text) _impl_CASSERT_LINE(predicate,__LINE__)
#define _impl_PASTE(a,b) a##b #define _impl_PASTE(a,b) a##b
@ -195,7 +195,7 @@ void handleN2kMessage(const tN2kMsg &n2kMsg,int sourceId, bool isConverted=false
c->sendActisense(n2kMsg,sourceId); c->sendActisense(n2kMsg,sourceId);
}); });
if (! isConverted){ if (! isConverted){
nmea0183Converter->HandleMsg(n2kMsg); nmea0183Converter->HandleMsg(n2kMsg,sourceId);
} }
if (sourceId != N2K_CHANNEL_ID){ if (sourceId != N2K_CHANNEL_ID){
countNMEA2KOut.add(n2kMsg.PGN); countNMEA2KOut.add(n2kMsg.PGN);
@ -630,7 +630,7 @@ void setup() {
[](const tNMEA0183Msg &msg, int sourceId){ [](const tNMEA0183Msg &msg, int sourceId){
SendNMEA0183Message(msg,sourceId,false); SendNMEA0183Message(msg,sourceId,false);
} }
, N2K_CHANNEL_ID, ,
config.getString(config.talkerId,String("GP")), config.getString(config.talkerId,String("GP")),
&xdrMappings, &xdrMappings,
config.getInt(config.minXdrInterval,100) config.getInt(config.minXdrInterval,100)
@ -770,8 +770,17 @@ void loop() {
oc->loop(false,true); oc->loop(false,true);
}); });
if (c->sendToN2K()){ if (c->sendToN2K()){
if (strlen(buffer) > 6 && strncmp(buffer,"$PCDIN",6) == 0){
tN2kMsg n2kMsg;
uint32_t timestamp;
if (SeasmartToN2k(buffer,timestamp,n2kMsg)){
handleN2kMessage(n2kMsg,sourceId);
}
}
else{
toN2KConverter->parseAndSend(buffer, sourceId); toN2KConverter->parseAndSend(buffer, sourceId);
} }
}
}); });
}); });
monitor.setTime(8); monitor.setTime(8);