| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2020 The Android Open Source Project | 
 | 3 |  * | 
 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  * you may not use this file except in compliance with the License. | 
 | 6 |  * You may obtain a copy of the License at | 
 | 7 |  * | 
 | 8 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  * | 
 | 10 |  * Unless required by applicable law or agreed to in writing, software | 
 | 11 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  * See the License for the specific language governing permissions and | 
 | 14 |  * limitations under the License. | 
 | 15 |  */ | 
 | 16 |  | 
 | 17 | /** | 
 | 18 |  * @addtogroup Thermal | 
 | 19 |  * @{ | 
 | 20 |  */ | 
 | 21 |  | 
 | 22 | /** | 
 | 23 |  * @file thermal.h | 
 | 24 |  */ | 
 | 25 |  | 
 | 26 | #ifndef _ANDROID_THERMAL_H | 
 | 27 | #define _ANDROID_THERMAL_H | 
 | 28 |  | 
 | 29 | #include <sys/cdefs.h> | 
 | 30 |  | 
 | 31 | /****************************************************************** | 
 | 32 |  * | 
 | 33 |  * IMPORTANT NOTICE: | 
 | 34 |  * | 
 | 35 |  *   This file is part of Android's set of stable system headers | 
 | 36 |  *   exposed by the Android NDK (Native Development Kit). | 
 | 37 |  * | 
 | 38 |  *   Third-party source AND binary code relies on the definitions | 
 | 39 |  *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES. | 
 | 40 |  * | 
 | 41 |  *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES) | 
 | 42 |  *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS | 
 | 43 |  *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY | 
 | 44 |  *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES | 
 | 45 |  */ | 
 | 46 |  | 
 | 47 | /* | 
 | 48 |  * Structures and functions to access thermal status and register/unregister | 
 | 49 |  * thermal status listener in native code. | 
 | 50 |  */ | 
 | 51 |  | 
 | 52 | #include <stdint.h> | 
 | 53 | #include <sys/types.h> | 
 | 54 |  | 
 | 55 | #if !defined(__INTRODUCED_IN) | 
