/*
 * 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.hardware.health@2.0;

import @1.0::BatteryStatus;

import IHealthInfoCallback;

/**
 * IHealth manages health info and posts events on registered callbacks.
 */
interface IHealth {

    /**
     * Register a callback for any health info events.
     *
     * Registering a new callback must not unregister the old one; the old
     * callback remains registered until one of the following happens:
     * - A client explicitly calls {@link unregisterCallback} to unregister it.
     * - The client process that hosts the callback dies.
     *
     * @param callback the callback to register.
     * @return result SUCCESS if successful,
     *                UNKNOWN for other errors.
     */
    registerCallback(IHealthInfoCallback callback) generates (Result result);

    /**
     * Explicitly unregister a callback that is previously registered through
     * {@link registerCallback}.
     *
     * @param callback the callback to unregister
     * @return result SUCCESS if successful,
     *                NOT_FOUND if callback is not registered previously,
     *                UNKNOWN for other errors.
     */
    unregisterCallback(IHealthInfoCallback callback) generates (Result result);

    /**
     * Schedule update.
     *
     * When update() is called, the service must notify all registered callbacks
     * with the most recent health info.
     *
     * @return result SUCCESS if successful,
     *                CALLBACK_DIED if any registered callback is dead,
     *                UNKNOWN for other errors.
     */
    update() generates (Result result);

    /**
     * Get battery capacity in microampere-hours(µAh).
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this property is not supported
     *                 (e.g. the file that stores this property does not exist),
     *                UNKNOWN for other errors.
     * @return value battery capacity, or 0 if not successful.
     */
    getChargeCounter() generates (Result result, int32_t value);

    /**
     * Get instantaneous battery current in microamperes(µA).
     *
     * Positive values indicate net current entering the battery from a charge
     * source, negative values indicate net current discharging from the
     * battery.
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this property is not supported
     *                 (e.g. the file that stores this property does not exist),
     *                UNKNOWN for other errors.
     * @return value instantaneous battery current, or 0 if not
     *               successful.
     */
    getCurrentNow() generates (Result result, int32_t value);

    /**
     * Get average battery current in microamperes(µA).
     *
     * Positive values indicate net current entering the battery from a charge
     * source, negative values indicate net current discharging from the
     * battery. The time period over which the average is computed may depend on
     * the fuel gauge hardware and its configuration.
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this property is not supported
     *                 (e.g. the file that stores this property does not exist),
     *                UNKNOWN for other errors.
     * @return value average battery current, or 0 if not successful.
     */
    getCurrentAverage() generates (Result result, int32_t value);

    /**
     * Get remaining battery capacity percentage of total capacity
     * (with no fractional part).
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this property is not supported
     *                 (e.g. the file that stores this property does not exist),
     *                UNKNOWN for other errors.
     * @return value remaining battery capacity, or 0 if not successful.
     */
    getCapacity() generates (Result result, int32_t value);

    /**
     * Get battery remaining energy in nanowatt-hours.
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this property is not supported,
     *                UNKNOWN for other errors.
     * @return value remaining energy, or 0 if not successful.
     */
    getEnergyCounter() generates (Result result, int64_t value);

    /**
     * Get battery charge status.
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this property is not supported
     *                 (e.g. the file that stores this property does not exist),
     *                UNKNOWN other errors.
     * @return value charge status, or UNKNOWN if not successful.
     */
    getChargeStatus() generates (Result result, BatteryStatus value);

    /**
     * Get storage info.
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this property is not supported,
     *                UNKNOWN other errors.
     * @return value vector of StorageInfo structs, to be ignored if result is not
     *               SUCCESS.
     */
    getStorageInfo() generates (Result result, vec<StorageInfo> value);

    /**
     * Gets disk statistics (number of reads/writes processed, number of I/O
     * operations in flight etc).
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this property is not supported,
     *                UNKNOWN other errors.
     * @return value vector of disk statistics, to be ignored if result is not SUCCESS.
     *               The mapping is index 0->sda, 1->sdb and so on.
     */
    getDiskStats() generates (Result result, vec<DiskStats> value);

    /**
     * Get Health Information.
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this API is not supported,
     *                UNKNOWN for other errors.
     * @return value  Health information, to be ignored if result is not
     *                SUCCESS.
     */
    getHealthInfo() generates (Result result, @2.0::HealthInfo value);
};
