private void ProcessReceivedData() { byte command = 0; byte multiByteChannel = 0; int dataNeeded = 0; byte multiByteCommand = 0; bool parsingSysex = false; while (true) { try { if (_input.Size == 0) { _haveDataEvent.WaitOne(); } if (!_isOpen) { break; } command = 0; byte b = _input.Get(); if (parsingSysex) { if (b == (byte)CommandCode.END_SYSEX) { parsingSysex = false; ProcessSysexMessage(); } else { if (_cbInputMessage < _inputMessage.Length) { _inputMessage[_cbInputMessage++] = b; } } } else if (dataNeeded > 0 && b < 128) { _inputMessage[--dataNeeded] = b; if (dataNeeded == 0 && multiByteCommand != 0) { switch (multiByteCommand) { case (byte)CommandCode.ANALOG_MESSAGE: _dm.ProcessAnalogMessage(multiByteChannel, _inputMessage[0] << 7 | _inputMessage[1]); break; case (byte)CommandCode.DIGITAL_MESSAGE: _dm.ProcessDigitalMessage(multiByteChannel, _inputMessage[0] << 7 | _inputMessage[1]); break; case (byte)CommandCode.SET_PIN_MODE: //_board.SetPinMode(_inputMessage[1], _inputMessage[0] << 7 | _inputMessage[1]); break; case (byte)CommandCode.REPORT_ANALOG: //_board.ReportAnalog(multiByteChannel, _inputMessage[0] << 7 | _inputMessage[1]); break; case (byte)CommandCode.REPORT_DIGITAL: //_board.ReportDigital(multiByteChannel, _inputMessage[0] << 7 | _inputMessage[1]); break; case (byte)CommandCode.REPORT_VERSION: var key = ComputeCommandKey((byte)CommandCode.REPORT_VERSION); CompleteTask(key, multiByteCommand, _inputMessage[1], _inputMessage[0]); break; } } } else { if (b < 0xf0) { command = (byte)(b & 0xf0); multiByteChannel = (byte)(b & 0x0F); } else { command = b; } } switch (command) { case (byte)CommandCode.ANALOG_MESSAGE: case (byte)CommandCode.DIGITAL_MESSAGE: case (byte)CommandCode.SET_PIN_MODE: case (byte)CommandCode.REPORT_VERSION: dataNeeded = 2; multiByteCommand = command; break; case (byte)CommandCode.REPORT_ANALOG: case (byte)CommandCode.REPORT_DIGITAL: dataNeeded = 1; multiByteCommand = command; break; case (byte)CommandCode.START_SYSEX: parsingSysex = true; _cbInputMessage = 0; break; case (byte)CommandCode.SYSTEM_RESET: // reset the input parsing state machine multiByteChannel = 0; dataNeeded = 0; multiByteCommand = 0; parsingSysex = false; _cbInputMessage = 0; Array.Clear(_inputMessage, 0, _inputMessage.Length); //_board.Reset(); break; default: break; } _haveDataEvent.Reset(); } catch { } } }