Updated Branches: refs/heads/2.9.x 59190bd53 -> 764d74fed
CB-5189 - ios - Backport of v2.9.1 from CB-4825, CB-5035 (Device Motion / Accelerometer) Project: http://git-wip-us.apache.org/repos/asf/cordova-ios/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-ios/commit/764d74fe Tree: http://git-wip-us.apache.org/repos/asf/cordova-ios/tree/764d74fe Diff: http://git-wip-us.apache.org/repos/asf/cordova-ios/diff/764d74fe Branch: refs/heads/2.9.x Commit: 764d74fedf920077ddc93ce02d7ca7b11df31ea5 Parents: 59190bd Author: Shazron Abdullah <[email protected]> Authored: Wed Oct 23 17:45:40 2013 -0700 Committer: Shazron Abdullah <[email protected]> Committed: Wed Oct 23 17:45:40 2013 -0700 ---------------------------------------------------------------------- CordovaLib/Classes/CDVAccelerometer.h | 4 +- CordovaLib/Classes/CDVAccelerometer.m | 66 +++++++++++++++++------------- 2 files changed, 40 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/764d74fe/CordovaLib/Classes/CDVAccelerometer.h ---------------------------------------------------------------------- diff --git a/CordovaLib/Classes/CDVAccelerometer.h b/CordovaLib/Classes/CDVAccelerometer.h old mode 100644 new mode 100755 index 044ca53..ee1664f --- a/CordovaLib/Classes/CDVAccelerometer.h +++ b/CordovaLib/Classes/CDVAccelerometer.h @@ -18,9 +18,9 @@ */ #import <UIKit/UIKit.h> -#import "CDVPlugin.h" +#import <Cordova/CDVPlugin.h> -@interface CDVAccelerometer : CDVPlugin <UIAccelerometerDelegate> +@interface CDVAccelerometer : CDVPlugin { double x; double y; http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/764d74fe/CordovaLib/Classes/CDVAccelerometer.m ---------------------------------------------------------------------- diff --git a/CordovaLib/Classes/CDVAccelerometer.m b/CordovaLib/Classes/CDVAccelerometer.m old mode 100644 new mode 100755 index 33093d0..e98aacd --- a/CordovaLib/Classes/CDVAccelerometer.m +++ b/CordovaLib/Classes/CDVAccelerometer.m @@ -17,10 +17,13 @@ under the License. */ +#import <CoreMotion/CoreMotion.h> #import "CDVAccelerometer.h" @interface CDVAccelerometer () {} @property (readwrite, assign) BOOL isRunning; +@property (readwrite, assign) BOOL haveReturnedResult; +@property (readwrite, strong) CMMotionManager* motionManager; @end @implementation CDVAccelerometer @@ -28,7 +31,7 @@ @synthesize callbackId, isRunning; // defaults to 10 msec -#define kAccelerometerInterval 40 +#define kAccelerometerInterval 10 // g constant: -9.81 m/s^2 #define kGravitationalConstant -9.81 @@ -42,6 +45,8 @@ timestamp = 0; self.callbackId = nil; self.isRunning = NO; + self.haveReturnedResult = YES; + self.motionManager = nil; } return self; } @@ -53,17 +58,31 @@ - (void)start:(CDVInvokedUrlCommand*)command { - NSString* cbId = command.callbackId; - NSTimeInterval desiredFrequency_num = kAccelerometerInterval; - UIAccelerometer* pAccel = [UIAccelerometer sharedAccelerometer]; - - // accelerometer expects fractional seconds, but we have msecs - pAccel.updateInterval = desiredFrequency_num / 1000; - self.callbackId = cbId; - if (!self.isRunning) { - pAccel.delegate = self; - self.isRunning = YES; + self.haveReturnedResult = NO; + self.callbackId = command.callbackId; + + if (!self.motionManager) + { + self.motionManager = [[CMMotionManager alloc] init]; + } + + if ([self.motionManager isAccelerometerAvailable] == YES) { + // Assign the update interval to the motion manager and start updates + [self.motionManager setAccelerometerUpdateInterval:kAccelerometerInterval/1000]; // expected in seconds + __weak CDVAccelerometer* weakSelf = self; + [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { + x = accelerometerData.acceleration.x; + y = accelerometerData.acceleration.y; + z = accelerometerData.acceleration.z; + timestamp = ([[NSDate date] timeIntervalSince1970] * 1000); + [weakSelf returnAccelInfo]; + }]; + + if (!self.isRunning) { + self.isRunning = YES; + } } + } - (void)onReset @@ -73,24 +92,14 @@ - (void)stop:(CDVInvokedUrlCommand*)command { - UIAccelerometer* theAccelerometer = [UIAccelerometer sharedAccelerometer]; - - theAccelerometer.delegate = nil; - self.isRunning = NO; -} - -/** - * Picks up accel updates from device and stores them in this class - */ -- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration -{ - if (self.isRunning) { - x = acceleration.x; - y = acceleration.y; - z = acceleration.z; - timestamp = ([[NSDate date] timeIntervalSince1970] * 1000); - [self returnAccelInfo]; + if ([self.motionManager isAccelerometerAvailable] == YES) { + if (self.haveReturnedResult == NO){ + // block has not fired before stop was called, return whatever result we currently have + [self returnAccelInfo]; + } + [self.motionManager stopAccelerometerUpdates]; } + self.isRunning = NO; } - (void)returnAccelInfo @@ -106,6 +115,7 @@ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:accelProps]; [result setKeepCallback:[NSNumber numberWithBool:YES]]; [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; + self.haveReturnedResult = YES; } // TODO: Consider using filtering to isolate instantaneous data vs. gravity data -jm
