Merge remote-tracking branch 'upstream/master'
This commit is contained in:
		
						commit
						8b49db33f2
					
				| 
						 | 
					@ -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;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@
 | 
				
			||||||
#include <strings.h>
 | 
					#include <strings.h>
 | 
				
			||||||
#include "NMEA0183AIStoNMEA2000.h"
 | 
					#include "NMEA0183AIStoNMEA2000.h"
 | 
				
			||||||
#include "GwXDRMappings.h"
 | 
					#include "GwXDRMappings.h"
 | 
				
			||||||
 | 
					#include "GwNmea0183Msg.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const double mToFathoms=0.546806649;
 | 
					static const double mToFathoms=0.546806649;
 | 
				
			||||||
static const double mToFeet=3.2808398950131;
 | 
					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
 | 
					class NMEA0183DataToN2KFunctions : public NMEA0183DataToN2K
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue