Steel Battalion - это игра о боях с роботами, выпущенная в 2002 году для оригинального XBox, известная по сей день своим массивным контроллером с двумя ручками, педалями и другими кнопками, которые вы можете сосчитать. Недавно мне попался один такой контроллер, и в итоге я написал драйвер, чтобы он работал на современном ПК.

Зачем это делать?

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

Не так давно в разговоре с Хосе, который занимается звуком для игры, я мимоходом сказал, что было бы здорово играть в игру двумя джойстиками, как будто быть максимально похожим на то, как работает настоящая машина. Он ответил, что знает пару старинных двойных джойстиков, которые могут работать, и настоял на том, чтобы я попробовал получить аналоговый джойстик для PlayStation. Я сказал, что у меня много другой работы над игрой, и мне не хотелось поддерживать непонятный контроллер, но несколько дней спустя он появился с картонной коробкой военного вида, в которой находился самый большой контроллер, который я когда-либо видел, и я прогнулся.

Как я это сделал?

Steel Battalion - это игра для оригинальной XBox, и она не сразу подключается к ПК.

К счастью, XBox - это, по сути, ПК, а контроллеры - стандартные USB 1.0, только с другим разъемом; Мне потребовалось около пяти минут поиска в Интернете, чтобы найти готовый адаптер по разумной цене.

Однако я не хотел ждать доставки, поэтому в конце концов занялся чем-то другим. Последняя часть кабеля контроллера Xbox является съемной, чтобы не тянуть за консоль, если вы наступите на нее. То же самое и с XBox 360, который использует стандартные порты USB. С небольшой модификацией мне удалось подключить разъединитель 360 к оригинальному контроллеру Xbox, а затем подключить контроллер к ПК.

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

Спецификация USB-HID позволяет устройству USB сообщать системе о своем поведении; например. устройство может сказать, что это геймпад с множеством кнопок и осей. Это наиболее распространенный способ реализации универсальных устройств ввода в играх и других программах, и именно такой подход я выбрал.

Написание драйвера

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

Существует много информации о написании драйверов, предоставленной самой Microsoft. Честно говоря, это было слишком много для тех, кто хочет, чтобы что-то работало быстро, поэтому я сразу перешел к примерам.

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

Для компиляции проекта вам понадобятся обычные вещи: Visual Studio, Windows SDK и Windows Driver Kit. Как только я его скомпилировал, я начал сокращать код. Я не буду здесь вдаваться в код драйвера, но я немного объясню, как работает USB-соединение и как я получил информацию, необходимую для реализации драйвера.

Часть информации, которую USB-устройства предоставляют системе, заключается в том, как читать и записывать данные с них и в них. Эта информация предоставляется как дескриптор конечной точки. Мы можем взглянуть на эти дескрипторы с помощью такой программы, как USB Device Monitor Studio.

Как мы видим, у Steel Battalion Controller есть две конечные точки: одна для чтения, а другая для записи. Мне было интересно прочитать любую информацию, которую присылает устройство. После множества захватов при нажатии кнопок и перемещении рычагов в контроллере я расшифровал 32 байта следующим образом:

Затем мне пришлось написать отчет HID, чтобы придать смысл этим данным. Для этого мне пришлось создать дескриптор отчета HID. Консорциум USB предоставляет инструмент дескриптора HID для создания этой информации. Мой выглядит так:

Вы могли заметить, что дескриптор не совсем соответствует данным. Я обнаружил проблемы со знаковыми значениями на некоторых осях, поэтому решил преобразовать их все в беззнаковые и немного упростить отчет.

После всей этой работы теперь Windows определяет контроллер как геймпад, у которого есть много кнопок и осей (некоторые из них имеют специальное использование, например, дроссельная заслонка или тормоз), и другие менее распространенные функции, такие как переключатель и « выбор оружия ».

Использование контроллера

Игра уже поддерживает HID-устройства, такие как контроллеры DualShock, поэтому после того, как контроллер Steel Battalion был правильно обнаружен, остальное было относительно легко - вопрос поиска хорошего сопоставления.

Помните, оправданием для всей этой работы было сыграть в BH Trials с двойным джойстиком - вот он!

Предостережения

Драйверы Windows 10 должны быть подписаны сертификатом от доверенного центра сертификации, который стоит несколько сотен долларов. Кроме того, в последних версиях они также должны быть сертифицированы самой Microsoft. На данный момент я не думаю, что смогу оправдать расходы, но есть обходной путь.

Вы по-прежнему можете использовать драйвер, установив операционную систему в режим «тестовой подписи». Вам нужно будет перезагрузить систему, чтобы включить режим, и вы, вероятно, захотите вернуться в нормальный режим после того, как закончите его использовать. Это не оптимально, но и несложно.

Самостоятельное использование драйвера

Код и двоичные файлы для драйвера доступны на github / steelbattaliondriver. Если вам нужно пошаговое руководство по его установке, я написал его здесь: Как использовать Steel Battalion Controller в Windows 10