คลาส DisplayData -- ข้อมูลดิสเพลย์

คลาส DisplayData ให้การเข้าถึงลิงก์ side-channel ของดิสเพลย์ HDMI / DisplayPort ที่เชื่อมต่อ:

  • DDC (Display Data Channel) คือบัส I2C ที่ส่งข้อมูล EDID ของดิสเพลย์ ซึ่งเป็นบล็อกโครงสร้างที่อธิบายความสามารถของแผง (ผู้ผลิต ความละเอียดและอัตราการรีเฟรชที่รองรับ รูปแบบสีและเสียง ฯลฯ) อุปกรณ์ต้นทางจะอ่านข้อมูลนี้ครั้งเดียวเมื่อเริ่มต้นเพื่อตรวจสอบว่าปลายทางรองรับอะไรบ้าง

  • CEC (Consumer Electronics Control) คือบัสสองทิศทางแบบสายเดียวที่ให้อุปกรณ์ HDMI / DisplayPort ที่เชื่อมต่อแลกเปลี่ยนแพ็คเก็ตควบคุมสั้นๆ ได้ เช่น เปิด/ปิดเครื่อง สลับอินพุต ปรับระดับเสียง ส่งต่อรีโมทคอนโทรล ฯลฯ

สามารถเปิดใช้งานช่องสัญญาณใดช่องหนึ่งหรือทั้งสองช่องได้เมื่อสร้างออบเจกต์ อ่านข้อมูล EDID ดิบด้วย display_id() ส่ง CEC frame ด้วย send_frame() รับแบบ polling synchronous ผ่าน receive_frame() หรือกำหนดเส้นทางไปยังคอลแบ็กด้วย frame_callback()

ตัวอย่าง -- ดึงข้อมูล EDID ของดิสเพลย์ที่เชื่อมต่อและรับฟัง CEC frame ที่ส่งมาถึง logical address 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 headers และ checksums และเชื่อมต่อทุกส่วนเป็น bytes เดียว หากเกิดข้อผิดพลาดจะ raise OSError

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

ส่ง CEC frame ไปยัง dst_addr จาก src_addr ที่มีข้อมูล data หากเกิดข้อผิดพลาดจะ raise OSError

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

รอสูงสุด timeout มิลลิวินาทีเพื่อรับ CEC frame ที่ส่งมาถึง dst_addr คืนค่า tuple (src_addr, data) หากหมดเวลาหรือเกิดข้อผิดพลาดจะ raise OSError

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

ลงทะเบียน callback เพื่อเรียกใช้เมื่อได้รับ CEC frame ที่ส่งมาถึง dst_addr คอลแบ็กจะถูกเรียกด้วยอาร์กิวเมนต์สองตัว คือ source address เป็น int และ payload ของ frame เป็น bytes

ส่ง None เป็น callback เพื่อปิดการรับ ขณะที่มีการลงทะเบียนคอลแบ็กอยู่ อย่าเรียก DisplayData.receive_frame()