/*
 * Copyright (C) 2016 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@1.0;

/** Device temperature types */
@export
enum TemperatureType : int32_t {
    UNKNOWN = -1,
    CPU = 0,
    GPU = 1,
    BATTERY = 2,
    SKIN = 3,
};

enum CoolingType : uint32_t {
    /** Fan cooling device speed in RPM. */
    FAN_RPM = 0,
};

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

    /**
     * Name of this temperature.
     * All temperatures of the same "type" must have a different "name",
     * e.g., cpu0, battery.
     */
    string name;

    /**
     * Current temperature in Celsius. If not available set by HAL to NAN.
     * Current temperature can be in any units if type=UNKNOWN.
     */
    float currentValue;

    /**
     * Throttling temperature constant for this temperature.
     * If not available, set by HAL to NAN.
     */
    float throttlingThreshold;

    /**
     * Shutdown temperature constant for this temperature.
     * If not available, set by HAL to NAN.
     */
    float shutdownThreshold;

    /**
     * Threshold temperature above which the VR mode clockrate minimums cannot
     * be maintained for this device.
     * If not available, set by HAL to NAN.
     */
    float vrThrottlingThreshold;

};

struct CoolingDevice {
    /**
     * This cooling device type.
     */
    CoolingType type;

    /**
     * Name of this cooling device.
     * All cooling devices of the same "type" must have a different "name".
     */
    string name;

    /**
     * Current cooling device value. Units depend on cooling device "type".
     */
    float currentValue;

};

struct CpuUsage {
    /**
     * Name of this CPU.
     * All CPUs must have a different "name".
     */
    string name;

    /**
     * Active time since the last boot in ms.
     */
    uint64_t active;

    /**
     * Total time since the last boot in ms.
     */
    uint64_t total;

    /**
     * Is set to true when a core is online.
     * If the core is offline, all other members except |name| should be ignored.
     */
    bool isOnline;

};

enum ThermalStatusCode : uint32_t {
    /** No errors. */
    SUCCESS = 0,
    /** Unknown failure occured. */
    FAILURE = 1
};

/**
 * Generic structure to return the status of any thermal operation.
 */
struct ThermalStatus {
    ThermalStatusCode code;

    /**
     * A specific error message to provide more information.
     * This can be used for debugging purposes only.
     */
    string debugMessage;
};
