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) { ...@@ -74,10 +74,10 @@ void InitAccelerometerSensorData(SensorPathsLinux* data) {
data->sensor_frequency_file_name = "in_accel_base_sampling_frequency"; data->sensor_frequency_file_name = "in_accel_base_sampling_frequency";
data->apply_scaling_func = base::Bind( data->apply_scaling_func = base::Bind(
[](double scaling_value, double offset, SensorReading& reading) { [](double scaling_value, double offset, SensorReading& reading) {
double scaling = (kMeanGravity / scaling_value) + offset; double scaling = kMeanGravity / scaling_value;
reading.values[0] = scaling * reading.values[0]; reading.values[0] = scaling * (reading.values[0] + offset);
reading.values[1] = scaling * reading.values[1]; reading.values[1] = scaling * (reading.values[1] + offset);
reading.values[2] = scaling * reading.values[2]; reading.values[2] = scaling * (reading.values[2] + offset);
}); });
#else #else
data->sensor_scale_name = "in_accel_scale"; data->sensor_scale_name = "in_accel_scale";
...@@ -85,11 +85,10 @@ void InitAccelerometerSensorData(SensorPathsLinux* data) { ...@@ -85,11 +85,10 @@ void InitAccelerometerSensorData(SensorPathsLinux* data) {
data->sensor_frequency_file_name = "in_accel_sampling_frequency"; data->sensor_frequency_file_name = "in_accel_sampling_frequency";
data->apply_scaling_func = base::Bind( data->apply_scaling_func = base::Bind(
[](double scaling_value, double offset, SensorReading& reading) { [](double scaling_value, double offset, SensorReading& reading) {
double scaling = scaling_value + offset;
// Adapt Linux reading values to generic sensor api specs. // Adapt Linux reading values to generic sensor api specs.
reading.values[0] = -scaling * reading.values[0]; reading.values[0] = -scaling_value * (reading.values[0] + offset);
reading.values[1] = -scaling * reading.values[1]; reading.values[1] = -scaling_value * (reading.values[1] + offset);
reading.values[2] = -scaling * reading.values[2]; reading.values[2] = -scaling_value * (reading.values[2] + offset);
}); });
#endif #endif
...@@ -109,25 +108,23 @@ void InitGyroscopeSensorData(SensorPathsLinux* data) { ...@@ -109,25 +108,23 @@ void InitGyroscopeSensorData(SensorPathsLinux* data) {
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
data->sensor_scale_name = "in_anglvel_base_scale"; data->sensor_scale_name = "in_anglvel_base_scale";
data->sensor_frequency_file_name = "in_anglvel_base_frequency"; data->sensor_frequency_file_name = "in_anglvel_base_frequency";
data->apply_scaling_func = base::Bind( data->apply_scaling_func = base::Bind([](double scaling_value, double offset,
[](double scaling_value, double offset, SensorReading& reading) { SensorReading& reading) {
double scaling = double scaling = kMeanGravity * kRadiansInDegreesPerSecond / scaling_value;
kMeanGravity * kRadiansInDegreesPerSecond / scaling_value + offset; // Adapt CrOS reading values to generic sensor api specs.
// Adapt CrOS reading values to generic sensor api specs. reading.values[0] = -scaling * (reading.values[0] + offset);
reading.values[0] = -scaling * reading.values[0]; reading.values[1] = -scaling * (reading.values[1] + offset);
reading.values[1] = -scaling * reading.values[1]; reading.values[2] = -scaling * (reading.values[2] + offset);
reading.values[2] = -scaling * reading.values[2]; });
});
#else #else
data->sensor_scale_name = "in_anglvel_scale"; data->sensor_scale_name = "in_anglvel_scale";
data->sensor_offset_file_name = "in_anglvel_offset"; data->sensor_offset_file_name = "in_anglvel_offset";
data->sensor_frequency_file_name = "in_anglvel_sampling_frequency"; data->sensor_frequency_file_name = "in_anglvel_sampling_frequency";
data->apply_scaling_func = base::Bind( data->apply_scaling_func = base::Bind(
[](double scaling_value, double offset, SensorReading& reading) { [](double scaling_value, double offset, SensorReading& reading) {
double scaling = scaling_value + offset; reading.values[0] = scaling_value * (reading.values[0] + offset);
reading.values[0] = scaling * reading.values[0]; reading.values[1] = scaling_value * (reading.values[1] + offset);
reading.values[1] = scaling * reading.values[1]; reading.values[2] = scaling_value * (reading.values[2] + offset);
reading.values[2] = scaling * reading.values[2];
}); });
#endif #endif
...@@ -149,10 +146,10 @@ void InitMagnitometerSensorData(SensorPathsLinux* data) { ...@@ -149,10 +146,10 @@ void InitMagnitometerSensorData(SensorPathsLinux* data) {
data->sensor_frequency_file_name = "in_magn_sampling_frequency"; data->sensor_frequency_file_name = "in_magn_sampling_frequency";
data->apply_scaling_func = base::Bind( data->apply_scaling_func = base::Bind(
[](double scaling_value, double offset, SensorReading& reading) { [](double scaling_value, double offset, SensorReading& reading) {
double scaling = scaling_value + offset; double scaling = scaling_value * kMicroteslaInGauss;
reading.values[0] = scaling * kMicroteslaInGauss * reading.values[0]; reading.values[0] = scaling * (reading.values[0] + offset);
reading.values[1] = scaling * kMicroteslaInGauss * reading.values[1]; reading.values[1] = scaling * (reading.values[1] + offset);
reading.values[2] = scaling * kMicroteslaInGauss * reading.values[2]; reading.values[2] = scaling * (reading.values[2] + offset);
}); });
MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y, MaybeCheckKernelVersionAndAssignFileNames(file_names_x, file_names_y,
......
...@@ -550,10 +550,13 @@ TEST_F(PlatformSensorAndProviderLinuxTest, ...@@ -550,10 +550,13 @@ TEST_F(PlatformSensorAndProviderLinuxTest,
EXPECT_THAT(buffer->reading.values[1], scaling * sensor_values[1]); EXPECT_THAT(buffer->reading.values[1], scaling * sensor_values[1]);
EXPECT_THAT(buffer->reading.values[2], scaling * sensor_values[2]); EXPECT_THAT(buffer->reading.values[2], scaling * sensor_values[2]);
#else #else
double scaling = kAccelerometerScalingValue + kAccelerometerOffsetValue; double scaling = kAccelerometerScalingValue;
EXPECT_THAT(buffer->reading.values[0], -scaling * sensor_values[0]); EXPECT_THAT(buffer->reading.values[0],
EXPECT_THAT(buffer->reading.values[1], -scaling * sensor_values[1]); -scaling * (sensor_values[0] + kAccelerometerOffsetValue));
EXPECT_THAT(buffer->reading.values[2], -scaling * sensor_values[2]); EXPECT_THAT(buffer->reading.values[1],
-scaling * (sensor_values[1] + kAccelerometerOffsetValue));
EXPECT_THAT(buffer->reading.values[2],
-scaling * (sensor_values[2] + kAccelerometerOffsetValue));
#endif #endif
} }
...@@ -604,10 +607,13 @@ TEST_F(PlatformSensorAndProviderLinuxTest, CheckGyroscopeReadingConversion) { ...@@ -604,10 +607,13 @@ TEST_F(PlatformSensorAndProviderLinuxTest, CheckGyroscopeReadingConversion) {
EXPECT_THAT(buffer->reading.values[1], -scaling * sensor_values[1]); EXPECT_THAT(buffer->reading.values[1], -scaling * sensor_values[1]);
EXPECT_THAT(buffer->reading.values[2], -scaling * sensor_values[2]); EXPECT_THAT(buffer->reading.values[2], -scaling * sensor_values[2]);
#else #else
double scaling = kGyroscopeScalingValue + kGyroscopeOffsetValue; double scaling = kGyroscopeScalingValue;
EXPECT_THAT(buffer->reading.values[0], scaling * sensor_values[0]); EXPECT_THAT(buffer->reading.values[0],
EXPECT_THAT(buffer->reading.values[1], scaling * sensor_values[1]); scaling * (sensor_values[0] + kGyroscopeOffsetValue));
EXPECT_THAT(buffer->reading.values[2], scaling * sensor_values[2]); EXPECT_THAT(buffer->reading.values[1],
scaling * (sensor_values[1] + kGyroscopeOffsetValue));
EXPECT_THAT(buffer->reading.values[2],
scaling * (sensor_values[2] + kGyroscopeOffsetValue));
#endif #endif
} }
...@@ -651,11 +657,13 @@ TEST_F(PlatformSensorAndProviderLinuxTest, CheckMagnetometerReadingConversion) { ...@@ -651,11 +657,13 @@ TEST_F(PlatformSensorAndProviderLinuxTest, CheckMagnetometerReadingConversion) {
SensorReadingSharedBuffer* buffer = SensorReadingSharedBuffer* buffer =
static_cast<SensorReadingSharedBuffer*>(mapping.get()); static_cast<SensorReadingSharedBuffer*>(mapping.get());
double scaling = (kMagnetometerScalingValue + kMagnetometerOffsetValue) * double scaling = kMagnetometerScalingValue * kMicroteslaInGauss;
kMicroteslaInGauss; EXPECT_THAT(buffer->reading.values[0],
EXPECT_THAT(buffer->reading.values[0], scaling * sensor_values[0]); scaling * (sensor_values[0] + kMagnetometerOffsetValue));
EXPECT_THAT(buffer->reading.values[1], scaling * sensor_values[1]); EXPECT_THAT(buffer->reading.values[1],
EXPECT_THAT(buffer->reading.values[2], scaling * sensor_values[2]); scaling * (sensor_values[1] + kMagnetometerOffsetValue));
EXPECT_THAT(buffer->reading.values[2],
scaling * (sensor_values[2] + kMagnetometerOffsetValue));
} }
} // namespace device } // 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