// Copyright 2020 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.lowpan.device;

using fuchsia.lowpan;

/// Describes the result from one channel of an energy scan.
type EnergyScanResult = table {
    /// The channel index for this energy scan result.
    1: channel_index fuchsia.lowpan.ChannelIndex;

    /// The maximum RSSI detected on this channel.
    2: max_rssi int32;

    /// The minimum RSSI detected on this channel.
    3: min_rssi int32;
};

/// Describes the parameters of an energy scan.
type EnergyScanParameters = table {
    /// Subset of channels to scan.
    ///
    /// If unspecified, all channels will be scanned.
    1: channels vector<fuchsia.lowpan.ChannelIndex>:MAX_CHANNELS;

    /// Desired dwell time per-channel for the energy scan,
    /// measured in milliseconds.
    ///
    /// Note that firmware limitations may prevent the
    /// exact dwell time from being used. In such cases
    /// an approximation will be used.
    ///
    /// Implementations must be able to support dwell times of at least
    /// 5000ms (5 seconds). The exact supported dwell-time range is
    /// device/driver dependent.
    ///
    /// Setting a value outside of the supported range of
    /// values for this device will result in the value being
    /// clamped to the closest valid value, so setting a value of zero
    /// will always request the smallest energy scan duration the
    /// device is capable of.
    ///
    /// If unspecified, a dwell time of approximately 500ms will be used.
    2: dwell_time_ms uint32;
};

/// Protocol for returning the results of an energy scan operation.
///
/// Closing the protocol will cancel the associated scan operation.
protocol EnergyScanResultStream {
    /// Called to fetch the next set of energy scan results.
    ///
    /// The last set will have zero items and the protocol will be closed.
    Next() -> (struct {
        results vector<EnergyScanResult>:MAX_STREAM_SET_SIZE;
    });
};

/// Protocol for connecting to [`EnergyScan`] on a LoWPAN
/// interface.
@discoverable
protocol EnergyScanConnector {
    /// Connects to the [`EnergyScan`] protocol on the
    /// named LoWPAN interface.
    ///
    /// The name of the interface can be learned by calling
    /// [`fuchsia.lowpan/Lookup.GetDevices`].
    ///
    /// If there is an error in processing this request
    /// the given channel is closed and an epitaph code used
    /// to describe the reason for the failure:
    ///
    /// * `ZX_ERR_INVALID_ARGUMENT`: The given interface name
    ///   was not formatted correctly or otherwise invalid.
    /// * `ZX_ERR_NOT_FOUND`: No interface was found with the
    ///   given name.
    /// * `ZX_ERR_NOT_SUPPORTED`: The interface exists but
    ///   does not support this protocol.
    Connect(resource struct {
        name fuchsia.lowpan.InterfaceName;
        server_end server_end:EnergyScan;
    });
};

protocol EnergyScan {
    /// Starts an energy scan operation.
    ///
    /// This can be used for surveying the spectrum to identify channels
    /// that should be avoided.
    ///
    /// The scan operation may be cancelled by closing the stream protocol.
    ///
    /// If a scan is started while another scan is in progress,
    /// the previous scan is allowed to complete before
    /// the new scan executes and starts returning results.
    ///
    /// All scans should be expected to completely occupy the
    /// LoWPAN device while it is in progress, preventing other operations
    /// from completing until the scan has completed. Additionally, all
    /// network packets should be expected to be dropped while a scan is
    /// in progress.
    ///
    /// Performing energy scans could be used to profile the spectrum
    /// energy for a location and thus be used to determine or refine coarse
    /// location information.
    StartEnergyScan(resource struct {
        params EnergyScanParameters;
        stream server_end:EnergyScanResultStream;
    });
};
