OLD | NEW |
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 |
OLD | NEW |