private void TransitionToIdle()
        {
            StopTimer();
            _state = SlaveSimulatorState.Idle;

            Console.WriteLine(HexFormatter.FormatHex(_sampleBuffer.ToArray()));

            _sampleBuffer.Clear();
            Console.WriteLine("Back to idle");
        }
        void OnSample(object sender, SampleEventArgs e)
        {
            switch (_state)
            {
                case SlaveSimulatorState.Idle:

                    _sampleBuffer.Add(e.Sample);

                    if (DoesSlaveExist(e.Sample))
                    {
                        _state = SlaveSimulatorState.ListeningToRequest;

                        StartTimer(_characterTimeout);

                        Console.WriteLine("Starting to listen to our own slave request...");

                    }
                    else
                    {
                        _state = SlaveSimulatorState.ListeningToOtherSlave;
                        StartTimer(_messageTimeout);

                        Console.WriteLine("Starting to listen to someone else's request...");
                    }

                    break;

                case SlaveSimulatorState.ListeningToRequest:

                    _sampleBuffer.Add(e.Sample);

                    StartTimer(_characterTimeout);

                    break;

                case SlaveSimulatorState.ListeningToOtherSlave:

                    _sampleBuffer.Add(e.Sample);
                    StartTimer(_messageTimeout);
                    break;

                default:
                    throw new InvalidOperationException(string.Format("Unexpected state '{0}'", _state));

            }
        }