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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: device/generic_sensor/linux/sensor_data_linux.cc
diff --git a/device/generic_sensor/linux/sensor_data_linux.cc b/device/generic_sensor/linux/sensor_data_linux.cc
index 08285512d6cd8c45b6511e549b183b397ae5006f..1d937c8b25ccc7ea9ea31f139e67b4609a67bf16 100644
--- a/device/generic_sensor/linux/sensor_data_linux.cc
+++ b/device/generic_sensor/linux/sensor_data_linux.cc
@@ -2,8 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/sys_info.h"
+#include "base/version.h"
+#include "device/generic_sensor/generic_sensor_consts.h"
#include "device/generic_sensor/linux/sensor_data_linux.h"
-#include "device/sensors/public/cpp/device_sensors_consts.h"
+#include "device/generic_sensor/public/cpp/sensor_reading.h"
namespace device {
@@ -11,6 +14,12 @@ namespace {
using mojom::SensorType;
+#if defined(OS_CHROMEOS)
+// ChromeOS kernel version, when axes were changed to XYZ. Before 3.18,
+// they were YXZ.
+const char kChangedAxisKernelVersion[] = "3.18.0";
+#endif
+
const base::FilePath::CharType* kSensorsBasePath =
FILE_PATH_LITERAL("/sys/bus/iio/devices");
@@ -18,13 +27,133 @@ void InitAmbientLightSensorData(SensorDataLinux* data) {
std::vector<std::string> file_names{
"in_illuminance0_input", "in_illuminance_input", "in_illuminance0_raw",
"in_illuminance_raw"};
-
data->sensor_file_names.push_back(std::move(file_names));
data->reporting_mode = mojom::ReportingMode::ON_CHANGE;
data->default_configuration =
PlatformSensorConfiguration(kDefaultAmbientLightFrequencyHz);
}
+// Depending on a kernel version, CrOS has a different axes plane.
+// Before 3.18 it was YXZ and after XYZ.
+// TODO(maksims): Track crbug.com/501184. 3.14 will have the same sensor stack
+// as 3.18 has, which will probably change the order of axes.
+void MaybeCheckKernelVersionAndAssignFileNames(
+ const std::vector<std::string>& file_names_x,
+ const std::vector<std::string>& file_names_y,
+ const std::vector<std::string>& file_names_z,
+ SensorDataLinux* data) {
+#if defined(OS_CHROMEOS)
+ const base::Version checked_kernel_version(kChangedAxisKernelVersion);
+ DCHECK(checked_kernel_version.IsValid());
+ const base::Version current_version(base::SysInfo::OperatingSystemVersion());
+ if (current_version.IsValid() && current_version < checked_kernel_version) {
+ data->sensor_file_names.push_back(file_names_y);
+ data->sensor_file_names.push_back(file_names_x);
+ } else {
+ data->sensor_file_names.push_back(file_names_x);
+ data->sensor_file_names.push_back(file_names_y);
+ }
+ data->sensor_file_names.push_back(file_names_z);
+#else
+ data->sensor_file_names.push_back(file_names_x);
+ data->sensor_file_names.push_back(file_names_y);
+ data->sensor_file_names.push_back(file_names_z);
+#endif
+}
+
+// TODO(maksims): add support for lid accelerometer on chromeos.
+void InitAccelerometerSensorData(SensorDataLinux* data) {
+ std::vector<std::string> file_names_x{"in_accel_x_base_raw",
+ "in_accel_x_raw"};
+ std::vector<std::string> file_names_y{"in_accel_y_base_raw",
+ "in_accel_y_raw"};
+ std::vector<std::string> file_names_z{"in_accel_z_base_raw",
+ "in_accel_z_raw"};
+
+#if defined(OS_CHROMEOS)
+ data->sensor_scale_name = "in_accel_base_scale";
+ data->apply_scaling_func =
+ base::Bind([](double scaling_value, SensorReading& reading) {
+ double scaling = kMeanGravity / scaling_value;
+ reading.values[0] = scaling * reading.values[0];
+ reading.values[1] = scaling * reading.values[1];
+ reading.values[2] = scaling * reading.values[2];
+ });
+#else
+ data->sensor_scale_name = "in_accel_scale";
+ data->apply_scaling_func =
+ base::Bind([](double scaling_value, SensorReading& reading) {
+ // Adapt Linux reading values to generic sensor api specs.
+ reading.values[0] = -scaling_value * reading.values[0];
+ reading.values[1] = -scaling_value * reading.values[1];
+ reading.values[2] = -scaling_value * reading.values[2];
+ });
+#endif
+
+ MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
+ file_names_z, data);
+ data->reporting_mode = mojom::ReportingMode::CONTINUOUS;
+ data->default_configuration =
+ PlatformSensorConfiguration(kDefaultAccelerometerFrequencyHz);
+}
+
+void InitGyroscopeSensorData(SensorDataLinux* data) {
+ std::vector<std::string> file_names_x{"in_anglvel_x_base_raw",
+ "in_anglvel_x_raw"};
+ std::vector<std::string> file_names_y{"in_anglvel_y_base_raw",
+ "in_anglvel_y_raw"};
+ std::vector<std::string> file_names_z{"in_anglvel_z_base_raw",
+ "in_anglvel_z_raw"};
+#if defined(OS_CHROMEOS)
+ data->sensor_scale_name = "in_anglvel_base_scale";
+ data->apply_scaling_func =
+ base::Bind([](double scaling_value, SensorReading& reading) {
+ double scaling =
+ kMeanGravity * kRadiansInDegreesPerSecond / scaling_value;
+ // Adapt CrOS reading values to generic sensor api specs.
+ reading.values[0] = -scaling * reading.values[0];
+ reading.values[1] = -scaling * reading.values[1];
+ reading.values[2] = -scaling * reading.values[2];
+ });
+#else
+ data->sensor_scale_name = "in_anglvel_scale";
+ data->apply_scaling_func =
+ base::Bind([](double scaling_value, SensorReading& reading) {
+ reading.values[0] = scaling_value * reading.values[0];
+ reading.values[1] = scaling_value * reading.values[1];
+ reading.values[2] = scaling_value * reading.values[2];
+ });
+#endif
+
+ MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
+ file_names_z, data);
+ data->reporting_mode = mojom::ReportingMode::CONTINUOUS;
+ data->default_configuration =
+ PlatformSensorConfiguration(kDefaultGyroscopeFrequencyHz);
+}
+
+// TODO(maksims): Verify magnitometer works correctly on a chromebook when
+// I get one with that sensor onboard.
+void InitMagnitometerSensorData(SensorDataLinux* data) {
+ std::vector<std::string> file_names_x{"in_magn_x_raw"};
+ std::vector<std::string> file_names_y{"in_magn_y_raw"};
+ std::vector<std::string> file_names_z{"in_magn_z_raw"};
+
+ data->sensor_scale_name = "in_magn_scale";
+ data->apply_scaling_func = base::Bind([](double scaling_value,
+ SensorReading& reading) {
+ reading.values[0] = scaling_value * kMicroteslaInGauss * reading.values[0];
+ reading.values[1] = scaling_value * kMicroteslaInGauss * reading.values[1];
+ reading.values[2] = scaling_value * kMicroteslaInGauss * reading.values[2];
+ });
+
+ MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
+ file_names_z, data);
+ data->reporting_mode = mojom::ReportingMode::CONTINUOUS;
+ data->default_configuration =
+ PlatformSensorConfiguration(kDefaultMagnetometerFrequencyHz);
+}
+
} // namespace
SensorDataLinux::SensorDataLinux() : base_path_sensor_linux(kSensorsBasePath) {}
@@ -37,15 +166,23 @@ bool InitSensorData(SensorType type, SensorDataLinux* data) {
DCHECK(data);
switch (type) {
- case SensorType::AMBIENT_LIGHT: {
+ case SensorType::AMBIENT_LIGHT:
InitAmbientLightSensorData(data);
break;
- }
- default: {
+ case SensorType::ACCELEROMETER:
+ InitAccelerometerSensorData(data);
+ break;
+ case SensorType::GYROSCOPE:
+ InitGyroscopeSensorData(data);
+ break;
+ case SensorType::MAGNETOMETER:
+ InitMagnitometerSensorData(data);
+ break;
+ default:
NOTIMPLEMENTED();
return false;
- }
}
+
return true;
}
« 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