@@ -61,7 +61,7 @@ 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 SDL_Unsupported ( );
64
+ return HIDAPI_JoystickConnected ( device , NULL );
65
65
}
66
66
67
67
static int HIDAPI_DriverSwitch2_GetDevicePlayerIndex (SDL_HIDAPI_Device * device , SDL_JoystickID instance_id )
@@ -75,12 +75,128 @@ static void HIDAPI_DriverSwitch2_SetDevicePlayerIndex(SDL_HIDAPI_Device *device,
75
75
76
76
static bool HIDAPI_DriverSwitch2_UpdateDevice (SDL_HIDAPI_Device * device )
77
77
{
78
- return SDL_Unsupported ();
78
+ const struct {
79
+ int byte ;
80
+ unsigned char mask ;
81
+ } buttons [] = {
82
+ {3 , 0x01 }, // B
83
+ {3 , 0x02 }, // A
84
+ {3 , 0x04 }, // Y
85
+ {3 , 0x08 }, // X
86
+ {3 , 0x10 }, // R (GameCube R Click)
87
+ {3 , 0x20 }, // ZR (GameCube Z)
88
+ {3 , 0x40 }, // PLUS (GameCube Start)
89
+ {3 , 0x80 }, // RS (not on GameCube)
90
+ {4 , 0x01 }, // DPAD_DOWN
91
+ {4 , 0x02 }, // DPAD_RIGHT
92
+ {4 , 0x04 }, // DPAD_LEFT
93
+ {4 , 0x08 }, // DPAD_UP
94
+ {4 , 0x10 }, // L (GameCube L Click)
95
+ {4 , 0x20 }, // ZL
96
+ {4 , 0x40 }, // MINUS (not on GameCube)
97
+ {4 , 0x80 }, // LS (not on GameCube)
98
+ {5 , 0x01 }, // Home
99
+ {5 , 0x02 }, // Capture
100
+ {5 , 0x04 }, // GR (not on GameCube)
101
+ {5 , 0x08 }, // GL (not on GameCube)
102
+ {5 , 0x10 }, // C
103
+ };
104
+
105
+ SDL_Joystick * joystick = NULL ;
106
+ if (device -> num_joysticks > 0 ) {
107
+ joystick = SDL_GetJoystickFromID (device -> joysticks [0 ]);
108
+ }
109
+ if (joystick == NULL ) {
110
+ return true;
111
+ }
112
+
113
+ // Read input packet
114
+
115
+ Uint8 packet [USB_PACKET_LENGTH ];
116
+ int size ;
117
+ while ((size = SDL_hid_read_timeout (device -> dev , packet , sizeof (packet ), 0 )) > 0 ) {
118
+ if (size > 14 ) {
119
+ Uint64 timestamp = SDL_GetTicksNS ();
120
+ for (size_t i = 0 ; i < SDL_arraysize (buttons ); ++ i ) {
121
+ SDL_SendJoystickButton (
122
+ timestamp ,
123
+ joystick ,
124
+ (Uint8 ) i ,
125
+ (packet [buttons [i ].byte ] & buttons [i ].mask ) != 0
126
+ );
127
+ }
128
+ SDL_SendJoystickAxis (
129
+ timestamp ,
130
+ joystick ,
131
+ SDL_GAMEPAD_AXIS_LEFTX ,
132
+ (Sint16 ) HIDAPI_RemapVal (
133
+ (float ) (packet [6 ] | ((packet [7 ] & 0x0F ) << 8 )),
134
+ 0 ,
135
+ 4096 ,
136
+ SDL_MIN_SINT16 ,
137
+ SDL_MAX_SINT16
138
+ )
139
+ );
140
+ SDL_SendJoystickAxis (
141
+ timestamp ,
142
+ joystick ,
143
+ SDL_GAMEPAD_AXIS_LEFTY ,
144
+ (Sint16 ) HIDAPI_RemapVal (
145
+ (float ) ((packet [7 ] >> 4 ) | (packet [8 ] << 4 )),
146
+ 0 ,
147
+ 4096 ,
148
+ SDL_MIN_SINT16 ,
149
+ SDL_MAX_SINT16
150
+ )
151
+ );
152
+ SDL_SendJoystickAxis (
153
+ timestamp ,
154
+ joystick ,
155
+ SDL_GAMEPAD_AXIS_RIGHTX ,
156
+ (Sint16 ) HIDAPI_RemapVal (
157
+ (float ) (packet [9 ] | ((packet [10 ] & 0x0F ) << 8 )),
158
+ 0 ,
159
+ 4096 ,
160
+ SDL_MIN_SINT16 ,
161
+ SDL_MAX_SINT16
162
+ )
163
+ );
164
+ SDL_SendJoystickAxis (
165
+ timestamp ,
166
+ joystick ,
167
+ SDL_GAMEPAD_AXIS_RIGHTY ,
168
+ (Sint16 ) HIDAPI_RemapVal (
169
+ (float ) ((packet [10 ] >> 4 ) | (packet [11 ] << 4 )),
170
+ 0 ,
171
+ 4096 ,
172
+ SDL_MIN_SINT16 ,
173
+ SDL_MAX_SINT16
174
+ )
175
+ );
176
+ SDL_SendJoystickAxis (
177
+ timestamp ,
178
+ joystick ,
179
+ SDL_GAMEPAD_AXIS_LEFT_TRIGGER ,
180
+ (Sint16 ) HIDAPI_RemapVal (packet [13 ], 0 , 255 , SDL_MIN_SINT16 , SDL_MAX_SINT16 )
181
+ );
182
+ SDL_SendJoystickAxis (
183
+ timestamp ,
184
+ joystick ,
185
+ SDL_GAMEPAD_AXIS_RIGHT_TRIGGER ,
186
+ (Sint16 ) HIDAPI_RemapVal (packet [14 ], 0 , 255 , SDL_MIN_SINT16 , SDL_MAX_SINT16 )
187
+ );
188
+ }
189
+ }
190
+ return true;
79
191
}
80
192
81
193
static bool HIDAPI_DriverSwitch2_OpenJoystick (SDL_HIDAPI_Device * device , SDL_Joystick * joystick )
82
194
{
83
- return SDL_Unsupported ();
195
+ // Initialize the joystick capabilities
196
+ joystick -> nbuttons = 21 ;
197
+ joystick -> naxes = SDL_GAMEPAD_AXIS_COUNT ;
198
+
199
+ return true;
84
200
}
85
201
86
202
static bool HIDAPI_DriverSwitch2_RumbleJoystick (SDL_HIDAPI_Device * device , SDL_Joystick * joystick , Uint16 low_frequency_rumble , Uint16 high_frequency_rumble )
0 commit comments