Added initial compass support
Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-webos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-webos/commit/7eeda79d Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-webos/tree/7eeda79d Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-webos/diff/7eeda79d Branch: refs/heads/master Commit: 7eeda79d34df3db0c469091d9e41b2d50b5d38bb Parents: e1ca3d8 Author: Markus Leutwyler <[email protected]> Authored: Wed Mar 7 14:07:15 2012 +0100 Committer: Markus Leutwyler <[email protected]> Committed: Wed Mar 7 14:07:15 2012 +0100 ---------------------------------------------------------------------- Makefile | 1 + js/compass.js | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 0 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cordova-webos/blob/7eeda79d/Makefile ---------------------------------------------------------------------- diff --git a/Makefile b/Makefile index 92162ba..77d3b17 100755 --- a/Makefile +++ b/Makefile @@ -56,6 +56,7 @@ lib/phonegap.js: js/phonegap-core.js js/acceleration.js js/accelerometer.js js/a $(CAT) js/audio.js >> $@ $(CAT) js/camera.js >> $@ $(CAT) js/contacts.js >> $@ + $(CAT) js/compass.js >> $@ $(CAT) js/debugconsole.js >> $@ $(CAT) js/device.js >> $@ $(CAT) js/file.js >> $@ http://git-wip-us.apache.org/repos/asf/incubator-cordova-webos/blob/7eeda79d/js/compass.js ---------------------------------------------------------------------- diff --git a/js/compass.js b/js/compass.js new file mode 100644 index 0000000..824d0df --- /dev/null +++ b/js/compass.js @@ -0,0 +1,102 @@ +/* + * This class provides access to device compass data. + * @constructor + */ +function Compass() { + /* + * The last known heading. + */ + this.lastHeading = null; +}; + +/* + * Asynchronously aquires the current compass heading. + * @param {Function} successCallback The function to call when the compass + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the compass data. + * @param {CompassOptions} options The options for getting the compass data + * such as timeout. + */ + +Compass.prototype.getCurrentHeading = function(successCallback, errorCallback, options) { + + var referenceTime = 0; + if (this.lastHeading) + referenceTime = this.lastHeading.timestamp; + else + this.start(); + + var timeout = 20000; + var interval = 500; + if (typeof(options) == 'object' && options.interval) + interval = options.interval; + + if (typeof(successCallback) != 'function') + successCallback = function() {}; + if (typeof(errorCallback) != 'function') + errorCallback = function() {}; + + var dis = this; + var delay = 0; + var timer = setInterval(function() { + delay += interval; + + //if we have a new compass heading, call success and cancel the timer + if (typeof(dis.lastHeading) == 'object' && dis.lastHeading != null && dis.lastHeading.timestamp > referenceTime) { + successCallback(dis.lastHeading.magHeading); + clearInterval(timer); + } else if (delay >= timeout) { //else if timeout has occured then call error and cancel the timer + errorCallback(); + clearInterval(timer); + } + //else the interval gets called again + }, interval); +}; + + +/* + * Asynchronously aquires the compass heading repeatedly at a given interval. + * @param {Function} successCallback The function to call each time the acceleration + * data is available + * @param {Function} errorCallback The function to call when there is an error + * getting the compass data. + * @param {CompassOptions} options The options for getting the compass data + * such as timeout. + */ + +Compass.prototype.watchHeading = function(successCallback, errorCallback, options) { + this.getCurrentHeading(successCallback, errorCallback, options); + // TODO: add the interval id to a list so we can clear all watches + var frequency = (options != undefined)? options.frequency : 10000; + var that = this; + return setInterval(function() { + that.getCurrentHeading(successCallback, errorCallback, options); + }, frequency); +}; + +/* + * Clears the specified heading watch. + * @param {String} watchId The ID of the watch returned from #watchHeading. + */ +Compass.prototype.clearWatch = function(watchId) { + clearInterval(watchId); +}; + +/* + * Starts the native compass listener. + */ + +Compass.prototype.start = function() { + var that = this; + //Mojo.Event.listen(document, "acceleration", function(event) { + document.addEventListener("compass", function(event) { + var heading={}; + heading.trueHeading=event.trueHeading; + heading.magHeading=event.magHeading; + heading.timestamp = new Date().getTime(); + that.lastHeading = heading; + }); +}; + +if (typeof navigator.compass == "undefined") navigator.compass = new Compass();
