thermal: Add AThermal_getThermalHeadroom
Bug: b/168612028
Change-Id: I8f192b50f74b1666beeab3ad546c9e3b25842187
diff --git a/native/android/thermal.cpp b/native/android/thermal.cpp
index 545c423..1f6ef47 100644
--- a/native/android/thermal.cpp
+++ b/native/android/thermal.cpp
@@ -18,6 +18,7 @@
#include <cerrno>
#include <thread>
+#include <limits>
#include <android/thermal.h>
#include <android/os/BnThermalStatusListener.h>
@@ -52,6 +53,7 @@
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 @@
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 @@
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;
+}