From 058a0ab47f5bcb3503abbce8a46639d0e01395f9 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 22 Dec 2020 14:38:32 -0800 Subject: [PATCH] Set the pad lights on the PS5 controller corresponding to the player index Also allow setting the player index from testgamecontroller using the number keys --- src/joystick/hidapi/SDL_hidapi_ps5.c | 28 ++++++++++++++++++++++++---- test/testgamecontroller.c | 8 ++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/joystick/hidapi/SDL_hidapi_ps5.c b/src/joystick/hidapi/SDL_hidapi_ps5.c index 5d91ee22a..dfd94a9db 100644 --- a/src/joystick/hidapi/SDL_hidapi_ps5.c +++ b/src/joystick/hidapi/SDL_hidapi_ps5.c @@ -205,9 +205,9 @@ SetLedsForPlayerIndex(DS5EffectsState_t *effects, int player_index) { 0x40, 0x00, 0x00 }, /* Red */ { 0x00, 0x40, 0x00 }, /* Green */ { 0x20, 0x00, 0x20 }, /* Pink */ - { 0x02, 0x01, 0x00 }, /* Orange */ - { 0x00, 0x01, 0x01 }, /* Teal */ - { 0x01, 0x01, 0x01 } /* White */ + { 0x20, 0x10, 0x00 }, /* Orange */ + { 0x00, 0x10, 0x10 }, /* Teal */ + { 0x10, 0x10, 0x10 } /* White */ }; if (player_index >= 0) { @@ -221,6 +221,24 @@ SetLedsForPlayerIndex(DS5EffectsState_t *effects, int player_index) effects->ucLedBlue = colors[player_index][2]; } +static void +SetLightsForPlayerIndex(DS5EffectsState_t *effects, int player_index) +{ + static const Uint8 lights[] = { + 0x04, + 0x0A, + 0x15, + 0x1B + }; + + if (player_index >= 0 && player_index < SDL_arraysize(lights)) { + /* Bitmask, 0x1F enables all lights, 0x20 changes instantly instead of fade */ + effects->ucPadLights = lights[player_index]; + } else { + effects->ucPadLights = 0x00; + } +} + static SDL_bool HIDAPI_DriverPS5_InitDevice(SDL_HIDAPI_Device *device) { @@ -425,7 +443,7 @@ HIDAPI_DriverPS5_UpdateEffects(SDL_HIDAPI_Device *device, EDS5Effect effect) case k_EDS5EffectPadLights: effects->ucEnableBits2 |= 0x10; /* Enable touchpad lights */ - effects->ucPadLights = 0x00; /* Bitmask, 0x1F enables all lights, 0x20 changes instantly instead of fade */ + SetLightsForPlayerIndex(effects, ctx->player_index); break; case k_EDS5EffectMicLight: effects->ucEnableBits2 |= 0x01; /* Enable microphone light */ @@ -498,6 +516,7 @@ HIDAPI_DriverPS5_SetEffectsSupported(SDL_HIDAPI_Device *device, SDL_Joystick *jo SDL_PrivateJoystickAddSensor(joystick, SDL_SENSOR_ACCEL); HIDAPI_DriverPS5_UpdateEffects(device, k_EDS5EffectLED); + HIDAPI_DriverPS5_UpdateEffects(device, k_EDS5EffectPadLights); } static void @@ -513,6 +532,7 @@ HIDAPI_DriverPS5_SetDevicePlayerIndex(SDL_HIDAPI_Device *device, SDL_JoystickID /* This will set the new LED state based on the new player index */ HIDAPI_DriverPS5_UpdateEffects(device, k_EDS5EffectLED); + HIDAPI_DriverPS5_UpdateEffects(device, k_EDS5EffectPadLights); } static SDL_bool diff --git a/test/testgamecontroller.c b/test/testgamecontroller.c index 6522885cf..0c0d3dcae 100644 --- a/test/testgamecontroller.c +++ b/test/testgamecontroller.c @@ -303,6 +303,14 @@ loop(void *arg) break; case SDL_KEYDOWN: + if (event.key.keysym.sym >= SDLK_0 && event.key.keysym.sym <= SDLK_9) { + if (gamecontroller) { + int player_index = (event.key.keysym.sym - SDLK_0); + + SDL_GameControllerSetPlayerIndex(gamecontroller, player_index); + } + break; + } if (event.key.keysym.sym != SDLK_ESCAPE) { break; }