// 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 MAX_BUFFER_SIZE uint32 = 4096;

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

@for_deprecated_c_bindings
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.
@for_deprecated_c_bindings
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_BUFFER_SIZE;
    }) -> (struct {
        s zx.status;
    });
};
