912484a2fe594faf97d3458d41ec24e640580049
[blender.git] / source / gameengine / GameLogic / Joystick / SCA_Joystick.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): snailrose.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file SCA_Joystick.h
29  *  \ingroup gamelogic
30  */
31
32 #ifndef __SCA_JOYSTICK_H__
33 #define __SCA_JOYSTICK_H__
34
35 #include "SCA_JoystickDefines.h"
36 #ifdef WITH_SDL
37 #  include "SDL.h"
38 #endif
39
40 /**
41  * Basic Joystick class
42  * I will make this class a singleton because there should be only one joystick
43  * even if there are more than one scene using it and count how many scene are using it.
44  * The underlying joystick should only be removed when the last scene is removed
45  */
46
47 class SCA_Joystick
48
49 {
50         static SCA_Joystick *m_instance[JOYINDEX_MAX];
51         static int m_joynum;
52         static int m_refCount;
53
54         class PrivateData;
55 #ifdef WITH_SDL
56         PrivateData             *m_private;
57 #endif
58         int                             m_joyindex;
59
60         /** 
61          *support for JOYAXIS_MAX axes (in pairs)
62          */
63         int m_axis_array[JOYAXIS_MAX];
64
65         /** 
66          *support for JOYHAT_MAX hats (each is a direction)
67          */
68         int m_hat_array[JOYHAT_MAX];
69         
70         /**
71          * Precision or range of the axes
72          */
73         int                     m_prec;
74
75         /**
76          * max # of buttons avail
77          */
78         
79         int                     m_axismax;
80         int                     m_buttonmax;
81         int                     m_hatmax;
82         
83         /** is the joystick initialized ?*/
84         bool                    m_isinit;
85
86         
87         /** is triggered for each event type */
88         bool                    m_istrig_axis;
89         bool                    m_istrig_button;
90         bool                    m_istrig_hat;
91
92 #ifdef WITH_SDL
93         /**
94          * event callbacks
95          */
96         void OnAxisMotion(SDL_Event *sdl_event);
97         void OnHatMotion(SDL_Event *sdl_event);
98         void OnButtonUp(SDL_Event *sdl_event);
99         void OnButtonDown(SDL_Event *sdl_event);
100         void OnNothing(SDL_Event *sdl_event);
101 #if 0 /* not used yet */
102         void OnBallMotion(SDL_Event *sdl_event) {}
103 #endif
104                 
105 #endif /* WITH_SDL */
106         /**
107          * Open the joystick
108          */
109         bool CreateJoystickDevice(void);
110
111         /**
112          * Close the joystick
113          */
114         void DestroyJoystickDevice(void);
115
116         /**
117          * fills the axis member values
118          */
119         void pFillButtons(void);
120
121         /**
122          * returns m_axis_array
123          */
124
125         int pAxisTest(int axisnum);
126         /**
127          * returns m_axis_array
128          */
129         int pGetAxis(int axisnum, int udlr);
130
131         SCA_Joystick(short int index);
132
133         ~SCA_Joystick();
134         
135 public:
136
137         static SCA_Joystick *GetInstance(short int joyindex);
138         static void HandleEvents(void);
139         void ReleaseInstance();
140         
141
142         /*
143          */
144         bool aAxisPairIsPositive(int axis);
145         bool aAxisPairDirectionIsPositive(int axis, int dir); /* function assumes joysticks are in axis pairs */
146         bool aAxisIsPositive(int axis_single); /* check a single axis only */
147
148         bool aAnyButtonPressIsPositive(void);
149         bool aButtonPressIsPositive(int button);
150         bool aButtonReleaseIsPositive(int button);
151         bool aHatIsPositive(int hatnum, int dir);
152
153         /**
154          * precision is default '3200' which is overridden by input
155          */
156
157         void cSetPrecision(int val);
158
159         int GetAxisPosition(int index) {
160                 return m_axis_array[index];
161         }
162
163         int GetHat(int index) {
164                 return m_hat_array[index];
165         }
166
167         int GetThreshold(void) {
168                 return m_prec;
169         }
170
171         bool IsTrigAxis(void) {
172                 return m_istrig_axis;
173         }
174         
175         bool IsTrigButton(void) {
176                 return m_istrig_button;
177         }
178         
179         bool IsTrigHat(void) {
180                 return m_istrig_hat;
181         }
182
183         /**
184          * returns the # of...
185          */
186
187         int GetNumberOfAxes(void);
188         int GetNumberOfButtons(void);
189         int GetNumberOfHats(void);
190         
191         /**
192          * Test if the joystick is connected
193          */
194         int Connected(void);
195 };
196
197 #endif
198