From 2a20cc0f1d4f74c8f3cc0775faf081b70cb2e86d Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 12 Apr 2021 11:25:42 -0700 Subject: [PATCH] SDL: let through a SetLED command every 5sec to deall with situations where the controller loses power when a computer is suspended CR: SamL --- src/joystick/SDL_joystick.c | 16 +++++++++++----- src/joystick/SDL_sysjoystick.h | 3 +++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c index 7d7a12a31..8cf47c745 100644 --- a/src/joystick/SDL_joystick.c +++ b/src/joystick/SDL_joystick.c @@ -416,6 +416,7 @@ SDL_JoystickOpen(int device_index) joystick->instance_id = instance_id; joystick->attached = SDL_TRUE; joystick->epowerlevel = SDL_JOYSTICK_POWER_UNKNOWN; + joystick->led_expiration = SDL_GetTicks(); if (driver->Open(joystick, device_index) < 0) { SDL_free(joystick); @@ -954,6 +955,7 @@ int SDL_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue) { int result; + SDL_bool isfreshvalue; if (!SDL_PrivateJoystickValid(joystick)) { return -1; @@ -961,13 +963,17 @@ SDL_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue) SDL_LockJoysticks(); - if (red == joystick->led_red && - green == joystick->led_green && - blue == joystick->led_blue) { + isfreshvalue = red != joystick->led_red || + green != joystick->led_green || + blue != joystick->led_blue; + + if ( isfreshvalue || SDL_TICKS_PASSED( SDL_GetTicks(), joystick->led_expiration ) ) { + result = joystick->driver->SetLED(joystick, red, green, blue); + joystick->led_expiration = SDL_GetTicks() + SDL_LED_MIN_REPEAT_MS; + } + else { /* Avoid spamming the driver */ result = 0; - } else { - result = joystick->driver->SetLED(joystick, red, green, blue); } /* Save the LED value regardless of success, so we don't spam the driver */ diff --git a/src/joystick/SDL_sysjoystick.h b/src/joystick/SDL_sysjoystick.h index b8af118df..749c6efd2 100644 --- a/src/joystick/SDL_sysjoystick.h +++ b/src/joystick/SDL_sysjoystick.h @@ -99,6 +99,7 @@ struct _SDL_Joystick Uint8 led_red; Uint8 led_green; Uint8 led_blue; + Uint32 led_expiration; SDL_bool attached; SDL_bool is_game_controller; @@ -189,6 +190,8 @@ typedef struct _SDL_JoystickDriver /* Windows and Mac OSX has a limit of MAX_DWORD / 1000, Linux kernel has a limit of 0xFFFF */ #define SDL_MAX_RUMBLE_DURATION_MS 0xFFFF +#define SDL_LED_MIN_REPEAT_MS 5000 + /* The available joystick drivers */ extern SDL_JoystickDriver SDL_ANDROID_JoystickDriver; extern SDL_JoystickDriver SDL_BSD_JoystickDriver;