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

Side by Side Diff: device/generic_sensor/linux/sensor_data_linux.cc

Issue 2533793002: [sensors](CrOS/Linux) Implement Sensor device manager for sensors (Closed)
Patch Set: fix build.gn Created 4 years 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "base/sys_info.h" 5 #include "base/sys_info.h"
6 #include "base/version.h" 6 #include "base/version.h"
7 #include "device/generic_sensor/generic_sensor_consts.h" 7 #include "device/generic_sensor/generic_sensor_consts.h"
8 #include "device/generic_sensor/linux/sensor_data_linux.h" 8 #include "device/generic_sensor/linux/sensor_data_linux.h"
9 #include "device/generic_sensor/public/cpp/sensor_reading.h" 9 #include "device/generic_sensor/public/cpp/sensor_reading.h"
10 10
(...skipping 10 matching lines...) Expand all
21 #endif 21 #endif
22 22
23 const base::FilePath::CharType* kSensorsBasePath = 23 const base::FilePath::CharType* kSensorsBasePath =
24 FILE_PATH_LITERAL("/sys/bus/iio/devices"); 24 FILE_PATH_LITERAL("/sys/bus/iio/devices");
25 25
26 void InitAmbientLightSensorData(SensorDataLinux* data) { 26 void InitAmbientLightSensorData(SensorDataLinux* data) {
27 std::vector<std::string> file_names{ 27 std::vector<std::string> file_names{
28 "in_illuminance0_input", "in_illuminance_input", "in_illuminance0_raw", 28 "in_illuminance0_input", "in_illuminance_input", "in_illuminance0_raw",
29 "in_illuminance_raw"}; 29 "in_illuminance_raw"};
30 data->sensor_file_names.push_back(std::move(file_names)); 30 data->sensor_file_names.push_back(std::move(file_names));
31 data->reporting_mode = mojom::ReportingMode::ON_CHANGE;
32 data->default_configuration = 31 data->default_configuration =
33 PlatformSensorConfiguration(kDefaultAmbientLightFrequencyHz); 32 PlatformSensorConfiguration(kDefaultAmbientLightFrequencyHz);
34 } 33 }
35 34
36 // Depending on a kernel version, CrOS has a different axes plane. 35 // Depending on a kernel version, CrOS has a different axes plane.
37 // Before 3.18 it was YXZ and after XYZ. 36 // Before 3.18 it was YXZ and after XYZ.
38 // TODO(maksims): Track crbug.com/501184. 3.14 will have the same sensor stack 37 // TODO(maksims): Track crbug.com/501184. 3.14 will have the same sensor stack
39 // as 3.18 has, which will probably change the order of axes. 38 // as 3.18 has, which will probably change the order of axes.
40 void MaybeCheckKernelVersionAndAssignFileNames( 39 void MaybeCheckKernelVersionAndAssignFileNames(
41 const std::vector<std::string>& file_names_x, 40 const std::vector<std::string>& file_names_x,
(...skipping 23 matching lines...) Expand all
65 void InitAccelerometerSensorData(SensorDataLinux* data) { 64 void InitAccelerometerSensorData(SensorDataLinux* data) {
66 std::vector<std::string> file_names_x{"in_accel_x_base_raw", 65 std::vector<std::string> file_names_x{"in_accel_x_base_raw",
67 "in_accel_x_raw"}; 66 "in_accel_x_raw"};
68 std::vector<std::string> file_names_y{"in_accel_y_base_raw", 67 std::vector<std::string> file_names_y{"in_accel_y_base_raw",
69 "in_accel_y_raw"}; 68 "in_accel_y_raw"};
70 std::vector<std::string> file_names_z{"in_accel_z_base_raw", 69 std::vector<std::string> file_names_z{"in_accel_z_base_raw",
71 "in_accel_z_raw"}; 70 "in_accel_z_raw"};
72 71
73 #if defined(OS_CHROMEOS) 72 #if defined(OS_CHROMEOS)
74 data->sensor_scale_name = "in_accel_base_scale"; 73 data->sensor_scale_name = "in_accel_base_scale";
75 data->apply_scaling_func = 74 data->sensor_frequency_file_name = "in_accel_base_sampling_frequency";
76 base::Bind([](double scaling_value, SensorReading& reading) { 75 data->apply_scaling_func = base::Bind(
77 double scaling = kMeanGravity / scaling_value; 76 [](double scaling_value, double offset, SensorReading& reading) {
77 double scaling = (kMeanGravity / scaling_value) + offset;
78 reading.values[0] = scaling * reading.values[0]; 78 reading.values[0] = scaling * reading.values[0];
79 reading.values[1] = scaling * reading.values[1]; 79 reading.values[1] = scaling * reading.values[1];
80 reading.values[2] = scaling * reading.values[2]; 80 reading.values[2] = scaling * reading.values[2];
81 }); 81 });
82 #else 82 #else
83 data->sensor_scale_name = "in_accel_scale"; 83 data->sensor_scale_name = "in_accel_scale";
84 data->apply_scaling_func = 84 data->sensor_offset_file_name = "in_accel_offset";
85 base::Bind([](double scaling_value, SensorReading& reading) { 85 data->sensor_frequency_file_name = "in_accel_sampling_frequency";
86 data->apply_scaling_func = base::Bind(
87 [](double scaling_value, double offset, SensorReading& reading) {
88 double scaling = scaling_value + offset;
86 // Adapt Linux reading values to generic sensor api specs. 89 // Adapt Linux reading values to generic sensor api specs.
87 reading.values[0] = -scaling_value * reading.values[0]; 90 reading.values[0] = -scaling * reading.values[0];
88 reading.values[1] = -scaling_value * reading.values[1]; 91 reading.values[1] = -scaling * reading.values[1];
89 reading.values[2] = -scaling_value * reading.values[2]; 92 reading.values[2] = -scaling * reading.values[2];
90 }); 93 });
91 #endif 94 #endif
92 95
93 MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y, 96 MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
94 file_names_z, data); 97 file_names_z, data);
95 data->reporting_mode = mojom::ReportingMode::CONTINUOUS;
96 data->default_configuration = 98 data->default_configuration =
97 PlatformSensorConfiguration(kDefaultAccelerometerFrequencyHz); 99 PlatformSensorConfiguration(kDefaultAccelerometerFrequencyHz);
98 } 100 }
99 101
100 void InitGyroscopeSensorData(SensorDataLinux* data) { 102 void InitGyroscopeSensorData(SensorDataLinux* data) {
101 std::vector<std::string> file_names_x{"in_anglvel_x_base_raw", 103 std::vector<std::string> file_names_x{"in_anglvel_x_base_raw",
102 "in_anglvel_x_raw"}; 104 "in_anglvel_x_raw"};
103 std::vector<std::string> file_names_y{"in_anglvel_y_base_raw", 105 std::vector<std::string> file_names_y{"in_anglvel_y_base_raw",
104 "in_anglvel_y_raw"}; 106 "in_anglvel_y_raw"};
105 std::vector<std::string> file_names_z{"in_anglvel_z_base_raw", 107 std::vector<std::string> file_names_z{"in_anglvel_z_base_raw",
106 "in_anglvel_z_raw"}; 108 "in_anglvel_z_raw"};
107 #if defined(OS_CHROMEOS) 109 #if defined(OS_CHROMEOS)
108 data->sensor_scale_name = "in_anglvel_base_scale"; 110 data->sensor_scale_name = "in_anglvel_base_scale";
109 data->apply_scaling_func = 111 data->sensor_frequency_file_name = "in_anglvel_base_frequency";
110 base::Bind([](double scaling_value, SensorReading& reading) { 112 data->apply_scaling_func = base::Bind(
113 [](double scaling_value, double offset, SensorReading& reading) {
111 double scaling = 114 double scaling =
112 kMeanGravity * kRadiansInDegreesPerSecond / scaling_value; 115 kMeanGravity * kRadiansInDegreesPerSecond / scaling_value + offset;
113 // Adapt CrOS reading values to generic sensor api specs. 116 // Adapt CrOS reading values to generic sensor api specs.
114 reading.values[0] = -scaling * reading.values[0]; 117 reading.values[0] = -scaling * reading.values[0];
115 reading.values[1] = -scaling * reading.values[1]; 118 reading.values[1] = -scaling * reading.values[1];
116 reading.values[2] = -scaling * reading.values[2]; 119 reading.values[2] = -scaling * reading.values[2];
117 }); 120 });
118 #else 121 #else
119 data->sensor_scale_name = "in_anglvel_scale"; 122 data->sensor_scale_name = "in_anglvel_scale";
120 data->apply_scaling_func = 123 data->sensor_offset_file_name = "in_anglvel_offset";
121 base::Bind([](double scaling_value, SensorReading& reading) { 124 data->sensor_frequency_file_name = "in_anglvel_sampling_frequency";
122 reading.values[0] = scaling_value * reading.values[0]; 125 data->apply_scaling_func = base::Bind(
123 reading.values[1] = scaling_value * reading.values[1]; 126 [](double scaling_value, double offset, SensorReading& reading) {
124 reading.values[2] = scaling_value * reading.values[2]; 127 double scaling = scaling_value + offset;
128 reading.values[0] = scaling * reading.values[0];
129 reading.values[1] = scaling * reading.values[1];
130 reading.values[2] = scaling * reading.values[2];
125 }); 131 });
126 #endif 132 #endif
127 133
128 MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y, 134 MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
129 file_names_z, data); 135 file_names_z, data);
130 data->reporting_mode = mojom::ReportingMode::CONTINUOUS;
131 data->default_configuration = 136 data->default_configuration =
132 PlatformSensorConfiguration(kDefaultGyroscopeFrequencyHz); 137 PlatformSensorConfiguration(kDefaultGyroscopeFrequencyHz);
133 } 138 }
134 139
135 // TODO(maksims): Verify magnitometer works correctly on a chromebook when 140 // TODO(maksims): Verify magnitometer works correctly on a chromebook when
136 // I get one with that sensor onboard. 141 // I get one with that sensor onboard.
137 void InitMagnitometerSensorData(SensorDataLinux* data) { 142 void InitMagnitometerSensorData(SensorDataLinux* data) {
138 std::vector<std::string> file_names_x{"in_magn_x_raw"}; 143 std::vector<std::string> file_names_x{"in_magn_x_raw"};
139 std::vector<std::string> file_names_y{"in_magn_y_raw"}; 144 std::vector<std::string> file_names_y{"in_magn_y_raw"};
140 std::vector<std::string> file_names_z{"in_magn_z_raw"}; 145 std::vector<std::string> file_names_z{"in_magn_z_raw"};
141 146
142 data->sensor_scale_name = "in_magn_scale"; 147 data->sensor_scale_name = "in_magn_scale";
143 data->apply_scaling_func = base::Bind([](double scaling_value, 148 data->sensor_offset_file_name = "in_magn_offset";
144 SensorReading& reading) { 149 data->sensor_frequency_file_name = "in_magn_sampling_frequency";
145 reading.values[0] = scaling_value * kMicroteslaInGauss * reading.values[0]; 150 data->apply_scaling_func = base::Bind(
146 reading.values[1] = scaling_value * kMicroteslaInGauss * reading.values[1]; 151 [](double scaling_value, double offset, SensorReading& reading) {
147 reading.values[2] = scaling_value * kMicroteslaInGauss * reading.values[2]; 152 double scaling = scaling_value + offset;
148 }); 153 reading.values[0] = scaling * kMicroteslaInGauss * reading.values[0];
154 reading.values[1] = scaling * kMicroteslaInGauss * reading.values[1];
155 reading.values[2] = scaling * kMicroteslaInGauss * reading.values[2];
156 });
149 157
150 MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y, 158 MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
151 file_names_z, data); 159 file_names_z, data);
152 data->reporting_mode = mojom::ReportingMode::CONTINUOUS;
153 data->default_configuration = 160 data->default_configuration =
154 PlatformSensorConfiguration(kDefaultMagnetometerFrequencyHz); 161 PlatformSensorConfiguration(kDefaultMagnetometerFrequencyHz);
155 } 162 }
156 163
157 } // namespace 164 } // namespace
158 165
159 SensorDataLinux::SensorDataLinux() : base_path_sensor_linux(kSensorsBasePath) {} 166 SensorDataLinux::SensorDataLinux() : base_path_sensor_linux(kSensorsBasePath) {}
160 167
161 SensorDataLinux::~SensorDataLinux() = default; 168 SensorDataLinux::~SensorDataLinux() = default;
162 169
163 SensorDataLinux::SensorDataLinux(const SensorDataLinux& other) = default; 170 SensorDataLinux::SensorDataLinux(const SensorDataLinux& other) = default;
164 171
165 bool InitSensorData(SensorType type, SensorDataLinux* data) { 172 bool InitSensorData(SensorType type, SensorDataLinux* data) {
166 DCHECK(data); 173 DCHECK(data);
167 174
175 data->type = type;
168 switch (type) { 176 switch (type) {
169 case SensorType::AMBIENT_LIGHT: 177 case SensorType::AMBIENT_LIGHT:
170 InitAmbientLightSensorData(data); 178 InitAmbientLightSensorData(data);
171 break; 179 break;
172 case SensorType::ACCELEROMETER: 180 case SensorType::ACCELEROMETER:
173 InitAccelerometerSensorData(data); 181 InitAccelerometerSensorData(data);
174 break; 182 break;
175 case SensorType::GYROSCOPE: 183 case SensorType::GYROSCOPE:
176 InitGyroscopeSensorData(data); 184 InitGyroscopeSensorData(data);
177 break; 185 break;
178 case SensorType::MAGNETOMETER: 186 case SensorType::MAGNETOMETER:
179 InitMagnitometerSensorData(data); 187 InitMagnitometerSensorData(data);
180 break; 188 break;
181 default: 189 default:
182 NOTIMPLEMENTED(); 190 // NOTIMPLEMENTED();
Reilly Grant (use Gerrit) 2016/11/29 20:19:56 Remove this line since now we regularly expect to
maksims (do not use this acc) 2016/12/05 13:06:59 Done.
183 return false; 191 return false;
184 } 192 }
185 193
186 return true; 194 return true;
187 } 195 }
188 196
189 } // namespace device 197 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698