Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
1236 lines (1075 loc) · 35.5 KB

SDL_sysjoystick.c

File metadata and controls

1236 lines (1075 loc) · 35.5 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Feb 12, 2011
Feb 12, 2011
3
Copyright (C) 1997-2011 Sam Lantinga
Apr 26, 2001
Apr 26, 2001
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
Apr 26, 2001
Apr 26, 2001
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
Apr 26, 2001
Apr 26, 2001
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Apr 26, 2001
Apr 26, 2001
14
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Apr 26, 2001
Apr 26, 2001
18
19
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Apr 26, 2001
Apr 26, 2001
21
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
23
Apr 14, 2006
Apr 14, 2006
24
25
#ifdef SDL_JOYSTICK_LINUX
Apr 26, 2001
Apr 26, 2001
26
27
28
29
30
31
/* This is the system specific header for the SDL joystick API */
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
Jul 10, 2006
Jul 10, 2006
32
#include <limits.h> /* For the definition of PATH_MAX */
Apr 26, 2001
Apr 26, 2001
33
34
35
#include <linux/joystick.h>
#include "SDL_joystick.h"
Feb 16, 2006
Feb 16, 2006
36
37
#include "../SDL_sysjoystick.h"
#include "../SDL_joystick_c.h"
Aug 25, 2008
Aug 25, 2008
38
#include "SDL_sysjoystick_c.h"
Apr 26, 2001
Apr 26, 2001
39
Dec 2, 2002
Dec 2, 2002
40
/* Special joystick configurations */
Jul 10, 2006
Jul 10, 2006
41
42
43
44
45
46
static struct
{
const char *name;
int naxes;
int nhats;
int nballs;
Dec 2, 2002
Dec 2, 2002
47
} special_joysticks[] = {
Jul 10, 2006
Jul 10, 2006
48
49
50
51
52
53
{
"MadCatz Panther XL", 3, 2, 1}, /* We don't handle rudder (axis 8) */
{
"SideWinder Precision Pro", 4, 1, 0}, {
"SideWinder 3D Pro", 4, 1, 0}, {
"Microsoft SideWinder 3D Pro", 4, 1, 0}, {
Jun 14, 2007
Jun 14, 2007
54
"Microsoft SideWinder Precision Pro", 4, 1, 0}, {
Jul 10, 2006
Jul 10, 2006
55
56
57
58
59
60
"Microsoft SideWinder Dual Strike USB version 1.0", 2, 1, 0}, {
"WingMan Interceptor", 3, 3, 0}, {
"WingMan Extreme Digital 3D", 4, 1, 0}, {
"Microsoft SideWinder Precision 2 Joystick", 4, 1, 0}, {
"Logitech Inc. WingMan Extreme Digital 3D", 4, 1, 0}, {
"Saitek Saitek X45", 6, 1, 0}
Apr 26, 2001
Apr 26, 2001
61
62
};
Sep 29, 2009
Sep 29, 2009
63
64
65
/* It looks like newer kernels have the logical mapping at the driver level */
#define NO_LOGICAL_JOYSTICKS
May 16, 2004
May 16, 2004
66
67
#ifndef NO_LOGICAL_JOYSTICKS
Mar 19, 2006
Mar 19, 2006
68
69
70
71
72
73
74
75
76
77
78
/*
Some USB HIDs show up as a single joystick even though they actually
control 2 or more joysticks.
*/
/*
This code handles the MP-8800 (Quad) and MP-8866 (Dual), which can
be identified by their transparent blue design. It's quite trivial
to add other joysticks with similar quirky behavior.
-id
*/
Jul 10, 2006
Jul 10, 2006
79
80
81
82
struct joystick_logical_mapping
{
int njoy;
int nthing;
Mar 19, 2006
Mar 19, 2006
83
84
85
86
87
88
89
90
};
/*
{logical joy, logical axis},
{logical joy, logical hat},
{logical joy, logical ball},
{logical joy, logical button}
*/
May 16, 2004
May 16, 2004
91
Mar 19, 2006
Mar 19, 2006
92
static struct joystick_logical_mapping mp88xx_1_logical_axismap[] = {
Jul 10, 2006
Jul 10, 2006
93
{0, 0}, {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}
Mar 19, 2006
Mar 19, 2006
94
};
Aug 27, 2008
Aug 27, 2008
95
Mar 19, 2006
Mar 19, 2006
96
static struct joystick_logical_mapping mp88xx_1_logical_buttonmap[] = {
Jul 10, 2006
Jul 10, 2006
97
98
{0, 0}, {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, {0, 6}, {0, 7}, {0, 8},
{0, 9}, {0, 10}, {0, 11}
Mar 19, 2006
Mar 19, 2006
99
};
May 16, 2004
May 16, 2004
100
Mar 19, 2006
Mar 19, 2006
101
static struct joystick_logical_mapping mp88xx_2_logical_axismap[] = {
Jul 10, 2006
Jul 10, 2006
102
103
{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {0, 3},
{1, 2}, {1, 3}, {0, 4}, {0, 5}, {1, 4}, {1, 5}
Mar 19, 2006
Mar 19, 2006
104
};
Aug 27, 2008
Aug 27, 2008
105
Mar 19, 2006
Mar 19, 2006
106
static struct joystick_logical_mapping mp88xx_2_logical_buttonmap[] = {
Jul 10, 2006
Jul 10, 2006
107
108
109
110
{0, 0}, {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, {0, 6}, {0, 7}, {0, 8},
{0, 9}, {0, 10}, {0, 11},
{1, 0}, {1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7}, {1, 8},
{1, 9}, {1, 10}, {1, 11}
Mar 19, 2006
Mar 19, 2006
111
};
May 16, 2004
May 16, 2004
112
Mar 19, 2006
Mar 19, 2006
113
static struct joystick_logical_mapping mp88xx_3_logical_axismap[] = {
Jul 10, 2006
Jul 10, 2006
114
115
116
{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {0, 3},
{1, 2}, {1, 3}, {2, 0}, {2, 1}, {2, 2}, {2, 3},
{0, 4}, {0, 5}, {1, 4}, {1, 5}, {2, 4}, {2, 5}
Mar 19, 2006
Mar 19, 2006
117
};
Aug 27, 2008
Aug 27, 2008
118
Mar 19, 2006
Mar 19, 2006
119
static struct joystick_logical_mapping mp88xx_3_logical_buttonmap[] = {
Jul 10, 2006
Jul 10, 2006
120
121
122
123
124
125
{0, 0}, {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, {0, 6}, {0, 7}, {0, 8},
{0, 9}, {0, 10}, {0, 11},
{1, 0}, {1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7}, {1, 8},
{1, 9}, {1, 10}, {1, 11},
{2, 0}, {2, 1}, {2, 2}, {2, 3}, {2, 4}, {2, 5}, {2, 6}, {2, 7}, {2, 8},
{2, 9}, {2, 10}, {2, 11}
Mar 19, 2006
Mar 19, 2006
126
127
128
};
static struct joystick_logical_mapping mp88xx_4_logical_axismap[] = {
Jul 10, 2006
Jul 10, 2006
129
130
131
132
{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {0, 3},
{1, 2}, {1, 3}, {2, 0}, {2, 1}, {2, 2}, {2, 3},
{3, 0}, {3, 1}, {3, 2}, {3, 3}, {0, 4}, {0, 5},
{1, 4}, {1, 5}, {2, 4}, {2, 5}, {3, 4}, {3, 5}
Mar 19, 2006
Mar 19, 2006
133
};
Aug 27, 2008
Aug 27, 2008
134
Mar 19, 2006
Mar 19, 2006
135
static struct joystick_logical_mapping mp88xx_4_logical_buttonmap[] = {
Jul 10, 2006
Jul 10, 2006
136
137
138
139
140
141
142
143
{0, 0}, {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, {0, 6}, {0, 7}, {0, 8},
{0, 9}, {0, 10}, {0, 11},
{1, 0}, {1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7}, {1, 8},
{1, 9}, {1, 10}, {1, 11},
{2, 0}, {2, 1}, {2, 2}, {2, 3}, {2, 4}, {2, 5}, {2, 6}, {2, 7}, {2, 8},
{2, 9}, {2, 10}, {2, 11},
{3, 0}, {3, 1}, {3, 2}, {3, 3}, {3, 4}, {3, 5}, {3, 6}, {3, 7}, {3, 8},
{3, 9}, {3, 10}, {3, 11}
May 16, 2004
May 16, 2004
144
145
};
Jul 10, 2006
Jul 10, 2006
146
147
148
149
150
151
struct joystick_logical_layout
{
int naxes;
int nhats;
int nballs;
int nbuttons;
Mar 19, 2006
Mar 19, 2006
152
153
154
};
static struct joystick_logical_layout mp88xx_1_logical_layout[] = {
Jul 10, 2006
Jul 10, 2006
155
{6, 0, 0, 12}
Mar 19, 2006
Mar 19, 2006
156
};
Aug 27, 2008
Aug 27, 2008
157
Mar 19, 2006
Mar 19, 2006
158
static struct joystick_logical_layout mp88xx_2_logical_layout[] = {
Jul 10, 2006
Jul 10, 2006
159
160
{6, 0, 0, 12},
{6, 0, 0, 12}
Mar 19, 2006
Mar 19, 2006
161
};
Aug 27, 2008
Aug 27, 2008
162
Mar 19, 2006
Mar 19, 2006
163
static struct joystick_logical_layout mp88xx_3_logical_layout[] = {
Jul 10, 2006
Jul 10, 2006
164
165
166
{6, 0, 0, 12},
{6, 0, 0, 12},
{6, 0, 0, 12}
Mar 19, 2006
Mar 19, 2006
167
};
Aug 27, 2008
Aug 27, 2008
168
Mar 19, 2006
Mar 19, 2006
169
static struct joystick_logical_layout mp88xx_4_logical_layout[] = {
Jul 10, 2006
Jul 10, 2006
170
171
172
173
{6, 0, 0, 12},
{6, 0, 0, 12},
{6, 0, 0, 12},
{6, 0, 0, 12}
May 16, 2004
May 16, 2004
174
175
176
};
/*
Mar 19, 2006
Mar 19, 2006
177
178
This array sets up a means of mapping a single physical joystick to
multiple logical joysticks. (djm)
May 16, 2004
May 16, 2004
179
180
181
182
183
184
185
186
187
188
njoys
the number of logical joysticks
layouts
an array of layout structures, one to describe each logical joystick
axes, hats, balls, buttons
arrays that map a physical thingy to a logical thingy
*/
Jul 10, 2006
Jul 10, 2006
189
190
191
192
193
194
195
196
197
198
struct joystick_logicalmap
{
const char *name;
int nbuttons;
int njoys;
struct joystick_logical_layout *layout;
struct joystick_logical_mapping *axismap;
struct joystick_logical_mapping *hatmap;
struct joystick_logical_mapping *ballmap;
struct joystick_logical_mapping *buttonmap;
Mar 19, 2006
Mar 19, 2006
199
200
201
};
static struct joystick_logicalmap joystick_logicalmap[] = {
Jul 10, 2006
Jul 10, 2006
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
{
"WiseGroup.,Ltd MP-8866 Dual USB Joypad",
12,
1,
mp88xx_1_logical_layout,
mp88xx_1_logical_axismap,
NULL,
NULL,
mp88xx_1_logical_buttonmap},
{
"WiseGroup.,Ltd MP-8866 Dual USB Joypad",
24,
2,
mp88xx_2_logical_layout,
mp88xx_2_logical_axismap,
NULL,
NULL,
mp88xx_2_logical_buttonmap},
{
"WiseGroup.,Ltd MP-8800 Quad USB Joypad",
12,
1,
mp88xx_1_logical_layout,
mp88xx_1_logical_axismap,
NULL,
NULL,
mp88xx_1_logical_buttonmap},
{
"WiseGroup.,Ltd MP-8800 Quad USB Joypad",
24,
2,
mp88xx_2_logical_layout,
mp88xx_2_logical_axismap,
NULL,
NULL,
mp88xx_2_logical_buttonmap},
{
"WiseGroup.,Ltd MP-8800 Quad USB Joypad",
36,
3,
mp88xx_3_logical_layout,
mp88xx_3_logical_axismap,
NULL,
NULL,
mp88xx_3_logical_buttonmap},
{
"WiseGroup.,Ltd MP-8800 Quad USB Joypad",
48,
4,
mp88xx_4_logical_layout,
mp88xx_4_logical_axismap,
NULL,
NULL,
mp88xx_4_logical_buttonmap}
May 16, 2004
May 16, 2004
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
};
/* find the head of a linked list, given a point in it
*/
#define SDL_joylist_head(i, start)\
for(i = start; SDL_joylist[i].fname == NULL;) i = SDL_joylist[i].prev;
#define SDL_logical_joydecl(d) d
#else
#define SDL_logical_joydecl(d)
#endif /* USE_LOGICAL_JOYSTICKS */
Apr 26, 2001
Apr 26, 2001
272
273
274
275
/* The maximum number of joysticks we'll detect */
#define MAX_JOYSTICKS 32
/* A list of available joysticks */
May 16, 2004
May 16, 2004
276
277
static struct
{
Jul 10, 2006
Jul 10, 2006
278
char *fname;
May 16, 2004
May 16, 2004
279
#ifndef NO_LOGICAL_JOYSTICKS
Jul 10, 2006
Jul 10, 2006
280
281
282
283
284
285
SDL_Joystick *joy;
struct joystick_logicalmap *map;
int prev;
int next;
int logicalno;
#endif /* USE_LOGICAL_JOYSTICKS */
May 16, 2004
May 16, 2004
286
287
} SDL_joylist[MAX_JOYSTICKS];
Apr 26, 2001
Apr 26, 2001
288
May 16, 2004
May 16, 2004
289
290
#ifndef NO_LOGICAL_JOYSTICKS
Jul 10, 2006
Jul 10, 2006
291
292
static int
CountLogicalJoysticks(int max)
May 16, 2004
May 16, 2004
293
{
Jul 10, 2006
Jul 10, 2006
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
register int i, j, k, ret, prev;
const char *name;
int nbuttons, fd;
unsigned char n;
ret = 0;
for (i = 0; i < max; i++) {
name = SDL_SYS_JoystickName(i);
fd = open(SDL_joylist[i].fname, O_RDONLY, 0);
if (fd >= 0) {
if (ioctl(fd, JSIOCGBUTTONS, &n) < 0) {
nbuttons = -1;
} else {
nbuttons = n;
}
close(fd);
} else {
nbuttons = -1;
}
if (name) {
for (j = 0; j < SDL_arraysize(joystick_logicalmap); j++) {
if (!SDL_strcmp(name, joystick_logicalmap[j].name)
&& (nbuttons == -1
|| nbuttons == joystick_logicalmap[j].nbuttons)) {
prev = i;
SDL_joylist[prev].map = &(joystick_logicalmap[j]);
for (k = 1; k < joystick_logicalmap[j].njoys; k++) {
SDL_joylist[prev].next = max + ret;
SDL_joylist[max + ret].prev = prev;
prev = max + ret;
SDL_joylist[prev].logicalno = k;
SDL_joylist[prev].map = &(joystick_logicalmap[j]);
ret++;
}
break;
}
May 16, 2004
May 16, 2004
336
}
Jul 10, 2006
Jul 10, 2006
337
338
}
}
May 16, 2004
May 16, 2004
339
Jul 10, 2006
Jul 10, 2006
340
return ret;
May 16, 2004
May 16, 2004
341
342
}
Jul 10, 2006
Jul 10, 2006
343
344
static void
LogicalSuffix(int logicalno, char *namebuf, int len)
May 16, 2004
May 16, 2004
345
{
Jul 10, 2006
Jul 10, 2006
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
register int slen;
const static char suffixs[] =
"01020304050607080910111213141516171819" "20212223242526272829303132";
const char *suffix;
slen = SDL_strlen(namebuf);
suffix = NULL;
if (logicalno * 2 < sizeof(suffixs))
suffix = suffixs + (logicalno * 2);
if (slen + 4 < len && suffix) {
namebuf[slen++] = ' ';
namebuf[slen++] = '#';
namebuf[slen++] = suffix[0];
namebuf[slen++] = suffix[1];
namebuf[slen++] = 0;
}
May 16, 2004
May 16, 2004
363
364
365
366
}
#endif /* USE_LOGICAL_JOYSTICKS */
Feb 16, 2006
Feb 16, 2006
367
#if SDL_INPUT_LINUXEV
Apr 26, 2001
Apr 26, 2001
368
#define test_bit(nr, addr) \
Oct 18, 2009
Oct 18, 2009
369
370
(((1UL << ((nr) % (sizeof(long) * 8))) & ((addr)[(nr) / (sizeof(long) * 8)])) != 0)
#define NBITS(x) ((((x)-1)/(sizeof(long) * 8))+1)
Apr 26, 2001
Apr 26, 2001
371
Jul 10, 2006
Jul 10, 2006
372
373
static int
EV_IsJoystick(int fd)
Apr 26, 2001
Apr 26, 2001
374
{
Oct 18, 2009
Oct 18, 2009
375
376
377
unsigned long evbit[NBITS(EV_MAX)] = { 0 };
unsigned long keybit[NBITS(KEY_MAX)] = { 0 };
unsigned long absbit[NBITS(ABS_MAX)] = { 0 };
Jul 10, 2006
Jul 10, 2006
378
379
380
381
382
383
if ((ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), evbit) < 0) ||
(ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) < 0) ||
(ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit) < 0)) {
return (0);
}
Feb 21, 2009
Feb 21, 2009
384
Jul 10, 2006
Jul 10, 2006
385
if (!(test_bit(EV_KEY, evbit) && test_bit(EV_ABS, evbit) &&
Feb 21, 2009
Feb 21, 2009
386
test_bit(ABS_X, absbit) && test_bit(ABS_Y, absbit))) {
Jul 10, 2006
Jul 10, 2006
387
return 0;
Feb 21, 2009
Feb 21, 2009
388
}
Jul 10, 2006
Jul 10, 2006
389
return (1);
Apr 26, 2001
Apr 26, 2001
390
391
}
Feb 16, 2006
Feb 16, 2006
392
#endif /* SDL_INPUT_LINUXEV */
Apr 26, 2001
Apr 26, 2001
393
394
/* Function to scan the system for joysticks */
Jul 10, 2006
Jul 10, 2006
395
396
int
SDL_SYS_JoystickInit(void)
Apr 26, 2001
Apr 26, 2001
397
{
Jul 10, 2006
Jul 10, 2006
398
399
/* The base path of the joystick devices */
const char *joydev_pattern[] = {
Feb 16, 2006
Feb 16, 2006
400
#if SDL_INPUT_LINUXEV
Jul 10, 2006
Jul 10, 2006
401
"/dev/input/event%d",
Apr 26, 2001
Apr 26, 2001
402
#endif
Jul 10, 2006
Jul 10, 2006
403
404
405
406
407
408
409
410
411
412
413
414
415
"/dev/input/js%d",
"/dev/js%d"
};
int numjoysticks;
int i, j;
int fd;
char path[PATH_MAX];
dev_t dev_nums[MAX_JOYSTICKS]; /* major/minor device numbers */
struct stat sb;
int n, duplicate;
numjoysticks = 0;
Feb 16, 2011
Feb 16, 2011
416
/* First see if the user specified one or more joysticks to use */
Jul 10, 2006
Jul 10, 2006
417
if (SDL_getenv("SDL_JOYSTICK_DEVICE") != NULL) {
Feb 16, 2011
Feb 16, 2011
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
char *envcopy, *envpath, *delim;
envcopy = SDL_strdup(SDL_getenv("SDL_JOYSTICK_DEVICE"));
envpath = envcopy;
while (envpath != NULL) {
delim = SDL_strchr(envpath, ':');
if (delim != NULL) {
*delim++ = '\0';
}
if (stat(envpath, &sb) == 0) {
fd = open(envpath, O_RDONLY, 0);
if (fd >= 0) {
/* Assume the user knows what they're doing. */
SDL_joylist[numjoysticks].fname = SDL_strdup(envpath);
if (SDL_joylist[numjoysticks].fname) {
dev_nums[numjoysticks] = sb.st_rdev;
++numjoysticks;
}
close(fd);
Jul 10, 2006
Jul 10, 2006
436
437
}
}
Feb 16, 2011
Feb 16, 2011
438
envpath = delim;
Jul 10, 2006
Jul 10, 2006
439
}
Feb 16, 2011
Feb 16, 2011
440
SDL_free(envcopy);
Jul 10, 2006
Jul 10, 2006
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
}
for (i = 0; i < SDL_arraysize(joydev_pattern); ++i) {
for (j = 0; j < MAX_JOYSTICKS; ++j) {
SDL_snprintf(path, SDL_arraysize(path), joydev_pattern[i], j);
/* rcg06302000 replaced access(F_OK) call with stat().
* stat() will fail if the file doesn't exist, so it's
* equivalent behaviour.
*/
if (stat(path, &sb) == 0) {
/* Check to make sure it's not already in list.
* This happens when we see a stick via symlink.
*/
duplicate = 0;
for (n = 0; (n < numjoysticks) && !duplicate; ++n) {
if (sb.st_rdev == dev_nums[n]) {
duplicate = 1;
}
}
if (duplicate) {
continue;
}
fd = open(path, O_RDONLY, 0);
if (fd < 0) {
continue;
}
Feb 16, 2006
Feb 16, 2006
469
#if SDL_INPUT_LINUXEV
Apr 26, 2001
Apr 26, 2001
470
#ifdef DEBUG_INPUT_EVENTS
Jul 10, 2006
Jul 10, 2006
471
printf("Checking %s\n", path);
Apr 26, 2001
Apr 26, 2001
472
#endif
Jul 10, 2006
Jul 10, 2006
473
474
475
476
if ((i == 0) && !EV_IsJoystick(fd)) {
close(fd);
continue;
}
Apr 26, 2001
Apr 26, 2001
477
#endif
Jul 10, 2006
Jul 10, 2006
478
479
480
481
482
483
484
485
close(fd);
/* We're fine, add this joystick */
SDL_joylist[numjoysticks].fname = SDL_strdup(path);
if (SDL_joylist[numjoysticks].fname) {
dev_nums[numjoysticks] = sb.st_rdev;
++numjoysticks;
}
Dec 29, 2007
Dec 29, 2007
486
}
Jul 10, 2006
Jul 10, 2006
487
}
Dec 2, 2002
Dec 2, 2002
488
Feb 16, 2006
Feb 16, 2006
489
#if SDL_INPUT_LINUXEV
Jul 10, 2006
Jul 10, 2006
490
491
492
493
494
495
496
497
498
/* This is a special case...
If the event devices are valid then the joystick devices
will be duplicates but without extra information about their
hats or balls. Unfortunately, the event devices can't
currently be calibrated, so it's a win-lose situation.
So : /dev/input/eventX = /dev/input/jsY = /dev/jsY
*/
if ((i == 0) && (numjoysticks > 0))
break;
Dec 2, 2002
Dec 2, 2002
499
#endif
Jul 10, 2006
Jul 10, 2006
500
}
May 16, 2004
May 16, 2004
501
#ifndef NO_LOGICAL_JOYSTICKS
Jul 10, 2006
Jul 10, 2006
502
numjoysticks += CountLogicalJoysticks(numjoysticks);
May 16, 2004
May 16, 2004
503
#endif
Dec 2, 2002
Dec 2, 2002
504
Jul 10, 2006
Jul 10, 2006
505
return (numjoysticks);
Apr 26, 2001
Apr 26, 2001
506
507
508
}
/* Function to get the device-dependent name of a joystick */
Jul 10, 2006
Jul 10, 2006
509
510
const char *
SDL_SYS_JoystickName(int index)
Apr 26, 2001
Apr 26, 2001
511
{
Jul 10, 2006
Jul 10, 2006
512
513
514
515
int fd;
static char namebuf[128];
char *name;
SDL_logical_joydecl(int oindex = index);
Apr 26, 2001
Apr 26, 2001
516
May 16, 2004
May 16, 2004
517
#ifndef NO_LOGICAL_JOYSTICKS
Jul 10, 2006
Jul 10, 2006
518
SDL_joylist_head(index, index);
May 16, 2004
May 16, 2004
519
#endif
Jul 10, 2006
Jul 10, 2006
520
521
522
523
name = NULL;
fd = open(SDL_joylist[index].fname, O_RDONLY, 0);
if (fd >= 0) {
if (
Feb 16, 2006
Feb 16, 2006
524
#if SDL_INPUT_LINUXEV
Jul 10, 2006
Jul 10, 2006
525
(ioctl(fd, EVIOCGNAME(sizeof(namebuf)), namebuf) <= 0) &&
Apr 26, 2001
Apr 26, 2001
526
#endif
Jul 10, 2006
Jul 10, 2006
527
528
529
530
531
532
(ioctl(fd, JSIOCGNAME(sizeof(namebuf)), namebuf) <= 0)) {
name = SDL_joylist[index].fname;
} else {
name = namebuf;
}
close(fd);
May 16, 2004
May 16, 2004
533
Mar 19, 2006
Mar 19, 2006
534
May 16, 2004
May 16, 2004
535
#ifndef NO_LOGICAL_JOYSTICKS
Jul 10, 2006
Jul 10, 2006
536
537
538
539
if (SDL_joylist[oindex].prev || SDL_joylist[oindex].next
|| index != oindex) {
LogicalSuffix(SDL_joylist[oindex].logicalno, namebuf, 128);
}
May 16, 2004
May 16, 2004
540
#endif
Jul 10, 2006
Jul 10, 2006
541
542
}
return name;
Apr 26, 2001
Apr 26, 2001
543
544
}
Jul 10, 2006
Jul 10, 2006
545
546
static int
allocate_hatdata(SDL_Joystick * joystick)
Apr 26, 2001
Apr 26, 2001
547
{
Jul 10, 2006
Jul 10, 2006
548
549
550
551
552
553
554
555
556
557
558
559
560
int i;
joystick->hwdata->hats =
(struct hwdata_hat *) SDL_malloc(joystick->nhats *
sizeof(struct hwdata_hat));
if (joystick->hwdata->hats == NULL) {
return (-1);
}
for (i = 0; i < joystick->nhats; ++i) {
joystick->hwdata->hats[i].axis[0] = 1;
joystick->hwdata->hats[i].axis[1] = 1;
}
return (0);
Apr 26, 2001
Apr 26, 2001
561
562
}
Jul 10, 2006
Jul 10, 2006
563
564
static int
allocate_balldata(SDL_Joystick * joystick)
Apr 26, 2001
Apr 26, 2001
565
{
Jul 10, 2006
Jul 10, 2006
566
567
568
569
570
571
572
573
574
575
576
577
578
int i;
joystick->hwdata->balls =
(struct hwdata_ball *) SDL_malloc(joystick->nballs *
sizeof(struct hwdata_ball));
if (joystick->hwdata->balls == NULL) {
return (-1);
}
for (i = 0; i < joystick->nballs; ++i) {
joystick->hwdata->balls[i].axis[0] = 0;
joystick->hwdata->balls[i].axis[1] = 0;
}
return (0);
Apr 26, 2001
Apr 26, 2001
579
580
}
Jul 10, 2006
Jul 10, 2006
581
582
static SDL_bool
JS_ConfigJoystick(SDL_Joystick * joystick, int fd)
Apr 26, 2001
Apr 26, 2001
583
{
Jul 10, 2006
Jul 10, 2006
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
SDL_bool handled;
unsigned char n;
int old_axes, tmp_naxes, tmp_nhats, tmp_nballs;
const char *name;
char *env, env_name[128];
int i;
handled = SDL_FALSE;
/* Default joystick device settings */
if (ioctl(fd, JSIOCGAXES, &n) < 0) {
joystick->naxes = 2;
} else {
joystick->naxes = n;
}
if (ioctl(fd, JSIOCGBUTTONS, &n) < 0) {
joystick->nbuttons = 2;
} else {
joystick->nbuttons = n;
}
name = SDL_SYS_JoystickName(joystick->index);
old_axes = joystick->naxes;
/* Generic analog joystick support */
if (SDL_strstr(name, "Analog") == name && SDL_strstr(name, "-hat")) {
if (SDL_sscanf(name, "Analog %d-axis %*d-button %d-hat",
&tmp_naxes, &tmp_nhats) == 2) {
joystick->naxes = tmp_naxes;
joystick->nhats = tmp_nhats;
handled = SDL_TRUE;
}
}
/* Special joystick support */
for (i = 0; i < SDL_arraysize(special_joysticks); ++i) {
if (SDL_strcmp(name, special_joysticks[i].name) == 0) {
joystick->naxes = special_joysticks[i].naxes;
joystick->nhats = special_joysticks[i].nhats;
joystick->nballs = special_joysticks[i].nballs;
handled = SDL_TRUE;
break;
}
}
/* User environment joystick support */
if ((env = SDL_getenv("SDL_LINUX_JOYSTICK"))) {
*env_name = '\0';
if (*env == '\'' && SDL_sscanf(env, "'%[^']s'", env_name) == 1)
env += SDL_strlen(env_name) + 2;
else if (SDL_sscanf(env, "%s", env_name) == 1)
env += SDL_strlen(env_name);
if (SDL_strcmp(name, env_name) == 0) {
if (SDL_sscanf(env, "%d %d %d", &tmp_naxes, &tmp_nhats,
&tmp_nballs) == 3) {
joystick->naxes = tmp_naxes;
joystick->nhats = tmp_nhats;
joystick->nballs = tmp_nballs;
handled = SDL_TRUE;
}
}
}
/* Remap hats and balls */
if (handled) {
if (joystick->nhats > 0) {
if (allocate_hatdata(joystick) < 0) {
joystick->nhats = 0;
}
}
if (joystick->nballs > 0) {
if (allocate_balldata(joystick) < 0) {
joystick->nballs = 0;
}
}
}
return (handled);
Apr 26, 2001
Apr 26, 2001
670
671
}
Feb 16, 2006
Feb 16, 2006
672
#if SDL_INPUT_LINUXEV
Apr 26, 2001
Apr 26, 2001
673
Jul 10, 2006
Jul 10, 2006
674
675
static SDL_bool
EV_ConfigJoystick(SDL_Joystick * joystick, int fd)
Apr 26, 2001
Apr 26, 2001
676
{
Jul 10, 2006
Jul 10, 2006
677
int i, t;
Oct 18, 2009
Oct 18, 2009
678
679
680
unsigned long keybit[NBITS(KEY_MAX)] = { 0 };
unsigned long absbit[NBITS(ABS_MAX)] = { 0 };
unsigned long relbit[NBITS(REL_MAX)] = { 0 };
Jul 10, 2006
Jul 10, 2006
681
682
683
684
685
686
687
688
689
690
/* See if this device uses the new unified event API */
if ((ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) >= 0) &&
(ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit) >= 0) &&
(ioctl(fd, EVIOCGBIT(EV_REL, sizeof(relbit)), relbit) >= 0)) {
joystick->hwdata->is_hid = SDL_TRUE;
/* Get the number of buttons, axes, and other thingamajigs */
for (i = BTN_JOYSTICK; i < KEY_MAX; ++i) {
if (test_bit(i, keybit)) {
Apr 26, 2001
Apr 26, 2001
691
#ifdef DEBUG_INPUT_EVENTS
Jul 10, 2006
Jul 10, 2006
692
printf("Joystick has button: 0x%x\n", i);
Apr 26, 2001
Apr 26, 2001
693
#endif
Jul 10, 2006
Jul 10, 2006
694
695
696
697
698
699
joystick->hwdata->key_map[i - BTN_MISC] = joystick->nbuttons;
++joystick->nbuttons;
}
}
for (i = BTN_MISC; i < BTN_JOYSTICK; ++i) {
if (test_bit(i, keybit)) {
Apr 26, 2001
Apr 26, 2001
700
#ifdef DEBUG_INPUT_EVENTS
Jul 10, 2006
Jul 10, 2006
701
printf("Joystick has button: 0x%x\n", i);
Apr 26, 2001
Apr 26, 2001
702
#endif
Jul 10, 2006
Jul 10, 2006
703
704
705
706
707
708
709
710
711
712
713
joystick->hwdata->key_map[i - BTN_MISC] = joystick->nbuttons;
++joystick->nbuttons;
}
}
for (i = 0; i < ABS_MAX; ++i) {
/* Skip hats */
if (i == ABS_HAT0X) {
i = ABS_HAT3Y;
continue;
}
if (test_bit(i, absbit)) {
Jan 24, 2011
Jan 24, 2011
714
struct input_absinfo absinfo;
Jul 10, 2006
Jul 10, 2006
715
Jan 24, 2011
Jan 24, 2011
716
if (ioctl(fd, EVIOCGABS(i), &absinfo) < 0)
Jul 10, 2006
Jul 10, 2006
717
continue;
Apr 26, 2001
Apr 26, 2001
718
#ifdef DEBUG_INPUT_EVENTS
Jul 10, 2006
Jul 10, 2006
719
720
printf("Joystick has absolute axis: %x\n", i);
printf("Values = { %d, %d, %d, %d, %d }\n",
Jan 24, 2011
Jan 24, 2011
721
722
absinfo.value, absinfo.minimum, absinfo.maximum,
absinfo.fuzz, absinfo.flat);
Apr 26, 2001
Apr 26, 2001
723
#endif /* DEBUG_INPUT_EVENTS */
Jul 10, 2006
Jul 10, 2006
724
joystick->hwdata->abs_map[i] = joystick->naxes;
Jan 24, 2011
Jan 24, 2011
725
if (absinfo.minimum == absinfo.maximum) {
Jul 10, 2006
Jul 10, 2006
726
727
728
729
joystick->hwdata->abs_correct[i].used = 0;
} else {
joystick->hwdata->abs_correct[i].used = 1;
joystick->hwdata->abs_correct[i].coef[0] =
Jan 24, 2011
Jan 24, 2011
730
(absinfo.maximum + absinfo.minimum) / 2 - absinfo.flat;
Jul 10, 2006
Jul 10, 2006
731
joystick->hwdata->abs_correct[i].coef[1] =
Jan 24, 2011
Jan 24, 2011
732
733
(absinfo.maximum + absinfo.minimum) / 2 + absinfo.flat;
t = ((absinfo.maximum - absinfo.minimum) / 2 - 2 * absinfo.flat);
Jul 10, 2006
Jul 10, 2006
734
735
736
737
738
739
740
741
742
743
744
745
if (t != 0) {
joystick->hwdata->abs_correct[i].coef[2] =
(1 << 29) / t;
} else {
joystick->hwdata->abs_correct[i].coef[2] = 0;
}
}
++joystick->naxes;
}
}
for (i = ABS_HAT0X; i <= ABS_HAT3Y; i += 2) {
if (test_bit(i, absbit) || test_bit(i + 1, absbit)) {
Apr 26, 2001
Apr 26, 2001
746
#ifdef DEBUG_INPUT_EVENTS
Jul 10, 2006
Jul 10, 2006
747
printf("Joystick has hat %d\n", (i - ABS_HAT0X) / 2);
Apr 26, 2001
Apr 26, 2001
748
#endif
Jul 10, 2006
Jul 10, 2006
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
++joystick->nhats;
}
}
if (test_bit(REL_X, relbit) || test_bit(REL_Y, relbit)) {
++joystick->nballs;
}
/* Allocate data to keep track of these thingamajigs */
if (joystick->nhats > 0) {
if (allocate_hatdata(joystick) < 0) {
joystick->nhats = 0;
}
}
if (joystick->nballs > 0) {
if (allocate_balldata(joystick) < 0) {
joystick->nballs = 0;
}
}
}
return (joystick->hwdata->is_hid);
Apr 26, 2001
Apr 26, 2001
769
770
}
Feb 16, 2006
Feb 16, 2006
771
#endif /* SDL_INPUT_LINUXEV */
Apr 26, 2001
Apr 26, 2001
772
May 16, 2004
May 16, 2004
773
#ifndef NO_LOGICAL_JOYSTICKS
Jul 10, 2006
Jul 10, 2006
774
775
static void
ConfigLogicalJoystick(SDL_Joystick * joystick)
May 16, 2004
May 16, 2004
776
{
Jul 10, 2006
Jul 10, 2006
777
778
779
780
781
782
783
784
785
struct joystick_logical_layout *layout;
layout = SDL_joylist[joystick->index].map->layout +
SDL_joylist[joystick->index].logicalno;
joystick->nbuttons = layout->nbuttons;
joystick->nhats = layout->nhats;
joystick->naxes = layout->naxes;
joystick->nballs = layout->nballs;
May 16, 2004
May 16, 2004
786
787
788
789
}
#endif
Apr 26, 2001
Apr 26, 2001
790
791
792
793
794
/* Function to open a joystick for use.
The joystick to open is specified by the index field of the joystick.
This should fill the nbuttons and naxes fields of the joystick structure.
It returns 0, or -1 if there is an error.
*/
Jul 10, 2006
Jul 10, 2006
795
796
int
SDL_SYS_JoystickOpen(SDL_Joystick * joystick)
Apr 26, 2001
Apr 26, 2001
797
{
Jul 10, 2006
Jul 10, 2006
798
int fd;
Aug 25, 2008
Aug 25, 2008
799
char *fname;
Jul 10, 2006
Jul 10, 2006
800
801
SDL_logical_joydecl(int realindex);
SDL_logical_joydecl(SDL_Joystick * realjoy = NULL);
Apr 26, 2001
Apr 26, 2001
802
Jul 10, 2006
Jul 10, 2006
803
/* Open the joystick and set the joystick file descriptor */
May 16, 2004
May 16, 2004
804
#ifndef NO_LOGICAL_JOYSTICKS
Jul 10, 2006
Jul 10, 2006
805
806
807
if (SDL_joylist[joystick->index].fname == NULL) {
SDL_joylist_head(realindex, joystick->index);
realjoy = SDL_JoystickOpen(realindex);
May 16, 2004
May 16, 2004
808
Jul 10, 2006
Jul 10, 2006
809
810
811
812
if (realjoy == NULL)
return (-1);
fd = realjoy->hwdata->fd;
Aug 25, 2008
Aug 25, 2008
813
fname = realjoy->hwdata->fname;
May 16, 2004
May 16, 2004
814
Jul 10, 2006
Jul 10, 2006
815
816
} else {
fd = open(SDL_joylist[joystick->index].fname, O_RDONLY, 0);
Aug 25, 2008
Aug 25, 2008
817
fname = SDL_joylist[joystick->index].fname;
Jul 10, 2006
Jul 10, 2006
818
819
}
SDL_joylist[joystick->index].joy = joystick;
May 16, 2004
May 16, 2004
820
#else
Jul 10, 2006
Jul 10, 2006
821
fd = open(SDL_joylist[joystick->index].fname, O_RDONLY, 0);
Aug 25, 2008
Aug 25, 2008
822
fname = SDL_joylist[joystick->index].fname;
May 16, 2004
May 16, 2004
823
824
#endif
Jul 10, 2006
Jul 10, 2006
825
826
827
828
829
830
831
832
833
834
835
836
837
if (fd < 0) {
SDL_SetError("Unable to open %s\n", SDL_joylist[joystick->index]);
return (-1);
}
joystick->hwdata = (struct joystick_hwdata *)
SDL_malloc(sizeof(*joystick->hwdata));
if (joystick->hwdata == NULL) {
SDL_OutOfMemory();
close(fd);
return (-1);
}
SDL_memset(joystick->hwdata, 0, sizeof(*joystick->hwdata));
joystick->hwdata->fd = fd;
Aug 25, 2008
Aug 25, 2008
838
joystick->hwdata->fname = fname;
Jul 10, 2006
Jul 10, 2006
839
840
841
842
843
/* Set the joystick to non-blocking read mode */
fcntl(fd, F_SETFL, O_NONBLOCK);
/* Get the number of buttons and axes on the joystick */
May 16, 2004
May 16, 2004
844
#ifndef NO_LOGICAL_JOYSTICKS
Jul 10, 2006
Jul 10, 2006
845
846
847
if (realjoy)
ConfigLogicalJoystick(joystick);
else
May 16, 2004
May 16, 2004
848
#endif
Feb 16, 2006
Feb 16, 2006
849
#if SDL_INPUT_LINUXEV
Jul 10, 2006
Jul 10, 2006
850
if (!EV_ConfigJoystick(joystick, fd))
Apr 26, 2001
Apr 26, 2001
851
#endif
Jul 10, 2006
Jul 10, 2006
852
JS_ConfigJoystick(joystick, fd);
Dec 2, 2002
Dec 2, 2002
853
Jul 10, 2006
Jul 10, 2006
854
return (0);
Apr 26, 2001
Apr 26, 2001
855
856
}
May 16, 2004
May 16, 2004
857
858
#ifndef NO_LOGICAL_JOYSTICKS
Jul 10, 2006
Jul 10, 2006
859
860
861
static SDL_Joystick *
FindLogicalJoystick(SDL_Joystick * joystick,
struct joystick_logical_mapping *v)
May 16, 2004
May 16, 2004
862
{
Jul 10, 2006
Jul 10, 2006
863
864
SDL_Joystick *logicaljoy;
register int i;
May 16, 2004
May 16, 2004
865
Jul 10, 2006
Jul 10, 2006
866
867
i = joystick->index;
logicaljoy = NULL;
May 16, 2004
May 16, 2004
868
Jul 10, 2006
Jul 10, 2006
869
870
871
/* get the fake joystick that will receive the event
*/
for (;;) {
May 16, 2004
May 16, 2004
872
Jul 10, 2006
Jul 10, 2006
873
874
875
876
if (SDL_joylist[i].logicalno == v->njoy) {
logicaljoy = SDL_joylist[i].joy;
break;
}
May 16, 2004
May 16, 2004
877
Jul 10, 2006
Jul 10, 2006
878
879
if (SDL_joylist[i].next == 0)
break;
May 16, 2004
May 16, 2004
880
Jul 10, 2006
Jul 10, 2006
881
i = SDL_joylist[i].next;
May 16, 2004
May 16, 2004
882
Jul 10, 2006
Jul 10, 2006
883
}
May 16, 2004
May 16, 2004
884
Jul 10, 2006
Jul 10, 2006
885
return logicaljoy;
May 16, 2004
May 16, 2004
886
887
}
Jul 10, 2006
Jul 10, 2006
888
889
890
891
892
static int
LogicalJoystickButton(SDL_Joystick * joystick, Uint8 button, Uint8 state)
{
struct joystick_logical_mapping *buttons;
SDL_Joystick *logicaljoy = NULL;
May 16, 2004
May 16, 2004
893
Jul 10, 2006
Jul 10, 2006
894
895
896
897
/* if there's no map then this is just a regular joystick
*/
if (SDL_joylist[joystick->index].map == NULL)
return 0;
May 16, 2004
May 16, 2004
898
Jul 10, 2006
Jul 10, 2006
899
900
901
902
/* get the logical joystick that will receive the event
*/
buttons = SDL_joylist[joystick->index].map->buttonmap + button;
logicaljoy = FindLogicalJoystick(joystick, buttons);
May 16, 2004
May 16, 2004
903
Jul 10, 2006
Jul 10, 2006
904
905
if (logicaljoy == NULL)
return 1;
May 16, 2004
May 16, 2004
906
Jul 10, 2006
Jul 10, 2006
907
SDL_PrivateJoystickButton(logicaljoy, buttons->nthing, state);
May 16, 2004
May 16, 2004
908
Jul 10, 2006
Jul 10, 2006
909
return 1;
May 16, 2004
May 16, 2004
910
911
}
Jul 10, 2006
Jul 10, 2006
912
913
static int
LogicalJoystickAxis(SDL_Joystick * joystick, Uint8 axis, Sint16 value)
May 16, 2004
May 16, 2004
914
{
Jul 10, 2006
Jul 10, 2006
915
916
struct joystick_logical_mapping *axes;
SDL_Joystick *logicaljoy = NULL;
May 16, 2004
May 16, 2004
917
Jul 10, 2006
Jul 10, 2006
918
919
920
921
/* if there's no map then this is just a regular joystick
*/
if (SDL_joylist[joystick->index].map == NULL)
return 0;
May 16, 2004
May 16, 2004
922
Jul 10, 2006
Jul 10, 2006
923
924
925
926
/* get the logical joystick that will receive the event
*/
axes = SDL_joylist[joystick->index].map->axismap + axis;
logicaljoy = FindLogicalJoystick(joystick, axes);
May 16, 2004
May 16, 2004
927
Jul 10, 2006
Jul 10, 2006
928
929
if (logicaljoy == NULL)
return 1;
May 16, 2004
May 16, 2004
930
Jul 10, 2006
Jul 10, 2006
931
SDL_PrivateJoystickAxis(logicaljoy, axes->nthing, value);
May 16, 2004
May 16, 2004
932
Jul 10, 2006
Jul 10, 2006
933
return 1;
May 16, 2004
May 16, 2004
934
935
936
}
#endif /* USE_LOGICAL_JOYSTICKS */
Jul 10, 2006
Jul 10, 2006
937
938
static __inline__ void
HandleHat(SDL_Joystick * stick, Uint8 hat, int axis, int value)
Apr 26, 2001
Apr 26, 2001
939
{
Jul 10, 2006
Jul 10, 2006
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
struct hwdata_hat *the_hat;
const Uint8 position_map[3][3] = {
{SDL_HAT_LEFTUP, SDL_HAT_UP, SDL_HAT_RIGHTUP},
{SDL_HAT_LEFT, SDL_HAT_CENTERED, SDL_HAT_RIGHT},
{SDL_HAT_LEFTDOWN, SDL_HAT_DOWN, SDL_HAT_RIGHTDOWN}
};
SDL_logical_joydecl(SDL_Joystick * logicaljoy = NULL);
SDL_logical_joydecl(struct joystick_logical_mapping *hats = NULL);
the_hat = &stick->hwdata->hats[hat];
if (value < 0) {
value = 0;
} else if (value == 0) {
value = 1;
} else if (value > 0) {
value = 2;
}
if (value != the_hat->axis[axis]) {
the_hat->axis[axis] = value;
May 16, 2004
May 16, 2004
959
960
#ifndef NO_LOGICAL_JOYSTICKS
Jul 10, 2006
Jul 10, 2006
961
962
963
964
965
966
967
968
969
970
971
972
973
974
/* if there's no map then this is just a regular joystick
*/
if (SDL_joylist[stick->index].map != NULL) {
/* get the fake joystick that will receive the event
*/
hats = SDL_joylist[stick->index].map->hatmap + hat;
logicaljoy = FindLogicalJoystick(stick, hats);
}
if (logicaljoy) {
stick = logicaljoy;
hat = hats->nthing;
}
May 16, 2004
May 16, 2004
975
976
#endif /* USE_LOGICAL_JOYSTICKS */
Jul 10, 2006
Jul 10, 2006
977
SDL_PrivateJoystickHat(stick, hat,
Jan 10, 2009
Jan 10, 2009
978
979
position_map[the_hat->
axis[1]][the_hat->axis[0]]);
Jul 10, 2006
Jul 10, 2006
980
}
Apr 26, 2001
Apr 26, 2001
981
982
}
Jul 10, 2006
Jul 10, 2006
983
984
static __inline__ void
HandleBall(SDL_Joystick * stick, Uint8 ball, int axis, int value)
Apr 26, 2001
Apr 26, 2001
985
{
Jul 10, 2006
Jul 10, 2006
986
stick->hwdata->balls[ball].axis[axis] += value;
Apr 26, 2001
Apr 26, 2001
987
988
989
990
991
992
993
}
/* Function to update the state of a joystick - called as a device poll.
* This function shouldn't update the joystick structure directly,
* but instead should call SDL_PrivateJoystick*() to deliver events
* and update joystick device state.
*/
Jul 10, 2006
Jul 10, 2006
994
995
static __inline__ void
JS_HandleEvents(SDL_Joystick * joystick)
Apr 26, 2001
Apr 26, 2001
996
{
Jul 10, 2006
Jul 10, 2006
997
998
999
struct js_event events[32];
int i, len;
Uint8 other_axis;
Apr 26, 2001
Apr 26, 2001
1000