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

[ForDeprecatedCBindings]
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.
[ForDeprecatedCBindings]
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);
};
