summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.h
blob: 5edc171dc4bb43d4097ecb197ec8b53dd3803be4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#ifndef _CIFACE_SDL_H_
#define _CIFACE_SDL_H_

#include "../ControllerInterface.h"

#include <list>

#ifdef _WIN32
	#include <SDL.h>
#else
	#include <SDL/SDL.h>
#endif

#if SDL_VERSION_ATLEAST(1, 3, 0)
	#define USE_SDL_HAPTIC
#endif

#ifdef USE_SDL_HAPTIC
	#define SDL_INIT_FLAGS	SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC
	#ifdef _WIN32
		#include <SDL_haptic.h>
	#else
		#include <SDL/SDL_haptic.h>
	#endif
#else
	#define SDL_INIT_FLAGS	SDL_INIT_JOYSTICK
#endif

namespace ciface
{
namespace SDL
{

void Init( std::vector<ControllerInterface::Device*>& devices );

class Joystick : public ControllerInterface::Device
{
private:

#ifdef USE_SDL_HAPTIC
	struct EffectIDState
	{
		EffectIDState() : effect(SDL_HapticEffect()), id(-1), changed(false) {}

		SDL_HapticEffect	effect;
		int					id;
		bool				changed;
	};
#endif

	class Button : public Input
	{
	public:
		std::string GetName() const;
		Button(u8 index, SDL_Joystick* js) : m_js(js), m_index(index) {}
		ControlState GetState() const;
	private:
		 SDL_Joystick* const m_js;
		 const u8 m_index;
	};

	class Axis : public Input
	{
	public:
		std::string GetName() const;
		Axis(u8 index, SDL_Joystick* js, Sint16 range) : m_js(js), m_range(range), m_index(index) {}
		ControlState GetState() const;
	private:
		SDL_Joystick* const m_js;
		const Sint16 m_range;
		const u8 m_index;
	};

	class Hat : public Input
	{
	public:
		std::string GetName() const;
		Hat(u8 index, SDL_Joystick* js, u8 direction) : m_js(js), m_direction(direction), m_index(index) {}
		ControlState GetState() const;
	private:
		SDL_Joystick* const m_js;
		const u8 m_direction;
		const u8 m_index;
	};

#ifdef USE_SDL_HAPTIC
	class ConstantEffect : public Output
	{
	public:
		std::string GetName() const;
		ConstantEffect(EffectIDState& effect) : m_effect(effect) {}
		void SetState(const ControlState state);
	private:
		EffectIDState& m_effect;
	};

	class RampEffect : public Output
	{
	public:
		std::string GetName() const;
		RampEffect(EffectIDState& effect) : m_effect(effect) {}
		void SetState(const ControlState state);
	private:
		EffectIDState& m_effect;
	};
#endif

public:
	bool UpdateInput();
	bool UpdateOutput();

	Joystick(SDL_Joystick* const joystick, const int sdl_index, const unsigned int index);
	~Joystick();

	std::string GetName() const;
	int GetId() const;
	std::string GetSource() const;

private:
	SDL_Joystick* const			m_joystick;
	const int					m_sdl_index;
	const unsigned int			m_index;

#ifdef USE_SDL_HAPTIC
	std::list<EffectIDState>	m_state_out;
	SDL_Haptic*					m_haptic;
#endif
};

}
}

#endif