Exemplo n.º 1
0
        public override async Task <ProcessTimeResponseMessage> ProcessTime(ProcessTimeRequestMessage request, ServerCallContext context)
        {
            var mediatorRequest  = new ProcessTimeQuery(request.Tracks.Select(x => convertTrack(x)).ToList(), request.StartTime.ToDateTime(), request.TrackSplits.Select(x => x.ToDateTime()).ToList());
            var mediatorResponse = await mediator.Send(mediatorRequest);

            var result = new ProcessTimeResponseMessage();

            result.Tracks.AddRange(mediatorResponse.Select(x => convertTimedTrack(x)));
            return(result);
        }
Exemplo n.º 2
0
        public Task <List <TimedTrack> > Handle(ProcessTimeQuery request, CancellationToken cancellationToken)
        {
            var _timedCoords = new List <LinearTimedTrack>();

            for (int i = 0; i < request.Splits.Count; i++)
            {
                LinearTimedTrack track = new LinearTimedTrack();
                track.StartTime = i == 0 ? request.Start : request.Splits[i - 1];
                track.EndTime   = request.Splits[i];
                track.AddRange(request.Tracks[i]);
                _timedCoords.Add(track);
            }

            List <TimedTrack> data = new List <TimedTrack>();

            foreach (var track in _timedCoords)
            {
                List <TimedCoord> timed = track.ConvertAll(x => new TimedCoord(x));
                var startUTC            = track.StartTime.ToUniversalTime();
                var endUTC = track.EndTime.ToUniversalTime();
                timed[0].Time = startUTC;
                timed[timed.Count - 1].Time = endUTC;
                TimeSpan fullTime = endUTC - startUTC;
                double   distance = Track.GetDistance(track);                                            //meters
                double   pace     = TimeSpan.FromSeconds(fullTime.TotalSeconds / distance).TotalSeconds; //pace per meter (seconds)
                double   lastPace = pace;
                for (int i = 0; i < timed.Count - 1; i++)
                {
                    double distanceToPoint = Track.GetDistance(timed.Take(i + 1).ToList());
                    double time            = distanceToPoint * pace;
                    timed[i].Time = startUTC.Add(TimeSpan.FromSeconds(time));
                }
                data.Add(new TimedTrack(timed));
            }

            return(Task.FromResult(data));
        }