class DSIDisplay -- Trình điều khiển màn hình DSI

Lớp DSIDisplay điều khiển các tấm nền MIPI-DSI thông qua bộ điều khiển DSI host STM32. MIPI DSI là giao thức hiển thị nối tiếp dạng gói sử dụng một làn xung nhịp cùng một hoặc nhiều làn dữ liệu dạng cặp vi sai, cho phép truyền nội dung có độ phân giải cao (lên đến 1080p) qua số dây ít hơn nhiều so với RGB song song 24-bit. Các điểm ảnh được truyền trực tiếp từ bộ đệm khung hình được hỗ trợ bởi SDRAM với tốc độ làm mới đã chọn, do đó CPU không tham gia vào quá trình làm mới.

Độ phân giải tấm nền được chọn thông qua framesize sử dụng các hằng số trong module display (QVGA, VGA, HD, FHD, ...). Trình tự khởi tạo dành riêng cho tấm nền được cắm vào thông qua đối số từ khóa controller -- ST7701 hỗ trợ các tấm nền DSI 480x800 thông dụng dựa trên ST7701. Các lệnh DCS có thể được phát ngoài băng tần qua bus_write() / bus_read(). Độ sáng đèn nền được điều khiển bằng GPIO đơn giản theo mặc định, hoặc bằng DACBacklight / PWMBacklight nếu được truyền vào làm backlight.

Các khung hình được trình bày bằng cách gọi write() với image.Image. Trình điều khiển xử lý chuyển đổi RGB, chia tỷ lệ, ROI, bảng màu và các phép biến đổi hướng nội bộ.

Ví dụ -- phản chiếu camera lên tấm nền DSI 480x800 dựa trên 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)

Hàm khởi tạo

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 Một trong các độ phân giải tiêu chuẩn được hỗ trợ (ví dụ: display.FWVGA).

refresh Đặt tốc độ làm mới màn hình tính bằng hertz. Phạm vi hợp lệ là 30 đến 120. Điều này điều khiển xung nhịp LCD DSI.

display_on Bật màn hình.

triple_buffer Cấp phát ba bộ đệm khung hình để cho phép cập nhật màn hình không bị xé. Bắt buộc khi lật dọc trong write().

portrait Hoán đổi chiều rộng và chiều cao của framesize.

channel Kênh MIPI DSI ảo dùng để giao tiếp với màn hình.

controller Truyền lớp chip bộ điều khiển vào đây để khởi tạo cùng với màn hình. Ví dụ: display.ST7701() là bộ điều khiển màn hình tiêu chuẩn cho màn hình MIPI DSI.

backlight Chỉ định module bộ điều khiển đèn nền cần sử dụng. Theo mặc định, đèn nền sẽ được điều khiển qua chân (pin) GPIO.

deinit() None

Giải phóng các chân (pin) I/O và RAM được sử dụng bởi lớp. Được gọi tự động khi hủy đối tượng.

width() int

Trả về chiều rộng của màn hình.

height() int

Trả về chiều cao của màn hình.

triple_buffer() int

Trả về trạng thái bật/tắt của triple buffering.

bgr() int

Trả về trạng thái màn hình có mong đợi điểm ảnh theo thứ tự BGR hay không.

byte_swap() int

Trả về trạng thái màn hình có mong đợi điểm ảnh được hoán đổi byte hay không.

framesize() int

Trả về hằng số framesize mà màn hình được khởi tạo cùng.

refresh() int

Trả về tốc độ làm mới tính bằng 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

Hiển thị image với góc trên bên trái bắt đầu tại vị trí x, y.

image có thể là chuỗi đường dẫn thay vì đối tượng ảnh để tự động tải ảnh từ đĩa. Ví dụ: write("test.jpg").

x_scale điều khiển mức độ ảnh được hiển thị được phóng to trong hướng x (số thực). Nếu giá trị này âm, ảnh sẽ được lật ngang. Nếu y_scale không được chỉ định thì nó sẽ khớp với x_scale để duy trì tỷ lệ khung hình.

y_scale điều khiển mức độ ảnh được hiển thị được phóng to trong hướng y (số thực). Nếu giá trị này âm, ảnh sẽ được lật dọc. Lật dọc yêu cầu triple_buffer=True. Nếu x_scale không được chỉ định thì nó sẽ khớp với y_scale.

roi là tuple hình chữ nhật vùng quan tâm (ROI) (x, y, w, h) của ảnh cần hiển thị.

