# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Contributing to Chrome DevTools Protocol: https://goo.gle/devtools-contribution-guide-cdp

# This domain allows configuring virtual Bluetooth devices to test
# the web-bluetooth API.
experimental domain BluetoothEmulation
  # Indicates the various states of Central.
  type CentralState extends string
    enum
      absent
      powered-off
      powered-on

  # Indicates the various types of GATT event.
  type GATTOperationType extends string
    enum
      connection
      discovery

  # Indicates the various types of characteristic write.
  type CharacteristicWriteType extends string
    enum
      write-default-deprecated
      write-with-response
      write-without-response

  # Indicates the various types of characteristic operation.
  type CharacteristicOperationType extends string
    enum
      read
      write
      subscribe-to-notifications
      unsubscribe-from-notifications

  # Indicates the various types of descriptor operation.
  type DescriptorOperationType extends string
    enum
      read
      write

  # Stores the manufacturer data
  type ManufacturerData extends object
    properties
      # Company identifier
      # https://bitbucket.org/bluetooth-SIG/public/src/main/assigned_numbers/company_identifiers/company_identifiers.yaml
      # https://usb.org/developers
      integer key
      # Manufacturer-specific data
      binary data

  # Stores the byte data of the advertisement packet sent by a Bluetooth device.
  type ScanRecord extends object
    properties
      optional string name
      optional array of string uuids
      # Stores the external appearance description of the device.
      optional integer appearance
      # Stores the transmission power of a broadcasting device.
      optional integer txPower
      # Key is the company identifier and the value is an array of bytes of
      # manufacturer specific data.
      optional array of ManufacturerData manufacturerData

  # Stores the advertisement packet information that is sent by a Bluetooth device.
  type ScanEntry extends object
    properties
      string deviceAddress
      integer rssi
      ScanRecord scanRecord

  # Describes the properties of a characteristic. This follows Bluetooth Core
  # Specification BT 4.2 Vol 3 Part G 3.3.1. Characteristic Properties.
  type CharacteristicProperties extends object
    properties
      optional boolean broadcast
      optional boolean read
      optional boolean writeWithoutResponse
      optional boolean write
      optional boolean notify
      optional boolean indicate
      optional boolean authenticatedSignedWrites
      optional boolean extendedProperties

  # Enable the BluetoothEmulation domain.
  command enable
    parameters
      # State of the simulated central.
      CentralState state
      # If the simulated central supports low-energy.
      boolean leSupported

  # Set the state of the simulated central.
  command setSimulatedCentralState
    parameters
      # State of the simulated central.
      CentralState state

  # Disable the BluetoothEmulation domain.
  command disable

  # Simulates a peripheral with |address|, |name| and |knownServiceUuids|
  # that has already been connected to the system.
  command simulatePreconnectedPeripheral
    parameters
      string address
      string name
      array of ManufacturerData manufacturerData
      array of string knownServiceUuids

  # Simulates an advertisement packet described in |entry| being received by
  # the central.
  command simulateAdvertisement
    parameters
      ScanEntry entry

  # Simulates the response code from the peripheral with |address| for a
  # GATT operation of |type|. The |code| value follows the HCI Error Codes from
  # Bluetooth Core Specification Vol 2 Part D 1.3 List Of Error Codes.
  command simulateGATTOperationResponse
    parameters
      string address
      GATTOperationType type
      integer code

  # Simulates the response from the characteristic with |characteristicId| for a
  # characteristic operation of |type|. The |code| value follows the Error
  # Codes from Bluetooth Core Specification Vol 3 Part F 3.4.1.1 Error Response.
  # The |data| is expected to exist when simulating a successful read operation
  # response.
  command simulateCharacteristicOperationResponse
    parameters
      string characteristicId
      CharacteristicOperationType type
      integer code
      optional binary data

  # Simulates the response from the descriptor with |descriptorId| for a
  # descriptor operation of |type|. The |code| value follows the Error
  # Codes from Bluetooth Core Specification Vol 3 Part F 3.4.1.1 Error Response.
  # The |data| is expected to exist when simulating a successful read operation
  # response.
  command simulateDescriptorOperationResponse
    parameters
      string descriptorId
      DescriptorOperationType type
      integer code
      optional binary data

  # Adds a service with |serviceUuid| to the peripheral with |address|.
  command addService
    parameters
      string address
      string serviceUuid
    returns
      # An identifier that uniquely represents this service.
      string serviceId

  # Removes the service respresented by |serviceId| from the simulated central.
  command removeService
    parameters
      string serviceId

  # Adds a characteristic with |characteristicUuid| and |properties| to the
  # service represented by |serviceId|.
  command addCharacteristic
    parameters
      string serviceId
      string characteristicUuid
      CharacteristicProperties properties
    returns
      # An identifier that uniquely represents this characteristic.
      string characteristicId

  # Removes the characteristic respresented by |characteristicId| from the
  # simulated central.
  command removeCharacteristic
    parameters
      string characteristicId

  # Adds a descriptor with |descriptorUuid| to the characteristic respresented
  # by |characteristicId|.
  command addDescriptor
    parameters
      string characteristicId
      string descriptorUuid
    returns
      # An identifier that uniquely represents this descriptor.
      string descriptorId

  # Removes the descriptor with |descriptorId| from the simulated central.
  command removeDescriptor
    parameters
      string descriptorId

  # Simulates a GATT disconnection from the peripheral with |address|.
  command simulateGATTDisconnection
    parameters
      string address

  # Event for when a GATT operation of |type| to the peripheral with |address|
  # happened.
  event gattOperationReceived
    parameters
      string address
      GATTOperationType type

  # Event for when a characteristic operation of |type| to the characteristic
  # respresented by |characteristicId| happened. |data| and |writeType| is
  # expected to exist when |type| is write.
  event characteristicOperationReceived
    parameters
      string characteristicId
      CharacteristicOperationType type
      optional binary data
      optional CharacteristicWriteType writeType

  # Event for when a descriptor operation of |type| to the descriptor
  # respresented by |descriptorId| happened. |data| is expected to exist when
  # |type| is write.
  event descriptorOperationReceived
    parameters
      string descriptorId
      DescriptorOperationType type
      optional binary data
