public async Task <MemoryActivity> DownloadAsync(IActivitySummary activity) { var stravaActivity = activity as StravaActivitySummary; if (stravaActivity != null) // only Strava activity can be downloaded { var streams = await _client.Activities.GetActivityStreams(stravaActivity.Activity, StreamType.Time, StreamType.LatLng, StreamType.Watts, StreamType.HeartRate, StreamType.Cadence, StreamType.VelocitySmooth, StreamType.Altitude, StreamType.Moving); Debug.WriteLine("Memory allocated for downlading: " + FileHelper.GetSizeString(GC.GetTotalMemory(false))); // determine what streams we have StravaSharp.Stream timeStream = null, posStream = null, hrStream = null, speedStream = null, powerStream = null, cadenceStream = null, altitudeStream = null, movingStream = null; foreach (var stream in streams) { if (stream.Type == StreamType.Time) { timeStream = stream; } else if (stream.Type == StreamType.HeartRate) { hrStream = stream; } else if (stream.Type == StreamType.LatLng) { posStream = stream; } else if (stream.Type == StreamType.VelocitySmooth) { speedStream = stream; } else if (stream.Type == StreamType.Cadence) { cadenceStream = stream; } else if (stream.Type == StreamType.Watts) { powerStream = stream; } else if (stream.Type == StreamType.Altitude) { altitudeStream = stream; } else if (stream.Type == StreamType.Moving) { movingStream = stream; } Log.Diagnostics("{0} stream length: {1}", stream.Type, stream.Data.Length); } return(await Task.Run <MemoryActivity>(() => { // build activity from the streams' frames // pauses are not recognized this way var isMoving = false; var destActivity = new MemoryActivity { Sport = stravaActivity.Sport, Name = stravaActivity.Name }; DateTime startDate = stravaActivity.Activity.StartDate; for (int i = 0; i < streams[0].Data.Length; i++) { var timeFrame = new ActivityTimeFrame(); timeFrame.Timestamp = startDate.AddSeconds(Convert.ToInt32(timeStream.Data[i])); var moving = Convert.ToBoolean(movingStream.Data[i]); if (isMoving && !moving) { // now stops timeFrame.Type = ActivityTimeFrameType.Stop; destActivity.AddTimeFrame(timeFrame); isMoving = false; continue; } else if (!isMoving && moving) { // now starts moving again timeFrame.Type = ActivityTimeFrameType.Start; destActivity.AddTimeFrame(timeFrame); isMoving = true; } else if (!isMoving && !moving) { continue; // still standing } if (hrStream != null) { timeFrame.HeartRate = Convert.ToByte(hrStream.Data[i]); } if (posStream != null) { // position is json array var pos = posStream.Data[i] as JArray; if (pos != null) { var p = new SharpGeo.Position(); p.Latitude = pos[0].ToObject <float>(); p.Longitude = pos[1].ToObject <float>(); if (altitudeStream != null) { p.Altitude = Convert.ToSingle(altitudeStream.Data[i]); } timeFrame.Position = p; } } if (speedStream != null) { timeFrame.Speed = new Speed(Convert.ToSingle(speedStream.Data[i]), SpeedUnit.MeterPerSecond); } if (cadenceStream != null) { timeFrame.Cadence = Convert.ToByte(cadenceStream.Data[i]); } if (powerStream != null) { timeFrame.Power = Convert.ToUInt16(powerStream.Data[i]); } destActivity.AddTimeFrame(timeFrame); } var summary = new Models.ActivitySummary(); summary.ElapsedTime = stravaActivity.ElapsedTime; summary.MovingTime = stravaActivity.MovingTime; summary.Sport = stravaActivity.Sport; summary.AvgSpeed = stravaActivity.AvgSpeed; summary.MaxSpeed = stravaActivity.MaxSpeed; summary.AvgHeartRate = stravaActivity.AvgHeartRate; summary.MaxHeartRate = stravaActivity.MaxHeartRate; summary.AvgCadence = stravaActivity.AvgCadence; summary.MaxCadence = stravaActivity.MaxCadence; if (stravaActivity.HasRealPowerData) { summary.AvgPower = stravaActivity.AvgPower; summary.MaxPower = stravaActivity.MaxPower; } summary.Ascent = stravaActivity.Ascent; summary.Descent = stravaActivity.Descent; destActivity.SetSummary(summary); return destActivity; })); } return(null); }
public static bool IsNaN(this SharpGeo.Position pos) { return(float.IsNaN(pos.Longitude) || float.IsNaN(pos.Latitude) || float.IsNaN(pos.Altitude)); }