private void SetupAxisStripes(IAxis yAxis, LineChartTypes chartType) { if (yAxis != null && Activity != null) { yAxis.Stripes.Clear(); if (Options.Instance.ShowZonesInChart && ShownZones != null) { foreach (INamedLowHighZone zone in ShownZones.Zones) { AxisStripe stripe = new AxisStripe(zone.Low, zone.High, Color.FromArgb(16, 0, 0, 0)); yAxis.Stripes.Add(stripe); // Setup default parameters stripe.Name = zone.Name; stripe.LineColor = Color.FromArgb(128, 0, 0, 0); stripe.LineStyle = DashStyle.Dash; stripe.LineWidth = 2; // Some types need to override the low/high values switch (chartType) { case LineChartTypes.HeartRatePercentMax: { IAthleteInfoEntry lastAthleteEntry = PluginMain.GetApplication().Logbook.Athlete.InfoEntries.LastEntryAsOfDate(m_ActivityInfoCache.ActualTrackStart); // Value is in BPM so convert to the % max HR if we have the info if (!float.IsNaN(lastAthleteEntry.MaximumHeartRatePerMinute)) { stripe.From = (zone.Low / lastAthleteEntry.MaximumHeartRatePerMinute) * 100; stripe.To = (zone.High / lastAthleteEntry.MaximumHeartRatePerMinute) * 100; } else { // Cancel the add, we don't have the data yAxis.Stripes.Remove(stripe); } break; } case LineChartTypes.Speed: { stripe.From = Length.Convert(zone.Low, Length.Units.Meter, Utils.Utils.MajorLengthUnit(Activity.Category.DistanceUnits)) * Utils.Constants.SecondsPerHour; stripe.To = Length.Convert(zone.High, Length.Units.Meter, Utils.Utils.MajorLengthUnit(Activity.Category.DistanceUnits)) * Utils.Constants.SecondsPerHour;; break; } default: { break; } } } if (MainChart != null) { MainChart.Invalidate(); } } } }
private INumericTimeDataSeries GetSmoothedActivityTrack(LineChartTypes chartType) { // Fail safe INumericTimeDataSeries result = new NumericTimeDataSeries(); if (Activity != null) { switch (chartType) { case LineChartTypes.Cadence: { result = m_ActivityInfoCache.SmoothedCadenceTrack; break; } case LineChartTypes.Elevation: { INumericTimeDataSeries tempResult = m_ActivityInfoCache.SmoothedElevationTrack; // Value is in meters so convert to the right unit result = new NumericTimeDataSeries(); foreach (ITimeValueEntry <float> entry in tempResult) { double temp = Length.Convert(entry.Value, Length.Units.Meter, Activity.Category.ElevationUnits); result.Add(tempResult.EntryDateTime(entry), (float)temp); } break; } case LineChartTypes.Grade: { result = new NumericTimeDataSeries(); INumericTimeDataSeries tempResult = m_ActivityInfoCache.SmoothedGradeTrack; foreach (ITimeValueEntry <float> entry in tempResult) { result.Add(tempResult.EntryDateTime(entry), entry.Value * 100.0f); } break; } case LineChartTypes.HeartRateBPM: { result = m_ActivityInfoCache.SmoothedHeartRateTrack; break; } case LineChartTypes.HeartRatePercentMax: { result = new NumericTimeDataSeries(); IAthleteInfoEntry lastAthleteEntry = PluginMain.GetApplication().Logbook.Athlete.InfoEntries.LastEntryAsOfDate(m_ActivityInfoCache.ActualTrackStart); // Value is in BPM so convert to the % max HR if we have the info if (!float.IsNaN(lastAthleteEntry.MaximumHeartRatePerMinute)) { INumericTimeDataSeries tempResult = m_ActivityInfoCache.SmoothedHeartRateTrack; foreach (ITimeValueEntry <float> entry in tempResult) { double temp = (entry.Value / lastAthleteEntry.MaximumHeartRatePerMinute) * 100; result.Add(tempResult.EntryDateTime(entry), (float)temp); } } break; } case LineChartTypes.Power: { result = m_ActivityInfoCache.SmoothedPowerTrack; break; } case LineChartTypes.Speed: { INumericTimeDataSeries tempResult = m_ActivityInfoCache.SmoothedSpeedTrack; // Value is in m/sec so convert to the right unit and to // pace if necessary result = new NumericTimeDataSeries(); foreach (ITimeValueEntry <float> entry in tempResult) { double temp = Length.Convert(entry.Value, Length.Units.Meter, Utils.Utils.MajorLengthUnit(Activity.Category.DistanceUnits)) * Utils.Constants.SecondsPerHour; if (Activity.Category.SpeedUnits == Speed.Units.Pace) { // Convert to pace and then in second temp = Utils.Utils.SpeedToPace(temp) * Utils.Constants.SecondsPerMinute; } result.Add(tempResult.EntryDateTime(entry), (float)temp); } break; } default: { Debug.Assert(false); break; } } } return(result); }
public static void ImportMeasurements(ILogbook logbook, LogbookSettings settings, IList <WithingsWebServiceProxy.MeasurementInfo> measurements) { List <WithingsWebServiceProxy.MeasurementInfo> orderedMeasurements = new List <WithingsWebServiceProxy.MeasurementInfo>(measurements); if (settings.ImportMultipleEntries == LogbookSettings.MultipleEntriesUpdateStyles.Latest) { orderedMeasurements.Sort(new OldestToNewestComparer()); } else { orderedMeasurements.Sort(new NewestToOldestComparer()); } foreach (WithingsWebServiceProxy.MeasurementInfo measurement in orderedMeasurements) { // Skip ambiguous readings unless setting is selected. if (!settings.ImportAmbiguousEntries) { if (measurement.Source == WithingsWebServiceProxy.MeasurementInfo.SourceType.AmbiguousScaleReading) { continue; } } // Always import height if settings is selected (even if manual). if (settings.ImportHeightEntries && !float.IsNaN(measurement.HeightMeters)) { logbook.Athlete.HeightCentimeters = measurement.HeightMeters * 100; } // Skip manual entries unless settings is selected. if (!settings.ImportManualEntries) { if (measurement.Source == WithingsWebServiceProxy.MeasurementInfo.SourceType.ManualEntry || measurement.Source == WithingsWebServiceProxy.MeasurementInfo.SourceType.ProfileCreation) { continue; } } IAthleteInfoEntry athleteInfoEntry = logbook.Athlete.InfoEntries.EntryForDate(measurement.Time.Date); try { // Import weight if (!float.IsNaN(measurement.WeightKilograms) && measurement.WeightKilograms > 0) { //System.Diagnostics.Trace.WriteLine("Weight entry on " + measurement.Time.ToLocalTime().ToShortDateString() + " " + measurement.Time.ToLocalTime().ToShortTimeString() + "=" + measurement.WeightKilograms); float actualKilograms = measurement.WeightKilograms; float roundedKilograms = actualKilograms; switch (Plugin.Instance.Application.SystemPreferences.WeightUnits) { case Weight.Units.Kilogram: roundedKilograms = (float)Math.Round(actualKilograms + 0.005, 1); break; case Weight.Units.Pound: case Weight.Units.Stone: double pounds = Weight.Convert(actualKilograms + 0.005, Weight.Units.Kilogram, Weight.Units.Pound); pounds = Math.Round(pounds, 1); roundedKilograms = (float)Weight.Convert(pounds, Weight.Units.Pound, Weight.Units.Kilogram); break; } bool update = false; if (float.IsNaN(athleteInfoEntry.WeightKilograms)) { update = true; } else { switch (settings.ImportMultipleEntries) { case LogbookSettings.MultipleEntriesUpdateStyles.Earliest: case LogbookSettings.MultipleEntriesUpdateStyles.Latest: update = true; break; case LogbookSettings.MultipleEntriesUpdateStyles.Lowest: if (roundedKilograms < athleteInfoEntry.WeightKilograms) { update = true; } break; case LogbookSettings.MultipleEntriesUpdateStyles.Highest: if (roundedKilograms > athleteInfoEntry.WeightKilograms) { update = true; } break; } } if (update) { //System.Diagnostics.Trace.WriteLine("Weight updated to " + roundedKilograms + " kilograms. actual=" + actualKilograms); athleteInfoEntry.WeightKilograms = roundedKilograms; if (settings.UpdateBMI) { if (!float.IsNaN(logbook.Athlete.HeightCentimeters) && logbook.Athlete.HeightCentimeters > 0) { float meters = logbook.Athlete.HeightCentimeters / 100; athleteInfoEntry.BMI = (float)Math.Round(actualKilograms / (meters * meters), 1); //System.Diagnostics.Trace.WriteLine("BMI updated to " + athleteInfoEntry.BMI); } } } } // Import percent fat if (!float.IsNaN(measurement.PercentFat) && measurement.PercentFat > 0 && measurement.PercentFat < 100) { //System.Diagnostics.Trace.WriteLine("Percent Fat entry on " + measurement.Time.ToLocalTime().ToShortDateString() + " " + measurement.Time.ToLocalTime().ToShortTimeString() + "=" + measurement.PercentFat); float percent = measurement.PercentFat; bool update = false; if (float.IsNaN(athleteInfoEntry.BodyFatPercentage)) { update = true; } else { switch (settings.ImportMultipleEntries) { case LogbookSettings.MultipleEntriesUpdateStyles.Earliest: case LogbookSettings.MultipleEntriesUpdateStyles.Latest: update = true; break; case LogbookSettings.MultipleEntriesUpdateStyles.Lowest: if (percent < athleteInfoEntry.BodyFatPercentage) { update = true; } break; case LogbookSettings.MultipleEntriesUpdateStyles.Highest: if (percent > athleteInfoEntry.BodyFatPercentage) { update = true; } break; } } if (update) { percent = (float)Math.Round(percent + 0.005, 1); //System.Diagnostics.Trace.WriteLine("Body fat % updated to " + percent + "%"); athleteInfoEntry.BodyFatPercentage = percent; } } } catch { } } }