Beispiel #1
0
        public Result AppendByte(byte b)
        {
            switch (state)
            {
            case State.NoPacket:
                switch (b)
                {
                case InterruptSymbol:
                    return(new Result(interrupt: true));

                case PacketStartSymbol:
                    state      = State.Data;
                    packetData = new PacketData();
                    break;
                }
                break;

            case State.Data:
                if (!escape && b == PacketStopSymbol)
                {
                    state = State.Checksum1;
                    break;
                }
                escape = !packetData.AddByte(b);
                break;

            case State.Checksum1:
                checksum[0] = b;
                state       = State.Checksum2;
                break;

            case State.Checksum2:
                checksum[1] = b;
                state       = State.NoPacket;

                var    checksumValue = (byte)Convert.ToUInt32(Encoding.ASCII.GetString(checksum), 16);
                Packet packet;
                if (!Packet.TryCreate(packetData, checksumValue, out packet))
                {
                    return(new Result(packet, corruptedPacket: true));
                }
                return(new Result(packet));
            }

            return(null);
        }
Beispiel #2
0
        public Result AppendByte(byte b)
        {
            switch (state)
            {
            case State.NoPacket:
                switch (b)
                {
                case InterruptSymbol:
                    return(new Result(interrupt: true));

                case PacketStartSymbol:
                    state = State.Data;
                    buffer.Clear();
                    break;
                }
                break;

            case State.Data:
                if (escape)
                {
                    b = (byte)(b ^ EscapeOffset);
                    buffer.Enqueue(b);
                    escape = false;
                    break;
                }

                switch (b)
                {
                case EscapeSymbol:
                    escape = true;
                    break;

                case PacketStopSymbol:
                    state = State.Checksum1;
                    break;

                default:
                    buffer.Enqueue(b);
                    break;
                }
                break;

            case State.Checksum1:
                checksum[0] = b;
                state       = State.Checksum2;
                break;

            case State.Checksum2:
                checksum[1] = b;
                state       = State.NoPacket;

                var    checksumValue = (byte)Convert.ToUInt32(Encoding.ASCII.GetString(checksum), 16);
                Packet packet;
                if (!Packet.TryCreate(buffer.ToArray(), checksumValue, out packet))
                {
                    return(new Result(packet, corruptedPacket: true));
                }
                return(new Result(packet));
            }

            return(null);
        }