mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-10-03 00:18:28 +00:00
Implement SInput Device Support (#13343)
This implements a new SDL HID driver for a format developed by Hand Held Legend for their gamepad devices called SInput Devices that are supported by this change with well-defined mappings GC Ultimate ( https://gcultimate.com ) ProGCC ( https://handheldlegend.com/products/progcc-kit-wireless-wired-bundle ) The SInput format is documented here: https://github.com/HandHeldLegend/SInput-HID
This commit is contained in:
@@ -798,6 +798,54 @@ static GamepadMapping_t *SDL_CreateMappingForHIDAPIGamepad(SDL_GUID guid)
|
||||
product == USB_PRODUCT_8BITDO_SF30_PRO_BT)) {
|
||||
// This controller has no guide button
|
||||
SDL_strlcat(mapping_string, "a:b1,b:b0,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", sizeof(mapping_string));
|
||||
} else if (SDL_IsJoystickSInputController(vendor, product)) {
|
||||
Uint8 face_style = (guid.data[15] & 0xF0) >> 4;
|
||||
Uint8 u_id = guid.data[15] & 0x0F;
|
||||
|
||||
switch (product) {
|
||||
case USB_PRODUCT_HANDHELDLEGEND_PROGCC:
|
||||
// ProGCC Mapping
|
||||
SDL_strlcat(mapping_string, "a:b1,b:b0,back:b15,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b8,lefttrigger:b12,leftx:a0,lefty:a1,misc1:b17,rightshoulder:b11,rightstick:b9,righttrigger:b13,rightx:a2,righty:a3,start:b14,x:b3,y:b2,hint:!SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1,", sizeof(mapping_string));
|
||||
break;
|
||||
|
||||
case USB_PRODUCT_HANDHELDLEGEND_GCULTIMATE:
|
||||
// GC Ultimate Map
|
||||
SDL_strlcat(mapping_string, "a:b0,b:b2,back:b15,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b8,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b17,misc3:b18,paddle1:b13,paddle2:b12,rightshoulder:b11,rightstick:b9,righttrigger:a5,rightx:a2,righty:a3,start:b14,x:b1,y:b3,hint:!SDL_GAMECONTROLLER_USE_GAMECUBE_LABELS:=1,", sizeof(mapping_string));
|
||||
break;
|
||||
|
||||
case USB_PRODUCT_HANDHELDLEGEND_SINPUT_GENERIC:
|
||||
if (u_id != 1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// SuperGamepad+ Map
|
||||
if (u_id == 1) {
|
||||
SDL_strlcat(mapping_string, "a:b1,b:b0,back:b11,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,leftshoulder:b8,rightshoulder:b9,start:b10,x:b3,y:b2,", sizeof(mapping_string));
|
||||
}
|
||||
|
||||
// Apply face style
|
||||
switch (face_style) {
|
||||
default:
|
||||
case 1:
|
||||
SDL_strlcat(mapping_string, "face:abxy,", sizeof(mapping_string));
|
||||
break;
|
||||
case 2:
|
||||
SDL_strlcat(mapping_string, "face:axby,", sizeof(mapping_string));
|
||||
break;
|
||||
case 3:
|
||||
SDL_strlcat(mapping_string, "face:bayx,", sizeof(mapping_string));
|
||||
break;
|
||||
case 4:
|
||||
SDL_strlcat(mapping_string, "face:sony,", sizeof(mapping_string));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
case USB_PRODUCT_BONJIRICHANNEL_FIREBIRD:
|
||||
// Unmapped devices
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
// All other gamepads have the standard set of 19 buttons and 6 axes
|
||||
if (SDL_IsJoystickGameCube(vendor, product)) {
|
||||
@@ -1235,6 +1283,7 @@ static bool SDL_PrivateParseGamepadElement(SDL_Gamepad *gamepad, const char *szG
|
||||
if (SDL_strstr(gamepad->mapping->mapping, ",hint:SDL_GAMECONTROLLER_USE_BUTTON_LABELS:=1") != NULL) {
|
||||
baxy_mapping = true;
|
||||
}
|
||||
|
||||
// FIXME: We fix these up when loading the mapping, does this ever get hit?
|
||||
//SDL_assert(!axby_mapping && !baxy_mapping);
|
||||
|
||||
|
Reference in New Issue
Block a user