device: Correct axis mappings for FrSky RC controller on Windows

See #1218
This commit is contained in:
rdb 2021-12-26 12:22:39 +01:00
parent 8b19761844
commit f01399bba8

View File

@ -38,6 +38,9 @@ enum QuirkBits : int {
// Axes on the right stick are swapped, using x for y and vice versa. // Axes on the right stick are swapped, using x for y and vice versa.
QB_right_axes_swapped = 64, QB_right_axes_swapped = 64,
// Using an RC (drone) controller as a gamepad instead of a flight stick
QB_rc_controller = 128,
}; };
// Some nonstandard gamepads have different button mappings. // Some nonstandard gamepads have different button mappings.
@ -85,6 +88,10 @@ static const struct DeviceMapping {
{0x2563, 0x0523, InputDevice::DeviceClass::gamepad, QB_rstick_from_z | QB_no_analog_triggers, {0x2563, 0x0523, InputDevice::DeviceClass::gamepad, QB_rstick_from_z | QB_no_analog_triggers,
{"face_y", "face_b", "face_a", "face_x", "lshoulder", "rshoulder", "ltrigger", "rtrigger", "back", "start", "lstick", "rstick"} {"face_y", "face_b", "face_a", "face_x", "lshoulder", "rshoulder", "ltrigger", "rtrigger", "back", "start", "lstick", "rstick"}
}, },
// FrSky Simulator
{0x0483, 0x5720, InputDevice::DeviceClass::gamepad, QB_rc_controller,
{0}
},
{0}, {0},
}; };
@ -434,7 +441,11 @@ on_arrival(HANDLE handle, const RID_DEVICE_INFO &info, std::string name) {
switch (usage) { switch (usage) {
case HID_USAGE_GENERIC_X: case HID_USAGE_GENERIC_X:
if (_device_class == DeviceClass::gamepad) { if (_device_class == DeviceClass::gamepad) {
axis = Axis::left_x; if (quirks & QB_rc_controller) {
axis = Axis::right_x;
} else {
axis = Axis::left_x;
}
} else if (_device_class == DeviceClass::flight_stick) { } else if (_device_class == DeviceClass::flight_stick) {
axis = Axis::roll; axis = Axis::roll;
} else { } else {
@ -443,8 +454,12 @@ on_arrival(HANDLE handle, const RID_DEVICE_INFO &info, std::string name) {
break; break;
case HID_USAGE_GENERIC_Y: case HID_USAGE_GENERIC_Y:
if (_device_class == DeviceClass::gamepad) { if (_device_class == DeviceClass::gamepad) {
axis = Axis::left_y; if (quirks & QB_rc_controller) {
swap(cap.LogicalMin, cap.LogicalMax); axis = Axis::right_y;
} else {
axis = Axis::left_y;
swap(cap.LogicalMin, cap.LogicalMax);
}
} else if (_device_class == DeviceClass::flight_stick) { } else if (_device_class == DeviceClass::flight_stick) {
axis = Axis::pitch; axis = Axis::pitch;
} else { } else {
@ -461,6 +476,8 @@ on_arrival(HANDLE handle, const RID_DEVICE_INFO &info, std::string name) {
} else { } else {
axis = InputDevice::Axis::right_x; axis = InputDevice::Axis::right_x;
} }
} else if (quirks & QB_rc_controller) {
axis = InputDevice::Axis::left_y;
} else if ((quirks & QB_no_analog_triggers) == 0) { } else if ((quirks & QB_no_analog_triggers) == 0) {
axis = Axis::left_trigger; axis = Axis::left_trigger;
} }
@ -483,6 +500,8 @@ on_arrival(HANDLE handle, const RID_DEVICE_INFO &info, std::string name) {
if ((quirks & QB_no_analog_triggers) == 0) { if ((quirks & QB_no_analog_triggers) == 0) {
axis = Axis::left_trigger; axis = Axis::left_trigger;
} }
} else if (quirks & QB_rc_controller) {
axis = Axis::left_x;
} else { } else {
axis = Axis::right_x; axis = Axis::right_x;
} }