-
Notifications
You must be signed in to change notification settings - Fork 2
/
OSActivityManagerProbe.m
146 lines (111 loc) · 4.59 KB
/
OSActivityManagerProbe.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
//
// OSActivityManagerProbe.m
// OpenSense
//
// Created by Albert Carter on 8/1/14.
// Copyright (c) 2014 Mathias Hansen. All rights reserved.
//
#import <CoreMotion/CoreMotion.h>
#import "OSActivityManagerProbe.h"
@implementation OSActivityManagerProbe{
NSTimer *sampleFrequencyTimer;
double sampleFrequency;
NSOperationQueue *activityQueue;
}
- (id) init{
self = [super init];
if (self){
// register this as the first step count sample
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[NSDate date] forKey:@"lastActivitySample"];
activityQueue = [[NSOperationQueue alloc] init];
activityQueue.maxConcurrentOperationCount = 1;
// get probe info from config.json
NSDictionary *configDict = [[OSConfiguration currentConfig] sampleFrequencyForProbe:[[self class] identifier]];
sampleFrequency = [[configDict objectForKey:@"frequency"] doubleValue]; // seconds between when the probe is started
}
return self;
}
+ (NSString*)name
{
return @"Activity manager";
}
+ (NSString *) identifier
{
return @"activitymanager";
}
+ (NSTimeInterval) defaultUpdateInterval
{
return kUpdateIntervalPush;
}
- (void) startProbe
{
// ensure that MotionActivity is supported
if ([CMMotionActivityManager isActivityAvailable] && [CMStepCounter isStepCountingAvailable]) {
[super startProbe];
[self saveData];
sampleFrequencyTimer = [NSTimer
scheduledTimerWithTimeInterval:sampleFrequency target:self selector:@selector(saveData) userInfo:nil repeats:YES];
} else {
nil;
};
}
- (void) stopProbe
{
if (sampleFrequencyTimer){
[sampleFrequencyTimer invalidate];
sampleFrequencyTimer = nil;
}
[super stopProbe];
}
#pragma mark - frequency related methods
- (void) saveData
{
// override superclass, because save data is irrelevent if activity isn't avaialble in device
if ([CMMotionActivityManager isActivityAvailable] && [CMStepCounter isStepCountingAvailable]){
[super saveData];
}
}
- (NSDictionary *) sendData
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDate *lastSampleDate = [defaults objectForKey:@"lastActivitySample"];
NSDate *now = [NSDate date];
CMMotionActivityManager *cm = [[CMMotionActivityManager alloc] init];
CMStepCounter *sc = [[CMStepCounter alloc] init];
// declare some variables accessible outside of the block
__block NSDictionary *point = [NSDictionary alloc];
__block NSMutableDictionary *data = [[NSMutableDictionary alloc] init];
__block NSMutableArray *arr = [[NSMutableArray alloc] init];
[cm queryActivityStartingFromDate:lastSampleDate toDate:now toQueue:activityQueue withHandler:^(NSArray *activities, NSError *error){
// for each returned activity
for(int i=0;i<[activities count]-1;i++) {
CMMotionActivity *a = [activities objectAtIndex:i];
NSDate *startDate = a.startDate;
NSDate *endDate = [[activities objectAtIndex:i+1] startDate];
NSString *activityString = @"unknown";
if (a.running) activityString = @"running";
else if (a.walking) activityString = @"walking";
else if (a.automotive) activityString = @"automotive";
else if (a.stationary) activityString = @"stationary";
NSString *confidenceString = @"low";
if (a.confidence == CMMotionActivityConfidenceMedium) confidenceString = @"medium";
else if (a.confidence == CMMotionActivityConfidenceHigh) confidenceString = @"high";
// find stepCounts for that activity
[sc queryStepCountStartingFrom:startDate to:endDate toQueue:activityQueue withHandler:^(NSInteger numberOfSteps, NSError *error) {
NSNumber *steps = [[NSNumber alloc] initWithInteger:numberOfSteps];
point = [point initWithObjectsAndKeys:
activityString, @"activity",
confidenceString, @"confidence",
steps, @"steps",
startDate, @"startDate",
endDate, @"endDate",
nil];
[arr addObject:point];
}];
[data setObject:arr forKey:@"activityLog"];
}
}];
return data;
}
@end