12.10. الخلاصة

كاميرا موصولة بكابل USB تبث الإطارات إلى برنامج مضيف، وتقبل تحديثات الإعدادات من المضيف، وتصمد أمام الفصل/إعادة التوصيل دون فقدان المزامنة -- مع إخفاء عمليات إعادة الإرسال، ومشاركة عدة تدفقات منطقية لمنفذ واحد، ودون أي شيفرة تأطير في التطبيق -- كل ذلك ينتج عن نحو أربعين سطراً من شيفرة جانب الكاميرا وقدر مماثل على جانب المضيف. تحوّل مكتبة البروتوكول أنبوب بايتات إلى سطح قنوات قابل للبرمجة وتُبقي كل ما هو دون التطبيق غير مرئي.

12.10.1. ما بناه هذا الفصل

  • نموذج ذهني من أربع طبقات للمكدّس: النقل، والتأطير، والموثوقية، والقنوات. كل طبقة تحل مشكلة واحدة وتتجاهل كل ما فوقها.

  • تنسيق الحزمة على السلك -- ترويسة من 10 بايت مع CRC، وحمولة متغيرة، وقيمة CRC لاحقة. صغير بما يكفي للمرور خلاله بايتاً بايتاً.

  • المصافحة التي تُجريها الكاميرا والمضيف عند اتصال النقل: PROTO_SYNC، وتبادل القدرات، واكتشاف القنوات.

  • آلية الموثوقية فوق ذلك: أرقام التسلسل، و ACKs، و NAKs، وعمليات إعادة الإرسال مع التراجع الأسي، ورموز الحالة العشرة.

  • نموذج القنوات: ما يصل إلى 32 تدفقاً منطقياً مسمى على سلك واحد، مع stdin / stdout / stream / profile المدمجة وقنوات التطبيق المسجَّلة بصنف Python.

  • واجهة الواجهة الخلفية -- size، و read، و write، و poll، و lock / unlock، و shape، و ioctl، و flush، و is_active -- وكيف تستخدم مكتبة البروتوكول الدوال الموجودة في الواجهة الخلفية لتقرر ما تدعمه القناة.

  • جانب المضيف: صنف Camera في حزمة openmv-python للتطوير (SDK)، ومعدل 921600 باود السحري الذي يبدّل USB-CDC إلى وضع البروتوكول، ونمط جولة الذهاب والإياب channel_size / channel_read / channel_write.

  • نمط بث الإطارات -- التقاط بمخزن مؤقت واحد، و readp مع مثبِّت، و send_event لإخطارات الإطار الجديد -- ونمط إعدادات ثنائي الاتجاه (قناة قابلة للكتابة من المضيف، جولة ذهاب وإياب بصيغة JSON) يشكلان معاً الأساس لكل أداة كاميرا تفاعلية.

12.10.2. خارطة الطريق المرجعية

صفحات مرجع المكتبة هي وجهات البحث عندما تظهر إحدى هذه الميزات في شيفرة حقيقية:

  • protocol --- قنوات بروتوكول OpenMV -- وحدة protocol، و protocol.init()، و protocol.register()، و ProtocolChannel، وثوابت أعلام القناة، وجدول الحد الأقصى للحمولة لكل كاميرا.

  • حزمة تطوير المضيف (SDK) -- pip install openmv، و openmv.camera.Camera. الدوال التي تطرّق إليها هذا الفصل: update_channels()، و has_channel()، و channel_size()، و channel_read()، و channel_write()، و poll_events()، و read_frame()، و exec()، و stop().

  • مستودع openmv-projects -- أدوات حقيقية مبنية على مكتبة البروتوكول. يتضمن دليل tools/ أداة thermal-overlay-calibration (واجهة رسومية لمحاذاة RGB والحرارية)، و ccm-tuning (مُضبِّط مصفوفة تصحيح الألوان)، و genx320-event-streaming و genx320-overlay-calibration (أدوات كاميرا الأحداث). كل واحدة منها تستخدم الأنماط الواردة في هذا الفصل من البداية إلى النهاية.

12.10.3. إلى أين تأخذها لاحقاً

بضعة اتجاهات تنتقل إليها مشاريع الكاميرا من هنا:

  • بناء واجهة رسومية للمضيف. قناة إطارات تُغذّي عنصر فيديو، وقناة أو قناتان للإعدادات تغذّيان شرائط التمرير والأزرار. أما طبقة الواجهة الرسومية نفسها، فإن DearPyGui هو الخيار الطبيعي -- مكتوب بلغة Python بالكامل، وقابل للتثبيت عبر pip، وسريع بما يكفي للمعاينة الحية، وهو ما تلجأ إليه أولاً كل أداة مضيف موجودة من OpenMV.

  • لوحة قياس عن بُعد متعددة القنوات. عدة قنوات تطبيق على نفس الكاميرا (قراءات المستشعر، والعدّادات، وأحداث الحالة) تُحدَّث كل منها في دالة رد النداء الخاصة بها، وواجهة رسومية للمضيف تقرؤها على مؤقت وتعرض كلاً منها على حدة. يعني التحكم المستقل بالتدفق في طبقة القنوات أن قراءة بطيئة واحدة لا توقف الأخريات.

  • الضبط عن بُعد عبر UART. نفس دوال رد النداء للقنوات؛ يستدعي التطبيق protocol.init للتبديل من USB إلى نقل عبر UART. تبقى الكاميرا تعمل دون رأس ويتحدث إليها برنامج نصي بلغة Python على جهاز Raspberry Pi أو حاسوب محمول عبر خط تسلسلي للضبط الميداني.

لا يتغير تنسيق السلك، ولا طبقة الموثوقية، ولا تجريد القنوات. اختيار النقل الذي يناسب النشر وإضافة قناة لكل شيء يحتاج المضيف لرؤيته أو ضبطه هو كامل المهمة الهندسية من هنا فصاعداً.