public void StartMotionUpdates(Action <ActivityType> handler) { motionActivityMgr.StartActivityUpdates(NSOperationQueue.MainQueue, ((activity) => { handler(ActivityDataManager.ActivityToType(activity)); })); }
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); }