internal async Task SendCommandAsync(IMessage m)
        {
            var bytes  = new byte[(m.CalculateSize())];
            var stream = new CodedOutputStream(bytes);

            m.WriteTo(stream);

            var chunker = new PacketChunker(mtu);

            //var all = chunker.Chunks(bytes).Select(x => characteristic.WriteValueAsync(x.AsBuffer(), GattWriteOption.WriteWithResponse).AsTask());
            //await Task.WhenAll(all);

            foreach (var c in chunker.Chunks(bytes))
            {
                try
                {
                    Log.Information("Sending packet");
                    await characteristic.WriteValueAsync(c.AsBuffer(), GattWriteOption.WriteWithResponse);
                }
                catch (Exception e)
                {
                    Log.Error(e, "");
                    throw;
                }
            }

            //await characteristic.WriteValueAsync(bytes.AsBuffer(), GattWriteOption.WriteWithResponse);


            Log.Information("Sent all packets");
        }
Ejemplo n.º 2
0
        public void Chunks_bytes_into_multiples_of_mtu_size()
        {
            byte[] total = Enumerable.Range(0, 200).Select(x => (byte)x).ToArray();

            var chunks = new PacketChunker(20).Chunks(total);

            chunks.Should().HaveCountGreaterOrEqualTo(10);
        }
Ejemplo n.º 3
0
        public void Appends_EOM_packet()
        {
            byte[] total = Enumerable.Range(0, 10).Select(x => (byte)x).ToArray();

            var chunks = new PacketChunker(20).Chunks(total).ToArray();

            chunks.Should().HaveCount(2);
            chunks[1].Should().BeEquivalentTo("EOM");
        }
Ejemplo n.º 4
0
        public void Chunks_bytes_with_correct_content()
        {
            byte[] total = Enumerable.Range(0, 200).Select(x => (byte)x).ToArray();

            var chunks = new PacketChunker(20).Chunks(total).ToArray();

            chunks[0].Should().BeEquivalentTo(Enumerable.Range(0, 20));
            chunks[1].Should().BeEquivalentTo(Enumerable.Range(20, 20));
            chunks[2].Should().BeEquivalentTo(Enumerable.Range(40, 20));
            chunks[3].Should().BeEquivalentTo(Enumerable.Range(60, 20));
            chunks[4].Should().BeEquivalentTo(Enumerable.Range(80, 20));
        }
Ejemplo n.º 5
0
        public void Builds_multiples_into_one_buffer()
        {
            var total = Enumerable.Range(0, 200).Select(x => (byte)x).ToArray();

            var chunks = new PacketChunker(20).Chunks(total);

            chunks = chunks.Take(chunks.Count() - 1);

            foreach (var block in chunks)
            {
                sut.AddBlock(block);
            }

            var fullPacket = sut.GetCompletedPacket();

            fullPacket.Should().BeEquivalentTo(total);
        }