private void recordTag(Split tag)
        {
            if (_readerProfile.ReadingMode == ReadingMode.Desktop)
            {
                onAssignTag(tag);
                return;
            }

            if (_readerProfile.GatingEnabled)
            {
                TagsInView.AddOrUpdate(tag.Epc, new List <Split> {
                    tag
                }, (key, tagsInView) =>
                {
                    if (tagsInView.Count > 100)
                    {
                        tagsInView.Clear();
                    }

                    tagsInView.Add(tag);
                    return(tagsInView);
                }
                                       );

                RecentTags.AddOrUpdate(tag.Epc, tag, (key, oldTag) => tag);
            }
            else
            {
                onRecordTag(tag);
            }
        }
        private void ReportTags()
        {
            if (_readerProfile.ReadingMode == ReadingMode.Desktop)
            {
                return;
            }

            onReportTags(new TagsReports($"{RecentTags.Count} recent tags and {TagsInView.Count} tags in view"));

            DateTime currentTime = DateTime.Now.ToLocalTime();

            logger.Log(LogLevel.Trace, "RecentTags count: " + RecentTags.Count);

            logger.Log(LogLevel.Trace, $"TagsInView count: {TagsInView.Count}");

            foreach (KeyValuePair <string, Split> recentTag in RecentTags)
            {
                TimeSpan difference = currentTime - recentTag.Value.DateTimeOfDay;

                if (difference.TotalSeconds > _readerProfile.GatingTime)
                {
                    Split removedTag;

                    if (RecentTags.TryRemove(recentTag.Key, out removedTag))
                    {
                        logger.Log(LogLevel.Trace, "removed " + recentTag.Key);

                        if (removedTag != null)
                        {
                            List <Split> tags;

                            if (TagsInView.TryRemove(removedTag.Epc, out tags))
                            {
                                logger.Log(LogLevel.Trace, $"TagsInView for {removedTag.Epc} count: {tags.Count}");

                                Split nearestTag = tags.OrderByDescending(x => x.Rssi).FirstOrDefault();

                                onRecordTag(nearestTag);
                            }
                            else
                            {
                                onRecordTag(removedTag);
                            }
                        }
                    }
                    else
                    {
                        logger.Log(LogLevel.Trace, "failed to remove recent tag: " + recentTag.Key);
                    }
                }
            }
        }
        public bool BeginReading()
        {
            RecentTags.Clear();
            TagsInView.Clear();

            if (_readerProfile.InventoryMode == InventoryMode.Buffer)
            {
                StartBufferRead();
            }

            // Create a timer with a two second interval.
            _aTimer = new System.Timers.Timer(100);
            // Hook up the Elapsed event for the timer.
            _aTimer.Elapsed  += TimerTick;
            _aTimer.AutoReset = true;
            _aTimer.Enabled   = false;
            // _aTimer.Enabled = true;

            StartReadDelay();

            return(true);
        }
        public bool StopReading()
        {
            RecentTags.Clear();
            TagsInView.Clear();

            switch (_readerProfile.InventoryMode)
            {
            case InventoryMode.Answer:
                _aTimer.Enabled = false;
                break;

            case InventoryMode.RealTime:
                _aTimer.Enabled = false;
                break;

            case InventoryMode.Buffer:
                stopBufferRead();
                break;
            }

            return(true);
        }