Play-/Source/ui_qt/win32/InputProviderXinput.h

74 lines
1.4 KiB
C
Raw Permalink Normal View History

2019-06-18 21:29:09 -04:00
#pragma once
#include "input/InputProvider.h"
#include <thread>
2019-06-19 20:00:57 -04:00
#include <Windows.h>
#include <Xinput.h>
2019-06-18 21:29:09 -04:00
class CInputProviderXInput : public CInputProvider
{
public:
CInputProviderXInput();
virtual ~CInputProviderXInput();
uint32 GetId() const override;
std::string GetTargetDescription(const BINDINGTARGET&) const override;
std::vector<DEVICEINFO> GetDevices() const override;
void SetVibration(DeviceIdType deviceId, uint8 largeMotor, uint8 smallMotor) override;
2019-06-18 21:29:09 -04:00
private:
enum
{
MAX_DEVICES = 4,
MAX_BUTTONS = 16
};
enum KEYID
{
KEYID_LTHUMB_X,
KEYID_LTHUMB_Y,
KEYID_RTHUMB_X,
KEYID_RTHUMB_Y,
KEYID_LTRIGGER,
KEYID_RTRIGGER,
KEYID_DPAD_UP,
KEYID_DPAD_DOWN,
KEYID_DPAD_LEFT,
KEYID_DPAD_RIGHT,
KEYID_START,
KEYID_BACK,
KEYID_LTHUMB,
KEYID_RTHUMB,
KEYID_LSHOULDER,
KEYID_RSHOULDER,
KEYID_A,
KEYID_B,
KEYID_X,
KEYID_Y,
KEYID_MAX
2019-06-18 21:29:09 -04:00
};
struct DEVICE_STATE
{
bool connected = false;
uint32 idleTime = 0;
bool lTriggerPressed = false;
bool rTriggerPressed = false;
uint16 buttonState = 0;
uint32 packetNumber = 0;
2019-06-18 21:29:09 -04:00
};
void PollDevices();
2019-06-19 20:00:57 -04:00
void UpdateConnectedDevice(uint32, const XINPUT_STATE&);
void UpdateDisconnectedDevice(uint32);
void ReportButton(uint32, KEYID, bool);
2019-06-19 20:19:33 -04:00
void ReportAxis(uint32, KEYID, int32);
2019-06-18 21:29:09 -04:00
bool m_pollingEnabled = true;
std::thread m_pollingThread;
static const char* g_keyNames[KEYID_MAX];
static const KEYID g_buttonToKey[MAX_BUTTONS];
2019-06-18 21:29:09 -04:00
DEVICE_STATE m_states[MAX_DEVICES];
};