/// <summary>
 ///
 /// </summary>
 private void MessageParser()
 {
     foreach (byte receiverByte in ReadReceiver(MininumMessageSize))
     {
         if (_ubxState != UBXState.Start)
         {
             ParseUBX(receiverByte);
         }
         else if (receiverByte == 0xB5)
         {
             _ubxState = UBXState.Start;
             ParseUBX(receiverByte);
         }
         else if (_nmeaState != NMEAState.Start)
         {
             ParseNMEA(receiverByte);
         }
         else if (receiverByte == '$')
         {
             _nmeaState = NMEAState.Start;
             ParseNMEA(receiverByte);
         }
         else
         {
             // Delay if bytes (0xFF) are being disguarded
             Task.Delay(PollingDelay);
         }
     }
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="receiverByte"></param>
        private void ParseUBX(byte receiverByte)
        {
            switch (_ubxState)
            {
            case UBXState.Start:
                _parserMessage.SetLength(0);
                _ubxCrcA  = 0x00;
                _ubxCrcB  = 0x00;
                _ubxState = UBXState.Sync2;
                break;

            case UBXState.Sync2:
                if (receiverByte == 0x62)
                {
                    _ubxState = UBXState.Class;
                }
                else
                {
                    Debug.WriteLine("UBX Message Resetting: Sync2 failed");
                    _ubxState = UBXState.Start;
                    return;
                }
                break;

            case UBXState.Class:
                _ubxCrcA += receiverByte;
                _ubxCrcB += _ubxCrcA;
                _ubxState = UBXState.ID;
                break;

            case UBXState.ID:
                _ubxCrcA += receiverByte;
                _ubxCrcB += _ubxCrcA;
                _ubxState = UBXState.Length1;
                break;

            case UBXState.Length1:
                _ubxCrcA  += receiverByte;
                _ubxCrcB  += _ubxCrcA;
                _ubxLength = receiverByte;
                _ubxState  = UBXState.Length2;
                break;

            case UBXState.Length2:
                _ubxCrcA   += receiverByte;
                _ubxCrcB   += _ubxCrcA;
                _ubxLength += (ushort)(receiverByte << 8);
                _ubxState   = UBXState.Payload;
                break;

            case UBXState.Payload:
                _ubxCrcA += receiverByte;
                _ubxCrcB += _ubxCrcA;
                if (_ubxLength + 5 == _parserMessage.Position)
                {
                    _ubxState = UBXState.ChecksumA;
                }
                if (_parserMessage.Position >= 1022)
                {
                    Debug.WriteLine("UBX Message Resetting: Payload is too large");
                    _ubxState = UBXState.Start;
                    return;
                }
                break;

            case UBXState.ChecksumA:
                if (_ubxCrcA == receiverByte)
                {
                    _ubxState = UBXState.ChecksumB;
                }
                else
                {
                    Debug.WriteLine("UBX Message Resetting: Checksum A failed");
                    _ubxState = UBXState.Start;
                    return;
                }
                break;

            case UBXState.ChecksumB:
                if (_ubxCrcB == receiverByte)
                {
                    _ubxState = UBXState.End;
                }
                else
                {
                    Debug.WriteLine("UBX Message Resetting: Checksum B failed");
                    _ubxState = UBXState.Start;
                    return;
                }
                break;
            }

            _parserMessage.WriteByte(receiverByte);

            if (_ubxState == UBXState.End)
            {
                // Sending the received message after getting the last checksum

                byte[]         message       = _parserMessage.ToArray();
                IMessageResult messageObject = _messageFactory.Invoke(message);

                messageObject.TryParse(message);

                MessageReceived?.Invoke(this, new MessageReceivedEventArgs(message, messageObject, MessageProtocol.UBX));
                _ubxState = UBXState.Start;
            }
        }