Beispiel #1
0
        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
                {
                }
            }
        }