Make GameCube controllers only rumble if both USB cables are connected

The Nintendo USB GameCube Adapter has two USB connectors. Black for data
and grey for additional power for rumble. The Wii U and other software
require both cables to use rumble. The rumble is weaker without the
second USB cable. Other than that I don't know if there is any negative
side affects from using rumble with only one cable.
This commit is contained in:
Zack Middleton 2019-06-19 06:43:36 -07:00
parent b23cce282e
commit 6f63c1c37f
1 changed files with 12 additions and 2 deletions

View File

@ -37,6 +37,7 @@
typedef struct { typedef struct {
SDL_JoystickID joysticks[4]; SDL_JoystickID joysticks[4];
Uint8 rumbleAllowed[4];
Uint8 rumble[5]; Uint8 rumble[5];
Uint32 rumbleExpiration[4]; Uint32 rumbleExpiration[4];
/* Without this variable, hid_write starts to lag a TON */ /* Without this variable, hid_write starts to lag a TON */
@ -99,6 +100,9 @@ HIDAPI_DriverGameCube_InitDriver(SDL_HIDAPI_DriverData *context, Uint16 vendor_i
/* Go through all 4 slots */ /* Go through all 4 slots */
curSlot = packet + 1; curSlot = packet + 1;
for (i = 0; i < 4; i += 1, curSlot += 9) { for (i = 0; i < 4; i += 1, curSlot += 9) {
/* Only allow rumble if the adapter's second USB cable is connected */
ctx->rumbleAllowed[i] = (curSlot[0] & 0x04) != 0;
if (curSlot[0] & 0x30) { /* 0x10 - Wired, 0x20 - Wireless */ if (curSlot[0] & 0x30) { /* 0x10 - Wired, 0x20 - Wireless */
if (ctx->joysticks[i] == -1) { if (ctx->joysticks[i] == -1) {
ctx->joysticks[i] = SDL_GetNextJoystickInstanceID(); ctx->joysticks[i] = SDL_GetNextJoystickInstanceID();
@ -168,6 +172,9 @@ HIDAPI_DriverGameCube_UpdateDriver(SDL_HIDAPI_DriverData *context, int *num_joys
/* Go through all 4 slots */ /* Go through all 4 slots */
curSlot = packet + 1; curSlot = packet + 1;
for (i = 0; i < 4; i += 1, curSlot += 9) { for (i = 0; i < 4; i += 1, curSlot += 9) {
/* Only allow rumble if the adapter's second USB cable is connected */
ctx->rumbleAllowed[i] = (curSlot[0] & 0x04) != 0;
if (curSlot[0] & 0x30) { /* 0x10 - Wired, 0x20 - Wireless */ if (curSlot[0] & 0x30) { /* 0x10 - Wired, 0x20 - Wireless */
if (ctx->joysticks[i] == -1) { if (ctx->joysticks[i] == -1) {
ctx->joysticks[i] = SDL_GetNextJoystickInstanceID(); ctx->joysticks[i] = SDL_GetNextJoystickInstanceID();
@ -238,7 +245,7 @@ HIDAPI_DriverGameCube_UpdateDriver(SDL_HIDAPI_DriverData *context, int *num_joys
now = SDL_GetTicks(); now = SDL_GetTicks();
for (i = 0; i < 4; i += 1) { for (i = 0; i < 4; i += 1) {
if (ctx->rumbleExpiration[i] > 0) { if (ctx->rumbleExpiration[i] > 0) {
if (SDL_TICKS_PASSED(now, ctx->rumbleExpiration[i])) { if (SDL_TICKS_PASSED(now, ctx->rumbleExpiration[i]) || !ctx->rumbleAllowed[i]) {
ctx->rumble[i + 1] = 0; ctx->rumble[i + 1] = 0;
ctx->rumbleExpiration[i] = 0; ctx->rumbleExpiration[i] = 0;
ctx->rumbleUpdate = 1; ctx->rumbleUpdate = 1;
@ -325,6 +332,9 @@ HIDAPI_DriverGameCube_Rumble(SDL_HIDAPI_DriverData *context, SDL_Joystick *joyst
Uint8 i, val; Uint8 i, val;
for (i = 0; i < 4; i += 1) { for (i = 0; i < 4; i += 1) {
if (instance == ctx->joysticks[i]) { if (instance == ctx->joysticks[i]) {
if (!ctx->rumbleAllowed[i]) {
return SDL_SetError("Second USB cable for WUP-028 not connected");
}
val = (low_frequency_rumble > 0 || high_frequency_rumble > 0); val = (low_frequency_rumble > 0 || high_frequency_rumble > 0);
if (val != ctx->rumble[i + 1]) { if (val != ctx->rumble[i + 1]) {
ctx->rumble[i + 1] = val; ctx->rumble[i + 1] = val;
@ -338,7 +348,7 @@ HIDAPI_DriverGameCube_Rumble(SDL_HIDAPI_DriverData *context, SDL_Joystick *joyst
return 0; return 0;
} }
} }
return -1; return -1; /* Should never get here! */
} }
SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverGameCube = SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverGameCube =