コード例 #1
0
        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);
        }
コード例 #2
0
 public static bool IsNaN(this SharpGeo.Position pos)
 {
     return(float.IsNaN(pos.Longitude) || float.IsNaN(pos.Latitude) || float.IsNaN(pos.Altitude));
 }