@@ -61,7 +61,9 @@ static bool HIDAPI_DriverSwitch2_IsSupportedDevice(SDL_HIDAPI_Device *device, co
61
61
62
62
static bool HIDAPI_DriverSwitch2_InitDevice (SDL_HIDAPI_Device * device )
63
63
{
64
- return false;
64
+ HIDAPI_SetDeviceName (device , "Nintendo Switch 2 GameCube Controller" );
65
+ HIDAPI_SetDeviceProduct (device , USB_VENDOR_NINTENDO , USB_PRODUCT_NINTENDO_SWITCH2_GAMECUBE_CONTROLLER );
66
+ return HIDAPI_JoystickConnected (device , NULL );
65
67
}
66
68
67
69
static int HIDAPI_DriverSwitch2_GetDevicePlayerIndex (SDL_HIDAPI_Device * device , SDL_JoystickID instance_id )
@@ -75,12 +77,79 @@ static void HIDAPI_DriverSwitch2_SetDevicePlayerIndex(SDL_HIDAPI_Device *device,
75
77
76
78
static bool HIDAPI_DriverSwitch2_UpdateDevice (SDL_HIDAPI_Device * device )
77
79
{
78
- return false;
80
+ const struct {
81
+ int byte ;
82
+ unsigned char mask ;
83
+ } buttons [] = {
84
+ {3 , 0x01 }, // B
85
+ {3 , 0x02 }, // A
86
+ {3 , 0x04 }, // Y
87
+ {3 , 0x08 }, // X
88
+ {3 , 0x10 }, // R (GameCube R Click)
89
+ {3 , 0x20 }, // ZR (GameCube Z)
90
+ {3 , 0x40 }, // PLUS (GameCube Start)
91
+ {3 , 0x80 }, // RS (not on GameCube)
92
+ {4 , 0x01 }, // DPAD_DOWN
93
+ {4 , 0x02 }, // DPAD_RIGHT
94
+ {4 , 0x04 }, // DPAD_LEFT
95
+ {4 , 0x08 }, // DPAD_UP
96
+ {4 , 0x10 }, // L (GameCube L Click)
97
+ {4 , 0x20 }, // ZL
98
+ {4 , 0x40 }, // MINUS (not on GameCube)
99
+ {4 , 0x80 }, // LS (not on GameCube)
100
+ {5 , 0x01 }, // Home
101
+ {5 , 0x02 }, // Capture
102
+ {5 , 0x04 }, // GR (not on GameCube)
103
+ {5 , 0x08 }, // GL (not on GameCube)
104
+ {5 , 0x10 }, // C
105
+ };
106
+
107
+ SDL_Joystick * joystick = NULL ;
108
+ if (device -> num_joysticks > 0 ) {
109
+ joystick = SDL_GetJoystickFromID (device -> joysticks [0 ]);
110
+ }
111
+ if (joystick == NULL ) {
112
+ return true;
113
+ }
114
+
115
+ // Read input packet
116
+
117
+ Uint8 packet [USB_PACKET_LENGTH ];
118
+ int size ;
119
+ while ((size = SDL_hid_read_timeout (device -> dev , packet , sizeof (packet ), 0 )) > 0 ) {
120
+ if (size > 14 ) {
121
+ Uint64 timestamp = SDL_GetTicksNS ();
122
+ for (size_t i = 0 ; i < SDL_arraysize (buttons ); ++ i ) {
123
+ SDL_SendJoystickButton (
124
+ timestamp ,
125
+ joystick ,
126
+ (Uint8 ) i ,
127
+ (packet [buttons [i ].byte ] & buttons [i ].mask ) != 0 );
128
+ }
129
+ SDL_SendJoystickAxis (
130
+ timestamp ,
131
+ joystick ,
132
+ SDL_GAMEPAD_AXIS_LEFT_TRIGGER ,
133
+ (Sint16 ) HIDAPI_RemapVal (packet [13 ], 0 , 255 , SDL_MIN_SINT16 , SDL_MAX_SINT16 )
134
+ );
135
+ SDL_SendJoystickAxis (
136
+ timestamp ,
137
+ joystick ,
138
+ SDL_GAMEPAD_AXIS_RIGHT_TRIGGER ,
139
+ (Sint16 ) HIDAPI_RemapVal (packet [14 ], 0 , 255 , SDL_MIN_SINT16 , SDL_MAX_SINT16 )
140
+ );
141
+ }
142
+ }
143
+ return true;
79
144
}
80
145
81
146
static bool HIDAPI_DriverSwitch2_OpenJoystick (SDL_HIDAPI_Device * device , SDL_Joystick * joystick )
82
147
{
83
- return false;
148
+ // Initialize the joystick capabilities
149
+ joystick -> nbuttons = 21 ;
150
+ joystick -> naxes = SDL_GAMEPAD_AXIS_COUNT ;
151
+
152
+ return true;
84
153
}
85
154
86
155
static bool HIDAPI_DriverSwitch2_RumbleJoystick (SDL_HIDAPI_Device * device , SDL_Joystick * joystick , Uint16 low_frequency_rumble , Uint16 high_frequency_rumble )
0 commit comments