13.1.14. Arhive terțe#

IDE-ul oferă plăci proprii OpenMV, firmware, exemple, modele de învățare automată și stub-uri editor, dar poate încărca aceleași tipuri de conținut și de la alte companii – o placă construită de un partener, firmware-ul care rulează pe ea, exemple și modele adaptate pentru acesta și completarea codului pentru API-urile pe care le adaugă firmware-ul. Acestea ajung ca third-party repositories: foldere de conținut pe care IDE-ul le îmbină cu propriile sale și le ține la zi.

Această pagină are două audiențe. Cea mai mare parte este pentru persoana care instalează și gestionează un depozit publicat de altcineva. Ultima secțiune, authoring a repository, este pentru furnizorul care construiește unul.

13.1.14.1. Pagina Arhive terță parte#

Totul este gestionat din Editare → Preferințe → OpenMV → Arhive terțe. Tabelul listează fiecare depozit instalat și, pentru fiecare, numele său afișat, ID-ul scurt, indiferent dacă este Built-in sau User, versiunea instalată a fiecărui tip de conținut pe care îl oferă – firmware, exemple, modele, stub-uri – și adresa URL de la care se actualizează.

Built-in înseamnă că depozitul a fost plasat în propriul director al aplicației de către un program de instalare livrat de furnizor, așa cum un pachet de driver adaugă fișiere la un program. User înseamnă că l-ați instalat singur dintr-o adresă URL. Singura diferență practică este că nu puteți elimina un depozit încorporat din IDE – acesta este eliminat prin dezinstalarea a ceea ce l-a pus acolo – așa că butonul Eliminare este dezactivat pentru acesta.

13.1.14.2. Instalarea unui depozit#

Instalare de la URL solicită adresa config.json al unui depozit – fișierul manifest mic pe care îl publică furnizorul – și instalează tot ce indică. Lipiți adresa URL pe care v-a dat-o furnizorul; IDE-ul descarcă manifestul, preia firmware-ul, exemplele, modelele și stuburile pe care le listează și verifică fiecare descărcare. Instalarea, eliminarea și actualizarea unui depozit intră în vigoare după o repornire, așa că IDE-ul oferă repornirea când instalarea se termină.

De asemenea, un furnizor poate distribui un depozit ca un program de instalare care îl plasează direct în directorul aplicației, caz în care este pur și simplu prezent ca un rând Built-in la prima deschidere a paginii – nimic de instalat.

13.1.14.3. Menținerea depozitelor actualizate#

Un depozit care conține o adresă URL de actualizare este verificat de fiecare dată când se lansează IDE-ul. Când este disponibil conținut mai nou, IDE-ul vă spune ce – enumerând fiecare depozit și versiunile implicate – și vă oferă să îl instalați, totul într-un singur prompt. Verificarea actualizărilor execută aceeași verificare la cerere.

13.1.14.4. Prioritate și suprascrieri#

Arhivele sunt o listă ordonată, cu cea mai mare prioritate în partea de sus, iar Mutați în sus și Mutați în jos o reordonează pe cea selectată. Ordinea contează doar atunci când două surse furnizează lucrul same: o placă cu același identificator USB sau un exemplu, model sau stub cu același nume. Când se întâmplă asta, intrarea mai mare câștigă și fiecare depozit câștigă asupra conținutului încorporat al OpenMV. Acest lucru este deliberat - este modul în care un furnizor își furnizează propriul firmware pentru o placă care partajează identificatorul USB al plăcii OpenMV, înlocuind firmware-ul stoc pe care IDE-ul l-ar oferi altfel pentru aceasta sau înlocuiește un exemplu de stoc cu unul scris pentru hardware-ul său.

Deoarece o modificare în tăcere schimbă ceea ce face un nume familiar, pagina nu ascunde niciodată unul. Panoul de avertismente de anulare listează fiecare înlocuire în vigoare – care placa de depozitare, exemplu, model sau stub îl înlocuiește pe care – și aceeași listă apare o dată ca mesaj la prima vedere un depozit. Dacă o placă, un exemplu sau un model nu se comportă așa cum descrie documentația OpenMV, acest panou este primul loc în care să te uiți.

