// Copyright 2022 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.
@available(added=7)
library fuchsia.lowpan;

/// Index used to identify a specific channel in the LoWPAN API.
alias ChannelIndex = uint16;

/// Transmit/Received power, in dBm.
///
/// Can represent transmit and receive power levels from .2 femtowatts (-127dBm)
/// to 5 gigawatts (127dBm).
///
/// The value -128 ([`RSSI_UNSPECIFIED`]) is reserved for
/// indicating that a signal level is unspecified when used
/// in the context of RSSI values, and must not be used when
/// specifying transmit power.
alias PowerDbm = int8;

/// Type describing the name of the network interface.
///
/// Interface names must satisfy the following regular expression:
///
///     ^[a-z_][-_.+0-9a-z]{1,31}$
///
alias InterfaceName = string:32;

// Arbitrarily chosen at an expected maximum number of radio interfaces on
// a single device.
const MAX_LOWPAN_DEVICES uint32 = 8;

/// Protocol for discovering and resolving LoWPAN interfaces and their
/// associated control protocol instances.
@discoverable
protocol DeviceWatcher {
    /// Observes when devices are added or removed.
    ///
    /// The first call to this method returns immediately with a
    /// `DeviceChanges` struct containing only items in the `added` field with
    /// the names of all of the current devices. Subsequent calls
    /// will block until a device has been added or removed, at which
    /// point it will return with the `added` and/or `removed` fields
    /// filled out accordingly. The changes are reported since the
    /// time that the method returned.
    ///
    /// If both the `added` and `removed` fields have names in the returned
    /// table, then the `removed` field MUST be processed BEFORE `added` field.
    ///
    /// If a device was added and then removed in-between calls to this
    /// method, the device will be absent from both the `added` and `removed`
    /// lists.
    ///
    /// If the same device name is listed on both the `added` and `removed`
    /// fields, then the client should assume that the original device was
    /// removed and a new device instance started in its place. However, while
    /// the client should be able to handle this condition, it should not depend
    /// on the server will always have this behavior.
    WatchDevices() -> (struct {
        added vector<InterfaceName>:MAX_LOWPAN_DEVICES;
        removed vector<InterfaceName>:MAX_LOWPAN_DEVICES;
    });
};
