// Copyright 2023 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.bluetooth;

using zx;

/// The maximum buffer length an encoded command might require.
/// Update when adding new commands that might require a larger buffer.
const BT_VENDOR_MAX_COMMAND_BUFFER_LEN uint16 = 16;

/// Indicates support for Android Vendor Extensions
/// If empty, Android HCI Extensions are supported but the version is unspecified.
/// The version should be detected using the LE Get Vendor Capabilities Command.
type AndroidVendorSupport = table {
    1: major_version uint8;
    2: minor_version uint8;
};

/// Table of features supported by the vendor.
type VendorFeatures = table {
    /// Supports the SetAclPriority command
    /// If missing, the command is not supported.
    1: acl_priority_command bool;
    /// Supports Android Vendor Extensions
    /// If missing, Android Vendor Extensions are not supported.
    2: android_vendor_extensions AndroidVendorSupport;
};

type VendorAclPriority = flexible enum : uint8 {
    NORMAL = 1;
    HIGH = 2;
};

type VendorAclDirection = flexible enum : uint8 {
    SOURCE = 1;
    SINK = 2;
};

type VendorSetAclPriorityParams = table {
    /// The ACL connection handle which is requested to be prioritized.
    1: connection_handle uint16;
    2: priority VendorAclPriority;
    /// The direction data should be prioritized in. May not be supported by all
    /// vendors. Ignored when priority is normal.
    3: direction VendorAclDirection;
};

type VendorCommand = flexible union {
    1: set_acl_priority VendorSetAclPriorityParams;
};

/// The BtVendor protocol may be implemented by vendor drivers to support feature interrogation
/// and vendor command encoding.
open protocol Vendor {
    /// Transmits the Vendor Features supported by this controller.
    /// Shall be sent after the protocol is opened.
    flexible -> OnFeatures(VendorFeatures);

    /// Encode the vendor HCI command and return the encoded command.
    /// See `VendorCommand` for possible commands and parameters.
    /// Returns an error status if the command is not supported or paramaters cannot be encoded.
    flexible EncodeCommand(VendorCommand) -> (struct {
        encoded vector<uint8>:BT_VENDOR_MAX_COMMAND_BUFFER_LEN;
    }) error zx.Status;

    /// Deprecated.
    /// Open the HCI protocol to the controller.  This call may block until the
    /// controller has been initialized.
    /// Returns ALREADY_BOUND if another client has already connected.
    flexible OpenHci() -> (resource struct {
        channel client_end:Hci;
    }) error zx.Status;

    /// Open the HciTransport protocol to the controller. This call may block until the
    /// controller has been initialized.
    /// Returns ALREADY_BOUND if another client has already connected.
    flexible OpenHciTransport() -> (resource struct {
        channel client_end:HciTransport;
    }) error zx.Status;
};
