class DSIDisplay – מנהל התקן תצוגת DSI¶
המחלקה DSIDisplay מנהיגה פאנלים מסוג MIPI-DSI דרך בקר מארח ה-DSI של STM32. MIPI DSI הוא פרוטוקול תצוגה טורי מבוסס חבילות שמשתמש בנתיב שעון אחד בתוספת נתיב נתונים אחד או יותר כזוגות דיפרנציאליים, מה שמאפשר לו לשאת תוכן ברזולוציה גבוהה (עד 1080p) על פני הרבה פחות חוטים מאשר RGB מקבילי של 24 סיביות. הפיקסלים זורמים ישירות מחוצץ פריימים (frame buffer) מגובה SDRAM בקצב הרענון הנבחר, כך שהמעבד אינו מעורב ברענון.
רזולוציית הפאנל נבחרת באמצעות framesize תוך שימוש בקבועים שבמודול display (QVGA, VGA, HD, FHD, …). רצפי אתחול ספציפיים לפאנל מחוברים באמצעות ארגומנט המילת מפתח controller – ST7701 מכסה את פאנלי ה-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.- 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).