commit 5759ef7d8e8514954bee703213a391f73478b4b8 Author: Simon Howard Date: Sun May 4 15:37:44 2014 -0400 Add first version of joystick test program. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cfa4412 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ + +CFLAGS = $(shell sdl-config --cflags) +LDFLAGS = $(shell sdl-config --libs) + +joytest : joytest.c + $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ + diff --git a/joytest.c b/joytest.c new file mode 100644 index 0000000..f9e61fe --- /dev/null +++ b/joytest.c @@ -0,0 +1,151 @@ +#include +#include + +#include "SDL.h" + +void ProcessAxisMotion(SDL_Event *ev) +{ + static int lastjoy = -1, lastaxis, lastdirection; + int direction; + + direction = ev->jaxis.value > 0; + + if (ev->jaxis.which == lastjoy && ev->jaxis.axis == lastaxis + && direction == lastdirection) + { + return; + } + + // Only print a message when pushed to the extreme + if (abs(ev->jaxis.value) < 30000) + { + return; + } + + printf("%i: Axis %i pushed to extreme: %i\n", + ev->jaxis.which, ev->jaxis.axis, ev->jaxis.value); + + lastjoy = ev->jaxis.which; + lastaxis = ev->jaxis.axis; + lastdirection = direction; +} + +void ProcessBallMotion(SDL_Event *ev) +{ + printf("%i: Ball %i motion: %i, %i\n", + ev->jball.which, ev->jball.ball, ev->jball.xrel, ev->jball.yrel); +} + +char *HatDirection(int value) +{ + switch (value) + { + case SDL_HAT_UP: + return "UP"; + case SDL_HAT_DOWN: + return "DOWN"; + case SDL_HAT_LEFT: + return "LEFT"; + case SDL_HAT_RIGHT: + return "RIGHT"; + default: + return NULL; + } +} + +void ProcessHatMotion(SDL_Event *ev) +{ + char *dirstr; + + dirstr = HatDirection(ev->jhat.value); + + if (dirstr != NULL) + { + printf("%i: Hat %i moved to %s", ev->jhat.which, ev->jhat.hat, + dirstr); + } +} + +void ProcessButtonDown(SDL_Event *ev) +{ + printf("%i: Button %i pressed\n", ev->jbutton.which, ev->jbutton.button); +} + +void StartJoysticks(void) +{ + SDL_Joystick *js; + int i; + + // Open all joysticks. + + printf("%i joysticks:\n", SDL_NumJoysticks()); + + for (i = 0 ; i < SDL_NumJoysticks(); ++i) + { + printf("\t#%i: '%s'\n", i, SDL_JoystickName(i)); + + js = SDL_JoystickOpen(i); + printf("\t\taxes: %i\n", SDL_JoystickNumAxes(js)); + printf("\t\tbuttons: %i\n", SDL_JoystickNumButtons(js)); + printf("\t\tballs: %i\n", SDL_JoystickNumBalls(js)); + printf("\t\thats: %i\n", SDL_JoystickNumHats(js)); + } +} + +int main(int argc, char *argv[]) +{ + SDL_Event ev; + + SDL_Init(SDL_INIT_JOYSTICK|SDL_INIT_VIDEO); + + if (SDL_NumJoysticks() == 0) + { + fprintf(stderr, "Found no joysticks to configure!\n"); + return 1; + } + + SDL_SetVideoMode(400, 200, 0, 0); + SDL_WM_SetCaption("Close this window to quit.", NULL); + + StartJoysticks(); + + for (;;) + { + SDL_PumpEvents(); + SDL_WaitEvent(&ev); + switch (ev.type) + { + case SDL_QUIT: + goto exitloop; + + case SDL_KEYDOWN: + if (ev.key.keysym.sym == SDLK_ESCAPE) + { + goto exitloop; + } + break; + + case SDL_JOYAXISMOTION: + ProcessAxisMotion(&ev); + break; + + case SDL_JOYBALLMOTION: + ProcessBallMotion(&ev); + break; + + case SDL_JOYHATMOTION: + ProcessHatMotion(&ev); + break; + + case SDL_JOYBUTTONDOWN: + ProcessButtonDown(&ev); + break; + } + } +exitloop: + + SDL_Quit(); + + return 0; +} +