Документация Engee
Notebook

Ввод информации с USB джойстика

Разбираемся, как подключить USB джойстик к модели Engee чтобы получить возможность тестировать управление моделью или аппаратурой с реального устройства ввода.

copter_controller_video.gif

Описание задачи

К скриптам и моделям в Engee можно подключить любое оборудование, и в этом проекте мы демонстрируем возможность подключения HID устройств (Human Interface Device), подключенных к локальному компьютеру по USB. За общение с Engee отвечает подсистема Engee.Интеграция.

Установка подсистемы Engee.Интеграции

Выполните команду engee.package.install("Engee-Device-Manager") в командной строке, чтобы получить свой идентификатор и скачать клиентскую программу (ссылка появится в терминале, на нее можно будет нажать).

Получите токен доступа в разделе Связь и безопасность вашего личного кабинета Engee (раздел "Токены личного доступа").

После запуска программы engee-device-manager.exe (настроенной на ваш адрес и с действующим PAT-токеном) между Engee и локальным компьютером создается защищенный канал связи, позволяющий задействовать в единой модели локальные программные и аппаратные ресурсы.

Подключение к локальному оборудованию можно осуществлять через профиль HID который может быть настроен для устройств ввода, джойстиков, хобби-платформ вроде Arduino и многих других аппаратных инструментов.

Находим идентификаторы VID и PID нашего USB устройства

В Windows проверить наличие джойстика можно, набрав в окне вызова команд строку joy.cpl. Это второстепенный инструмент, который позволяет проверить подключенные джойстики, но он не покажет клавиатуры, мыши и Arduino.

Команда Get-PnpDevice -Class "HIDClass" | Select-Object FriendlyName, InstanceId позволяет увидеть VID и PID идентификаторы, которые нам будут нужны для настройки канала связи с оборудованием (джойстиком). Вот где их найти:

image.png

Числа 1781 и 0898 нужно перевести в десятеричный вид и можно использовать в последующих командах. В Linux те же действия осуществляет команда lsusb.

Следующим шагом проверим подключение:

In [ ]:
hid = Main.EngeeDeviceManager.Devices.HID.Hid(6017,2200)
Out[0]:
Main.EngeeDeviceManager.Devices.HID.Hid("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c"), ["read", "write", "close", "start_stream", "list_hid_id"], "Hid_236b86c9-cb25-4ef2-ad1f-1b984d70885c_reply", Main.EngeeDeviceManager.Devices.HID.var"#read#read##0"{String, Base.UUID}("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c")), Main.EngeeDeviceManager.Devices.HID.var"#write#write##0"{String, Base.UUID}("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c")), Main.EngeeDeviceManager.Devices.HID.var"#close#close##0"{String, Base.UUID}("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c")), Main.EngeeDeviceManager.Devices.HID.var"#start_stream#start_stream##0"{String, Base.UUID}("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c")), Main.EngeeDeviceManager.Devices.HID.var"#list_hid_id#list_hid_id##0"{String, Base.UUID}("Hid", Base.UUID("236b86c9-cb25-4ef2-ad1f-1b984d70885c")))

Из этого канала можно считывать данные, указывая размер пакета. Размер полученного вектора ограничен количеством информации, которую присылает устройство.

In [ ]:
Main.EngeeDeviceManager.Devices.HID.read( hid, 8 )
Out[0]:
8-element Vector{UInt8}:
 0x98
 0x00
 0x87
 0x04
 0x6c
 0x04
 0xfb
 0x00

Мы прочитали пакет размером 8 байт, который отражает актуальное положение ручек и кнопок пульта управления. Дальше этот пакет можно преобразовывать и перекомпоновывать чтобы извлечь нужную информацию.

Чтение данных с USB/HID устройства в модель Engee

Получение свежих данных с реального оборудования и отправка их в модель Engee не намного труднее получения этой информации в скрипте. Прежде всего, создаем модель с блоком Engee Function:

In [ ]:
engee.open("usb_controller_example.engee")
image.png

Код этого компонента содержит следующие строки:

package_dir = "/internal_persistent_vol/support_packages/locations/Engee-Device-Manager/EngeeDeviceManager.jl"

if !isdefined(Main, :EngeeDeviceManager)
    include("$(package_dir)/src/EngeeDeviceManager.jl")
end

using .EngeeDeviceManager.Devices: HID

mutable struct Block <: AbstractCausalComponent
    hid::Any
    function Block()
        hid = HID.Hid(6017,2200)
        return new(hid)
    end
end

После инициализации идёт код, который выполняется на каждом шаге вычисления модели:

function (c::Block)(t::Real)
    return HID.read(c.hid, 8)
end

В результате мы получаем компонент, который читает данные с пульта управления и отправляет числа в модель.

Шаги для запуска этой модели

Минимальные шаги для создания рабочего окружения, где эта модель будет работать, следующие:

  • запустить программу Engee.Интеграции (возможно, будет осуществлено обновление)
  • нажать "Подключиться" (подключение обычно занимает секунд 10)
  • подключить оборудование к локальному компьютеру
  • запустить модель (включив замедление в настройках, чтобы модельное время шло в том же темпе что и реальное время пользователя).

Заключение

Мы без особого труда подключили джойстик к среде Engee, и можем управлять параметрами моделей, физикой или работой автоматики.