13.1.14. Сторонние репозитории#

IDE поставляет собственные платы OpenMV, встроенное ПО, примеры, модели машинного обучения и заглушки редактора, но она также может загружать те же виды контента от других компаний - плату, созданную партнером, встроенное ПО, которое работает на нем, примеры и модели, настроенные для него, а также завершение кода для API, которые добавляет встроенное ПО. Они поступают как third-party repositories: папки содержимого, которые IDE объединяет со своим собственным и поддерживает актуальность.

У этой страницы две аудитории. Большая часть из них предназначена для тех, кто устанавливает и управляет репозиторием, опубликованным кем-то другим. Последний раздел, authoring a repository, предназначен для здания продавца.

13.1.14.1. Страница сторонних репозиториев#

Все управляется из меню «Правка» → «Настройки» → «OpenMV» → «Сторонние репозитории». В таблице перечислены все установленные репозитории и для каждого из них указаны отображаемое имя, краткий идентификатор (Built-in или User), установленная версия каждого типа предоставляемого им контента (прошивка, примеры, модели, заглушки) и URL-адрес, с которого он обновляется.

Built-in означает, что репозиторий был помещен в собственный каталог приложения установщиком, предоставленным поставщиком, так же, как пакет драйверов добавляет файлы в программу. User означает, что вы установили его самостоятельно по URL-адресу. Единственное практическое отличие состоит в том, что вы не можете удалить встроенный репозиторий из IDE — он удаляется путем удаления всего, что его туда поместило, — поэтому кнопка «Удалить» для него отключена.

13.1.14.2. Установка репозитория#

Установка по URL-адресу запрашивает адрес репозитория config.json — небольшого файла манифеста, который публикует поставщик — и устанавливает все, на что указывает. Вставьте URL-адрес, который вам предоставил поставщик; IDE загружает манифест, извлекает прошивку, примеры, модели, заглушает их списки и проверяет каждую загрузку. Установка, удаление и обновление репозитория вступают в силу после перезагрузки, поэтому IDE предлагает перезагрузку после завершения установки.

Поставщик также может распространять репозиторий в виде установщика, который помещает его прямо в каталог приложения, и в этом случае он просто отображается в виде строки Built-in при первом открытии страницы — ничего устанавливать не нужно.

13.1.14.3. Поддержание репозиториев в актуальном состоянии#

Репозиторий, содержащий URL-адрес обновления, проверяется при каждом запуске IDE. Когда доступен новый контент, IDE сообщает вам, что именно, — перечисляя каждый репозиторий и задействованные версии — и предлагает его установить, и все это в одном приглашении. Проверка обновлений выполняет ту же проверку по требованию.

13.1.14.4. Приоритет и переопределения#

Репозитории представляют собой упорядоченный список, наивысший приоритет находится вверху, а функции Move Up и Move Down изменяют порядок выбранного. Порядок имеет значение только тогда, когда два источника предоставляют вещь same: плата с одинаковым идентификатором USB или пример, модель или заглушка с тем же именем. Когда это происходит, выигрывает запись с более высоким значением, и каждый репозиторий выигрывает у встроенного контента OpenMV. Это намеренно - так поставщик предоставляет свою собственную прошивку для платы, которая использует идентификатор USB платы OpenMV, заменяя стандартную прошивку, которую в противном случае предложила бы для нее IDE, или заменяет стандартный пример прошивкой, написанной для их оборудования.

Поскольку переопределение незаметно меняет действие знакомого имени, страница никогда его не скрывает. На панели предупреждений о переопределении перечислены все действующие переопределения (какая плата репозитория, пример, модель или заглушка какое переопределяет), и тот же список появляется один раз в виде сообщения при первом просмотре репозитория. Если плата, пример или модель не ведут себя так, как описано в документации OpenMV, в первую очередь следует посмотреть эту панель.

13.1.14.5. Что дает репозиторий#

Каждый из четырех типов контента появляется на своем обычном месте в IDE, поэтому после установки репозитория вам не придется изучать ничего нового:

  • Boards and firmware. Плата репозитория ведет себя точно так же, как плата OpenMV — она распознается при подключении, ее тип отображается в строке состояния, а ее встроенное ПО обновляется через IDE, включая путь установки последней версии разработки. См. Обновление и восстановление прошивки.

  • Examples. Примеры репозитория отображаются в меню «Файл» → «Примеры» и объединены в дерево категорий: пример в категории, названной поставщиком так же, как категория OpenMV, находится рядом с категориями OpenMV, а новая категория становится отдельным подменю. Они фильтруются по доскам, которые они поддерживают, как и любой другой пример. См. Скрипты, примеры и папка документов.

  • Models. Модели репозитория появляются в Model Zoo и таким же образом объединяются с деревом браузера с собственными описаниями поставщика.

  • Stubs. Репозиторий может отправлять файлы-заглушки .pyi, поэтому editor предлагает завершение, подписи и документацию для функций, которые добавляет его прошивка - то же самое завершение, которое вы получаете для собственных модулей OpenMV, для пользовательского API поставщика.

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 (01-Getting-Started); категория, которую вы называете так же, как категория OpenMV, чередуется с ней, и новое имя становится отдельным разделом меню. Модель — это папка, содержащая метки классов .tflite и соответствующие .txt, сгруппированные в папке, index.html (и необязательное изображение) которой является описанием, отображаемым рядом с ней в Зоопарке моделей. 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#

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 фиксирует изменения при следующем запуске (необработанный файл передается через кэш, который обновляется в течение нескольких минут после отправки).