| 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..c056387bab6d909522206aa022fd8f886a4caf55 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,43 +18,70 @@ 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::StartFetchingDeviceMotionData(
|
| + DeviceMotionHardwareBuffer* buffer) {
|
| + DCHECK(buffer);
|
| + if (motion_buffer_)
|
| + return false;
|
| + motion_buffer_ = buffer;
|
| +
|
| + // TODO(jonross): this is currently the rate at which events are pumped, not
|
| + // at which new accelerometer updates are received. The accelerometer will
|
| + // be updated (crbug.com/459218)
|
| + motion_buffer_->seqlock.WriteBegin();
|
| + motion_buffer_->data.interval = kInertialSensorIntervalMicroseconds / 1000;
|
| + motion_buffer_->seqlock.WriteEnd();
|
| +
|
| + StartObservingAccelerometer();
|
| + return true;
|
| +}
|
| +
|
| +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;
|
| +}
|
| +
|
| bool SensorManagerChromeOS::StartFetchingDeviceOrientationData(
|
| DeviceOrientationHardwareBuffer* 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 (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();
|
|
|
| StartObservingAccelerometer();
|
| return true;
|
| }
|
|
|
| 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;
|
| @@ -62,23 +89,56 @@ bool SensorManagerChromeOS::StopFetchingDeviceOrientationData() {
|
|
|
| void SensorManagerChromeOS::OnAccelerometerUpdated(
|
| 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() {
|
| + 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;
|
| +
|
| + 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
|
| // accelerometer values have been fixed. crbug.com/431391
|
| @@ -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
|
|
|