13.1.14. Repositorys von Drittanbietern#

Die IDE liefert OpenMVs eigene Boards, Firmware, Beispiele, Machine-Learning-Modelle und Editor-Stubs, kann aber auch die gleichen Arten von Inhalten von anderen Unternehmen laden – ein von einem Partner erstelltes Board, die darauf laufende Firmware, darauf abgestimmte Beispiele und Modelle sowie Code-Vervollständigung für die APIs, die die Firmware hinzufügt. Diese kommen als third-party repositories an: Ordner mit Inhalten, die die IDE mit ihren eigenen zusammenführt und auf dem neuesten Stand hält.

Diese Seite hat zwei Zielgruppen. Das meiste davon ist für die Person bestimmt, die ein Repository installiert und verwaltet, das jemand anderes veröffentlicht hat. Der letzte Abschnitt, authoring a repository, ist für den Anbieter, der einen baut.

13.1.14.1. Die Seite „Drittanbieter-Repositorys“.#

Alles wird über Bearbeiten → Einstellungen → OpenMV → Drittanbieter-Repositorys verwaltet. Die Tabelle listet jedes installierte Repository und für jedes seinen Anzeigenamen, seine Kurz-ID, ob Built-in oder User, die installierte Version jeder Art von Inhalten auf, die es bereitstellt – Firmware, Beispiele, Modelle, Stubs – und die URL, von der aus es aktualisiert.

Built-in bedeutet, dass das Repository von einem vom Hersteller gelieferten Installationsprogramm im eigenen Verzeichnis der Anwendung abgelegt wurde, so wie ein Treiberpaket Dateien zu einem Programm hinzufügt. User bedeutet, dass Sie es selbst über eine URL installiert haben. Der einzige praktische Unterschied besteht darin, dass Sie ein integriertes Repository nicht aus der IDE entfernen können – es wird durch die Deinstallation dessen entfernt, was es dort abgelegt hat – daher ist die Schaltfläche „Entfernen“ dafür deaktiviert.

13.1.14.2. Installieren eines Repositorys#

Install from URL fragt nach der Adresse von config.json eines Repositorys – der kleinen Manifestdatei, die der Anbieter veröffentlicht – und installiert alles, auf das es verweist. Fügen Sie die URL ein, die Sie vom Anbieter erhalten haben. Die IDE lädt das Manifest herunter, ruft die darin aufgelistete Firmware, Beispiele, Modelle und Stubs ab und überprüft jeden Download. Das Installieren, Entfernen und Aktualisieren eines Repositorys wird nach einem Neustart wirksam, sodass die IDE nach Abschluss der Installation einen Neustart anbietet.

Ein Anbieter kann ein Repository auch als Installationsprogramm verteilen, das es direkt im Anwendungsverzeichnis ablegt. In diesem Fall ist es beim ersten Öffnen der Seite einfach als Built-in-Zeile vorhanden – es muss nichts installiert werden.

13.1.14.3. Repositorys auf dem neuesten Stand halten#

Ein Repository, das eine Update-URL enthält, wird bei jedem Start der IDE überprüft. Wenn neuere Inhalte verfügbar sind, teilt Ihnen die IDE mit, was sie tun – sie listet jedes Repository und die beteiligten Versionen auf – und bietet an, sie zu installieren – alles in einer einzigen Eingabeaufforderung. „Nach Updates suchen“ führt die gleiche Prüfung bei Bedarf durch.

13.1.14.4. Priorität und Überschreibungen#

Repositorys sind eine geordnete Liste mit der höchsten Priorität an der Spitze. Mit „Nach oben“ und „Nach unten“ wird das ausgewählte Repository neu angeordnet. Die Reihenfolge ist nur dann von Bedeutung, wenn zwei Quellen das same-Ding bereitstellen: eine Karte mit derselben USB-Kennung oder ein Beispiel, Modell oder Stub mit demselben Namen. Wenn das passiert, gewinnt der höhere Eintrag, und jedes Repository gewinnt gegenüber dem integrierten Inhalt von OpenMV. Dies ist Absicht – auf diese Weise liefert ein Anbieter seine eigene Firmware für ein Board, das die USB-Kennung eines OpenMV-Boards teilt, und ersetzt damit die Standard-Firmware, die die IDE sonst dafür anbieten würde, oder ersetzt ein Standard-Beispiel durch ein für seine Hardware geschriebenes.

Da eine Überschreibung stillschweigend die Wirkung eines bekannten Namens ändert, wird dieser niemals auf der Seite ausgeblendet. Das Bedienfeld „Überschreibungswarnungen“ listet jede wirksame Überschreibung auf – welches Board, Beispiel, Modell oder Stub des Repositorys welches überschreibt – und dieselbe Liste erscheint einmal als Meldung, wenn ein Repository zum ersten Mal angezeigt wird. Wenn sich ein Board, ein Beispiel oder ein Modell nicht so verhält, wie es in der OpenMV-Dokumentation beschrieben wird, ist dieses Panel die erste Anlaufstelle.

