LINUX.ORG.RU

SDL Joystick подключение нового джойстика

 


0

1

Задача в чем - необходимо корректно обрабатывать отключение и подключение джойстиков в системе. Для работы с джойстиками используется SDL1.2

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

  SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
  SDL_InitSubSystem(SDL_INIT_JOYSTICK);

Это делаем и все бы здорово, но рассмотрим ситуацию, когда один джойстик подключен, а другой нет.

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

SDL_JoystickUpdate() после переинициализации не помогает.

В доках пишут - если эта функция SDL_JoystickGetAxis() выдает ноль, то смотри SDL_GetError(). Там все чисто.

Как бы это обойти или что я делаю не так? Мне необходимо истинное положение джойстика после инициализации.


А какой стейт передаете в SDL_JoystickEventState(int state)?
Почему SDL_JoystickGetAxis() а не обработчик событий?

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

А какой стейт передаете в SDL_JoystickEventState(int state)?

Я этот метод не дергаю. Стоит по умолчанию, события приходят. Разницу между QUERY и ENABLE не понял: что очередь включена, что нет - проблему это не решает.

Почему SDL_JoystickGetAxis() а не обработчик событий?

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

Burns ()

в общем чуть лучше работать не через SDL, а читать из самого устройства /dev/input/jsX https://github.com/drewnoakes/joystick

чуть лучше чем:

1. При подключении приходит состояние всех кнопок и осей
2. Можно отдельно отключать джойстик, а не переинициализировать всю систему в целом.
3. Время переинициализации для одного джойстика в 1000 раз быстрее.

но все же не идеально:

1. При включении состояние осей не всегда корректно определяется. Иногда при инициализации проскакивает -32767. Но это лучше чем ноль, потому что его легче отфильтровать в случае джойстика

Burns ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.