// Copyright 2019 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.input.report;

using zx;

const uint32 MAX_DEVICE_REPORT_COUNT = 50;

/// Each `InputReportsReader` has its own FIFO of InputReports that it maintains.
/// When ReadInputReports is called it drains the InputReports FIFO.
/// If too many InputReports are created before the FIFO is drained, then
/// the oldest InputReport will be silently discarded.
protocol InputReportsReader {
    /// This is a Hanging-Get function to read the reports in the
    /// InputReport FIFO. This will not reply 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.
    ReadInputReports() -> (vector<InputReport>:MAX_DEVICE_REPORT_COUNT reports) error zx.status;
};

/// An `InputDevice` driver represents a single physical input device.
/// The InputDevice maintains an internal FIFO of `MAX_DEVICE_REPORT_COUNT`
/// reports for each client that connects. Reports are removed from the FIFO
/// once they are read by the client. If the FIFO is full, it will drop the
/// oldest report to make room for an incoming report.
protocol InputDevice {
    /// Open a new InputReportsReader on this device. Each reader receives
    /// their own reports.
    GetInputReportsReader(request<InputReportsReader> reader);

    /// Gets the device descriptor for this device.
    GetDescriptor() -> (DeviceDescriptor descriptor);

    /// Send a single output report to the device. This will throw an error
    /// if the output report does not follow the OutputDescriptor.
    SendOutputReport(OutputReport report) -> () error zx.status;

    /// Get the feature report for a given device. This requests the state of
    /// the device's features.
    GetFeatureReport() -> (FeatureReport report) error zx.status;

    /// Set the feature report for a given device. This sets the state of
    /// the device's features.
    SetFeatureReport(FeatureReport report) -> () error zx.status;
};
