private void HandleSysExMessage(object sender, SysExMessageEventArgs e) { if (!DataResponseMessage.TryParse(e.Message, out var response)) { AddUnconsumedMessage(); return; } if (response.DeviceId != DeviceId || response.ModelId != ModelId) { AddUnconsumedMessage(); return; } LinkedList <TaskCompletionSource <byte[]> > sourcesToComplete = new LinkedList <TaskCompletionSource <byte[]> >(); lock (sync) { var node = consumers.First; while (node != null) { var consumer = node.Value; if (consumer.ExpectedAddress == response.Address && consumer.ExpectedSize == response.Length) { sourcesToComplete.AddLast(consumer.TaskCompletionSource); consumers.Remove(node); } node = node.Next; } } foreach (var source in sourcesToComplete) { source.TrySetResult(response.Data); } if (sourcesToComplete.Count == 0) { UnconsumedMessageHandler?.Invoke(this, response); AddUnconsumedMessage(); } void AddUnconsumedMessage() { // TODO: Limit the buffer size. lock (sync) { unconsumedMessages.AddLast(e.Message); } } }
public void SendData(int address, byte[] bytes) { var message = new DataResponseMessage(DeviceId, ModelId, address, bytes); output.Send(message.ToSysExMessage()); }