// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module device.usb;

enum OpenDeviceError {
  // Opening the device succeeded.
  OK,

  // The operating system denied access to the device.
  ACCESS_DENIED,

  // The device is already open.
  ALREADY_OPEN,
};

enum TransferDirection {
  INBOUND,
  OUTBOUND,
};

enum ControlTransferType {
  STANDARD,
  CLASS,
  VENDOR,
  RESERVED
};

enum ControlTransferRecipient {
  DEVICE,
  INTERFACE,
  ENDPOINT,
  OTHER
};

enum EndpointType {
  BULK,
  INTERRUPT,
  ISOCHRONOUS,
};

struct EndpointInfo {
  uint8 endpoint_number;
  TransferDirection direction;
  EndpointType type;
  uint32 packet_size;
};

struct AlternateInterfaceInfo {
  uint8 alternate_setting;
  uint8 class_code;
  uint8 subclass_code;
  uint8 protocol_code;
  string? interface_name;
  array<EndpointInfo> endpoints;
};

struct InterfaceInfo {
  uint8 interface_number;
  array<AlternateInterfaceInfo> alternates;
};

struct ConfigurationInfo {
  uint8 configuration_value;
  string? configuration_name;
  array<InterfaceInfo> interfaces;
};

struct WebUsbFunctionSubset {
  uint8 first_interface;
  array<string> origins;
};

struct WebUsbConfigurationSubset {
  uint8 configuration_value;
  array<string> origins;
  array<WebUsbFunctionSubset> functions;
};

struct WebUsbDescriptorSet {
  array<string> origins;
  array<WebUsbConfigurationSubset> configurations;
};

struct DeviceInfo {
  string guid;
  uint8 usb_version_major;
  uint8 usb_version_minor;
  uint8 usb_version_subminor;
  uint8 class_code;
  uint8 subclass_code;
  uint8 protocol_code;
  uint16 vendor_id;
  uint16 product_id;
  uint8 device_version_major;
  uint8 device_version_minor;
  uint8 device_version_subminor;
  string? manufacturer_name;
  string? product_name;
  string? serial_number;
  array<ConfigurationInfo> configurations;
  WebUsbDescriptorSet? webusb_allowed_origins;
};

struct ControlTransferParams {
  ControlTransferType type;
  ControlTransferRecipient recipient;
  uint8 request;
  uint16 value;
  uint16 index;
};

enum TransferStatus {
  // The transfer completed successfully.
  COMPLETED,

  // The transfer failed due to a non-specific error.
  TRANSFER_ERROR,

  // The transfer was not allowed.
  PERMISSION_DENIED,

  // The transfer timed out.
  TIMEOUT,

  // The transfer was cancelled.
  CANCELLED,

  // The transfer stalled.
  STALLED,

  // The transfer failed because the device was disconnected from the host.
  DISCONNECT,

  // The transfer succeeded, but the device sent more data than was requested.
  // This applies only to inbound transfers.
  BABBLE,

  // The transfer succeeded, but the device sent less data than was requested.
  // This applies only to inbound transfers.
  SHORT_PACKET,
};

struct IsochronousPacket {
  uint32 length;
  uint32 transferred_length;
  TransferStatus status;
};

interface Device {
  // Retrieve a DeviceInfo struct containing metadata about the device,
  // including the set of all available device configurations.
  GetDeviceInfo() => (DeviceInfo? info);

  // Retrieves the |configuration_value| of the device's currently active
  // configuration. Will return 0 if the device is unconfigured.
  GetConfiguration() => (uint8 value);

  // Opens the device. Methods below require the device be opened first.
  Open() => (OpenDeviceError error);

  // Closes the device.
  Close() => ();

  // Initiates a device control transfer to set the device's configuration to
  // one with the configuration value |value|.
  SetConfiguration(uint8 value) => (bool success);

  // Claims a single interface in the current device configuration.
  ClaimInterface(uint8 interface_number) => (bool success);

  // Releases a claimed interface in the current device configuration.
  ReleaseInterface(uint8 interface_number) => (bool success);

  // Selects an alternate setting for a given claimed interface.
  SetInterfaceAlternateSetting(uint8 interface_number, uint8 alternate_setting)
      => (bool success);

  // Resets the device.
  Reset() => (bool success);

  // Clear the halt/stall condition for an endpoint.
  ClearHalt(uint8 endpoint) => (bool success);

