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)); }