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

enum PeripheralError {
    /// The operation or parameters requested are not supported on the current hardware.
    NOT_SUPPORTED = 1;

    /// The provided advertising data exceeds the maximum allowed length when encoded.
    ADVERTISING_DATA_TOO_LONG = 2;

    /// The provided scan response data exceeds the maximum allowed length when encoded.
    SCAN_RESPONSE_DATA_TOO_LONG = 3;

    /// The requested parameters are invalid.
    INVALID_PARAMETERS = 4;

    /// The request to start advertising was aborted, for example by issuing a new request with new
    /// parameters.
    ABORTED = 5;

    /// Advertising could not be initiated due to a hardware or system error.
    FAILED = 6;
};

/// A client can indicate the transmission rate of advertising packets by specifying a mode. The
/// mode provides a hint to the system when configuring the controller with advertising interval and
/// window parameters.
///
/// The mode affects how quickly a scanner or central is able to discover the peripheral; however it
/// can have an adverse effect on power consumption. While the system will try to honor a client's
/// request, it is not guaranteed to do so.
enum AdvertisingModeHint : uint8 {
    /// Advertise with a very short interval and window for fast discovery at the cost of higher
    /// power consumption. This corresponds to a 30-60ms interval on the 1M PHYs and 90-180ms on the
    /// coded PHY.
    VERY_FAST = 1;

    /// Advertise with a short interval and window that uses less power than `VERY_FAST`.
    /// This corresponds to a 100-150ms interval on the 1M PHYs and 300-450ms on the coded PHY.
    FAST = 2;

    /// Advertise with a moderate interval and window. This corresponds to 1-1.2s on the 1M PHYs and 3s
    /// on the coded PHY.
    SLOW = 3;
};

/// Represents the parameters for configuring advertisements.
table AdvertisingParameters {
    /// The fields that will be encoded in the data section of advertising packets.
    ///
    /// This field is required.
    1: AdvertisingData data;

    /// The fields that are to be sent in a scan response packet. Clients may use this to send
    /// additional data that does not fit inside an advertising packet on platforms that do not
    /// support the advertising data length extensions.
    ///
    /// If present advertisements will be configured to be scannable.
    2: AdvertisingData scan_response;

    /// The desired advertising frequency. See [`fuchsia.bluetooth.le/AdvertisingModeHint`].
    /// Defaults to [`fuchsia.bluetooth.le/AdvertisingModeHint.SLOW`] if not present.
    3: AdvertisingModeHint mode_hint;

    /// If present and true then the controller will broadcast connectable advertisements which
    /// allows remote LE centrals to initiate a connection to the Peripheral. If false or otherwise
    /// not present then the advertisements will be non-connectable.
    [Deprecated = "Prefer to use the connection_options field for new code."]
    4: bool connectable;

    /// If present, the controller will broadcast connectable advertisements
    /// which allow peers to initiate connections to the Peripheral. The fields
    /// of `ConnectionOptions` will configure any connections set up from
    /// advertising.
    5: ConnectionOptions connection_options;
};

/// Capability that is valid for the duration of advertising. The caller can close the handle to
/// stop advertising. If the system internally stops advertising for any reason, the handle will be
/// closed to communicate this to the client.
protocol AdvertisingHandle {
};

/// Protocol that is valid for the duration of advertising. The caller can close
/// the protocol to stop advertising. If the system internally stops advertising
/// for any reason, the protocol will be closed to communicate this to the
/// client.
protocol AdvertisedPeripheral {
    /// Called when a remote LE central connects to this peripheral when
    /// connectable advertising is enabled via
    /// [`fuchsia.bluetooth.le/Peripheral.Advertise`]. When this call is made,
    /// the system has paused advertising, and will not continue until it
    /// receives a response.
    ///
    /// The returned [`fuchsia.bluetooth.le/Connection`] protocol can be used to
    /// interact with the peer. It also represents a peripheral's ownership over
    /// the connection: the client can drop the protocol to request a
    /// disconnection. Similarly, the protocol is closed by the system to
    /// indicate that the connection to the peer has been lost.
    ///
    /// + request `peer` Information about the central that initiated the
    ///   connection.
    /// + request `connection` Represents the connection.
    /// - response An empty response should be sent to acknowledge the
    ///   connection and resume advertising (for flow control).
    OnConnected(Peer peer, Connection connection) -> ();
};

