Levels: Physical -> Virtual -> Logical 

Организация кнопочного ввода в контроллере NJoy32.


Когда мы нажимаем физическую  кнопку, сигнал обрабатывается контроллером, посылается в компьютер по шине USB и в виртуальном образе нашего контроллера в операционной системе (OC) будет нажата соответствующая кнопка ( здесь и далее будем называть такую кнопку логической - происхождение терминов берет начало в документе  USB-IF "Universal Serial Bus  HID Usage Tables"  ):

Теперь  игра или симулятор самолёта, или космического корабля способны узнать, - что наша кнопка нажата и выполнить какое либо действие. Иногда программы могут напрямую читать поток данных из контроллера минуя уровень ОС - но это крайне редкая ситуация, в основном игроделы пользуются стандартным Direct Input (Winows) со всеми его ограничениями и недостатками. Апплет устройства до сих пор не может показывать более 32 кнопок - хотя Direct Input, начиная с DX8, позволяет обеспечивать ввод 128 кнопок.

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

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

Контроллеры платформы NJoy32 позволяют произвольно изменять привязку (маппинг) кнопок.

Маппинг - в простейшем случае можно рассматривать как сопоставление физических и логических кнопок джойстика.

Кроме того, контроллеры NJoy32 позволяют сопоставить  не только  логические кнопки игрового контроллера, но также направления переключателей вида POV ( Point Of View ), клавиши виртуальной клавиатуры или кнопки виртуальной мыши.

Будем считать что ввод с физических линий (кнопок) происходит на так называемом физическом уровне, а собственно маппинг будет происходить в соответствии с настройками логического уровня. Физический уровень также необходим для определения функциональности устройств ввода.

 

Таковыми устройствами кроме кнопок могут быть тумблеры, энкодеры и некоторые другие устройства. Также на физическом уровне может быть переопределено назначение кнопок - например для использования кнопок в качестве модификаторов типа шифт/сабшифт, или в качестве указателей направления типа POV.

 

Но на самом деле в контроллере существует ещё один промежуточный уровень обработки - так называемый виртуальный уровень.

 

Когда мы нажимаем кнопку, сначала на физическом уровне определяется её функциональное назначение.

Затем, если это действительно просто кнопка, обработка передается дальше на виртуальный уровень и только потом - на логический уровень для финального маппинга.

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

 

Иногда нужно сделать маппинг одной физической кнопки на несколько логических - например с помощью модификаторов.

Рассмотрим простой случай - используем одну кнопку как модификатор типа шифт, а вторую уже будем мапить на две разных кнопки контроллера.

 

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


Удобным способом увеличения функциональности простой кнопки является так называемая функция TEMPO, когда мы можем генерировать разные виртуальные кнопки в зависимости от времени нажатия.


После того, как определены активные линии виртуального уровня, далее они обрабатываюся на логическом уровне.

Этот уровень связывает выходные контроллеры USB HID  устройств ( Joystick Buttons , Joystick  POV (HAT),  Keyboard, Mouse, System, Multimedia & Application controllers ) c активными линии виртуального уровня. Также на этом уровне может располагаться сервисная функция Macro.