// Copyright 2018 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.telephony.ril;

/// Power State of the radio
enum RadioPowerState : uint8 {
    OFF = 0x00;
    ON = 0x01;
};

/// Errors that the Radio Interface Layer presents to modem
/// management interfaces
enum RilError : uint32 {
    /// The radio on this interface is unavailable.
    NO_RADIO = 0x01;
    /// The request required a SIM card and none are unavailable.
    NO_SIM = 0x02;
    /// The baseband reported information for a type of cellular network
    /// that is currently unsupported.
    UNSUPPORTED_NETWORK_TYPE = 0x03;
    /// An unknown error.
    UNKNOWN_ERROR = 0x04;
    /// An unknown transport error.
    TRANSPORT_ERROR = 0x05;
};

protocol NetworkConnection {
    Stop() -> (bool success);
};

// currently only ipv4 stuff, to drastically change
struct NetworkSettings {
    uint32 ip_v4_addr;
    uint32 ip_v4_subnet;
    uint32 ip_v4_gateway;
    uint32 ip_v4_dns;
    uint32 mtu;
};

/// The Standard Fuchsia RIL (FRIL)
[Discoverable]
protocol Setup {
    /// Hand a transport `channel` to the RIL service connecting it to the modem. Most
    /// modems will require this to be the first method called, since they are dependent
    /// on this. If a connection is already active, it will return false. If the channel
    /// is set successfully, it will return true.
    ///
    /// Called globaly per-modem, not per client connection.
    ///
    /// Implementation Detail: current services speak QMI but others will most likely speak other
    /// binary formats.
    ConnectTransport(handle<channel> channel) -> () error RilError;
};

/// The Standard Fuchsia RIL (FRIL)
[Discoverable]
protocol RadioInterfaceLayer {
    /// Retrieve the identity of the modem (currently `imei` only).
    GetDeviceIdentity() -> (string imei) error RilError;

    /// Power state of the radio. Currently on On or Off.
    RadioPowerStatus() -> (RadioPowerState state) error RilError;

    /// Activate a network connection.
    StartNetwork(string apn) -> (NetworkConnection conn) error RilError;

    /// Network settings known to the modem.
    GetNetworkSettings() -> (NetworkSettings settings) error RilError;

    /// Signal Strength (dBm) for LTE networks (total received wideband power).
    GetSignalStrength() -> (float32 dbm) error RilError;

    /// Raw string to send to modem for development.
    RawCommand(string command) -> (string result) error RilError;
};
