// Copyright 2017 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;

[Discoverable]
interface Peripheral {
    // Starts sending advertisements based on the given parameters.
    //   - |advertising_data|: The advertising data that should be included in the payload.
    //   - |scan_result|: The scan result that will be returned when the advertisement is
    //                    scanned.  Setting this will mark the advertisement set as scannable.
    //   - |connectable|: when true, this advertisement will be marked as connectable.
    //                 NOTE: connections can be made to a GATT server even if this is not set.
    //   - |interval_ms|: The requested interval to advertise this set at in milliseconds.
    //                    minimum 20, maximum 10,000,000 (almost 3 hours). A reasonable
    //                    default is 1 second (1000).
    //   - |anonymous|: if true, the address of this device will not be included
    //
    // If the |tx_power_level| is set in either AdvertisingData, it will be replaced with
    // the actual TX Power level reported by the adapter, or included in the extended header
    // of the Advertising PDU to save advertising space.
    //
    // If |scan_result| and |advertising_data| are both set, legacy advertising will be used,
    // which limits the size of the advertising data.
    //
    // This request will fail if:
    //   - The |service_uuids| field of |advertising_data| contains a UUID that does not match
    //     a GATT service that was previously registered by this application;
    //   - If the provided advertising data cannot fit within the advertising payload MTU that
    //     is supported on the current platform and parameters.
    //   - If |anonymous| advertising is requested but the controller cannot support it.
    1: StartAdvertising(AdvertisingData advertising_data, AdvertisingData? scan_result,
                        bool connectable, uint32 interval_ms, bool anonymous)
           -> (fuchsia.bluetooth.Status status, string? advertisement_id);

    // Stop a an advertising session that was previously started by this application.
    2: StopAdvertising(string advertisement_id) -> (fuchsia.bluetooth.Status status);

    // Called when a remote central device has connected to a connectable advertisement.
    // Provides a GATT client handle which can be used to interact with GATT service
    // on the central device.
    //
    // When this is called, the Advertisement will have stopped, and StartAdvertising
    // should be called again to re-start advertising when the peripheral can accept
    // another connection.
    //
    // Note: Centrals can connect to the local device and interact with the GATT server
    // from an application without Peripheral.StartAdvertising() being called.
    101: -> OnCentralConnected(string advertisement_id, RemoteDevice central);

    // Called when a remote central previously connected to this application is disconnected.
    102: -> OnCentralDisconnected(string device_id);
};