Example #1
0
        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);
                }
            }
        }
Example #2
0
        public void SendData(int address, byte[] bytes)
        {
            var message = new DataResponseMessage(DeviceId, ModelId, address, bytes);

            output.Send(message.ToSysExMessage());
        }