Commit dd28ec07 authored by maksim.sisov's avatar maksim.sisov Committed by Commit bot

[sensors](CrOS/Linux) Fix calculations with offset

This cl fixes calculations done with offset value.
Offset value must be added to a raw value and only then multiplied
by a scaling value.
The formula is the following:
processed value = (raw + offset) * scale

BUG=661478

Review-Url: https://codereview.chromium.org/2570693004
Cr-Commit-Position: refs/heads/master@{#438132}
parent e12e3f48
......@@ -74,10 +74,10 @@ void InitAccelerometerSensorData(SensorPathsLinux* data) {
data->sensor_frequency_file_name = "in_accel_base_sampling_frequency";
data->apply_scaling_func = base::Bind(
[](double scaling_value, double offset, SensorReading& reading) {
double scaling = (kMeanGravity / scaling_value) + offset;
reading.values[0] = scaling * reading.values[0];
reading.values[1] = scaling * reading.values[1];
reading.values[2] = scaling * reading.values[2];
double scaling = kMeanGravity / scaling_value;
reading.values[0] = scaling * (reading.values[0] + offset);
reading.values[1] = scaling * (reading.values[1] + offset);
reading.values[2] = scaling * (reading.values[2] + offset);
});
#else
data->sensor_scale_name = "in_accel_scale";
......@@ -85,11 +85,10 @@ void InitAccelerometerSensorData(SensorPathsLinux* data) {
data->sensor_frequency_file_name = "in_accel_sampling_frequency";
data->apply_scaling_func = base::Bind(
[](double scaling_value, double offset, SensorReading& reading) {
double scaling = scaling_value + offset;
// Adapt Linux 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];
reading.values[0] = -scaling_value * (reading.values[0] + offset);
reading.values[1] = -scaling_value * (reading.values[1] + offset);
reading.values[2] = -scaling_value * (reading.values[2] + offset);
});
#endif
......@@ -109,25 +108,23 @@ void InitGyroscopeSensorData(SensorPathsLinux* data) {
#if defined(OS_CHROMEOS)
data->sensor_scale_name = "in_anglvel_base_scale";
data->sensor_frequency_file_name = "in_anglvel_base_frequency";
data->apply_scaling_func = base::Bind(
[](double scaling_value, double offset, SensorReading& reading) {
double scaling =
kMeanGravity * kRadiansInDegreesPerSecond / scaling_value + offset;
// 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];
});
data->apply_scaling_func = base::Bind([](double scaling_value, double offset,
SensorReading& reading) {
double scaling = kMeanGravity * kRadiansInDegreesPerSecond / scaling_value;
// Adapt CrOS reading values to generic sensor api specs.
reading.values[0] = -scaling * (reading.values[0] + offset);
reading.values[1] = -scaling * (reading.values[1] + offset);
reading.values[2] = -scaling * (reading.values[2] + offset);
});
#else
data->sensor_scale_name = "in_anglvel_scale";
data->sensor_offset_file_name = "in_anglvel_offset";
data->sensor_frequency_file_name = "in_anglvel_sampling_frequency";
data->apply_scaling_func = base::Bind(
[](double scaling_value, double offset, SensorReading& reading) {
double scaling = scaling_value + offset;
reading.values[0] = scaling * reading.values[0];
reading.values[1] = scaling * reading.values[1];
reading.values[2] = scaling * reading.values[2];
reading.values[0] = scaling_value * (reading.values[0] + offset);
reading.values[1] = scaling_value * (reading.values[1] + offset);
reading.values[2] = scaling_value * (reading.values[2] + offset);
});
#endif
......@@ -149,10 +146,10 @@ void InitMagnitometerSensorData(SensorPathsLinux* data) {
data->sensor_frequency_file_name = "in_magn_sampling_frequency";
data->apply_scaling_func = base::Bind(
[](double scaling_value, double offset, SensorReading& reading) {
double scaling = scaling_value + offset;
reading.values[0] = scaling * kMicroteslaInGauss * reading.values[0];
reading.values[1] = scaling * kMicroteslaInGauss * reading.values[1];
reading.values[2] = scaling * kMicroteslaInGauss * reading.values[2];
double scaling = scaling_value * kMicroteslaInGauss;
reading.values[0] = scaling * (reading.values[0] + offset);
reading.values[1] = scaling * (reading.values[1] + offset);
reading.values[2] = scaling * (reading.values[2] + offset);
});
MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
......
......@@ -550,10 +550,13 @@ TEST_F(PlatformSensorAndProviderLinuxTest,
EXPECT_THAT(buffer->reading.values[1], scaling * sensor_values[1]);
EXPECT_THAT(buffer->reading.values[2], scaling * sensor_values[2]);
#else
double scaling = kAccelerometerScalingValue + kAccelerometerOffsetValue;
EXPECT_THAT(buffer->reading.values[0], -scaling * sensor_values[0]);
EXPECT_THAT(buffer->reading.values[1], -scaling * sensor_values[1]);
EXPECT_THAT(buffer->reading.values[2], -scaling * sensor_values[2]);
double scaling = kAccelerometerScalingValue;
EXPECT_THAT(buffer->reading.values[0],
-scaling * (sensor_values[0] + kAccelerometerOffsetValue));
EXPECT_THAT(buffer->reading.values[1],
-scaling * (sensor_values[1] + kAccelerometerOffsetValue));
EXPECT_THAT(buffer->reading.values[2],
-scaling * (sensor_values[2] + kAccelerometerOffsetValue));
#endif
}
......@@ -604,10 +607,13 @@ TEST_F(PlatformSensorAndProviderLinuxTest, CheckGyroscopeReadingConversion) {
EXPECT_THAT(buffer->reading.values[1], -scaling * sensor_values[1]);
EXPECT_THAT(buffer->reading.values[2], -scaling * sensor_values[2]);
#else
double scaling = kGyroscopeScalingValue + kGyroscopeOffsetValue;
EXPECT_THAT(buffer->reading.values[0], scaling * sensor_values[0]);
EXPECT_THAT(buffer->reading.values[1], scaling * sensor_values[1]);
EXPECT_THAT(buffer->reading.values[2], scaling * sensor_values[2]);
double scaling = kGyroscopeScalingValue;
EXPECT_THAT(buffer->reading.values[0],
scaling * (sensor_values[0] + kGyroscopeOffsetValue));
EXPECT_THAT(buffer->reading.values[1],
scaling * (sensor_values[1] + kGyroscopeOffsetValue));
EXPECT_THAT(buffer->reading.values[2],
scaling * (sensor_values[2] + kGyroscopeOffsetValue));
#endif
}
......@@ -651,11 +657,13 @@ TEST_F(PlatformSensorAndProviderLinuxTest, CheckMagnetometerReadingConversion) {
SensorReadingSharedBuffer* buffer =
static_cast<SensorReadingSharedBuffer*>(mapping.get());
double scaling = (kMagnetometerScalingValue + kMagnetometerOffsetValue) *
kMicroteslaInGauss;
EXPECT_THAT(buffer->reading.values[0], scaling * sensor_values[0]);
EXPECT_THAT(buffer->reading.values[1], scaling * sensor_values[1]);
EXPECT_THAT(buffer->reading.values[2], scaling * sensor_values[2]);
double scaling = kMagnetometerScalingValue * kMicroteslaInGauss;
EXPECT_THAT(buffer->reading.values[0],
scaling * (sensor_values[0] + kMagnetometerOffsetValue));
EXPECT_THAT(buffer->reading.values[1],
scaling * (sensor_values[1] + kMagnetometerOffsetValue));
EXPECT_THAT(buffer->reading.values[2],
scaling * (sensor_values[2] + kMagnetometerOffsetValue));
}
} // namespace device
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment