This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
testjoystick.c
285 lines (250 loc) · 9.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely.
*/
/* Simple program to test the SDL joystick routines */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SDL.h"
21
22
#ifndef SDL_JOYSTICK_DISABLED
23
24
25
26
27
28
29
#ifdef __IPHONEOS__
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 480
#else
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#endif
30
31
32
33
#define MAX_NUM_AXES 6
#define MAX_NUM_HATS 2
34
35
36
37
38
39
40
41
static void
DrawRect(SDL_Renderer *r, const int x, const int y, const int w, const int h)
{
const SDL_Rect area = { x, y, w, h };
SDL_RenderFillRect(r, &area);
}
42
static SDL_bool
43
44
45
46
47
WatchJoystick(SDL_Joystick * joystick)
{
SDL_Window *window = NULL;
SDL_Renderer *screen = NULL;
const char *name = NULL;
48
49
SDL_bool retval = SDL_FALSE;
SDL_bool done = SDL_FALSE;
50
SDL_Event event;
51
52
int i;
53
54
55
56
57
58
/* Create a window to display joystick axis position */
window = SDL_CreateWindow("Joystick Test", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH,
SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (window == NULL) {
fprintf(stderr, "Couldn't create window: %s\n", SDL_GetError());
59
return SDL_FALSE;
60
61
62
63
64
65
}
screen = SDL_CreateRenderer(window, -1, 0);
if (screen == NULL) {
fprintf(stderr, "Couldn't create renderer: %s\n", SDL_GetError());
SDL_DestroyWindow(window);
66
return SDL_FALSE;
67
68
69
70
71
}
SDL_SetRenderDrawColor(screen, 0x00, 0x00, 0x00, SDL_ALPHA_OPAQUE);
SDL_RenderClear(screen);
SDL_RenderPresent(screen);
72
SDL_RaiseWindow(window);
73
74
/* Print info about the joystick we are watching */
75
76
name = SDL_JoystickName(joystick);
printf("Watching joystick %d: (%s)\n", SDL_JoystickInstanceID(joystick),
77
78
79
80
81
82
83
name ? name : "Unknown Joystick");
printf("Joystick has %d axes, %d hats, %d balls, and %d buttons\n",
SDL_JoystickNumAxes(joystick), SDL_JoystickNumHats(joystick),
SDL_JoystickNumBalls(joystick), SDL_JoystickNumButtons(joystick));
/* Loop, getting joystick events! */
while (!done) {
84
85
86
87
/* blank screen, set up for drawing this frame. */
SDL_SetRenderDrawColor(screen, 0x00, 0x00, 0x00, SDL_ALPHA_OPAQUE);
SDL_RenderClear(screen);
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
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_JOYAXISMOTION:
printf("Joystick %d axis %d value: %d\n",
event.jaxis.which,
event.jaxis.axis, event.jaxis.value);
break;
case SDL_JOYHATMOTION:
printf("Joystick %d hat %d value:",
event.jhat.which, event.jhat.hat);
if (event.jhat.value == SDL_HAT_CENTERED)
printf(" centered");
if (event.jhat.value & SDL_HAT_UP)
printf(" up");
if (event.jhat.value & SDL_HAT_RIGHT)
printf(" right");
if (event.jhat.value & SDL_HAT_DOWN)
printf(" down");
if (event.jhat.value & SDL_HAT_LEFT)
printf(" left");
printf("\n");
break;
case SDL_JOYBALLMOTION:
printf("Joystick %d ball %d delta: (%d,%d)\n",
event.jball.which,
event.jball.ball, event.jball.xrel, event.jball.yrel);
break;
case SDL_JOYBUTTONDOWN:
printf("Joystick %d button %d down\n",
event.jbutton.which, event.jbutton.button);
break;
case SDL_JOYBUTTONUP:
printf("Joystick %d button %d up\n",
event.jbutton.which, event.jbutton.button);
break;
case SDL_KEYDOWN:
if (event.key.keysym.sym != SDLK_ESCAPE) {
break;
}
/* Fall through to signal quit */
case SDL_QUIT:
129
done = SDL_TRUE;
130
131
132
133
134
135
break;
default:
break;
}
}
/* Update visual joystick state */
136
137
138
139
SDL_SetRenderDrawColor(screen, 0x00, 0xFF, 0x00, SDL_ALPHA_OPAQUE);
for (i = 0; i < SDL_JoystickNumButtons(joystick); ++i) {
if (SDL_JoystickGetButton(joystick, i) == SDL_PRESSED) {
DrawRect(screen, i * 34, SCREEN_HEIGHT - 34, 32, 32);
140
}
141
}
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
SDL_SetRenderDrawColor(screen, 0xFF, 0x00, 0x00, SDL_ALPHA_OPAQUE);
for (i = 0; i < SDL_JoystickNumAxes(joystick) / 2; ++i) {
/* Draw the X/Y axis */
int x, y;
x = (((int) SDL_JoystickGetAxis(joystick, i * 2 + 0)) + 32768);
x *= SCREEN_WIDTH;
x /= 65535;
if (x < 0) {
x = 0;
} else if (x > (SCREEN_WIDTH - 16)) {
x = SCREEN_WIDTH - 16;
}
y = (((int) SDL_JoystickGetAxis(joystick, i * 2 + 1)) + 32768);
y *= SCREEN_HEIGHT;
y /= 65535;
if (y < 0) {
y = 0;
} else if (y > (SCREEN_HEIGHT - 16)) {
y = SCREEN_HEIGHT - 16;
162
163
}
164
165
DrawRect(screen, x, y, 16, 16);
}
166
167
168
169
170
171
172
173
174
175
176
177
178
SDL_SetRenderDrawColor(screen, 0x00, 0x00, 0xFF, SDL_ALPHA_OPAQUE);
for (i = 0; i < SDL_JoystickNumHats(joystick); ++i) {
/* Derive the new position */
int x = SCREEN_WIDTH/2;
int y = SCREEN_HEIGHT/2;
const Uint8 hat_pos = SDL_JoystickGetHat(joystick, i);
if (hat_pos & SDL_HAT_UP) {
y = 0;
} else if (hat_pos & SDL_HAT_DOWN) {
y = SCREEN_HEIGHT-8;
}
179
180
181
182
183
if (hat_pos & SDL_HAT_LEFT) {
x = 0;
} else if (hat_pos & SDL_HAT_RIGHT) {
x = SCREEN_WIDTH-8;
184
185
}
186
DrawRect(screen, x, y, 8, 8);
187
}
188
189
SDL_RenderPresent(screen);
190
191
192
193
194
if (SDL_JoystickGetAttached( joystick ) == 0) {
done = SDL_TRUE;
retval = SDL_TRUE; /* keep going, wait for reattach. */
}
195
}
196
197
198
SDL_DestroyRenderer(screen);
SDL_DestroyWindow(window);
199
return retval;
200
201
202
203
204
205
}
int
main(int argc, char *argv[])
{
const char *name;
206
int i;
207
208
209
SDL_Joystick *joystick;
/* Initialize SDL (Note: video is required to start event loop) */
210
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) {
211
212
213
214
215
216
217
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
exit(1);
}
/* Print information about the joysticks */
printf("There are %d joysticks attached\n", SDL_NumJoysticks());
for (i = 0; i < SDL_NumJoysticks(); ++i) {
218
name = SDL_JoystickNameForIndex(i);
219
220
221
222
223
224
printf("Joystick %d: %s\n", i, name ? name : "Unknown Joystick");
joystick = SDL_JoystickOpen(i);
if (joystick == NULL) {
fprintf(stderr, "SDL_JoystickOpen(%d) failed: %s\n", i,
SDL_GetError());
} else {
225
226
227
char guid[64];
SDL_JoystickGetGUIDString(SDL_JoystickGetGUID(joystick),
guid, sizeof (guid));
228
229
230
231
printf(" axes: %d\n", SDL_JoystickNumAxes(joystick));
printf(" balls: %d\n", SDL_JoystickNumBalls(joystick));
printf(" hats: %d\n", SDL_JoystickNumHats(joystick));
printf(" buttons: %d\n", SDL_JoystickNumButtons(joystick));
232
printf("instance id: %d\n", SDL_JoystickInstanceID(joystick));
233
printf(" guid: %s\n", guid);
234
235
236
237
SDL_JoystickClose(joystick);
}
}
238
if (argv[1]) {
239
SDL_bool reportederror = SDL_FALSE;
240
SDL_bool keepGoing = SDL_TRUE;
241
242
243
244
245
246
SDL_Event event;
joystick = SDL_JoystickOpen(atoi(argv[1]));
while ( keepGoing ) {
if (joystick == NULL) {
if ( !reportederror ) {
printf("Couldn't open joystick %d: %s\n", atoi(argv[1]), SDL_GetError());
247
keepGoing = SDL_FALSE;
248
249
250
251
252
253
254
255
reportederror = SDL_TRUE;
}
} else {
reportederror = SDL_FALSE;
keepGoing = WatchJoystick(joystick);
SDL_JoystickClose(joystick);
}
256
joystick = NULL;
257
if (keepGoing) {
258
259
260
261
262
263
264
printf("Waiting for attach\n");
}
while (keepGoing) {
SDL_WaitEvent(&event);
if (event.type == SDL_QUIT) {
keepGoing = SDL_FALSE;
} else if (event.type == SDL_JOYDEVICEADDED) {
265
joystick = SDL_JoystickOpen(atoi(argv[1]));
266
break;
267
}
268
}
269
270
}
}
271
SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK);
272
273
return 0;
274
}
275
276
277
278
279
280
281
282
283
284
285
#else
int
main(int argc, char *argv[])
{
fprintf(stderr, "SDL compiled without Joystick support.\n");
exit(1);
}
#endif