Exemple #1
0
        private MemoryActivity ParseActivity(FitnessActivitiesPastModel healthGraphActivity)
        {
            var activityDetails = new MemoryActivity();

            activityDetails.StartTime = healthGraphActivity.StartTime;
            activityDetails.Sport     = healthGraphActivity.Type.ToFitSport();

            // TODO: watch for other samples too!
            var numberOfTimeframes = healthGraphActivity.Path.Count;

            for (var i = 0; i < numberOfTimeframes; i++)
            {
                var timeFrame = new ActivityTimeFrame();
                timeFrame.Timestamp = activityDetails.StartTime.AddSeconds(healthGraphActivity.Distance[i].Timestamp);
                timeFrame.Position  = new Position((float)healthGraphActivity.Path[i].Longitude, (float)healthGraphActivity.Path[i].Latitude,
                                                   (float)healthGraphActivity.Path[i].Altitude);
                if (healthGraphActivity.HeartRate.Count > i)
                {
                    timeFrame.HeartRate = (byte)healthGraphActivity.HeartRate[i].HeartRate;
                }

                activityDetails.AddTimeFrame(timeFrame);
            }

            return(activityDetails);
        }
Exemple #2
0
 public ActivityImporter(MemoryActivity activity)
 {
     if (activity == null)
     {
         throw new ArgumentException("activity");
     }
     _activity = activity;
 }
Exemple #3
0
 private async Task SaveAsync(MemoryActivity activity, string fileName)
 {
     using (var output = await TestFileHelper.OpenForWriteAsync(fileName))
     {
         var exporter = new FitExporter(activity);
         await exporter.SaveAsync(output);
     }
 }
Exemple #4
0
 private async Task Export(MemoryActivity activity)
 {
     using (var output = await TestFileHelper.OpenForWriteAsync(GetExportedFileName()))
     {
         var exporter = new GpxExporter(activity);
         await exporter.SaveAsync(output);
     }
 }
        private void ExportReloadCheck(MemoryActivity activity)
        {
            var activityResult = ExportAndReload(activity);

            Assert.AreEqual(activity.StartTime, activityResult.StartTime);
            Assert.AreEqual(activity.ElapsedTime, activityResult.ElapsedTime);
            Assert.AreEqual(activity.Distance, activityResult.Distance);
            Assert.AreEqual(activity.AvgSpeed.GetValueAs(SpeedUnit.KilometerPerHour), activityResult.AvgSpeed.GetValueAs(SpeedUnit.KilometerPerHour), 0.1f);
        }
Exemple #6
0
 public async Task TcxImport()
 {
     using (var input = await TestFileHelper.OpenForReadAsync(_fileName))
     {
         var activity = new MemoryActivity();
         var importer = new TcxImporter(activity);
         importer.Load(input);
         Assert.IsTrue(activity.TimeFrames.Count > 0);
     }
 }
Exemple #7
0
        private async Task <MemoryActivity> LoadAsync(string fileName)
        {
            var activity = new MemoryActivity();

            using (var input = await TestFileHelper.OpenForReadAsync(fileName))
            {
                var importer = new FitImporter(activity);
                await importer.LoadAsync(input);
            }

            return(activity);
        }
Exemple #8
0
        /// <summary>
        /// Loads an <see cref="MemoryActivity"/> from a file
        /// </summary>
        /// <param name="fileName">Path of the file.</param>
        /// <param name="funcImporter">The importer to be created for loading the activity.</param>
        /// <returns>The imported <see cref="MemoryActivity"/>.</returns>
        protected async Task <MemoryActivity> LoadAsync(string fileName, Func <MemoryActivity, ActivityImporter> funcImporter)
        {
            var activity = new MemoryActivity();

            using (var input = await TestFileHelper.OpenForReadAsync(fileName))
            {
                var importer = funcImporter(activity);
                importer.Load(input);
            }

            return(activity);
        }
Exemple #9
0
        public async Task SmlImport()
        {
            var activity = new MemoryActivity();

            using (var input = await TestFileHelper.OpenForReadAsync(_fileName))
            {
                var importer = new SmlImporter(activity);
                await importer.LoadAsync(input);
            }

            Assert.True(activity.TimeFrames.Count > 0);
            Assert.AreEqual(70.263f, activity.Distance.GetValueAs(DistanceUnit.Kilometer), 0.1f);
        }
Exemple #10
0
        protected MemoryActivity ExportAndReload(MemoryActivity activity)
        {
            var exporter = new FitExporter(activity);
            var stream   = new MemoryStream();

            exporter.Save(stream);
            // reimport the activity
            stream.Seek(0, SeekOrigin.Begin);
            var activityReloaded = new MemoryActivity();
            var importer         = new FitImporter(activityReloaded);

            importer.Load(stream);
            return(importer.Activity);
        }
