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

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

Issue 2492773002: [sensors][CrOS/Linux] Implementation of motion sensors for CrOS/Linux platforms (Closed)
Patch Set: rebased Created 4 years, 1 month 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"
6 #include "base/version.h"
7 #include "device/generic_sensor/generic_sensor_consts.h"
5 #include "device/generic_sensor/linux/sensor_data_linux.h" 8 #include "device/generic_sensor/linux/sensor_data_linux.h"
6 #include "device/sensors/public/cpp/device_sensors_consts.h" 9 #include "device/generic_sensor/public/cpp/sensor_reading.h"
7 10
8 namespace device { 11 namespace device {
9 12
10 namespace { 13 namespace {
11 14
12 using mojom::SensorType; 15 using mojom::SensorType;
13 16
17 #if defined(OS_CHROMEOS)
18 // ChromeOS kernel version, when axes were changed to XYZ. Before 3.18,
19 // they were YXZ.
20 const char kChangedAxisKernelVersion[] = "3.18.0";
21 #endif
22
14 const base::FilePath::CharType* kSensorsBasePath = 23 const base::FilePath::CharType* kSensorsBasePath =
15 FILE_PATH_LITERAL("/sys/bus/iio/devices"); 24 FILE_PATH_LITERAL("/sys/bus/iio/devices");
16 25
17 void InitAmbientLightSensorData(SensorDataLinux* data) { 26 void InitAmbientLightSensorData(SensorDataLinux* data) {
18 std::vector<std::string> file_names{ 27 std::vector<std::string> file_names{
19 "in_illuminance0_input", "in_illuminance_input", "in_illuminance0_raw", 28 "in_illuminance0_input", "in_illuminance_input", "in_illuminance0_raw",
20 "in_illuminance_raw"}; 29 "in_illuminance_raw"};
21
22 data->sensor_file_names.push_back(std::move(file_names)); 30 data->sensor_file_names.push_back(std::move(file_names));
23 data->reporting_mode = mojom::ReportingMode::ON_CHANGE; 31 data->reporting_mode = mojom::ReportingMode::ON_CHANGE;
24 data->default_configuration = 32 data->default_configuration =
25 PlatformSensorConfiguration(kDefaultAmbientLightFrequencyHz); 33 PlatformSensorConfiguration(kDefaultAmbientLightFrequencyHz);
26 } 34 }
27 35
36 // Depending on a kernel version, CrOS has a different axes plane.
37 // Before 3.18 it was YXZ and after XYZ.
38 // 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.
40 void MaybeCheckKernelVersionAndAssignFileNames(
41 const std::vector<std::string>& file_names_x,
42 const std::vector<std::string>& file_names_y,
43 const std::vector<std::string>& file_names_z,
44 SensorDataLinux* data) {
45 #if defined(OS_CHROMEOS)
46 const base::Version checked_kernel_version(kChangedAxisKernelVersion);
47 DCHECK(checked_kernel_version.IsValid());
48 const base::Version current_version(base::SysInfo::OperatingSystemVersion());
49 if (current_version.IsValid() && current_version < checked_kernel_version) {
50 data->sensor_file_names.push_back(file_names_y);
51 data->sensor_file_names.push_back(file_names_x);
52 } else {
53 data->sensor_file_names.push_back(file_names_x);
54 data->sensor_file_names.push_back(file_names_y);
55 }
56 data->sensor_file_names.push_back(file_names_z);
57 #else
58 data->sensor_file_names.push_back(file_names_x);
59 data->sensor_file_names.push_back(file_names_y);
60 data->sensor_file_names.push_back(file_names_z);
61 #endif
62 }
63
64 // TODO(maksims): add support for lid accelerometer on chromeos.
65 void InitAccelerometerSensorData(SensorDataLinux* data) {
66 std::vector<std::string> file_names_x{"in_accel_x_base_raw",
67 "in_accel_x_raw"};
68 std::vector<std::string> file_names_y{"in_accel_y_base_raw",
69 "in_accel_y_raw"};
70 std::vector<std::string> file_names_z{"in_accel_z_base_raw",
71 "in_accel_z_raw"};
72
73 #if defined(OS_CHROMEOS)
74 data->sensor_scale_name = "in_accel_base_scale";
75 data->apply_scaling_func =
76 base::Bind([](double scaling_value, SensorReading& reading) {
77 double scaling = kMeanGravity / scaling_value;
78 reading.values[0] = scaling * reading.values[0];
79 reading.values[1] = scaling * reading.values[1];
80 reading.values[2] = scaling * reading.values[2];
81 });
82 #else
83 data->sensor_scale_name = "in_accel_scale";
84 data->apply_scaling_func =
85 base::Bind([](double scaling_value, SensorReading& reading) {
86 // Adapt Linux reading values to generic sensor api specs.
87 reading.values[0] = -scaling_value * reading.values[0];
88 reading.values[1] = -scaling_value * reading.values[1];
89 reading.values[2] = -scaling_value * reading.values[2];
90 });
91 #endif
92
93 MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
94 file_names_z, data);
95 data->reporting_mode = mojom::ReportingMode::CONTINUOUS;
96 data->default_configuration =
97 PlatformSensorConfiguration(kDefaultAccelerometerFrequencyHz);
98 }
99
100 void InitGyroscopeSensorData(SensorDataLinux* data) {
101 std::vector<std::string> file_names_x{"in_anglvel_x_base_raw",
102 "in_anglvel_x_raw"};
103 std::vector<std::string> file_names_y{"in_anglvel_y_base_raw",
104 "in_anglvel_y_raw"};
105 std::vector<std::string> file_names_z{"in_anglvel_z_base_raw",
106 "in_anglvel_z_raw"};
107 #if defined(OS_CHROMEOS)
108 data->sensor_scale_name = "in_anglvel_base_scale";
109 data->apply_scaling_func =
110 base::Bind([](double scaling_value, SensorReading& reading) {
111 double scaling =
112 kMeanGravity * kRadiansInDegreesPerSecond / scaling_value;
113 // Adapt CrOS reading values to generic sensor api specs.
114 reading.values[0] = -scaling * reading.values[0];
115 reading.values[1] = -scaling * reading.values[1];
116 reading.values[2] = -scaling * reading.values[2];
117 });
118 #else
119 data->sensor_scale_name = "in_anglvel_scale";
120 data->apply_scaling_func =
121 base::Bind([](double scaling_value, SensorReading& reading) {
122 reading.values[0] = scaling_value * reading.values[0];
123 reading.values[1] = scaling_value * reading.values[1];
124 reading.values[2] = scaling_value * reading.values[2];
125 });
126 #endif
127
128 MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
129 file_names_z, data);
130 data->reporting_mode = mojom::ReportingMode::CONTINUOUS;
131 data->default_configuration =
132 PlatformSensorConfiguration(kDefaultGyroscopeFrequencyHz);
133 }
134
135 // TODO(maksims): Verify magnitometer works correctly on a chromebook when
136 // I get one with that sensor onboard.
137 void InitMagnitometerSensorData(SensorDataLinux* data) {
138 std::vector<std::string> file_names_x{"in_magn_x_raw"};
139 std::vector<std::string> file_names_y{"in_magn_y_raw"};
140 std::vector<std::string> file_names_z{"in_magn_z_raw"};
141
142 data->sensor_scale_name = "in_magn_scale";
143 data->apply_scaling_func = base::Bind([](double scaling_value,
144 SensorReading& reading) {
145 reading.values[0] = scaling_value * kMicroteslaInGauss * reading.values[0];
146 reading.values[1] = scaling_value * kMicroteslaInGauss * reading.values[1];
147 reading.values[2] = scaling_value * kMicroteslaInGauss * reading.values[2];
148 });
149
150 MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
151 file_names_z, data);
152 data->reporting_mode = mojom::ReportingMode::CONTINUOUS;
153 data->default_configuration =
154 PlatformSensorConfiguration(kDefaultMagnetometerFrequencyHz);
155 }
156
28 } // namespace 157 } // namespace
29 158
30 SensorDataLinux::SensorDataLinux() : base_path_sensor_linux(kSensorsBasePath) {} 159 SensorDataLinux::SensorDataLinux() : base_path_sensor_linux(kSensorsBasePath) {}
31 160
32 SensorDataLinux::~SensorDataLinux() = default; 161 SensorDataLinux::~SensorDataLinux() = default;
33 162
34 SensorDataLinux::SensorDataLinux(const SensorDataLinux& other) = default; 163 SensorDataLinux::SensorDataLinux(const SensorDataLinux& other) = default;
35 164
36 bool InitSensorData(SensorType type, SensorDataLinux* data) { 165 bool InitSensorData(SensorType type, SensorDataLinux* data) {
37 DCHECK(data); 166 DCHECK(data);
38 167
39 switch (type) { 168 switch (type) {
40 case SensorType::AMBIENT_LIGHT: { 169 case SensorType::AMBIENT_LIGHT:
41 InitAmbientLightSensorData(data); 170 InitAmbientLightSensorData(data);
42 break; 171 break;
43 } 172 case SensorType::ACCELEROMETER:
44 default: { 173 InitAccelerometerSensorData(data);
174 break;
175 case SensorType::GYROSCOPE:
176 InitGyroscopeSensorData(data);
177 break;
178 case SensorType::MAGNETOMETER:
179 InitMagnitometerSensorData(data);
180 break;
181 default:
45 NOTIMPLEMENTED(); 182 NOTIMPLEMENTED();
46 return false; 183 return false;
47 }
48 } 184 }
185
49 return true; 186 return true;
50 } 187 }
51 188
52 } // namespace device 189 } // namespace device
OLDNEW
« no previous file with comments | « device/generic_sensor/linux/sensor_data_linux.h ('k') | device/generic_sensor/linux/sensor_reader_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698