2013-10-19 09:27:57 +00:00
// XInput suffers a similar issue as XAudio2. Since Win8, it is part of the OS.
// However, unlike XAudio2 they have not made the API incompatible - so we just
// compile against the latest version and fall back to dynamically loading the
// old DLL.
2014-02-10 18:54:46 +00:00
# pragma once
2010-04-02 02:48:24 +00:00
2014-02-19 01:17:31 +00:00
# include <windows.h>
2010-04-02 02:48:24 +00:00
# include <XInput.h>
2014-02-19 01:17:31 +00:00
# include "InputCommon/ControllerInterface/Device.h"
2013-10-19 09:27:57 +00:00
# ifndef XINPUT_DEVSUBTYPE_FLIGHT_STICK
# error You are building this module against the wrong version of DirectX. You probably need to remove DXSDK_DIR from your include path and / or _WIN32_WINNT is wrong.
# endif
2010-04-02 02:48:24 +00:00
namespace ciface
{
namespace XInput
{
2013-06-17 00:07:10 +00:00
void Init ( std : : vector < Core : : Device * > & devices ) ;
2013-10-19 09:27:57 +00:00
void DeInit ( ) ;
2010-04-02 02:48:24 +00:00
2013-06-17 00:07:10 +00:00
class Device : public Core : : Device
2010-04-02 02:48:24 +00:00
{
2011-03-14 01:20:11 +00:00
private :
2013-06-17 00:07:10 +00:00
class Button : public Core : : Device : : Input
2010-04-02 02:48:24 +00:00
{
public :
std : : string GetName ( ) const ;
2011-03-14 01:20:11 +00:00
Button ( u8 index , const WORD & buttons ) : m_index ( index ) , m_buttons ( buttons ) { }
ControlState GetState ( ) const ;
2010-04-02 02:48:24 +00:00
private :
2011-03-14 01:20:11 +00:00
const WORD & m_buttons ;
u8 m_index ;
2010-04-02 02:48:24 +00:00
} ;
2013-06-17 00:07:10 +00:00
class Axis : public Core : : Device : : Input
2010-04-02 02:48:24 +00:00
{
public :
std : : string GetName ( ) const ;
2011-03-14 01:20:11 +00:00
Axis ( u8 index , const SHORT & axis , SHORT range ) : m_index ( index ) , m_axis ( axis ) , m_range ( range ) { }
ControlState GetState ( ) const ;
2010-04-02 02:48:24 +00:00
private :
2011-03-14 01:20:11 +00:00
const SHORT & m_axis ;
const SHORT m_range ;
const u8 m_index ;
2010-04-02 02:48:24 +00:00
} ;
2013-06-17 00:07:10 +00:00
class Trigger : public Core : : Device : : Input
2010-04-02 02:48:24 +00:00
{
public :
std : : string GetName ( ) const ;
2011-03-14 01:20:11 +00:00
Trigger ( u8 index , const BYTE & trigger , BYTE range ) : m_index ( index ) , m_trigger ( trigger ) , m_range ( range ) { }
ControlState GetState ( ) const ;
2010-04-02 02:48:24 +00:00
private :
2011-03-14 01:20:11 +00:00
const BYTE & m_trigger ;
const BYTE m_range ;
const u8 m_index ;
2010-04-02 02:48:24 +00:00
} ;
2013-06-17 00:07:10 +00:00
class Motor : public Core : : Device : : Output
2010-04-02 02:48:24 +00:00
{
public :
std : : string GetName ( ) const ;
2014-11-13 09:10:55 +00:00
Motor ( u8 index , Device * parent , WORD & motor , WORD range ) : m_index ( index ) , m_parent ( parent ) , m_motor ( motor ) , m_range ( range ) { }
2011-03-14 01:20:11 +00:00
void SetState ( ControlState state ) ;
2010-04-02 02:48:24 +00:00
private :
2011-03-14 01:20:11 +00:00
WORD & m_motor ;
const WORD m_range ;
const u8 m_index ;
2014-11-13 09:10:55 +00:00
Device * m_parent ;
2010-04-02 02:48:24 +00:00
} ;
2011-03-14 01:20:11 +00:00
public :
2014-11-13 08:55:14 +00:00
void UpdateInput ( ) override ;
2010-04-02 02:48:24 +00:00
2011-03-14 01:20:11 +00:00
Device ( const XINPUT_CAPABILITIES & capabilities , u8 index ) ;
2010-04-02 02:48:24 +00:00
std : : string GetName ( ) const ;
int GetId ( ) const ;
std : : string GetSource ( ) const ;
2014-11-13 09:10:55 +00:00
void UpdateMotors ( ) ;
2010-04-02 02:48:24 +00:00
private :
2011-03-14 01:20:11 +00:00
XINPUT_STATE m_state_in ;
2014-11-13 09:10:55 +00:00
XINPUT_VIBRATION m_state_out ;
2011-03-14 01:20:11 +00:00
const BYTE m_subtype ;
const u8 m_index ;
2010-04-02 02:48:24 +00:00
} ;
}
}