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

const uint32 MAX_BUFFER_SIZE = 4096;

/// This describes the format for each pixel in the screen.
enum PixelFormat : 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.
enum ScreenLayout : 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 = 1;
    /// 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 = 2;
};

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

/// 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.
[Layout = "Simple"]
protocol DotmatrixDisplay {
    /// Get the configuration to display the screen.
    GetConfig() -> (DotmatrixDisplayConfig config);
    /// Set the screen memory. Calling this function will update the display.
    SetScreen(vector<uint8>:MAX_BUFFER_SIZE screen_buffer) -> (zx.status s);
};
