// 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;

/// DeviceInfo provides more information about the device and lets a client
/// distinguish between devices (e.g between two touchscreens that come from
/// different vendors). If the device is a HID device, then the id information
/// will come from the device itself. Other, non-HID devices may assign the
/// ids in the driver, so it will be the driver author's responsibility to
/// assign sensible ids.
@available(removed=20)
type DeviceInfo = struct {
    vendor_id uint32;
    product_id uint32;
    version uint32;
};

/// DeviceInformation provides more information about the device and lets a
/// client distinguish between devices (e.g between two touchscreens that come
/// from different vendors). If the device is a HID device, then the id
/// information will come from the device itself. Other, non-HID devices may
/// assign the ids in the driver, so it will be the driver author's
/// responsibility to assign sensible ids.
@available(added=20)
type DeviceInformation = table {
    1: vendor_id uint32;
    2: product_id uint32;
    3: version uint32;
    4: polling_rate zx.Duration;
};

/// `DeviceDescriptor` describes a physical input device. Some physical devices may
/// send multiple types of reports (E.g: a physical touchscreen can send touch and
/// stylus reports, so it will have both a TouchDescriptor and a StylusDescriptor).
type DeviceDescriptor = table {
    /// This field is removed. Use device_information instead.
    @available(removed=20)
    1: device_info DeviceInfo;

    /// When `mouse` is present the device has a mouse.
    2: mouse MouseDescriptor;

    /// When `sensor` is present the device has a sensor.
    3: sensor SensorDescriptor;

    /// When `touch` is present the device has a touch device.
    /// (E.g: Touchscreen, touchpad).
    4: touch TouchDescriptor;

    /// When `keyboard` is present the device has a keyboard.
    5: keyboard KeyboardDescriptor;

    /// When `consumer_control` is present the device has a ConsumerControl
    /// device.
    6: consumer_control ConsumerControlDescriptor;

    /// `device_information` should always be present to help distinguish
    /// between physical devices.
    @available(added=20)
    7: device_information DeviceInformation;
};

/// Describes the output reports that a physical input device will accept.
/// Output information typically represents device output to the user
/// (E.g: LEDs, tactile feedback, etc).
type OutputDescriptor = table {
    1: keyboard KeyboardOutputDescriptor;
};
