device: Linux fixes for Trust GXT 24 and a few other cheap gamepads

Fixes #576
This commit is contained in:
rdb 2019-05-12 20:34:19 +02:00
parent c1c74e2cd3
commit 750afbb188

View File

@ -65,6 +65,12 @@ enum QuirkBits {
// Axes on the right stick are swapped, using x for y and vice versa.
QB_right_axes_swapped = 64,
// Has no trigger axes.
QB_no_analog_triggers = 128,
// Alternate button mapping.
QB_alt_button_mapping = 256,
};
static const struct DeviceMapping {
@ -85,10 +91,14 @@ static const struct DeviceMapping {
{0x28de, 0x1142, InputDevice::DeviceClass::unknown, QB_steam_controller},
// Jess Tech Colour Rumble Pad
{0x0f30, 0x0111, InputDevice::DeviceClass::gamepad, QB_rstick_from_z | QB_right_axes_swapped},
// SPEED Link SL-6535-SBK-01
{0x0079, 0x0006, InputDevice::DeviceClass::gamepad, 0},
// Trust GXT 24
{0x0079, 0x0006, InputDevice::DeviceClass::gamepad, QB_no_analog_triggers | QB_alt_button_mapping},
// 8bitdo N30 Pro Controller
{0x2dc8, 0x9001, InputDevice::DeviceClass::gamepad, QB_rstick_from_z},
// Generic gamepad
{0x0810, 0x0001, InputDevice::DeviceClass::gamepad, QB_no_analog_triggers | QB_alt_button_mapping | QB_rstick_from_z | QB_right_axes_swapped},
// Generic gamepad without sticks
{0x0810, 0xe501, InputDevice::DeviceClass::gamepad, QB_no_analog_triggers | QB_alt_button_mapping},
// 3Dconnexion Space Traveller 3D Mouse
{0x046d, 0xc623, InputDevice::DeviceClass::spatial_mouse, 0},
// 3Dconnexion Space Pilot 3D Mouse
@ -497,8 +507,10 @@ init_device() {
axis = InputDevice::Axis::right_x;
}
} else if (_device_class == DeviceClass::gamepad) {
axis = InputDevice::Axis::left_trigger;
have_analog_triggers = true;
if ((quirks & QB_no_analog_triggers) == 0) {
axis = InputDevice::Axis::left_trigger;
have_analog_triggers = true;
}
} else if (_device_class == DeviceClass::spatial_mouse) {
axis = InputDevice::Axis::z;
} else {
@ -527,8 +539,13 @@ init_device() {
axis = InputDevice::Axis::right_y;
}
} else if (_device_class == DeviceClass::gamepad) {
axis = InputDevice::Axis::right_trigger;
have_analog_triggers = true;
if ((quirks & QB_no_analog_triggers) == 0) {
axis = InputDevice::Axis::right_trigger;
have_analog_triggers = true;
} else {
// Special weird case for Trust GXT 24
axis = InputDevice::Axis::right_y;
}
} else {
axis = InputDevice::Axis::yaw;
}
@ -548,8 +565,10 @@ init_device() {
break;
case ABS_GAS:
if (_device_class == DeviceClass::gamepad) {
axis = InputDevice::Axis::right_trigger;
have_analog_triggers = true;
if ((quirks & QB_no_analog_triggers) == 0) {
axis = InputDevice::Axis::right_trigger;
have_analog_triggers = true;
}
} else {
axis = InputDevice::Axis::accelerator;
}
@ -974,6 +993,26 @@ map_button(int code, DeviceClass device_class, int quirks) {
// BTN_THUMB and BTN_THUMB2 detect touching the touchpads.
return ButtonHandle::none();
} else if (device_class == DeviceClass::gamepad &&
(quirks & QB_alt_button_mapping) != 0) {
static const ButtonHandle mapping[] = {
GamepadButton::face_y(),
GamepadButton::face_b(),
GamepadButton::face_a(),
GamepadButton::face_x(),
GamepadButton::lshoulder(),
GamepadButton::rshoulder(),
GamepadButton::ltrigger(),
GamepadButton::rtrigger(),
GamepadButton::back(),
GamepadButton::start(),
GamepadButton::lstick(),
GamepadButton::rstick(),
};
if ((code & 0xf) < 12) {
return mapping[code & 0xf];
}
} else if (device_class == DeviceClass::gamepad) {
// Based on "Jess Tech Colour Rumble Pad"
static const ButtonHandle mapping[] = {