thermal: Add AThermal_getThermalHeadroom

Bug: b/168612028
Change-Id: I8f192b50f74b1666beeab3ad546c9e3b25842187
This commit is contained in:
Chris Forbes
2020-09-15 09:39:18 -07:00
parent 2b95ad43fc
commit 1900bef116
2 changed files with 44 additions and 0 deletions

View File

@@ -291,6 +291,7 @@ LIBANDROID {
AThermal_getCurrentThermalStatus; # introduced=30
AThermal_registerThermalStatusListener; # introduced=30
AThermal_unregisterThermalStatusListener; # introduced=30
AThermal_getThermalHeadroom; # introduced=31
local:
*;
};

View File

@@ -18,6 +18,7 @@
#include <cerrno>
#include <thread>
#include <limits>
#include <android/thermal.h>
#include <android/os/BnThermalStatusListener.h>
@@ -52,6 +53,7 @@ struct AThermalManager {
status_t getCurrentThermalStatus(int32_t *status);
status_t addListener(AThermal_StatusCallback, void *data);
status_t removeListener(AThermal_StatusCallback, void *data);
status_t getThermalHeadroom(int32_t forecastSeconds, float *result);
private:
AThermalManager(sp<IThermalService> service);
sp<IThermalService> mThermalSvc;
@@ -184,6 +186,18 @@ status_t AThermalManager::getCurrentThermalStatus(int32_t *status) {
return OK;
}
status_t AThermalManager::getThermalHeadroom(int32_t forecastSeconds, float *result) {
binder::Status ret = mThermalSvc->getThermalHeadroom(forecastSeconds, result);
if (!ret.isOk()) {
if (ret.exceptionCode() == binder::Status::EX_SECURITY) {
return EPERM;
}
return EPIPE;
}
return OK;
}
/**
* Acquire an instance of the thermal manager. This must be freed using
* {@link AThermal_releaseManager}.
@@ -259,3 +273,32 @@ int AThermal_unregisterThermalStatusListener(AThermalManager *manager,
AThermal_StatusCallback callback, void *data) {
return manager->removeListener(callback, data);
}
/**
* Provides an estimate of how much thermal headroom the device currently has
* before hitting severe throttling.
*
* Note that this only attempts to track the headroom of slow-moving sensors,
* such as the skin temperature sensor. This means that there is no benefit to
* calling this function more frequently than about once per second, and attempts
* to call significantly more frequently may result in the function returning {@code NaN}.
*
* See also PowerManager#getThermalHeadroom.
*
* @param manager The manager instance to use
* @param forecastSeconds how many seconds in the future to forecast
* @return a value greater than or equal to 0.0 where 1.0 indicates the SEVERE throttling
* threshold. Returns NaN if the device does not support this functionality or if
* this function is called significantly faster than once per second.
*/
float AThermal_getThermalHeadroom(AThermalManager *manager,
int forecastSeconds) {
float result = 0.0f;
status_t ret = manager->getThermalHeadroom(forecastSeconds, &result);
if (ret != OK) {
result = std::numeric_limits<float>::quiet_NaN();
}
return result;
}