@@ -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,127 @@ 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_LEFTX ,
133
+ (Sint16 ) HIDAPI_RemapVal (
134
+ (float ) (packet [6 ] | ((packet [7 ] & 0x0F ) << 8 )),
135
+ 0 ,
136
+ 4096 ,
137
+ SDL_MIN_SINT16 ,
138
+ SDL_MAX_SINT16
139
+ )
140
+ );
141
+ SDL_SendJoystickAxis (
142
+ timestamp ,
143
+ joystick ,
144
+ SDL_GAMEPAD_AXIS_LEFTY ,
145
+ (Sint16 ) HIDAPI_RemapVal (
146
+ (float ) ((packet [7 ] >> 4 ) | (packet [8 ] << 4 )),
147
+ 0 ,
148
+ 4096 ,
149
+ SDL_MIN_SINT16 ,
150
+ SDL_MAX_SINT16
151
+ )
152
+ );
153
+ SDL_SendJoystickAxis (
154
+ timestamp ,
155
+ joystick ,
156
+ SDL_GAMEPAD_AXIS_RIGHTX ,
157
+ (Sint16 ) HIDAPI_RemapVal (
158
+ (float ) (packet [9 ] | ((packet [10 ] & 0x0F ) << 8 )),
159
+ 0 ,
160
+ 4096 ,
161
+ SDL_MIN_SINT16 ,
162
+ SDL_MAX_SINT16
163
+ )
164
+ );
165
+ SDL_SendJoystickAxis (
166
+ timestamp ,
167
+ joystick ,
168
+ SDL_GAMEPAD_AXIS_RIGHTY ,
169
+ (Sint16 ) HIDAPI_RemapVal (
170
+ (float ) ((packet [10 ] >> 4 ) | (packet [11 ] << 4 )),
171
+ 0 ,
172
+ 4096 ,
173
+ SDL_MIN_SINT16 ,
174
+ SDL_MAX_SINT16
175
+ )
176
+ );
177
+ SDL_SendJoystickAxis (
178
+ timestamp ,
179
+ joystick ,
180
+ SDL_GAMEPAD_AXIS_LEFT_TRIGGER ,
181
+ (Sint16 ) HIDAPI_RemapVal (packet [13 ], 0 , 255 , SDL_MIN_SINT16 , SDL_MAX_SINT16 )
182
+ );
183
+ SDL_SendJoystickAxis (
184
+ timestamp ,
185
+ joystick ,
186
+ SDL_GAMEPAD_AXIS_RIGHT_TRIGGER ,
187
+ (Sint16 ) HIDAPI_RemapVal (packet [14 ], 0 , 255 , SDL_MIN_SINT16 , SDL_MAX_SINT16 )
188
+ );
189
+ }
190
+ }
191
+ return true;
79
192
}
80
193
81
194
static bool HIDAPI_DriverSwitch2_OpenJoystick (SDL_HIDAPI_Device * device , SDL_Joystick * joystick )
82
195
{
83
- return false;
196
+ // Initialize the joystick capabilities
197
+ joystick -> nbuttons = 21 ;
198
+ joystick -> naxes = SDL_GAMEPAD_AXIS_COUNT ;
199
+
200
+ return true;
84
201
}
85
202
86
203
static bool HIDAPI_DriverSwitch2_RumbleJoystick (SDL_HIDAPI_Device * device , SDL_Joystick * joystick , Uint16 low_frequency_rumble , Uint16 high_frequency_rumble )
0 commit comments