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

Side by Side 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: Fix missed test 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/device_sensors/sensor_manager_chromeos.h" 5 #include "content/browser/device_sensors/sensor_manager_chromeos.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 8
9 #include "base/logging.h"
10 #include "chromeos/accelerometer/accelerometer_reader.h" 9 #include "chromeos/accelerometer/accelerometer_reader.h"
11 #include "chromeos/accelerometer/accelerometer_types.h" 10 #include "chromeos/accelerometer/accelerometer_types.h"
11 #include "content/browser/device_sensors/inertial_sensor_consts.h"
12 #include "ui/gfx/geometry/vector3d_f.h" 12 #include "ui/gfx/geometry/vector3d_f.h"
13 13
14 namespace { 14 namespace {
15 // Conversion ratio from radians to degrees. 15 // Conversion ratio from radians to degrees.
16 const double kRad2deg = 180.0 / M_PI; 16 const double kRad2deg = 180.0 / M_PI;
17 } 17 }
18 18
19 namespace content { 19 namespace content {
20 20
21 SensorManagerChromeOS::SensorManagerChromeOS() : orientation_buffer_(nullptr) { 21 SensorManagerChromeOS::SensorManagerChromeOS()
22 : motion_buffer_(nullptr), orientation_buffer_(nullptr) {
22 } 23 }
23 24
24 SensorManagerChromeOS::~SensorManagerChromeOS() { 25 SensorManagerChromeOS::~SensorManagerChromeOS() {
25 } 26 }
26 27
27 bool SensorManagerChromeOS::StartFetchingDeviceOrientationData( 28 void SensorManagerChromeOS::StartFetchingDeviceMotionData(
28 DeviceOrientationHardwareBuffer* buffer) { 29 DeviceMotionHardwareBuffer* buffer) {
29 DCHECK(buffer); 30 DCHECK(thread_checker_.CalledOnValidThread());
30 { 31 DCHECK(!motion_buffer_);
31 base::AutoLock autolock(orientation_buffer_lock_); 32 motion_buffer_ = buffer;
32 if (orientation_buffer_)
33 return false;
34 orientation_buffer_ = buffer;
35 33
36 // No compass information, so we cannot provide absolute orientation. 34 motion_buffer_->seqlock.WriteBegin();
37 orientation_buffer_->seqlock.WriteBegin(); 35 // The interval between updates is the longer of the rate set on the buffer,
38 orientation_buffer_->data.absolute = false; 36 // and the rate at which AccelerometerReader polls the sensor.
39 orientation_buffer_->data.hasAbsolute = true; 37 motion_buffer_->data.interval =
40 orientation_buffer_->seqlock.WriteEnd(); 38 std::max(kInertialSensorIntervalMicroseconds / 1000,
41 } 39 chromeos::AccelerometerReader::kDelayBetweenReadsMs);
40 motion_buffer_->seqlock.WriteEnd();
42 41
43 StartObservingAccelerometer(); 42 if (!orientation_buffer_)
43 StartObservingAccelerometer();
44 }
45
46 bool SensorManagerChromeOS::StopFetchingDeviceMotionData() {
47 DCHECK(thread_checker_.CalledOnValidThread());
48 if (!motion_buffer_)
49 return false;
50
51 // Make sure to indicate that the sensor data is no longer available.
52 motion_buffer_->seqlock.WriteBegin();
53 motion_buffer_->data.allAvailableSensorsAreActive = false;
54 motion_buffer_->seqlock.WriteEnd();
55
56 motion_buffer_ = nullptr;
57
58 if (!orientation_buffer_)
59 StopObservingAccelerometer();
44 return true; 60 return true;
45 } 61 }
46 62
63 void SensorManagerChromeOS::StartFetchingDeviceOrientationData(
64 DeviceOrientationHardwareBuffer* buffer) {
65 DCHECK(thread_checker_.CalledOnValidThread());
66 DCHECK(!orientation_buffer_);
67 orientation_buffer_ = buffer;
68
69 // No compass information, so we cannot provide absolute orientation.
70 orientation_buffer_->seqlock.WriteBegin();
71 orientation_buffer_->data.absolute = false;
72 orientation_buffer_->data.hasAbsolute = true;
73 orientation_buffer_->seqlock.WriteEnd();
74
75 if (!motion_buffer_)
76 StartObservingAccelerometer();
77 }
78
47 bool SensorManagerChromeOS::StopFetchingDeviceOrientationData() { 79 bool SensorManagerChromeOS::StopFetchingDeviceOrientationData() {
48 { 80 DCHECK(thread_checker_.CalledOnValidThread());
49 base::AutoLock autolock(orientation_buffer_lock_); 81 if (!orientation_buffer_)
50 if (!orientation_buffer_) 82 return false;
51 return false; 83 // Make sure to indicate that the sensor data is no longer available.
52 // Make sure to indicate that the sensor data is no longer available. 84 orientation_buffer_->seqlock.WriteBegin();
53 orientation_buffer_->seqlock.WriteBegin(); 85 orientation_buffer_->data.allAvailableSensorsAreActive = false;
54 orientation_buffer_->data.allAvailableSensorsAreActive = false; 86 orientation_buffer_->seqlock.WriteEnd();
55 orientation_buffer_->seqlock.WriteEnd(); 87 orientation_buffer_ = nullptr;
56 orientation_buffer_ = nullptr;
57 }
58 88
59 StopObservingAccelerometer(); 89 if (!motion_buffer_)
90 StopObservingAccelerometer();
60 return true; 91 return true;
61 } 92 }
62 93
63 void SensorManagerChromeOS::OnAccelerometerUpdated( 94 void SensorManagerChromeOS::OnAccelerometerUpdated(
64 const chromeos::AccelerometerUpdate& update) { 95 scoped_refptr<const chromeos::AccelerometerUpdate> update) {
65 base::AutoLock autolock(orientation_buffer_lock_); 96 DCHECK(thread_checker_.CalledOnValidThread());
97 chromeos::AccelerometerSource source;
98 if (update->has(chromeos::ACCELEROMETER_SOURCE_SCREEN))
99 source = chromeos::ACCELEROMETER_SOURCE_SCREEN;
100 else if (update->has(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD))
101 source = chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD;
102 else
103 return;
104
105 double x = update->get(source).x;
106 double y = update->get(source).y;
107 double z = update->get(source).z;
108
109 GenerateMotionEvent(x, y, z);
110 GenerateOrientationEvent(x, y, z);
111 }
112
113 void SensorManagerChromeOS::StartObservingAccelerometer() {
114 chromeos::AccelerometerReader::GetInstance()->AddObserver(this);
115 }
116
117 void SensorManagerChromeOS::StopObservingAccelerometer() {
118 chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this);
119 }
120
121 void SensorManagerChromeOS::GenerateMotionEvent(double x, double y, double z) {
122 if (!motion_buffer_)
123 return;
124
125 motion_buffer_->seqlock.WriteBegin();
126 motion_buffer_->data.accelerationIncludingGravityX = x;
127 motion_buffer_->data.hasAccelerationIncludingGravityX = true;
128 motion_buffer_->data.accelerationIncludingGravityY = y;
129 motion_buffer_->data.hasAccelerationIncludingGravityY = true;
130 motion_buffer_->data.accelerationIncludingGravityZ = z;
131 motion_buffer_->data.hasAccelerationIncludingGravityZ = true;
132 motion_buffer_->data.allAvailableSensorsAreActive = true;
133 motion_buffer_->seqlock.WriteEnd();
134 }
135
136 void SensorManagerChromeOS::GenerateOrientationEvent(double x,
137 double y,
138 double z) {
66 if (!orientation_buffer_) 139 if (!orientation_buffer_)
67 return; 140 return;
68 141
69 chromeos::AccelerometerSource source;
70 if (update.has(chromeos::ACCELEROMETER_SOURCE_SCREEN)) {
71 source = chromeos::ACCELEROMETER_SOURCE_SCREEN;
72 } else if (update.has(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)) {
73 source = chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD;
74 } else {
75 return;
76 }
77
78 double x = update.get(source).x;
79 double y = update.get(source).y;
80 double z = update.get(source).z;
81
82 // Create a unit vector for trigonometry 142 // Create a unit vector for trigonometry
83 // TODO(jonross): Stop reversing signs for vector components once 143 // TODO(jonross): Stop reversing signs for vector components once
84 // accelerometer values have been fixed. crbug.com/431391 144 // accelerometer values have been fixed. crbug.com/431391
85 // Ternaries are to remove -0.0f which gives incorrect trigonometrical 145 // Ternaries are to remove -0.0f which gives incorrect trigonometrical
86 // results. 146 // results.
87 gfx::Vector3dF data(x, y ? -y : 0.0f, z ? -z : 0.0f); 147 gfx::Vector3dF data(x, y ? -y : 0.0f, z ? -z : 0.0f);
88 data.Scale(1.0f / data.Length()); 148 data.Scale(1.0f / data.Length());
89 149
90 // Transform accelerometer to W3C angles, using the Z-X-Y Eulerangles matrix. 150 // Transform accelerometer to W3C angles, using the Z-X-Y Eulerangles matrix.
91 // x = sin(gamma) 151 // x = sin(gamma)
(...skipping 11 matching lines...) Expand all
103 gamma = -90.0f; 163 gamma = -90.0f;
104 orientation_buffer_->seqlock.WriteBegin(); 164 orientation_buffer_->seqlock.WriteBegin();
105 orientation_buffer_->data.beta = beta; 165 orientation_buffer_->data.beta = beta;
106 orientation_buffer_->data.hasBeta = true; 166 orientation_buffer_->data.hasBeta = true;
107 orientation_buffer_->data.gamma = gamma; 167 orientation_buffer_->data.gamma = gamma;
108 orientation_buffer_->data.hasGamma = true; 168 orientation_buffer_->data.hasGamma = true;
109 orientation_buffer_->data.allAvailableSensorsAreActive = true; 169 orientation_buffer_->data.allAvailableSensorsAreActive = true;
110 orientation_buffer_->seqlock.WriteEnd(); 170 orientation_buffer_->seqlock.WriteEnd();
111 } 171 }
112 172
113 void SensorManagerChromeOS::StartObservingAccelerometer() {
114 chromeos::AccelerometerReader::GetInstance()->AddObserver(this);
115 }
116
117 void SensorManagerChromeOS::StopObservingAccelerometer() {
118 chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this);
119 }
120
121 } // namespace content 173 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698