From 7c321ecf83db71445b71b810ccd5ad7f81729178 Mon Sep 17 00:00:00 2001 From: andreas Date: Mon, 14 Mar 2022 11:16:35 +0100 Subject: [PATCH] externalize SNMEA0183Msg --- lib/nmea0183ton2k/GwNmea0183Msg.h | 118 ++++++++++++++++++++++++ lib/nmea0183ton2k/NMEA0183DataToN2K.cpp | 109 +--------------------- 2 files changed, 119 insertions(+), 108 deletions(-) create mode 100644 lib/nmea0183ton2k/GwNmea0183Msg.h diff --git a/lib/nmea0183ton2k/GwNmea0183Msg.h b/lib/nmea0183ton2k/GwNmea0183Msg.h new file mode 100644 index 0000000..bc60929 --- /dev/null +++ b/lib/nmea0183ton2k/GwNmea0183Msg.h @@ -0,0 +1,118 @@ +#pragma once +#include "NMEA0183Msg.h" +class SNMEA0183Msg : public tNMEA0183Msg{ + public: + int sourceId; + const char *line; + 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; + } + } + SNMEA0183Msg(){ + line=NULL; + } + String getKey(){ + if (!isAis) return MessageCode(); + if (!line) return String(" "); + char buf[6]; + strncpy(buf,line+1,5); + buf[5]=0; + return String(buf); + } + char fromHex(char v){ + if (v >= '0' && v <= '9') return v-'0'; + if (v >= 'A' && v <= 'F') return v-'A'+10; + if (v >= 'a' && v <= 'f') return v-'a'+10; + return 0; + } + bool SetMessageCor(const char *buf) + { + unsigned char csMsg; + int i = 0; + uint8_t iData = 0; + bool result = false; + + Clear(); + _MessageTime = millis(); + + if (buf[i] != '$' && buf[i] != '!') + return result; // Invalid message + Prefix = buf[i]; + i++; // Pass start prefix + + // Serial.println(buf); + // Set sender + for (; iData < 2 && buf[i] != 0; i++, iData++) + { + CheckSum ^= buf[i]; + Data[iData] = buf[i]; + } + + if (buf[i] == 0) + { + Clear(); + return result; + } // Invalid message + + Data[iData] = 0; + iData++; // null termination for sender + // Set message code. Read until next comma + for (; buf[i] != ',' && buf[i] != 0 && iData < MAX_NMEA0183_MSG_LEN; i++, iData++) + { + CheckSum ^= buf[i]; + Data[iData] = buf[i]; + } + if (buf[i] != ',') + { + Clear(); + return result; + } // No separation after message code -> invalid message + + // Set the data and calculate checksum. Read until '*' + for (; buf[i] != '*' && buf[i] != 0 && iData < MAX_NMEA0183_MSG_LEN; i++, iData++) + { + CheckSum ^= buf[i]; + Data[iData] = buf[i]; + if (buf[i] == ',') + { // New field + Data[iData] = 0; // null termination for previous field + if (_FieldCount >= MAX_NMEA0183_MSG_FIELDS){ + Clear(); + return false; + } + Fields[_FieldCount] = iData + 1; // Set start of field + _FieldCount++; + } + } + + if (buf[i] != '*') + { + Clear(); + return false; + } // No checksum -> invalid message + Data[iData] = 0; // null termination for previous field + i++; // Pass '*'; + csMsg = fromHex(buf[i])<< 4; + i++; + csMsg |= fromHex(buf[i]); + + if (csMsg == CheckSum) + { + result = true; + } + else + { + Clear(); + } + + return result; + } +}; diff --git a/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp b/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp index bff6d27..e83731f 100644 --- a/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp +++ b/lib/nmea0183ton2k/NMEA0183DataToN2K.cpp @@ -7,6 +7,7 @@ #include #include "NMEA0183AIStoNMEA2000.h" #include "GwXDRMappings.h" +#include "GwNmea0183Msg.h" static const double mToFathoms=0.546806649; static const double mToFeet=3.2808398950131; @@ -21,114 +22,6 @@ NMEA0183DataToN2K::NMEA0183DataToN2K(GwLog *logger, GwBoatData *boatData,N2kSend -class SNMEA0183Msg : public tNMEA0183Msg{ - public: - int sourceId; - const char *line; - 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); - buf[5]=0; - return String(buf); - } - char fromHex(char v){ - if (v >= '0' && v <= '9') return v-'0'; - if (v >= 'A' && v <= 'F') return v-'A'+10; - if (v >= 'a' && v <= 'f') return v-'a'+10; - return 0; - } - bool SetMessageCor(const char *buf) - { - unsigned char csMsg; - int i = 0; - uint8_t iData = 0; - bool result = false; - - Clear(); - _MessageTime = millis(); - - if (buf[i] != '$' && buf[i] != '!') - return result; // Invalid message - Prefix = buf[i]; - i++; // Pass start prefix - - // Serial.println(buf); - // Set sender - for (; iData < 2 && buf[i] != 0; i++, iData++) - { - CheckSum ^= buf[i]; - Data[iData] = buf[i]; - } - - if (buf[i] == 0) - { - Clear(); - return result; - } // Invalid message - - Data[iData] = 0; - iData++; // null termination for sender - // Set message code. Read until next comma - for (; buf[i] != ',' && buf[i] != 0 && iData < MAX_NMEA0183_MSG_LEN; i++, iData++) - { - CheckSum ^= buf[i]; - Data[iData] = buf[i]; - } - if (buf[i] != ',') - { - Clear(); - return result; - } // No separation after message code -> invalid message - - // Set the data and calculate checksum. Read until '*' - for (; buf[i] != '*' && buf[i] != 0 && iData < MAX_NMEA0183_MSG_LEN; i++, iData++) - { - CheckSum ^= buf[i]; - Data[iData] = buf[i]; - if (buf[i] == ',') - { // New field - Data[iData] = 0; // null termination for previous field - Fields[_FieldCount] = iData + 1; // Set start of field - _FieldCount++; - } - } - - if (buf[i] != '*') - { - Clear(); - return false; - } // No checksum -> invalid message - Data[iData] = 0; // null termination for previous field - i++; // Pass '*'; - csMsg = fromHex(buf[i])<< 4; - i++; - csMsg |= fromHex(buf[i]); - - if (csMsg == CheckSum) - { - result = true; - } - else - { - Clear(); - } - - return result; - } -}; class NMEA0183DataToN2KFunctions : public NMEA0183DataToN2K {