classe DSIDisplay – Driver de Display DSI¶
A classe DSIDisplay aciona painéis MIPI-DSI por meio do controlador host DSI do STM32. O MIPI DSI é um protocolo serial de display em pacotes que usa uma lane de clock mais uma ou mais lanes de dados como pares diferenciais, o que permite transportar conteúdo de alta resolução (até 1080p) usando muito menos fios do que o RGB paralelo de 24 bits. Os pixels são transmitidos diretamente de um framebuffer apoiado em SDRAM na taxa de atualização escolhida, de modo que a CPU não é envolvida na atualização.
A resolução do painel é selecionada através de framesize usando as constantes do módulo display (QVGA, VGA, HD, FHD, …). Sequências de inicialização específicas do painel são conectadas via o argumento de palavra-chave controller – ST7701 cobre os painéis DSI 480x800 comuns baseados no ST7701. Comandos DCS podem ser emitidos fora de banda via bus_write() / bus_read(). O brilho da retroiluminação é acionado como um simples GPIO por padrão, ou por DACBacklight / PWMBacklight se passado como backlight.
Os quadros são apresentados chamando write() com uma image.Image. O driver lida internamente com a conversão de RGB, escalonamento, ROI, paleta e transformações de orientação.
Exemplo – espelhar a câmera em um painel DSI 480x800 baseado no 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)
Construtores¶
- 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)¶
framesizeUma das resoluções padrão suportadas (por exemplo,display.FWVGA).refreshDefine a taxa de atualização da tela em hertz. O intervalo válido é de 30 a 120. Isso controla o clock do LCD DSI.display_onHabilita o display.triple_bufferAloca três framebuffers para permitir atualizações do display sem rasgo (tearing). Necessário para a inversão vertical emwrite().portraitTroca a largura e a altura do framesize.channelO canal MIPI DSI virtual a ser usado para se comunicar com o display.controllerPasse aqui a classe do chip controlador para inicializá-lo junto com o display. Por exemplo,display.ST7701(), que é um controlador de display padrão para displays MIPI DSI.backlightEspecifica um módulo controlador de retroiluminação a ser usado. Por padrão, a retroiluminação será controlada por um pino GPIO.- deinit() None¶
Libera os pinos de E/S e a RAM usados pela classe. Isso é chamado automaticamente na destruição.
- 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¶
Exibe uma
imagecujo canto superior esquerdo começa na localizaçãox,y.imagepode ser uma string de caminho em vez de um objeto de imagem para carregar automaticamente a imagem do disco. Por exemplo,write("test.jpg").x_scalecontrola o quanto a imagem exibida é escalonada na direção x (float). Se este valor for negativo, a imagem será invertida horizontalmente. Sey_scalenão for especificado, ele corresponderá ax_scalepara manter a proporção.y_scalecontrola o quanto a imagem exibida é escalonada na direção y (float). Se este valor for negativo, a imagem será invertida verticalmente. A inversão vertical requertriple_buffer=True. Sex_scalenão for especificado, ele corresponderá ay_scale.roié a tupla retangular da região de interesse (x, y, w, h) da imagem a ser exibida.rgb_channelé o canal RGB (0=R, 1=G, 2=B) a ser extraído de uma imagem RGB565 e renderizado no display em escala de cinza.-1desabilita a extração. O intervalo válido é de -1 a 2.alphacontrola o quão opaca a imagem é. 255 exibe uma imagem opaca, valores menores mesclam em direção ao preto e 0 produz uma imagem totalmente preta. O intervalo válido é de 0 a 255.color_palettepode ser um enum de paleta de cores ou uma imagem RGB565 de 256 pixels a ser usada como uma tabela de consulta de cores sobre o valor em escala de cinza da imagem de entrada. Aplicado após a extração dergb_channel.alpha_palettepode ser uma imagem em escala de cinza de 256 pixels usada como uma tabela de consulta alfa que modulaalphapor valor de escala de cinza do pixel de entrada. Aplicado após a extração dergb_channel.hinté um OR lógico das flags:image.AREA: Usa escalonamento por área ao reduzir, em vez do padrão de vizinho mais próximo.image.BILINEAR: Usa escalonamento bilinear, em vez do padrão de escalonamento por vizinho mais próximo.image.BICUBIC: Usa escalonamento bicúbico, em vez do padrão de escalonamento por vizinho mais próximo.image.CENTER: Centraliza a imagem sendo desenhada no display. Isso é aplicado após o escalonamento.image.HMIRROR: Espelha a imagem horizontalmente.image.VFLIP: Inverte a imagem verticalmente.image.TRANSPOSE: Transpõe a imagem (troca x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Faz a extração de rgb_channel antes do escalonamento.image.APPLY_COLOR_PALETTE_FIRST: Aplica a paleta de cores antes do escalonamento.image.SCALE_ASPECT_KEEP: Escala a imagem sendo desenhada para caber dentro do display.image.SCALE_ASPECT_EXPAND: Escala a imagem sendo desenhada para preencher o display (resulta em corte).image.SCALE_ASPECT_IGNORE: Escala a imagem sendo desenhada para preencher o display (resulta em esticamento).image.ROTATE_90: Rotaciona a imagem em 90 graus (isso é apenas VFLIP | TRANSPOSE).image.ROTATE_180: Rotaciona a imagem em 180 graus (isso é apenas HMIRROR | VFLIP).image.ROTATE_270: Rotaciona a imagem em 270 graus (isso é apenas HMIRROR | TRANSPOSE).
- clear(display_off: bool = False) None¶
Limpa o framebuffer do LCD para preto.
display_offse True, desliga a lógica do display em vez de limpar o framebuffer.
- backlight(value: int | None = None) int¶
Define o valor de escurecimento da retroiluminação do LCD, de 0 (desligado) a 100 (ligado). Não passe argumentos para obter o valor atual da retroiluminação.
A menos que um controlador
DACBacklightouPWMBacklightseja passado ao construtor, a retroiluminação é controlada como um pino GPIO e só irá de 0 (desligado) a diferente de zero (ligado).
- bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None¶
Envia o comando DSI
cmdpara o display.argsé um inteiro ou buffer opcional contendo os parâmetros do comando.dcsse True, envia o comando como um pacote DCS (Display Command Set).