# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

# This file contains Emboss packet definitions for extensions to the Bluetooth
# Host-Controller interface. These extensions are not standardized through the
# Bluetooth SIG.
#
# NOTE: The definitions below are incomplete. They get added as needed.
# This list will grow as we support more vendor features.

import "hci.emb" as hci

[$default byte_order: "LittleEndian"]
[(cpp) namespace: "pw::bluetooth::emboss"]

# ======================= Android HCI extensions ========================
# Documentation: https://source.android.com/devices/bluetooth/hci_requirements


# ============ Commands ============


struct LEMultiAdvtEnableCommand:
  -- LE multi-advertising enable command.
  let hdr_size = hci.CommandHeader.$size_in_bytes
  0      [+hdr_size]  hci.CommandHeader       header
  $next  [+1]         UInt                    opcode
  $next  [+1]         hci.GenericEnableParam  enable
  $next  [+1]         UInt                    advertising_handle


# ============ Events ============


struct LEMultiAdvtStateChangeSubevent:
  -- LE multi-advertising state change subevent.
  0     [+hci.VendorDebugEvent.$size_in_bytes]  hci.VendorDebugEvent  vendor_event
  $next [+1]                                    UInt                  advertising_handle
    -- Handle used to identify an advertising set.

  $next [+1]                                    hci.StatusCode        status
    -- Reason for state change. Currently will always be 0x00.
    -- 0x00: Connection received.

  $next [+2]                                    UInt                  connection_handle
    -- Handle used to identify the connection that caused the state change (i.e.
    -- advertising instance to be disabled). Value will be 0xFFFF if invalid.