  // Initiates an inbound control transfer request. |params| determine the
  // details of the request. Transfers to recipients other than DEVICE require a
  // corresponding interface to be claimed.
  //
  // |length| specifies the expected number of bytes to receive for this
  // transfer. The size of |data| will never exceed |length|, and |data| will be
  // null if |status| is neither COMPLETED, BABBLE, or SHORT_PACKET.
  //
  // |timeout| specifies the request timeout in milliseconds. A timeout of 0
  // indicates no timeout: the request will remain pending indefinitely until
  // completed or otherwise terminated.
  ControlTransferIn(ControlTransferParams params, uint32 length, uint32 timeout)
      => (TransferStatus status, array<uint8>? data);

  // Initiates an inbound control transfer request. |params| determine the
  // details of the request. Transfers to recipients other than DEVICE require a
  // corresponding interface to be claimed.
  //
  // |data| specifies the bytes to send the device in the body of the request.
  //
  // |timeout| specifies the request timeout in milliseconds. A timeout of 0
  // indicates no timeout: the request will remain pending indefinitely until
  // completed or otherwise terminated.
  ControlTransferOut(ControlTransferParams params,
                     array<uint8> data,
                     uint32 timeout)
      => (TransferStatus status);

  // Initiates an inbound generic transfer request on a specific endpoint. The
  // interface to which |endpoint_number| belongs must be claimed, and the
  // appropriate alternate setting must be set on that interface before
  // transfers can be initiated on the endpoint. The endpoint must be of type
  // BULK or INTERRUPT.
  //
  // |length| specifies the expected number of bytes to receive for this
  // transfer. The size of |data| will never exceed |length|, and |data| will be
  // null if |status| is neither COMPLETED, BABBLE, or SHORT_PACKET.
  //
  // |timeout| specifies the request timeout in milliseconds. A timeout of 0
  // indicates no timeout: the request will remain pending indefinitely until
  // completed or otherwise terminated.
  GenericTransferIn(uint8 endpoint_number, uint32 length, uint32 timeout)
      => (TransferStatus status, array<uint8>? data);

  // Initiates an outbound generic transfer request on a specific endpoint. The
  // interface to which |endpoint_number| belongs must be claimed, and the
  // appropriate alternate setting must be set on that interface before
  // transfers can be initiated on the endpoint. The endpoint must be of type
  // BULK or INTERRUPT.
  //
  // |data| specifies the bytes to send the device in the body of the request.
  //
  // |timeout| specifies the request timeout in milliseconds. A timeout of 0
  // indicates no timeout: the request will remain pending indefinitely until
  // completed or otherwise terminated.
  GenericTransferOut(uint8 endpoint_number, array<uint8> data, uint32 timeout)
      => (TransferStatus status);

  // Initiates an inbound isochronous transfer request on a specific endpoint.
  // The interface to which |endpoint_number| belongs must be claimed, and the
  // appropriate alternate setting must be set on that interface before
  // transfers can be initiated on the endpoint. The endpoint must be of type
  // ISOCHRONOUS.
  //
  // |packet_lengths| specifies the maximum expected number of bytes to receive
  // for each packet in this transfer.
  //
  // |timeout| specifies the request timeout in milliseconds. A timeout of 0
  // indicates no timeout: the request will remain pending indefinitely until
  // completed or otherwise terminated.
  //
  // |data| contains the data received from the device, if any. |packets|
  // contains the status of each packet received from the device, in order. The
  // length of the packet indicates its position in |data| while it's
  // transferred length gives the amount of data actually received from the
  // device.
  IsochronousTransferIn(uint8 endpoint_number,
                        array<uint32> packet_lengths,
                        uint32 timeout)
      => (array<uint8>? data, array<IsochronousPacket> packets);

  // Initiates an outbound isochronous transfer request on a specific endpoint.
  // The interface to which |endpoint_number| belongs must be claimed, and the
  // appropriate alternate setting must be set on that interface before
  // transfers can be initiated on the endpoint. The endpoint must be of type
  // ISOCHRONOUS.
  //
  // |data| specifies the bytes to send to the device.
  //
  // |packet_lengths| specifies how |data| should be separated into packets when
  // it is sent to the device.
  //
  // |timeout| specifies the request timeout in milliseconds. A timeout of 0
  // indicates no timeout: the request will remain pending indefinitely until
  // completed or otherwise terminated.

  // |packets| contains the status of each packet sent to the device, in order.
  IsochronousTransferOut(uint8 endpoint_number,
                         array<uint8> data,
                         array<uint32> packet_lengths,
                         uint32 timeout)
      => (array<IsochronousPacket> packets);
};
