class DSIDisplay – Ovladač DSI displeje

Třída DSIDisplay ovládá panely MIPI-DSI prostřednictvím hostitelského řadiče DSI ve STM32. MIPI DSI je paketizovaný sériový protokol displeje, který používá jednu hodinovou linku plus jednu nebo více datových linek jako diferenciální páry, což mu umožňuje přenášet obsah ve vysokém rozlišení (až 1080p) po výrazně menším počtu vodičů než 24bitové paralelní RGB. Pixely jsou streamovány přímo ze snímkového bufferu (frame buffer) podloženého pamětí SDRAM se zvolenou obnovovací frekvencí, takže CPU se obnovování neúčastní.

Rozlišení panelu se vybírá pomocí framesize s použitím konstant v modulu display (QVGA, VGA, HD, FHD, …). Inicializační sekvence specifické pro panel se zapojují pomocí klíčového argumentu controllerST7701 pokrývá běžné DSI panely 480x800 založené na ST7701. DCS příkazy lze vydávat mimo pásmo pomocí bus_write() / bus_read(). Jas podsvícení je ve výchozím nastavení řízen jako jednoduchý GPIO nebo pomocí DACBacklight / PWMBacklight, pokud je předán jako backlight.

Snímky se zobrazují voláním write() s objektem image.Image. Ovladač interně zpracovává konverzi RGB, škálování, ROI, paletu a transformace orientace.

Příklad – zrcadlení kamery na DSI panel 480x800 založený 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 Jedno ze standardně podporovaných rozlišení (např. display.FWVGA).

refresh Nastaví obnovovací frekvenci obrazovky v hertzích. Platný rozsah je 30 až 120. Toto řídí DSI LCD hodinový signál.

display_on Povolí displej.

triple_buffer Alokuje tři snímkové buffery, aby umožnil aktualizace displeje bez trhání. Vyžadováno pro vertikální překlopení ve write().

portrait Prohodí šířku a výšku framesize.

channel Virtuální MIPI DSI kanál, který se má použít pro komunikaci s displejem.

controller Sem předejte třídu řídicího čipu, aby byl inicializován spolu s displejem. Např. display.ST7701(), což je standardní řadič displeje pro MIPI DSI displeje.

backlight Určete modul ovladače podsvícení, který se má použít. Ve výchozím nastavení bude podsvícení ovládáno prostřednictvím GPIO pinu.

deinit() None

Uvolní I/O piny a RAM používané třídou. Toto je voláno automaticky při destrukci.

width() int

Vrátí šířku obrazovky.

height() int

Vrátí výšku obrazovky.

triple_buffer() int

Vrátí, zda je povoleno trojité bufferování.

bgr() int

Vrátí, zda displej očekává pixely v pořadí BGR.

byte_swap() int

Vrátí, zda displej očekává pixely s prohozenými bajty.

framesize() int

Vrátí konstantu framesize, se kterou byl displej inicializován.

refresh() int

Vrátí obnovovací frekvenci v hertzích.

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

Zobrazí obraz image, jehož levý horní roh začíná na pozici x, y.

image může být místo objektu obrazu řetězec s cestou pro automatické načtení obrazu z disku. Např. write("test.jpg").

x_scale řídí, o kolik je zobrazovaný obraz škálován ve směru x (float). Pokud je tato hodnota záporná, obraz bude překlopen horizontálně. Pokud není zadáno y_scale, bude odpovídat x_scale pro zachování poměru stran.

y_scale řídí, o kolik je zobrazovaný obraz škálován ve směru y (float). Pokud je tato hodnota záporná, obraz bude překlopen vertikálně. Vertikální překlopení vyžaduje triple_buffer=True. Pokud není zadáno x_scale, bude odpovídat y_scale.

roi je n-tice obdélníku oblasti zájmu (x, y, w, h) obrazu, který se má zobrazit.

rgb_channel je RGB kanál (0=R, 1=G, 2=B), který se má extrahovat z RGB565 obrazu a vykreslit na displeji ve stupních šedi. -1 extrakci zakáže. Platný rozsah je -1 až 2.

alpha řídí, jak neprůhledný obraz je. 255 zobrazí neprůhledný obraz, nižší hodnoty se prolínají směrem k černé a 0 vytvoří zcela černý obraz. Platný rozsah je 0 až 255.

color_palette může být enum barevné palety nebo 256pixelový RGB565 obraz použitý jako vyhledávací tabulka barev pro hodnotu stupně šedi vstupního obrazu. Aplikuje se po extrakci rgb_channel.

alpha_palette může být 256pixelový obraz ve stupních šedi použitý jako vyhledávací tabulka alfa, která moduluje alpha pro každý vstupní pixel podle jeho hodnoty stupně šedi. Aplikuje se po extrakci rgb_channel.

hint je logický součet OR příznaků:

clear(display_off: bool = False) None

Vymaže snímkový buffer LCD do černé.

display_off pokud je True, vypne logiku displeje namísto vymazání snímkového bufferu.

backlight(value: int | None = None) int

Nastaví hodnotu stmívání podsvícení LCD, 0 (vypnuto) až 100 (zapnuto). Bez argumentů vrátí aktuální hodnotu podsvícení.

Pokud konstruktoru není předán ovladač DACBacklight nebo PWMBacklight, je podsvícení ovládáno jako GPIO pin a bude nabývat pouze hodnot 0 (vypnuto) až nenulová (zapnuto).

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

Odešle DSI příkaz cmd na displej.

args je volitelné celé číslo nebo buffer obsahující parametry příkazu.

dcs pokud je True, odešle příkaz jako DCS (Display Command Set) paket.

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

Přečte len bajtů z displeje pomocí DSI příkazu cmd.

args je volitelné celé číslo nebo buffer obsahující parametry příkazu.

dcs pokud je True, odešle příkaz jako DCS (Display Command Set) paket.

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

Odešle na displej ioctl cmd specifický pro ovladač s volitelným arg. Vyvolá ValueError, pokud displej ioctl nepodporuje.