13.1.14.5. Was ein Repository bietet#

Die vier Arten von Inhalten erscheinen jeweils an ihrer gewohnten Stelle in der IDE, sodass es nach der Installation eines Repositorys nichts Neues zu lernen gibt:

  • Boards and firmware. Das Board eines Repositorys verhält sich genau wie ein OpenMV-Board – es wird beim Herstellen einer Verbindung erkannt, sein Typ wird in der Statusleiste angezeigt und seine Firmware wird über die IDE aktualisiert, einschließlich des Pfads „Neueste Entwicklungsversion installieren“. Siehe Firmware-Updates und Wiederherstellung.

  • Examples. Die Beispiele eines Repositorys werden unter Datei → Beispiele angezeigt und in den Kategoriebaum eingefügt: Ein Beispiel in einer Kategorie, deren Anbieter den gleichen Namen wie eine OpenMV-Kategorie hat, steht neben den OpenMV-Beispielen, und eine neue Kategorie wird zu einem eigenen Untermenü. Sie werden wie jedes Beispiel nach den Boards gefiltert, die sie unterstützen. Siehe Skripte, Beispiele und der Dokumentenordner.

  • Models. Die Modelle eines Repositorys werden in Model Zoo angezeigt und auf die gleiche Weise in die Browserstruktur eingefügt, mit den eigenen Beschreibungen des Anbieters.

  • Stubs. Ein Repository kann .pyi Stub-Dateien versenden, sodass editor Vervollständigung, Signaturen und Dokumentation für die Funktionen bietet, die seine Firmware hinzufügt – die gleiche Vervollständigung, die Sie für die eigenen Module von OpenMV und für die benutzerdefinierte API eines Anbieters erhalten.

13.1.14.6. Erstellen eines Repositorys#

Ein Repository ist ein nach dem Anbieter benannter Ordner, der ein config.json-Manifest und einen Unterordner für jede Art von Inhalt enthält, den es bereitstellt:

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

Der Ordnername ist die Repository-ID: Kleinbuchstaben, Ziffern, - und _, beginnend mit einem Buchstaben. Jeder Teileordner ist optional; Versenden Sie nur das, was Sie haben. Neben jedem Teilordner befindet sich eine <part>.version-Datei mit einer einzelnen Versionszeichenfolge (1.2.0), anhand derer die IDE entscheidet, wann ein Update neuer ist.

13.1.14.6.1. Das Manifest#

config.json benennt das Repository und verweist für jeden Teil auf ein herunterladbares Archiv:

