// Copyright 2019 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.hardware.serial;

using zx;

/// Description of what type of serial device this is
enum Class : uint8 {
    GENERIC = 1;
    /// A Bluetooth host controller
    BLUETOOTH_HCI = 2;
    /// An interactive console
    CONSOLE = 3;
    /// Kernel debug serial
    KERNEL_DEBUG = 4;
};

/// Number of bits per character
enum CharacterWidth : uint8 {
    BITS_5 = 1;
    BITS_6 = 2;
    BITS_7 = 3;
    BITS_8 = 4;
};

/// Number of stop bits
enum StopWidth : uint8 {
    BITS_1 = 1;
    BITS_2 = 2;
};

/// Which parity computation to use, if any.
enum Parity : uint8 {
    NONE = 1;
    EVEN = 2;
    ODD = 3;
};

/// What flow control mechanism to use
enum FlowControl : uint8 {
    NONE = 1;
    /// Clear To Send/Request To Send
    CTS_RTS = 2;
};

struct Config {
    CharacterWidth character_width;
    StopWidth stop_width;
    Parity parity;
    FlowControl control_flow;
    uint32 baud_rate;
};

/// Legacy synchronous device interface.
/// New drivers should implement NewDevice instead.
protocol Device {
    /// Lookup what type of serial device this is.
    GetClass() -> (Class device_class);

    /// Set the configuration of this serial device.
    SetConfig(Config config) -> (zx.status s);
};

/// FIDL device utilizing the new asynchronous serial driver
/// instead of the synchronous FDIO-backed read/write interface.
/// New drivers should implement this instead of the Device interface above.
protocol NewDevice {
    compose Device;

    /// Reads data from the serial port
    Read() -> (vector<uint8>:MAX data) error zx.status;

    /// Writes data to the serial port
    Write(vector<uint8>:MAX data) -> () error zx.status;
};

[Discoverable]
protocol NewDeviceProxy {
    GetChannel(request<NewDevice> req);
};
