Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 252a8c5e authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Only requantize sensor max range if significant" into sc-dev

parents 6fc4147f 3dd8502a
Loading
Loading
Loading
Loading
+17 −13
Original line number Original line Diff line number Diff line
@@ -132,8 +132,6 @@ SensorDevice::SensorDevice()
}
}


void SensorDevice::initializeSensorList() {
void SensorDevice::initializeSensorList() {
    float minPowerMa = 0.001; // 1 microAmp

    checkReturn(mSensors->getSensorsList(
    checkReturn(mSensors->getSensorsList(
            [&](const auto &list) {
            [&](const auto &list) {
                const size_t count = list.size();
                const size_t count = list.size();
@@ -151,13 +149,18 @@ void SensorDevice::initializeSensorList() {
                        // Don't crash in this case since CTS will verify that devices don't go to
                        // Don't crash in this case since CTS will verify that devices don't go to
                        // production with a resolution of 0.
                        // production with a resolution of 0.
                        if (sensor.resolution != 0) {
                        if (sensor.resolution != 0) {
                            double promotedResolution = sensor.resolution;
                            float quantizedRange = sensor.maxRange;
                            double promotedMaxRange = sensor.maxRange;
                            if (fmod(promotedMaxRange, promotedResolution) != 0) {
                                ALOGW("%s's max range %f is not a multiple of the resolution %f",
                                        sensor.name, sensor.maxRange, sensor.resolution);
                            SensorDeviceUtils::quantizeValue(
                            SensorDeviceUtils::quantizeValue(
                                        &sensor.maxRange, promotedResolution);
                                    &quantizedRange, sensor.resolution, /*factor=*/ 1);
                            // Only rewrite maxRange if the requantization produced a "significant"
                            // change, which is fairly arbitrarily defined as resolution / 8.
                            // Smaller deltas are permitted, as they may simply be due to floating
                            // point representation error, etc.
                            if (fabsf(sensor.maxRange - quantizedRange) > sensor.resolution / 8) {
                                ALOGW("%s's max range %.12f is not a multiple of the resolution "
                                      "%.12f - updated to %.12f", sensor.name, sensor.maxRange,
                                      sensor.resolution, quantizedRange);
                                sensor.maxRange = quantizedRange;
                            }
                            }
                        } else {
                        } else {
                            // Don't crash here or the device will go into a crashloop.
                            // Don't crash here or the device will go into a crashloop.
@@ -166,10 +169,11 @@ void SensorDevice::initializeSensorList() {
                    }
                    }


                    // Sanity check and clamp power if it is 0 (or close)
                    // Sanity check and clamp power if it is 0 (or close)
                    if (sensor.power < minPowerMa) {
                    constexpr float MIN_POWER_MA = 0.001; // 1 microAmp
                        ALOGI("Reported power %f not deemed sane, clamping to %f",
                    if (sensor.power < MIN_POWER_MA) {
                              sensor.power, minPowerMa);
                        ALOGI("%s's reported power %f invalid, clamped to %f",
                        sensor.power = minPowerMa;
                              sensor.name, sensor.power, MIN_POWER_MA);
                        sensor.power = MIN_POWER_MA;
                    }
                    }
                    mSensorList.push_back(sensor);
                    mSensorList.push_back(sensor);


+5 −6
Original line number Original line Diff line number Diff line
@@ -32,16 +32,15 @@ using ::android::hidl::manager::V1_0::IServiceNotification;
namespace android {
namespace android {
namespace SensorDeviceUtils {
namespace SensorDeviceUtils {


// Quantizes a single value using a sensor's resolution.
// Quantizes a single value to (a fractional factor of) a sensor's resolution. Typically we
inline void quantizeValue(float *value, double resolution) {
// increase the value of the sensor's nominal resolution to ensure that sensor accuracy
// improvements, like runtime calibration, are not masked during requantization.
inline void quantizeValue(float *value, double resolution, double factor = 0.125) {
    if (resolution == 0) {
    if (resolution == 0) {
        return;
        return;
    }
    }


    // Increase the value of the sensor's nominal resolution to ensure that
    double incRes = factor * resolution;
    // sensor accuracy improvements, like runtime calibration, are not masked
    // during requantization.
    double incRes = 0.125 * resolution;
    *value = round(static_cast<double>(*value) / incRes) * incRes;
    *value = round(static_cast<double>(*value) / incRes) * incRes;
}
}