Linux-джойстик кажется неправильно откалиброванным в SDL-игре (Freespace 2 Open)

У меня есть USB-джойстик (Saitek Cyborg 3D), который отображается на моем недавно установленном Ubuntu 9.04 как /dev/input/js0, а также jstest показывает значения в диапазоне +-32767, как я и ожидал. Я только что выкопал копию FreeSpace Open, игры, которая использует SDL и работала без проблем на предыдущей установке Ubuntu около года назад, и джойстик кажется очень неправильно откалиброванным. Все оси (X, Y, твист, дроссель) кажутся смещенными как минимум на 20%. Оси X и Y, по крайней мере, определенно не достигают своих конечных точек.

Соответствующее сообщение в списке рассылки SDL в январе 2009 года не получило конкретных ответов.

Вот радость-unix.cpp из источника проекта. Я не совсем запускаю транк, но, как вы можете видеть из журнала ревизий, никаких изменений кода в этом файле не происходило более 3 лет.

2 ответа

Решение

Я заметил проблему в d2x (порт спуска), который также использует SDL, поэтому я начал копаться в SDL. testjoystick из источника SDL показал проблему также. Глядя на драйвер джойстика SDL Linux, проблема упоминается. Ищи joydev_pattern в этом файле и вы увидите, что они делают; ищи calibrate и они упоминают эту проблему. В основном они используют /dev/input/event6 (или какой бы то ни было) предпочтение /dev/input/js0если не скомпилировано с --disable-input-events, даже зная, что устройство событий не может быть откалибровано (т.е. калибровка установлена ​​на js0 будут игнорироваться).

Найдя все это, Google выполняет поиск с configure опцию раскрыть, что скрыто в комментариях к Linux Howto для fs2_openУ кого-то уже была эта проблема.

Я сообщил об этой ошибке в Ubuntu. Чтобы обойти, выберите любой из:

  • Задавать SDL_JOYSTICK_DEVICE=/dev/input/js0 (вы могли бы положить это в /etc/environment и перезагрузите, чтобы применить его везде). Изменить: SDL по-прежнему будет иметь evdev устройство как второй джойстик, поэтому в играх вроде d2x которые по умолчанию реагируют и на второй джойстик, зайдите на экран параметров и удалите эти дополнительные привязки.
  • Перекомпилируйте libSDL с --disable-input-events,
  • rmmod evdev (вполне вероятно, потерять любые необычные устройства ввода у вас есть).

Похоже, игра должна быть снабжена значениями min / max / center axis от джойстика. Значения по умолчанию могут быть 0/32768/65536, а не -32676/0/32760, вы видите? Это более очевидно, что скидка более чем на 20%, поэтому, возможно, в какой-то момент он пытается выполнить автоматическую калибровку. Это также выглядит как joytest2 Команда console может отображать внутриигровые значения, которые могут дать некоторую дополнительную информацию.

От joy_init() :

// Fake a calibration
if (joy_num_sticks > 0) {
    for (i=0; i<JOY_NUM_AXES; i++) {
        joystick.axis_center[i] = 32768;
        joystick.axis_min[i] = 0;
        joystick.axis_max[i] = 65536;
    }
}

Я вижу функцию калибровки ( joy_cheap_cal() в joy.cpp:454 ) но не сразу очевидно откуда это вызывается или есть ли в игре другие методы для повторной калибровки значений осей. Я люблю Freespace, поэтому, когда я вернусь домой, я скачаю код и немного покопаюсь. Вы также можете попробовать запустить jscal просто для хорошей меры?

Другие вопросы по тегам