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), activity.StartDate, 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;
		}
Esempio n. 2
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);
        }