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 |