/*
 * 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 hardware.google.pixelstats@1.0;


/**
 * IPixelStats is an interface that allows clients to report specific hardware
 * reliabilty events, which are translated into calls to libmetricslogger.
 */
interface IPixelStats {

    /**
     * Report plugging of a device into the USB-C connector.
     */
    reportUsbConnectorConnected();

    /**
     * Report unplugging of a device from the USB-C connector.
     * @param durationMillis Time, in milliseconds, that connector was connected.
     */
    reportUsbConnectorDisconnected(int32_t durationMillis);

    /**
     * Reports the connection, along with VID, PID, of any USB device attached
     * to this system with a USB audio interface.
     * @param vid USB Vendor ID
     * @param pid USB Product ID
     */
    reportUsbAudioConnected(int32_t vid, int32_t pid);

    /**
     * Reports the disconnection, along with VID, PID, and connection duration,
     * of any USB device attached to this system with a USB audio interface.
     * @param vid USB Vendor ID
     * @param pid USB Product ID
     * @param duration_millis Time, in milliseconds, that the device was connected.
     */
    reportUsbAudioDisconnected(int32_t vid, int32_t pid, int32_t durationMillis);

    /**
     * Report the detected speaker impedance value.
     * @param speakerLocation a vendor-specific value identifying a
     *                        particular speaker on the device.
     *                        This value is opaque to the server, it must
     *                        not try to interpret any meaning to this location.
     * @param milliOhms       the detected impedance in milliOhms.
     */
    reportSpeakerImpedance(int32_t speakerLocation, int32_t milliOhms);

    /** HardwareType for reportHardwareFailed */
    enum HardwareType : uint32_t {
        UNKNOWN = 0,
        MICROPHONE = 1,
        CODEC = 2,
        SPEAKER = 3,
        FINGERPRINT = 4,
    };
    /**
     * ErrorCodes for reportHardwareFailed.
     * ErrorCode interpretation depends on the hardwareType parameter.
     * Values prefixed by different hardwareTypes overlap.
     * COMPLETE refers to a complete failure e.g. non-responsive microphone.
     * For most components, unless a more specific failure exists, COMPLETE should be used.
     * UNKNOWN refers to an unexpected or unknown error.
     */
    enum HardwareErrorCode : int32_t {
        UNKNOWN = 0,
        COMPLETE = 1,
        SPEAKER_HIGH_Z = 2,
        SPEAKER_SHORT = 3,
        FINGERPRINT_SENSOR_BROKEN = 4,
        FINGERPRINT_TOO_MANY_DEAD_PIXELS = 5,
    };
    /**
     * Report the detected failure of a hardware component.
     * @param hardwareType the type of hardware component that failed.
     * @param hardwareLocation a vendor-specific value indentifying a particular
     *                         instance of the given hardwareType.  Opaque id,
     *                         not to be interpreted by server code.
     * @param failureCode a code identifying the failure mode of the hardware
     *                    component.  Depends on hardwareType.
     */
    reportHardwareFailed(HardwareType hardwareType, int32_t hardwareLocation, HardwareErrorCode errorCode);


    /**
     * Report the detection of a physical drop event, as detected by
     * accelerometers.
     * @param confidencePctg   percentage confidence that a drop occured.
     *                         Heuristic.
     * @param accelPeak        peak detected acceleration, in units of 1/1000ths
     *                         of a g.
     * @param freefallDuration Duration of estimated freefall, in ms.
     */
    reportPhysicalDropDetected(int32_t confidencePctg, int32_t accelPeak, int32_t freefallDuration);

    /**
     * Report bucketed battery charge cycles.
     *
     * A comma-seperated list of buckets representing the number of times
     * the battery has charged past equal-sized fractions of full capacity.
     * For example, given "12, 11, 10, 9, 8, 7, 6, 5", the battery has charged
     * past 1/8th full 12 times, 2/8ths full 11 times, etc.
     * @param buckets the comma-separated string of bucket values.
     *        format: \s*(\d+,\s*)*\d+\s*
     */
    reportChargeCycles(string buckets);

    /**
     * reportBatteryHealthSnapshot records a variety of battery parameters at multiple
     * points throughout the day.  Every 24hrs, the client is expected to report the snapshot
     * at the following points throughout the day:
     */
    enum BatterySnapshotType : int32_t {
        MIN_TEMP,            // Snapshot at min batt temp over 24hrs.
        MAX_TEMP,            // Snapshot at max batt temp over 24hrs.
        MIN_RESISTANCE,      // Snapshot at min batt resistance over 24hrs.
        MAX_RESISTANCE,      // Snapshot at max batt resistance over 24hrs.
        MIN_VOLTAGE,         // Snapshot at min batt voltage over 24hrs.
        MAX_VOLTAGE,         // Snapshot at max batt voltage over 24hrs.
        MEDIAN_RESISTANCE,   // Snapshot at median battery resistance over 24hrs.
    };
    /** Parameters for reportBatteryHealthSnapshot. */
    struct BatteryHealthSnapshotArgs {
        BatterySnapshotType type;
        int32_t temperatureDeciC;
        int32_t voltageMicroV;
        int32_t currentMicroA;
        int32_t openCircuitVoltageMicroV;
        int32_t resistanceMicroOhm;
        int32_t levelPercent;
    };
    /**
     * Report battery health snapshot, aggregated.
     * Resistance, Voltage, Open Circuit Voltage, Temperature, and Charge Level
     * are snapshotted periodically over 24hrs.
     * Once per day, snapshots of the following type are reported:
     *  Min & Max Temp, Min & Max Resistance, Min & Max Voltage, Median Resistance.
     * @param SnapshotType The instance of this snapshot.
     * @param Temperature Temperature, in 1/10ths of degree C.
     * @param Voltage Battery Voltage, in microVolts.
     * @param OpenCircuitVoltage Battery Open Circuit Voltage, in microVolts.
     * @param Current Battery current, in microAmps.
     * @param Resistance Battery Resistance, in microOhms.
     * @param Level Battery Level, as % of full.
     */
    reportBatteryHealthSnapshot(BatteryHealthSnapshotArgs args);

    /**
     * Classifications of IO Operations for reportSlowIo.
     */
    enum IoOperation : int32_t  {
        UNKNOWN,
        READ,
        WRITE,
        UNMAP,
        SYNC,
    };
    /**
     * Report slow I/O operations, aggregated.
     * @param ioOperation The type of slow IO operation.
     * @param count The number of slow IO operations of this type over 24hrs.
     */
    reportSlowIo(IoOperation operation, int32_t count);

    /**
     * Report a shutdown event caused by low battery.
     * @param voltageMicroV last recorded battery voltage prior to shutdown.
     */
    reportBatteryCausedShutdown(int32_t voltageMicroV);
};