diff --git a/build.py b/build.py
index 6320677344..731a05e37d 100755
--- a/build.py
+++ b/build.py
@@ -312,6 +312,7 @@ def examples_star_json(name, match):
'../externs/oli.js',
'../externs/proj4js.js',
'../externs/tilejson.js',
+ '../externs/w3c_device_sensor_event.js',
],
})
with open(t.name, 'w') as f:
diff --git a/buildcfg/base.json b/buildcfg/base.json
index 557581927e..f5588857ed 100644
--- a/buildcfg/base.json
+++ b/buildcfg/base.json
@@ -44,7 +44,8 @@
"../externs/geojson.js",
"../externs/oli.js",
"../externs/proj4js.js",
- "../externs/tilejson.js"
+ "../externs/tilejson.js",
+ "../externs/w3c_device_sensor_event.js"
],
"level": "VERBOSE",
diff --git a/buildcfg/ol-all.json b/buildcfg/ol-all.json
index 340936188c..a57165cf21 100644
--- a/buildcfg/ol-all.json
+++ b/buildcfg/ol-all.json
@@ -9,7 +9,8 @@
"../externs/geojson.js",
"../externs/oli.js",
"../externs/proj4js.js",
- "../externs/tilejson.js"
+ "../externs/tilejson.js",
+ "../externs/w3c_device_sensor_event.js"
],
"inherits": "base.json",
diff --git a/buildcfg/ol-simple.json b/buildcfg/ol-simple.json
index c21ae1528e..f0c6054618 100644
--- a/buildcfg/ol-simple.json
+++ b/buildcfg/ol-simple.json
@@ -18,7 +18,8 @@
"../externs/geojson.js",
"../externs/oli.js",
"../externs/proj4js.js",
- "../externs/tilejson.js"
+ "../externs/tilejson.js",
+ "../externs/w3c_device_sensor_event.js"
],
"inherits": "ol.json",
diff --git a/buildcfg/ol-whitespace.json b/buildcfg/ol-whitespace.json
index fb99f44cc3..63bc208d88 100644
--- a/buildcfg/ol-whitespace.json
+++ b/buildcfg/ol-whitespace.json
@@ -19,7 +19,8 @@
"../externs/geojson.js",
"../externs/oli.js",
"../externs/proj4js.js",
- "../externs/tilejson.js"
+ "../externs/tilejson.js",
+ "../externs/w3c_device_sensor_event.js"
],
"inherits": "ol.json",
diff --git a/buildcfg/ol.json b/buildcfg/ol.json
index cb689bbddc..670eb4c8ac 100644
--- a/buildcfg/ol.json
+++ b/buildcfg/ol.json
@@ -19,7 +19,8 @@
"../externs/geojson.js",
"../externs/oli.js",
"../externs/proj4js.js",
- "../externs/tilejson.js"
+ "../externs/tilejson.js",
+ "../externs/w3c_device_sensor_event.js"
],
"inherits": "base.json",
diff --git a/examples/device-orientation.html b/examples/device-orientation.html
new file mode 100644
index 0000000000..0423c68dc2
--- /dev/null
+++ b/examples/device-orientation.html
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+ Device-Orientation example
+
+
+
+
+
+
+
+
+
+
+
+
+
Device orientation example
+
α : rad
+
β : rad
+
γ : rad
+
Listen to DeviceOrientation events
+
+
orientation, openstreetmap
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/device-orientation.js b/examples/device-orientation.js
new file mode 100644
index 0000000000..42f4836260
--- /dev/null
+++ b/examples/device-orientation.js
@@ -0,0 +1,29 @@
+goog.require('ol.DeviceOrientation');
+goog.require('ol.Map');
+goog.require('ol.RendererHints');
+goog.require('ol.View2D');
+goog.require('ol.layer.TileLayer');
+goog.require('ol.source.OSM');
+
+var view = new ol.View2D({
+ center: [0, 0],
+ zoom: 2
+});
+var map = new ol.Map({
+ layers: [
+ new ol.layer.TileLayer({
+ source: new ol.source.OSM()
+ })
+ ],
+ renderers: ol.RendererHints.createFromQueryData(),
+ target: 'map',
+ view: view
+});
+
+var deviceOrientation = new ol.DeviceOrientation();
+
+deviceOrientation.on('changed', function() {
+ document.getElementById('alpha').innerHTML = deviceOrientation.getAlpha();
+ document.getElementById('beta').innerHTML = deviceOrientation.getBeta();
+ document.getElementById('gamma').innerHTML = deviceOrientation.getGamma();
+});
diff --git a/externs/w3c_device_sensor_event.js b/externs/w3c_device_sensor_event.js
new file mode 100644
index 0000000000..ee3fba15b4
--- /dev/null
+++ b/externs/w3c_device_sensor_event.js
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2013 The Closure Compiler Authors
+ *
+ * Licensed 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.
+ */
+
+/**
+ * @fileoverview Definitions for W3C's device orientation and device motion
+ * events specification.
+ * This file depends on w3c_event.js.
+ * The whole file has been partially type annotated.
+ * Created from http://dev.w3.org/geo/api/spec-source-orientation.
+ *
+ * @externs
+ */
+
+/**
+ * @constructor
+ * @extends {Event}
+ */
+function DeviceOrientationEvent() {}
+
+/** @type {?number} */
+DeviceOrientationEvent.prototype.alpha;
+
+/** @type {?number} */
+DeviceOrientationEvent.prototype.beta;
+
+/** @type {?number} */
+DeviceOrientationEvent.prototype.gamma;
+
+/** @type {boolean} */
+DeviceOrientationEvent.prototype.absolute;
+
+/**
+ * @constructor
+ */
+function DeviceAcceleration() {}
+
+/** @type {?number} */
+DeviceAcceleration.prototype.x;
+
+/** @type {?number} */
+DeviceAcceleration.prototype.y;
+
+/** @type {?number} */
+DeviceAcceleration.prototype.z;
+
+/**
+ * @constructor
+ */
+function DeviceRotationRate() {}
+
+/** @type {?number} */
+DeviceOrientationEvent.prototype.alpha;
+
+/** @type {?number} */
+DeviceOrientationEvent.prototype.beta;
+
+/** @type {?number} */
+DeviceOrientationEvent.prototype.gamma;
+
+/**
+ * @constructor
+ * @extends {Event}
+ */
+function DeviceMotionEvent() {}
+
+/** @type {?DeviceAcceleration} */
+DeviceMotionEvent.prototype.acceleration;
+
+/** @type {?DeviceAcceleration} */
+DeviceMotionEvent.prototype.accelerationIncludingGravity;
+
+/** @type {?DeviceRotationRate} */
+DeviceMotionEvent.prototype.rotationRate;
+
+/** @type {?number} */
+DeviceMotionEvent.prototype.interval;
diff --git a/src/ol/deviceorientation.exports b/src/ol/deviceorientation.exports
new file mode 100644
index 0000000000..4496aa24b9
--- /dev/null
+++ b/src/ol/deviceorientation.exports
@@ -0,0 +1 @@
+@exportSymbol ol.DeviceOrientation
diff --git a/src/ol/deviceorientation.js b/src/ol/deviceorientation.js
new file mode 100644
index 0000000000..24308fedff
--- /dev/null
+++ b/src/ol/deviceorientation.js
@@ -0,0 +1,104 @@
+// FIXME: tracking property (same as ol.Geolocation)
+// FIXME: event.absolute
+goog.provide('ol.DeviceOrientation');
+goog.provide('ol.DeviceOrientationProperty');
+
+goog.require('goog.events');
+goog.require('goog.math');
+goog.require('ol.Object');
+
+
+/**
+ * @enum {string}
+ */
+ol.DeviceOrientationProperty = {
+ ALPHA: 'alpha',
+ BETA: 'beta',
+ GAMMA: 'gamma'
+};
+
+
+
+/**
+ * @constructor
+ * @extends {ol.Object}
+ */
+ol.DeviceOrientation = function() {
+
+ goog.base(this);
+
+ if (ol.DeviceOrientation.SUPPORTED) {
+ goog.events.listen(window, 'deviceorientation',
+ this.orientationChange_, false, this);
+ }
+};
+goog.inherits(ol.DeviceOrientation, ol.Object);
+
+
+/**
+ * Is supported.
+ * @const
+ * @type {boolean}
+ */
+ol.DeviceOrientation.SUPPORTED = 'DeviceOrientationEvent' in window;
+
+
+/**
+ * @private
+ * @param {goog.events.BrowserEvent} browserEvent Event.
+ */
+ol.DeviceOrientation.prototype.orientationChange_ = function(browserEvent) {
+ var event = /** @type {DeviceOrientationEvent} */
+ (browserEvent.getBrowserEvent());
+ if (goog.isDefAndNotNull(event.alpha)) {
+ this.set(ol.DeviceOrientationProperty.ALPHA,
+ goog.math.toRadians(event.alpha));
+ }
+ if (goog.isDefAndNotNull(event.beta)) {
+ this.set(ol.DeviceOrientationProperty.BETA,
+ goog.math.toRadians(event.beta));
+ }
+ if (goog.isDefAndNotNull(event.gamma)) {
+ this.set(ol.DeviceOrientationProperty.GAMMA,
+ goog.math.toRadians(event.gamma));
+ }
+};
+
+
+/**
+ * @return {number|undefined} alpha.
+ */
+ol.DeviceOrientation.prototype.getAlpha = function() {
+ return /** @type {number} */ (
+ this.get(ol.DeviceOrientationProperty.ALPHA));
+};
+goog.exportProperty(
+ ol.DeviceOrientation.prototype,
+ 'getAlpha',
+ ol.DeviceOrientation.prototype.getAlpha);
+
+
+/**
+ * @return {number|undefined} beta.
+ */
+ol.DeviceOrientation.prototype.getBeta = function() {
+ return /** @type {number} */ (
+ this.get(ol.DeviceOrientationProperty.BETA));
+};
+goog.exportProperty(
+ ol.DeviceOrientation.prototype,
+ 'getBeta',
+ ol.DeviceOrientation.prototype.getBeta);
+
+
+/**
+ * @return {number|undefined} gamma.
+ */
+ol.DeviceOrientation.prototype.getGamma = function() {
+ return /** @type {number} */ (
+ this.get(ol.DeviceOrientationProperty.GAMMA));
+};
+goog.exportProperty(
+ ol.DeviceOrientation.prototype,
+ 'getGamma',
+ ol.DeviceOrientation.prototype.getGamma);