คลาส DSIDisplay -- ไดรเวอร์ดิสเพลย์ DSI

คลาส DSIDisplay ขับเคลื่อนแผง MIPI-DSI ผ่านตัวควบคุม DSI host ของ STM32 MIPI DSI เป็นโปรโตคอลดิสเพลย์แบบอนุกรมที่ใช้ lane clock หนึ่งเส้นบวก data lane หนึ่งเส้นขึ้นไปเป็น differential pair ทำให้สามารถส่งเนื้อหาความละเอียดสูง (สูงสุด 1080p) ด้วยสายน้อยกว่า RGB แบบขนาน 24 บิตมาก พิกเซลจะสตรีมโดยตรงจาก framebuffer ที่อยู่บน SDRAM ด้วยอัตราการรีเฟรชที่เลือก โดย CPU ไม่มีส่วนร่วมในการรีเฟรช

ความละเอียดของแผงเลือกผ่าน framesize โดยใช้ค่าคงที่ในโมดูล display (QVGA, VGA, HD, FHD, ...) ลำดับการเริ่มต้นเฉพาะแผงจะเชื่อมต่อผ่านอาร์กิวเมนต์ controller โดย ST7701 ครอบคลุมแผง DSI ที่ใช้ ST7701 ขนาด 480x800 ทั่วไป คำสั่ง DCS สามารถส่งออกนอกแบนด์ผ่าน bus_write() / bus_read() ความสว่างของแบ็คไลท์ขับเคลื่อนด้วย GPIO แบบง่ายโดยค่าเริ่มต้น หรือใช้ DACBacklight / PWMBacklight หากส่งเป็น backlight

เฟรมจะแสดงโดยเรียก write() ด้วย image.Image ไดรเวอร์จัดการการแปลง RGB การปรับขนาด ROI palette และการแปลงทิศทางภายใน

ตัวอย่าง -- สะท้อนภาพกล้องไปยังแผง DSI ที่ใช้ ST7701 ขนาด 480x800:

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 ตั้งค่าอัตราการรีเฟรชหน้าจอในหน่วย hertz ช่วงที่ถูกต้องคือ 30 ถึง 120 ค่านี้ควบคุม DSI LCD clock

display_on เปิดใช้งานดิสเพลย์

triple_buffer จัดสรร framebuffer สามตัวเพื่อให้การอัปเดตดิสเพลย์ไม่มี tear จำเป็นสำหรับการพลิกแนวตั้งใน write()

portrait สลับความกว้างและความสูงของ framesize

channel ช่องสัญญาณ MIPI DSI เสมือนที่จะใช้สื่อสารกับดิสเพลย์

controller ส่งคลาสชิปตัวควบคุมที่นี่เพื่อเริ่มต้นพร้อมกับดิสเพลย์ เช่น display.ST7701() ซึ่งเป็นตัวควบคุมดิสเพลย์มาตรฐานสำหรับ MIPI DSI

backlight ระบุโมดูลตัวควบคุมแบ็คไลท์ที่จะใช้ โดยค่าเริ่มต้นแบ็คไลท์จะควบคุมผ่านพิน GPIO

deinit() None

คืนค่าพิน I/O และ RAM ที่ใช้โดยคลาส เรียกโดยอัตโนมัติเมื่อทำลายออบเจกต์

width() int

คืนค่าความกว้างของหน้าจอ

height() int

คืนค่าความสูงของหน้าจอ

triple_buffer() int

คืนค่าว่าเปิดใช้งาน triple buffering หรือไม่

bgr() int

คืนค่าว่าดิสเพลย์ต้องการพิกเซลในรูปแบบ BGR หรือไม่

byte_swap() int

คืนค่าว่าดิสเพลย์ต้องการพิกเซลที่สลับไบต์หรือไม่

framesize() int

คืนค่าค่าคงที่ framesize ที่ใช้เริ่มต้นดิสเพลย์

refresh() int

คืนค่าอัตราการรีเฟรชในหน่วย hertz

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 อาจเป็น path string แทนออบเจกต์ภาพเพื่อโหลดภาพจากดิสก์โดยอัตโนมัติ เช่น write("test.jpg")

