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);
                    }
                }
            }
        }