# Copyright (c) 2024 TOKITA Hiroshi
# SPDX-License-Identifier: Apache-2.0

description: |
  Generic LED strip matrix (LED strip arranged in a grid pattern)

compatible: "led-strip-matrix"

include: display-controller.yaml

properties:
  circulative:
    type: boolean
    description: |
      Use a circulative layout that returns to the left edge of the next row
      after reaching the right edge.
      If not set, turn around and go left in a serpentine layout when it reaches
      the right edge.

      * circulative layout
        [ 0][ 1][ 2][ 3]
        [ 4][ 5][ 6][ 7]
        [ 8][ 9][10][11]
        [12][13][14][15]

      * serpentine layout
        [ 0][ 1][ 2][ 3]
        [ 7][ 6][ 5][ 4]
        [ 8][ 9][10][11]
        [15][14][13][12]

  start-from-right:
    type: boolean
    description: |
      Specify if the first LED is at the right.

      * Start from the right with a serpentine layout
        [ 3][ 2][ 1][ 0]
        [ 4][ 5][ 6][ 7]
        [11][10][ 9][ 8]
        [12][13][14][15]

      * Start from the right with a circulative layout
        [ 3][ 2][ 1][ 0]
        [ 7][ 6][ 5][ 4]
        [11][10][ 9][ 8]
        [15][14][13][12]

  start-from-bottom:
    type: boolean
    description: |
      Specify if the first LED is at the bottom.

      * Start from the bottom with a circulative layout
        [12][13][14][15]
        [ 8][ 9][10][11]
        [ 4][ 5][ 6][ 7]
        [ 0][ 1][ 2][ 3]

      * Start from the bottom with a serpentine layout
        [15][14][13][12]
        [ 8][ 9][10][11]
        [ 7][ 6][ 5][ 4]
        [ 0][ 1][ 2][ 3]

  width:
    description: |
      Specifies the overall width of the matrix.
      If the matrix consists of multiple modules, it is the sum of their widths.

  height:
    description: |
      Specifies the overall height of the matrix.
      If the matrix consists of multiple modules, it is the sum of their heights.

  horizontal-modules:
    type: int
    default: 1
    description: |
      If the display forms with multiple modules,
      specify the horizontal number of modules.
      The number must be able to divide the width value.
      If not set, it controls a single matrix.

      * 8x4 display with 2 serpentine layout modules
        [ 0][ 1][ 2][ 3]  [16][17][18][19]
        [ 7][ 6][ 5][ 4]  [23][22][21][20]
        [ 8][ 9][10][11]  [24][25][26][27]
        [15][14][13][12]  [31][30][29][28]

  vertical-modules:
    type: int
    default: 1
    description: |
      If the display forms with multiple modules,
      specify the vertical number of modules.
      The number must be able to divide the height value.
      If not set, it controls a single matrix.

      * 4x8 display with 2 serpentine layout modules
        [ 0][ 1][ 2][ 3]
        [ 7][ 6][ 5][ 4]
        [ 8][ 9][10][11]
        [15][14][13][12]

        [16][17][18][19]
        [23][22][21][20]
        [24][25][26][27]
        [31][30][29][28]

  modules-circulative:
    type: boolean
    description: |
      Specifies that the order of the modules that make up the matrix is circulative.

      * circulative module layout
        [M0][M1][M2]
        [M3][M4][M5]
        [M6][M7][M8]

      * serpentine module layout
        [M0][M1][M2]
        [M5][M4][M3]
        [M6][M7][M8]

  modules-start-from-right:
    type: boolean
    description: |
      Specifies that modules are ordered from right to left.

      * Start from the right with a module serpentine layout
        [M2][M1][M0]
        [M3][M4][M5]
        [M8][M7][M6]

      * Start from the right with a module circulative layout
        [M2][M1][M0]
        [M5][M4][M3]
        [M8][M7][M6]

  modules-start-from-bottom:
    type: boolean
    description: |
      Specifies that modules are ordered from bottom to top.

      * Start from the right with a module serpentine layout
        [M6][M7][M8]
        [M5][M4][M3]
        [M0][M1][M2]

      * Start from the right with a module circulative layout
        [M6][M7][M8]
        [M3][M4][M5]
        [M0][M1][M2]

  led-strips:
    type: phandles
    required: true
    description: |
      Specify the LED strip that is the substance of the matrix.
      If multiple strips are specified, they are "flattened" and sequentialized.
      For example, if `strip0` and `strip1` with 128 LEDs are specified,
      the first LED of `strip1` will be treated as the 129th LED.
      These LEDs are mapped to coordinates according to the layout rule in order.
      The amount of LEDs must equal the [width * height] value.

  chain-lengths:
    type: array
    description: |
      Specify the number of LEDs for each strip.
      It can omit the value if all strip nodes have a `chain-length` property.
      Each value must be a multiple of the number of LEDs per module
      [(width / horizontal-modules) * (height / vertical-modules)].

  pixel-format:
    type: int
    default: 1
    description: |
      Initial Pixel format.
      See dt-bindings/display/panel.h for a list.
      This property only accepts PANEL_PIXEL_FORMAT_RGB_888 and PANEL_PIXEL_FORMAT_RRGB_8888.
      If this property is not set, use PANEL_PIXEL_FORMAT_RGB_888 as a default.
