class DSIDisplay – Controlador de Ecrã DSI¶
A classe DSIDisplay controla painéis MIPI-DSI através do controlador de host DSI do STM32. O MIPI DSI é um protocolo de ecrã série com pacotes que utiliza uma pista de relógio mais uma ou mais pistas de dados como pares diferenciais, permitindo transportar conteúdo de alta resolução (até 1080p) com muito menos fios do que o RGB paralelo de 24 bits. Os pixels fluem diretamente de um buffer de fotograma suportado por SDRAM à taxa de atualização escolhida, pelo que a CPU não está envolvida na atualização.
A resolução do painel é selecionada através de framesize utilizando as constantes do módulo display (QVGA, VGA, HD, FHD, …). As sequências de inicialização específicas do painel são fornecidas através do argumento de palavra-chave controller – ST7701 cobre os painéis DSI baseados em ST7701 de 480x800 mais comuns. Os comandos DCS podem ser emitidos fora de banda através de bus_write() / bus_read(). O brilho da retroiluminação é controlado por GPIO por defeito, ou por DACBacklight / PWMBacklight se passados como backlight.
Os fotogramas são apresentados chamando write() com uma image.Image. O controlador trata internamente da conversão RGB, redimensionamento, ROI, paleta e transformações de orientação.
Exemplo – espelhar a câmara num painel DSI de 480x800 baseado em 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 do ecrã em hertz. O intervalo válido é de 30 a 120. Controla o relógio LCD DSI.display_onAtiva o ecrã.triple_bufferAloca três buffers de fotograma para permitir atualizações do ecrã sem rasgo. Necessário para a inversão vertical emwrite().portraitTroca a largura e a altura do framesize.channelO canal virtual MIPI DSI a utilizar para comunicar com o ecrã.controllerPasse aqui a classe do chip controlador para o inicializar juntamente com o ecrã. Por exemplo,display.ST7701(), que é um controlador de ecrã padrão para ecrãs MIPI DSI.backlightEspecifique um módulo controlador de retroiluminação a utilizar. Por defeito, a retroiluminação é controlada através de um pino GPIO.- deinit() None¶
Liberta os pinos de E/S e a RAM utilizados pela classe. É 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¶
Apresenta uma
imagecujo canto superior esquerdo começa na localizaçãox,y.imagepode ser uma cadeia de caracteres com o caminho em vez de um objeto de imagem para carregar automaticamente a imagem do disco. Por exemplo,write("test.jpg").x_scalecontrola o fator de escala da imagem apresentada na direção x (float). Se este valor for negativo, a imagem será espelhada horizontalmente. Sey_scalenão for especificado, corresponderá ax_scalepara manter a proporção.y_scalecontrola o fator de escala da imagem apresentada 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, corresponderá ay_scale.roié o tuplo retângulo de região de interesse (x, y, w, h) da imagem a apresentar.rgb_channelé o canal RGB (0=R, 1=G, 2=B) a extrair de uma imagem RGB565 e renderizar no ecrã em escala de cinzentos.-1desativa a extração. O intervalo válido é de -1 a 2.alphacontrola a opacidade da imagem. 255 apresenta uma imagem opaca, valores inferiores misturam em direção ao preto, e 0 produz uma imagem completamente preta. O intervalo válido é de 0 a 255.color_palettepode ser uma enumeração de paleta de cores ou uma imagem RGB565 de 256 pixels a utilizar como tabela de pesquisa de cores sobre o valor em escala de cinzentos da imagem de entrada. Aplicado após a extração dergb_channel.alpha_palettepode ser uma imagem em escala de cinzentos de 256 pixels utilizada como tabela de pesquisa de alfa que modulaalphapor pixel de entrada em escala de cinzentos. Aplicado após a extração dergb_channel.hinté um OR lógico dos seguintes sinalizadores:image.AREA: Utilizar escalonamento por área ao reduzir a escala em vez do vizinho mais próximo por defeito.image.BILINEAR: Utilizar escalonamento bilinear em vez do escalonamento por vizinho mais próximo por defeito.image.BICUBIC: Utilizar escalonamento bicúbico em vez do escalonamento por vizinho mais próximo por defeito.image.CENTER: Centrar a imagem a ser desenhada no ecrã. Isto é aplicado após o escalonamento.image.HMIRROR: Espelhar a imagem horizontalmente.image.VFLIP: Inverter a imagem verticalmente.image.TRANSPOSE: Transpor a imagem (trocar x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Extrair o canal rgb antes do escalonamento.image.APPLY_COLOR_PALETTE_FIRST: Aplicar a paleta de cores antes do escalonamento.image.SCALE_ASPECT_KEEP: Escalar a imagem a ser desenhada para caber dentro do ecrã.image.SCALE_ASPECT_EXPAND: Escalar a imagem a ser desenhada para preencher o ecrã (resulta em recorte).image.SCALE_ASPECT_IGNORE: Escalar a imagem a ser desenhada para preencher o ecrã (resulta em estiramento).image.ROTATE_90: Rodar a imagem 90 graus (equivale a VFLIP | TRANSPOSE).image.ROTATE_180: Rodar a imagem 180 graus (equivale a HMIRROR | VFLIP).image.ROTATE_270: Rodar a imagem 270 graus (equivale a HMIRROR | TRANSPOSE).
- clear(display_off: bool = False) None¶
Limpa o buffer de fotograma do LCD para preto.
display_offse True desliga a lógica do ecrã em vez de limpar o buffer de fotograma.
- backlight(value: int | None = None) int¶
Define o valor de diminuição da retroiluminação do LCD, de 0 (desligado) a 100 (ligado). Passe sem argumentos para obter o valor atual da retroiluminação.
A não ser que seja passado um controlador
DACBacklightouPWMBacklightao construtor, a retroiluminação é controlada como um pino GPIO e apenas irá de 0 (desligado) para não zero (ligado).
- bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None¶
Envia o comando DSI
cmdao ecrã.argsé um inteiro opcional ou buffer contendo os parâmetros do comando.dcsse True envia o comando como um pacote DCS (Display Command Set).