/// Converts a stuffed byte list (one where all 0x10 bytes are replaced with 0x10 0x10) into an unstuffed byte list.
/// </summary>
/// <param name="data">A reference to the list containing the data to be unstuffed.</param>
/// <returns>True if the unstuffing was successful, false otherwise.</returns>
private bool Unstuff(ref List<byte> data) {
List<byte> newData = new List<byte>();
bool inStuffedDLE = false;
foreach (byte b in data) {
if (b == CHAR_DLE) {
if (!inStuffedDLE) {
newData.Add(b);
inStuffedDLE = true;
} else {
// If we see a DLE after we've already seen one (inStuffedDLE == true), we don't need to add the byte to the list because we already did when the first byte was encountered
// Just set the flag to false so that if this stuffed DLE is immediately followed by another, it will be correctly parsed
inStuffedDLE = false;
}
} else {
if (inStuffedDLE) {
return false;
}
newData.Add(b);
}
}
data = newData;
return true;
}
private void ProcessPacket() {
byte id = packetBuffer[1];
// Grab only the data - not the first [DLE]<id> or the last [DLE][ETX]
List<byte> data = packetBuffer.GetRange(2, packetBuffer.Count - 4);
bool isPacketValid = Unstuff(ref data);
ThunderboltPacket packet;
if (isPacketValid) {
packet = new ThunderboltPacket(isPacketValid, id, data, packetBuffer);
} else {
packet = new ThunderboltPacket(isPacketValid, 0, new List<byte>(), new List<byte>());