{
  "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 muss mit dem Ordnernamen übereinstimmen. configUrl ist die Adresse, unter der dieselbe Datei gehostet wird; Die IDE ruft es erneut ab, um nach Updates zu suchen. Lassen Sie es also nur für ein Repository weg, das nie aktualisiert wird. Jeder Teil verfügt über einen release-Kanal, und die Firmware verfügt möglicherweise auch über einen development-Kanal, der von der Installation der neuesten Entwicklungsversion verwendet wird. Release version-Werte werden als Zahlen verglichen, sodass ein höherer Wert als Update angeboten wird; Entwicklungsversionen werden nur im Hinblick auf Änderungen verglichen. sha256 ist optional, wird jedoch überprüft, sofern vorhanden.

Jeder url zeigt auf einen .zip (nur Zip). Ein Archiv enthält genau one top-level folder, und die IDE installiert die contents dieses Ordners als Teil – das Firmware-Archiv wird also wie folgt gepackt:

acme-fw-1.2.0.zip
  acme-firmware/           one wrapping folder; its name does not matter
    settings.json
    ACME_CAM1/
      firmware.bin
      romfs0.img

und entpackt es in den zuvor gezeigten Ordner firmware/. Die Beispiele-, Modell- und Stub-Archive werden auf die gleiche Weise gepackt – ein Verpackungsordner mit dem, was sich in examples/, models/ oder stubs/ befinden würde. Der Name des Wrapping-Ordners wird ignoriert; Entscheidend ist, dass es genau einen gibt. Das Komprimieren der Dateien im Stammverzeichnis des Archivs ohne umschließenden Ordner oder das Umschließen in mehr als einen Ordner führt nicht zur Installation. Der einfachste Weg, es richtig zu machen, besteht darin, den Ordner selbst zu komprimieren – wählen Sie acme-firmware aus und komprimieren Sie ihn, anstatt seinen Inhalt auszuwählen.

13.1.14.6.2. Boards, Beispiele, Modelle und Stubs#

firmware/settings.json verwendet dasselbe Board-Beschreibungsformat wie die Firmware, die die IDE ausliefert; Fügen Sie für jedes Ihrer Boards einen boards-Eintrag hinzu. Einige Regeln gelten speziell für Boards von Drittanbietern: boardFirmwareFolder muss eindeutig sein (es wird noch nicht von OpenMV oder einem anderen Anbieter verwendet, da es den Ordner benennt, in dem sich Ihre Binärdateien befinden), jedes Board muss sein eigenes firmware_version haben (dies ist der Grund für die Eingabeaufforderung zum Aktualisieren bei Verbindung), und ein Board kann boardFirmwareFolderAlias auf den Firmware-Ordnernamen eines OpenMV-Boards setzen, um die Standardbeispiele und Modelle dieses Boards zu erben – das Escape Luke für ein Board, das Firmware-kompatibel mit einem OpenMV-Board ist. Es wird erwartet, dass OpenMV-Bootloader-IDs wiederverwendet werden (sie enthalten die signierten Windows-Treiber). Eine App-ID, die mit einem integrierten Board kollidiert, überschreibt dieses Board, was im Bereich „Warnungen überschreiben“ gemeldet wird.

Beispiele befinden sich in nummerierten Kategorieordnern wie OpenMVs (01-Getting-Started); Eine Kategorie, die Sie genauso benennen wie eine OpenMV-Kategorie, wird darin verschachtelt, und ein neuer Name wird zu einem eigenen Menüabschnitt. Ein Modell ist ein Ordner mit seinem .tflite und einem passenden .txt an Klassenbezeichnungen, gruppiert unter einem Ordner, dessen index.html (und ein optionales Bild) die daneben im Modellzoo angezeigte Beschreibung ist. examples/index.csv und models/index.csv sind die gleichen Board- und Sensorfilterdateien, die OpenMVs eigene Beispiele und Modelle verwenden. Sie werden mit Ihren Beispiel- und Modellpfaden abgeglichen und entscheiden, welche Ihrer Dateien für welches Board angezeigt werden. Stubs sind gewöhnliche .pyi-Dateien; Die IDE übergibt ihren Ordner an den Sprachserver, damit er zusammen mit OpenMVs aufgelöst wird, und ein Stub mit dem Namen für ein vorhandenes Modul (csi.pyi) überschreibt die Fertigstellung dieses Moduls.

13.1.14.6.3. Veröffentlichung und Aktualisierung#

Hosten Sie zum Veröffentlichen config.json und die Archive, auf die es verweist, unter stabilen URLs und geben Sie Benutzern die config.json-URL für die Installation. Überall dort, wo einfache Dateien über HTTPS bereitgestellt werden, funktioniert es – ein Webserver, ein Objektspeicher oder ein Code-Host. Um ein Update zu versenden, laden Sie neue Archive hoch, erhöhen Sie die betroffenen version-Werte im gehosteten config.json und bieten Sie beim nächsten Start der IDE jedes Benutzers das Update an. Benutzer, die das Repository über ein Installationsprogramm installiert haben, erhalten Updates stattdessen auf die gleiche Weise, solange das installierte config.json ein configUrl enthält.

13.1.14.6.4. Hosting auf GitHub#

GitHub ist ein praktischer Host, und die IDE ruft von ihm auf die gleiche Weise ab, wie sie ihre eigenen Ressourcen abruft. Es müssen zwei Teile platziert werden: das Manifest und die Archive.

Behalten Sie config.json in einem Repository und geben Sie Benutzern seine raw-URL – die Adresse, unter der die Datei direkt bereitgestellt wird, nicht die GitHub-Seite, auf der sie angezeigt wird. Die Raw-Schaltfläche in der Datei zeigt es an; es hat die Form

https://raw.githubusercontent.com/<user>/<repo>/<branch>/config.json

Diese Roh-URL ist das, was ein Benutzer in „Von URL installieren“ einfügt, und das, was Sie in die eigene configUrl des Manifests einfügen, damit die IDE sie erneut abruft, um nach Updates zu suchen. Wenn Sie es auf einen Zweig verweisen (main), bedeutet dies, dass durch das Pushen eines neuen Commits die Änderung veröffentlicht wird. Wenn Sie auf ein Tag verweisen, werden Benutzer stattdessen an eine feste Version weitergeleitet.

Hosten Sie die .zip-Archive als release assets, anstatt sie festzuschreiben – Releases werden für binäre Downloads erstellt, daher gehört ein Multi-Megabyte-Firmware-Bundle dorthin und nicht in den Verlauf des Repositorys. Hängen Sie jedes Archiv an eine GitHub-Version an und verwenden Sie dessen Download-URL, die das Formular hat

https://github.com/<user>/<repo>/releases/download/<tag>/acme-fw-1.2.0.zip

in den url-Feldern des Manifests, jedes mit dem sha256 des Archivs. Das Versenden eines Updates erfolgt dann wie folgt: Hängen Sie die neuen Archive an eine Version an, bearbeiten Sie config.json, um auf sie zu verweisen, und erhöhen Sie die Versionen, und übernehmen Sie es. Die IDE übernimmt die Änderung beim nächsten Start (die Rohdatei wird über einen Cache bereitgestellt, der innerhalb weniger Minuten nach dem Push aktualisiert wird).