Updated Branches: refs/heads/master 8866337a3 -> 2e8eff8d4
added iOS accelerometer code Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-device-motion/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-device-motion/commit/2e8eff8d Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-device-motion/tree/2e8eff8d Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-device-motion/diff/2e8eff8d Branch: refs/heads/master Commit: 2e8eff8d482c1f3eb9b5a6a76f32e56aab0a28fa Parents: 8866337 Author: hermwong <[email protected]> Authored: Tue Apr 23 16:28:56 2013 -0700 Committer: hermwong <[email protected]> Committed: Tue Apr 23 16:28:56 2013 -0700 ---------------------------------------------------------------------- plugin.xml | 22 ++++++- src/ios/CDVAccelerometer.h | 39 ++++++++++++ src/ios/CDVAccelerometer.m | 128 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 186 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-plugin-device-motion/blob/2e8eff8d/plugin.xml ---------------------------------------------------------------------- diff --git a/plugin.xml b/plugin.xml index 35b186a..6b83900 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,17 +1,33 @@ <?xml version="1.0" encoding="UTF-8"?> <plugin xmlns="http://www.phonegap.com/ns/plugins/1.0" -xmlns:android="http://schemas.android.com/apk/res/android" -id="org.apache.cordova.core"> + xmlns:android="http://schemas.android.com/apk/res/android" + id="org.apache.cordova.core" version="0.1.0"> + <name>Device Motion</name> <!-- android --> <platform name="android"> + <config-file target="res/xml/config.xml" parent="/cordova/plugins"> <plugin name="Accelerometer" value="org.apache.cordova.core.AccelListener"/> </config-file> <source-file src="AccelListener.java" target-dir="org/apache/cordova/core" /> - </platform> + + </platform> + + <!-- ios --> + <platform name="ios"> + + <config-file target="config.xml" parent="/cordova/plugins"> + <plugin name="Accelerometer" value="CDVAccelerometer"/> + </config-file> + + <header-file src="CDVAccelerometer.h" target-dir="org/apache/cordova/core" /> + <source-file src="CDVAccelerometer.m" target-dir="org/apache/cordova/core" /> + + </platform> + </plugin> http://git-wip-us.apache.org/repos/asf/cordova-plugin-device-motion/blob/2e8eff8d/src/ios/CDVAccelerometer.h ---------------------------------------------------------------------- diff --git a/src/ios/CDVAccelerometer.h b/src/ios/CDVAccelerometer.h new file mode 100755 index 0000000..044ca53 --- /dev/null +++ b/src/ios/CDVAccelerometer.h @@ -0,0 +1,39 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import <UIKit/UIKit.h> +#import "CDVPlugin.h" + +@interface CDVAccelerometer : CDVPlugin <UIAccelerometerDelegate> +{ + double x; + double y; + double z; + NSTimeInterval timestamp; +} + +@property (readonly, assign) BOOL isRunning; +@property (nonatomic, strong) NSString* callbackId; + +- (CDVAccelerometer*)init; + +- (void)start:(CDVInvokedUrlCommand*)command; +- (void)stop:(CDVInvokedUrlCommand*)command; + +@end http://git-wip-us.apache.org/repos/asf/cordova-plugin-device-motion/blob/2e8eff8d/src/ios/CDVAccelerometer.m ---------------------------------------------------------------------- diff --git a/src/ios/CDVAccelerometer.m b/src/ios/CDVAccelerometer.m new file mode 100755 index 0000000..33093d0 --- /dev/null +++ b/src/ios/CDVAccelerometer.m @@ -0,0 +1,128 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + */ + +#import "CDVAccelerometer.h" + +@interface CDVAccelerometer () {} +@property (readwrite, assign) BOOL isRunning; +@end + +@implementation CDVAccelerometer + +@synthesize callbackId, isRunning; + +// defaults to 10 msec +#define kAccelerometerInterval 40 +// g constant: -9.81 m/s^2 +#define kGravitationalConstant -9.81 + +- (CDVAccelerometer*)init +{ + self = [super init]; + if (self) { + x = 0; + y = 0; + z = 0; + timestamp = 0; + self.callbackId = nil; + self.isRunning = NO; + } + return self; +} + +- (void)dealloc +{ + [self stop:nil]; +} + +- (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; + } +} + +- (void)onReset +{ + [self stop:nil]; +} + +- (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]; + } +} + +- (void)returnAccelInfo +{ + // Create an acceleration object + NSMutableDictionary* accelProps = [NSMutableDictionary dictionaryWithCapacity:4]; + + [accelProps setValue:[NSNumber numberWithDouble:x * kGravitationalConstant] forKey:@"x"]; + [accelProps setValue:[NSNumber numberWithDouble:y * kGravitationalConstant] forKey:@"y"]; + [accelProps setValue:[NSNumber numberWithDouble:z * kGravitationalConstant] forKey:@"z"]; + [accelProps setValue:[NSNumber numberWithDouble:timestamp] forKey:@"timestamp"]; + + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:accelProps]; + [result setKeepCallback:[NSNumber numberWithBool:YES]]; + [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; +} + +// TODO: Consider using filtering to isolate instantaneous data vs. gravity data -jm + +/* + #define kFilteringFactor 0.1 + + // Use a basic low-pass filter to keep only the gravity component of each axis. + grav_accelX = (acceleration.x * kFilteringFactor) + ( grav_accelX * (1.0 - kFilteringFactor)); + grav_accelY = (acceleration.y * kFilteringFactor) + ( grav_accelY * (1.0 - kFilteringFactor)); + grav_accelZ = (acceleration.z * kFilteringFactor) + ( grav_accelZ * (1.0 - kFilteringFactor)); + + // Subtract the low-pass value from the current value to get a simplified high-pass filter + instant_accelX = acceleration.x - ( (acceleration.x * kFilteringFactor) + (instant_accelX * (1.0 - kFilteringFactor)) ); + instant_accelY = acceleration.y - ( (acceleration.y * kFilteringFactor) + (instant_accelY * (1.0 - kFilteringFactor)) ); + instant_accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) + (instant_accelZ * (1.0 - kFilteringFactor)) ); + + + */ +@end
