esp32-nmea2000-obp60/lib/queue/obp60task/ObpNmea0183.h

55 lines
1.7 KiB
C++

#pragma once
#include "NMEA0183.h"
#include "GwNmea0183Msg.h"
class ObpNmea0183 : public tNMEA0183
{
public:
bool GetMessageCor(SNMEA0183Msg &NMEA0183Msg)
{
if (!IsOpen())
return false;
bool result = false;
while (port->available() > 0 && !result)
{
int NewByte = port->read();
if (NewByte == '$' || NewByte == '!')
{ // Message start
MsgInStarted = true;
MsgInPos = 0;
MsgInBuf[MsgInPos] = NewByte;
MsgInPos++;
}
else if (MsgInStarted)
{
MsgInBuf[MsgInPos] = NewByte;
if (NewByte == '*')
MsgCheckSumStartPos = MsgInPos;
MsgInPos++;
if (MsgCheckSumStartPos != SIZE_MAX and MsgCheckSumStartPos + 3 == MsgInPos)
{ // We have full checksum and so full message
MsgInBuf[MsgInPos] = 0; // add null termination
if (NMEA0183Msg.SetMessageCor(MsgInBuf))
{
NMEA0183Msg.SourceID = SourceID;
result = true;
}
MsgInStarted = false;
MsgInPos = 0;
MsgCheckSumStartPos = SIZE_MAX;
}
if (MsgInPos >= MAX_NMEA0183_MSG_BUF_LEN)
{ // Too may chars in message. Start from beginning
MsgInStarted = false;
MsgInPos = 0;
MsgCheckSumStartPos = SIZE_MAX;
}
}
}
return result;
}
};