private FrameFieldValues GetFrameFieldValues(SummaryColumnFlags flags, int lapIdx, int frameIdx, int fieldIdx, float?minWarning, float?maxWarning)
        {
            IEnumerable <TelemetryValues> lapFieldValues = TelemetryData.GetLapFieldValues(lapIdx, fieldIdx).ToList();

            FrameFieldValues ffv;

            if (lapFieldValues.Count() == 0)
            {
                ffv = new FrameFieldValues(false);
            }
            else
            {
                ffv = new FrameFieldValues(true);

                ffv.Value = lapFieldValues.FirstOrDefault(v => v.FrameIdx == frameIdx).Value.GetValueOrDefault();

                IEnumerable <float> lapValues = lapFieldValues.Select(v => v.Value.GetValueOrDefault());

                var lapMin = lapValues.Min();
                var lapMax = lapValues.Max();

                if (flags.HasFlag(SummaryColumnFlags.LapMin))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.LapMin, lapMin);
                }

                if (flags.HasFlag(SummaryColumnFlags.LapMax))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.LapMax, lapMax);
                }

                if (flags.HasFlag(SummaryColumnFlags.LapDelta))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.LapDelta, lapMax - lapMin);
                }

                if (flags.HasFlag(SummaryColumnFlags.LapMode))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.LapMode, lapValues.Mode());
                }

                if (flags.HasFlag(SummaryColumnFlags.LapAvg))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.LapAvg, lapValues.Average());
                }

                if (flags.HasFlag(SummaryColumnFlags.LapStdDev))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.LapStdDev, lapValues.StandardDeviation());
                }

                IEnumerable <TelemetryValues> sessionFieldValues = TelemetryData.GetSessionFieldValues(fieldIdx);

                IEnumerable <float> sessionValues = sessionFieldValues.Select(v => v.Value.GetValueOrDefault());

                var sessionMin = sessionValues.Min();
                var sessionMax = sessionValues.Max();

                if (flags.HasFlag(SummaryColumnFlags.SessionMin))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.SessionMin, sessionMin);
                }

                if (flags.HasFlag(SummaryColumnFlags.SessionMax))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.SessionMax, sessionMax);
                }

                if (flags.HasFlag(SummaryColumnFlags.SessionDelta))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.SessionDelta, sessionMax - sessionMin);
                }

                if (flags.HasFlag(SummaryColumnFlags.SessionMode))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.SessionMode, sessionValues.Mode());
                }

                if (flags.HasFlag(SummaryColumnFlags.SessionAvg))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.SessionAvg, sessionValues.Average());
                }

                if (flags.HasFlag(SummaryColumnFlags.SessionStdDev))
                {
                    ffv.SummaryValues.Add(SummaryColumnFlags.SessionStdDev, sessionValues.StandardDeviation());
                }

                if (maxWarning.HasValue)
                {
                    ffv.MaxWarning = ffv.Value >= maxWarning.Value;
                }

                if (minWarning.HasValue)
                {
                    ffv.MinWarning = ffv.Value <= minWarning.Value;
                }
            }

            return(ffv);
        }