mirror of https://github.com/encounter/SDL.git
Put the Nintendo Switch Pro controller back into enhanced mode as needed
Fixes https://github.com/libsdl-org/SDL/issues/3450
This commit is contained in:
parent
5c70e45c53
commit
c51464d9d8
|
@ -260,6 +260,7 @@ typedef struct {
|
||||||
Uint32 m_unRumblePending;
|
Uint32 m_unRumblePending;
|
||||||
SDL_bool m_bHasSensors;
|
SDL_bool m_bHasSensors;
|
||||||
SDL_bool m_bReportSensors;
|
SDL_bool m_bReportSensors;
|
||||||
|
Uint32 m_unLastInput;
|
||||||
|
|
||||||
SwitchInputOnlyControllerStatePacket_t m_lastInputOnlyState;
|
SwitchInputOnlyControllerStatePacket_t m_lastInputOnlyState;
|
||||||
SwitchSimpleStatePacket_t m_lastSimpleState;
|
SwitchSimpleStatePacket_t m_lastSimpleState;
|
||||||
|
@ -1608,6 +1609,7 @@ HIDAPI_DriverSwitch_UpdateDevice(SDL_HIDAPI_Device *device)
|
||||||
SDL_DriverSwitch_Context *ctx = (SDL_DriverSwitch_Context *)device->context;
|
SDL_DriverSwitch_Context *ctx = (SDL_DriverSwitch_Context *)device->context;
|
||||||
SDL_Joystick *joystick = NULL;
|
SDL_Joystick *joystick = NULL;
|
||||||
int size;
|
int size;
|
||||||
|
Uint32 now;
|
||||||
|
|
||||||
if (device->num_joysticks > 0) {
|
if (device->num_joysticks > 0) {
|
||||||
joystick = SDL_JoystickFromInstanceID(device->joysticks[0]);
|
joystick = SDL_JoystickFromInstanceID(device->joysticks[0]);
|
||||||
|
@ -1616,6 +1618,8 @@ HIDAPI_DriverSwitch_UpdateDevice(SDL_HIDAPI_Device *device)
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
now = SDL_GetTicks();
|
||||||
|
|
||||||
while ((size = ReadInput(ctx)) > 0) {
|
while ((size = ReadInput(ctx)) > 0) {
|
||||||
#ifdef DEBUG_SWITCH_PROTOCOL
|
#ifdef DEBUG_SWITCH_PROTOCOL
|
||||||
HIDAPI_DumpPacket("Nintendo Switch packet: size = %d", ctx->m_rgucReadBuffer, size);
|
HIDAPI_DumpPacket("Nintendo Switch packet: size = %d", ctx->m_rgucReadBuffer, size);
|
||||||
|
@ -1626,9 +1630,11 @@ HIDAPI_DriverSwitch_UpdateDevice(SDL_HIDAPI_Device *device)
|
||||||
switch (ctx->m_rgucReadBuffer[0]) {
|
switch (ctx->m_rgucReadBuffer[0]) {
|
||||||
case k_eSwitchInputReportIDs_SimpleControllerState:
|
case k_eSwitchInputReportIDs_SimpleControllerState:
|
||||||
HandleSimpleControllerState(joystick, ctx, (SwitchSimpleStatePacket_t *)&ctx->m_rgucReadBuffer[1]);
|
HandleSimpleControllerState(joystick, ctx, (SwitchSimpleStatePacket_t *)&ctx->m_rgucReadBuffer[1]);
|
||||||
|
ctx->m_unLastInput = now;
|
||||||
break;
|
break;
|
||||||
case k_eSwitchInputReportIDs_FullControllerState:
|
case k_eSwitchInputReportIDs_FullControllerState:
|
||||||
HandleFullControllerState(joystick, ctx, (SwitchStatePacket_t *)&ctx->m_rgucReadBuffer[1]);
|
HandleFullControllerState(joystick, ctx, (SwitchStatePacket_t *)&ctx->m_rgucReadBuffer[1]);
|
||||||
|
ctx->m_unLastInput = now;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1636,12 +1642,22 @@ HIDAPI_DriverSwitch_UpdateDevice(SDL_HIDAPI_Device *device)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ctx->m_bInputOnly && !ctx->m_bUsingBluetooth) {
|
||||||
|
const Uint32 INPUT_WAIT_TIMEOUT_MS = 100;
|
||||||
|
if (SDL_TICKS_PASSED(now, ctx->m_unLastInput + INPUT_WAIT_TIMEOUT_MS)) {
|
||||||
|
/* Steam may have put the controller back into non-reporting mode */
|
||||||
|
SDL_UnlockMutex(ctx->device->dev_lock);
|
||||||
|
WriteProprietary(ctx, k_eSwitchProprietaryCommandIDs_ForceUSB, NULL, 0, SDL_FALSE);
|
||||||
|
SDL_LockMutex(ctx->device->dev_lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ctx->m_bRumblePending || ctx->m_bRumbleZeroPending) {
|
if (ctx->m_bRumblePending || ctx->m_bRumbleZeroPending) {
|
||||||
HIDAPI_DriverSwitch_SendPendingRumble(ctx);
|
HIDAPI_DriverSwitch_SendPendingRumble(ctx);
|
||||||
} else if (ctx->m_bRumbleActive &&
|
} else if (ctx->m_bRumbleActive &&
|
||||||
SDL_TICKS_PASSED(SDL_GetTicks(), ctx->m_unRumbleSent + RUMBLE_REFRESH_FREQUENCY_MS)) {
|
SDL_TICKS_PASSED(now, ctx->m_unRumbleSent + RUMBLE_REFRESH_FREQUENCY_MS)) {
|
||||||
#ifdef DEBUG_RUMBLE
|
#ifdef DEBUG_RUMBLE
|
||||||
SDL_Log("Sent continuing rumble, %d ms after previous rumble\n", SDL_GetTicks() - ctx->m_unRumbleSent);
|
SDL_Log("Sent continuing rumble, %d ms after previous rumble\n", now - ctx->m_unRumbleSent);
|
||||||
#endif
|
#endif
|
||||||
WriteRumble(ctx);
|
WriteRumble(ctx);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue