Example #1
0
        /***************************************************/

        internal static void removePause(IValueRangeSeries <DateTime> pauses, DateTime startTime, DateTime endTime)
        {
            for (int i = 0; i < pauses.Count;)
            {
                IValueRange <DateTime> t = pauses[i];
                if (t.Lower < startTime && startTime <= t.Upper)
                {
                    pauses.RemoveAt(i);
                    if (endTime < t.Upper)
                    {
                        IValueRange <DateTime> t2 = new ValueRange <DateTime>(endTime, t.Upper);
                        pauses.Add(t2);
                    }
                }
                else if (t.Lower < endTime && endTime <= t.Upper)
                {
                    pauses.RemoveAt(i);
                    IValueRange <DateTime> t2 = new ValueRange <DateTime>(startTime, t.Lower);
                    pauses.Add(t2);
                }
                else
                {
                    i++;
                }
            }
        }
Example #2
0
 public InsertValues(DateTime startTime, DateTime endTime, IValueRangeSeries <DateTime> pauses)
 {
     this.startTime = startTime;
     this.endTime   = endTime;
     this.pauses    = pauses;
     this.points    = null;
 }
        //Exclude the pauses from the selection
        public static IValueRangeSeries <DateTime> excludePauses(IValueRangeSeries <DateTime> sels, IValueRangeSeries <DateTime> pauses)
        {
            IValueRangeSeries <DateTime> t = new ValueRangeSeries <DateTime>();

            foreach (IValueRange <DateTime> tsel in sels)
            {
                foreach (IValueRange <DateTime> t1 in DateTimeRangeSeries.TimesNotPaused(
                             tsel.Lower, tsel.Upper, pauses))
                {
                    t.Add(t1);
                }
            }
            return(t);
        }
        public static IList <IList <IGPSPoint> > GpsPoints(IGPSRoute gpsRoute, IValueRangeSeries <DateTime> selections)
        {
            IList <IList <IGPSPoint> > result = new List <IList <IGPSPoint> >();

            if (selections != null && selections.Count > 0 && gpsRoute != null && gpsRoute.Count > 1)
            {
                //selection and gps points are sorted without overlap so traverse over gps points only once
                //(previous version had much more complicated version, that also accounted for pauses)
                int i = 0;
                foreach (IValueRange <DateTime> sel in selections)
                {
                    IList <IGPSPoint> track = new List <IGPSPoint>();
                    //Use start/end "with priority", even if extra points are added. Care needed if returning GPSRoute
                    DateTime t = DateTimeRangeSeries.Latest(sel.Lower, gpsRoute.StartTime);
                    ITimeValueEntry <IGPSPoint> pt = gpsRoute.GetInterpolatedValue(t);
                    if (pt != null)
                    {
                        track.Add(pt.Value);
                    }
                    while (i < gpsRoute.Count)
                    {
                        ITimeValueEntry <IGPSPoint> entry = gpsRoute[i];
                        DateTime time = gpsRoute.EntryDateTime(entry);
                        i++;
                        if (sel.Lower > time)
                        {
                            continue;
                        }
                        if (sel.Upper < time)
                        {
                            //Do not increase counter here, it could be needed
                            i--;
                            break;
                        }
                        track.Add(entry.Value);
                    }
                    t  = DateTimeRangeSeries.Earliest(sel.Upper, gpsRoute.StartTime.AddSeconds(gpsRoute.TotalElapsedSeconds));
                    pt = gpsRoute.GetInterpolatedValue(t);
                    if (pt != null)
                    {
                        track.Add(pt.Value);
                    }
                    result.Add(track);
                }
            }

            return(result);
        }
        //ST IsPaused reports no pause if time matches, this also checks borders
        private static bool IsPause(DateTime time, IValueRangeSeries <DateTime> pauses)
        {
            bool res = DateTimeRangeSeries.IsPaused(time, pauses);

            if (!res)
            {
                foreach (IValueRange <DateTime> pause in pauses)
                {
                    if (time.CompareTo(pause.Lower) >= 0 &&
                        time.CompareTo(pause.Upper) <= 0)
                    {
                        res = true;
                        break;
                    }
                }
            }
            return(res);
        }
Example #6
0
 public Result(Goal goal, IActivity activity, IValueRangeSeries<DateTime> pause,
     double domainStart, double domainEnd,
     double timeStart, double timeEnd, double meterStart, double meterEnd, double elevationStart,
     double elevationEnd, DateTime firstDate, DateTime endDate)
 {
     this.Goal = goal;
     this.DomainDiff = domainEnd - domainStart;
     this.Activity = activity;
     this.pause = pause;
     //this.TimeStart = timeStart;
     //this.TimeEnd = timeEnd;
     this.Seconds = timeEnd - timeStart;
     //this.MeterStart = meterStart;
     //this.MeterEnd = meterEnd;
     this.Meters = meterEnd - meterStart;
     //this.ElevationStart = elevationStart;
     //this.ElevationEnd = elevationEnd;
     this.Elevations = elevationEnd - elevationStart;
     this.DateStart = firstDate;
     this.DateEnd = endDate;
 }
Example #7
0
 public TrailResultMarked(TrailResult tr, IValueRangeSeries <DateTime> t)
 {
     this.trailResult         = tr;
     this.selInfo.MarkedTimes = TrailsItemTrackSelectionInfo.excludePauses(t, tr.Pauses);
     this.selInfo.Activity    = tr.Activity;
 }
Example #8
0
 internal static DateTime getFirstUnpausedTime(DateTime dateTime, bool isPause, IValueRangeSeries <DateTime> pauses, bool next)
 {
     if (isPause)
     {
         foreach (IValueRange <DateTime> pause in pauses)
         {
             if (dateTime.CompareTo(pause.Lower) >= 0 &&
                 dateTime.CompareTo(pause.Upper) <= 0)
             {
                 if (next)
                 {
                     dateTime = (pause.Upper);//.Add(TimeSpan.FromSeconds(1));
                 }
                 else if (pause.Lower > DateTime.MinValue)
                 {
                     dateTime = (pause.Lower);//.Add(TimeSpan.FromSeconds(-1));
                 }
                 break;
             }
         }
     }
     return(dateTime);
 }
Example #9
0
 internal static DateTime getFirstUnpausedTime(DateTime dateTime, IValueRangeSeries <DateTime> pauses, bool next)
 {
     return(getFirstUnpausedTime(dateTime, ZoneFiveSoftware.Common.Data.Algorithm.DateTimeRangeSeries.IsPaused(dateTime, pauses), pauses, next));
 }
Example #10
0
        private static void calculateActivity(IActivity activity, IValueRangeSeries<DateTime> pause, IList<Goal> goals, SortedList<Result, Result>[] results)
        {
            ActInfo act = new ActInfo(activity, pause, goals);
            foreach (Goal goal in goals)
            {
                Result result = null;
                if (Goal.IsZoneGoal(goal.Image))
                {
                    if (act.ZoneOk(goal))
                    {
                        result = calculateActivityZoneGoal(activity, (IntervalsGoal)goal, act,
                                            act.getGoalTrack(goal.Domain),
                                            act.getGoalZoneTrack(goal.Image));
                    }
                }
                else
                {
                    result = calculateActivityPointGoal(activity, (PointGoal)goal, act,
                                        act.getGoalTrack(goal.Domain),
                                        act.getGoalTrack(goal.Image));
                }

                if (result != null)
                {
                    //results array are referenced by goal index. (Could be dictionary)
                    int resultIndex = goals.IndexOf(goal);
                    if (results[resultIndex] == null)
                    {
                        results[resultIndex] = new SortedList<Result, Result>();
                    }
                    if (results[resultIndex].Count > 0 &&
                        results[resultIndex].Count >= goal.Order)
                    {
                        Result last = Result.LastResult(results[resultIndex]);
                        if (result.BetterResult(last))
                        {
                            results[resultIndex].Remove(last);
                        }
                    }
                    if (results[resultIndex].Count < goal.Order)
                    {
                        results[resultIndex].Add(result, result);
                    }
                }
            }
        }
Example #11
0
        public ActInfo(IActivity activity, IValueRangeSeries<DateTime> pauses, IList<Goal> goals)
        {
            this.Pauses = pauses;
            ActivityInfo info = ActivityInfoCache.Instance.GetInfo(activity);
            int increment = 5;

        //restart:
            {
                //TBD: The following is what consumes almost all CPU, what is slowing down
                IList<LapDetailInfo> laps = info.DistanceLapDetailInfo(20 + increment);
                int length = laps.Count + 1;

                aDateTime = new DateTime[length];
                aTime = new double[length];
                aDistance = new double[length];
                aElevation = new double[length];

                foreach (Goal goal in goals)
                {
                    if (goal.Image == GoalParameter.PulseZone ||
                        goal.Image == GoalParameter.PulseZoneSpeedZone)
                    {
                        if (info.SmoothedHeartRateTrack.Max > 0)
                        {
                            aPulse = new double[length];
                        }
                        break;
                    }
                }
                foreach (Goal goal in goals)
                {
                    if (goal.Image == GoalParameter.SpeedZone ||
                        goal.Image == GoalParameter.PulseZoneSpeedZone)
                    {
                        aSpeed = new double[length];
                        break;
                    }
                }

                DateTime dateTime = activity.StartTime;
                aDateTime[0] = dateTime;

                int index = 0;
                double timeOffset = 0;
                float distOffset = 0;
                foreach (LapDetailInfo lap in laps)
                {
                    dateTime = lap.EndTime;
                    if (ZoneFiveSoftware.Common.Data.Algorithm.DateTimeRangeSeries.IsPaused(lap.StartTime, pauses) ||
                        ZoneFiveSoftware.Common.Data.Algorithm.DateTimeRangeSeries.IsPaused(lap.EndTime, pauses))
                    {
                        //Adjust the extracted track info to pauses
                        timeOffset += lap.LapElapsed.TotalSeconds;
                        distOffset += lap.LapDistanceMeters;
                        //Skip this lap (only start checked)
                        continue;
                    }
                    if (index == 0)
                    {
                        //First point not yet valid, set 0 index
                        updateTracks(info, index, lap.StartTime, lap.StartElapsed.TotalSeconds - timeOffset, lap.StartDistanceMeters - distOffset);
                    }
                    index++;
                    
                    //Time and distance must be calculated in the same way, why the following will not work
                    //double elapsed = ZoneFiveSoftware.Common.Data.Algorithm.DateTimeRangeSeries.TimeNotPaused(aDateTime[0], dateTime, pauses).TotalSeconds;
                    updateTracks(info, index, dateTime, lap.EndElapsed.TotalSeconds - timeOffset, lap.EndDistanceMeters - distOffset);

                    //This section is no longer needed (was when elapsed was lap.EndElapsed.TotalSeconds?)
                    //if (aTime[index] < aTime[index - 1])
                    //{
                    //    aTime[index] = aTime[index - 1];
                    //    increment += 5;
                    //    goto restart;
                    //}
                }
                this.Length = index+1;
            }
        }
 //Note: IItemTrackSelectionInfo uses Activity distances, avoid...
 public TrailResultMarked(TrailResult tr, IValueRangeSeries<double> t)
 {
     trailResult = tr;
     selInfo.MarkedDistances = t;
 }
 public TrailResultMarked(TrailResult tr, IValueRangeSeries<DateTime> t)
 {
     trailResult = tr;
     selInfo.MarkedTimes = t;
     selInfo.Activity = tr.Activity;
 }
        public static IList<IList<IGPSPoint>> GpsPoints(IGPSRoute gpsRoute, IValueRangeSeries<DateTime> selections)
        {
            IList<IList<IGPSPoint>> result = new List<IList<IGPSPoint>>();

            if (selections != null && selections.Count > 0 && gpsRoute != null && gpsRoute.Count > 1)
            {
                //selection and gps points are sorted without overlap so traverse over gps points only once
                //(previous version had much more complicated version, that also accounted for pauses)
                int i = 0;
                foreach (IValueRange<DateTime> sel in selections)
                {
                    IList<IGPSPoint> track = new List<IGPSPoint>();
                    //Use start/end "with priority", even if extra points are added. Care needed if returning GPSRoute
                    DateTime t =  DateTimeRangeSeries.Latest(sel.Lower, gpsRoute.StartTime);
                    ITimeValueEntry<IGPSPoint> pt = gpsRoute.GetInterpolatedValue(t);
                    if (pt != null)
                    {
                        track.Add(pt.Value);
                    }
                    while (i < gpsRoute.Count)
                    {
                        ITimeValueEntry<IGPSPoint> entry = gpsRoute[i];
                        DateTime time = gpsRoute.EntryDateTime(entry);
                        i++;
                        if (sel.Lower > time)
                        {
                            continue;
                        }
                        if (sel.Upper < time)
                        {
                            //Do not increase counter here, it could be needed
                            i--;
                            break;
                        }
                        track.Add(entry.Value);
                    }
                    t = DateTimeRangeSeries.Earliest(sel.Upper, gpsRoute.StartTime.AddSeconds(gpsRoute.TotalElapsedSeconds));
                    pt = gpsRoute.GetInterpolatedValue(t);
                    if (pt != null)
                    {
                        track.Add(pt.Value);
                    }
                    result.Add(track);
                }
            }

            return result;
        }
 //ST IsPaused reports no pause if time matches, this also checks borders
 private static bool IsPause(DateTime time, IValueRangeSeries<DateTime> pauses)
 {
     bool res = DateTimeRangeSeries.IsPaused(time, pauses);
     if (!res)
     {
         foreach (IValueRange<DateTime> pause in pauses)
         {
             if (time.CompareTo(pause.Lower) >= 0 &&
                 time.CompareTo(pause.Upper) <= 0)
             {
                 res = true;
                 break;
             }
         }
     }
     return res;
 }
 //Exclude the pauses from the selection
 public static IValueRangeSeries<DateTime> excludePauses(IValueRangeSeries<DateTime> sels, IValueRangeSeries<DateTime> pauses)
 {
     IValueRangeSeries<DateTime> t = new ValueRangeSeries<DateTime>();
     foreach (IValueRange<DateTime> tsel in sels)
     {
         foreach (IValueRange<DateTime> t1 in DateTimeRangeSeries.TimesNotPaused(
             tsel.Lower, tsel.Upper, pauses))
         {
             t.Add(t1);
         }
     }
     return t;
 }