You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
142 lines
3.8 KiB
142 lines
3.8 KiB
/*======================================================================== |
|
* This is a small test application for GLFW. |
|
* joystick input test. |
|
*========================================================================*/ |
|
|
|
#include <GL/glfw3.h> |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <math.h> |
|
|
|
#define MAX_AXES 10 |
|
#define MAX_BUTTONS 30 |
|
|
|
struct JoystickState |
|
{ |
|
int present; |
|
int num_axes; |
|
int num_buttons; |
|
float axes[MAX_AXES]; |
|
unsigned char buttons[MAX_BUTTONS]; |
|
}; |
|
|
|
static struct JoystickState states[GLFW_JOYSTICK_LAST + 1]; |
|
|
|
int running; |
|
int keyrepeat = 0; |
|
int systemkeys = 1; |
|
|
|
|
|
/*======================================================================== |
|
* Retrieve joystick states |
|
*========================================================================*/ |
|
static void updateJoysticksState(void) |
|
{ |
|
int joy; |
|
|
|
for (joy = GLFW_JOYSTICK_1; joy < GLFW_JOYSTICK_LAST + 1; joy++) |
|
{ |
|
printf("Updating information for joystick %d\n", joy); |
|
states[joy].present = glfwGetJoystickParam(joy, GLFW_PRESENT); |
|
if (states[joy].present == GL_TRUE) |
|
{ |
|
states[joy].num_axes = glfwGetJoystickPos(joy, states[joy].axes, MAX_AXES); |
|
states[joy].num_buttons = glfwGetJoystickButtons(joy, states[joy].buttons, MAX_BUTTONS); |
|
} |
|
} |
|
} |
|
|
|
/*======================================================================== |
|
* Print out the state of all joysticks on the standard output |
|
*========================================================================*/ |
|
static void displayJoysticksState(void) |
|
{ |
|
int joy; |
|
int i; |
|
|
|
for (joy = GLFW_JOYSTICK_1; joy < GLFW_JOYSTICK_LAST + 1; joy++) |
|
{ |
|
printf("Joystick %d: %s\n", joy, (states[joy].present == GL_TRUE ? "present" : "not connected")); |
|
|
|
if (states[joy].present == GL_TRUE) |
|
{ |
|
if (states[joy].num_axes > 0) |
|
{ |
|
printf(" axes: %.3f", states[joy].axes[0]); |
|
for (i = 1; i < states[joy].num_axes; i++) |
|
printf(", %.3f", states[joy].axes[i]); |
|
|
|
printf("\n"); |
|
} |
|
else |
|
printf(" axes: none\n"); |
|
|
|
if (states[joy].num_buttons > 0) |
|
{ |
|
printf(" buttons: 00 => %c", ((states[joy].buttons[0] == GLFW_PRESS) ? 'P' : 'R')); |
|
|
|
for (i = 1; i < states[joy].num_buttons; i++) |
|
printf(", %02d => %c", i, ((states[joy].buttons[i] == GLFW_PRESS) ? 'P' : 'R')); |
|
|
|
printf("\n"); |
|
} |
|
else |
|
printf(" buttons: none\n"); |
|
} |
|
} |
|
} |
|
|
|
int main(void) |
|
{ |
|
double start; |
|
double t; |
|
double update; |
|
|
|
/* Initialise GLFW */ |
|
if (!glfwInit()) |
|
{ |
|
fprintf(stderr, "Failed to initialize GLFW: %s\n", glfwErrorString(glfwGetError())); |
|
exit(EXIT_FAILURE); |
|
} |
|
|
|
printf("The program will work for 20 seconds and display every seconds the state of the joysticks\n"); |
|
printf("Your computer is going to be very slow as the program is doing an active loop .....\n"); |
|
|
|
start = glfwGetTime(); |
|
update = start; |
|
|
|
/* print the initial state of all joysticks */ |
|
updateJoysticksState(); |
|
printf("\n"); |
|
displayJoysticksState(); |
|
|
|
running = GL_TRUE; |
|
|
|
/* Main loop */ |
|
while (running) |
|
{ |
|
/* Get time */ |
|
t = glfwGetTime(); |
|
|
|
/* Display the state of all connected joysticks every secons */ |
|
if ((t - update) > 1.0) |
|
{ |
|
update = t; |
|
printf("\n"); |
|
updateJoysticksState(); |
|
printf("\n"); |
|
displayJoysticksState(); |
|
} |
|
|
|
/* Check if the window was closed */ |
|
if ((t - start) > 20.0) |
|
running = GL_FALSE; |
|
} |
|
|
|
/* Close OpenGL window and terminate GLFW */ |
|
glfwTerminate(); |
|
|
|
return 0; |
|
} |
|
|
|
|