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

using zx;

/// This describes the format for each pixel in the screen.
type PixelFormat = strict enum : uint32 {
    /// Pixels have on or off value (0 or 1). There is one bit per pixel.
    MONOCHROME = 0;
};

/// Describes the layout of the pixels within the screen vector.
type ScreenLayout = strict enum : uint32 {
    /// The vector is laid out with columns top-to-bottom. The columns
    /// are organized into rows that go left-to-right.
    COLUMN_TB_ROW_LR = 0;
    /// The vector is laid out with rows left-to-right. The rows
    /// are organized into columns that go top-to-bottom.
    ROW_LR_COLUMN_TB = 1;
};

type DotmatrixDisplayConfig = struct {
    /// The screen's width in pixels.
    width uint32;
    /// The screen's height in pixels.
    height uint32;
    format PixelFormat;
    layout ScreenLayout;
};

/// Protocol for Dotmatrix display drivers. A Dotmatrix display is any
/// externally connected display that is written to pixel by pixel. These are
/// typically connected to over USB, I2C, or SPI, and they have a small number
/// of pixels. The display could be monochromatic or have RGB values. This
/// protocol is NOT for a display with lots of pixels or extra hardware like an
/// HDMI or DP display.
@transport("Banjo")
@banjo_layout("ddk-protocol")
protocol DotmatrixDisplay {
    /// Get the configuration to display the screen.
    GetConfig() -> (struct {
        config DotmatrixDisplayConfig;
    });
    /// Set the screen memory. Calling this function will update the display.
    SetScreen(struct {
        screen_buffer vector<uint8>:MAX;
    }) -> (struct {
        s zx.status;
    });
};