rgb_channel là kênh RGB (0=R, 1=G, 2=B) để trích xuất từ ảnh RGB565 và hiển thị trên màn hình ở thang xám. -1 vô hiệu hóa trích xuất. Phạm vi hợp lệ là -1 đến 2.

alpha điều khiển độ đục của ảnh. 255 hiển thị ảnh mờ đục, giá trị thấp hơn trộn về phía màu đen, và 0 tạo ra ảnh hoàn toàn màu đen. Phạm vi hợp lệ là 0 đến 255.

color_palette có thể là enum bảng màu hoặc ảnh RGB565 256 điểm ảnh để sử dụng làm bảng tra cứu màu sắc trên giá trị thang xám của ảnh đầu vào. Được áp dụng sau khi trích xuất rgb_channel.

alpha_palette có thể là ảnh thang xám 256 điểm ảnh được sử dụng làm bảng tra cứu alpha điều chỉnh alpha theo giá trị thang xám của từng điểm ảnh đầu vào. Được áp dụng sau khi trích xuất rgb_channel.

hint là phép OR logic của các cờ:

  • image.AREA: Sử dụng chia tỷ lệ theo vùng khi thu nhỏ thay vì mặc định là lân cận gần nhất.

  • image.BILINEAR: Sử dụng chia tỷ lệ song tuyến thay vì mặc định là chia tỷ lệ lân cận gần nhất.

  • image.BICUBIC: Sử dụng chia tỷ lệ song khối thay vì mặc định là chia tỷ lệ lân cận gần nhất.

  • image.CENTER: Căn giữa ảnh đang được vẽ trên màn hình. Điều này được áp dụng sau khi chia tỷ lệ.

  • image.HMIRROR: Lật ảnh theo chiều ngang.

  • image.VFLIP: Lật ảnh theo chiều dọc.

  • image.TRANSPOSE: Chuyển vị ảnh (hoán đổi x/y).

  • image.EXTRACT_RGB_CHANNEL_FIRST: Thực hiện trích xuất rgb_channel trước khi chia tỷ lệ.

  • image.APPLY_COLOR_PALETTE_FIRST: Áp dụng bảng màu trước khi chia tỷ lệ.

  • image.SCALE_ASPECT_KEEP: Chia tỷ lệ ảnh đang được vẽ để vừa bên trong màn hình.

  • image.SCALE_ASPECT_EXPAND: Chia tỷ lệ ảnh đang được vẽ để lấp đầy màn hình (dẫn đến cắt xén).

  • image.SCALE_ASPECT_IGNORE: Chia tỷ lệ ảnh đang được vẽ để lấp đầy màn hình (dẫn đến kéo dãn).

  • image.ROTATE_90: Xoay ảnh 90 độ (đây chỉ là VFLIP | TRANSPOSE).

  • image.ROTATE_180: Xoay ảnh 180 độ (đây chỉ là HMIRROR | VFLIP).

  • image.ROTATE_270: Xoay ảnh 270 độ (đây chỉ là HMIRROR | TRANSPOSE).

clear(display_off: bool = False) None

Xóa bộ đệm khung hình LCD về màu đen.

display_off nếu True tắt logic màn hình thay vì xóa bộ đệm khung hình.

backlight(value: int | None = None) int

Đặt giá trị giảm sáng đèn nền LCD từ 0 (tắt) đến 100 (bật). Không truyền đối số để lấy giá trị đèn nền hiện tại.

Trừ khi bộ điều khiển DACBacklight hoặc PWMBacklight được truyền vào hàm khởi tạo, đèn nền được điều khiển như chân (pin) GPIO và sẽ chỉ chuyển từ 0 (tắt) sang khác không (bật).

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

Gửi lệnh DSI cmd đến màn hình.

args là số nguyên hoặc bộ đệm tùy chọn chứa các tham số lệnh.

dcs nếu True gửi lệnh dưới dạng gói DCS (Display Command Set).

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

Đọc len byte từ màn hình bằng lệnh DSI cmd.

args là số nguyên hoặc bộ đệm tùy chọn chứa các tham số lệnh.

dcs nếu True gửi lệnh dưới dạng gói DCS (Display Command Set).

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

Gửi ioctl cmd dành riêng cho trình điều khiển với arg tùy chọn đến màn hình. Ném ValueError nếu màn hình không hỗ trợ ioctl.