diff --git a/src/joystick/hidapi/SDL_hidapi_switch.c b/src/joystick/hidapi/SDL_hidapi_switch.c index 92d14ab2f6..e12f6c3b07 100644 --- a/src/joystick/hidapi/SDL_hidapi_switch.c +++ b/src/joystick/hidapi/SDL_hidapi_switch.c @@ -315,6 +315,8 @@ typedef struct Uint64 m_ulIMUUpdateIntervalNS; Uint64 m_ulTimestampNS; bool m_bVerticalMode; + SDL_PowerState m_ePowerState; + int m_nPowerPercent; SwitchInputOnlyControllerStatePacket_t m_lastInputOnlyState; SwitchSimpleStatePacket_t m_lastSimpleState; @@ -2583,21 +2585,29 @@ static void HandleFullControllerState(SDL_Joystick *joystick, SDL_DriverSwitch_C * LSB of the battery nibble is used to report charging. * The battery level is reported from 0(empty)-8(full) */ - SDL_PowerState state; int charging = (packet->controllerState.ucBatteryAndConnection & 0x10); int level = (packet->controllerState.ucBatteryAndConnection & 0xE0) >> 4; - int percent = (int)SDL_roundf((level / 8.0f) * 100.0f); - if (charging) { if (level == 8) { - state = SDL_POWERSTATE_CHARGED; + ctx->m_ePowerState = SDL_POWERSTATE_CHARGED; } else { - state = SDL_POWERSTATE_CHARGING; + ctx->m_ePowerState = SDL_POWERSTATE_CHARGING; } } else { - state = SDL_POWERSTATE_ON_BATTERY; + ctx->m_ePowerState = SDL_POWERSTATE_ON_BATTERY; + } + ctx->m_nPowerPercent = (int)SDL_roundf((level / 8.0f) * 100.0f); + + if (!ctx->device->parent) { + SDL_PowerState state = ctx->m_ePowerState; + int percent = ctx->m_nPowerPercent; + SDL_SendJoystickPowerInfo(joystick, state, percent); + } else if (ctx->m_eControllerType == k_eSwitchDeviceInfoControllerType_JoyConRight) { + SDL_DriverSwitch_Context *other = (SDL_DriverSwitch_Context *)ctx->device->parent->children[0]->context; + SDL_PowerState state = (SDL_PowerState)SDL_min(ctx->m_ePowerState, other->m_ePowerState); + int percent = SDL_min(ctx->m_nPowerPercent, other->m_nPowerPercent); + SDL_SendJoystickPowerInfo(joystick, state, percent); } - SDL_SendJoystickPowerInfo(joystick, state, percent); if (ctx->m_bReportSensors) { bool bHasSensorData = (packet->imuState[0].sAccelZ != 0 ||