// 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]
protocol 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).
    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.
    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|.
    StartScan(ScanFilter? filter) -> (fuchsia.bluetooth.Status status);

    // Terminate a previously started scan session.
    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.
    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.
    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.
    -> 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.
    -> OnDeviceDiscovered(RemoteDevice device);

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