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 controller – ST7701 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)¶
framesizeJedno ze standardně podporovaných rozlišení (např.display.FWVGA).refreshNastaví obnovovací frekvenci obrazovky v hertzích. Platný rozsah je 30 až 120. Toto řídí DSI LCD hodinový signál.display_onPovolí displej.triple_bufferAlokuje tři snímkové buffery, aby umožnil aktualizace displeje bez trhání. Vyžadováno pro vertikální překlopení vewrite().portraitProhodí šířku a výšku framesize.channelVirtuální MIPI DSI kanál, který se má použít pro komunikaci s displejem.controllerSem 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.backlightUrč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.- 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 pozicix,y.imagemůž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ánoy_scale, bude odpovídatx_scalepro 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žadujetriple_buffer=True. Pokud není zadánox_scale, bude odpovídaty_scale.roije n-tice obdélníku oblasti zájmu (x, y, w, h) obrazu, který se má zobrazit.rgb_channelje RGB kanál (0=R, 1=G, 2=B), který se má extrahovat z RGB565 obrazu a vykreslit na displeji ve stupních šedi.-1extrakci 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_palettemůž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 extrakcirgb_channel.alpha_palettemůže být 256pixelový obraz ve stupních šedi použitý jako vyhledávací tabulka alfa, která modulujealphapro každý vstupní pixel podle jeho hodnoty stupně šedi. Aplikuje se po extrakcirgb_channel.hintje logický součet OR příznaků:image.AREA: Při zmenšování použít plošné škálování namísto výchozího nejbližšího souseda.image.BILINEAR: Použít bilineární škálování namísto výchozího škálování nejbližším sousedem.image.BICUBIC: Použít bikubické škálování namísto výchozího škálování nejbližším sousedem.image.CENTER: Vycentrovat kreslený obraz na displeji. Toto se aplikuje po škálování.image.HMIRROR: Horizontálně zrcadlit obraz.image.VFLIP: Vertikálně překlopit obraz.image.TRANSPOSE: Transponovat obraz (prohodit x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Provést extrakci rgb_channel před škálováním.image.APPLY_COLOR_PALETTE_FIRST: Aplikovat barevnou paletu před škálováním.image.SCALE_ASPECT_KEEP: Škálovat kreslený obraz tak, aby se vešel do displeje.image.SCALE_ASPECT_EXPAND: Škálovat kreslený obraz tak, aby vyplnil displej (vede k oříznutí).image.SCALE_ASPECT_IGNORE: Škálovat kreslený obraz tak, aby vyplnil displej (vede k roztažení).image.ROTATE_90: Otočit obraz o 90 stupňů (toto je pouze VFLIP | TRANSPOSE).image.ROTATE_180: Otočit obraz o 180 stupňů (toto je pouze HMIRROR | VFLIP).image.ROTATE_270: Otočit obraz o 270 stupňů (toto je pouze HMIRROR | TRANSPOSE).
- clear(display_off: bool = False) None¶
Vymaže snímkový buffer LCD do černé.
display_offpokud 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č
DACBacklightneboPWMBacklight, 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
cmdna displej.argsje volitelné celé číslo nebo buffer obsahující parametry příkazu.dcspokud je True, odešle příkaz jako DCS (Display Command Set) paket.