class DSIDisplay – מנהל התקן תצוגת DSI

המחלקה DSIDisplay מנהיגה פאנלים מסוג MIPI-DSI דרך בקר מארח ה-DSI של STM32. MIPI DSI הוא פרוטוקול תצוגה טורי מבוסס חבילות שמשתמש בנתיב שעון אחד בתוספת נתיב נתונים אחד או יותר כזוגות דיפרנציאליים, מה שמאפשר לו לשאת תוכן ברזולוציה גבוהה (עד 1080p) על פני הרבה פחות חוטים מאשר RGB מקבילי של 24 סיביות. הפיקסלים זורמים ישירות מחוצץ פריימים (frame buffer) מגובה SDRAM בקצב הרענון הנבחר, כך שהמעבד אינו מעורב ברענון.

רזולוציית הפאנל נבחרת באמצעות framesize תוך שימוש בקבועים שבמודול display (QVGA, VGA, HD, FHD, …). רצפי אתחול ספציפיים לפאנל מחוברים באמצעות ארגומנט המילת מפתח controllerST7701 מכסה את פאנלי ה-DSI הנפוצים בגודל 480x800 מבוססי ST7701. ניתן להנפיק פקודות DCS מחוץ לאפיק באמצעות bus_write() / bus_read(). בהירות תאורת הרקע מונעת כ-GPIO פשוט כברירת מחדל, או באמצעות DACBacklight / PWMBacklight אם הועברו כ-backlight.

פריימים מוצגים על ידי קריאה ל-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. זה שולט בשעון ה-LCD של ה-DSI.

display_on מפעיל את התצוגה.

triple_buffer מקצה שלושה חוצצי פריימים (frame buffers) כדי לאפשר עדכוני תצוגה ללא קריעה (tear-free). נדרש להיפוך אנכי ב-write().

portrait מחליף בין רוחב הפריים לגובהו.

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

מחזיר את קצב הרענון בהרץ.

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 יכול להיות enum של פלטת צבעים או תמונת RGB565 בגודל 256 פיקסלים המשמשת כטבלת חיפוש צבעים על ערך גווני האפור של תמונת הקלט. מוחל לאחר חילוץ rgb_channel.

alpha_palette יכול להיות תמונת גווני אפור בגודל 256 פיקסלים המשמשת כטבלת חיפוש אלפא שמווסתת את alpha לכל ערך גווני אפור של פיקסל קלט. מוחל לאחר חילוץ rgb_channel.

hint הוא OR לוגי של הדגלים:

  • 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

מנקה את חוצץ הפריימים של ה-LCD לשחור.

display_off אם True מכבה את לוגיקת התצוגה במקום לנקות את חוצץ הפריימים.

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 הוא מספר שלם אופציונלי או חוצץ (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 הוא מספר שלם אופציונלי או חוצץ (buffer) המכיל פרמטרים של פקודה.

dcs אם True שולח את הפקודה כחבילת DCS (Display Command Set).

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

שלח ioctl cmd ספציפי למנהל ההתקן עם arg אופציונלי לתצוגה. מעלה ValueError אם התצוגה אינה תומכת ב-ioctl.