/*
 * Copyright (C) 2018 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.hardware.thermal@2.0;

import android.hardware.thermal@1.0::types;

/** Device temperature types */
enum TemperatureType : @1.0::TemperatureType {
    USB_PORT = 4,
    POWER_AMPLIFIER = 5,

    /** Battery Charge Limit - virtual thermal sensors */
    BCL_VOLTAGE = 6,
    BCL_CURRENT = 7,
    BCL_PERCENTAGE = 8,

    /**  Neural Processing Unit */
    NPU = 9,
};


/** Device cooling device types */
enum CoolingType : uint32_t {
    FAN,
    BATTERY,
    CPU,
    GPU,
    MODEM,
    NPU,
    COMPONENT, // for the rest of components
};

/** Device throttling severity */
enum ThrottlingSeverity : uint32_t {
    /**
     * Not under throttling.
     */
    NONE = 0,

    /**
     * Light throttling where UX is not impacted.
     */
    LIGHT,

    /**
     * Moderate throttling where UX is not largely impacted.
     */
    MODERATE,

    /**
     * Severe throttling where UX is largely impacted.
     * Similar to 1.0 throttlingThreshold.
     */
    SEVERE,

    /**
     * Platform has done everything to reduce power.
     */
    CRITICAL,

    /**
     * Key components in platform are shutting down due to thermal condition.
     * Device functionalities will be limited.
     */
    EMERGENCY,

    /**
     * Need shutdown immediately.
     */
    SHUTDOWN,
};

struct TemperatureThreshold {
    /**
     * This temperature's type.
     */
    TemperatureType type;

    /**
     * Name of this temperature matching the Temperature struct.
     * All temperatures of the same "type" must have a different "name",
     * e.g., cpu0, battery. Clients use it to match Temperature struct.
     */
    string name;

    /**
     * Hot throttling temperature constant for this temperature sensor in
     * level defined in ThrottlingSeverity including shutdown. Throttling
     * happens when temperature >= threshold. If not available, set to NAN.
     * Unit is same as Temperature's value.
     */
    float[ThrottlingSeverity#len] hotThrottlingThresholds;

    /**
     * Cold throttling temperature constant for this temperature sensor in
     * level defined in ThrottlingSeverity including shutdown. Throttling
     * happens when temperature <= threshold. If not available, set to NAN.
     * Unit is same as Temperature's value.
     */
    float[ThrottlingSeverity#len] coldThrottlingThresholds;

    /**
     * Threshold temperature above which the VR mode clockrate minimums cannot
     * be maintained for this device. If not available, set by HAL to NAN.
     * Unit is same as Temperature's value.
     */
    float vrThrottlingThreshold;
};

struct Temperature {
    /**
     * This temperature's type.
     */
    TemperatureType type;

    /**
     * Name of this temperature matching the TemperatureThreshold.
     * All temperatures of the same "type" must have a different "name",
     * e.g., cpu0, battery. Clients use it to match with TemperatureThreshold
     * struct.
     */
    string name;

    /**
     * For BCL, this is the current reading of the virtual sensor and the unit is
     * millivolt, milliamp, percentage for BCL_VOLTAGE, BCL_CURRENT and BCL_PERCENTAGE
     * respectively. For everything else, this is the current temperature in Celsius.
     * If not available set by HAL to NAN.
     */
    float value;

    /**
     * The current throttling level of the sensor.
     */
    ThrottlingSeverity throttlingStatus;
};

struct CoolingDevice {
    /**
     * This cooling device type, CPU, GPU, BATTERY, and etc.
     */
    CoolingType type;

    /**
     * Name of this cooling device.
     * All cooling devices of the same "type" must have a different "name".
     * The name is usually defined in kernel device tree, and this is for client
     * logging purpose.
     */
    string name;

    /**
     * Current throttle state of the cooling device. The value can any unsigned integer
     * numbers between 0 and max_state defined in its driver, usually representing the
     * associated device's power state. 0 means device is not in throttling, higher value
     * means deeper throttling.
     */
    uint64_t value;
};
