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 |
(...skipping 10 matching lines...) Expand all Loading... | |
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 Loading... | |
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 |
OLD | NEW |