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

    /// [[DEPRECATED]]: Prefer to use the ConnectionOptions field for new code.
    /// 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.
    4: bool connectable;

    /// If present, the controller will broadcast connectable advertisements which allow remote LE
    /// centrals 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 {
};

[Discoverable]
protocol Peripheral {
    /// 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.
    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 `handle` Represents the connection.
    -> OnPeerConnected(Peer peer, Connection connection);
};