Exemple #11
0
        public async Task Recode()
        {
            var activity = new MemoryActivity();

            using (var input = await TestFileHelper.OpenForReadAsync(GetFileName("2015-10-31-100331.fit")))
            {
                var importer = new FitImporter(activity);
                importer.Load(input);
            }

            var activityRepaired = activity.Repair();

            Assert.AreEqual(26.092411, activityRepaired.AvgSpeed.GetValueAs(SpeedUnit.KilometerPerHour), 0.05);
        }
Exemple #12
0
 private async Task <MemoryActivity> Import(string fileName)
 {
     using (var input = await TestFileHelper.OpenForReadAsync(fileName))
     {
         var activity = new MemoryActivity();
         var importer = new GpxImporter(activity);
         importer.Load(input);
         //var exporter = new FitExporter(activity);
         //using (var output = await TestFileHelper.OpenForWriteAsync(_fileName + ".fit"))
         //{
         //    exporter.Save(output);
         //}
         return(activity);
     }
 }
Exemple #13
0
        public void AddMemoryActivity(DateTime timeStampUtc, long data)
        {
            var memoryActivity = new MemoryActivity
            {
                CommitSizeInBytes = data,
                EventTimeStamp    = timeStampUtc,
                Tenant            = _tenant
            };

            if (!_memoryActivities.TryAdd(memoryActivity))
            {
                _logger.LogWarning($"Buffer for holding memory activities is full with {_memoryActivities.Count} elements.Dropping current batch of memory activities");
                DrainActivities(_currentMemoryActivities, _memoryActivities);
            }
        }
Exemple #14
0
        public async Task Import()
        {
            var activity = new MemoryActivity();

            using (var input = await TestFileHelper.OpenForReadAsync(Test2FileName))
            {
                var importer = new FitImporter(activity);
                importer.MessageBroadcaster.SessionMesgEvent += (sender, args) =>
                {
                    var msg     = args.mesg as SessionMesg;
                    var summary = msg.ToSummary();
                };
                importer.Load(input);
                Assert.AreEqual(activity.AvgHeartRate, 153);
                Assert.AreEqual(activity.MaxHeartRate, 180);
            }
        }
Exemple #15
0
        public FitImporter(MemoryActivity activity)
            : base(activity)
        {
            Decoder            = new Decode();
            MessageBroadcaster = new MesgBroadcaster();

            // Connect the Broadcaster to our event (message) source (in this case the Decoder)
            Decoder.MesgEvent           += MessageBroadcaster.OnMesg;
            Decoder.MesgDefinitionEvent += MessageBroadcaster.OnMesgDefinition;

            // Subscribe to message events of interest by connecting to the Broadcaster
            MessageBroadcaster.SessionMesgEvent    += MessageBroadcaster_SessionMesgEvent;
            MessageBroadcaster.RecordMesgEvent     += MessageBroadcaster_RecordMesgEvent;
            MessageBroadcaster.EventMesgEvent      += MessageBroadcaster_EventMesgEvent;
            MessageBroadcaster.LapMesgEvent        += MessageBroadcaster_LapMesgEvent;
            MessageBroadcaster.DeviceInfoMesgEvent += MessageBroadcaster_DeviceInfoMesgEvent;
            MessageBroadcaster.FileIdMesgEvent     += MessageBroadcaster_FileIdMesgEvent;
        }
Exemple #16
0
        public async Task ImportCycling()
        {
            var activity = new MemoryActivity();

            using (var input = await TestFileHelper.OpenForReadAsync(Hrm106Cycling))
            {
                var importer = new HrmImporter(activity);
                importer.Load(input);
                Assert.AreEqual(Dynastream.Fit.Sport.Cycling, activity.Sport);
                Assert.AreEqual(new DateTime(2009, 05, 21, 06, 58, 41), activity.StartTime);
                Assert.AreNotEqual(0, activity.TimeFrames.Count);
                Assert.AreEqual(new TimeSpan(11, 59, 41).TotalSeconds, activity.ElapsedTime, 30); // treshold = 2 x recording interval
                Assert.AreEqual(239.1f, activity.Distance.GetValueAs(DistanceUnit.Kilometer), 0.1f);
                Assert.AreEqual(20.1f, activity.AvgSpeed.GetValueAs(SpeedUnit.KilometerPerHour), 0.1f);
                Assert.AreEqual(53.8f, activity.MaxSpeed.GetValueAs(SpeedUnit.KilometerPerHour), 0.1f);
                Assert.AreEqual(477, activity.TimeFrames[4].Altitude.Value.GetValueAs(DistanceUnit.Meter));
            }
            // now check exporting it
            ExportReloadCheck(activity);
        }
