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

Commit 1900bef1 authored by Chris Forbes's avatar Chris Forbes
Browse files

thermal: Add AThermal_getThermalHeadroom

Bug: b/168612028
Change-Id: I8f192b50f74b1666beeab3ad546c9e3b25842187
parent 2b95ad43
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -291,6 +291,7 @@ LIBANDROID {
    AThermal_getCurrentThermalStatus; # introduced=30
    AThermal_getCurrentThermalStatus; # introduced=30
    AThermal_registerThermalStatusListener; # introduced=30
    AThermal_registerThermalStatusListener; # introduced=30
    AThermal_unregisterThermalStatusListener; # introduced=30
    AThermal_unregisterThermalStatusListener; # introduced=30
    AThermal_getThermalHeadroom; # introduced=31
  local:
  local:
    *;
    *;
};
};
+43 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@


#include <cerrno>
#include <cerrno>
#include <thread>
#include <thread>
#include <limits>


#include <android/thermal.h>
#include <android/thermal.h>
#include <android/os/BnThermalStatusListener.h>
#include <android/os/BnThermalStatusListener.h>
@@ -52,6 +53,7 @@ struct AThermalManager {
        status_t getCurrentThermalStatus(int32_t *status);
        status_t getCurrentThermalStatus(int32_t *status);
        status_t addListener(AThermal_StatusCallback, void *data);
        status_t addListener(AThermal_StatusCallback, void *data);
        status_t removeListener(AThermal_StatusCallback, void *data);
        status_t removeListener(AThermal_StatusCallback, void *data);
        status_t getThermalHeadroom(int32_t forecastSeconds, float *result);
   private:
   private:
       AThermalManager(sp<IThermalService> service);
       AThermalManager(sp<IThermalService> service);
       sp<IThermalService> mThermalSvc;
       sp<IThermalService> mThermalSvc;
@@ -184,6 +186,18 @@ status_t AThermalManager::getCurrentThermalStatus(int32_t *status) {
    return OK;
    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
  * Acquire an instance of the thermal manager. This must be freed using
  * {@link AThermal_releaseManager}.
  * {@link AThermal_releaseManager}.
@@ -259,3 +273,32 @@ int AThermal_unregisterThermalStatusListener(AThermalManager *manager,
        AThermal_StatusCallback callback, void *data) {
        AThermal_StatusCallback callback, void *data) {
    return manager->removeListener(callback, 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;
}