Chromium Code Reviews| 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 |