diff --git a/src/joystick/hidapi/SDL_hidapi_flydigi.c b/src/joystick/hidapi/SDL_hidapi_flydigi.c index 96b8b967cb..a4958f6935 100644 --- a/src/joystick/hidapi/SDL_hidapi_flydigi.c +++ b/src/joystick/hidapi/SDL_hidapi_flydigi.c @@ -389,6 +389,50 @@ static bool GetReply(SDL_HIDAPI_Device* device, Uint8 command, Uint8* data, size return false; } +static bool SDL_HIDAPI_Flydigi_SendInfoRequest(SDL_HIDAPI_Device *device) +{ + const Uint8 cmd[] = { + FLYDIGI_V2_CMD_REPORT_ID, + FLYDIGI_V2_MAGIC1, + FLYDIGI_V2_MAGIC2, + FLYDIGI_V2_GET_INFO_COMMAND, + 2, + 0 + }; + if (SDL_hid_write(device->dev, cmd, sizeof(cmd)) < 0) { + return SDL_SetError("Couldn't query controller info"); + } + return true; +} + +static void HIDAPI_DriverFlydigi_HandleInfoResponse(SDL_Joystick *joystick, SDL_DriverFlydigi_Context *ctx, Uint8 *data, int size) +{ + SDL_PowerState state; + int percent; + Uint8 status = (data[11] >> 4) & 0x0F; + Uint8 level = (data[11] & 0x0F); + + switch (status) { + case 0: + state = SDL_POWERSTATE_ON_BATTERY; + percent = level * 20; + break; + case 1: + state = SDL_POWERSTATE_CHARGING; + percent = level * 20; + break; + case 2: + state = SDL_POWERSTATE_CHARGED; + percent = 100; + break; + default: + state = SDL_POWERSTATE_UNKNOWN; + percent = 0; + break; + } + SDL_SendJoystickPowerInfo(joystick, state, percent); +} + static bool SDL_HIDAPI_Flydigi_SendStatusRequest(SDL_HIDAPI_Device *device) { const Uint8 cmd[] = { @@ -444,9 +488,8 @@ static bool HIDAPI_DriverFlydigi_InitControllerV2(SDL_HIDAPI_Device *device) SDL_DriverFlydigi_Context *ctx = (SDL_DriverFlydigi_Context *)device->context; Uint8 data[USB_PACKET_LENGTH]; - const Uint8 query_info[] = { FLYDIGI_V2_CMD_REPORT_ID, FLYDIGI_V2_MAGIC1, FLYDIGI_V2_MAGIC2, FLYDIGI_V2_GET_INFO_COMMAND, 2, 0 }; - if (SDL_hid_write(device->dev, query_info, sizeof(query_info)) < 0) { - return SDL_SetError("Couldn't query controller info"); + if (!SDL_HIDAPI_Flydigi_SendInfoRequest(device)) { + return false; } if (!GetReply(device, FLYDIGI_V2_GET_INFO_COMMAND, data, sizeof(data))) { return SDL_SetError("Couldn't get controller info"); @@ -902,6 +945,11 @@ static void HIDAPI_DriverFlydigi_HandlePacketV2(SDL_Joystick *joystick, SDL_Driv } switch (data[2]) { + case FLYDIGI_V2_GET_INFO_COMMAND: + if (joystick) { + HIDAPI_DriverFlydigi_HandleInfoResponse(joystick, ctx, data, size); + } + break; case FLYDIGI_V2_SET_STATUS_COMMAND: HIDAPI_DriverFlydigi_HandleStatusUpdate(ctx->device, data, size); break; @@ -937,6 +985,7 @@ static bool HIDAPI_DriverFlydigi_UpdateDevice(SDL_HIDAPI_Device *device) if (device->vendor_id == USB_VENDOR_FLYDIGI_V2 && joystick) { if (!ctx->next_heartbeat || now >= ctx->next_heartbeat) { SDL_HIDAPI_Flydigi_SendAcquireRequest(device, true); + SDL_HIDAPI_Flydigi_SendInfoRequest(device); ctx->next_heartbeat = now + FLYDIGI_ACQUIRE_CONTROLLER_HEARTBEAT_TIME; } }