// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.hardware.input;

using zx;

alias ReportId = uint8;

type BootProtocol = strict enum : uint32 {
    NONE = 0;
    KBD = 1;
    MOUSE = 2;
};

const MAX_DESC_LEN uint16 = 8192;
const MAX_REPORT_LEN uint16 = 8192;
const MAX_REPORT_DATA uint16 = 8192;
const MAX_REPORTS_COUNT uint32 = 50;

type ReportType = strict enum : uint8 {
    INPUT = 1;
    OUTPUT = 2;
    FEATURE = 3;
};

/// DeviceIds lets a clients determine the vendor and product id for a device.
/// If the device is real HID device, then the id information
/// will come from the device itself. Mock HID devices may assign the
/// ids in the driver. If the mock HID driver does not assign ids, zeros
/// will be used instead.
type DeviceIds = struct {
    vendor_id uint32;
    product_id uint32;
    version uint32;
};

/// A single HID Report.
type Report = struct {
    /// The time the report was created, from the view of the monotonic clock.
    time zx.time;
    /// The HID report data. This is guaranteed to always be a full HID report.
    data vector<uint8>:MAX_REPORT_DATA;
};

/// Each `DeviceReportsReader` has its own FIFO of reports in the driver.
/// Calling `ReadReports` drains the Report FIFO. If the Report FIFO
/// fills up between calls to `ReadReports` the channel will be closed.
protocol DeviceReportsReader {
    /// This is a Hanging-Get function to read the reports in the
    /// Report FIFO. This will block until there is at least one
    /// report available.
    /// If there is already one outstanding Hanging-Get, calling this
    /// again will return ZX_ERR_ALREADY_BOUND.
    ReadReports() -> (struct {
        reports vector<Report>:MAX_REPORTS_COUNT;
    }) error zx.status;
};

// TODO(fxbug.dev/49329): This API doesn't follow best practices and needs to be
// cleaned up.
protocol Device {
    /// Get the HID boot interface protocol this device supports
    GetBootProtocol() -> (struct {
        protocol BootProtocol;
    });

    /// Get the Device's IDs. If this is a real HID device, the IDs will come from the device.
    /// If it is a mock HID decice, the IDs will either be 0's or user defined.
    GetDeviceIds() -> (struct {
        ids DeviceIds;
    });

    /// Get the report descriptor
    GetReportDesc() -> (struct {
        desc vector<uint8>:MAX_DESC_LEN;
    });

    /// Open a new DeviceReportsReader on this device. Opening a DeviceReportsReader
    /// allocates a new FIFO for receiving input reports.
    GetDeviceReportsReader(resource struct {
        reader server_end:DeviceReportsReader;
    }) -> (struct {}) error zx.status;

    /// Read one report out of the report FIFO. Only a single report will be
    /// returned in this API. `time` is the time the report was created, from
    /// the view of the monotonic clock.
    /// If status is ZX_ERR_SHOULD_WAIT the client can wait on the event
    /// from `GetReportsEvent`.
    ReadReport() -> (struct {
        status zx.status;
        data vector<uint8>:MAX_REPORT_DATA;
        time zx.time;
    });

    /// Read up to MAX_REPORT_DATA bytes of reports that have been sent from a device.
    /// This is the interface that is supposed to be used for continuous polling.
    /// Multiple reports can be returned from this API at a time, it is up to the client
    /// to do the parsing of the reports with the correct sizes and offset.
    /// It is guaranteed that only whole reports will be sent.
    /// If there are no reports, this will return ZX_ERR_SHOULD_WAIT, and the client can
    /// wait on the event from `GetReportsEvent`.
    ReadReports() -> (struct {
        status zx.status;
        data vector<uint8>:MAX_REPORT_DATA;
    });

    /// Receive an event that will signal on `ZX_USER_SIGNAL_0` when there are reports in the
    /// Device's report FIFO. This signal will be de-asserted when there are no
    /// reports in the Device's report FIFO. This event can be re-used each time
    /// the client wishes to know if there are reports in the FIFO.
    GetReportsEvent() -> (resource struct {
        status zx.status;
        event zx.handle:EVENT;
    });

    /// Send a request to the hardware for a given report described by type and id.
    /// Returns the hardware's response. This interface is not intended
    /// to be used for continuous polling of the reports.
    GetReport(struct {
        type ReportType;
        id ReportId;
    }) -> (struct {
        status zx.status;
        report vector<uint8>:MAX_REPORT_LEN;
    });

    /// Set a single report of the given (type, id) pair.
    SetReport(struct {
        type ReportType;
        id ReportId;
        report vector<uint8>:MAX_REPORT_LEN;
    }) -> (struct {
        status zx.status;
    });

    /// Set the trace ID that is used for HID report flow events.
    SetTraceId(struct {
        id uint32;
    });
};
