| 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..36bdadd81fea719fc52bd3b76484a1709ef4ca8a 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) {
|
| - 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();
|
| - }
|
| -
|
| - StartObservingAccelerometer();
|
| +void SensorManagerChromeOS::StartFetchingDeviceMotionData(
|
| + DeviceMotionHardwareBuffer* buffer) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(!motion_buffer_);
|
| + 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();
|
| +
|
| + if (!orientation_buffer_)
|
| + StartObservingAccelerometer();
|
| +}
|
| +
|
| +bool SensorManagerChromeOS::StopFetchingDeviceMotionData() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + 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;
|
| +
|
| + if (!orientation_buffer_)
|
| + StopObservingAccelerometer();
|
| return true;
|
| }
|
|
|
| +void SensorManagerChromeOS::StartFetchingDeviceOrientationData(
|
| + DeviceOrientationHardwareBuffer* buffer) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(!orientation_buffer_);
|
| + 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_)
|
| + 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;
|
| - }
|
| -
|
| - StopObservingAccelerometer();
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + 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 (!motion_buffer_)
|
| + 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) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| 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;
|
| + 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() {
|
| + chromeos::AccelerometerReader::GetInstance()->AddObserver(this);
|
| +}
|
| +
|
| +void SensorManagerChromeOS::StopObservingAccelerometer() {
|
| + 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
|
| @@ -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
|
|
|