IDE zawiera własne płyty, oprogramowanie sprzętowe, przykłady, modele uczenia maszynowego i fragmenty edytorów OpenMV, ale może również ładować tego samego rodzaju treści od innych firm — płytę zbudowaną przez partnera, działające na niej oprogramowanie sprzętowe, przykłady i dostrojone do niego modele oraz uzupełnianie kodu dla interfejsów API dodawanych przez oprogramowanie sprzętowe. Przychodzą one jako third-party repositories: foldery z zawartością, które IDE łączy z własnymi i aktualizuje.
Ta strona ma dwóch odbiorców. Większość z nich jest przeznaczona dla osoby instalującej i zarządzającej repozytorium opublikowanym przez kogoś innego. Ostatnia sekcja, authoring a repository, jest przeznaczona dla dostawcy budującego sekcję.
13.1.14.1. Strona Repozytoria stron trzecich
Wszystkim zarządza się z poziomu Edycja → Preferencje → OpenMV → Repozytoria stron trzecich. Tabela zawiera listę każdego zainstalowanego repozytorium oraz jego nazwę wyświetlaną, krótki identyfikator (Built-in czy User), zainstalowaną wersję każdego rodzaju treści, które dostarcza – oprogramowanie sprzętowe, przykłady, modele, kody pośredniczące – oraz adres URL, z którego aktualizuje się.
Built-in oznacza, że repozytorium zostało umieszczone we własnym katalogu aplikacji przez instalator dostarczony przez dostawcę, w taki sam sposób, w jaki pakiet sterowników dodaje pliki do programu. User oznacza, że zainstalowałeś go samodzielnie z adresu URL. Jedyna praktyczna różnica polega na tym, że nie można usunąć wbudowanego repozytorium z IDE — jest ono usuwane poprzez odinstalowanie wszystkiego, co je tam umieściło — więc przycisk Usuń jest dla niego wyłączony.
13.1.14.2. Instalowanie repozytorium
Instalacja z adresu URL pyta o adres config.json repozytorium – małego pliku manifestu publikowanego przez dostawcę – i instaluje wszystko, na co wskazuje. Wklej adres URL podany przez dostawcę; IDE pobiera manifest, pobiera oprogramowanie sprzętowe, przykłady, modele i kody pośredniczące, które wyświetla, i weryfikuje każde pobranie. Instalowanie, usuwanie i aktualizowanie repozytorium zaczynają obowiązywać po ponownym uruchomieniu, więc IDE oferuje ponowne uruchomienie po zakończeniu instalacji.
Sprzedawca może również rozpowszechnić repozytorium jako instalator, który umieści je bezpośrednio w katalogu aplikacji, w którym to przypadku przy pierwszym otwarciu strony będzie ono po prostu widoczne jako wiersz Built-in – nie będzie nic do instalowania.
13.1.14.4. Priorytety i zastąpienia
Repozytoria to uporządkowana lista, najwyższy priorytet znajduje się na górze, a opcje Przenieś w górę i Przenieś w dół zmieniają kolejność wybranego. Kolejność ma znaczenie tylko wtedy, gdy dwa źródła dostarczają rzecz same: płyta z tym samym identyfikatorem USB lub przykład, model lub kod pośredniczący o tej samej nazwie. Kiedy tak się stanie, wyższy wpis wygrywa, a każde repozytorium wygrywa z wbudowaną zawartością OpenMV. Jest to celowe — w ten sposób sprzedawca dostarcza własne oprogramowanie sprzętowe dla płyty, która ma ten sam identyfikator USB płyty OpenMV, zastępując standardowe oprogramowanie, które w innym przypadku oferowałoby dla niej IDE, lub zastępując standardowy przykład oprogramowaniem napisanym dla ich sprzętu.
Ponieważ zastąpienie dyskretnie zmienia działanie znanej nazwy, strona nigdy jej nie ukrywa. Panel ostrzeżeń o przesłonięciach wyświetla listę wszystkich zastosowanych przesłonięć — która płyta repozytorium, przykład, model lub kod pośredniczący zastępuje które — i ta sama lista pojawia się raz jako komunikat przy pierwszym wyświetleniu repozytorium. Jeśli płyta, przykład lub model nie zachowuje się w sposób opisany w dokumentacji OpenMV, ten panel jest pierwszym miejscem, na które należy zwrócić uwagę.
13.1.14.6. Tworzenie repozytorium
Repozytorium to folder nazwany na cześć dostawcy, zawierający manifest config.json i podfolder dla każdego rodzaju udostępnianej treści:
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
Nazwa folderu to identyfikator repozytorium: małe litery, cyfry, - i _, zaczynając od litery. Każdy folder części jest opcjonalny; wysyłaj tylko to, co masz. Obok każdego folderu części znajduje się plik <part>.version zawierający pojedynczy ciąg znaków wersji (1.2.0), którego IDE używa do decydowania, kiedy aktualizacja jest nowsza.
13.1.14.6.1. Manifest
config.json nazywa repozytorium i dla każdej części wskazuje archiwum do pobrania:
{
"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 musi pasować do nazwy folderu. configUrl to adres, pod którym przechowywany jest ten sam plik; IDE pobiera go ponownie, aby sprawdzić dostępność aktualizacji, więc pomiń go tylko w przypadku repozytorium, które nigdy nie będzie aktualizowane. Każda część ma kanał release, a oprogramowanie sprzętowe może również mieć kanał development używany przez instalację najnowszej wersji rozwojowej. Wartości wersji version są porównywane jako liczby, dlatego jako aktualizacja oferowana jest wyższa z nich; Wersje rozwojowe są porównywane tylko pod kątem zmian. Wartość sha256 jest opcjonalna, ale jest weryfikowana, jeśli jest obecna.
Każde url wskazuje na .zip (tylko zip). Archiwum zawiera dokładnie one top-level folder, a IDE instaluje contents tego folderu jako część — więc archiwum oprogramowania sprzętowego jest spakowane w następujący sposób:
acme-fw-1.2.0.zip
acme-firmware/ one wrapping folder; its name does not matter
settings.json
ACME_CAM1/
firmware.bin
romfs0.img
i rozpakowuje do pokazanego wcześniej folderu firmware/. Przykłady, modele i archiwa kodu pośredniczącego są pakowane w ten sam sposób — jeden folder zawierający zawartość mieszczącą się w examples/, models/ lub stubs/. Nazwa folderu zawijającego jest ignorowana; liczy się to, że jest dokładnie jeden. Spakowanie plików w katalogu głównym archiwum bez folderu zawijającego lub zapakowanie ich w więcej niż jeden folder nie spowoduje instalacji. Najprostszym sposobem, aby to zrobić poprawnie, jest spakowanie samego folderu — wybierz acme-firmware i skompresuj go, zamiast wybierać jego zawartość.
13.1.14.6.2. Tablice, przykłady, modele i odcinki
firmware/settings.json używa tego samego formatu opisu płytki, co oprogramowanie dostarczane przez IDE; dodaj wpis boards dla każdej ze swoich tablic. Kilka zasad jest specyficznych dla płyt innych firm: boardFirmwareFolder musi być unikalne (nie jest jeszcze używane przez OpenMV ani innego dostawcę, ponieważ określa folder, w którym znajdują się Twoje pliki binarne), każda płytka musi zawierać własne firmware_version (to właśnie powoduje monit o aktualizację przy połączeniu) i płyta może ustawić boardFirmwareFolderAlias na nazwę folderu oprogramowania sprzętowego płyty OpenMV, aby odziedziczyć standardowe przykłady i modele tej płyty – klapa ratunkowa dla płyta kompatybilna z oprogramowaniem sprzętowym OpenMV. Oczekuje się ponownego wykorzystania identyfikatorów programu ładującego OpenMV (zawierają podpisane sterowniki Windows); identyfikator aplikacji kolidujący z wbudowaną tablicą zastępuje tę tablicę, co zgłasza panel ostrzeżeń o przesłonięciu.
Przykłady znajdują się w ponumerowanych folderach kategorii, takich jak OpenMV (01-Getting-Started); kategoria, którą nazywasz tak samo, jak kategoria OpenMV, wplata się w nią, a nowa nazwa staje się jej własną sekcją menu. Model to folder zawierający jego .tflite i pasujące .txt etykiet klas, zgrupowane w folderze, którego index.html (i opcjonalny obraz) to opis pokazany obok niego w Model Zoo. examples/index.csv i models/index.csv to te same pliki filtrów płytek i czujników, których używają własne przykłady i modele OpenMV, dopasowane do twoich przykładów i ścieżek modeli oraz decyduj, który z twoich będzie wyświetlany dla której płytki. Stuby to zwykłe pliki .pyi; IDE przekazuje swój folder do serwera językowego, aby został rozwiązany wraz z OpenMV, a kod pośredniczący nazwany na cześć istniejącego modułu (csi.pyi) zastępuje zakończenie tego modułu.
13.1.14.6.3. Publikacja i aktualizacja
Aby opublikować, hostuj config.json i archiwa, do których się odwołuje, pod stabilnymi adresami URL i podaj użytkownikom adres URL config.json, z którego mogą dokonać instalacji. Działa wszędzie, gdzie udostępniane są zwykłe pliki przez HTTPS — serwer WWW, magazyn obiektów lub host kodu. Aby wysłać aktualizację, prześlij nowe archiwa, podbij odpowiednie wartości version w hostowanym config.json, a przy następnym uruchomieniu IDE każdego użytkownika zaoferuje aktualizację. Użytkownicy, którzy zainstalowali repozytorium za pomocą instalatora, otrzymują aktualizacje w ten sam sposób, pod warunkiem, że zainstalowany config.json zawiera configUrl.
13.1.14.6.4. Hosting na GitHubie
GitHub jest wygodnym hostem i IDE pobiera z niego zasoby w taki sam sposób, w jaki pobiera własne zasoby. Do umieszczenia są dwie części: manifest i archiwum.
Zachowaj plik config.json w repozytorium i podaj użytkownikom jego adres URL raw — adres, pod którym plik jest wyświetlany bezpośrednio, a nie strona GitHub, na której go wyświetla. Pokazuje to przycisk Raw na pliku; ma formę
https://raw.githubusercontent.com/<user>/<repo>/<branch>/config.json
Ten nieprzetworzony adres URL jest tym, co użytkownik wkleja do opcji Zainstaluj z adresu URL i tym, co umieszcza się we własnym manifeście configUrl, aby IDE ponownie go pobrało w celu sprawdzenia dostępności aktualizacji. Wskazywanie na gałąź (main) oznacza, że wciśnięcie nowego zatwierdzenia powoduje opublikowanie zmiany; zamiast tego skierowanie go na tag przypina użytkowników do poprawionej wersji.
Hostuj archiwa .zip jako release assets, zamiast je zatwierdzać — wydania są tworzone do pobierania binarnego, więc należy tam wielomegabajtowy pakiet oprogramowania sprzętowego, a nie do historii repozytorium. Dołącz każde archiwum do wydania GitHub i użyj adresu URL pobierania, który ma postać
https://github.com/<user>/<repo>/releases/download/<tag>/acme-fw-1.2.0.zip
w polach url manifestu, każde z sha256 archiwum. Wysyłka aktualizacji polega zatem na: dołączeniu nowych archiwów do wydania, edycji config.json, aby wskazać na nie i podbiciu wersji, i zatwierdzeniu. IDE przejmuje zmianę przy następnym uruchomieniu (nieprzetworzony plik jest przesyłany przez pamięć podręczną, która odświeża się w ciągu kilku minut od wypchnięcia).