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

Reply via email to