/* See LICENSE file for copyright and license details. */ #include "libgamepad.h" #include #include #define ELEMSOF(A) (sizeof(A) / sizeof(*(A))) int main(int argc, char *argv[]) { const struct input_absinfo *absinfo; struct libgamepad_device gamepad; size_t i, n; if (argc != 2) { fprintf(stderr, "Please provide the path to the subdevice as the only command line argument\n"); return 1; } if (libgamepad_open_device(&gamepad, AT_FDCWD, argv[1], O_RDONLY)) { perror("libgamepad_open_device"); return 1; } printf("Bus type: %u\n", gamepad.bus_type); printf("Vendor: %u\n", gamepad.vendor); printf("Product: %u\n", gamepad.product); printf("Version: %u\n", gamepad.version); printf("Name: %s\n", gamepad.name); printf("Unique id: %s\n", gamepad.unique_id); printf("Physical location: %s\n", gamepad.physical_location); printf("Fingerprint: %s\n", gamepad.fingerprint); printf("Unique fingerprint: %s\n", gamepad.fingerprint_unique); printf("Buttons:\n"); for (i = 0; i < gamepad.nbuttons; i++) { assert(gamepad.buttons); assert(gamepad.buttons[i] < ELEMSOF(gamepad.button_map)); assert(gamepad.button_map[gamepad.buttons[i]] == (int16_t)i); printf("\t%s [pressed=%i]\n", libgamepad_get_button_name(NULL, gamepad.buttons[i]), libgamepad_get_button_is_pressed(&gamepad, gamepad.buttons[i])); } n = 0; for (i = 0; i < ELEMSOF(gamepad.button_map); i++) { assert(gamepad.button_map[i] >= -1); assert((ssize_t)gamepad.button_map[i] < (ssize_t)gamepad.nbuttons); if (gamepad.button_map[i] != -1) { assert(gamepad.buttons[gamepad.button_map[i]] == (uint16_t)i); n++; } } assert(n == gamepad.nbuttons); printf("Absolute axes:\n"); for (i = 0; i < gamepad.nabsolute_axes; i++) { assert(gamepad.absolute_axes); assert(gamepad.absolute_axes[i] < ELEMSOF(gamepad.absolute_axis_map)); assert(gamepad.absolute_axis_map[gamepad.absolute_axes[i]] == (int16_t)i); absinfo = libgamepad_get_absolute_axis_info(&gamepad, gamepad.absolute_axes[i]); if (!absinfo) { printf("\t%s\n", libgamepad_get_absolute_axis_name(NULL, gamepad.absolute_axes[i])); } else { printf("\t%s [value=%i, min=%i, max=%i, fuzz=%i, flat=%i, resolution=%i]\n", libgamepad_get_absolute_axis_name(NULL, gamepad.absolute_axes[i]), absinfo->value, absinfo->minimum, absinfo->maximum, absinfo->fuzz, absinfo->flat, absinfo->resolution); } } n = 0; for (i = 0; i < ELEMSOF(gamepad.absolute_axis_map); i++) { assert(gamepad.absolute_axis_map[i] >= -1); assert((ssize_t)gamepad.absolute_axis_map[i] < (ssize_t)gamepad.nabsolute_axes); if (gamepad.absolute_axis_map[i] != -1) { assert(gamepad.absolute_axes[gamepad.absolute_axis_map[i]] == (uint16_t)i); n++; } } assert(n == gamepad.nabsolute_axes); printf("Relative axes:\n"); for (i = 0; i < gamepad.nrelative_axes; i++) { assert(gamepad.relative_axes); assert(gamepad.relative_axes[i] < ELEMSOF(gamepad.relative_axis_map)); assert(gamepad.relative_axis_map[gamepad.relative_axes[i]] == (int16_t)i); printf("\t%s\n", libgamepad_get_relative_axis_name(NULL, gamepad.relative_axes[i])); } n = 0; for (i = 0; i < ELEMSOF(gamepad.relative_axis_map); i++) { assert(gamepad.relative_axis_map[i] >= -1); assert((ssize_t)gamepad.relative_axis_map[i] < (ssize_t)gamepad.nrelative_axes); if (gamepad.relative_axis_map[i] != -1) { assert(gamepad.relative_axes[gamepad.relative_axis_map[i]] == (uint16_t)i); n++; } } assert(n == gamepad.nrelative_axes); libgamepad_close_device(&gamepad); return 0; }