Ejemplo n.º 1
0
        private async Task <WalkingDataPointModel> QueryPedometerPeriodAsync(DateTime from, DateTime to)
        {
            try
            {
                var rawDataPoint = await pedometer.QueryPedometerDataAsync(from.ToNSDate(), to.ToNSDate());

                if (rawDataPoint.AverageActivePace != null)
                {
                    var start = rawDataPoint.StartDate.ToDateTime();
                    var end   = rawDataPoint.EndDate.ToDateTime();

                    var averagePace = rawDataPoint.AverageActivePace.FloatValue;
                    var distance    = rawDataPoint.Distance.FloatValue;
                    if (averagePace > 0)
                    {
                        //NOTE: This is for some reason measured in SECONDS / METER, so we flip it.
                        averagePace = 1 / averagePace;
                        return(new WalkingDataPointModel(start, end, averagePace));
                    }
                    else if (distance > 0)
                    {
                        averagePace = distance / (float)(end - start).TotalSeconds;
                        return(new WalkingDataPointModel(start, end, averagePace));
                    }
                }
            } catch (Exception e)
            {
#if DEBUG
                Debug.WriteLine("Failed to query pedometer datapoint {0}-{1}: {2}", from.ToLongTimeString(), to.ToLongTimeString(), e.Message);
#endif
            }
            return(null);
        }
Ejemplo n.º 2
0
        public Task RequestAccess()
        {
            var yesterday = NSDate.FromTimeIntervalSinceNow(-60 * 60 * 24);

            if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
            {
                if (!CMPedometer.IsStepCountingAvailable)
                {
                    return(Task.FromResult <object> (null));
                }

                return(pedometer.QueryPedometerDataAsync(yesterday, NSDate.Now)
                       .ContinueWith(PedometrQueryContinuation));
            }
            else
            {
                if (!motionManger.DeviceMotionAvailable)
                {
                    return(Task.FromResult <object> (null));
                }

                return(stepCounter.QueryStepCountAsync(yesterday, NSDate.Now, NSOperationQueue.MainQueue)
                       .ContinueWith(StepQueryContinuation));
            }
        }
Ejemplo n.º 3
0
        async Task <List <SignificantActivity> > aggregateSignificantActivitiesAsync(CMMotionActivity[] activities)
        {
            List <CMMotionActivity> filteredActivities = new List <CMMotionActivity> ();

            // Skip all contiguous unclassified actiivty so that only one remains.
            for (int i = 0; i < activities.Length; ++i)
            {
                CMMotionActivity activity = activities [i];
                filteredActivities.Add(activity);

                if (!activity.Walking && !activity.Running && !activity.Automotive)
                {
                    while (++i < activities.Length)
                    {
                        CMMotionActivity skipThisActivity = activities [i];
                        if (skipThisActivity.Walking || skipThisActivity.Running || skipThisActivity.Automotive)
                        {
                            i = i - 1;
                            break;
                        }
                    }
                }
            }

            // Ignore all low confidence activities.
            for (int i = 0; i < filteredActivities.Count;)
            {
                CMMotionActivity activity = filteredActivities [i];
                if (activity.Confidence == CMMotionActivityConfidence.Low)
                {
                    filteredActivities.RemoveAt(i);
                }
                else
                {
                    ++i;
                }
            }

            // Skip all unclassified activities if their duration is smaller than
            // some threshold.  This has the effect of coalescing the remaining med + high
            // confidence activies together.
            for (int i = 0; i < filteredActivities.Count - 1;)
            {
                CMMotionActivity activity     = filteredActivities [i];
                CMMotionActivity nextActivity = filteredActivities [i + 1];

                var duration = nextActivity.StartDate.SecondsSinceReferenceDate - activity.StartDate.SecondsSinceReferenceDate;

                if (duration < 60 * 3 && !activity.Walking && !activity.Running && !activity.Automotive)
                {
                    filteredActivities.RemoveAt(i);
                }
                else
                {
                    ++i;
                }
            }

            // Coalesce activities where they differ only in confidence.
            for (int i = 1; i < filteredActivities.Count;)
            {
                CMMotionActivity prevActivity = filteredActivities [i - 1];
                CMMotionActivity activity     = filteredActivities [i];

                if ((prevActivity.Walking && activity.Walking) ||
                    (prevActivity.Running && activity.Running) ||
                    (prevActivity.Automotive && activity.Automotive))
                {
                    filteredActivities.RemoveAt(i);
                }
                else
                {
                    ++i;
                }
            }

            // Finally transform into SignificantActivity;
            List <SignificantActivity> significantActivities = new List <SignificantActivity> ();

            for (int i = 0; i < filteredActivities.Count - 1; i++)
            {
                CMMotionActivity activity     = filteredActivities [i];
                CMMotionActivity nextActivity = filteredActivities [i + 1];

                if (!activity.Walking && !activity.Running && !activity.Automotive)
                {
                    continue;
                }

                var significantActivity = new SignificantActivity(ActivityDataManager.ActivityToType(activity), (DateTime)activity.StartDate, (DateTime)nextActivity.StartDate);

                try {
                    var pedometerData = await pedometer.QueryPedometerDataAsync(significantActivity.StartDate, significantActivity.EndDate);

                    significantActivity.StepCounts = pedometerData.NumberOfSteps.Int32Value;
                } catch {
                    Console.WriteLine("Error, unable to retrieve step counts for range {0}, {1}", significantActivity.StartDate.SecondsSinceReferenceDate, significantActivity.EndDate.SecondsSinceReferenceDate);
                }

                significantActivities.Add(significantActivity);
            }

            return(significantActivities);
        }