clase DSIDisplay – Controlador de pantalla DSI¶
La clase DSIDisplay controla paneles MIPI-DSI a través del controlador host DSI del STM32. MIPI DSI es un protocolo de pantalla serie por paquetes que utiliza un carril de reloj más uno o más carriles de datos como pares diferenciales, lo que le permite transportar contenido de alta resolución (hasta 1080p) con muchos menos cables que el RGB paralelo de 24 bits. Los píxeles se transmiten directamente desde un búfer de fotogramas (frame buffer) respaldado por SDRAM a la frecuencia de actualización elegida, por lo que la CPU no interviene en la actualización.
La resolución del panel se selecciona mediante framesize usando las constantes del módulo display (QVGA, VGA, HD, FHD, …). Las secuencias de inicialización específicas de cada panel se conectan a través del argumento por palabra clave controller: ST7701 cubre los paneles DSI de 480x800 basados en ST7701 más comunes. Los comandos DCS pueden emitirse fuera de banda mediante bus_write() / bus_read(). El brillo de la retroiluminación se controla como un simple GPIO de forma predeterminada, o mediante DACBacklight / PWMBacklight si se pasa como backlight.
Los fotogramas se presentan llamando a write() con una image.Image. El controlador gestiona internamente la conversión RGB, el escalado, la ROI, la paleta y las transformaciones de orientación.
Ejemplo – reflejar la cámara en un panel DSI de 480x800 basado en 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)
Constructores¶
- 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 de las resoluciones estándar admitidas (p. ej.display.FWVGA).refreshEstablece la frecuencia de actualización de la pantalla en hercios. El rango válido es de 30 a 120. Controla el reloj del LCD DSI.display_onHabilita la pantalla.triple_bufferAsigna tres búferes de fotogramas para permitir actualizaciones de pantalla sin desgarro (tearing). Necesario para el volteo vertical enwrite().portraitIntercambia el ancho y el alto del framesize.channelEl canal virtual MIPI DSI a utilizar para comunicarse con la pantalla.controllerPase aquí la clase del chip controlador para inicializarlo junto con la pantalla. P. ej.display.ST7701(), que es un controlador de pantalla estándar para pantallas MIPI DSI.backlightEspecifica un módulo controlador de retroiluminación a utilizar. De forma predeterminada, la retroiluminación se controla mediante un pin GPIO.- deinit() None¶
Libera los pines de E/S y la RAM utilizados por la clase. Se llama automáticamente al destruir el objeto.
- 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¶
Muestra una
imagecuya esquina superior izquierda comienza en la ubicaciónx,y.imagepuede ser una cadena de ruta en lugar de un objeto de imagen para cargar automáticamente la imagen desde el disco. P. ej.write("test.jpg").x_scalecontrola cuánto se escala la imagen mostrada en la dirección x (float). Si este valor es negativo, la imagen se voltea horizontalmente. Si no se especificay_scale, coincidirá conx_scalepara mantener la relación de aspecto.y_scalecontrola cuánto se escala la imagen mostrada en la dirección y (float). Si este valor es negativo, la imagen se voltea verticalmente. El volteo vertical requieretriple_buffer=True. Si no se especificax_scale, coincidirá cony_scale.roies la tupla del rectángulo de la región de interés (x, y, w, h) de la imagen a mostrar.rgb_channeles el canal RGB (0=R, 1=G, 2=B) a extraer de una imagen RGB565 y renderizar en la pantalla en escala de grises.-1deshabilita la extracción. El rango válido es de -1 a 2.alphacontrola cómo de opaca es la imagen. 255 muestra una imagen opaca, los valores más bajos la mezclan hacia el negro y 0 produce una imagen completamente negra. El rango válido es de 0 a 255.color_palettepuede ser un enum de paleta de colores o una imagen RGB565 de 256 píxeles para usarla como tabla de búsqueda de color sobre el valor en escala de grises de la imagen de entrada. Se aplica después de la extracción dergb_channel.alpha_palettepuede ser una imagen en escala de grises de 256 píxeles utilizada como tabla de búsqueda de alfa que modulaalphasegún el valor en escala de grises de cada píxel de entrada. Se aplica después de la extracción dergb_channel.hintes un OR lógico de los indicadores:image.AREA: Usar escalado por área al reducir en lugar del valor predeterminado de vecino más cercano.image.BILINEAR: Usar escalado bilineal en lugar del escalado predeterminado por vecino más cercano.image.BICUBIC: Usar escalado bicúbico en lugar del escalado predeterminado por vecino más cercano.image.CENTER: Centrar la imagen que se dibuja en la pantalla. Se aplica después del escalado.image.HMIRROR: Reflejar horizontalmente la imagen.image.VFLIP: Voltear verticalmente la imagen.image.TRANSPOSE: Transponer la imagen (intercambiar x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Realizar la extracción de rgb_channel antes del escalado.image.APPLY_COLOR_PALETTE_FIRST: Aplicar la paleta de colores antes del escalado.image.SCALE_ASPECT_KEEP: Escalar la imagen que se dibuja para que quepa dentro de la pantalla.image.SCALE_ASPECT_EXPAND: Escalar la imagen que se dibuja para que llene la pantalla (provoca recorte).image.SCALE_ASPECT_IGNORE: Escalar la imagen que se dibuja para que llene la pantalla (provoca estiramiento).image.ROTATE_90: Rotar la imagen 90 grados (esto es simplemente VFLIP | TRANSPOSE).image.ROTATE_180: Rotar la imagen 180 grados (esto es simplemente HMIRROR | VFLIP).image.ROTATE_270: Rotar la imagen 270 grados (esto es simplemente HMIRROR | TRANSPOSE).
- clear(display_off: bool = False) None¶
Borra el búfer de fotogramas del LCD a negro.
display_offsi es True apaga la lógica de la pantalla en lugar de borrar el búfer de fotogramas.
- backlight(value: int | None = None) int¶
Establece el valor de atenuación de la retroiluminación del LCD, de 0 (apagado) a 100 (encendido). No pase argumentos para obtener el valor actual de la retroiluminación.
A menos que se pase un controlador
DACBacklightoPWMBacklightal constructor, la retroiluminación se controla como un pin GPIO y solo pasará de 0 (apagado) a distinto de cero (encendido).
- bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None¶
Envía el comando DSI
cmda la pantalla.argses un entero o búfer opcional que contiene los parámetros del comando.dcssi es True envía el comando como un paquete DCS (Display Command Set).