/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @addtogroup Thermal
* @{
*/
/**
* @file thermal.h
*/
#ifndef _ANDROID_THERMAL_H
#define _ANDROID_THERMAL_H
#include To use:
*
* The value should be monotonically non-decreasing as the thermal status increases. * For {@link ATHERMAL_STATUS_SEVERE}, its headroom threshold is guaranteed to * be 1.0f. For status below severe status, the value should be lower or equal * to 1.0f, and for status above severe, the value should be larger or equal to 1.0f. *
* Also see {@link AThermal_getThermalHeadroom} for explanation on headroom, and * {@link AThermal_getThermalHeadroomThresholds} for how to use this. */ struct AThermalHeadroomThreshold { float headroom; AThermalStatus thermalStatus; }; typedef struct AThermalHeadroomThreshold AThermalHeadroomThreshold; /** * Gets the thermal headroom thresholds for all available thermal status. * * A thermal status will only exist in output if the device manufacturer has the * corresponding threshold defined for at least one of its slow-moving skin temperature * sensors. If it's set, one should also expect to get it from * {@link #AThermal_getCurrentThermalStatus} or {@link AThermal_StatusCallback}. *
* The headroom threshold is used to interpret the possible thermal throttling status based on * the headroom prediction. For example, if the headroom threshold for * {@link ATHERMAL_STATUS_LIGHT} is 0.7, and a headroom prediction in 10s returns 0.75 * (or `AThermal_getThermalHeadroom(10)=0.75}`, one can expect that in 10 seconds the system * could be in lightly throttled state if the workload remains the same. The app can consider * taking actions according to the nearest throttling status the difference between the headroom and * the threshold. *
* For new devices it's guaranteed to have a single sensor, but for older devices with multiple * sensors reporting different threshold values, the minimum threshold is taken to be conservative * on predictions. Thus, when reading real-time headroom, it's not guaranteed that a real-time value * of 0.75 (or `AThermal_getThermalHeadroom(0)=0.75`) exceeding the threshold of 0.7 above * will always come with lightly throttled state * (or `AThermal_getCurrentThermalStatus()=ATHERMAL_STATUS_LIGHT`) but it can be lower * (or `AThermal_getCurrentThermalStatus()=ATHERMAL_STATUS_NONE`). * While it's always guaranteed that the device won't be throttled heavier than the unmet * threshold's state, so a real-time headroom of 0.75 will never come with * {@link #ATHERMAL_STATUS_MODERATE} but always lower, and 0.65 will never come with * {@link ATHERMAL_STATUS_LIGHT} but {@link #ATHERMAL_STATUS_NONE}. *
* Starting in Android 16, this polling API may return different results when called depending on * the device. The new headroom listener API {@link #AThermal_HeadroomCallback} can be used to * detect headroom thresholds changes. *
* Before API level 36 the returned list of thresholds is cached on first successful query and owned * by the thermal manager, which will not change between calls to this function. The caller should * only need to free the manager with {@link AThermal_releaseManager}. *
* * @param manager The manager instance to use. * Acquired via {@link AThermal_acquireManager}. * @param outThresholds non-null output pointer to null AThermalHeadroomThreshold pointer, which * will be set to a new array of thresholds if thermal thresholds are supported * by the system or device, otherwise nullptr or unmodified. The client should * clean up the thresholds by array-deleting the threshold pointer. * @param size non-null output pointer whose value will be set to the size of the threshold array * or 0 if it's not supported. * @return 0 on success * EINVAL if outThresholds or size_t is nullptr, or *outThresholds is not nullptr. * EPIPE if communication with the system service has failed. * ENOSYS if the feature is disabled by the current system. */ int AThermal_getThermalHeadroomThresholds(AThermalManager* _Nonnull manager, const AThermalHeadroomThreshold* _Nonnull * _Nullable outThresholds, size_t* _Nonnull size) __INTRODUCED_IN(35); /** * Prototype of the function that is called when thermal headroom or thresholds changes. * It's passed the updated thermal headroom and thresholds as parameters, as well as the * pointer provided by the client that registered a callback. *
* This may not be used to fully replace the {@link AThermal_getThermalHeadroom} API as it will * only notify on one of the conditions below that will significantly change one or both * values of current headroom and headroom thresholds since previous callback: * 1. thermal throttling events: when the skin temperature has cross any of the thresholds * and there isn't a previous callback in a short time ago with similar values. * 2. skin temperature threshold change events: note that if the absolute °C threshold * values change in a way that does not significantly change the current headroom nor * headroom thresholds, it will not trigger any callback. The client should not * need to take action in such case since the difference from temperature vs threshold * hasn't changed. *
* By API version 36, it provides a forecast in the same call for developer's convenience * based on a {@code forecastSeconds} defined by the device, which can be static or dynamic * varied by OEM. Be aware that it will not notify on forecast temperature change but the * events mentioned above. So periodically polling against {@link AThermal_getThermalHeadroom} * API should still be used to actively monitor temperature forecast in advance. *
* This serves as a more advanced option compared to thermal status listener, where the * latter will only notify on thermal throttling events with status update. * * @param data The data pointer to be passed when callback is called. * @param headroom The current non-negative normalized headroom value, also see * {@link AThermal_getThermalHeadroom}. * @param forecastHeadroom The forecasted non-negative normalized headroom value, also see * {@link AThermal_getThermalHeadroom}. * @param forecastSeconds The seconds used for the forecast by the system. * @param thresholds The current headroom thresholds. The thresholds pointer will be a constant * shared across all callbacks registered from the same process, and it will be * destroyed after all the callbacks are finished. If the client intents to * persist the values, it should make a copy of it during the callback. * @param thresholdsCount The count of thresholds. */ typedef void (*AThermal_HeadroomCallback)(void *_Nullable data, float headroom, float forecastHeadroom, int forecastSeconds, const AThermalHeadroomThreshold* _Nullable thresholds, size_t thresholdsCount); /** * Register a thermal headroom listener for thermal headroom or thresholds change. * * Available since API level 36. * * @param manager The manager instance to use to register. * Acquired via {@link AThermal_acquireManager}. * @param callback The callback function to be called on system binder thread pool when thermal * headroom or thresholds update. * @param data The data pointer to be passed when callback is called. * * @return 0 on success * EINVAL if the listener and data pointer were previously added and not removed. * EPIPE if communication with the system service has failed. */ int AThermal_registerThermalHeadroomListener(AThermalManager* _Nonnull manager, AThermal_HeadroomCallback _Nullable callback, void* _Nullable data) __INTRODUCED_IN(36); /** * Unregister a thermal headroom listener previously registered. * * No subsequent invocations of the callback will occur after this function returns successfully. * * Available since API level 36. * * @param manager The manager instance to use to unregister. * Acquired via {@link AThermal_acquireManager}. * @param callback The callback function that was previously registered. * @param data The data pointer that was previously registered. * * @return 0 on success * EINVAL if the listener and data pointer were not previously added. * EPIPE if communication with the system service has failed, the listener will not get * removed and this call should be retried */ int AThermal_unregisterThermalHeadroomListener(AThermalManager* _Nonnull manager, AThermal_HeadroomCallback _Nullable callback, void* _Nullable data) __INTRODUCED_IN(36); #ifdef __cplusplus } #endif #endif // _ANDROID_THERMAL_H /** @} */