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

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

Powered by Google App Engine
This is Rietveld 408576698