Loading services/sensorservice/SensorDevice.cpp +17 −13 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading @@ -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. Loading @@ -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); Loading services/sensorservice/SensorDeviceUtils.h +5 −6 Original line number Original line Diff line number Diff line Loading @@ -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; } } Loading Loading
services/sensorservice/SensorDevice.cpp +17 −13 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading @@ -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. Loading @@ -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); Loading
services/sensorservice/SensorDeviceUtils.h +5 −6 Original line number Original line Diff line number Diff line Loading @@ -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; } } Loading