[Discoverable]
protocol Peripheral {
    /// Start advertising continuously as a LE peripheral. If advertising cannot
    /// be initiated then `advertised_peripheral` will be closed and an error
    /// will be returned.
    ///
    /// This method may be called any number of times. To reconfigure an
    /// advertisement, first close the original advertisement and then initiate
    /// a new advertisement after an empty response is returned.
    ///
    /// If the client closes its end of the
    /// [`fuchsia.bluetooth.le/AdvertisedPeripheral`] channel,
    /// advertising will be stopped. If the handle is closed before the request
    /// is fulfilled, advertising may be briefly enabled before it is
    /// terminated. AdvertisedPeripheral lifetime is bounded by the lifetime of
    /// the Peripheral protocol, but this may be changed in the future
    /// (fxbug.dev/77644).
    ///
    /// + request `parameters` Parameters used while configuring the advertising
    ///   instance.
    /// + request `advertised_peripheral` Protocol that remains valid for the
    ///   duration of this advertising session.
    /// - response An empty response will be sent when the advertisement is
    ///   successfully stopped (due to release of the `advertised_peripheral`
    ///   protocol). To prevent overlapping similar advertisements and transient
    ///   errors with limited advertising resources, waiting for a response is
    ///   recommended before calling `Advertise` again.
    /// * error If an error occurs, `advertised_peripheral` will be closed and a
    ///   `PeripheralError` will be returned.
    Advertise(AdvertisingParameters parameters, AdvertisedPeripheral advertised_peripheral) -> () error PeripheralError;

    /// Start advertising as a LE peripheral. An empty response is sent to indicate when advertising
    /// has successfully initiated. If advertising cannot be initiated, then the response will
    /// contain a [`fuchsia.bluetooth.le/PeripheralError`].
    ///
    /// This method can get called any number of times and successive calls can be made to
    /// reconfigure the advertising parameters. However only the most recent
    /// [`fuchsia.bluetooth.le/AdvertisingHandle`] will remain valid.
    ///
    /// An instance of [`fuchsia.bluetooth.le/Peripheral`] can only have one active advertisement at
    /// a time. Clients must obtain multiple Peripheral instances for multiple simultaneous
    /// advertisements.
    ///
    /// If the client closes its end of the [`fuchsia.bluetooth.le/AdvertisingHandle`] channel,
    /// advertising will be stopped. If the handle is closed before the request is fulfilled,
    /// advertising will be briefly enabled before it is terminated.
    ///
    /// + request `parameters` Parameters used while configuring the advertising instance.
    /// + request `handle` Handle that remains valid for the duration of this advertising session.
    /// * error Returns a [`fuchsia.bluetooth.le/PeripheralError`] if advertising cannot be
    ///         initiated. In this case the `handle` will be closed.
    [Deprecated]
    StartAdvertising(AdvertisingParameters parameters, request<AdvertisingHandle> handle) -> () error PeripheralError;

    /// Event delivered when a remote LE central initiates a connection to this Peripheral when
    /// connectable advertising is enabled via
    /// [`fuchsia.bluetooth.le/Peripheral.StartAdvertising`].
    ///
    /// The returned [`fuchsia.bluetooth.le/Connection`] handle can be used to interact with the
    /// peer. It also represents a peripheral's ownership over the connection: the client can drop
    /// the handle to request a disconnection. Similarly, the handle is closed by the system to
    /// indicate that the connection to the peer has been lost.
    ///
    /// + request `peer` Information about the central that initiated the connection.
    /// + request `connection` Represents the connection.
    [Deprecated]
    -> OnPeerConnected(Peer peer, Connection connection);
};