Exemple #17
0
        protected void Start(Stream source, int millisecondsDelay)
        {
            if (_task != null)
            {
                return;
            }

            _task = Task.Run(() =>
            {
                // import activity from GPX
                var activity = new MemoryActivity();
                var importer = new FitImporter(activity);
                importer.Load(source);
                // mock positions from the activity
                var moveCalculator = new MoveCalculator();
                while (true)
                {
                    foreach (var frame in activity.TimeFrames)
                    {
                        Task.Delay(millisecondsDelay).Wait(); // wait for 1 second
                        if (!_isConnected)
                        {
                            continue;
                        }

                        if (frame.Position.HasValue)
                        {
                            moveCalculator.Add(frame.Position.Value, TimeSpan.FromSeconds(1));
                            if (StatusChanged != null)
                            {
                                _status.Position = frame.Position.Value;
                                _status.Speed    = moveCalculator.CurrentSpeed;
                                var args         = new GeoLocatorStatusChangedEventArgs(_status);
                                StatusChanged(this, args);
                            }
                        }
                    }
                }
            });
            _task.ConfigureAwait(false);
        }
Exemple #18
0
        public override async Task <UploadStatus> UploadAsync(Stream source, UploadOptions options)
        {
            // TODO: UploadAsync should use MemoryActivity as a parameter instead of Stream
            var activity    = new MemoryActivity();
            var fitImporter = new FitImporter(activity);
            await fitImporter.LoadAsync(source);

            var activityToCreate = new FitnessActivitiesNewModel
            {
                StartTime        = activity.StartTime,
                AverageHeartRate = activity.AvgHeartRate,
                HeartRate        = new List <HeartRateModel>(),
                Path             = new List <PathModel>()
            };

            foreach (var timeFrame in activity.TimeFrames)
            {
                var timestamp = timeFrame.Timestamp.Subtract(activity.StartTime).TotalSeconds;
                var location  = timeFrame.Position.GetValueOrDefault(Position.Empty);

                activityToCreate.HeartRate.Add(new HeartRateModel
                {
                    HeartRate = timeFrame.HeartRate.GetValueOrDefault(),
                    Timestamp = timestamp
                });
                activityToCreate.Path.Add(new PathModel
                {
                    Timestamp = timestamp,
                    Altitude  = location.Altitude,
                    Longitude = location.Longitude,
                    Latitude  = location.Latitude,
                    Type      = "gps"
                });
            }

            var result = await _client.FitnessActivities.CreateActivity(activityToCreate);

            return(new HealthGraphUploadStatus {
                Status = result
            });
        }
Exemple #19
0
        public async Task ImportRunning()
        {
            var activity = new MemoryActivity();

            using (var input = await TestFileHelper.OpenForReadAsync(Hrm106Running))
            {
                var importer = new HrmImporter(activity);
                importer.Load(input);
                Assert.AreEqual(Dynastream.Fit.Sport.Running, activity.Sport);
                Assert.AreEqual(new DateTime(2007, 12, 31, 09, 05, 29), activity.StartTime);
                Assert.AreNotEqual(0, activity.TimeFrames.Count);
                Assert.AreEqual(new TimeSpan(03, 58, 59).TotalSeconds, activity.ElapsedTime, 30); // treshold = 2 x recording interval
                //Assert.AreEqual(135.6f, activity.Distance.GetValueAs(DistanceUnit.Kilometer), 0.1f);
                //Assert.AreEqual(26.9f, activity.AvgSpeed.GetValueAs(SpeedUnit.KilometerPerHour), 0.1f);
                //Assert.AreEqual(56.9f, activity.MaxSpeed.GetValueAs(SpeedUnit.KilometerPerHour), 0.1f);
                //Assert.AreEqual(94, activity.TimeFrames[3].Cadence.Value);
                //Assert.AreEqual(191, activity.TimeFrames[3].Altitude.Value.GetValueAs(DistanceUnit.Meter));
            }
            // now check exporting it
            ExportReloadCheck(activity);
        }
