Return-Path: X-Original-To: apmail-incubator-callback-commits-archive@minotaur.apache.org Delivered-To: apmail-incubator-callback-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 28CC29DAC for ; Fri, 18 May 2012 22:15:33 +0000 (UTC) Received: (qmail 74270 invoked by uid 500); 18 May 2012 22:15:33 -0000 Delivered-To: apmail-incubator-callback-commits-archive@incubator.apache.org Received: (qmail 74240 invoked by uid 500); 18 May 2012 22:15:33 -0000 Mailing-List: contact callback-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: callback-dev@incubator.apache.org Delivered-To: mailing list callback-commits@incubator.apache.org Received: (qmail 74229 invoked by uid 99); 18 May 2012 22:15:33 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 18 May 2012 22:15:33 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id CDAF116CAB; Fri, 18 May 2012 22:15:32 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: filmaj@apache.org To: callback-commits@incubator.apache.org X-Mailer: ASF-Git Admin Mailer Subject: [3/3] ios commit: [CB-464] Simplified accel to start/stop actions. Message-Id: <20120518221532.CDAF116CAB@tyr.zones.apache.org> Date: Fri, 18 May 2012 22:15:32 +0000 (UTC) [CB-464] Simplified accel to start/stop actions. Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/commit/02d212ab Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/tree/02d212ab Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/diff/02d212ab Branch: refs/heads/master Commit: 02d212ab4179e20d646f5cab69c00e54cd8a7b77 Parents: 24a007a Author: Fil Maj Authored: Fri May 18 15:14:11 2012 -0700 Committer: Fil Maj Committed: Fri May 18 15:18:20 2012 -0700 ---------------------------------------------------------------------- CordovaLib/Classes/CDVAccelerometer.h | 10 +-- CordovaLib/Classes/CDVAccelerometer.m | 93 +++--------------- CordovaLib/javascript/cordova.ios.js | 146 +++++++++++++++++++-------- 3 files changed, 118 insertions(+), 131 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/02d212ab/CordovaLib/Classes/CDVAccelerometer.h ---------------------------------------------------------------------- diff --git a/CordovaLib/Classes/CDVAccelerometer.h b/CordovaLib/Classes/CDVAccelerometer.h index bc125f1..16f6200 100755 --- a/CordovaLib/Classes/CDVAccelerometer.h +++ b/CordovaLib/Classes/CDVAccelerometer.h @@ -31,16 +31,12 @@ } @property (readonly, assign) BOOL isRunning; -@property (nonatomic, retain) NSMutableArray* accelCallbacks; -@property (nonatomic, retain) NSMutableDictionary* watchCallbacks; +@property (nonatomic, retain) NSString* callbackId; - (CDVAccelerometer*) init; -- (void)start; -- (void)stop; -- (void)getAcceleration:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; -- (void) addWatch:(NSMutableArray *)arguments withDict:(NSMutableDictionary *)options; -- (void) clearWatch:(NSMutableArray *)arguments withDict:(NSMutableDictionary *)options; +- (void)start:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +- (void)stop:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; @end http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/02d212ab/CordovaLib/Classes/CDVAccelerometer.m ---------------------------------------------------------------------- diff --git a/CordovaLib/Classes/CDVAccelerometer.m b/CordovaLib/Classes/CDVAccelerometer.m index 8f8d95b..8e821ab 100644 --- a/CordovaLib/Classes/CDVAccelerometer.m +++ b/CordovaLib/Classes/CDVAccelerometer.m @@ -28,7 +28,7 @@ @implementation CDVAccelerometer -@synthesize accelCallbacks, watchCallbacks, isRunning; +@synthesize callbackId, isRunning; // defaults to 100 msec #define kAccelerometerInterval 100 @@ -48,30 +48,25 @@ y = 0; z = 0; timestamp = 0; - self.accelCallbacks = nil; - self.watchCallbacks = nil; + self.callbackId = nil; self.isRunning = NO; } return self; } - (void) dealloc { - [self stop]; + [self stop:nil withDict:nil]; [super dealloc]; // pretty important. } -- (void)start +- (void)start:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { + NSString* cbId = [arguments objectAtIndex:0]; NSTimeInterval desiredFrequency_num = kAccelerometerInterval; UIAccelerometer* pAccel = [UIAccelerometer sharedAccelerometer]; // accelerometer expects fractional seconds, but we have msecs pAccel.updateInterval = desiredFrequency_num / 1000; - if (!self.accelCallbacks) { - self.accelCallbacks = [NSMutableArray arrayWithCapacity:1]; - } - if (!watchCallbacks) { - self.watchCallbacks = [NSMutableDictionary dictionaryWithCapacity:1]; - } + self.callbackId = cbId; if(!self.isRunning) { pAccel.delegate = self; @@ -79,7 +74,7 @@ } } -- (void)stop +- (void)stop:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { UIAccelerometer* theAccelerometer = [UIAccelerometer sharedAccelerometer]; theAccelerometer.delegate = nil; @@ -87,59 +82,6 @@ } /** - * Sends Accel Data back to the Device. - */ -- (void)getAcceleration:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options -{ - NSString* callbackId = [arguments objectAtIndex:0]; - - if(!self.isRunning) - { - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_NO_RESULT]; - [result setKeepCallback:[NSNumber numberWithBool:YES]]; - if (!self.accelCallbacks) { - self.accelCallbacks = [NSMutableArray arrayWithCapacity:1]; - } - [self.accelCallbacks addObject:callbackId]; - [self start]; - [self writeJavascript:[result toSuccessCallbackString:callbackId]]; - } else { - [self returnAccelInfo:callbackId]; - } -} - -- (void) addWatch:(NSMutableArray *)arguments withDict:(NSMutableDictionary *)options -{ - NSString* callbackId = [arguments objectAtIndex:0]; - NSString* timerId = [arguments objectAtIndex:1]; - - if (!self.watchCallbacks) { - self.watchCallbacks = [NSMutableDictionary dictionaryWithCapacity:1]; - } - - // add the callbackId into the dictionary so we can call back whenever get data - [self.watchCallbacks setObject:callbackId forKey:timerId]; - - if (!self.isRunning) { - [self start]; - } - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_NO_RESULT]; - [result setKeepCallback:[NSNumber numberWithBool:YES]]; - [self writeJavascript:[result toSuccessCallbackString:callbackId]]; -} -- (void) clearWatch:(NSMutableArray *)arguments withDict:(NSMutableDictionary *)options -{ - NSString* callbackId = [arguments objectAtIndex:0]; - NSString* timerId = [arguments objectAtIndex:1]; - if (self.watchCallbacks && [self.watchCallbacks objectForKey:timerId]) { - [self.watchCallbacks removeObjectForKey:timerId]; - } - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - NSString* jsString = [result toSuccessCallbackString:callbackId]; - [self writeJavascript:jsString]; -} - -/** * Picks up accel updates from device and stores them in this class */ - (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration @@ -150,24 +92,12 @@ y = acceleration.y; z = acceleration.z; timestamp = ([[NSDate date] timeIntervalSince1970] * 1000); - if (self.accelCallbacks.count > 0) { - for (NSString *callbackId in self.accelCallbacks) { - [self returnAccelInfo:callbackId]; - } - [self.accelCallbacks removeAllObjects]; - } - if (self.watchCallbacks.count > 0) { - for (NSString *timerId in self.watchCallbacks) { - [self returnAccelInfo:[self.watchCallbacks objectForKey: timerId ]]; - } - } else { - // No callbacks waiting on us anymore, turn off listening. - [self stop]; - } + [self returnAccelInfo]; + } } -- (void)returnAccelInfo: (NSString*) callbackId +- (void)returnAccelInfo { CDVPluginResult* result = nil; NSString* jsString = nil; @@ -180,7 +110,8 @@ [accelProps setValue:[NSNumber numberWithDouble:timestamp] forKey:@"timestamp"]; result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:accelProps]; - jsString = [result toSuccessCallbackString:callbackId]; + [result setKeepCallback:[NSNumber numberWithBool:YES]]; + jsString = [result toSuccessCallbackString:self.callbackId]; [self writeJavascript:jsString]; } http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/02d212ab/CordovaLib/javascript/cordova.ios.js ---------------------------------------------------------------------- diff --git a/CordovaLib/javascript/cordova.ios.js b/CordovaLib/javascript/cordova.ios.js index e86afd5..18bf5a9 100644 --- a/CordovaLib/javascript/cordova.ios.js +++ b/CordovaLib/javascript/cordova.ios.js @@ -1,6 +1,6 @@ -// commit facaa38a0bd924aa15c14c372537c00382f1e593 +// commit 4a4ba9985c920850fe3f229abc60de984e196ab5 -// File generated at :: Thu May 10 2012 16:39:13 GMT-0700 (PDT) +// File generated at :: Fri May 18 2012 14:54:13 GMT-0700 (PDT) /* Licensed to the Apache Software Foundation (ASF) under one @@ -1057,13 +1057,14 @@ module.exports = { // file: lib/common/plugin/Acceleration.js define("cordova/plugin/Acceleration", function(require, exports, module) { var Acceleration = function(x, y, z, timestamp) { - this.x = x; - this.y = y; - this.z = z; - this.timestamp = timestamp || (new Date()).getTime(); + this.x = x; + this.y = y; + this.z = z; + this.timestamp = timestamp || (new Date()).getTime(); }; module.exports = Acceleration; + }); // file: lib/common/plugin/Camera.js @@ -3282,11 +3283,60 @@ define("cordova/plugin/accelerometer", function(require, exports, module) { * @constructor */ var utils = require("cordova/utils"), - exec = require("cordova/exec"); + exec = require("cordova/exec"), + Acceleration = require('cordova/plugin/Acceleration'); + +// Is the accel sensor running? +var running = false; -// Local singleton variables. +// Keeps reference to watchAcceleration calls. var timers = {}; +// Array of listeners; used to keep track of when we should call start and stop. +var listeners = []; + +// Last returned acceleration object from native +var accel = null; + +// Tells native to start. +function start() { + exec(function(a) { + var tempListeners = listeners.slice(0); + accel = new Acceleration(a.x, a.y, a.z, a.timestamp); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].win(accel); + } + }, function(e) { + var tempListeners = listeners.slice(0); + for (var i = 0, l = tempListeners.length; i < l; i++) { + tempListeners[i].fail(e); + } + }, "Accelerometer", "start", []); + running = true; +} + +// Tells native to stop. +function stop() { + exec(null, null, "Accelerometer", "stop", []); + running = false; +} + +// Adds a callback pair to the listeners array +function createCallbackPair(win, fail) { + return {win:win, fail:fail}; +} + +// Removes a win/fail listener pair from the listeners array +function removeListeners(l) { + var idx = listeners.indexOf(l); + if (idx > -1) { + listeners.splice(idx, 1); + if (listeners.length === 0) { + stop(); + } + } +} + var accelerometer = { /** * Asynchronously aquires the current acceleration. @@ -3296,21 +3346,27 @@ var accelerometer = { * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) */ getCurrentAcceleration: function(successCallback, errorCallback, options) { - // successCallback required if (typeof successCallback !== "function") { - console.log("Accelerometer Error: successCallback is not a function"); - return; + throw "getCurrentAcceleration must be called with at least a success callback function as first parameter."; } - // errorCallback optional - if (errorCallback && (typeof errorCallback !== "function")) { - console.log("Accelerometer Error: errorCallback is not a function"); - return; - } + var p; + var win = function(a) { + successCallback(a); + removeListeners(p); + }; + var fail = function(e) { + errorCallback(e); + removeListeners(p); + }; + + p = createCallbackPair(win, fail); + listeners.push(p); - // Get acceleration - exec(successCallback, errorCallback, "Accelerometer", "getAcceleration", []); + if (!running) { + start(); + } }, /** @@ -3322,36 +3378,38 @@ var accelerometer = { * @return String The watch id that must be passed to #clearWatch to stop watching. */ watchAcceleration: function(successCallback, errorCallback, options) { - // Default interval (10 sec) - var frequency = (options !== undefined && options.frequency !== undefined)? options.frequency : 10000; + var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; // successCallback required if (typeof successCallback !== "function") { - console.log("Accelerometer Error: successCallback is not a function"); - return; + throw "watchAcceleration must be called with at least a success callback function as first parameter."; } - // errorCallback optional - if (errorCallback && (typeof errorCallback !== "function")) { - console.log("Accelerometer Error: errorCallback is not a function"); - return; - } + // Keep reference to watch id, and report accel readings as often as defined in frequency + var id = utils.createUUID(); - // Make sure accelerometer timeout > frequency + 10 sec - exec( - function(timeout) { - if (timeout < (frequency + 10000)) { - exec(null, null, "Accelerometer", "setTimeout", [frequency + 10000]); + var p = createCallbackPair(function(){}, function(e) { + errorCallback(e); + removeListeners(p); + }); + listeners.push(p); + + timers[id] = { + timer:window.setInterval(function() { + if (accel) { + successCallback(accel); } - }, - function(e) { }, "Accelerometer", "getTimeout", []); + }, frequency), + listeners:p + }; - // Start watch timer - var id = utils.createUUID(); - timers[id] = window.setInterval(function() { - exec(successCallback, errorCallback, "Accelerometer", "getAcceleration", []); - }, (frequency ? frequency : 1)); + if (running) { + // If we're already running then immediately invoke the success callback + successCallback(accel); + } else { + start(); + } return id; }, @@ -3362,16 +3420,17 @@ var accelerometer = { * @param {String} id The id of the watch returned from #watchAcceleration. */ clearWatch: function(id) { - // Stop javascript timer & remove from timer list - if (id && timers[id] !== undefined) { - window.clearInterval(timers[id]); + if (id && timers[id]) { + window.clearInterval(timers[id].timer); + removeListeners(timers[id].listeners); delete timers[id]; } } }; module.exports = accelerometer; + }); // file: lib/common/plugin/battery.js @@ -4662,7 +4721,7 @@ window.cordova = require('cordova'); // Fire onDeviceReady event once all constructors have run and // cordova info has been received from native side. channel.join(function() { - channel.onDeviceReady.fire(); + require('cordova').fireDocumentEvent('deviceready'); }, channel.deviceReadyChannelsArray); }, [ channel.onDOMContentLoaded, channel.onNativeReady ]); @@ -4681,4 +4740,5 @@ window.cordova = require('cordova'); }(window)); + })(); \ No newline at end of file