From 2aa0957081366ef8d9df96c7921f81bb64c9a47c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 8 May 2025 10:46:53 -0700 Subject: [PATCH] Fixed 8BitDo Ultimate 2 Wireless controller on macOS When connected for the first time over Bluetooth on macOS, the first few reads return 0, so retry a few times in that case. --- src/joystick/hidapi/SDL_hidapi_8bitdo.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/joystick/hidapi/SDL_hidapi_8bitdo.c b/src/joystick/hidapi/SDL_hidapi_8bitdo.c index 82efaf7019..2dc5f92fda 100644 --- a/src/joystick/hidapi/SDL_hidapi_8bitdo.c +++ b/src/joystick/hidapi/SDL_hidapi_8bitdo.c @@ -154,12 +154,21 @@ static bool HIDAPI_Driver8BitDo_InitDevice(SDL_HIDAPI_Device *device) if (device->product_id == USB_PRODUCT_8BITDO_ULTIMATE2_WIRELESS) { // The Ultimate 2 Wireless v1.02 firmware has 12 byte reports, v1.03 firmware has 34 byte reports const int ULTIMATE2_WIRELESS_V103_REPORT_SIZE = 34; - Uint8 data[USB_PACKET_LENGTH]; - int size = SDL_hid_read_timeout(device->dev, data, sizeof(data), 80); - if (size >= ULTIMATE2_WIRELESS_V103_REPORT_SIZE) { - ctx->sensors_supported = true; - ctx->rumble_supported = true; - ctx->powerstate_supported = true; + const int MAX_ATTEMPTS = 3; + + for (int attempt = 0; attempt < MAX_ATTEMPTS; ++attempt) { + Uint8 data[USB_PACKET_LENGTH]; + int size = SDL_hid_read_timeout(device->dev, data, sizeof(data), 80); + if (size == 0) { + // Try again + continue; + } + if (size >= ULTIMATE2_WIRELESS_V103_REPORT_SIZE) { + ctx->sensors_supported = true; + ctx->rumble_supported = true; + ctx->powerstate_supported = true; + } + break; } } else { Uint8 data[USB_PACKET_LENGTH];