Beispiel #1
0
 public void UpdateIndexes(TrailResultInfo indexes)
 {
     this.Children.Clear();
     this.m_allChildren.Clear();
     this.Result.UpdateIndexes(indexes);
     this.GetChildren();
 }
Beispiel #2
0
 protected ChildTrailResult(ChildTrailResult cpar, int order, TrailResultInfo indexes) :
     base(cpar.ActivityTrail, order, indexes, 0)
 {
     UpdateIndexes(indexes);
     //Let this point to main parent, no ref to (parent) child (can be derived too)
     this.m_parentResult = cpar.ParentResult;
 }
Beispiel #3
0
        private void addPausesAsResults(IList <ChildTrailResult> splits, int lastNormalSplit, ICollection <IValueRange <DateTime> > pauses, PauseType pauseType)
        {
            foreach (IValueRange <DateTime> v in pauses)
            {
                //Pauses could extend outside the borders
                DateTime lower = v.Lower;
                if (lower == DateTime.MinValue)
                {
                    lower = m_subResultInfo.Points[0].Time;
                }
                DateTime upper = v.Upper;
                if (upper == DateTime.MaxValue)
                {
                    upper = m_subResultInfo.Points[m_subResultInfo.Points.Count - 1].Time;
                }

                //skip very short pauses
                TimeSpan duration = upper - lower;
                if (duration < TimeSpan.FromSeconds(1) &&
                    (this.StartTime - lower < TimeSpan.FromSeconds(1) ||
                     upper - this.EndTime < TimeSpan.FromSeconds(1)))
                {
                    continue;
                }

                //Match the pause to a split
                for (int j = 0; j <= lastNormalSplit; j++)
                {
                    if (splits[j].m_subResultInfo.Points[0].Time > DateTime.MinValue &&
                        splits[j].m_subResultInfo.Points[1].Time > DateTime.MinValue &&
                        //pause is started within this split
                        (splits[j].m_subResultInfo.Points[0].Time <= lower && lower <= splits[j].m_subResultInfo.Points[1].Time ||
                         //(First) lap, ends in the split
                         /*splits[j].*/ m_subResultInfo.Points[0].Time <= upper && upper < splits[j].m_subResultInfo.Points[1].Time ||
                         //For splits we want pauses also before after first normal split
                         this.Trail.IsSplits && (
                             upper < splits[j].m_subResultInfo.Points[0].Time ||
                             j == lastNormalSplit && splits[j].m_subResultInfo.Points[1].Time < lower)))
                    {
                        TrailResultInfo  t  = new TrailResultInfo(this.m_subResultInfo.Activity, this.m_subResultInfo.Reverse);
                        TrailGPSLocation tl = new TrailGPSLocation(PausedChildTrailResult.PauseName(pauseType), false);
                        t.Points.Add(new TrailResultPoint(tl, lower, duration));
                        t.Points.Add(new TrailResultPoint(tl, upper, TimeSpan.Zero));

                        PausedChildTrailResult tr = new PausedChildTrailResult(this, splits[j], -1, t, pauseType);
                        if (pauseType == PauseType.RestLap)
                        {
                            if (this.m_lapPauseMapping.ContainsKey(v))
                            {
                                tr.m_LapInfo = this.m_lapPauseMapping[v];
                            }
                        }
                        splits.Add(tr);
                        break;
                    }
                }
            }
        }
Beispiel #4
0
        //Handle the points as a child result - promote info
        public TrailResultInfo CopyToChild(int i, int j)
        {
            TrailResultInfo result = new TrailResultInfo(this.Activity, this.Reverse);

            result.Points.Add(new TrailResultPoint(this.Points[i]));
            result.Points.Add(new TrailResultPoint(this.Points[j]));
            //Point 0 lap data applies to this result (PoolLengthInfo is extracted from point 0)
            result.LapInfo = this.Points[i].LapInfo;
            return(result);
        }
Beispiel #5
0
        public static IList <TrailGPSLocation> TrailGpsPointsFromSplits(IActivity activity, bool onlyActiveLaps)
        {
            TrailResultInfo          info   = TrailResultInfoFromSplits(activity, onlyActiveLaps);
            IList <TrailGPSLocation> result = new List <TrailGPSLocation>();

            foreach (TrailResultPoint t in info.Points)
            {
                result.Add(t);
            }
            return(result);
        }
Beispiel #6
0
        //Hide the handling slightly
        public TrailResultInfo Copy()
        {
            TrailResultInfo result = new TrailResultInfo(this.Activity, this.Reverse);

            result.m_DistDiff = this.m_DistDiff;
            result.LapInfo    = this.LapInfo;
            foreach (TrailResultPoint p in Points)
            {
                result.Points.Add(p);
            }
            return(result);
        }
Beispiel #7
0
 public int CompareTo(object obj)
 {
     if (obj is TrailResultInfo)
     {
         TrailResultInfo t = obj as TrailResultInfo;
         if (this.DistDiff == t.DistDiff)
         {
             return(0);
         }
         return(this.DistDiff < t.DistDiff ? -1 : 1);
     }
     return(-1);
 }
Beispiel #8
0
        static public TrailResultInfo ResultInfoFromSelection(IActivity activity, ZoneFiveSoftware.Common.Visuals.Fitness.IItemTrackSelectionInfo selInfo)
        {
            TrailResultInfo indexes = new TrailResultInfo(activity, false);
            DateTime        time    = selInfo.MarkedTimes[0].Lower;
            IGPSPoint       p       = Utils.TrackUtil.getGpsLoc(activity, time);

            if (p != null)
            {
                indexes.Points.Add(new TrailResultPoint(new TrailGPSLocation(p), time));
            }
            time = selInfo.MarkedTimes[0].Upper;
            p    = Utils.TrackUtil.getGpsLoc(activity, time);
            if (p != null)
            {
                indexes.Points.Add(new TrailResultPoint(new TrailGPSLocation(p), time));
            }
            return(indexes);
        }
Beispiel #9
0
        public TrailResultInfo CopyFromReference(IActivity activity)
        {
            TrailResultInfo result = new TrailResultInfo(activity, this.Reverse);

            foreach (TrailResultPoint p in Points)
            {
                TrailGPSLocation loc;
                ZoneFiveSoftware.Common.Data.GPS.IGPSPoint t = Utils.TrackUtil.getGpsLoc(activity, p.Time);
                if (t != null)
                {
                    loc = new TrailGPSLocation(t, p.Name, p.Required);
                }
                else
                {
                    loc = new TrailGPSLocation(p.Name, p.Required);
                }

                TrailResultPoint p2 = new TrailResultPoint(p, loc);
                p2.LapInfo        = null;
                p2.PoolLengthInfo = null;
                result.Points.Add(p2);
            }
            return(result);
        }
Beispiel #10
0
        public IList <ChildTrailResult> getChildren()
        {
            IList <ChildTrailResult> splits = new List <ChildTrailResult>();

            if (this.m_subResultInfo.Count > 1)
            {
                int i;                 //start time index
                int subChildIndex = 1; //Swim sub index
                for (i = 0; i < m_subResultInfo.Count - 1; i++)
                {
                    if (m_subResultInfo.Points[i].Time != DateTime.MinValue &&
                        (m_subResultInfo.Points[i].Required || !Data.Settings.NonReqIsPause))
                    {
                        int j; //end time index
                        for (j = i + 1; j < m_subResultInfo.Points.Count; j++)
                        {
                            if (m_subResultInfo.Points[j].Time != DateTime.MinValue)
                            {
                                break;
                            }
                        }
                        if (this.m_subResultInfo.Count > i &&
                            this.m_subResultInfo.Count > j)
                        {
                            if (m_subResultInfo.Points[j].Time != DateTime.MinValue)
                            {
                                TrailResultInfo indexes    = m_subResultInfo.CopyToChild(i, j);
                                int             childIndex = i + 1;
                                if (m_subResultInfo.Points[i].Order >= 0)
                                {
                                    childIndex = m_subResultInfo.Points[i].Order;
                                }
                                ChildTrailResult ctr = new NormalChildTrailResult(this, childIndex, indexes);
                                //Note: paused results may be added, no limit for childresults
                                TimeSpan duration = ZoneFiveSoftware.Common.Data.Algorithm.DateTimeRangeSeries.TimeNotPaused(ctr.StartTime, ctr.EndTime, this.Pauses);
                                if (duration > TimeSpan.FromSeconds(3) && this.OverlapRef == null ||
                                    duration > TimeSpan.FromSeconds(20))
                                {
                                    splits.Add(ctr);
                                    if (m_subResultInfo.Points[i].SubPoints.Count > 1)
                                    {
                                        TrailResultInfo indexes2 = m_subResultInfo.Copy();
                                        for (int k = 0; k < m_subResultInfo.Points[i].SubPoints.Count - 1; k++)
                                        {
                                            indexes2.Points.Clear();
                                            indexes2.Points.Add(m_subResultInfo.Points[i].SubPoints[k]);
                                            indexes2.Points.Add(m_subResultInfo.Points[i].SubPoints[k + 1]);
                                            ChildTrailResult sub = new SubChildTrailResult(ctr, subChildIndex++, indexes2);
                                        }
                                    }
                                }
                            }
                        }
                        i = j - 1;//Next index to try
                    }
                }
                if (Data.Settings.ShowPausesAsResults)
                {
                    int lastNormalSplit = -1;
                    for (int j = 0; j < splits.Count; j++)
                    {
                        if (splits[j] is PausedChildTrailResult)
                        {
                            //All normal splits checked
                            break;
                        }
                        lastNormalSplit = j;
                    }

                    addPausesAsResults(splits, lastNormalSplit, this.TimerPauses, PauseType.Timer);
                    addPausesAsResults(splits, lastNormalSplit, this.LapPauses, PauseType.RestLap);
                    addPausesAsResults(splits, lastNormalSplit, this.NonRequiredPauses, PauseType.NonReqPoint);
                    addPausesAsResults(splits, lastNormalSplit, this.StoppedPauses, PauseType.Stopped);
                }
                TimeSpan sp = TimeSpan.Zero;
                bool     ok = true;
                foreach (ChildTrailResult ctr in splits)
                {
                    if (ctr.DurationIsNull())
                    {
                        ok = false;
                        break;
                    }
                    if (!(ctr is PausedChildTrailResult))
                    {
                        sp = sp.Add(ctr.Duration);
                    }
                }
                if (ok)
                {
                    this.m_duration = sp;
                }
            }
            //Only one subresult is not shown, add pool length to main result
            if (splits.Count <= 1 && this.SubResultInfo.Points.Count > 0)
            {
                this.m_PoolLengthInfo = this.SubResultInfo.Points[0].PoolLengthInfo;
            }
            return(splits);
        }
Beispiel #11
0
 protected ParentTrailResult(ActivityTrail activityTrail, int order, TrailResultInfo indexes, float distDiff) :
     base(activityTrail, order, indexes, distDiff)
 {
 }
Beispiel #12
0
 public HighScoreParentTrailResult(ActivityTrail activityTrail, int order, TrailResultInfo indexes, string toolTip)
     : base(activityTrail, order, indexes, 0)
 {
     this.m_toolTip = toolTip;
     this.UpdateIndexes(indexes);
 }
Beispiel #13
0
 public SplitsParentTrailResult(ActivityTrail activityTrail, int order, TrailResultInfo indexes) :
     base(activityTrail, order, indexes, 0)
 {
     this.UpdateIndexes(indexes);
 }
Beispiel #14
0
 //Normal TrailResult
 public PositionParentTrailResult(ActivityTrail activityTrail, int order, TrailResultInfo indexes, float distDiff, bool reverse)
     : base(activityTrail, order, indexes, distDiff)
 {
     this.m_reverse = reverse;
     this.UpdateIndexes(indexes);
 }
Beispiel #15
0
 public PausedChildTrailResult(ParentTrailResult par, ChildTrailResult ctr, int order, TrailResultInfo indexes, PauseType pauseType) :
     base(par, order, indexes, 0)
 {
     this.RelatedChildResult = ctr;
     this.pauseType          = pauseType;
 }
Beispiel #16
0
        public static TrailResultInfo TrailResultInfoFromSplits(IActivity activity, bool onlyActiveLaps)
        {
            TrailResultInfo results = new TrailResultInfo(activity, false);

            if (activity == null)
            {
                //summary result
                return(results);
            }

            //Get around a problem with only Rest laps
            if (onlyActiveLaps)
            {
                onlyActiveLaps = false;
                for (int j = 0; j < activity.Laps.Count; j++)
                {
                    if (!activity.Laps[j].Rest)
                    {
                        onlyActiveLaps = true;
                        break;
                    }
                }
            }

            bool lastIsRestlap = false;

            if (null == activity.Laps || 0 == activity.Laps.Count)
            {
                //Use MovingDistanceMetersTrack rather than ActualDistanceMetersTrack, assume similar activities have similar pauses/slow parts
                IDistanceDataTrack track = ActivityInfoCache.Instance.GetInfo(activity).MovingDistanceMetersTrack;
                if (track != null && track.Max > 0)
                {
                    //Create some kind of points - could be dependent on length
                    const float cDist = 1000;
                    float       dist  = 0;
                    while (dist < track.Max)
                    {
                        DateTime  time = track.GetTimeAtDistanceMeters(dist);
                        IGPSPoint p    = Utils.TrackUtil.getGpsLoc(activity, time);
                        if (p != null)
                        {
                            results.Points.Add(new TrailResultPoint(new TrailGPSLocation(p), time));
                        }
                        else
                        {
                            if (activity.GPSRoute == null || activity.GPSRoute.Count == 0)
                            {
                                results.Points.Add(new TrailResultPoint(new TrailGPSLocation(activity.Name, true), time, track.TotalElapsedSeconds));
                            }
                            else
                            {
                                System.Diagnostics.Debug.Assert(false, "out of GPS");
                                if (results.Points.Count > 0)
                                {
                                    //end insert
                                    break;
                                }
                            }
                        }
                        dist = Math.Min(track.Max, dist + cDist);
                    }
                }
                else
                {
                    DateTime  time = ActivityInfoCache.Instance.GetInfo(activity).ActualTrackStart;
                    IGPSPoint p    = Utils.TrackUtil.getGpsLoc(activity, time);
                    if (p != null)
                    {
                        results.Points.Add(new TrailResultPoint(new TrailGPSLocation(p), time));
                    }
                }
            }
            else
            {
                int subresultIndex = 1;
                for (int j = 0; j < activity.Laps.Count; j++)
                {
                    ILapInfo l = activity.Laps[j];
                    if (!onlyActiveLaps || !l.Rest || j > 0 && !activity.Laps[j - 1].Rest)
                    {
                        string name = l.Notes;
                        if (string.IsNullOrEmpty(name))
                        {
                            name = "#" + (results.Points.Count + 1);
                        }
                        DateTime d = l.StartTime;
                        if (activity.GPSRoute == null || activity.GPSRoute.Count == 0)
                        {
                            results.Points.Add(new TrailResultPoint(new TrailGPSLocation(name, !l.Rest), d, l.TotalTime, l));
                        }
                        else
                        {
                            IGPSPoint t = Utils.TrackUtil.getGpsLoc(activity, d);
                            if (t != null)
                            {
                                results.Points.Add(new TrailResultPoint(new TrailGPSLocation(t, name, !l.Rest), d, l.TotalTime, l));
                            }
                        }
                        if (//All swim related have at least one PoolLength for each lap
                            l.PoolLengths != null && (l.PoolLengths.Count > 0))
                        {
                            TrailResultPoint tp = results.Points[results.Points.Count - 1];
                            foreach (IPoolLengthInfo p in l.PoolLengths)
                            {
                                DateTime        d2 = p.StartTime;
                                IPoolLengthInfo p1 = PoolLengthInfo.GetPoolLength(p);
                                tp.SubPoints.Add(new TrailResultPoint(new TrailGPSLocation(null, !l.Rest), d2, p.TotalTime, p1, subresultIndex++));
                            }
                            //Need (dummy) last point
                            IPoolLengthInfo p2 = tp.SubPoints[tp.SubPoints.Count - 1].PoolLengthInfo;
                            tp.SubPoints.Add(new TrailResultPoint(new TrailGPSLocation(null, !l.Rest), p2.StartTime + p2.TotalTime, TimeSpan.Zero, p2, subresultIndex));
                        }
                    }
                }
                lastIsRestlap = activity.Laps[activity.Laps.Count - 1].Rest;
            }

            //Add end point, except if last is a rest lap (where last already is added)
            if (!onlyActiveLaps || !lastIsRestlap)
            {
                DateTime d = ActivityInfoCache.Instance.GetInfo(activity).ActualTrackEnd;
                if (activity.GPSRoute == null || activity.GPSRoute.Count == 0)
                {
                    results.Points.Add(new TrailResultPoint(new TrailGPSLocation(activity.Name, !lastIsRestlap), d));
                }
                else
                {
                    IGPSPoint t = Utils.TrackUtil.getGpsLoc(activity, d);
                    if (t != null)
                    {
                        results.Points.Add(new TrailResultPoint(new TrailGPSLocation(t, activity.Name, !lastIsRestlap), d));
                    }
                }
            }

            //Special for activities without any GPS info
            if (results.Count == 0 && activity.HasStartTime)
            {
                results.Points.Add(new TrailResultPoint(new TrailGPSLocation(activity.Name, true), activity.StartTime));
                results.Points.Add(new TrailResultPoint(new TrailGPSLocation(activity.Name, true), activity.StartTime + activity.TotalTimeEntered));
            }

            //A trail created from splits should not define elevation points
            foreach (TrailGPSLocation t in results.Points)
            {
                t.SetElevation(float.NaN);
            }

            return(results);
        }
Beispiel #17
0
 public SubChildTrailResult(ChildTrailResult par, int order, TrailResultInfo indexes) :
     base(par, order, indexes)
 {
     par.SubResults.Add(this);
 }
Beispiel #18
0
 public NormalChildTrailResult(ParentTrailResult par, int order, TrailResultInfo indexes) :
     base(par, order, indexes, indexes.DistDiff)
 {
 }
Beispiel #19
0
 public HighScoreChildTrailResult(HighScoreParentTrailResult par, int order, TrailResultInfo indexes, string tt) :
     base(par, order, indexes, 0)
 {
     this.m_toolTip    = tt;
     this.PartOfParent = false;
 }
Beispiel #20
0
 protected ChildTrailResult(ParentTrailResult par, int order, TrailResultInfo indexes, float distDiff) :
     base(par.ActivityTrail, order, indexes, distDiff)
 {
     UpdateIndexes(indexes);
     this.m_parentResult = par;
 }