// 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);
};
