// 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.usb.peripheral;

using zx;

const MAX_FUNCTION_DESCRIPTORS uint32 = 32;
const MAX_CONFIG_DESCRIPTORS uint32 = 5;
const MAX_STRING_DESCRIPTORS uint32 = 255;

const MAX_STRING_LENGTH uint32 = 127;

@for_deprecated_c_bindings
type FunctionDescriptor = struct {
    interface_class uint8;
    interface_subclass uint8;
    interface_protocol uint8;
};

alias ConfigurationDescriptor = vector<FunctionDescriptor>:MAX_FUNCTION_DESCRIPTORS;

/// The fields in DeviceDescriptor match those in usb_descriptor_t in the USB specification,
/// except for the string fields.
type DeviceDescriptor = struct {
    bcd_usb uint16;
    b_device_class uint8;
    b_device_sub_class uint8;
    b_device_protocol uint8;
    b_max_packet_size0 uint8;
    id_vendor uint16;
    id_product uint16;
    bcd_device uint16;
    manufacturer string:MAX_STRING_LENGTH;
    product string:MAX_STRING_LENGTH;
    serial string:MAX_STRING_LENGTH;
    b_num_configurations uint8;
};

/// Events protocol that is used as a callback to inform the client
/// of the completion of various server-side events.
/// This callback interface can be registered using the SetStateChangeListener
/// method on the Device protocol.
@for_deprecated_c_bindings
protocol Events {
    /// Invoked when a function registers
    FunctionRegistered() -> ();
    /// Invoked when all functions have been cleared.
    FunctionsCleared();
};

protocol Device {
    /// Sets the device's descriptors, adds the functions and creates the child devices for the
    /// configuration's interfaces.
    /// At least one function descriptor must be provided.
    SetConfiguration(struct {
        device_desc DeviceDescriptor;
        config_descriptors vector<ConfigurationDescriptor>:MAX_CONFIG_DESCRIPTORS;
    }) -> (struct {}) error zx.status;

    /// Tells the device to remove the child devices for the configuration's interfaces
    /// and reset the list of functions to empty.
    /// The caller should wait for the `FunctionsCleared` event.
    ClearFunctions() -> ();
    /// Adds a state change listener that is invoked when a state change completes.
    SetStateChangeListener(resource struct {
        listener server_end:Events;
    });
};
