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

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: 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) {
30 DCHECK(thread_checker_.CalledOnValidThread());
29 DCHECK(buffer); 31 DCHECK(buffer);
flackr 2015/03/10 17:21:11 nit: This is probably an unnecessary check, since
jonross 2015/03/10 18:16:10 Looking into the call path it isn't needed. There
30 { 32 CHECK(!motion_buffer_);
timvolodine 2015/03/10 17:31:33 I wouldn't use CHECK here, seems a bit drastic to
jonross 2015/03/10 18:16:10 Changed to DCHECK. That would be a rare case if re
31 base::AutoLock autolock(orientation_buffer_lock_); 33 motion_buffer_ = buffer;
32 if (orientation_buffer_)
33 return false;
34 orientation_buffer_ = buffer;
35 34
36 // No compass information, so we cannot provide absolute orientation. 35 motion_buffer_->seqlock.WriteBegin();
37 orientation_buffer_->seqlock.WriteBegin(); 36 // The interval between updates is the longer of the rate set on the buffer,
38 orientation_buffer_->data.absolute = false; 37 // and the rate at which AccelerometerReader polls the sensor.
39 orientation_buffer_->data.hasAbsolute = true; 38 motion_buffer_->data.interval = std::max(
40 orientation_buffer_->seqlock.WriteEnd(); 39 kInertialSensorIntervalMicroseconds / 1000,
41 } 40 chromeos::AccelerometerReader::kDelayBetweenReadsMs);
41 motion_buffer_->seqlock.WriteEnd();
42 42
43 StartObservingAccelerometer(); 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(buffer);
flackr 2015/03/10 17:21:11 ditto
jonross 2015/03/10 18:16:09 Done.
67 CHECK(!orientation_buffer_);
68 orientation_buffer_ = buffer;
69
70 // No compass information, so we cannot provide absolute orientation.
71 orientation_buffer_->seqlock.WriteBegin();
72 orientation_buffer_->data.absolute = false;
73 orientation_buffer_->data.hasAbsolute = true;
74 orientation_buffer_->seqlock.WriteEnd();
75
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 if (chromeos::AccelerometerReader::GetInstance()->HasObserver(this))
115 return;
116 chromeos::AccelerometerReader::GetInstance()->AddObserver(this);
117 }
118
119 void SensorManagerChromeOS::StopObservingAccelerometer() {
120 DCHECK(chromeos::AccelerometerReader::GetInstance()->HasObserver(this));
121 chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this);
122 }
123
124 void SensorManagerChromeOS::GenerateMotionEvent(double x, double y, double z) {
125 if (!motion_buffer_)
126 return;
127
128 motion_buffer_->seqlock.WriteBegin();
129 motion_buffer_->data.accelerationIncludingGravityX = x;
130 motion_buffer_->data.hasAccelerationIncludingGravityX = true;
131 motion_buffer_->data.accelerationIncludingGravityY = y;
132 motion_buffer_->data.hasAccelerationIncludingGravityY = true;
133 motion_buffer_->data.accelerationIncludingGravityZ = z;
134 motion_buffer_->data.hasAccelerationIncludingGravityZ = true;
135 motion_buffer_->data.allAvailableSensorsAreActive = true;
136 motion_buffer_->seqlock.WriteEnd();
137 }
138
139 void SensorManagerChromeOS::GenerateOrientationEvent(double x,
140 double y,
141 double z) {
66 if (!orientation_buffer_) 142 if (!orientation_buffer_)
67 return; 143 return;
68 144
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 145 // Create a unit vector for trigonometry
83 // TODO(jonross): Stop reversing signs for vector components once 146 // TODO(jonross): Stop reversing signs for vector components once
84 // accelerometer values have been fixed. crbug.com/431391 147 // accelerometer values have been fixed. crbug.com/431391
85 // Ternaries are to remove -0.0f which gives incorrect trigonometrical 148 // Ternaries are to remove -0.0f which gives incorrect trigonometrical
86 // results. 149 // results.
87 gfx::Vector3dF data(x, y ? -y : 0.0f, z ? -z : 0.0f); 150 gfx::Vector3dF data(x, y ? -y : 0.0f, z ? -z : 0.0f);
88 data.Scale(1.0f / data.Length()); 151 data.Scale(1.0f / data.Length());
89 152
90 // Transform accelerometer to W3C angles, using the Z-X-Y Eulerangles matrix. 153 // Transform accelerometer to W3C angles, using the Z-X-Y Eulerangles matrix.
91 // x = sin(gamma) 154 // x = sin(gamma)
(...skipping 11 matching lines...) Expand all
103 gamma = -90.0f; 166 gamma = -90.0f;
104 orientation_buffer_->seqlock.WriteBegin(); 167 orientation_buffer_->seqlock.WriteBegin();
105 orientation_buffer_->data.beta = beta; 168 orientation_buffer_->data.beta = beta;
106 orientation_buffer_->data.hasBeta = true; 169 orientation_buffer_->data.hasBeta = true;
107 orientation_buffer_->data.gamma = gamma; 170 orientation_buffer_->data.gamma = gamma;
108 orientation_buffer_->data.hasGamma = true; 171 orientation_buffer_->data.hasGamma = true;
109 orientation_buffer_->data.allAvailableSensorsAreActive = true; 172 orientation_buffer_->data.allAvailableSensorsAreActive = true;
110 orientation_buffer_->seqlock.WriteEnd(); 173 orientation_buffer_->seqlock.WriteEnd();
111 } 174 }
112 175
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 176 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698