13.1.14.5. Ce oferă un depozit#

Cele patru tipuri de conținut apar fiecare la locul lor obișnuit în IDE, așa că odată ce un depozit este instalat, nu mai este nimic nou de învățat:

  • Boards and firmware. Placa unui depozit se comportă exact ca o placă OpenMV – este recunoscută la conectare, tipul său este afișat în bara de stare și actualizările de firmware prin intermediul IDE-ului, inclusiv calea Instalați cea mai recentă versiune de dezvoltare. Vezi Actualizări și recuperare firmware.

  • Examples. Exemplele unui depozit apar în Fișier → Exemple, îmbinate în arborele de categorii: un exemplu dintr-o categorie numită de furnizor la fel ca o categorie OpenMV se află alături de cele OpenMV, iar o nouă categorie devine propriul submeniu. Sunt filtrate la plăcile pe care le suportă ca orice exemplu. Vezi Scripturi, exemple și dosarul de documente.

  • Models. Modelele unui depozit apar în Model Zoo, îmbinate în arborele browser în același mod, cu descrierile proprii ale furnizorului.

  • Stubs. Un depozit poate expedia .pyi fișiere stub, astfel încât editor oferă completare, semnături și documentație pentru funcțiile pe care le adaugă firmware-ul său – aceeași completare pe care o obțineți pentru modulele proprii OpenMV, pentru API-ul personalizat al unui furnizor.

13.1.14.6. Crearea unui depozit#

Un depozit este un folder numit pentru furnizor, care deține un manifest config.json și un subdosar pentru fiecare tip de conținut pe care îl oferă:

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

Numele folderului este id-ul depozitului: litere mici, cifre, - și _, începând cu o literă. Fiecare folder de piese este opțional; trimite doar ceea ce ai. Lângă fiecare folder parte este un fișier <part>.version care conține un singur șir de versiune (1.2.0) pe care IDE-ul îl folosește pentru a decide când o actualizare este mai nouă.

13.1.14.6.1. Manifestul#

config.json denumește depozitul și, pentru fiecare parte, indică o arhivă descărcabilă:

