private ComboUsageInfo GetMostUsedGearValue(RangeInfoCacheWrapper range) { if (range.ActivityPauselessCadenceTrack.Count > 0) { ITimeDataSeries <SprocketCombo> rangeSprockets = GetRangeSprocketsTrack(range); IList <SprocketComboInfo> sprocketInfo = GetSprocketComboInfo(range, rangeSprockets); SprocketCombo mostUsedCombo = null; TimeSpan mostUsedDuration = new TimeSpan(0); foreach (SprocketComboInfo comboInfo in sprocketInfo) { TimeSpan currentComboDuration = new TimeSpan(0); foreach (IValueRange <DateTime> times in comboInfo.Times) { currentComboDuration += (times.Upper - times.Lower); } if (mostUsedCombo == null || mostUsedDuration < currentComboDuration) { mostUsedCombo = comboInfo.SprocketCombo; mostUsedDuration = currentComboDuration; } } return(new ComboUsageInfo(mostUsedCombo, mostUsedDuration)); } return(null); }
/// <summary> /// Create gear guess selection chart based on gear ratios /// </summary> /// <param name="input">Pre-calculated raw data to estimate from. This should already be smoothed or filtered if desired.</param> /// <returns>Gear guess NumericTimeDataSeries</returns> public static ITimeDataSeries <SprocketCombo> GuessSprockets(INumericTimeDataSeries input, List <SprocketCombo> sprockets) { ITimeDataSeries <SprocketCombo> guessSeries = new TimeDataSeries <SprocketCombo>(); SprocketCombo lastValue = null; // Iterate through entire data series guessing each point foreach (ITimeValueEntry <float> item in input) { float diff = float.MaxValue; SprocketCombo guess = null; // Find closest match out of all gear ratios foreach (SprocketCombo sprocketCombo in sprockets) { float n = Math.Abs(sprocketCombo.GearRatio - item.Value); if (n < diff) { // Current closest match diff = n; guess = sprocketCombo; } } if (guessSeries.Count > 0 && lastValue != guess) { guessSeries.Add(input.EntryDateTime(item).AddMilliseconds(-1), lastValue); } guessSeries.Add(input.EntryDateTime(item), guess); lastValue = guess; } return(guessSeries); }
public String GetMaxRatio(List <RangeInfoCacheWrapper> allRanges) { if (allRanges.Count > 0 && allRanges[0].ActivityPauselessCadenceTrack.Count > 0) { double maxRatio = GetMaxRatioValue(allRanges); if (maxRatio != 0) { SprocketCombo combo = FindComboFromRatio(maxRatio, allRanges[0].Activity); // We must refresh our cache, something changed in our activity if (combo == null) { foreach (RangeInfoCacheWrapper range in allRanges) { range.SaveStoredInfo(m_GearTrackStoredInfoId, null); range.SaveStoredInfo(m_SprocketTrackStoredInfoId, null); range.SaveStoredInfo(m_SprocketStoredInfoId, null); } maxRatio = GetMaxRatioValue(allRanges); combo = FindComboFromRatio(maxRatio, allRanges[0].Activity); } Debug.Assert(combo != null); return(String.Format("{0:0.00} ({1:0}x{2:0})", Math.Round(maxRatio, 2), combo.ChainringSize, combo.CassetteSize)); } } return(String.Empty); }
public String GetMinRatio(RangeInfoCacheWrapper range) { if (range.ActivityPauselessCadenceTrack.Count > 0) { double minRatio = GetMinRatioValue(range); SprocketCombo combo = FindComboFromRatio(minRatio, range.Activity); // We must refresh our cache, something changed in our activity if (combo == null) { range.SaveStoredInfo(m_GearTrackStoredInfoId, null); range.SaveStoredInfo(m_SprocketTrackStoredInfoId, null); range.SaveStoredInfo(m_SprocketStoredInfoId, null); minRatio = GetMinRatioValue(range); combo = FindComboFromRatio(minRatio, range.Activity); } Debug.Assert(combo != null); return(String.Format("{0:0.00} ({1:0}x{2:0})", Math.Round(minRatio, 2), combo.ChainringSize, combo.CassetteSize)); } return(String.Empty); }
public GearNamedZone(IActivity activity, SprocketCombo gearCombo) { m_ActivityDataChangedHelper.PropertyChanged += new PropertyChangedEventHandler(OnActivityDataChanged); Activity = activity; m_Gear = gearCombo; m_ValidTimesDirty = true; TriggerValidTimesChanged(); }
private ComboUsageInfo GetMostUsedGearValue(List <RangeInfoCacheWrapper> allRanges) { if (allRanges.Count > 0 && allRanges[0].ActivityPauselessCadenceTrack.Count > 0) { List <ComboUsageInfo> allRangesUsageInfo = new List <ComboUsageInfo>(); foreach (RangeInfoCacheWrapper range in allRanges) { ITimeDataSeries <SprocketCombo> rangeSprockets = GetRangeSprocketsTrack(range); IList <SprocketComboInfo> sprocketInfo = GetSprocketComboInfo(range, rangeSprockets); for (int i = 0; i < sprocketInfo.Count; ++i) { TimeSpan currentComboDuration = new TimeSpan(0); foreach (IValueRange <DateTime> times in sprocketInfo[i].Times) { currentComboDuration += (times.Upper - times.Lower); } if (allRangesUsageInfo.Count <= i) { allRangesUsageInfo.Add(new ComboUsageInfo(sprocketInfo[i].SprocketCombo, currentComboDuration)); } else { allRangesUsageInfo[i].m_UsageDuration += currentComboDuration; } } } SprocketCombo mostUsedCombo = null; TimeSpan mostUsedDuration = new TimeSpan(0); foreach (ComboUsageInfo comboInfo in allRangesUsageInfo) { if (mostUsedCombo == null || mostUsedDuration < comboInfo.m_UsageDuration) { mostUsedCombo = comboInfo.m_Combo; mostUsedDuration = comboInfo.m_UsageDuration; } } return(new ComboUsageInfo(mostUsedCombo, mostUsedDuration)); } return(null); }
public ComboUsageInfo(SprocketCombo combo, TimeSpan usageDuration) { m_Combo = combo; m_UsageDuration = usageDuration; }