void RoutePacket(ResponseDataPacket packet)
        {
            switch (packet.Command)
            {
            case ReaderCommand.TagInventory:
                switch (packet.Status)
                {
                case ResponseStatusCode.InventoryTimeout:
                case ResponseStatusCode.InventoryMoreFramesPending:
                case ResponseStatusCode.InventoryBufferOverflow:
                case ResponseStatusCode.InventoryComplete:
                    PacketCount++;
                    ReadInventoryResult(packet);
                    return;

                case ResponseStatusCode.InventoryStatisticsDelivery:
                    ReadInventoryStatistics(packet);
                    return;
                }
                break;

            case ReaderCommand.TagInventoryWithMemoryBuffer:
                switch (packet.Status)
                {
                case ResponseStatusCode.Success:
                    ReadBufferResponse(packet);
                    return;
                }
                break;
            }
            throw new UnexpectedResponseException(packet.Command, packet.Status);
        }
Beispiel #2
0
        async Task ListenLoop()
        {
            using (semaphore.UseOnce())
            {
                try
                {
                    while (run)
                    {
                        var packet = await MessageParser.ReadPacket(dataStreamFactory.DataStream);

                        if (packet.Success)
                        {
                            var msg = new ResponseDataPacket(ReaderCommand.RealtimeInventoryResponse, packet.Data,
                                                             elapsed: packet.Elapsed);

                            var t = msg.GetRealtimeTag(out var isHeartbeat);
                            if (t != null)
                            {
                                tags.OnNext(t);
                            }
                        }
                        else
                        {
                            Console.WriteLine(packet.ResultType);
                        }
                    }
                }
                catch (Exception ex)
                {
                    errors.OnNext(ex);
                }
            }
        }
Beispiel #3
0
        public static bool ShouldReadMore(ResponseDataPacket responseDataPacket)
        {
            var response = responseDataPacket.Command == ReaderCommand.TagInventory &&
                           (responseDataPacket.Status == ResponseStatusCode.InventoryMoreFramesPending ||
                            responseDataPacket.Status == ResponseStatusCode.InventoryStatisticsDelivery);

            Logger.Debug("{ShouldReadMore}", response);
            return(response);
        }
Beispiel #4
0
        void ReadBufferResponse(ResponseDataPacket packet)
        {
            var offset = ResponseDataPacket.DataOffset;

            TagsInBuffer  = (ushort)(packet.RawData[offset++] << 8);
            TagsInBuffer += packet.RawData[offset++];

            TagsInLastInventory  = (ushort)(packet.RawData[offset++] << 8);
            TagsInLastInventory += packet.RawData[offset++];
        }
Beispiel #5
0
        void ReadBufferResult(ResponseDataPacket packet)
        {
            var offset     = ResponseDataPacket.DataOffset;
            var epcIdCount = packet.RawData[offset++];

            for (var i = 0; i < epcIdCount; i++)
            {
                var tag = ReadEpcId(packet.RawData, ref offset);
                tag.LastSeenTime = tag.DiscoveryTime = packet.Timestamp;
                Tags.Add(tag);
            }
        }
Beispiel #6
0
        void ReadInventoryResult(ResponseDataPacket packet)
        {
            var antenna    = ((AntennaConfiguration)packet.RawData[ResponseDataPacket.DataOffset]).ToNumber();
            var epcIdCount = packet.RawData[ResponseDataPacket.DataOffset + 1];
            var offset     = ResponseDataPacket.DataOffset + 2;

            for (var i = 0; i < epcIdCount; i++)
            {
                var tag = ReadEpcId(packet.RawData, ref offset);
                tag.LastSeenTime = tag.DiscoveryTime = packet.Timestamp;
                tag.Antenna      = antenna;
                Tags.Add(tag);
            }
        }
Beispiel #7
0
        public static bool ShouldReadMore(ResponseDataPacket responseDataPacket)
        {
            bool response = false;

            switch (responseDataPacket.Command)
            {
            case ReaderCommand.TagInventory:
                response = responseDataPacket.Status == ResponseStatusCode.InventoryMoreFramesPending ||
                           responseDataPacket.Status == ResponseStatusCode.InventoryStatisticsDelivery;
                break;

            case ReaderCommand.RealtimeInventoryResponse:
                response = true;
                break;
            }
            Logger.Debug("{ShouldReadMore}", response);
            return(response);
        }
Beispiel #8
0
        public async Task <IEnumerable <ResponseDataPacket> > SendReceive(CommandDataPacket command)
        {
            using (sendReceiveSemaphore.UseOnce())
            {
                try
                {
                    var port   = streamFactory.DataStream;
                    var buffer = command.Serialize();
                    await port.WriteAsync(buffer, 0, buffer.Length);

                    var responsePackets = new List <ResponseDataPacket>();
                    ResponseDataPacket lastResponse;
                    do
                    {
                        var packet = await MessageParser.ReadPacket(port);

                        //TODO: Receive failures should be handled by reopening port.
                        if (!packet.Success)
                        {
                            throw new ReceiveFailedException(
                                      $"Failed to read response from {streamFactory.Description} {packet.ResultType}");
                        }
                        responsePackets.Add(lastResponse = new ResponseDataPacket(command.Command, packet.Data));
                    } while (MessageParser.ShouldReadMore(lastResponse));

                    return(responsePackets);
                }
                catch (ReceiveFailedException)
                {
                    Dispose();
                    throw;
                }
                catch (NotSupportedException)
                {
                    Dispose();
                    throw;
                }
            }
        }
Beispiel #9
0
        public async Task <IEnumerable <ResponseDataPacket> > SendReceive(CommandDataPacket command)
        {
            using (sendReceiveSemaphore.UseOnce())
            {
                try
                {
                    var port   = streamFactory.DataStream;
                    var buffer = command.Serialize();
                    var sw     = Stopwatch.StartNew();
                    await port.WriteAsync(buffer, 0, buffer.Length);

                    var responsePackets = new List <ResponseDataPacket>();
                    ResponseDataPacket lastResponse;
                    do
                    {
                        var packet = await MessageParser.ReadPacket(port, sw);

                        sw = null;
                        //TODO: Receive failures should be handled by reopening port.
                        if (!packet.Success)
                        {
                            throw new ReceiveFailedException(
                                      $"Failed to read response from {streamFactory.Description} {packet.ResultType}");
                        }
                        responsePackets.Add(lastResponse = new ResponseDataPacket(command.Command, packet.Data, elapsed: packet.Elapsed,
                                                                                  errorsObserver: ThrowOnIllegalCommandError ? null : errors));
                    } while (MessageParser.ShouldReadMore(lastResponse));

                    return(responsePackets);
                }
                catch
                {
                    Dispose();
                    throw;
                }
            }
        }
Beispiel #10
0
 void ReadInventoryStatistics(ResponseDataPacket packet)
 {
     throw new NotImplementedException();
 }
Beispiel #11
0
 void ReadInventoryStatistics(ResponseDataPacket packet)
 {
 }