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 controller – ST7701 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)¶
framesizeJedna ze standardowych obsługiwanych rozdzielczości (np.display.FWVGA).refreshUstawia częstotliwość odświeżania ekranu w hercach. Prawidłowy zakres to od 30 do 120. Steruje to zegarem LCD DSI.display_onWłącza wyświetlacz.triple_bufferAlokuje trzy bufory ramki, aby umożliwić aktualizacje wyświetlacza bez efektu rozrywania (tearing). Wymagane do odwracania w pionie wwrite().portraitZamienia szerokość i wysokość framesize.channelWirtualny kanał MIPI DSI używany do komunikacji z wyświetlaczem.controllerPrzekaż 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.backlightOkreś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.
- 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 lokalizacjix,y.imagemoże być ciągiem ze ścieżką zamiast obiektem obrazu, aby automatycznie wczytać obraz z dysku. Np.write("test.jpg").x_scalekontroluje, o ile wyświetlany obraz jest skalowany w kierunku x (float). Jeśli ta wartość jest ujemna, obraz zostanie odbity poziomo. Jeśliy_scalenie jest określone, dopasuje się ono dox_scale, aby zachować proporcje.y_scalekontroluje, o ile wyświetlany obraz jest skalowany w kierunku y (float). Jeśli ta wartość jest ujemna, obraz zostanie odbity pionowo. Odwracanie w pionie wymagatriple_buffer=True. Jeślix_scalenie jest określone, dopasuje się ono doy_scale.roito krotka prostokąta obszaru zainteresowania (x, y, w, h) obrazu do wyświetlenia.rgb_channelto kanał RGB (0=R, 1=G, 2=B) do wyodrębnienia z obrazu RGB565 i wyrenderowania na wyświetlaczu w skali szarości.-1wyłącza wyodrębnianie. Prawidłowy zakres to od -1 do 2.alphakontroluje, 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_palettemoż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ębnieniurgb_channel.alpha_palettemoże być 256-pikselowym obrazem w skali szarości używanym jako tablica przeglądowa alfa, która modulujealphadla każdej wartości skali szarości piksela wejściowego. Stosowane po wyodrębnieniurgb_channel.hintto logiczna suma (OR) flag:image.AREA: Użyj skalowania obszarowego podczas zmniejszania zamiast domyślnego najbliższego sąsiada.image.BILINEAR: Użyj skalowania dwuliniowego zamiast domyślnego skalowania metodą najbliższego sąsiada.image.BICUBIC: Użyj skalowania dwusześciennego zamiast domyślnego skalowania metodą najbliższego sąsiada.image.CENTER: Wyśrodkuj rysowany obraz na wyświetlaczu. Stosowane po skalowaniu.image.HMIRROR: Odbij obraz poziomo.image.VFLIP: Odwróć obraz pionowo.image.TRANSPOSE: Transponuj obraz (zamień x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Wykonaj wyodrębnienie rgb_channel przed skalowaniem.image.APPLY_COLOR_PALETTE_FIRST: Zastosuj paletę kolorów przed skalowaniem.image.SCALE_ASPECT_KEEP: Skaluj rysowany obraz, aby zmieścił się w obrębie wyświetlacza.image.SCALE_ASPECT_EXPAND: Skaluj rysowany obraz, aby wypełnił wyświetlacz (skutkuje przycięciem).image.SCALE_ASPECT_IGNORE: Skaluj rysowany obraz, aby wypełnił wyświetlacz (skutkuje rozciągnięciem).image.ROTATE_90: Obróć obraz o 90 stopni (to po prostu VFLIP | TRANSPOSE).image.ROTATE_180: Obróć obraz o 180 stopni (to po prostu HMIRROR | VFLIP).image.ROTATE_270: Obróć obraz o 270 stopni (to po prostu HMIRROR | TRANSPOSE).
- clear(display_off: bool = False) None¶
Czyści bufor ramki LCD do koloru czarnego.
display_offjeś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
DACBacklightlubPWMBacklight, 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
cmddo wyświetlacza.argsto opcjonalna liczba całkowita lub bufor zawierający parametry polecenia.dcsjeś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
lenbajtów z wyświetlacza za pomocą polecenia DSIcmd.argsto opcjonalna liczba całkowita lub bufor zawierający parametry polecenia.dcsjeśli True, wysyła polecenie jako pakiet DCS (Display Command Set).