| Chris Forbes | 56e925a | 2020-09-15 09:34:59 -0700 | [diff] [blame] | 56 | #define __INTRODUCED_IN(__api_level) /* nothing */ | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 57 | #endif | 
 | 58 |  | 
 | 59 | #ifdef __cplusplus | 
 | 60 | extern "C" { | 
 | 61 | #endif | 
 | 62 |  | 
| gfan | 5d5faa4 | 2021-04-12 15:14:29 -0700 | [diff] [blame] | 63 | /** | 
 | 64 |  * Thermal status used in function {@link AThermal_getCurrentThermalStatus} and | 
 | 65 |  * {@link AThermal_StatusCallback}. | 
 | 66 |  */ | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 67 | enum AThermalStatus { | 
 | 68 |     /** Error in thermal status. */ | 
 | 69 |     ATHERMAL_STATUS_ERROR = -1, | 
 | 70 |     /** Not under throttling. */ | 
 | 71 |     ATHERMAL_STATUS_NONE = 0, | 
 | 72 |     /** Light throttling where UX is not impacted. */ | 
 | 73 |     ATHERMAL_STATUS_LIGHT = 1, | 
 | 74 |     /** Moderate throttling where UX is not largely impacted. */ | 
 | 75 |     ATHERMAL_STATUS_MODERATE = 2, | 
 | 76 |     /** Severe throttling where UX is largely impacted. */ | 
 | 77 |     ATHERMAL_STATUS_SEVERE = 3, | 
 | 78 |     /** Platform has done everything to reduce power. */ | 
 | 79 |     ATHERMAL_STATUS_CRITICAL = 4, | 
 | 80 |     /** | 
 | 81 |      * Key components in platform are shutting down due to thermal condition. | 
 | 82 |      * Device functionalities will be limited. | 
 | 83 |      */ | 
 | 84 |     ATHERMAL_STATUS_EMERGENCY = 5, | 
 | 85 |     /** Need shutdown immediately. */ | 
 | 86 |     ATHERMAL_STATUS_SHUTDOWN = 6, | 
 | 87 | }; | 
 | 88 |  | 
 | 89 | /** | 
 | 90 |  * An opaque type representing a handle to a thermal manager. | 
 | 91 |  * An instance of thermal manager must be acquired prior to | 
 | 92 |  * using thermal status APIs and must be released after use. | 
 | 93 |  * | 
 | 94 |  * <p>To use:<ul> | 
 | 95 |  *    <li>Create a new thermal manager instance by calling the | 
 | 96 |  *        {@link AThermal_acquireManager} function.</li> | 
 | 97 |  *    <li>Get current thermal status with | 
 | 98 |  *        {@link AThermal_getCurrentThermalStatus}.</li> | 
 | 99 |  *    <li>Register a thermal status listener with | 
 | 100 |  *        {@link AThermal_registerThermalStatusListener}.</li> | 
 | 101 |  *    <li>Unregister a thermal status listener with | 
 | 102 |  *        {@link AThermal_unregisterThermalStatusListener}.</li> | 
 | 103 |  *    <li>Release the thermal manager instance with | 
 | 104 |  *        {@link AThermal_releaseManager}.</li></ul></p> | 
 | 105 |  * | 
 | 106 |  */ | 
 | 107 | typedef struct AThermalManager AThermalManager; | 
 | 108 |  | 
 | 109 | /** | 
 | 110 |  * Prototype of the function that is called when thermal status changes. | 
 | 111 |  * It's passed the updated thermal status as parameter, as well as the | 
 | 112 |  * pointer provided by the client that registered a callback. | 
 | 113 |  */ | 
| Chris Ye | 8e8cec4 | 2020-03-26 14:14:58 -0700 | [diff] [blame] | 114 | typedef void (*AThermal_StatusCallback)(void *data, AThermalStatus status); | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 115 |  | 
 | 116 | /** | 
 | 117 |   * Acquire an instance of the thermal manager. This must be freed using | 
 | 118 |   * {@link AThermal_releaseManager}. | 
 | 119 |   * | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 120 |   * Available since API level 30. | 
 | 121 |   * | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 122 |   * @return manager instance on success, nullptr on failure. | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 123 |   */ | 
 | 124 | AThermalManager* AThermal_acquireManager() __INTRODUCED_IN(30); | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 125 |  | 
 | 126 | /** | 
 | 127 |  * Release the thermal manager pointer acquired via | 
 | 128 |  * {@link AThermal_acquireManager}. | 
 | 129 |  * | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 130 |  * Available since API level 30. | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 131 |  * | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 132 |  * @param manager The manager to be released. | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 133 |  */ | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 134 | void AThermal_releaseManager(AThermalManager *manager) __INTRODUCED_IN(30); | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 135 |  | 
 | 136 | /** | 
 | 137 |   * Gets the current thermal status. | 
 | 138 |   * | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 139 |   * Available since API level 30. | 
 | 140 |   * | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 141 |   * @param manager The manager instance to use to query the thermal status. | 
 | 142 |   * Acquired via {@link AThermal_acquireManager}. | 
 | 143 |   * | 
 | 144 |   * @return current thermal status, ATHERMAL_STATUS_ERROR on failure. | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 145 |   */ | 
 | 146 | AThermalStatus AThermal_getCurrentThermalStatus(AThermalManager *manager) __INTRODUCED_IN(30); | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 147 |  | 
 | 148 | /** | 
 | 149 |  * Register the thermal status listener for thermal status change. | 
 | 150 |  * | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 151 |  * Available since API level 30. | 
 | 152 |  * | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 153 |  * @param manager The manager instance to use to register. | 
 | 154 |  * Acquired via {@link AThermal_acquireManager}. | 
 | 155 |  * @param callback The callback function to be called when thermal status updated. | 
 | 156 |  * @param data The data pointer to be passed when callback is called. | 
 | 157 |  * | 
 | 158 |  * @return 0 on success | 
 | 159 |  *         EINVAL if the listener and data pointer were previously added and not removed. | 
 | 160 |  *         EPERM if the required permission is not held. | 
 | 161 |  *         EPIPE if communication with the system service has failed. | 
 | 162 |  */ | 
 | 163 | int AThermal_registerThermalStatusListener(AThermalManager *manager, | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 164 |         AThermal_StatusCallback callback, void *data) __INTRODUCED_IN(30); | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 165 |  | 
 | 166 | /** | 
 | 167 |  * Unregister the thermal status listener previously resgistered. | 
 | 168 |  * | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 169 |  * Available since API level 30. | 
 | 170 |  * | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 171 |  * @param manager The manager instance to use to unregister. | 
 | 172 |  * Acquired via {@link AThermal_acquireManager}. | 
 | 173 |  * @param callback The callback function to be called when thermal status updated. | 
 | 174 |  * @param data The data pointer to be passed when callback is called. | 
 | 175 |  * | 
 | 176 |  * @return 0 on success | 
 | 177 |  *         EINVAL if the listener and data pointer were not previously added. | 
 | 178 |  *         EPERM if the required permission is not held. | 
 | 179 |  *         EPIPE if communication with the system service has failed. | 
 | 180 |  */ | 
 | 181 | int AThermal_unregisterThermalStatusListener(AThermalManager *manager, | 
| Elliott Hughes | 7be0e2d | 2020-06-02 13:05:04 -0700 | [diff] [blame] | 182 |         AThermal_StatusCallback callback, void *data) __INTRODUCED_IN(30); | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 183 |  | 
| Chris Forbes | 56e925a | 2020-09-15 09:34:59 -0700 | [diff] [blame] | 184 | /** | 
 | 185 |  * Provides an estimate of how much thermal headroom the device currently has before | 
 | 186 |  * hitting severe throttling. | 
 | 187 |  * | 
 | 188 |  * Note that this only attempts to track the headroom of slow-moving sensors, such as | 
 | 189 |  * the skin temperature sensor. This means that there is no benefit to calling this function | 
 | 190 |  * more frequently than about once per second, and attempted to call significantly | 
 | 191 |  * more frequently may result in the function returning {@code NaN}. | 
 | 192 |  * | 
 | 193 |  * In addition, in order to be able to provide an accurate forecast, the system does | 
 | 194 |  * not attempt to forecast until it has multiple temperature samples from which to | 
 | 195 |  * extrapolate. This should only take a few seconds from the time of the first call, | 
 | 196 |  * but during this time, no forecasting will occur, and the current headroom will be | 
 | 197 |  * returned regardless of the value of {@code forecastSeconds}. | 
 | 198 |  * | 
 | 199 |  * The value returned is a non-negative float that represents how much of the thermal envelope | 
 | 200 |  * is in use (or is forecasted to be in use). A value of 1.0 indicates that the device is | 
| gfan | 5d5faa4 | 2021-04-12 15:14:29 -0700 | [diff] [blame] | 201 |  * (or will be) throttled at {@link #ATHERMAL_STATUS_SEVERE}. Such throttling can affect the | 
| Chris Forbes | 56e925a | 2020-09-15 09:34:59 -0700 | [diff] [blame] | 202 |  * CPU, GPU, and other subsystems. Values may exceed 1.0, but there is no implied mapping | 
 | 203 |  * to specific thermal levels beyond that point. This means that values greater than 1.0 | 
| gfan | 5d5faa4 | 2021-04-12 15:14:29 -0700 | [diff] [blame] | 204 |  * may correspond to {@link #ATHERMAL_STATUS_SEVERE}, but may also represent heavier throttling. | 
| Chris Forbes | 56e925a | 2020-09-15 09:34:59 -0700 | [diff] [blame] | 205 |  * | 
 | 206 |  * A value of 0.0 corresponds to a fixed distance from 1.0, but does not correspond to any | 
 | 207 |  * particular thermal status or temperature. Values on (0.0, 1.0] may be expected to scale | 
 | 208 |  * linearly with temperature, though temperature changes over time are typically not linear. | 
 | 209 |  * Negative values will be clamped to 0.0 before returning. | 
 | 210 |  * | 
 | 211 |  * Available since API level 31. | 
 | 212 |  * | 
 | 213 |  * @param manager The manager instance to use. | 
 | 214 |  *                Acquired via {@link AThermal_acquireManager}. | 
 | 215 |  * @param forecastSeconds how many seconds into the future to forecast. Given that device | 
 | 216 |  *                        conditions may change at any time, forecasts from further in the | 
 | 217 |  *                        future will likely be less accurate than forecasts in the near future. | 
 | 218 |  * @return a value greater than equal to 0.0, where 1.0 indicates the SEVERE throttling threshold, | 
 | 219 |  *         as described above. Returns NaN if the device does not support this functionality or | 
 | 220 |  *         if this function is called significantly faster than once per second. | 
 | 221 |   */ | 
 | 222 | float AThermal_getThermalHeadroom(AThermalManager *manager, | 
 | 223 |         int forecastSeconds) __INTRODUCED_IN(31); | 
 | 224 |  | 
| Chris Ye | 1a5a888 | 2020-01-15 10:51:47 -0800 | [diff] [blame] | 225 | #ifdef __cplusplus | 
 | 226 | } | 
 | 227 | #endif | 
 | 228 |  | 
 | 229 | #endif // _ANDROID_THERMAL_H | 
 | 230 |  | 
 | 231 | /** @} */ |