Esempio n. 1
0
 public ActivityDatum(DateTimeOffset timestamp, Activities activity, ActivityPhase phase, ActivityState state, ActivityConfidence confidence)
     : base(timestamp)
 {
     Activity   = activity;
     Phase      = phase;
     State      = state;
     Confidence = confidence;
 }
Esempio n. 2
0
        protected override async Task <List <Datum> > PollAsync(CancellationToken cancellationToken)
        {
            List <Datum> data = new List <Datum>();

            // if this is the first poll (no existing query start time), set the query start time to the current time. we
            // used to set this to the maximally previous time per ios documentation (7 days), but this (1) causes issues
            // when triggering surveys on the basis of these activities (there might be hundreds of activities within the
            // past 7 days), and it also runs counter to the user's expectations that data will only be collected from the
            // time at which they have enrolled in the study and not from times prior.
            if (_queryStartTime == null)
            {
                _queryStartTime = DateTimeOffset.UtcNow;
            }

            await SensusContext.Current.MainThreadSynchronizer.ExecuteThreadSafe(async() =>
            {
                try
                {
                    CMMotionActivityManager activityManager = new CMMotionActivityManager();

                    CMMotionActivity[] activities = await activityManager.QueryActivityAsync(_queryStartTime.Value.UtcDateTime.ToNSDate(), NSDate.Now, NSOperationQueue.CurrentQueue);

                    // process each activity, keeping track of most recent
                    NSDate mostRecentActivityStartTime = null;
                    foreach (CMMotionActivity activity in activities)
                    {
                        DateTimeOffset timestamp = new DateTimeOffset(activity.StartDate.ToDateTime(), TimeSpan.Zero);

                        #region get confidence
                        ActivityConfidence confidence = ActivityConfidence.NotAvailable;

                        if (activity.Confidence == CMMotionActivityConfidence.Low)
                        {
                            confidence = ActivityConfidence.Low;
                        }
                        else if (activity.Confidence == CMMotionActivityConfidence.Medium)
                        {
                            confidence = ActivityConfidence.Medium;
                        }
                        else if (activity.Confidence == CMMotionActivityConfidence.High)
                        {
                            confidence = ActivityConfidence.High;
                        }
                        else
                        {
                            SensusException.Report("Unrecognized confidence:  " + activity.Confidence);
                        }
                        #endregion

                        #region get activities
                        Action <Activities> AddActivityDatum = activityType =>
                        {
                            ActivityDatum activityDatum = new ActivityDatum(timestamp, activityType, ActivityPhase.Starting, ActivityState.Active, confidence);
                            data.Add(activityDatum);
                        };

                        if (activity.Stationary)
                        {
                            AddActivityDatum(Activities.Still);
                        }

                        if (activity.Walking)
                        {
                            AddActivityDatum(Activities.Walking);
                        }

                        if (activity.Running)
                        {
                            AddActivityDatum(Activities.Running);
                        }

                        if (activity.Automotive)
                        {
                            AddActivityDatum(Activities.InVehicle);
                        }

                        if (activity.Cycling)
                        {
                            AddActivityDatum(Activities.OnBicycle);
                        }

                        if (activity.Unknown)
                        {
                            AddActivityDatum(Activities.Unknown);
                        }
                        #endregion

                        if (mostRecentActivityStartTime == null)
                        {
                            mostRecentActivityStartTime = activity.StartDate;
                        }
                        else
                        {
                            mostRecentActivityStartTime = mostRecentActivityStartTime.LaterDate(activity.StartDate);
                        }
                    }

                    // set the next query start time one second after the most recent activity's start time
                    if (mostRecentActivityStartTime != null)
                    {
                        _queryStartTime = new DateTime(mostRecentActivityStartTime.ToDateTime().Ticks, DateTimeKind.Utc).AddSeconds(1);
                    }
                }
                catch (Exception ex)
                {
                    SensusServiceHelper.Get().Logger.Log("Exception while querying activities:  " + ex, LoggingLevel.Normal, GetType());
                }
            });

            // let the system know that we polled but didn't get any data
            if (data.Count == 0)
            {
                data.Add(null);
            }

            return(data);
        }