X-Git-Url: https://git.ayoreis.com/hackapet/Adafruit_Blinka_Displayio.git/blobdiff_plain/3e71b56944b2f39930bd2d50a387042a6c6d6fcc..9174c060a2059d9debc04a1254bbc516f78d0dd7:/displayio/_epaperdisplay.py diff --git a/displayio/_epaperdisplay.py b/displayio/_epaperdisplay.py new file mode 100644 index 0000000..56181d6 --- /dev/null +++ b/displayio/_epaperdisplay.py @@ -0,0 +1,156 @@ +# SPDX-FileCopyrightText: 2020 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +""" +`displayio.epaperdisplay` +================================================================================ + +displayio for Blinka + +**Software and Dependencies:** + +* Adafruit Blinka: + https://github.com/adafruit/Adafruit_Blinka/releases + +* Author(s): Melissa LeBlanc-Williams + +""" + +import microcontroller +import _typing +from ._group import Group +from . import _DisplayBus +from typing import Optional + +__version__ = "0.0.0-auto.0" +__repo__ = "https://github.com/adafruit/Adafruit_Blinka_displayio.git" + + +class EPaperDisplay: + """Manage updating an epaper display over a display bus + + This initializes an epaper display and connects it into CircuitPython. Unlike other + objects in CircuitPython, EPaperDisplay objects live until + displayio.release_displays() is called. This is done so that CircuitPython can use + the display itself. + + Most people should not use this class directly. Use a specific display driver instead + that will contain the startup and shutdown sequences at minimum. + """ + + def __init__( + self, + display_bus: _DisplayBus, + start_sequence: _typing.ReadableBuffer, + stop_sequence: _typing.ReadableBuffer, + *, + width: int, + height: int, + ram_width: int, + ram_height: int, + colstart: int = 0, + rowstart: int = 0, + rotation: int = 0, + set_column_window_command: Optional[int] = None, + set_row_window_command: Optional[int] = None, + set_current_column_command: Optional[int] = None, + set_current_row_command: Optional[int] = None, + write_black_ram_command: int, + black_bits_inverted: bool = False, + write_color_ram_command: Optional[int] = None, + color_bits_inverted: bool = False, + highlight_color: int = 0x000000, + refresh_display_command: int, + refresh_time: float = 40, + busy_pin: Optional[microcontroller.Pin] = None, + busy_state: bool = True, + seconds_per_frame: float = 180, + always_toggle_chip_select: bool = False, + grayscale: bool = False, + ): + # pylint: disable=too-many-locals + """ + Create a EPaperDisplay object on the given display bus (displayio.FourWire or + paralleldisplay.ParallelBus). + + The start_sequence and stop_sequence are bitpacked to minimize the ram impact. Every + command begins with a command byte followed by a byte to determine the parameter + count and if a delay is need after. When the top bit of the second byte is 1, the + next byte will be the delay time in milliseconds. The remaining 7 bits are the + parameter count excluding any delay byte. The third through final bytes are the + remaining command parameters. The next byte will begin a new command definition. + + + :param display_bus: The bus that the display is connected to + :type _DisplayBus: displayio.FourWire or displayio.ParallelBus + :param ~_typing.ReadableBuffer start_sequence: Byte-packed initialization sequence. + :param ~_typing.ReadableBuffer stop_sequence: Byte-packed initialization sequence. + :param int width: Width in pixels + :param int height: Height in pixels + :param int ram_width: RAM width in pixels + :param int ram_height: RAM height in pixels + :param int colstart: The index if the first visible column + :param int rowstart: The index if the first visible row + :param int rotation: The rotation of the display in degrees clockwise. Must be in + 90 degree increments (0, 90, 180, 270) + :param int set_column_window_command: Command used to set the start and end columns + to update + :param int set_row_window_command: Command used so set the start and end rows to update + :param int set_current_column_command: Command used to set the current column location + :param int set_current_row_command: Command used to set the current row location + :param int write_black_ram_command: Command used to write pixels values into the update + region + :param bool black_bits_inverted: True if 0 bits are used to show black pixels. Otherwise, + 1 means to show black. + :param int write_color_ram_command: Command used to write pixels values into the update + region + :param bool color_bits_inverted: True if 0 bits are used to show the color. Otherwise, 1 + means to show color. + :param int highlight_color: RGB888 of source color to highlight with third ePaper color. + :param int refresh_display_command: Command used to start a display refresh + :param float refresh_time: Time it takes to refresh the display before the stop_sequence + should be sent. Ignored when busy_pin is provided. + :param microcontroller.Pin busy_pin: Pin used to signify the display is busy + :param bool busy_state: State of the busy pin when the display is busy + :param float seconds_per_frame: Minimum number of seconds between screen refreshes + :param bool always_toggle_chip_select: When True, chip select is toggled every byte + :param bool grayscale: When true, the color ram is the low bit of 2-bit grayscale + """ + self._bus = display_bus + self._width = width + self._height = height + + def show(self, group: Group) -> None: + # pylint: disable=unnecessary-pass + """Switches to displaying the given group of layers. When group is None, the default + CircuitPython terminal will be shown (eventually). + """ + pass + + def refresh(self) -> None: + # pylint: disable=unnecessary-pass + """Refreshes the display immediately or raises an exception if too soon. Use + ``time.sleep(display.time_to_refresh)`` to sleep until a refresh can occur. + """ + pass + + @property + def time_to_refresh(self) -> float: + """Time, in fractional seconds, until the ePaper display can be refreshed.""" + return 0.0 + + @property + def width(self) -> int: + """Display Width""" + return self._width + + @property + def height(self) -> int: + """Display Height""" + return self._height + + @property + def bus(self) -> _DisplayBus: + """Current Display Bus""" + return self._bus