src/haptic/linux/SDL_syshaptic.c
branchgsoc2008_force_feedback
changeset 2523 366d84fdf8d1
parent 2519 af9df9662807
child 2524 1a55848ce198
equal deleted inserted replaced
2522:0877146be013 2523:366d84fdf8d1
   253    SDL_memset(haptic->hwdata, 0, sizeof(*haptic->hwdata));
   253    SDL_memset(haptic->hwdata, 0, sizeof(*haptic->hwdata));
   254 
   254 
   255    /* Set the data */
   255    /* Set the data */
   256    haptic->hwdata->fd = fd;
   256    haptic->hwdata->fd = fd;
   257    haptic->supported = EV_IsHaptic(fd);
   257    haptic->supported = EV_IsHaptic(fd);
       
   258    haptic->naxes = 2; /* Hardcoded for now, not sure if it's possible to find out. */
   258 
   259 
   259    /* Set the effects */
   260    /* Set the effects */
   260    if (ioctl(fd, EVIOCGEFFECTS, &haptic->neffects) < 0) {
   261    if (ioctl(fd, EVIOCGEFFECTS, &haptic->neffects) < 0) {
   261       SDL_SetError("Haptic: Unable to query device memory: %s", strerror(errno));
   262       SDL_SetError("Haptic: Unable to query device memory: %s", strerror(errno));
   262       goto open_err;
   263       goto open_err;
   417    switch (dir->type) {
   418    switch (dir->type) {
   418       case SDL_HAPTIC_POLAR:
   419       case SDL_HAPTIC_POLAR:
   419          /* Linux directions are inverted. */
   420          /* Linux directions are inverted. */
   420          tmp = (((18000 + dir->dir[0]) % 36000) * 0xFFFF) / 36000;
   421          tmp = (((18000 + dir->dir[0]) % 36000) * 0xFFFF) / 36000;
   421          return (Uint16) tmp;
   422          return (Uint16) tmp;
       
   423 
   422       case SDL_HAPTIC_CARTESIAN:
   424       case SDL_HAPTIC_CARTESIAN:
   423          /* We must invert "x" and "y" to go clockwise. */
   425          /* We must invert "x" and "y" to go clockwise. */
   424          f = atan2(dir->dir[0], dir->dir[1]);
   426          f = atan2(dir->dir[0], dir->dir[1]);
   425          tmp = (int)(f*18000./M_PI) % 36000;
   427          tmp = (int)(f*18000./M_PI) % 36000;
   426          tmp = (tmp * 0xFFFF) / 36000;
   428          tmp = (tmp * 0xFFFF) / 36000;
   427          return (Uint16) tmp;
   429          return (Uint16) tmp;
   428 
   430 
       
   431       case SDL_HAPTIC_SPHERICAL:
       
   432          tmp = (36000 - dir->dir[0]) + 27000; /* Convert to polars */
       
   433          tmp = (((18000 + tmp) % 36000) * 0xFFFF) / 36000;
       
   434          return (Uint16) tmp;
       
   435 
   429       default:
   436       default:
       
   437          SDL_SetError("Haptic: Unsupported direction type.");
   430          return -1;
   438          return -1;
   431    }
   439    }
   432 
   440 
   433    return 0;
   441    return 0;
   434 }
   442 }
   454          constant = &src->constant;
   462          constant = &src->constant;
   455 
   463 
   456          /* Header */
   464          /* Header */
   457          dest->type = FF_CONSTANT;
   465          dest->type = FF_CONSTANT;
   458          dest->direction = SDL_SYS_ToDirection(&constant->direction);
   466          dest->direction = SDL_SYS_ToDirection(&constant->direction);
       
   467          if (dest->direction < 0) return -1;
   459 
   468 
   460          /* Replay */
   469          /* Replay */
   461          dest->replay.length = CLAMP(constant->length);
   470          dest->replay.length = CLAMP(constant->length);
   462          dest->replay.delay = CLAMP(constant->delay);
   471          dest->replay.delay = CLAMP(constant->delay);
   463 
   472 
   484          periodic = &src->periodic;
   493          periodic = &src->periodic;
   485 
   494 
   486          /* Header */
   495          /* Header */
   487          dest->type = FF_PERIODIC;
   496          dest->type = FF_PERIODIC;
   488          dest->direction = SDL_SYS_ToDirection(&periodic->direction);
   497          dest->direction = SDL_SYS_ToDirection(&periodic->direction);
       
   498          if (dest->direction < 0) return -1;
   489          
   499          
   490          /* Replay */
   500          /* Replay */
   491          dest->replay.length = CLAMP(periodic->length);
   501          dest->replay.length = CLAMP(periodic->length);
   492          dest->replay.delay = CLAMP(periodic->delay);
   502          dest->replay.delay = CLAMP(periodic->delay);
   493          
   503          
   566          ramp = &src->ramp;
   576          ramp = &src->ramp;
   567 
   577 
   568          /* Header */
   578          /* Header */
   569          dest->type = FF_RAMP;
   579          dest->type = FF_RAMP;
   570          dest->direction = SDL_SYS_ToDirection(&ramp->direction);
   580          dest->direction = SDL_SYS_ToDirection(&ramp->direction);
       
   581          if (dest->direction < 0) return -1;
   571 
   582 
   572          /* Replay */
   583          /* Replay */
   573          dest->replay.length = CLAMP(ramp->length);
   584          dest->replay.length = CLAMP(ramp->length);
   574          dest->replay.delay = CLAMP(ramp->delay);
   585          dest->replay.delay = CLAMP(ramp->delay);
   575 
   586