{
  "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 trebuie să se potrivească cu numele folderului. configUrl este adresa la care este găzduit același fișier; IDE-ul îl preia din nou pentru a verifica dacă există actualizări, așa că omiteți-l doar pentru un depozit care nu se va actualiza niciodată. Fiecare parte are un canal release, iar firmware-ul poate avea, de asemenea, un canal development utilizat de Instalați cea mai recentă versiune de dezvoltare. Valorile eliberarii version sunt comparate ca numere, astfel încât una mai mare este oferită ca actualizare; versiunile de dezvoltare sunt comparate doar pentru modificare. sha256 este opțional, dar este verificat atunci când este prezent.

Fiecare url indică un .zip (doar zip). O arhivă deține exact one top-level folder, iar IDE-ul instalează contents al acelui folder ca parte – deci arhiva de firmware este ambalată astfel:

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 despachetează în folderul firmware/ afișat mai devreme. Arhivele de exemple, modele și stub-uri sunt ambalate în același mod – un dosar de ambalare care conține ceea ce ar sta în interiorul examples/, models/ sau stubs/. Numele folderului de împachetare este ignorat; ceea ce contează este că există exact unul. Arhivarea fișierelor la rădăcina arhivei fără un folder de împachetare sau împachetarea lor în mai mult de un folder, nu se va instala. Cea mai simplă modalitate de a le face corect este să arhivați folderul în sine – selectați acme-firmware și comprimați-l, în loc să-i selectați conținutul.

13.1.14.6.2. Plăci, exemple, modele și cioturi#

firmware/settings.json utilizează același format de descriere a plăcii ca și firmware-ul livrat de IDE; adăugați o intrare boards pentru fiecare dintre panourile dvs. Câteva reguli sunt specifice plăcilor terță parte: boardFirmwareFolder trebuie să fie unic (nu este încă folosit de OpenMV sau alt furnizor, deoarece numește folderul în care locuiesc binarele), fiecare placă trebuie să aibă propriul firmware_version (acesta este ceea ce conduce promptul de actualizare la conectare), iar o placă poate seta boardFirmwareFolderAlias la numele de firmware al plăcii OpenMV în folderul său. exemplele și modelele stoc ale plăcii – trapa de evacuare pentru o placă care este compatibilă cu firmware-ul cu una OpenMV. Se așteaptă reutilizarea identificatorilor de bootloader OpenMV (acestea poartă driverele Windows semnate); un identificator de aplicație care se ciocnește de o placă încorporată suprascrie acea placă, pe care panoul de avertismente de anulare o raportează.

Exemplele merg în foldere de categorii numerotate precum OpenMV (01-Getting-Started); o categorie pe care o numești la fel ca și una OpenMV se intercalează în ea, iar un nou nume devine propria sa secțiune de meniu. Un model este un folder care conține .tflite și un .txt de etichete de clasă, grupate sub un folder al cărui index.html (și o imagine opțională) este descrierea afișată lângă el în Model Zoo. examples/index.csv și models/index.csv sunt aceleași fișiere cu filtru de placă și senzori pe care le folosesc exemplele și modelele OpenMV, potrivite cu exemplul și căile modelului dvs. și decideți care dintre dvs. arată pentru ce placă. Stub-urile sunt fișiere obișnuite .pyi; IDE-ul predă folderul lor către serverul de limbă, astfel încât să rezolve împreună cu OpenMV, iar un stub numit pentru un modul existent (csi.pyi) suprascrie finalizarea acelui modul.

13.1.14.6.3. Publicare și actualizare#

Pentru a publica, găzduiește config.json și arhivele la care face referire la adrese URL stabile și oferă utilizatorilor adresa URL config.json de la care să se instaleze. Funcționează oriunde care servește fișiere simple prin HTTPS – un server web, un depozit de obiecte sau o gazdă de cod. Pentru a expedia o actualizare, încărcați arhive noi, ridicați valorile version afectate în config.json găzduite, iar data viitoare când IDE-ul fiecărui utilizator se lansează, acesta oferă actualizarea. Utilizatorii care au instalat depozitul printr-un program de instalare primesc actualizări în același mod, atâta timp cât config.json instalat poartă un configUrl.

13.1.14.6.4. Găzduire pe GitHub#

GitHub este o gazdă convenabilă, iar IDE-ul preia de la ea în același mod în care își preia propriile resurse. Sunt două piese de plasat: manifestul și arhivele.

Păstrați config.json într-un depozit și oferiți utilizatorilor adresa URL raw – adresa la care este difuzat direct fișierul, nu pagina GitHub care îl afișează. Butonul Raw de pe fișier îl arată; are forma

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

Acea adresă URL brută este ceea ce un utilizator lipește în Instalare din URL și ceea ce ați introdus în propriul configUrl al manifestului, astfel încât IDE-ul îl preia din nou pentru a verifica dacă există actualizări. Arătarea acestuia către o ramură (main) înseamnă împingerea unui nou commit publică modificarea; îndreptându-l spre o etichetă, utilizatorii vor fi îndreptați către o versiune fixă.

Găzduiește arhivele .zip ca release assets, mai degrabă decât să le comite – versiunile sunt create pentru descărcări binare, astfel încât un pachet de firmware de mai mulți megaocteți aparține acolo, nu în istoricul depozitului. Atașați fiecare arhivă la o versiune GitHub și utilizați adresa URL de descărcare a acesteia, care are formularul

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

în câmpurile url ale manifestului, fiecare cu sha256 al arhivei. Expedierea unei actualizări este atunci: atașați noile arhive la o versiune, editați config.json pentru a le indica și pentru a elimina versiunile și comite. IDE-ul preia modificarea la următoarea lansare (fișierul brut este servit printr-un cache care se reîmprospătează în câteva minute de la push).