prepare message for AIS

This commit is contained in:
andreas 2021-11-01 11:19:46 +01:00
parent a57d91c63d
commit 8d1895ad3a
2 changed files with 35 additions and 11 deletions

View File

@ -3,6 +3,7 @@
#include "N2kMessages.h" #include "N2kMessages.h"
#include "ConverterList.h" #include "ConverterList.h"
#include <map> #include <map>
#include <strings.h>
NMEA0183DataToN2K::NMEA0183DataToN2K(GwLog *logger, GwBoatData *boatData,N2kSender callback) NMEA0183DataToN2K::NMEA0183DataToN2K(GwLog *logger, GwBoatData *boatData,N2kSender callback)
{ {
this->sender = callback; this->sender = callback;
@ -16,11 +17,29 @@ bool NMEA0183DataToN2K::parseAndSend(const char *buffer, int sourceId) {
return false; return false;
} }
class SNMEA0183Msg { class SNMEA0183Msg : public tNMEA0183Msg{
public: public:
int sourceId; int sourceId;
const char *line; const char *line;
tNMEA0183Msg msg; bool isAis=false;
SNMEA0183Msg(const char *line, int sourceId){
this->sourceId=sourceId;
this->line=line;
int len=strlen(line);
if (len >6){
if (strncasecmp(line,"!AIVDM",6) == 0
||
strncasecmp(line,"!AIVDO",6) == 0
) isAis=true;
}
}
String getKey(){
if (!isAis) return MessageCode();
char buf[6];
strncpy(buf,line+1,5);
return String(buf);
}
}; };
class NMEA0183DataToN2KFunctions : public NMEA0183DataToN2K class NMEA0183DataToN2KFunctions : public NMEA0183DataToN2K
{ {
@ -74,7 +93,7 @@ private:
unsigned long DaysSince1970=0; unsigned long DaysSince1970=0;
time_t DateTime; time_t DateTime;
char status; char status;
if (!NMEA0183ParseRMC_nc(msg.msg, SecondsSinceMidnight, status, Latitude, Longitude, COG, SOG, DaysSince1970, Variation, &DateTime)) if (!NMEA0183ParseRMC_nc(msg, SecondsSinceMidnight, status, Latitude, Longitude, COG, SOG, DaysSince1970, Variation, &DateTime))
{ {
logger->logDebug(GwLog::DEBUG, "failed to parse RMC %s", msg.line); logger->logDebug(GwLog::DEBUG, "failed to parse RMC %s", msg.line);
return; return;
@ -120,15 +139,15 @@ public:
virtual bool parseAndSend(const char *buffer, int sourceId) virtual bool parseAndSend(const char *buffer, int sourceId)
{ {
LOG_DEBUG(GwLog::DEBUG + 1, "NMEA0183DataToN2K[%d] parsing %s", sourceId, buffer) LOG_DEBUG(GwLog::DEBUG + 1, "NMEA0183DataToN2K[%d] parsing %s", sourceId, buffer)
SNMEA0183Msg msg; SNMEA0183Msg msg(buffer,sourceId);
msg.sourceId=sourceId; if (! msg.isAis){
msg.line=buffer; if (!msg.SetMessage(buffer))
if (!msg.msg.SetMessage(buffer)) {
{ LOG_DEBUG(GwLog::DEBUG, "NMEA0183DataToN2K[%d] invalid message %s", sourceId, buffer)
LOG_DEBUG(GwLog::DEBUG, "NMEA0183DataToN2K[%d] invalid message %s", sourceId, buffer) return false;
return false; }
} }
String code = msg.msg.MessageCode(); String code = msg.getKey();
bool rt = converters.handleMessage(code, msg, this); bool rt = converters.handleMessage(code, msg, this);
if (!rt) if (!rt)
{ {
@ -145,6 +164,10 @@ public:
return converters.handledPgns(); return converters.handledPgns();
} }
virtual int numConverters(){
return converters.numConverters();
}
NMEA0183DataToN2KFunctions(GwLog *logger, GwBoatData *boatData, N2kSender callback) NMEA0183DataToN2KFunctions(GwLog *logger, GwBoatData *boatData, N2kSender callback)
: NMEA0183DataToN2K(logger, boatData, callback) : NMEA0183DataToN2K(logger, boatData, callback)
{ {

View File

@ -15,6 +15,7 @@ class NMEA0183DataToN2K{
NMEA0183DataToN2K(GwLog *logger,GwBoatData *boatData,N2kSender callback); NMEA0183DataToN2K(GwLog *logger,GwBoatData *boatData,N2kSender callback);
virtual bool parseAndSend(const char *buffer, int sourceId); virtual bool parseAndSend(const char *buffer, int sourceId);
virtual unsigned long *handledPgns()=0; virtual unsigned long *handledPgns()=0;
virtual int numConverters()=0;
static NMEA0183DataToN2K* create(GwLog *logger,GwBoatData *boatData,N2kSender callback); static NMEA0183DataToN2K* create(GwLog *logger,GwBoatData *boatData,N2kSender callback);
}; };
#endif #endif