/* * Copyright (c) 2017 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. */ package android.os; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.hardware.thermal.TemperatureType; import android.hardware.thermal.ThrottlingSeverity; import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Temperature values used by IThermalService. * * @hide */ public final class Temperature implements Parcelable { /** Temperature value */ private final float mValue; /** A Temperature type from ThermalHAL */ private final int mType; /** Name of this Temperature */ private final String mName; /** The level of the sensor is currently in throttling */ private final int mStatus; @IntDef(prefix = { "THROTTLING_" }, value = { THROTTLING_NONE, THROTTLING_LIGHT, THROTTLING_MODERATE, THROTTLING_SEVERE, THROTTLING_CRITICAL, THROTTLING_EMERGENCY, THROTTLING_SHUTDOWN, }) @Retention(RetentionPolicy.SOURCE) public @interface ThrottlingStatus {} /** Keep in sync with hardware/interfaces/thermal/aidl/android/hardware/thermal * /ThrottlingSeverity.aidl */ public static final int THROTTLING_NONE = ThrottlingSeverity.NONE; public static final int THROTTLING_LIGHT = ThrottlingSeverity.LIGHT; public static final int THROTTLING_MODERATE = ThrottlingSeverity.MODERATE; public static final int THROTTLING_SEVERE = ThrottlingSeverity.SEVERE; public static final int THROTTLING_CRITICAL = ThrottlingSeverity.CRITICAL; public static final int THROTTLING_EMERGENCY = ThrottlingSeverity.EMERGENCY; public static final int THROTTLING_SHUTDOWN = ThrottlingSeverity.SHUTDOWN; @IntDef(prefix = { "TYPE_" }, value = { TYPE_UNKNOWN, TYPE_CPU, TYPE_GPU, TYPE_BATTERY, TYPE_SKIN, TYPE_USB_PORT, TYPE_POWER_AMPLIFIER, TYPE_BCL_VOLTAGE, TYPE_BCL_CURRENT, TYPE_BCL_PERCENTAGE, TYPE_NPU, TYPE_TPU, TYPE_DISPLAY, TYPE_MODEM, TYPE_SOC, TYPE_WIFI, TYPE_CAMERA, TYPE_FLASHLIGHT, TYPE_SPEAKER, TYPE_AMBIENT, TYPE_POGO }) @Retention(RetentionPolicy.SOURCE) public @interface Type {} /** Keep in sync with hardware/interfaces/thermal/aidl/android/hardware/thermal * /TemperatureType.aidl */ public static final int TYPE_UNKNOWN = TemperatureType.UNKNOWN; public static final int TYPE_CPU = TemperatureType.CPU; public static final int TYPE_GPU = TemperatureType.GPU; public static final int TYPE_BATTERY = TemperatureType.BATTERY; public static final int TYPE_SKIN = TemperatureType.SKIN; public static final int TYPE_USB_PORT = TemperatureType.USB_PORT; public static final int TYPE_POWER_AMPLIFIER = TemperatureType.POWER_AMPLIFIER; public static final int TYPE_BCL_VOLTAGE = TemperatureType.BCL_VOLTAGE; public static final int TYPE_BCL_CURRENT = TemperatureType.BCL_CURRENT; public static final int TYPE_BCL_PERCENTAGE = TemperatureType.BCL_PERCENTAGE; public static final int TYPE_NPU = TemperatureType.NPU; public static final int TYPE_TPU = TemperatureType.TPU; public static final int TYPE_DISPLAY = TemperatureType.DISPLAY; public static final int TYPE_MODEM = TemperatureType.MODEM; public static final int TYPE_SOC = TemperatureType.SOC; public static final int TYPE_WIFI = TemperatureType.WIFI; public static final int TYPE_CAMERA = TemperatureType.CAMERA; public static final int TYPE_FLASHLIGHT = TemperatureType.FLASHLIGHT; public static final int TYPE_SPEAKER = TemperatureType.SPEAKER; public static final int TYPE_AMBIENT = TemperatureType.AMBIENT; public static final int TYPE_POGO = TemperatureType.POGO; /** * Verify a valid Temperature type. * * @return true if a Temperature type is valid otherwise false. */ public static boolean isValidType(@Type int type) { return type >= TYPE_UNKNOWN && type <= TYPE_POGO; } /** * Verify a valid throttling status. * * @return true if a status is valid otherwise false. */ public static boolean isValidStatus(@ThrottlingStatus int status) { return status >= THROTTLING_NONE && status <= THROTTLING_SHUTDOWN; } public Temperature(float value, @Type int type, @NonNull String name, @ThrottlingStatus int status) { Preconditions.checkArgument(isValidType(type), "Invalid Type"); Preconditions.checkArgument(isValidStatus(status) , "Invalid Status"); mValue = value; mType = type; mName = Preconditions.checkStringNotEmpty(name); mStatus = status; } /** * Return the Temperature value. * * @return a Temperature value in floating point could be NaN. */ public float getValue() { return mValue; } /** * Return the Temperature type. * * @return a Temperature type: TYPE_* */ public @Type int getType() { return mType; } /** * Return the Temperature name. * * @return a Temperature name as String. */ public String getName() { return mName; } /** * Return the Temperature throttling status. * * @return a Temperature throttling status: THROTTLING_* */ public @ThrottlingStatus int getStatus() { return mStatus; } @Override public String toString() { return "Temperature{mValue=" + mValue + ", mType=" + mType + ", mName=" + mName + ", mStatus=" + mStatus + "}"; } @Override public int hashCode() { int hash = mName.hashCode(); hash = 31 * hash + Float.hashCode(mValue); hash = 31 * hash + mType; hash = 31 * hash + mStatus; return hash; } @Override public boolean equals(@Nullable Object o) { if (!(o instanceof Temperature)) { return false; } Temperature other = (Temperature) o; return other.mValue == mValue && other.mType == mType && other.mName.equals(mName) && other.mStatus == mStatus; } @Override public void writeToParcel(Parcel p, int flags) { p.writeFloat(mValue); p.writeInt(mType); p.writeString(mName); p.writeInt(mStatus); } public static final @android.annotation.NonNull Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public Temperature createFromParcel(Parcel p) { float value = p.readFloat(); int type = p.readInt(); String name = p.readString(); int status = p.readInt(); return new Temperature(value, type, name, status); } @Override public Temperature[] newArray(int size) { return new Temperature[size]; } }; @Override public int describeContents() { return 0; } }