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

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: construct manager 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
11 namespace device { 11 namespace device {
12 12
13 namespace { 13 namespace {
14 14
15 using mojom::SensorType; 15 using mojom::SensorType;
16 16
17 #if defined(OS_CHROMEOS) 17 #if defined(OS_CHROMEOS)
18 // ChromeOS kernel version, when axes were changed to XYZ. Before 3.18, 18 // ChromeOS kernel version, when axes were changed to XYZ. Before 3.18,
19 // they were YXZ. 19 // they were YXZ.
20 const char kChangedAxisKernelVersion[] = "3.18.0"; 20 const char kChangedAxisKernelVersion[] = "3.18.0";
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(SensorPathsLinux* 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,
42 const std::vector<std::string>& file_names_y, 41 const std::vector<std::string>& file_names_y,
43 const std::vector<std::string>& file_names_z, 42 const std::vector<std::string>& file_names_z,
44 SensorDataLinux* data) { 43 SensorPathsLinux* data) {
45 #if defined(OS_CHROMEOS) 44 #if defined(OS_CHROMEOS)
46 const base::Version checked_kernel_version(kChangedAxisKernelVersion); 45 const base::Version checked_kernel_version(kChangedAxisKernelVersion);
47 DCHECK(checked_kernel_version.IsValid()); 46 DCHECK(checked_kernel_version.IsValid());
48 const base::Version current_version(base::SysInfo::OperatingSystemVersion()); 47 const base::Version current_version(base::SysInfo::OperatingSystemVersion());
49 if (current_version.IsValid() && current_version < checked_kernel_version) { 48 if (current_version.IsValid() && current_version < checked_kernel_version) {
50 data->sensor_file_names.push_back(file_names_y); 49 data->sensor_file_names.push_back(file_names_y);
51 data->sensor_file_names.push_back(file_names_x); 50 data->sensor_file_names.push_back(file_names_x);
52 } else { 51 } else {
53 data->sensor_file_names.push_back(file_names_x); 52 data->sensor_file_names.push_back(file_names_x);
54 data->sensor_file_names.push_back(file_names_y); 53 data->sensor_file_names.push_back(file_names_y);
55 } 54 }
56 data->sensor_file_names.push_back(file_names_z); 55 data->sensor_file_names.push_back(file_names_z);
57 #else 56 #else
58 data->sensor_file_names.push_back(file_names_x); 57 data->sensor_file_names.push_back(file_names_x);
59 data->sensor_file_names.push_back(file_names_y); 58 data->sensor_file_names.push_back(file_names_y);
60 data->sensor_file_names.push_back(file_names_z); 59 data->sensor_file_names.push_back(file_names_z);
61 #endif 60 #endif
62 } 61 }
63 62
64 // TODO(maksims): add support for lid accelerometer on chromeos. 63 // TODO(maksims): add support for lid accelerometer on chromeos.
65 void InitAccelerometerSensorData(SensorDataLinux* data) { 64 void InitAccelerometerSensorData(SensorPathsLinux* 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(SensorPathsLinux* 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(SensorPathsLinux* 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 SensorPathsLinux::SensorPathsLinux()
167 : base_path_sensor_linux(kSensorsBasePath) {}
160 168
161 SensorDataLinux::~SensorDataLinux() = default; 169 SensorPathsLinux::~SensorPathsLinux() = default;
162 170
163 SensorDataLinux::SensorDataLinux(const SensorDataLinux& other) = default; 171 SensorPathsLinux::SensorPathsLinux(const SensorPathsLinux& other) = default;
164 172
165 bool InitSensorData(SensorType type, SensorDataLinux* data) { 173 bool InitSensorData(SensorType type, SensorPathsLinux* data) {
166 DCHECK(data); 174 DCHECK(data);
167 175
176 data->type = type;
168 switch (type) { 177 switch (type) {
169 case SensorType::AMBIENT_LIGHT: 178 case SensorType::AMBIENT_LIGHT:
170 InitAmbientLightSensorData(data); 179 InitAmbientLightSensorData(data);
171 break; 180 break;
172 case SensorType::ACCELEROMETER: 181 case SensorType::ACCELEROMETER:
173 InitAccelerometerSensorData(data); 182 InitAccelerometerSensorData(data);
174 break; 183 break;
175 case SensorType::GYROSCOPE: 184 case SensorType::GYROSCOPE:
176 InitGyroscopeSensorData(data); 185 InitGyroscopeSensorData(data);
177 break; 186 break;
178 case SensorType::MAGNETOMETER: 187 case SensorType::MAGNETOMETER:
179 InitMagnitometerSensorData(data); 188 InitMagnitometerSensorData(data);
180 break; 189 break;
181 default: 190 default:
182 NOTIMPLEMENTED();
183 return false; 191 return false;
184 } 192 }
185 193
186 return true; 194 return true;
187 } 195 }
188 196
197 SensorInfoLinux::SensorInfoLinux(
198 const std::string& sensor_device_node,
199 double sensor_device_frequency,
200 double sensor_device_scaling_value,
201 double sensor_device_offset_value,
202 mojom::ReportingMode mode,
203 SensorPathsLinux::ReaderFunctor scaling_func,
204 std::vector<base::FilePath> device_reading_files)
205 : device_node(sensor_device_node),
206 device_frequency(sensor_device_frequency),
207 device_scaling_value(sensor_device_scaling_value),
208 device_offset_value(sensor_device_offset_value),
209 reporting_mode(mode),
210 apply_scaling_func(scaling_func),
211 device_reading_files(std::move(device_reading_files)) {}
212
213 SensorInfoLinux::~SensorInfoLinux() = default;
214
189 } // namespace device 215 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698