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

Latest commit

 

History

History
246 lines (215 loc) · 7.88 KB

testjoystick.c

File metadata and controls

246 lines (215 loc) · 7.88 KB
 
Jun 22, 2011
Jun 22, 2011
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
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"
Oct 14, 2012
Oct 14, 2012
20
#include "common.h"
Jun 22, 2011
Jun 22, 2011
21
Oct 14, 2012
Oct 14, 2012
22
23
static CommonState *state;
static SDL_BlendMode blendMode = SDL_BLENDMODE_NONE;
Jun 22, 2011
Jun 22, 2011
24
Aug 16, 2012
Aug 16, 2012
25
26
27
#define MAX_NUM_AXES 6
#define MAX_NUM_HATS 2
Aug 16, 2012
Aug 16, 2012
28
29
30
31
32
33
34
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);
}
Jun 22, 2011
Jun 22, 2011
35
36
37
void
WatchJoystick(SDL_Joystick * joystick)
{
Aug 16, 2012
Aug 16, 2012
38
39
SDL_Window *window = NULL;
SDL_Renderer *screen = NULL;
Oct 14, 2012
Oct 14, 2012
40
41
42
SDL_Rect viewport;
SDL_Event event;
Aug 16, 2012
Aug 16, 2012
43
44
45
const char *name = NULL;
int done = 0;
int i;
Jun 22, 2011
Jun 22, 2011
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
/* Print info about the joystick we are watching */
name = SDL_JoystickName(SDL_JoystickIndex(joystick));
printf("Watching joystick %d: (%s)\n", SDL_JoystickIndex(joystick),
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) {
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:
done = 1;
break;
default:
break;
}
}
Oct 14, 2012
Oct 14, 2012
104
Jun 22, 2011
Jun 22, 2011
105
/* Update visual joystick state */
Oct 14, 2012
Oct 14, 2012
106
107
for (i = 0; i < state->num_windows; ++i) {
screen = state->renderers[i];
Jun 22, 2011
Jun 22, 2011
108
Oct 14, 2012
Oct 14, 2012
109
110
111
112
113
114
115
116
117
118
119
120
/* Erase previous axes */
SDL_SetRenderDrawColor(screen, 0x00, 0x00, 0x00, SDL_ALPHA_OPAQUE);
SDL_RenderClear(screen);
/* Query the sizes */
SDL_RenderGetViewport(screen, &viewport);
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, viewport.h - 34, 32, 32);
}
Jun 22, 2011
Jun 22, 2011
121
122
}
Oct 14, 2012
Oct 14, 2012
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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 *= viewport.w ;
x /= 65535;
if (x < 0) {
x = 0;
} else if (x > (viewport.w - 16)) {
x = viewport.w - 16;
}
y = (((int) SDL_JoystickGetAxis(joystick, i * 2 + 1)) + 32768);
y *= viewport.h;
y /= 65535;
if (y < 0) {
y = 0;
} else if (y > (viewport.h - 16)) {
y = viewport.h - 16;
}
Aug 16, 2012
Aug 16, 2012
143
Oct 14, 2012
Oct 14, 2012
144
DrawRect(screen, x, y, 16, 16);
Aug 16, 2012
Aug 16, 2012
145
146
}
Oct 14, 2012
Oct 14, 2012
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
SDL_SetRenderDrawColor(screen, 0x00, 0x00, 0xFF, SDL_ALPHA_OPAQUE);
for (i = 0; i < SDL_JoystickNumHats(joystick); ++i) {
/* Derive the new position */
int x = viewport.w/2;
int y = viewport.h/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 = viewport.h-8;
}
if (hat_pos & SDL_HAT_LEFT) {
x = 0;
} else if (hat_pos & SDL_HAT_RIGHT) {
x = viewport.w-8;
}
DrawRect(screen, x, y, 8, 8);
Aug 16, 2012
Aug 16, 2012
167
168
}
Oct 14, 2012
Oct 14, 2012
169
SDL_RenderPresent(screen);
Jun 22, 2011
Jun 22, 2011
170
171
172
173
174
175
176
177
}
}
}
int
main(int argc, char *argv[])
{
const char *name;
Oct 14, 2012
Oct 14, 2012
178
int i, joy=-1;
Jun 22, 2011
Jun 22, 2011
179
180
181
SDL_Joystick *joystick;
/* Initialize SDL (Note: video is required to start event loop) */
Oct 14, 2012
Oct 14, 2012
182
if (SDL_Init(SDL_INIT_JOYSTICK) < 0) {
Jun 22, 2011
Jun 22, 2011
183
184
185
186
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
exit(1);
}
Oct 14, 2012
Oct 14, 2012
187
188
189
190
191
192
193
/* Initialize test framework */
state = CommonCreateState(argv, SDL_INIT_VIDEO | SDL_INIT_JOYSTICK);
if (!state) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
return 1;
}
Jun 22, 2011
Jun 22, 2011
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/* Print information about the joysticks */
printf("There are %d joysticks attached\n", SDL_NumJoysticks());
for (i = 0; i < SDL_NumJoysticks(); ++i) {
name = SDL_JoystickName(i);
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 {
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));
SDL_JoystickClose(joystick);
}
}
Oct 14, 2012
Oct 14, 2012
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
for (i = 1; i < argc;) {
int consumed;
consumed = CommonArg(state, i);
if (consumed == 0) {
consumed = -1;
if (SDL_isdigit(*argv[i])) {
joy = SDL_atoi(argv[i]);
consumed = 1;
}
}
if (consumed < 0) {
return 1;
}
i += consumed;
}
if (!CommonInit(state)) {
return 2;
}
if (joy > -1) {
joystick = SDL_JoystickOpen(joy);
Jun 22, 2011
Jun 22, 2011
234
if (joystick == NULL) {
Oct 14, 2012
Oct 14, 2012
235
printf("Couldn't open joystick %d: %s\n", joy,
Jun 22, 2011
Jun 22, 2011
236
237
238
239
240
241
SDL_GetError());
} else {
WatchJoystick(joystick);
SDL_JoystickClose(joystick);
}
}
Oct 14, 2012
Oct 14, 2012
242
243
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
CommonQuit(state);
Jun 22, 2011
Jun 22, 2011
244
245
246
return (0);
}