// Copyright 2014 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.

// Use the <code>chrome.hid</code> API to interact with connected HID devices.
// This API provides access to HID operations from within the context of an app.
// Using this API, apps can function as drivers for hardware devices.
namespace hid {
  // HID top-level collection attributes.
  // Each enumerated device interface exposes an array of these objects.
  // |usagePage|: HID usage page identifier.
  // |usage|: Page-defined usage identifier.
  // |reportIds|: Report IDs which belong to the collection and to its children.
  dictionary HidCollectionInfo {
    long usagePage;
    long usage;
    long[] reportIds;
  };

  // Returned by <code>getDevices</code> functions to describes a connected HID
  // device. Use <code>connect</code> to connect to any of the returned devices.
  // |deviceId|: Device opaque ID.
  // |vendorId|: Vendor ID.
  // |productId|: Product ID.
  // |collections|: Top-level collections from this device's report descriptor.
  // |maxInputReportSize|: Top-level collection's max input report size.
  // |maxOutputReportSize|: Top-level collection's max output report size.
  // |maxFeatureReportSize|: Top-level collection's max feature report size.
  dictionary HidDeviceInfo {
    long deviceId;
    long vendorId;
    long productId;
    HidCollectionInfo[] collections;
    long maxInputReportSize;
    long maxOutputReportSize;
    long maxFeatureReportSize;
  };

  // Returned by <code>connect</code> to represent a communication session with
  // an HID device. Must be closed with a call to <code>disconnect</code>.
  dictionary HidConnectInfo {
    long connectionId;
  };

  // Searching criteria to enumerate devices with.
  dictionary GetDevicesOptions {
    long vendorId;
    long productId;
  };

  callback GetDevicesCallback = void (HidDeviceInfo[] devices);
  callback ConnectCallback = void (HidConnectInfo connection);
  callback DisconnectCallback = void ();

  // The callback to be invoked when a <code>receive</code> call is finished.
  // |reportId|: The ID of the report.
  // |data|: The content of the report.
  callback ReceiveCallback = void (long reportId, ArrayBuffer data);

  // The callback to be invoked when a <code>receiveFeatureReport</code> call
  // is finished.
  // |data|: The content of the report.
  callback ReceiveFeatureReportCallback = void (ArrayBuffer data);

  // The callback to be invoked when a <code>send</code> or
  // <code>sendFeatureReport</code> call is finished.
  callback SendCallback = void();

  interface Functions {
    // Enumerate all the connected HID devices specified by the vendorId/
    // productId/interfaceId tuple.
    // |options|: The properties to search for on target devices.
    // |callback|: Invoked with the <code>HidDeviceInfo</code> array on success.
    static void getDevices(GetDevicesOptions options,
                           GetDevicesCallback callback);

    // Open a connection to an HID device for communication.
    // |deviceId|: The ID of the device to open.
    // |callback|: Invoked with an <code>HidConnectInfo</code>.
    static void connect(long deviceId,
                        ConnectCallback callback);

    // Disconnect from a device. Invoking operations on a device after calling
    // this is safe but has no effect.
    // |connectionId|: The connection to close.
    // |callback|: The callback to invoke once the device is closed.
    static void disconnect(long connectionId,
                           optional DisconnectCallback callback);

    // Receive an Input report from an HID device.
    //
    // Input reports are returned to the host through the INTERRUPT IN endpoint.
    // |connectionId|: The connection from which to receive a report.
    // |callback|: The callback to invoke with received report.
    static void receive(long connectionId,
                        ReceiveCallback callback);

    // Send an Output report to an HID device.
    // <code>send</code> will send the data on the first OUT endpoint, if one
    // exists. If one does not exist, the report will be sent through the
    // Control endpoint.
    //
    // |connectionId|: The connection to which to send a report.
    // |reportId|: The report ID to use, or <code>0</code> if none.
    // |data|: The report data.
    // |callback|: The callback to invoke once the write is finished.
    static void send(long connectionId,
                     long reportId,
                     ArrayBuffer data,
                     SendCallback callback);

    // Receive a Feature report from the device.
    //
    // |connectionId|: The connection to read Input report from.
    // |reportId|: The report ID, or zero if none.
    // |callback|: The callback to invoke once the write is finished.
    static void receiveFeatureReport(long connectionId,
                                     long reportId,
                                     ReceiveFeatureReportCallback callback);

    // Send a Feature report to the device.
    //
    // Feature reports are sent over the Control endpoint as a Set_Report
    // transfer.
    // |connectionId|: The connection to read Input report from.
    // |reportId|: The report ID to use, or <code>0</code> if none.
    // |data|: The report data.
    // |callback|: The callback to invoke once the write is finished.
    static void sendFeatureReport(long connectionId,
                                  long reportId,
                                  ArrayBuffer data,
                                  SendCallback callback);
  };
};
