/// <summary> /// Gets the cached track if available, or calculates from scratch if not available. /// </summary> /// <param name="activity">Activity to calculate</param> /// <param name="chartType">Which track to calculate</param> /// <param name="create">Cache the track if it doesn't exist. /// True will always return a track. /// False will return the cached track, or null if not already cached.</param> /// <returns>Cached track if available, or empty track if not found.</returns> private static INumericTimeDataSeries GetMeanMaxTrack(IActivity activity, Common.TrackType chartType, out INumericTimeDataSeries timeTrack, bool create) { if (activity == null) { timeTrack = new NumericTimeDataSeries(); return(new NumericTimeDataSeries()); } string id = activity.ReferenceId + chartType; if (tracks.ContainsKey(id)) { // Returned cached value from memory :) timeTrack = tracks[id + "T"]; return(tracks[id]); } else if (create) { // Not in cache, create a new mean-max track :( INumericTimeDataSeries track = new NumericTimeDataSeries(); timeTrack = null; switch (chartType) { case Common.TrackType.HR: { track = GetMeanMaxTrack(activity.HeartRatePerMinuteTrack, out timeTrack, activity.StartTime); break; } case Common.TrackType.Power: { track = GetMeanMaxTrack(activity.PowerWattsTrack, out timeTrack, activity.StartTime); break; } case Common.TrackType.Cadence: { track = GetMeanMaxTrack(activity.CadencePerMinuteTrack, out timeTrack, activity.StartTime); break; } } // Add data track and related 'T'ime track to cache for next time MeanMaxCache.AddTrack(track, id); MeanMaxCache.AddTrack(timeTrack, id + "T"); return(track); } else { // Not previously cached, AND requested not to create a new cached item. timeTrack = new NumericTimeDataSeries(); return(null); } }