mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-03-10 19:47:40 +01:00
InputCommon: Expose XInput battery level as an input.
This commit is contained in:
parent
e323f47ceb
commit
86e8745169
@ -10,6 +10,17 @@
|
|||||||
|
|
||||||
namespace ciface::XInput
|
namespace ciface::XInput
|
||||||
{
|
{
|
||||||
|
class Battery : public Core::Device::Input
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Battery(const ControlState* level) : m_level(*level) {}
|
||||||
|
std::string GetName() const override { return "Battery"; }
|
||||||
|
ControlState GetState() const override { return m_level; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
const ControlState& m_level;
|
||||||
|
};
|
||||||
|
|
||||||
static const struct
|
static const struct
|
||||||
{
|
{
|
||||||
const char* const name;
|
const char* const name;
|
||||||
@ -41,10 +52,12 @@ static HMODULE hXInput = nullptr;
|
|||||||
typedef decltype(&XInputGetCapabilities) XInputGetCapabilities_t;
|
typedef decltype(&XInputGetCapabilities) XInputGetCapabilities_t;
|
||||||
typedef decltype(&XInputSetState) XInputSetState_t;
|
typedef decltype(&XInputSetState) XInputSetState_t;
|
||||||
typedef decltype(&XInputGetState) XInputGetState_t;
|
typedef decltype(&XInputGetState) XInputGetState_t;
|
||||||
|
typedef decltype(&XInputGetBatteryInformation) XInputGetBatteryInformation_t;
|
||||||
|
|
||||||
static XInputGetCapabilities_t PXInputGetCapabilities = nullptr;
|
static XInputGetCapabilities_t PXInputGetCapabilities = nullptr;
|
||||||
static XInputSetState_t PXInputSetState = nullptr;
|
static XInputSetState_t PXInputSetState = nullptr;
|
||||||
static XInputGetState_t PXInputGetState = nullptr;
|
static XInputGetState_t PXInputGetState = nullptr;
|
||||||
|
static XInputGetBatteryInformation_t PXInputGetBatteryInformation = nullptr;
|
||||||
|
|
||||||
static bool haveGuideButton = false;
|
static bool haveGuideButton = false;
|
||||||
|
|
||||||
@ -67,6 +80,8 @@ void Init()
|
|||||||
PXInputGetCapabilities =
|
PXInputGetCapabilities =
|
||||||
(XInputGetCapabilities_t)::GetProcAddress(hXInput, "XInputGetCapabilities");
|
(XInputGetCapabilities_t)::GetProcAddress(hXInput, "XInputGetCapabilities");
|
||||||
PXInputSetState = (XInputSetState_t)::GetProcAddress(hXInput, "XInputSetState");
|
PXInputSetState = (XInputSetState_t)::GetProcAddress(hXInput, "XInputSetState");
|
||||||
|
PXInputGetBatteryInformation =
|
||||||
|
(XInputGetBatteryInformation_t)::GetProcAddress(hXInput, "XInputGetBatteryInformation");
|
||||||
|
|
||||||
// Ordinal 100 is the same as XInputGetState, except it doesn't dummy out the guide
|
// Ordinal 100 is the same as XInputGetState, except it doesn't dummy out the guide
|
||||||
// button info. Try loading it and fall back if needed.
|
// button info. Try loading it and fall back if needed.
|
||||||
@ -76,7 +91,8 @@ void Init()
|
|||||||
else
|
else
|
||||||
PXInputGetState = (XInputGetState_t)::GetProcAddress(hXInput, "XInputGetState");
|
PXInputGetState = (XInputGetState_t)::GetProcAddress(hXInput, "XInputGetState");
|
||||||
|
|
||||||
if (!PXInputGetCapabilities || !PXInputSetState || !PXInputGetState)
|
if (!PXInputGetCapabilities || !PXInputSetState || !PXInputGetState ||
|
||||||
|
!PXInputGetBatteryInformation)
|
||||||
{
|
{
|
||||||
::FreeLibrary(hXInput);
|
::FreeLibrary(hXInput);
|
||||||
hXInput = nullptr;
|
hXInput = nullptr;
|
||||||
@ -142,7 +158,7 @@ Device::Device(const XINPUT_CAPABILITIES& caps, u8 index) : m_subtype(caps.SubTy
|
|||||||
AddOutput(new Motor(i, this, (&m_state_out.wLeftMotorSpeed)[i], 65535));
|
AddOutput(new Motor(i, this, (&m_state_out.wLeftMotorSpeed)[i], 65535));
|
||||||
}
|
}
|
||||||
|
|
||||||
ZeroMemory(&m_state_in, sizeof(m_state_in));
|
AddInput(new Battery(&m_battery_level));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Device::GetName() const
|
std::string Device::GetName() const
|
||||||
@ -178,6 +194,25 @@ std::string Device::GetSource() const
|
|||||||
void Device::UpdateInput()
|
void Device::UpdateInput()
|
||||||
{
|
{
|
||||||
PXInputGetState(m_index, &m_state_in);
|
PXInputGetState(m_index, &m_state_in);
|
||||||
|
|
||||||
|
XINPUT_BATTERY_INFORMATION battery_info = {};
|
||||||
|
if (SUCCEEDED(PXInputGetBatteryInformation(m_index, BATTERY_DEVTYPE_GAMEPAD, &battery_info)))
|
||||||
|
{
|
||||||
|
switch (battery_info.BatteryType)
|
||||||
|
{
|
||||||
|
case BATTERY_TYPE_DISCONNECTED:
|
||||||
|
case BATTERY_TYPE_UNKNOWN:
|
||||||
|
m_battery_level = 0;
|
||||||
|
break;
|
||||||
|
case BATTERY_TYPE_WIRED:
|
||||||
|
m_battery_level = BATTERY_INPUT_MAX_VALUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
m_battery_level =
|
||||||
|
battery_info.BatteryLevel / ControlState(BATTERY_LEVEL_FULL) * BATTERY_INPUT_MAX_VALUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Device::UpdateMotors()
|
void Device::UpdateMotors()
|
||||||
|
@ -97,9 +97,10 @@ public:
|
|||||||
void UpdateMotors();
|
void UpdateMotors();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
XINPUT_STATE m_state_in;
|
XINPUT_STATE m_state_in{};
|
||||||
XINPUT_VIBRATION m_state_out{};
|
XINPUT_VIBRATION m_state_out{};
|
||||||
XINPUT_VIBRATION m_current_state_out{};
|
XINPUT_VIBRATION m_current_state_out{};
|
||||||
|
ControlState m_battery_level{};
|
||||||
const BYTE m_subtype;
|
const BYTE m_subtype;
|
||||||
const u8 m_index;
|
const u8 m_index;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user