class DSIDisplay – Driver del Display DSI¶
La classe DSIDisplay pilota i pannelli MIPI-DSI tramite il controller host DSI dell’STM32. MIPI DSI e un protocollo seriale a pacchetti per display che utilizza una corsia di clock piu una o piu corsie dati come coppie differenziali, il che gli consente di trasportare contenuti ad alta risoluzione (fino a 1080p) su un numero di fili molto inferiore rispetto all’RGB parallelo a 24 bit. I pixel vengono trasmessi direttamente da un framebuffer su SDRAM alla frequenza di aggiornamento scelta, quindi la CPU non e coinvolta nell’aggiornamento.
La risoluzione del pannello viene selezionata tramite framesize utilizzando le costanti del modulo display (QVGA, VGA, HD, FHD, …). Le sequenze di inizializzazione specifiche del pannello vengono inserite tramite l’argomento keyword controller – ST7701 copre i comuni pannelli DSI 480x800 basati su ST7701. I comandi DCS possono essere emessi fuori banda tramite bus_write() / bus_read(). La luminosita della retroilluminazione viene pilotata come un semplice GPIO per impostazione predefinita, oppure tramite DACBacklight / PWMBacklight se passato come backlight.
I frame vengono presentati chiamando write() con un image.Image. Il driver gestisce internamente la conversione RGB, lo scaling, la ROI, la palette e le trasformazioni di orientamento.
Esempio – riproduce la camera su un pannello DSI 480x800 basato su 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)
Costruttori¶
- 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)¶
framesizeUna delle risoluzioni standard supportate (ad es.display.FWVGA).refreshImposta la frequenza di aggiornamento dello schermo in hertz. L’intervallo valido va da 30 a 120. Questo controlla il clock dell’LCD DSI.display_onAbilita il display.triple_bufferAlloca tre framebuffer per consentire aggiornamenti del display senza tearing. Necessario per il ribaltamento verticale inwrite().portraitScambia la larghezza e l’altezza del framesize.channelIl canale MIPI DSI virtuale da utilizzare per comunicare con il display.controllerPassa qui la classe del chip controller per inizializzarlo insieme al display. Ad es.display.ST7701()che e un controller di display standard per i display MIPI DSI.backlightSpecifica un modulo controller di retroilluminazione da utilizzare. Per impostazione predefinita la retroilluminazione sara controllata tramite un pin GPIO.- deinit() None¶
Rilascia i pin di I/O e la RAM utilizzati dalla classe. Questo viene chiamato automaticamente alla distruzione.
- 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¶
Visualizza un”
imageil cui angolo superiore sinistro inizia nella posizionex,y.imagepuo essere una stringa di percorso invece di un oggetto immagine per caricare automaticamente l’immagine dal disco. Ad es.write("test.jpg").x_scalecontrolla di quanto l’immagine visualizzata viene scalata in direzione x (float). Se questo valore e negativo l’immagine sara ribaltata orizzontalmente. Sey_scalenon e specificato corrispondera ax_scaleper mantenere il rapporto d’aspetto.y_scalecontrolla di quanto l’immagine visualizzata viene scalata in direzione y (float). Se questo valore e negativo l’immagine sara ribaltata verticalmente. Il ribaltamento verticale richiedetriple_buffer=True. Sex_scalenon e specificato corrispondera ay_scale.roie la tupla del rettangolo della regione di interesse (x, y, w, h) dell’immagine da visualizzare.rgb_channele il canale RGB (0=R, 1=G, 2=B) da estrarre da un’immagine RGB565 e da rendere sul display in scala di grigi.-1disabilita l’estrazione. L’intervallo valido va da -1 a 2.alphacontrolla quanto e opaca l’immagine. 255 visualizza un’immagine opaca, valori inferiori la sfumano verso il nero, e 0 produce un’immagine completamente nera. L’intervallo valido va da 0 a 255.color_palettepuo essere un enum di palette di colori o un’immagine RGB565 di 256 pixel da utilizzare come tabella di lookup dei colori sul valore in scala di grigi dell’immagine di input. Applicata dopo l’estrazione dirgb_channel.alpha_palettepuo essere un’immagine in scala di grigi di 256 pixel utilizzata come tabella di lookup alpha che modulaalphaper ogni valore in scala di grigi del pixel di input. Applicata dopo l’estrazione dirgb_channel.hinte un OR logico dei flag:image.AREA: Usa lo scaling per area durante la riduzione invece del nearest neighbor predefinito.image.BILINEAR: Usa lo scaling bilineare invece dello scaling nearest neighbor predefinito.image.BICUBIC: Usa lo scaling bicubico invece dello scaling nearest neighbor predefinito.image.CENTER: Centra l’immagine disegnata sul display. Questo viene applicato dopo lo scaling.image.HMIRROR: Riflette orizzontalmente l’immagine.image.VFLIP: Ribalta verticalmente l’immagine.image.TRANSPOSE: Traspone l’immagine (scambia x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Esegue l’estrazione di rgb_channel prima dello scaling.image.APPLY_COLOR_PALETTE_FIRST: Applica la palette di colori prima dello scaling.image.SCALE_ASPECT_KEEP: Scala l’immagine disegnata per farla rientrare nel display.image.SCALE_ASPECT_EXPAND: Scala l’immagine disegnata per riempire il display (con conseguente ritaglio).image.SCALE_ASPECT_IGNORE: Scala l’immagine disegnata per riempire il display (con conseguente stiramento).image.ROTATE_90: Ruota l’immagine di 90 gradi (e semplicemente VFLIP | TRANSPOSE).image.ROTATE_180: Ruota l’immagine di 180 gradi (e semplicemente HMIRROR | VFLIP).image.ROTATE_270: Ruota l’immagine di 270 gradi (e semplicemente HMIRROR | TRANSPOSE).
- clear(display_off: bool = False) None¶
Azzera il framebuffer dell’LCD portandolo al nero.
display_offse True spegne la logica del display invece di azzerare il framebuffer.
- backlight(value: int | None = None) int¶
Imposta il valore di attenuazione della retroilluminazione dell’LCD, da 0 (spento) a 100 (acceso). Non passare argomenti per ottenere il valore corrente della retroilluminazione.
A meno che un controller
DACBacklightoPWMBacklightnon venga passato al costruttore, la retroilluminazione viene controllata come un pin GPIO e potra solo passare da 0 (spento) a un valore diverso da zero (acceso).
- bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None¶
Invia il comando DSI
cmdal display.argse un intero opzionale o un buffer contenente i parametri del comando.dcsse True invia il comando come pacchetto DCS (Display Command Set).