يقوم IDE بشحن لوحات OpenMV الخاصة والبرامج الثابتة والأمثلة ونماذج التعلم الآلي وكعب المحرر، لكنه يمكنه تحميل نفس أنواع المحتوى من شركات أخرى أيضًا - لوحة أنشأها شريك، والبرامج الثابتة التي تعمل عليها، والأمثلة والنماذج التي تم ضبطها لها، وإكمال التعليمات البرمجية لواجهات برمجة التطبيقات التي تضيفها البرامج الثابتة. تصل هذه إلى third-party repositories: مجلدات المحتوى التي يدمجها IDE مع مجلداته الخاصة ويظل محدثًا.
تحتوي هذه الصفحة على جمهورين. معظمها مخصص للشخص الذي يقوم بتثبيت وإدارة المستودع الذي نشره شخص آخر. القسم الأخير، authoring a repository، مخصص للبائع الذي يبني واحدًا.
13.1.14.1. صفحة مستودعات الطرف الثالث
تتم إدارة كل شيء من تحرير → التفضيلات → OpenMV → مستودعات الطرف الثالث. يسرد الجدول كل مستودع مثبت، ولكل منهما، اسم العرض الخاص به، ومعرفه القصير، سواء كان Built-in أو User، والإصدار المثبت لكل نوع من أنواع المحتوى الذي يوفره - البرامج الثابتة، والأمثلة، والنماذج، والكعب - وعنوان URL الذي يتم التحديث منه.
Built-in يعني أن المستودع قد تم وضعه في الدليل الخاص بالتطبيق بواسطة المثبت الذي قام البائع بشحنه، بالطريقة التي تضيف بها حزمة برنامج التشغيل الملفات إلى البرنامج. User يعني أنك قمت بتثبيته بنفسك من عنوان URL. والفرق العملي الوحيد هو أنه لا يمكنك إزالة مستودع مضمن من IDE - تتم إزالته عن طريق إلغاء تثبيت أي شيء وضعه هناك - لذلك يتم تعطيل زر الإزالة له.
13.1.14.4. الأولوية والتجاوزات
المستودعات عبارة عن قائمة مرتبة، ذات أولوية أعلى في الأعلى، ويؤدي تحريك لأعلى وتحريك لأسفل إلى إعادة ترتيب القائمة المحددة. الترتيب مهم فقط عندما يوفر مصدران الشيء same: لوحة تحمل نفس معرف USB، أو مثال أو نموذج أو كعب روتين يحمل نفس الاسم. عندما يحدث ذلك، يفوز الإدخال الأعلى، ويفوز كل مستودع بالمحتوى المدمج في OpenMV. هذا متعمد - فهو عبارة عن كيفية قيام البائع بتوفير البرامج الثابتة الخاصة به للوحة التي تشترك في معرف USB الخاص بلوحة OpenMV، أو استبدال البرامج الثابتة للمخزون التي قد يقدمها IDE لها، أو استبدال مثال المخزون بمثال مكتوب لأجهزتهم.
نظرًا لأن التجاوز يغير بصمت ما يفعله الاسم المألوف، فإن الصفحة لا تخفيه أبدًا. تسرد لوحة تحذيرات التجاوز كل تجاوز ساري المفعول - ما هي لوحة المستودع، أو المثال، أو النموذج، أو كعب الروتين الذي يتجاوز ذلك - وتظهر نفس القائمة مرة واحدة كرسالة في المرة الأولى التي يتم فيها رؤية المستودع. إذا كانت اللوحة أو المثال أو النموذج لا يتصرف بالطريقة التي تصفها وثائق OpenMV، فهذه اللوحة هي المكان الأول الذي يجب البحث فيه.
13.1.14.6. تأليف مستودع
المستودع عبارة عن مجلد مسمى باسم البائع، ويحتوي على بيان config.json ومجلد فرعي لكل نوع من أنواع المحتوى الذي يوفره:
acme/
config.json
firmware/
settings.json board descriptions
ACME_CAM1/ one folder per board, named by boardFirmwareFolder
firmware.bin
romfs0.img
firmware.version
examples/
index.csv which examples show for which board / sensor
01-Getting-Started/ numbered category folders, same as OpenMV's
hello_acme.py
read_sensor.py
02-Acme-Widgets/
spin_widget.py
examples.version
models/
index.csv which models show for which board
acme/ a group; its index.html + image describe it
index.html
image.jpg
person_detector/ one folder per model
person_detector.tflite
person_detector.txt class labels
models.version
stubs/
acme_hal.pyi a module the firmware adds
csi.pyi overrides OpenMV's to add methods
stubs.version
اسم المجلد هو معرف المستودع: أحرف صغيرة وأرقام و- و_، تبدأ بحرف. كل مجلد جزء اختياري؛ شحن فقط ما لديك. يوجد بجانب كل مجلد جزء ملف <part>.version يحتوي على سلسلة إصدار واحدة (1.2.0) يستخدمها IDE ليقرر متى يكون التحديث أحدث.
13.1.14.6.1. البيان
config.json يسمي المستودع ويشير لكل جزء إلى أرشيف قابل للتنزيل:
{
"name": "acme",
"displayName": "Acme Robotics",
"homepage": "https://acme.example",
"configUrl": "https://acme.example/openmv/config.json",
"firmware": {
"release": { "version": "1.2.0", "url": "https://acme.example/acme-fw-1.2.0.zip", "sha256": "..." },
"development": { "version": "dev-20260701", "url": "https://acme.example/acme-fw-dev.zip", "sha256": "..." }
},
"examples": { "release": { "version": "1.1.0", "url": "https://acme.example/acme-examples-1.1.0.zip", "sha256": "..." } },
"models": { "release": { "version": "1.0.0", "url": "https://acme.example/acme-models-1.0.0.zip", "sha256": "..." } },
"stubs": { "release": { "version": "1.0.0", "url": "https://acme.example/acme-stubs-1.0.0.zip", "sha256": "..." } }
}
يجب أن يتطابق name مع اسم المجلد. configUrl هو العنوان الذي يتم استضافة هذا الملف نفسه فيه؛ يقوم IDE بإعادة جلبه للتحقق من وجود تحديثات، لذا قم بحذفه فقط للمستودع الذي لن يتم تحديثه أبدًا. يحتوي كل جزء على قناة release، وقد تحتوي البرامج الثابتة أيضًا على قناة development تستخدم من خلال تثبيت أحدث إصدار للتطوير. تتم مقارنة قيم الإصدار version كأرقام، لذلك يتم تقديم قيمة أعلى كتحديث؛ تتم مقارنة إصدارات التطوير فقط من أجل التغيير. يعد sha256 اختياريًا ولكن يتم التحقق منه عند وجوده.
كل url نقطة عند .zip (الرمز البريدي فقط). يحمل الأرشيف بالضبط one top-level folder، ويقوم IDE بتثبيت contents لهذا المجلد كجزء - لذلك يتم تجميع أرشيف البرامج الثابتة مثل هذا:
acme-fw-1.2.0.zip
acme-firmware/ one wrapping folder; its name does not matter
settings.json
ACME_CAM1/
firmware.bin
romfs0.img
وتفريغ المجلد firmware/ الموضح سابقًا. يتم تجميع الأمثلة والنماذج والأرشيفات بنفس الطريقة - مجلد التفاف واحد يحتوي على ما يمكن أن يجلس بداخله examples/، models/، أو stubs/. يتم تجاهل اسم مجلد التغليف؛ ما يهم هو أن هناك واحد بالضبط. لن يتم تثبيت ضغط الملفات في جذر الأرشيف بدون مجلد تغليف، أو تغليفها في أكثر من مجلد. إن أبسط طريقة للقيام بذلك بشكل صحيح هي ضغط المجلد نفسه -- حدد acme-firmware وضغطه، بدلاً من تحديد محتوياته.
13.1.14.6.2. المجالس والأمثلة والنماذج والبذرة
يستخدم firmware/settings.json نفس تنسيق وصف اللوحة مثل البرنامج الثابت الذي يشحنه IDE؛ أضف إدخال boards لكل لوحة من لوحاتك. هناك بعض القواعد الخاصة بلوحات الطرف الثالث: يجب أن تكون boardFirmwareFolder فريدة (لم يتم استخدامها بعد بواسطة OpenMV أو بائع آخر، نظرًا لأنها تسمي المجلد الذي تعيش فيه الثنائيات الخاصة بك)، ويجب أن تحمل كل لوحة firmware_version الخاصة بها (وهذا ما يدفع موجه التحديث عند الاتصال)، وقد تقوم اللوحة بتعيين boardFirmwareFolderAlias على اسم مجلد البرامج الثابتة للوحة OpenMV لوراثة أمثلة ونماذج مخزون تلك اللوحة - الهروب فتحة للوحة متوافقة مع البرامج الثابتة مع OpenMV. من المتوقع إعادة استخدام معرفات أداة تحميل التشغيل OpenMV (وهي تحمل برامج تشغيل Windows الموقعة)؛ يتجاوز معرف التطبيق الذي يتعارض مع لوحة مدمجة تلك اللوحة، والتي تبلغ عنها لوحة تحذيرات التجاوز.
يتم وضع الأمثلة في مجلدات فئة مرقمة مثل OpenMV's (01-Getting-Started)؛ فئة تسميها بنفس اسم OpenMV تتداخل فيها، ويصبح الاسم الجديد قسم القائمة الخاص به. النموذج عبارة عن مجلد يحتوي على .tflite و.txt مطابق من تسميات الفئة، مجمعة ضمن مجلد يكون index.html (وصورة اختيارية) هو الوصف الموضح بجانبه في Model Zoo. examples/index.csv وmodels/index.csv هما نفس ملفات مرشح اللوحة والمستشعر التي تستخدمها الأمثلة والنماذج الخاصة بـ OpenMV، والتي تتم مطابقتها مع مسارات الأمثلة والنماذج الخاصة بك، وتقرر أي منها سيتم عرضه لأي لوحة. بذرة هي ملفات .pyi عادية؛ يقوم IDE بتسليم المجلد الخاص به إلى خادم اللغة بحيث يتم حله جنبًا إلى جنب مع OpenMV، ويتجاوز كعب الروتين المسمى لوحدة نمطية موجودة (csi.pyi) اكتمال تلك الوحدة.
13.1.14.6.3. النشر والتحديث
للنشر، قم باستضافة config.json والأرشيفات التي تشير إليها في عناوين URL مستقرة ومنح المستخدمين عنوان URL config.json للتثبيت منه. يعمل أي مكان يقدم ملفات عادية عبر HTTPS - خادم ويب، أو مخزن كائنات، أو مضيف تعليمات برمجية. لشحن تحديث، قم بتحميل أرشيفات جديدة، وقم بزيادة قيم version المتأثرة في config.json المستضاف، وفي المرة التالية التي يتم فيها تشغيل IDE لكل مستخدم، فإنه يقدم التحديث. المستخدمون الذين قاموا بتثبيت المستودع من خلال المثبت بدلاً من ذلك يحصلون على التحديثات بنفس الطريقة، طالما أن config.json المثبت يحمل configUrl.
13.1.14.6.4. الاستضافة على جيثب
يعد GitHub مضيفًا مناسبًا، ويجلب منه IDE بنفس الطريقة التي يجلب بها موارده الخاصة. هناك قطعتان يجب وضعهما: البيان والمحفوظات.
احتفظ بـ config.json في المستودع وامنح المستخدمين عنوان URL الخاص به raw - العنوان الذي يتم تقديم الملف إليه مباشرة، وليس صفحة GitHub التي تعرضه. يعرضه الزر Raw الموجود في الملف؛ لديها النموذج
https://raw.githubusercontent.com/<user>/<repo>/<branch>/config.json
عنوان URL الأولي هذا هو ما يلصقه المستخدم في التثبيت من عنوان URL، وما تضعه في configUrl الخاص بالبيان حتى يعيد IDE جلبه للتحقق من وجود تحديثات. الإشارة إليه على فرع (main) تعني دفع التزام جديد ينشر التغيير؛ يؤدي توجيهها إلى علامة إلى تثبيت المستخدمين على إصدار ثابت بدلاً من ذلك.
قم باستضافة أرشيفات .zip كـ release assets بدلاً من الالتزام بها - تم إنشاء الإصدارات للتنزيلات الثنائية، لذا تنتمي حزمة البرامج الثابتة متعددة الميجابايت إلى هناك، وليس في سجل المستودع. قم بإرفاق كل أرشيف بإصدار GitHub واستخدم عنوان URL للتنزيل الخاص به، والذي يحتوي على النموذج
https://github.com/<user>/<repo>/releases/download/<tag>/acme-fw-1.2.0.zip
في حقول البيان url، كل منها يحتوي على sha256 الأرشيف. يتم بعد ذلك شحن التحديث: إرفاق الأرشيفات الجديدة بالإصدار، وتحرير config.json للإشارة إليها ورفع الإصدارات والالتزام. يلتقط IDE التغيير عند إطلاقه التالي (يتم تقديم الملف الأولي من خلال ذاكرة تخزين مؤقت يتم تحديثها خلال دقائق قليلة من الدفع).