// Copyright 2020 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.bt.vendor;

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;

/// Bitmask of features supported by the vendor.
type BtVendorFeatures = strict enum : uint32 {
    SET_ACL_PRIORITY_COMMAND = 0x1;
    ANDROID_VENDOR_EXTENSIONS = 0x2;
    // Bits 2-31 reserved.
};

type BtVendorAclPriority = strict enum : uint8 {
    NORMAL = 0;
    HIGH = 1;
};

type BtVendorAclDirection = strict enum : uint8 {
    SOURCE = 0;
    SINK = 1;
};

type BtVendorSetAclPriorityParams = struct {
    connection_handle uint16;
    priority BtVendorAclPriority;
    /// The direction data should be prioritized in. May not be supported by all
    /// vendors. Ignored when priority is normal.
    direction BtVendorAclDirection;
};

type BtVendorParams = strict union {
    1: set_acl_priority BtVendorSetAclPriorityParams;
};

type BtVendorCommand = strict enum {
    /// Marks a connection as normal or high priority.
    /// Parameters: `BtVendorSetAclPriorityParams`
    SET_ACL_PRIORITY = 0;
};

/// The BtVendor protocol may be implemented by vendor drivers to support feature interrogation
/// and vendor command encoding.
@transport("Banjo")
@banjo_layout("ddk-protocol")
closed protocol BtVendor {
    /// Returns bitmask of the features the vendor supports.
    strict GetFeatures() -> (struct {
        features BtVendorFeatures;
    });

    /// Encodes the vendor HCI command `command` using `params` and returns the encoded command as
    /// a buffer. `params` must contain the parameter struct for the specified command, as
    /// documented in `BtVendorCommand`.
    /// Returns an error status if the command is not supported or the paramaters are invalid.
    strict EncodeCommand(struct {
        command BtVendorCommand;
        params BtVendorParams;
    }) -> (struct {
        status zx.Status;
        @buffer
        encoded vector<uint8>:BT_VENDOR_MAX_COMMAND_BUFFER_LEN;
    });
};