Exemple #20
0
        public async Task ImportCyclingPower()
        {
            var activity = new MemoryActivity();

            using (var input = await TestFileHelper.OpenForReadAsync(Hrm106CyclingPower))
            {
                var importer = new HrmImporter(activity);
                importer.Load(input);
                Assert.AreEqual(Dynastream.Fit.Sport.Cycling, activity.Sport);
                Assert.AreEqual(new DateTime(2009, 01, 03, 11, 54, 23), activity.StartTime);
                Assert.AreNotEqual(0, activity.TimeFrames.Count);
                Assert.AreEqual(new TimeSpan(02, 43, 30).TotalSeconds, activity.ElapsedTime, 30); // treshold = 2 x recording interval
                Assert.AreEqual(66.8f, activity.Distance.GetValueAs(DistanceUnit.Kilometer), 0.1f);
                Assert.AreEqual(25.3f, activity.AvgSpeed.GetValueAs(SpeedUnit.KilometerPerHour), 0.1f);
                Assert.AreEqual(51.8f, activity.MaxSpeed.GetValueAs(SpeedUnit.KilometerPerHour), 0.1f);
                Assert.True(activity.TimeFrames.Count > 3);
                Assert.AreEqual(66, activity.TimeFrames[3].Cadence.Value);
                Assert.AreEqual(174, activity.TimeFrames[3].Altitude.Value.GetValueAs(DistanceUnit.Meter));
                Assert.AreEqual(16, activity.TimeFrames[3].Power.Value);
            }
            // now check exporting it
            ExportReloadCheck(activity);
        }
Exemple #21
0
        public async Task <MemoryActivity> DownloadAsync(IActivitySummary activity)
        {
            if (_client == null)
            {
                return(null);
            }

            var pptActivity = activity as PPTActivitySummary;

            if (pptActivity == null)
            {
                return(null);
            }

            var         exercise = pptActivity.Exercise; // PolarPersonalTrainerLib model
            GpxExercise gpsData  = null;

            try
            {
                gpsData = await _client.GetGpsData(exercise);
            }
            catch (PPTException)
            {
                Log.Diagnostics("No GPS data found for activity {0}.", activity.Name);
            }

            return(await Task.Run <MemoryActivity>(() =>
            {
                var samples = new[]
                {
                    exercise.HeartRate.Values.Count,
                    exercise.CadenceValues.Count,
                    exercise.SpeedValues.Count
                };
                var samplesCount = samples.Max();     // number of samples
                var result = new MemoryActivity();
                DateTime timestamp = exercise.StartTime;
                // process samples
                for (int i = 0; i < samplesCount; i++)
                {
                    var timeFrame = new ActivityTimeFrame();
                    timeFrame.Timestamp = timestamp;
                    if (exercise.HeartRate.Values.Count > i)
                    {
                        timeFrame.HeartRate = exercise.HeartRate.Values[i];
                    }
                    if (exercise.CadenceValues.Count > i)
                    {
                        timeFrame.Cadence = exercise.CadenceValues[i];
                    }
                    if (exercise.SpeedValues.Count > i)
                    {
                        timeFrame.Speed = new Speed(exercise.SpeedValues[i], SpeedUnit.KilometerPerHour);
                    }
                    if (gpsData != null)
                    {
                        var trackPoint = gpsData.Track.GetTrackPoint(i);
                        if (trackPoint != null)
                        {
                            timeFrame.Position = new Position(Convert.ToSingle(trackPoint.Longitude),
                                                              Convert.ToSingle(trackPoint.Latitude),
                                                              Convert.ToSingle(trackPoint.Elevation));
                        }
                    }

                    result.AddTimeFrame(timeFrame);
                    timestamp = timestamp.AddSeconds(exercise.RecordingRate);     // time of next sample
                }
                var summary = ActivitySummary.FromActivity(pptActivity);
                result.SetSummary(summary);
                return result;
            }));
        }
Exemple #22
0
 public HrmImporter(MemoryActivity activity)
     : base(activity)
 {
 }
Exemple #23
0
 public TcxImporter(MemoryActivity activity)
     : base(activity)
 {
     Activity.Sport = Dynastream.Fit.Sport.Generic;
 }
Exemple #24
0
 public GpxImporter(MemoryActivity activity) : base(activity)
 {
 }
Exemple #25
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);
        }
Exemple #26
0
 public FitExporter(MemoryActivity activity)
     : base(activity)
 {
 }
 public ActivityExporter(MemoryActivity activity)
 {
     _activity = activity;
 }
Exemple #28
0
 /// <summary>
 /// Checks for common properties
 /// </summary>
 /// <param name="activity">Original activity.</param>
 /// <param name="strippedActivity">Stripped activity.</param>
 private void Check(MemoryActivity activity, MemoryActivity strippedActivity)
 {
     Assert.AreEqual(activity.Sport, strippedActivity.Sport);
     Assert.AreEqual(activity.Distance, strippedActivity.Distance);
     Assert.AreEqual(activity.ElapsedTime, strippedActivity.ElapsedTime);
 }
Exemple #29
0
 public SmlImporter(MemoryActivity activity) : base(activity)
 {
 }
Exemple #30
0
 public PolarXmlImporter(MemoryActivity activity)
     : base(activity)
 {
 }