x_scale ควบคุมการปรับขนาดภาพในทิศทาง x (float) หากค่านี้เป็นลบภาพจะพลิกในแนวนอน หากไม่ระบุ y_scale จะใช้ค่าเดียวกับ x_scale เพื่อรักษาอัตราส่วน

y_scale ควบคุมการปรับขนาดภาพในทิศทาง y (float) หากค่านี้เป็นลบภาพจะพลิกในแนวตั้ง การพลิกแนวตั้งต้องใช้ triple_buffer=True หากไม่ระบุ x_scale จะใช้ค่าเดียวกับ y_scale

roi คือ tuple สี่เหลี่ยมบริเวณที่สนใจ (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 อาจเป็น enum ของ color palette หรือภาพ RGB565 ขนาด 256 พิกเซลที่ใช้เป็นตาราง color lookup จากค่า grayscale ของภาพอินพุต ใช้หลังจากดึง rgb_channel

alpha_palette อาจเป็นภาพ grayscale ขนาด 256 พิกเซลที่ใช้เป็นตาราง alpha lookup ที่ปรับ alpha ตามค่า grayscale ของพิกเซลอินพุต ใช้หลังจากดึง rgb_channel

hint คือการ OR ตรรกะของแฟล็กต่อไปนี้:

  • image.AREA: ใช้การปรับขนาดแบบพื้นที่เมื่อลดขนาด แทนค่าเริ่มต้นแบบ nearest neighbor

  • image.BILINEAR: ใช้การปรับขนาดแบบ bilinear แทนค่าเริ่มต้นแบบ nearest neighbor

  • image.BICUBIC: ใช้การปรับขนาดแบบ bicubic แทนค่าเริ่มต้นแบบ nearest neighbor

  • image.CENTER: จัดกึ่งกลางภาพที่วาดบนดิสเพลย์ ใช้หลังจากการปรับขนาด

  • image.HMIRROR: พลิกภาพในแนวนอน

  • image.VFLIP: พลิกภาพในแนวตั้ง

  • image.TRANSPOSE: สลับแกน x/y ของภาพ

  • image.EXTRACT_RGB_CHANNEL_FIRST: ดึง rgb_channel ก่อนการปรับขนาด

  • image.APPLY_COLOR_PALETTE_FIRST: ใช้ color palette ก่อนการปรับขนาด

  • 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

ล้าง LCD framebuffer เป็นสีดำ

display_off หาก True จะปิดตรรกะดิสเพลย์แทนการล้าง framebuffer

backlight(value: int | None = None) int

ตั้งค่าความสว่างของแบ็คไลท์ LCD จาก 0 (ปิด) ถึง 100 (เปิด) ส่งอาร์กิวเมนต์เปล่าเพื่อรับค่าแบ็คไลท์ปัจจุบัน

หากไม่ได้ส่งตัวควบคุม DACBacklight หรือ PWMBacklight ให้กับคอนสตรักเตอร์ แบ็คไลท์จะถูกควบคุมเป็นพิน GPIO และจะเปลี่ยนได้แค่จาก 0 (ปิด) เป็นไม่ใช่ศูนย์ (เปิด) เท่านั้น

bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None

ส่งคำสั่ง DSI cmd ไปยังดิสเพลย์

args คือ integer หรือ buffer ที่เป็นตัวเลือก สำหรับพารามิเตอร์คำสั่ง

dcs หาก True จะส่งคำสั่งเป็นแพ็คเก็ต DCS (Display Command Set)

bus_read(cmd: int, len: int, args: int | bytes | None = None, *, dcs: bool = False) bytes

อ่าน len ไบต์จากดิสเพลย์โดยใช้คำสั่ง DSI cmd

args คือ integer หรือ buffer ที่เป็นตัวเลือก สำหรับพารามิเตอร์คำสั่ง

dcs หาก True จะส่งคำสั่งเป็นแพ็คเก็ต DCS (Display Command Set)

ioctl(cmd: int, arg: Any | None = None) Any

ส่ง ioctl cmd เฉพาะไดรเวอร์พร้อม arg ที่เป็นตัวเลือกไปยังดิสเพลย์ raise ValueError หากดิสเพลย์ไม่รองรับ ioctl