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

using fuchsia.bluetooth;
using fuchsia.bluetooth.gatt;

[Discoverable]
interface Central {
  // Returns the list of peripherals that are known to the system from previous scan, connection,
  // and/or bonding procedures. The results can be filtered based on service UUIDs that are known to
  // be present on the peripheral.
  //
  // This method only returns peripherals (i.e. connectable devices).
  1: GetPeripherals(vector<string>? service_uuids) -> (vector<RemoteDevice> peripherals);

  // Returns information about a single peripheral that is known to the system from previous scan,
  // connection, and/or bonding procedures based on its unique identifier. Returns null if
  // |identifier| is not recognized.
  2: GetPeripheral(string identifier) -> (RemoteDevice? peripheral);

  // Initiates a scan session for nearby peripherals and broadcasters. Discovered devices will be
  // reported via CentralDelegate.OnDeviceDiscovered(). If a scan session is already in progress,
  // |filter| will replace the existing session's filter.
  //
  // If |filter| is null or empty (i.e. none of its fields has been populated) then the delegate
  // will be notified for all discoverable devices that are found. This is not recommended; clients
  // should generally filter results by at least one of |filter.service_uuids|,
  // |filter.service_data|, and/or |filter.manufacturer_identifier|.
  3: StartScan(ScanFilter? filter) -> (fuchsia.bluetooth.Status status);

  // Terminate a previously started scan session.
  4: StopScan();

  // Creates a connection to the peripheral device with the given identifier.
  // Returns the status of the operation in |status|.
  //
  // On success, |gatt_client| will be bound and can be used for GATT client
  // role procedures. On failure, |gatt_client| will be closed and |status| will
  // indicate an error.
  5: ConnectPeripheral(string identifier, request<fuchsia.bluetooth.gatt.Client> gatt_client) -> (fuchsia.bluetooth.Status status);

  // Disconnects this Central's connection to the peripheral with the given identifier.
  6: DisconnectPeripheral(string identifier) -> (fuchsia.bluetooth.Status status);

  // Called when the scan state changes, e.g. when a scan session terminates due to a call to
  // Central.StopScan() or another unexpected condition.
  101: -> OnScanStateChanged(bool scanning);

  // Called for each peripheral/broadcaster that is discovered during a scan session. |rssi|
  // contains the received signal strength of the advertising packet that generated this event, if
  // available.
  102: -> OnDeviceDiscovered(RemoteDevice device);

  // Called when this Central's connection to a peripheral with the given identifier is terminated.
  103: -> OnPeripheralDisconnected(string identifier);
};
