Вопрос или проблема
С более мощным графическим адаптером появляется возможность играть в игры на Linux (в основном используя Lutris/Wine).
У меня классический набор джойстиков CH Products (Fighterstick, Pro Throttle и Pro Pedals), в основном для авиасимуляторов. Большинство современных игр поддерживают несколько джойстиков, и в этом плане все хорошо. Однако эта довольно старая игра поддерживает только один джойстик. Поэтому я подумал объединить их (как в старые добрые времена с CH Control Manager), чтобы создать один, но мощный джойстик для использования в игре.
К сожалению, попытка установить упомянутое программное обеспечение внутри префикса Wine ни к чему не привела (джойстики не были распознаны программным обеспечением). Поэтому я задумался о другом подходе: привязать джойстики с платформы хоста (то есть, из Linux). Все равно я почти всегда использую их вместе.
Это возможно? Если да, то как? В поисках в интернете я нашел несколько статей по переназначению кнопок и тому подобного (главным образом для Ubuntu), но ничего новее 2016 года, и все они, похоже, заброшенные проекты.
Если, с другой стороны, у кого-то есть опыт запуска CH Control Manager в Wine, это было бы тоже полезно.
https://sourceforge.net/projects/linuxjoymap/
Эта программа может вам помочь. (Я отвечаю на это сообщение, несмотря на его возраст, потому что, похоже, есть и другие сайты с похожими вопросами.)
Ответ или решение
Объединение нескольких джойстиков в один виртуальный на платформе Linux становится все более актуальной задачей, особенно с учетом увеличения мощности графических адаптеров, что позволяет запускать более требовательные игры через такие инструменты как Lutris или Wine. В частности, возникает потребность объединить классический набор джойстиков от CH Products, таких как Fighterstick, Pro Throttle и Pro Pedals, в один виртуальный контроллер для игр, которые поддерживают только одно устройство управления.
Теоретические основы (Theory)
Возможность объединения нескольких физических устройств ввода в одно виртуальное – это задача, которая чаще всего решается путем создания программного уровня абстракции входных данных. Простейший способ достижения этого – использование программного обеспечения, которое способно перехватывать и преобразовывать потоки данных от нескольких устройств в единый поток, маскируя его как данные от одного устройства. На Windows эта функция реализовывалась при помощи Control Manager от CH Products. На платформе Linux аналогов, к сожалению, значительно меньше, и их сложнее использовать из-за узкой направленности и ограниченной поддержки.
С точки зрения архитектуры операционной системы Linux, данная задача должна решаться на уровне пользовательского программного обеспечения, которое взаимодействует с модулем ядра evdev
, обрабатывающим событийные устройства. Поток данных от каждого джойстика должен быть перехвачен, переинтерпретирован и передан на выход как от единого устройства.
Примеры использования (Example)
Один из подходов к решению данной задачи – использование утилит и скриптов для создания виртуальных устройств. Например, uinput
– это интерфейс ядра Linux, который позволяет создавать виртуальные устройства, и можно потенциально использовать его для объединения нескольких исходных устройств. При помощи этого интерфейса возможно написать скрипт, который управляет объединением данных от всех джойстиков в одно виртуальное устройство.
Рассмотрим пример использования uinput
в сочетании с Python. Библиотеки, такие как evdev
и python-uinput
, позволяют перехватывать события джойстика, обрабатывать их и передавать обработанные данные в созданное виртуальное устройство через uinput
. Это возможно благодаря тому, что каждая из библиотек предоставляет доступ к низкоуровневым событиям устройств входа и позволяет манипулировать ими в пользовательском программном обеспечении.
Применение (Application)
Для реализации идеи объединения джойстиков в одно устройство на Linux, следует предпринять следующие шаги:
-
Установка необходимых библиотек и утилит:
- Установите необходимые библиотеки для работы с
evdev
иuinput
. Это можно сделать через менеджер пакетов вашей системы, например, используяapt
на дистрибутивах, основанных на Debian:sudo apt-get install python3-evdev python3-uinput
- Установите необходимые библиотеки для работы с
-
Создание скрипта для объединения данных:
- Напишите Python скрипт, который использует библиотеки
evdev
иuinput
для захвата данных от всех используемых джойстиков и обработки этих данных до объединения их в одно виртуальное устройство.
import evdev import uinput devices = [evdev.InputDevice(path) for path in evdev.list_devices()] # Identify your devices stick = devices[0] # Предположим, что это ваш джойстик throttle = devices[1] # Это Throttle pedals = devices[2] # Это Pedals # Configure the virtual device capabilities = { uinput.ABS_X: (0, 255, 0, 0), uinput.ABS_Y: (0, 255, 0, 0), # Добавьте остальные элементы управления, например кнопки } with uinput.Device(events=capabilities.keys()) as virtual_device: async for event in devices[0].async_read_loop(): # Обработка события и отправка в виртуальное устройство if event.type in (evdev.ecodes.EV_ABS, evdev.ecodes.EV_KEY): virtual_device.emit(event.code, event.value)
- Напишите Python скрипт, который использует библиотеки
-
Запуск и тестирование:
- Проверьте работу виртуального устройства в вашей игровой среде для проверки его функциональности.
-
Устранение ошибок и оптимизация:
- Убедитесь, что ваш скрипт обрабатывает все важные события всех устройств, и отлаживайте его для учета любых нештатных ситуаций.
Несмотря на сложность, данный метод предоставляет гибкость в определении, какие именно уязвимости любого из джойстиков вы хотите использовать. Однако стоит помнить, что отсутствие общего GUI инструментария делает данный подход сложным в начале для неподготовленных пользователей, и скорее всего потребует специфического подтягивания навыков у пользователя. Впрочем, это может быть вынужденной мерой, так как софт для Windows, такой как Control Manager от CH Products, возможно потребует более сложных ухищрений для запуска через Wine из-за проблем с обнаружением оборудования.