Esempio n. 1
0
        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();
                    }
                }
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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 { }
            }
        }