/*
 * 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::HealthInfo;
import @1.0::Result;

/**
 * Status values for HAL methods.
 */
enum Result : @1.0::Result {
    NOT_FOUND,
    CALLBACK_DIED,
};

/*
 * Identification attributes for a storage device.
 */
struct StorageAttribute {
    /**
     * Set to true if internal storage
     */
    bool isInternal;
    /**
     * Set to true if this is the boot device.
     */
    bool isBootDevice;
    /**
     * Name of the storage device.
     */
    string name;
};

/*
 * Information on storage device including life time estimates, end of life
 * information and other attributes.
 */
struct StorageInfo {
    /**
     * Attributes of the storage device whose info is contained by the struct.
     */
    StorageAttribute attr;
    /**
     * pre-eol (end of life) information. Follows JEDEC standard No.84-B50.
     */
    uint16_t eol;
    /**
     * device life time estimation (type A). Follows JEDEC standard No.84-B50.
     */
    uint16_t lifetimeA;
    /**
     * device life time estimation (type B). Follows JEDEC standard No.84-B50.
     */
    uint16_t lifetimeB;
    /**
     * version string
     */
    string version;
};
/*
 * Disk statistics since boot.
 */
struct DiskStats {
    /**
     * Number of reads processed.
     */
    uint64_t reads;
    /**
     * number of read I/Os merged with in-queue I/Os.
     */
    uint64_t readMerges;
    /**
     * number of sectors read.
     */
    uint64_t readSectors;
    /**
     * total wait time for read requests.
     */
    uint64_t readTicks;
    /**
     * number of writes processed.
     */
    uint64_t writes;
    /**
     * number of writes merged with in-queue I/Os.
     */
    uint64_t writeMerges;
    /**
     * number of sectors written.
     */
    uint64_t writeSectors;
    /**
     * total wait time for write requests.
     */
    uint64_t writeTicks;
    /**
     * number of I/Os currently in flight.
     */
    uint64_t ioInFlight;
    /**
     * total time this block device has been active.
     */
    uint64_t ioTicks;
    /**
     * total wait time for all requests.
     */
    uint64_t ioInQueue;
    /**
     * Attributes of the memory device.
     */
    StorageAttribute attr;
};

/**
 * Combined Health Information.
 */
struct HealthInfo {
    /**
     * V1.0 HealthInfo.
     * If a member is unsupported, it is filled with:
     * - 0 (for integers);
     * - false (for booleans);
     * - empty string (for strings);
     * - UNKNOWN (for BatteryStatus and BatteryHealth).
     */
    @1.0::HealthInfo legacy;
    /**
     * Average battery current in uA. Will be 0 if unsupported.
     */
    int32_t batteryCurrentAverage;
    /**
     * Disk Statistics. Will be an empty vector if unsupported.
     */
    vec<DiskStats> diskStats;
    /**
     * Information on storage devices. Will be an empty vector if
     * unsupported.
     */
    vec<StorageInfo> storageInfos;
};
