class DisplayData – данные дисплея

Класс DisplayData предоставляет доступ к вспомогательным каналам подключённого дисплея HDMI / DisplayPort:

  • DDC (Display Data Channel) – это шина I2C, по которой передаётся EDID дисплея – структурированный блок, описывающий возможности панели (производитель, поддерживаемые разрешения и частоты обновления, форматы цвета и звука, …). Устройства-источники запрашивают его один раз при запуске, чтобы определить, что поддерживает приёмник.

  • CEC (Consumer Electronics Control) – это однопроводная двунаправленная шина, которая позволяет подключённым устройствам HDMI / DisplayPort обмениваться короткими управляющими пакетами – включение/выключение питания, переключение входа, громкость, пересылка команд пульта и т. д.

При создании можно включить любой из каналов или оба сразу. Сырой EDID считывается методом display_id(); кадры CEC можно отправлять методом send_frame(), синхронно опрашивать через receive_frame() или направлять в функцию обратного вызова с помощью frame_callback().

Пример – запрос EDID подключённого дисплея и прослушивание кадров CEC, адресованных логическому адресу 0:

import display

data = display.DisplayData(cec=True, ddc=True)

# Read the EDID once at startup.
edid = data.display_id()
print("EDID:", edid)

def on_frame(src, payload):
    print("CEC from {:#x}: {}".format(src, payload))

data.frame_callback(on_frame, 0)

Конструкторы

class display.DisplayData(*, cec: bool = False, ddc: bool = False, ddc_addr: int = 0x50)

cec установите в True, чтобы включить связь по CEC с внешним дисплеем.

ddc установите в True, чтобы включить связь по DDC с внешним дисплеем.

ddc_addr адрес I2C EEPROM внешнего дисплея.

display_id() bytes

Возвращает данные EDID внешнего дисплея в виде объекта bytes. Заголовки и контрольные суммы EDID проверяются, и все секции объединяются в один объект bytes. При ошибке вызывает OSError.

send_frame(dst_addr: int, src_addr: int, data: bytes) None

Отправляет кадр CEC по адресу dst_addr от src_addr с содержимым data. При ошибке вызывает OSError.

receive_frame(dst_addr: int, *, timeout: int = 1000) tuple[int, bytes]

Ожидает до timeout миллисекунд кадр CEC, адресованный dst_addr. Возвращает кортеж (src_addr, data). При истечении времени ожидания или ошибке вызывает OSError.

frame_callback(callback: Callable[[int, bytes], None] | None, dst_addr: int) None

Регистрирует callback, который будет вызван при получении кадра CEC, адресованного dst_addr. Функция обратного вызова вызывается с двумя аргументами: исходным адресом как int и полезной нагрузкой кадра как объектом bytes.

Передайте None в качестве callback, чтобы отключить приём. Пока зарегистрирована функция обратного вызова, не вызывайте DisplayData.receive_frame().