void processRemoteCommandByte(byte b) { switch (remoteCommandState) { case RemoteCommandReceiveState.awaitingStartState: if (b == 0xff) { remoteCommandState = RemoteCommandReceiveState.awaitingLengthState; } break; case RemoteCommandReceiveState.awaitingLengthState: if (b > buffer.Length) { remoteCommandState = RemoteCommandReceiveState.awaitingStartState; } else { commandPos = 0; commandSize = b; remoteCommandState = RemoteCommandReceiveState.bufferingCharsState; } break; case RemoteCommandReceiveState.bufferingCharsState: if (b == 0xFF) { remoteCommandState = RemoteCommandReceiveState.awaitingLengthState; break; } if (b == 0xFE) { // start of an escape sequence remoteCommandState = RemoteCommandReceiveState.awaitingEscapeChar; break; } // Add the character to the buffer // Process the command if at the end bufferByte(b); break; case RemoteCommandReceiveState.awaitingEscapeChar: if (b == 1) { bufferByte(0xFE); remoteCommandState = RemoteCommandReceiveState.bufferingCharsState; } else if (b == 2) { bufferByte(0xFF); remoteCommandState = RemoteCommandReceiveState.bufferingCharsState; } else { resetRemoteCommandReceiver(); } break; } }
void bufferByte(byte b) { buffer[commandPos] = b; commandPos++; if (commandPos == commandSize) { byte check = 0; for (byte i = 0; i < commandSize - 1; i++) { check += buffer[i]; } if (check != buffer[commandSize - 1]) { return; } sendBuffer(); remoteCommandState = RemoteCommandReceiveState.awaitingStartState; } }
void resetRemoteCommandReceiver() { remoteCommandState = RemoteCommandReceiveState.awaitingStartState; }