Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1236)

Unified Diff: content/browser/device_sensors/sensor_manager_chromeos.cc

Issue 934843002: Implement DeviceMotionEvent API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/device_sensors/sensor_manager_chromeos.cc
diff --git a/content/browser/device_sensors/sensor_manager_chromeos.cc b/content/browser/device_sensors/sensor_manager_chromeos.cc
index 899002ee9e38bafed49f97cb4743596b3f363d4f..eb64d2a60caa7e1e08ea631bc23a729a4c3afc25 100644
--- a/content/browser/device_sensors/sensor_manager_chromeos.cc
+++ b/content/browser/device_sensors/sensor_manager_chromeos.cc
@@ -6,24 +6,63 @@
#include <math.h>
-#include "base/logging.h"
#include "chromeos/accelerometer/accelerometer_reader.h"
#include "chromeos/accelerometer/accelerometer_types.h"
+#include "content/browser/device_sensors/inertial_sensor_consts.h"
#include "ui/gfx/geometry/vector3d_f.h"
namespace {
// Conversion ratio from radians to degrees.
const double kRad2deg = 180.0 / M_PI;
+
+// The portion of previous gravity readings to perserve when updating with the
+// latest data.
+const double kGravityFilterRatio = 0.8;
}
namespace content {
-SensorManagerChromeOS::SensorManagerChromeOS() : orientation_buffer_(nullptr) {
+SensorManagerChromeOS::SensorManagerChromeOS()
+ : motion_buffer_(nullptr), orientation_buffer_(nullptr) {
}
SensorManagerChromeOS::~SensorManagerChromeOS() {
}
+bool SensorManagerChromeOS::StartFetchingDeviceMotionData(
+ DeviceMotionHardwareBuffer* buffer) {
+ DCHECK(buffer);
+ {
+ base::AutoLock autolock(motion_buffer_lock_);
+ if (motion_buffer_)
+ return false;
+ motion_buffer_ = buffer;
+
+ motion_buffer_->seqlock.WriteBegin();
+ motion_buffer_->data.interval = kInertialSensorIntervalMicroseconds / 1000;
flackr 2015/02/18 22:34:09 But this is not actually the update interval. Even
jonross 2015/02/24 00:02:47 This is the interval with which events are sent to
flackr 2015/02/25 23:15:16 But when I tested it, it seems that JS is only not
jonross 2015/03/05 14:28:02 Done.
+ motion_buffer_->seqlock.WriteEnd();
+ }
+
+ StartObservingAccelerometer();
+ return true;
+}
+
+bool SensorManagerChromeOS::StopFetchingDeviceMotionData() {
+ {
+ base::AutoLock autolock(motion_buffer_lock_);
+ if (!motion_buffer_)
+ return false;
+ // Make sure to indicate that the sensor data is no longer available.
+ motion_buffer_->seqlock.WriteBegin();
+ motion_buffer_->data.allAvailableSensorsAreActive = false;
+ motion_buffer_->seqlock.WriteEnd();
+
+ motion_buffer_ = nullptr;
+ }
+ StopObservingAccelerometer();
+ return true;
+}
+
bool SensorManagerChromeOS::StartFetchingDeviceOrientationData(
DeviceOrientationHardwareBuffer* buffer) {
DCHECK(buffer);
@@ -39,7 +78,6 @@ bool SensorManagerChromeOS::StartFetchingDeviceOrientationData(
orientation_buffer_->data.hasAbsolute = true;
orientation_buffer_->seqlock.WriteEnd();
}
-
StartObservingAccelerometer();
return true;
}
@@ -62,23 +100,77 @@ bool SensorManagerChromeOS::StopFetchingDeviceOrientationData() {
void SensorManagerChromeOS::OnAccelerometerUpdated(
flackr 2015/02/18 22:34:09 Given the accelerometer source reader runs on a bl
jonross 2015/02/25 00:09:56 For the DeviceMotion API this will be partially ad
const chromeos::AccelerometerUpdate& update) {
- base::AutoLock autolock(orientation_buffer_lock_);
- if (!orientation_buffer_)
- return;
-
chromeos::AccelerometerSource source;
- if (update.has(chromeos::ACCELEROMETER_SOURCE_SCREEN)) {
+ if (update.has(chromeos::ACCELEROMETER_SOURCE_SCREEN))
source = chromeos::ACCELEROMETER_SOURCE_SCREEN;
- } else if (update.has(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)) {
+ else if (update.has(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD))
source = chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD;
- } else {
+ else
return;
- }
double x = update.get(source).x;
double y = update.get(source).y;
double z = update.get(source).z;
+ GenerateMotionEvent(x, y, z);
+ GenerateOrientationEvent(x, y, z);
+}
+
+void SensorManagerChromeOS::StartObservingAccelerometer() {
+ if (chromeos::AccelerometerReader::GetInstance()->HasObserver(this))
+ return;
+ chromeos::AccelerometerReader::GetInstance()->AddObserver(this);
+}
+
+void SensorManagerChromeOS::StopObservingAccelerometer() {
+ {
+ base::AutoLock auto_motion_lock(motion_buffer_lock_);
+ base::AutoLock auto_orientation_lock(orientation_buffer_lock_);
+ if (orientation_buffer_ || motion_buffer_)
+ return;
+ }
+ if (!chromeos::AccelerometerReader::GetInstance()->HasObserver(this))
flackr 2015/02/18 22:34:09 It should always have an observer if StopObserving
jonross 2015/02/25 00:09:56 Done.
+ return;
+ chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this);
+}
+
+void SensorManagerChromeOS::GenerateMotionEvent(double x, double y, double z) {
+ base::AutoLock autlock(motion_buffer_lock_);
+ if (!motion_buffer_)
+ return;
+
+ motion_buffer_->seqlock.WriteBegin();
+ motion_buffer_->data.accelerationIncludingGravityX = x;
+ motion_buffer_->data.hasAccelerationIncludingGravityX = true;
+ motion_buffer_->data.accelerationIncludingGravityY = y;
+ motion_buffer_->data.hasAccelerationIncludingGravityY = true;
+ motion_buffer_->data.accelerationIncludingGravityZ = z;
+ motion_buffer_->data.hasAccelerationIncludingGravityZ = true;
+ motion_buffer_->data.allAvailableSensorsAreActive = true;
+
+ gravity_.set_x(kGravityFilterRatio * gravity_.x() +
flackr 2015/02/18 22:34:09 I'm not sure we should be using a low pass filter
jonross 2015/02/24 00:02:47 The idea for the filter actually came from Android
flackr 2015/02/25 23:15:16 My understanding from reading this was that it's a
jonross 2015/03/05 14:28:02 Acknowledged.
+ (1.0f - kGravityFilterRatio) * x);
+ gravity_.set_y(kGravityFilterRatio * gravity_.y() +
+ (1.0f - kGravityFilterRatio) * y);
+ gravity_.set_z(kGravityFilterRatio * gravity_.z() +
+ (1.0f - kGravityFilterRatio) * z);
+
+ motion_buffer_->data.accelerationX = x - gravity_.x();
+ motion_buffer_->data.hasAccelerationX = true;
+ motion_buffer_->data.accelerationY = y - gravity_.y();
+ motion_buffer_->data.hasAccelerationY = true;
+ motion_buffer_->data.accelerationZ = z - gravity_.z();
+ motion_buffer_->data.hasAccelerationZ = true;
+ motion_buffer_->seqlock.WriteEnd();
+}
+
+void SensorManagerChromeOS::GenerateOrientationEvent(double x,
+ double y,
+ double z) {
+ base::AutoLock autolock(orientation_buffer_lock_);
+ if (!orientation_buffer_)
+ return;
+
// Create a unit vector for trigonometry
// TODO(jonross): Stop reversing signs for vector components once
// accelerometer values have been fixed. crbug.com/431391
@@ -110,12 +202,4 @@ void SensorManagerChromeOS::OnAccelerometerUpdated(
orientation_buffer_->seqlock.WriteEnd();
}
-void SensorManagerChromeOS::StartObservingAccelerometer() {
- chromeos::AccelerometerReader::GetInstance()->AddObserver(this);
-}
-
-void SensorManagerChromeOS::StopObservingAccelerometer() {
- chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this);
-}
-
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698