private object GetMessageFromQueue(FirmataMessage awaitedMessage)
        {
            _awaitedMessagesQueue.Enqueue(awaitedMessage);
            bool lockTaken = false;

            try
            {
                Monitor.TryEnter(_receivedMessageList, _messageTimeout, ref lockTaken);

                while (lockTaken)
                {
                    if (_receivedMessageList.Count > 0)
                    {
                        var message = (from firmataMessage in _receivedMessageList
                                       where firmataMessage.Type == awaitedMessage.Type
                                       select firmataMessage).FirstOrDefault();
                        if (message != null)
                        {
                            //if (_receivedMessageQueue.Count > 0
                            //    && _receivedMessageQueue.Select( fm => fm.Type == awaitedMessage.Type).First()) // .Find(FirmataMessage =>) .First().Type == awaitedMessage.Type)
                            //{
                            //FirmataMessage message = _receivedMessageQueue.First.Value;
                            //_receivedMessageQueue.RemoveFirst();
                            _receivedMessageList.Remove(message);
                            Monitor.PulseAll(_receivedMessageList);
                            return message;
                        }
                    }

                    lockTaken = Monitor.Wait(_receivedMessageList, _messageTimeout);
                }

                throw new TimeoutException(string.Format(Messages.TimeoutEx_WaitMessage, awaitedMessage.Type));
            }
            finally
            {
                if (lockTaken)
                {
                    Monitor.Exit(_receivedMessageList);
                }
            }
        }
 internal FirmataMessageEventArgs(FirmataMessage value)
 {
     _value = value;
 }
        private void DeliverMessage(FirmataMessage message)
        {
            _processMessage = null;

            lock (_receivedMessageList)
            {
                if (_receivedMessageList.Count >= MaxQueuelength)
                    throw new OverflowException(Messages.OverflowEx_MsgBufferFull);

                // Remove all unprocessed and timed-out messages.
                while (_receivedMessageList.Count > 0 &&
                    ((DateTime.UtcNow - _receivedMessageList.First.Value.Time).TotalMilliseconds > TimeOut))
                {
                    _receivedMessageList.RemoveFirst();
                }

                _receivedMessageList.AddLast(message);
                Monitor.PulseAll(_receivedMessageList);
            }

            if (MessageReceived != null && message.Type != MessageType.I2CReply)
                MessageReceived(this, new FirmataMessageEventArgs(message));
        }
 internal FirmataMessageEventArgs(FirmataMessage value)
 {
     _value = value;
 }