4

У меня есть 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 ответа2

5

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

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

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

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

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

Из 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 просто для хорошей меры?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .