klasa DSIDisplay – sterownik wyświetlacza DSI

Klasa DSIDisplay steruje panelami MIPI-DSI poprzez kontroler hosta DSI STM32. MIPI DSI to spakietowany szeregowy protokół wyświetlania, który wykorzystuje jedną linię zegara plus jedną lub więcej linii danych jako pary różnicowe, co pozwala mu przenosić treści o wysokiej rozdzielczości (do 1080p) przy znacznie mniejszej liczbie przewodów niż 24-bitowy równoległy RGB. Piksele są strumieniowane bezpośrednio z bufora ramki opartego na SDRAM z wybraną częstotliwością odświeżania, więc CPU nie bierze udziału w odświeżaniu.

Rozdzielczość panelu wybiera się poprzez framesize przy użyciu stałych z modułu display (QVGA, VGA, HD, FHD, …). Sekwencje inicjalizacji specyficzne dla panelu są podłączane za pomocą argumentu słowa kluczowego controllerST7701 obsługuje typowe panele DSI 480x800 oparte na ST7701. Polecenia DCS można wydawać poza pasmem za pomocą bus_write() / bus_read(). Jasność podświetlenia jest domyślnie sterowana jako zwykłe GPIO lub przez DACBacklight / PWMBacklight, jeśli przekazano jako backlight.

Ramki są wyświetlane poprzez wywołanie write() z obiektem image.Image. Sterownik wewnętrznie obsługuje konwersję RGB, skalowanie, ROI, paletę oraz transformacje orientacji.

Przykład – odzwierciedlenie obrazu z kamery na panelu DSI 480x800 opartym na ST7701:

import csi
import display
import image

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)

lcd = display.DSIDisplay(framesize=display.TFWVGA,
                         controller=display.ST7701())

while True:
    lcd.write(csi0.snapshot(), hint=image.SCALE_ASPECT_KEEP)

Konstruktory

class display.DSIDisplay(framesize: int = FWVGA, *, refresh: int = 60, display_on: bool = True, triple_buffer: bool = True, portrait: bool = False, channel: int = 0, controller: Any | None = None, backlight: Any | None = None)

framesize Jedna ze standardowych obsługiwanych rozdzielczości (np. display.FWVGA).

refresh Ustawia częstotliwość odświeżania ekranu w hercach. Prawidłowy zakres to od 30 do 120. Steruje to zegarem LCD DSI.

display_on Włącza wyświetlacz.

triple_buffer Alokuje trzy bufory ramki, aby umożliwić aktualizacje wyświetlacza bez efektu rozrywania (tearing). Wymagane do odwracania w pionie w write().

portrait Zamienia szerokość i wysokość framesize.

channel Wirtualny kanał MIPI DSI używany do komunikacji z wyświetlaczem.

controller Przekaż tutaj klasę układu kontrolera, aby zainicjalizować go wraz z wyświetlaczem. Np. display.ST7701(), który jest standardowym kontrolerem dla wyświetlaczy MIPI DSI.

backlight Określ moduł kontrolera podświetlenia do użycia. Domyślnie podświetlenie będzie sterowane za pomocą pinu GPIO.

deinit() None

Zwalnia piny I/O oraz pamięć RAM używaną przez klasę. Jest to wywoływane automatycznie podczas niszczenia obiektu.

width() int

Zwraca szerokość ekranu.

height() int

Zwraca wysokość ekranu.

triple_buffer() int

Zwraca informację, czy włączone jest potrójne buforowanie.

bgr() int

Zwraca informację, czy wyświetlacz oczekuje pikseli w kolejności BGR.

byte_swap() int

Zwraca informację, czy wyświetlacz oczekuje pikseli z zamienionymi bajtami.

framesize() int

Zwraca stałą framesize, z którą wyświetlacz został zainicjalizowany.

refresh() int

Zwraca częstotliwość odświeżania w hercach.

write(image: image.Image, x: int = 0, y: int = 0, x_scale: float = 1.0, y_scale: float = 1.0, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 255, color_palette: image.Image | None = None, alpha_palette: image.Image | None = None, hint: int = 0) None

Wyświetla image, którego lewy górny róg zaczyna się w lokalizacji x, y.

image może być ciągiem ze ścieżką zamiast obiektem obrazu, aby automatycznie wczytać obraz z dysku. Np. write("test.jpg").

x_scale kontroluje, o ile wyświetlany obraz jest skalowany w kierunku x (float). Jeśli ta wartość jest ujemna, obraz zostanie odbity poziomo. Jeśli y_scale nie jest określone, dopasuje się ono do x_scale, aby zachować proporcje.

y_scale kontroluje, o ile wyświetlany obraz jest skalowany w kierunku y (float). Jeśli ta wartość jest ujemna, obraz zostanie odbity pionowo. Odwracanie w pionie wymaga triple_buffer=True. Jeśli x_scale nie jest określone, dopasuje się ono do y_scale.

roi to krotka prostokąta obszaru zainteresowania (x, y, w, h) obrazu do wyświetlenia.

rgb_channel to kanał RGB (0=R, 1=G, 2=B) do wyodrębnienia z obrazu RGB565 i wyrenderowania na wyświetlaczu w skali szarości. -1 wyłącza wyodrębnianie. Prawidłowy zakres to od -1 do 2.

alpha kontroluje, jak nieprzezroczysty jest obraz. 255 wyświetla nieprzezroczysty obraz, niższe wartości mieszają go w kierunku czerni, a 0 daje całkowicie czarny obraz. Prawidłowy zakres to od 0 do 255.

color_palette może być wyliczeniem palety kolorów lub 256-pikselowym obrazem RGB565 używanym jako tablica przeglądowa kolorów dla wartości skali szarości obrazu wejściowego. Stosowane po wyodrębnieniu rgb_channel.

alpha_palette może być 256-pikselowym obrazem w skali szarości używanym jako tablica przeglądowa alfa, która moduluje alpha dla każdej wartości skali szarości piksela wejściowego. Stosowane po wyodrębnieniu rgb_channel.

hint to logiczna suma (OR) flag:

clear(display_off: bool = False) None

Czyści bufor ramki LCD do koloru czarnego.

display_off jeśli True, wyłącza logikę wyświetlacza zamiast czyszczenia bufora ramki.

backlight(value: int | None = None) int

Ustawia wartość przyciemnienia podświetlenia LCD, od 0 (wyłączone) do 100 (włączone). Nie przekazuj argumentów, aby uzyskać bieżącą wartość podświetlenia.

O ile do konstruktora nie zostanie przekazany kontroler DACBacklight lub PWMBacklight, podświetlenie jest sterowane jako pin GPIO i będzie przyjmować tylko wartości 0 (wyłączone) lub niezerowe (włączone).

bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None

Wysyła polecenie DSI cmd do wyświetlacza.

args to opcjonalna liczba całkowita lub bufor zawierający parametry polecenia.

dcs jeśli True, wysyła polecenie jako pakiet DCS (Display Command Set).

bus_read(cmd: int, len: int, args: int | bytes | None = None, *, dcs: bool = False) bytes

Odczytuje len bajtów z wyświetlacza za pomocą polecenia DSI cmd.

args to opcjonalna liczba całkowita lub bufor zawierający parametry polecenia.

dcs jeśli True, wysyła polecenie jako pakiet DCS (Display Command Set).

ioctl(cmd: int, arg: Any | None = None) Any

Wysyła do wyświetlacza ioctl cmd specyficzny dla sterownika z opcjonalnym arg. Zgłasza ValueError, jeśli wyświetlacz nie obsługuje ioctl.