Chromium Code Reviews| 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..dc548923682a495604f03825045a18979f5da5b0 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,128 @@ 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) |
|
flackr
2015/03/05 19:59:45
nit: nix the comment, while we will update the acc
jonross
2015/03/05 21:13:39
Done.
|
| + motion_buffer_->seqlock.WriteBegin(); |
| + motion_buffer_->data.interval = std::max( |
| + kInertialSensorIntervalMicroseconds / 1000, |
| + chromeos::AccelerometerReader::GetInstance()->DelayBetweenReadsMs()); |
| + 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; |
| } |
| 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 +172,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 |