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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
#ifndef _CIFACE_SDL_H_
#define _CIFACE_SDL_H_
#include "../Device.h"
#include <list>
#include <SDL.h>
#if SDL_VERSION_ATLEAST(1, 3, 0)
#define USE_SDL_HAPTIC
#endif
#ifdef USE_SDL_HAPTIC
#include <SDL_haptic.h>
#define SDL_INIT_FLAGS SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC
#else
#define SDL_INIT_FLAGS SDL_INIT_JOYSTICK
#endif
namespace ciface
{
namespace SDL
{
void Init( std::vector<Core::Device*>& devices );
class Joystick : public Core::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 Core::Device::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 Core::Device::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;
};
class SineEffect : public Output
{
public:
std::string GetName() const;
SineEffect(EffectIDState& effect) : m_effect(effect) {}
void SetState(const ControlState state);
private:
EffectIDState& m_effect;
};
#ifdef SDL_HAPTIC_SQUARE
class SquareEffect : public Output
{
public:
std::string GetName() const;
SquareEffect(EffectIDState& effect) : m_effect(effect) {}
void SetState(const ControlState state);
private:
EffectIDState& m_effect;
};
#endif // defined(SDL_HAPTIC_SQUARE)
class TriangleEffect : public Output
{
public:
std::string GetName() const;
TriangleEffect(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
|