comparison src/joystick/macos/SDL_sysjoystick.c @ 0:74212992fb08

Initial revision
author Sam Lantinga <slouken@lokigames.com>
date Thu, 26 Apr 2001 16:45:43 +0000
parents
children e8157fcb3114
comparison
equal deleted inserted replaced
-1:000000000000 0:74212992fb08
1 /*
2 SDL - Simple DirectMedia Layer
3 Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
19 Sam Lantinga
20 slouken@devolution.com
21 */
22
23 #ifdef SAVE_RCSID
24 static char rcsid =
25 "@(#) $Id$";
26 #endif
27
28 /* SDL stuff -- "SDL_sysjoystick.c"
29 MacOS joystick functions by Frederick Reitberger
30
31 The code that follows is meant for SDL. Use at your own risk.
32 */
33
34 #include <string.h>
35
36 #include <InputSprocket.h>
37
38 #include "SDL_error.h"
39 #include "SDL_joystick.h"
40 #include "SDL_sysjoystick.h"
41 #include "SDL_joystick_c.h"
42
43
44 /* The max number of joysticks we will detect */
45 #define MAX_JOYSTICKS 16
46 /* Limit ourselves to 32 elements per device */
47 #define kMaxReferences 32
48
49 #define ISpSymmetricAxisToFloat(axis) ((((float) axis) - kISpAxisMiddle) / (kISpAxisMaximum-kISpAxisMiddle))
50 #define ISpAsymmetricAxisToFloat(axis) (((float) axis) / (kISpAxisMaximum))
51
52
53 static ISpDeviceReference SYS_Joysticks[MAX_JOYSTICKS];
54 static ISpElementListReference SYS_Elements[MAX_JOYSTICKS];
55 static ISpDeviceDefinition SYS_DevDef[MAX_JOYSTICKS];
56
57 struct joystick_hwdata
58 {
59 char name[64];
60 /* Uint8 id;*/
61 ISpElementReference refs[kMaxReferences];
62 /* gonna need some sort of mapping info */
63 };
64
65
66 /* Function to scan the system for joysticks.
67 * Joystick 0 should be the system default joystick.
68 * This function should return the number of available joysticks, or -1
69 * on an unrecoverable fatal error.
70 */
71 int SDL_SYS_JoystickInit(void)
72 {
73 static ISpDeviceClass classes[4] = {
74 kISpDeviceClass_Joystick,
75 kISpDeviceClass_Gamepad,
76 kISpDeviceClass_Wheel,
77 0
78 };
79 OSErr err;
80 int i;
81 UInt32 count, numJoysticks;
82
83 if ( (Ptr)0 == (Ptr)ISpStartup ) {
84 SDL_SetError("InputSprocket not installed");
85 return -1; // InputSprocket not installed
86 }
87
88 if( (Ptr)0 == (Ptr)ISpGetVersion ) {
89 SDL_SetError("InputSprocket not version 1.1 or newer");
90 return -1; // old version of ISp (not at least 1.1)
91 }
92
93 ISpStartup();
94
95 /* Get all the joysticks */
96 numJoysticks = 0;
97 for ( i=0; classes[i]; ++i ) {
98 count = 0;
99 err = ISpDevices_ExtractByClass(
100 classes[i],
101 MAX_JOYSTICKS-numJoysticks,
102 &count,
103 &SYS_Joysticks[numJoysticks]);
104 numJoysticks += count;
105 }
106
107 for(i = 0; i < numJoysticks; i++)
108 {
109 ISpDevice_GetDefinition(
110 SYS_Joysticks[i], sizeof(ISpDeviceDefinition),
111 &SYS_DevDef[i]);
112
113 err = ISpElementList_New(
114 0, NULL,
115 &SYS_Elements[i], 0);
116
117 if (err) {
118 SDL_OutOfMemory();
119 return -1;
120 }
121
122 ISpDevice_GetElementList(
123 SYS_Joysticks[i],
124 &SYS_Elements[i]);
125 }
126
127 ISpDevices_Deactivate(numJoysticks, SYS_Joysticks);
128
129 return numJoysticks;
130 }
131
132 /* Function to get the device-dependent name of a joystick */
133 const char *SDL_SYS_JoystickName(int index)
134 {
135 static char name[64];
136 int len;
137
138 /* convert pascal string to c-string */
139 len = SYS_DevDef[index].deviceName[0];
140 if ( len >= sizeof(name) ) {
141 len = (sizeof(name) - 1);
142 }
143 memcpy(name, &SYS_DevDef[index].deviceName[1], len);
144 name[len] = '\0';
145
146 return name;
147 }
148
149 /* Function to open a joystick for use.
150 The joystick to open is specified by the index field of the joystick.
151 This should fill the nbuttons and naxes fields of the joystick structure.
152 It returns 0, or -1 if there is an error.
153 */
154 int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)
155 {
156 int index;
157 UInt32 count, gotCount, count2;
158 long numAxis, numButtons, numHats, numBalls;
159
160 count = kMaxReferences;
161 count2 = 0;
162 numAxis = numButtons = numHats = numBalls = 0;
163
164 index = joystick->index;
165
166 /* allocate memory for system specific hardware data */
167 joystick->hwdata = (struct joystick_hwdata *) malloc(sizeof(*joystick->hwdata));
168 if (joystick->hwdata == NULL)
169 {
170 SDL_OutOfMemory();
171 return(-1);
172 }
173 memset(joystick->hwdata, 0, sizeof(*joystick->hwdata));
174 strcpy(joystick->hwdata->name, SDL_SYS_JoystickName(index));
175 joystick->name = joystick->hwdata->name;
176
177 ISpElementList_ExtractByKind(
178 SYS_Elements[index],
179 kISpElementKind_Axis,
180 count,
181 &gotCount,
182 joystick->hwdata->refs);
183
184 numAxis = gotCount;
185 count -= gotCount;
186 count2 += gotCount;
187
188 ISpElementList_ExtractByKind(
189 SYS_Elements[index],
190 kISpElementKind_DPad,
191 count,
192 &gotCount,
193 &(joystick->hwdata->refs[count2]));
194
195 numHats = gotCount;
196 count -= gotCount;
197 count2 += gotCount;
198
199 ISpElementList_ExtractByKind(
200 SYS_Elements[index],
201 kISpElementKind_Button,
202 count,
203 &gotCount,
204 &(joystick->hwdata->refs[count2]));
205
206 numButtons = gotCount;
207 count -= gotCount;
208 count2 += gotCount;
209
210 joystick->naxes = numAxis;
211 joystick->nhats = numHats;
212 joystick->nballs = numBalls;
213 joystick->nbuttons = numButtons;
214
215 ISpDevices_Activate(
216 1,
217 &SYS_Joysticks[index]);
218
219 return 0;
220 }
221
222 /* Function to update the state of a joystick - called as a device poll.
223 * This function shouldn't update the joystick structure directly,
224 * but instead should call SDL_PrivateJoystick*() to deliver events
225 * and update joystick device state.
226 */
227 void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
228 {
229 int i, j;
230 ISpAxisData a;
231 ISpDPadData b;
232 //ISpDeltaData c;
233 ISpButtonData d;
234
235 for(i = 0, j = 0; i < joystick->naxes; i++, j++)
236 {
237 Sint16 value;
238
239 ISpElement_GetSimpleState(
240 joystick->hwdata->refs[j],
241 &a);
242 value = (ISpSymmetricAxisToFloat(a)* 32767.0);
243 if ( value != joystick->axes[i] ) {
244 SDL_PrivateJoystickAxis(joystick, i, value);
245 }
246 }
247
248 for(i = 0; i < joystick->nhats; i++, j++)
249 {
250 Uint8 pos;
251
252 ISpElement_GetSimpleState(
253 joystick->hwdata->refs[j],
254 &b);
255 switch(b) {
256 case kISpPadIdle:
257 pos = SDL_HAT_CENTERED;
258 break;
259 case kISpPadLeft:
260 pos = SDL_HAT_LEFT;
261 break;
262 case kISpPadUpLeft:
263 pos = SDL_HAT_LEFTUP;
264 break;
265 case kISpPadUp:
266 pos = SDL_HAT_UP;
267 break;
268 case kISpPadUpRight:
269 pos = SDL_HAT_RIGHTUP;
270 break;
271 case kISpPadRight:
272 pos = SDL_HAT_RIGHT;
273 break;
274 case kISpPadDownRight:
275 pos = SDL_HAT_RIGHTDOWN;
276 break;
277 case kISpPadDown:
278 pos = SDL_HAT_DOWN;
279 break;
280 case kISpPadDownLeft:
281 pos = SDL_HAT_LEFTDOWN;
282 break;
283 }
284 if ( pos != joystick->hats[i] ) {
285 SDL_PrivateJoystickHat(joystick, i, pos);
286 }
287 }
288
289 for(i = 0; i < joystick->nballs; i++, j++)
290 {
291 /* ignore balls right now */
292 }
293
294 for(i = 0; i < joystick->nbuttons; i++, j++)
295 {
296 ISpElement_GetSimpleState(
297 joystick->hwdata->refs[j],
298 &d);
299 if ( d != joystick->buttons[i] ) {
300 SDL_PrivateJoystickButton(joystick, i, d);
301 }
302 }
303 }
304
305 /* Function to close a joystick after use */
306 void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
307 {
308 int index;
309
310 index = joystick->index;
311
312 ISpDevices_Deactivate(
313 1,
314 &SYS_Joysticks[index]);
315 }
316
317 /* Function to perform any system-specific joystick related cleanup */
318 void SDL_SYS_JoystickQuit(void)
319 {
320 ISpShutdown();
321 }
322