class DSIDisplay – драйвер дисплея DSI¶
Класс DSIDisplay управляет панелями MIPI-DSI через хост-контроллер DSI STM32. MIPI DSI – это пакетный последовательный протокол дисплея, который использует одну тактовую линию плюс одну или несколько линий данных в виде дифференциальных пар, что позволяет передавать контент высокого разрешения (до 1080p) по гораздо меньшему числу проводов, чем 24-битный параллельный RGB. Пиксели передаются напрямую из буфера кадра на основе SDRAM с выбранной частотой обновления, поэтому CPU не участвует в обновлении.
Разрешение панели выбирается через framesize с использованием констант модуля display (QVGA, VGA, HD, FHD, …). Последовательности инициализации, специфичные для панели, подключаются через именованный аргумент controller – ST7701 охватывает распространённые DSI-панели 480x800 на основе ST7701. Команды DCS можно отправлять вне основного потока через bus_write() / bus_read(). Яркость подсветки по умолчанию управляется простым GPIO или, если передан как backlight, через DACBacklight / PWMBacklight.
Кадры выводятся вызовом write() с объектом image.Image. Драйвер внутренне выполняет преобразование RGB, масштабирование, ROI, преобразования палитры и ориентации.
Пример – зеркалирование камеры на DSI-панель 480x800 на основе 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)
Конструкторы¶
- 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)¶
framesizeОдно из стандартных поддерживаемых разрешений (например,display.FWVGA).refreshУстанавливает частоту обновления экрана в герцах. Допустимый диапазон от 30 до 120. Управляет тактовым сигналом DSI LCD.display_onВключает дисплей.triple_bufferВыделяет три буфера кадра для обновления дисплея без разрывов. Требуется для вертикального отражения вwrite().portraitМеняет местами ширину и высоту framesize.channelВиртуальный канал MIPI DSI для связи с дисплеем.controllerПередайте сюда класс микросхемы контроллера, чтобы инициализировать её вместе с дисплеем. Например,display.ST7701()– стандартный контроллер дисплея для дисплеев MIPI DSI.backlightУкажите модуль контроллера подсветки. По умолчанию подсветка управляется через вывод GPIO.- deinit() None¶
Освобождает выводы ввода-вывода и RAM, используемые классом. Вызывается автоматически при уничтожении.
- 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¶
Отображает
image, левый верхний угол которого начинается в позицииx,y.imageможет быть строкой пути вместо объекта изображения для автоматической загрузки изображения с диска. Например,write("test.jpg").x_scaleуправляет масштабированием отображаемого изображения по оси x (float). Если это значение отрицательное, изображение будет отражено по горизонтали. Еслиy_scaleне задан, он будет соответствоватьx_scaleдля сохранения соотношения сторон.y_scaleуправляет масштабированием отображаемого изображения по оси y (float). Если это значение отрицательное, изображение будет отражено по вертикали. Вертикальное отражение требуетtriple_buffer=True. Еслиx_scaleне задан, он будет соответствоватьy_scale.roi– это кортеж прямоугольника области интереса (x, y, w, h) изображения для отображения.rgb_channel– это канал RGB (0=R, 1=G, 2=B), извлекаемый из изображения RGB565 и отображаемый на дисплее в оттенках серого.-1отключает извлечение. Допустимый диапазон от -1 до 2.alphaуправляет непрозрачностью изображения. 255 отображает непрозрачное изображение, меньшие значения смешивают с чёрным, а 0 даёт полностью чёрное изображение. Допустимый диапазон от 0 до 255.color_paletteможет быть перечислением цветовой палитры или изображением RGB565 размером 256 пикселей, используемым как таблица поиска цвета по значению оттенка серого входного изображения. Применяется после извлеченияrgb_channel.alpha_paletteможет быть изображением в оттенках серого размером 256 пикселей, используемым как таблица поиска альфа-канала, которая модулируетalphaдля каждого входного пикселя по значению оттенка серого. Применяется после извлеченияrgb_channel.hint– это логическое ИЛИ следующих флагов:image.AREA: Использовать масштабирование по площади при уменьшении вместо метода ближайшего соседа по умолчанию.image.BILINEAR: Использовать билинейное масштабирование вместо масштабирования методом ближайшего соседа по умолчанию.image.BICUBIC: Использовать бикубическое масштабирование вместо масштабирования методом ближайшего соседа по умолчанию.image.CENTER: Центрировать рисуемое на дисплее изображение. Применяется после масштабирования.image.HMIRROR: Отразить изображение по горизонтали.image.VFLIP: Отразить изображение по вертикали.image.TRANSPOSE: Транспонировать изображение (поменять местами x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Выполнить извлечение rgb_channel до масштабирования.image.APPLY_COLOR_PALETTE_FIRST: Применить цветовую палитру до масштабирования.image.SCALE_ASPECT_KEEP: Масштабировать рисуемое изображение так, чтобы оно поместилось внутри дисплея.image.SCALE_ASPECT_EXPAND: Масштабировать рисуемое изображение так, чтобы оно заполнило дисплей (приводит к обрезке).image.SCALE_ASPECT_IGNORE: Масштабировать рисуемое изображение так, чтобы оно заполнило дисплей (приводит к растяжению).image.ROTATE_90: Повернуть изображение на 90 градусов (это просто VFLIP | TRANSPOSE).image.ROTATE_180: Повернуть изображение на 180 градусов (это просто HMIRROR | VFLIP).image.ROTATE_270: Повернуть изображение на 270 градусов (это просто HMIRROR | TRANSPOSE).
- clear(display_off: bool = False) None¶
Очищает буфер кадра ЖК-дисплея, заполняя его чёрным.
display_offесли True, выключает логику дисплея вместо очистки буфера кадра.
- backlight(value: int | None = None) int¶
Устанавливает значение затемнения подсветки ЖК-дисплея, от 0 (выкл) до 100 (вкл). Вызовите без аргументов, чтобы получить текущее значение подсветки.
Если в конструктор не передан контроллер
DACBacklightилиPWMBacklight, подсветка управляется как вывод GPIO и будет переключаться только между 0 (выкл) и ненулевым значением (вкл).
- bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None¶
Отправляет DSI-команду
cmdна дисплей.args– это необязательное целое число или буфер, содержащий параметры команды.dcsесли True, отправляет команду как пакет DCS (Display Command Set).