13.1.14. Repozytoria stron trzecich#

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.3. Aktualizowanie repozytoriów#

Repozytorium zawierające adres URL aktualizacji jest sprawdzane przy każdym uruchomieniu IDE. Gdy dostępna jest nowsza zawartość, IDE poinformuje Cię o tym – wymieniając każde repozytorium i powiązane wersje – i zaoferuje jego zainstalowanie, a wszystko to w jednym komunikacie. Opcja Sprawdź aktualizacje uruchamia tę samą kontrolę na żądanie.

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.5. Co zapewnia repozytorium#

Każdy z czterech rodzajów treści pojawia się w swoim zwykłym miejscu w IDE, więc po zainstalowaniu repozytorium nie trzeba się niczego nowego uczyć:

  • Boards and firmware. Płyta repozytorium zachowuje się dokładnie tak, jak płyta OpenMV — jest rozpoznawana po podłączeniu, jej typ jest wyświetlany na pasku stanu, a oprogramowanie sprzętowe jest aktualizowane za pośrednictwem IDE, łącznie ze ścieżką Zainstaluj najnowszą wersję rozwojową. Zobacz Aktualizacje i odzyskiwanie oprogramowania układowego.

  • Examples. Przykłady repozytorium pojawiają się w Plik → Przykłady, połączone w drzewo kategorii: przykład w kategorii, którą dostawca nazwał tak samo jak kategoria OpenMV, znajduje się obok kategorii OpenMV, a nowa kategoria staje się własnym podmenu. Są one filtrowane do tablic, które obsługują, jak każdy przykład. Zobacz Skrypty, przykłady i folder dokumentów.

  • Models. Modele repozytorium pojawiają się w Model Zoo, połączone z drzewem przeglądarki w ten sam sposób, z własnymi opisami dostawcy.

  • Stubs. Repozytorium może dostarczać .pyi pliki pośredniczące, więc editor oferuje uzupełnienie, podpisy i dokumentację funkcji dodanych przez jego oprogramowanie — to samo zakończenie, które otrzymujesz w przypadku własnych modułów OpenMV i niestandardowego API dostawcy.

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).