class DSIDisplay -- مشغّل عرض DSI

تقود الفئة DSIDisplay لوحات MIPI-DSI من خلال متحكم مضيف DSI في STM32. إن MIPI DSI هو بروتوكول عرض تسلسلي قائم على الحزم يستخدم مسار ساعة واحدًا بالإضافة إلى مسار بيانات واحد أو أكثر كأزواج تفاضلية، مما يتيح له حمل محتوى عالي الدقة (حتى 1080p) عبر أسلاك أقل بكثير من RGB المتوازي بعرض 24 بت. تتدفق البكسلات مباشرةً من مخزن إطارات مدعوم بـ 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 يخصص ثلاثة مخازن إطارات للسماح بتحديثات عرض خالية من التمزق. مطلوب للقلب الرأسي في write().

portrait يبدّل عرض وارتفاع الـ framesize.

channel قناة MIPI DSI الافتراضية المستخدمة للتخاطب مع العرض.

controller مرّر فئة شريحة المتحكم هنا لتهيئتها مع العرض. مثل display.ST7701() وهو متحكم عرض قياسي لشاشات MIPI DSI.

backlight حدّد وحدة متحكم إضاءة خلفية لاستخدامها. افتراضيًا سيتم التحكم في الإضاءة الخلفية عبر دبوس GPIO.

deinit() None

تحرر دبابيس الإدخال/الإخراج وذاكرة RAM التي تستخدمها الفئة. يُستدعى هذا تلقائيًا عند الإتلاف.

width() int

تُرجع عرض الشاشة.

height() int

تُرجع ارتفاع الشاشة.

triple_buffer() int

تُرجع ما إذا كان التخزين الثلاثي مفعّلًا.

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 (عدد عشري). إذا كانت هذه القيمة سالبة فستُقلب الصورة أفقيًا. وإذا لم يُحدد y_scale فسيطابق x_scale للحفاظ على نسبة العرض إلى الارتفاع.

يتحكم y_scale في مقدار تحجيم الصورة المعروضة في اتجاه y (عدد عشري). إذا كانت هذه القيمة سالبة فستُقلب الصورة رأسيًا. ويتطلب القلب الرأسي 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 تعدادًا للوحة لونية أو صورة 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 هو عدد صحيح أو مخزن مؤقت اختياري يحتوي على معاملات الأمر.

dcs إذا كان True يرسل الأمر كحزمة DCS (مجموعة أوامر العرض).

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

تقرأ len بايتات من العرض باستخدام أمر DSI cmd.

args هو عدد صحيح أو مخزن مؤقت اختياري يحتوي على معاملات الأمر.

dcs إذا كان True يرسل الأمر كحزمة DCS (مجموعة أوامر العرض).

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

ترسل أمر ioctl cmd خاصًا بالمشغّل مع arg اختياري إلى العرض. تطلق ValueError إذا كان العرض لا يدعم ioctl.