static SDL_bool JS_ConfigJoystick(SDL_Joystick *joystick, int fd) { SDL_bool handled; unsigned char n; int old_axes, tmp_naxes, tmp_nhats, tmp_nballs; const char *name; char *env, env_name[128]; int i; handled = SDL_FALSE; /* Default joystick device settings */ if ( ioctl(fd, JSIOCGAXES, &n) < 0 ) { joystick->naxes = 2; } else { joystick->naxes = n; } if ( ioctl(fd, JSIOCGBUTTONS, &n) < 0 ) { joystick->nbuttons = 2; } else { joystick->nbuttons = n; } name = SDL_SYS_JoystickName(joystick->index); old_axes = joystick->naxes; /* Generic analog joystick support */ if ( SDL_strstr(name, "Analog") == name && SDL_strstr(name, "-hat") ) { if ( SDL_sscanf(name,"Analog %d-axis %*d-button %d-hat", &tmp_naxes, &tmp_nhats) == 2 ) { joystick->naxes = tmp_naxes; joystick->nhats = tmp_nhats; handled = SDL_TRUE; } } /* Special joystick support */ for ( i=0; i < SDL_arraysize(special_joysticks); ++i ) { if ( SDL_strcmp(name, special_joysticks[i].name) == 0 ) { joystick->naxes = special_joysticks[i].naxes; joystick->nhats = special_joysticks[i].nhats; joystick->nballs = special_joysticks[i].nballs; handled = SDL_TRUE; break; } } /* User environment joystick support */ if ( (env = SDL_getenv("SDL_LINUX_JOYSTICK")) ) { *env_name = '\0'; if ( *env == '\'' && SDL_sscanf(env, "'%[^']s'", env_name) == 1 ) env += SDL_strlen(env_name)+2; else if ( SDL_sscanf(env, "%s", env_name) == 1 ) env += SDL_strlen(env_name); if ( SDL_strcmp(name, env_name) == 0 ) { if ( SDL_sscanf(env, "%d %d %d", &tmp_naxes, &tmp_nhats, &tmp_nballs) == 3 ) { joystick->naxes = tmp_naxes; joystick->nhats = tmp_nhats; joystick->nballs = tmp_nballs; handled = SDL_TRUE; } } } /* Remap hats and balls */ if (handled) { if ( joystick->nhats > 0 ) { if ( allocate_hatdata(joystick) < 0 ) { joystick->nhats = 0; } } if ( joystick->nballs > 0 ) { if ( allocate_balldata(joystick) < 0 ) { joystick->nballs = 0; } } } return(handled); }
static SDL_bool EV_ConfigJoystick(SDL_Joystick *joystick, int fd) { int i, t; unsigned long keybit[40]; unsigned long absbit[40]; unsigned long relbit[40]; /* See if this device uses the new unified event API */ if ( (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) >= 0) && (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit) >= 0) && (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(relbit)), relbit) >= 0) ) { joystick->hwdata->is_hid = SDL_TRUE; /* Get the number of buttons, axes, and other thingamajigs */ for ( i=BTN_JOYSTICK; i < KEY_MAX; ++i ) { if ( test_bit(i, keybit) ) { #ifdef DEBUG_INPUT_EVENTS printf("Joystick has button: 0x%x\n", i); #endif joystick->hwdata->key_map[i-BTN_MISC] = joystick->nbuttons; ++joystick->nbuttons; } } for ( i=BTN_MISC; i < BTN_JOYSTICK; ++i ) { if ( test_bit(i, keybit) ) { #ifdef DEBUG_INPUT_EVENTS printf("Joystick has button: 0x%x\n", i); #endif joystick->hwdata->key_map[i-BTN_MISC] = joystick->nbuttons; ++joystick->nbuttons; } } for ( i=0; i<ABS_MAX; ++i ) { /* Skip hats */ if ( i == ABS_HAT0X ) { i = ABS_HAT3Y; continue; } if ( test_bit(i, absbit) ) { int values[5]; if ( ioctl(fd, EVIOCGABS(i), values) < 0 ) continue; #ifdef DEBUG_INPUT_EVENTS printf("Joystick has absolute axis: %x\n", i); printf("Values = { %d, %d, %d, %d, %d }\n", values[0], values[1], values[2], values[3], values[4]); #endif /* DEBUG_INPUT_EVENTS */ joystick->hwdata->abs_map[i] = joystick->naxes; if ( values[1] == values[2] ) { joystick->hwdata->abs_correct[i].used = 0; } else { joystick->hwdata->abs_correct[i].used = 1; joystick->hwdata->abs_correct[i].coef[0] = (values[2] + values[1]) / 2 - values[4]; joystick->hwdata->abs_correct[i].coef[1] = (values[2] + values[1]) / 2 + values[4]; t = ((values[2] - values[1]) / 2 - 2 * values[4]); if ( t != 0 ) { joystick->hwdata->abs_correct[i].coef[2] = (1 << 29) / t; } else { joystick->hwdata->abs_correct[i].coef[2] = 0; } } ++joystick->naxes; } } for ( i=ABS_HAT0X; i <= ABS_HAT3Y; i += 2 ) { if ( test_bit(i, absbit) || test_bit(i+1, absbit) ) { #ifdef DEBUG_INPUT_EVENTS printf("Joystick has hat %d\n",(i-ABS_HAT0X)/2); #endif ++joystick->nhats; } } if ( test_bit(REL_X, relbit) || test_bit(REL_Y, relbit) ) { ++joystick->nballs; } /* Allocate data to keep track of these thingamajigs */ if ( joystick->nhats > 0 ) { if ( allocate_hatdata(joystick) < 0 ) { joystick->nhats = 0; } } if ( joystick->nballs > 0 ) { if ( allocate_balldata(joystick) < 0 ) { joystick->nballs = 0; } } } return(joystick->hwdata->is_hid); }
static void ConfigJoystick(SDL_Joystick * joystick, int fd) { int i, t; unsigned long keybit[NBITS(KEY_MAX)] = { 0 }; unsigned long absbit[NBITS(ABS_MAX)] = { 0 }; unsigned long relbit[NBITS(REL_MAX)] = { 0 }; /* See if this device uses the new unified event API */ if ((ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) >= 0) && (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit) >= 0) && (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(relbit)), relbit) >= 0)) { /* Get the number of buttons, axes, and other thingamajigs */ for (i = BTN_JOYSTICK; i < KEY_MAX; ++i) { if (test_bit(i, keybit)) { #ifdef DEBUG_INPUT_EVENTS printf("Joystick has button: 0x%x\n", i); #endif joystick->hwdata->key_map[i - BTN_MISC] = joystick->nbuttons; ++joystick->nbuttons; } } for (i = BTN_MISC; i < BTN_JOYSTICK; ++i) { if (test_bit(i, keybit)) { #ifdef DEBUG_INPUT_EVENTS printf("Joystick has button: 0x%x\n", i); #endif joystick->hwdata->key_map[i - BTN_MISC] = joystick->nbuttons; ++joystick->nbuttons; } } for (i = 0; i < ABS_MISC; ++i) { /* Skip hats */ if (i == ABS_HAT0X) { i = ABS_HAT3Y; continue; } if (test_bit(i, absbit)) { struct input_absinfo absinfo; if (ioctl(fd, EVIOCGABS(i), &absinfo) < 0) continue; #ifdef DEBUG_INPUT_EVENTS printf("Joystick has absolute axis: %x\n", i); printf("Values = { %d, %d, %d, %d, %d }\n", absinfo.value, absinfo.minimum, absinfo.maximum, absinfo.fuzz, absinfo.flat); #endif /* DEBUG_INPUT_EVENTS */ joystick->hwdata->abs_map[i] = joystick->naxes; if (absinfo.minimum == absinfo.maximum) { joystick->hwdata->abs_correct[i].used = 0; } else { joystick->hwdata->abs_correct[i].used = 1; joystick->hwdata->abs_correct[i].coef[0] = (absinfo.maximum + absinfo.minimum) - 2 * absinfo.flat; joystick->hwdata->abs_correct[i].coef[1] = (absinfo.maximum + absinfo.minimum) + 2 * absinfo.flat; t = ((absinfo.maximum - absinfo.minimum) - 4 * absinfo.flat); if (t != 0) { joystick->hwdata->abs_correct[i].coef[2] = (1 << 28) / t; } else { joystick->hwdata->abs_correct[i].coef[2] = 0; } } ++joystick->naxes; } } for (i = ABS_HAT0X; i <= ABS_HAT3Y; i += 2) { if (test_bit(i, absbit) || test_bit(i + 1, absbit)) { #ifdef DEBUG_INPUT_EVENTS printf("Joystick has hat %d\n", (i - ABS_HAT0X) / 2); #endif ++joystick->nhats; } } if (test_bit(REL_X, relbit) || test_bit(REL_Y, relbit)) { ++joystick->nballs; } /* Allocate data to keep track of these thingamajigs */ if (joystick->nhats > 0) { if (allocate_hatdata(joystick) < 0) { joystick->nhats = 0; } } if (joystick->nballs > 0) { if (allocate_balldata(joystick) < 0) { joystick->nballs = 0; } } } }