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; | |
| } | |
| 
 | |
| 
 |