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

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, 9 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..4b051ba3c3839d66d03269d66afa66f05a554003 100644
--- a/content/browser/device_sensors/sensor_manager_chromeos.cc
+++ b/content/browser/device_sensors/sensor_manager_chromeos.cc
@@ -6,9 +6,9 @@
#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 {
@@ -18,66 +18,126 @@ const double kRad2deg = 180.0 / M_PI;
namespace content {
-SensorManagerChromeOS::SensorManagerChromeOS() : orientation_buffer_(nullptr) {
+SensorManagerChromeOS::SensorManagerChromeOS()
+ : motion_buffer_(nullptr), orientation_buffer_(nullptr) {
}
SensorManagerChromeOS::~SensorManagerChromeOS() {
}
-bool SensorManagerChromeOS::StartFetchingDeviceOrientationData(
- DeviceOrientationHardwareBuffer* buffer) {
+void SensorManagerChromeOS::StartFetchingDeviceMotionData(
+ DeviceMotionHardwareBuffer* buffer) {
DCHECK(buffer);
- {
- base::AutoLock autolock(orientation_buffer_lock_);
- if (orientation_buffer_)
- return false;
- orientation_buffer_ = buffer;
-
- // No compass information, so we cannot provide absolute orientation.
- orientation_buffer_->seqlock.WriteBegin();
- orientation_buffer_->data.absolute = false;
- orientation_buffer_->data.hasAbsolute = true;
- orientation_buffer_->seqlock.WriteEnd();
- }
+ if (motion_buffer_)
flackr 2015/03/10 05:32:36 Start should never be called twice without calling
jonross 2015/03/10 15:03:58 It appears so. Once the buffer is created new page
+ return;
+ motion_buffer_ = buffer;
+
+ motion_buffer_->seqlock.WriteBegin();
+ // The interval between updates is the longer of the rate set on the buffer,
+ // and the rate at which AccelerometerReader polls the sensor.
+ motion_buffer_->data.interval = std::max(
+ kInertialSensorIntervalMicroseconds / 1000,
+ chromeos::AccelerometerReader::kDelayBetweenReadsMs);
+ motion_buffer_->seqlock.WriteEnd();
StartObservingAccelerometer();
+}
+
+bool SensorManagerChromeOS::StopFetchingDeviceMotionData() {
+ 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;
}
+void SensorManagerChromeOS::StartFetchingDeviceOrientationData(
+ DeviceOrientationHardwareBuffer* buffer) {
+ DCHECK(buffer);
+ if (orientation_buffer_)
flackr 2015/03/10 05:32:36 ditto
jonross 2015/03/10 15:03:58 Done.
+ return;
+ orientation_buffer_ = buffer;
+
+ // No compass information, so we cannot provide absolute orientation.
+ orientation_buffer_->seqlock.WriteBegin();
+ orientation_buffer_->data.absolute = false;
+ orientation_buffer_->data.hasAbsolute = true;
+ orientation_buffer_->seqlock.WriteEnd();
+
+ StartObservingAccelerometer();
+}
+
bool SensorManagerChromeOS::StopFetchingDeviceOrientationData() {
- {
- base::AutoLock autolock(orientation_buffer_lock_);
- if (!orientation_buffer_)
- return false;
- // Make sure to indicate that the sensor data is no longer available.
- orientation_buffer_->seqlock.WriteBegin();
- orientation_buffer_->data.allAvailableSensorsAreActive = false;
- orientation_buffer_->seqlock.WriteEnd();
- orientation_buffer_ = nullptr;
- }
+ if (!orientation_buffer_)
+ return false;
+ // Make sure to indicate that the sensor data is no longer available.
+ orientation_buffer_->seqlock.WriteBegin();
+ orientation_buffer_->data.allAvailableSensorsAreActive = false;
+ orientation_buffer_->seqlock.WriteEnd();
+ orientation_buffer_ = nullptr;
StopObservingAccelerometer();
return true;
}
void SensorManagerChromeOS::OnAccelerometerUpdated(
- const chromeos::AccelerometerUpdate& update) {
- base::AutoLock autolock(orientation_buffer_lock_);
- if (!orientation_buffer_)
- return;
-
+ scoped_refptr<const chromeos::AccelerometerUpdate> update) {
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() {
+ if (orientation_buffer_ || motion_buffer_)
+ return;
+ DCHECK(chromeos::AccelerometerReader::GetInstance()->HasObserver(this));
+ chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this);
+}
+
+void SensorManagerChromeOS::GenerateMotionEvent(double x, double y, double z) {
+ if (!motion_buffer_)
return;
- }
- double x = update.get(source).x;
- double y = update.get(source).y;
- double z = update.get(source).z;
+ 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;
+ motion_buffer_->seqlock.WriteEnd();
+}
+
+void SensorManagerChromeOS::GenerateOrientationEvent(double x,
+ double y,
+ double z) {
+ if (!orientation_buffer_)
+ return;
// Create a unit vector for trigonometry
// TODO(jonross): Stop reversing signs for vector components once
@@ -110,12 +170,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