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); }
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); }