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

type PeripheralError = strict enum {
    /// 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.
type AdvertisingModeHint = strict enum : 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.
type AdvertisingParameters = table {
    /// The fields that will be encoded in the data section of advertising packets.
    ///
    /// This field is required.
    1: data AdvertisingData;

    /// 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: scan_response AdvertisingData;

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

    /// 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: connectable bool;

    /// 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: connection_options ConnectionOptions;
};

/// 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(resource struct {
        peer Peer;
        connection client_end: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(resource struct {
        parameters AdvertisingParameters;
        advertised_peripheral client_end:AdvertisedPeripheral;
    }) -> (struct {}) 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(resource struct {
        parameters AdvertisingParameters;
        handle server_end:AdvertisingHandle;
    }) -> (struct {}) 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(resource struct {
        peer Peer;
        connection client_end:Connection;
    });
};
