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

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) {
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 = std::max(
40 orientation_buffer_->seqlock.WriteEnd(); 38 kInertialSensorIntervalMicroseconds / 1000,
41 } 39 chromeos::AccelerometerReader::kDelayBetweenReadsMs);
40 motion_buffer_->seqlock.WriteEnd();
42 41
43 StartObservingAccelerometer(); 42 StartObservingAccelerometer();
43 }
44
45 bool SensorManagerChromeOS::StopFetchingDeviceMotionData() {
46 DCHECK(thread_checker_.CalledOnValidThread());
47 if (!motion_buffer_)
48 return false;
49
50 // Make sure to indicate that the sensor data is no longer available.
51 motion_buffer_->seqlock.WriteBegin();
52 motion_buffer_->data.allAvailableSensorsAreActive = false;
53 motion_buffer_->seqlock.WriteEnd();
54
55 motion_buffer_ = nullptr;
56
57 if (!orientation_buffer_)
58 StopObservingAccelerometer();
44 return true; 59 return true;
45 } 60 }
46 61
62 void SensorManagerChromeOS::StartFetchingDeviceOrientationData(
63 DeviceOrientationHardwareBuffer* buffer) {
64 DCHECK(thread_checker_.CalledOnValidThread());
65 DCHECK(!orientation_buffer_);
66 orientation_buffer_ = buffer;
67
68 // No compass information, so we cannot provide absolute orientation.
69 orientation_buffer_->seqlock.WriteBegin();
70 orientation_buffer_->data.absolute = false;
71 orientation_buffer_->data.hasAbsolute = true;
72 orientation_buffer_->seqlock.WriteEnd();
73
74 StartObservingAccelerometer();
75 }
76
47 bool SensorManagerChromeOS::StopFetchingDeviceOrientationData() { 77 bool SensorManagerChromeOS::StopFetchingDeviceOrientationData() {
48 { 78 DCHECK(thread_checker_.CalledOnValidThread());
49 base::AutoLock autolock(orientation_buffer_lock_); 79 if (!orientation_buffer_)
50 if (!orientation_buffer_) 80 return false;
51 return false; 81 // 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. 82 orientation_buffer_->seqlock.WriteBegin();
53 orientation_buffer_->seqlock.WriteBegin(); 83 orientation_buffer_->data.allAvailableSensorsAreActive = false;
54 orientation_buffer_->data.allAvailableSensorsAreActive = false; 84 orientation_buffer_->seqlock.WriteEnd();
55 orientation_buffer_->seqlock.WriteEnd(); 85 orientation_buffer_ = nullptr;
56 orientation_buffer_ = nullptr;
57 }
58 86
59 StopObservingAccelerometer(); 87 if (!motion_buffer_)
88 StopObservingAccelerometer();
60 return true; 89 return true;
61 } 90 }
62 91
63 void SensorManagerChromeOS::OnAccelerometerUpdated( 92 void SensorManagerChromeOS::OnAccelerometerUpdated(
64 const chromeos::AccelerometerUpdate& update) { 93 scoped_refptr<const chromeos::AccelerometerUpdate> update) {
65 base::AutoLock autolock(orientation_buffer_lock_); 94 DCHECK(thread_checker_.CalledOnValidThread());
95 chromeos::AccelerometerSource source;
96 if (update->has(chromeos::ACCELEROMETER_SOURCE_SCREEN))
97 source = chromeos::ACCELEROMETER_SOURCE_SCREEN;
98 else if (update->has(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD))
99 source = chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD;
100 else
101 return;
102
103 double x = update->get(source).x;
104 double y = update->get(source).y;
105 double z = update->get(source).z;
106
107 GenerateMotionEvent(x, y, z);
108 GenerateOrientationEvent(x, y, z);
109 }
110
111 void SensorManagerChromeOS::StartObservingAccelerometer() {
112 if (chromeos::AccelerometerReader::GetInstance()->HasObserver(this))
113 return;
114 chromeos::AccelerometerReader::GetInstance()->AddObserver(this);
Nico 2015/03/11 14:17:06 This is the only place I can see where this AddObs
jonross 2015/03/11 17:52:48 I've removed the HasObserver methods. To update h
115 }
116
117 void SensorManagerChromeOS::StopObservingAccelerometer() {
118 DCHECK(chromeos::AccelerometerReader::GetInstance()->HasObserver(this));
119 chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this);
120 }
121
122 void SensorManagerChromeOS::GenerateMotionEvent(double x, double y, double z) {
123 if (!motion_buffer_)
124 return;
125
126 motion_buffer_->seqlock.WriteBegin();
127 motion_buffer_->data.accelerationIncludingGravityX = x;
128 motion_buffer_->data.hasAccelerationIncludingGravityX = true;
129 motion_buffer_->data.accelerationIncludingGravityY = y;
130 motion_buffer_->data.hasAccelerationIncludingGravityY = true;
131 motion_buffer_->data.accelerationIncludingGravityZ = z;
132 motion_buffer_->data.hasAccelerationIncludingGravityZ = true;
133 motion_buffer_->data.allAvailableSensorsAreActive = true;
134 motion_buffer_->seqlock.WriteEnd();
135 }
136
137 void SensorManagerChromeOS::GenerateOrientationEvent(double x,
138 double y,
139 double z) {
66 if (!orientation_buffer_) 140 if (!orientation_buffer_)
67 return; 141 return;
68 142
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 143 // Create a unit vector for trigonometry
83 // TODO(jonross): Stop reversing signs for vector components once 144 // TODO(jonross): Stop reversing signs for vector components once
84 // accelerometer values have been fixed. crbug.com/431391 145 // accelerometer values have been fixed. crbug.com/431391
85 // Ternaries are to remove -0.0f which gives incorrect trigonometrical 146 // Ternaries are to remove -0.0f which gives incorrect trigonometrical
86 // results. 147 // results.
87 gfx::Vector3dF data(x, y ? -y : 0.0f, z ? -z : 0.0f); 148 gfx::Vector3dF data(x, y ? -y : 0.0f, z ? -z : 0.0f);
88 data.Scale(1.0f / data.Length()); 149 data.Scale(1.0f / data.Length());
89 150
90 // Transform accelerometer to W3C angles, using the Z-X-Y Eulerangles matrix. 151 // Transform accelerometer to W3C angles, using the Z-X-Y Eulerangles matrix.
91 // x = sin(gamma) 152 // x = sin(gamma)
(...skipping 11 matching lines...) Expand all
103 gamma = -90.0f; 164 gamma = -90.0f;
104 orientation_buffer_->seqlock.WriteBegin(); 165 orientation_buffer_->seqlock.WriteBegin();
105 orientation_buffer_->data.beta = beta; 166 orientation_buffer_->data.beta = beta;
106 orientation_buffer_->data.hasBeta = true; 167 orientation_buffer_->data.hasBeta = true;
107 orientation_buffer_->data.gamma = gamma; 168 orientation_buffer_->data.gamma = gamma;
108 orientation_buffer_->data.hasGamma = true; 169 orientation_buffer_->data.hasGamma = true;
109 orientation_buffer_->data.allAvailableSensorsAreActive = true; 170 orientation_buffer_->data.allAvailableSensorsAreActive = true;
110 orientation_buffer_->seqlock.WriteEnd(); 171 orientation_buffer_->seqlock.WriteEnd();
111 } 172 }
112 173
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 174 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698