Diff for /np2/x11/joymng.c between versions 1.2 and 1.6

version 1.2, 2004/07/26 15:53:26 version 1.6, 2011/01/15 16:55:37
Line 33 Line 33
 #include "np2.h"  #include "np2.h"
   
 #include "joymng.h"  #include "joymng.h"
 #include "joydrv/joydrv.h"  
   
 static struct {  static struct {
         joydrv_handle_t hdl;          void *hdl;
           BOOL inited;
   
         BYTE            pad1btn[NELEMENTS(np2oscfg.JOY1BTN)];          const joymng_devinfo_t **devlist;
         REG8            flag;  
   
         joydrv_handle_t *devlist;          BYTE pad1btn[NELEMENTS(np2oscfg.JOY1BTN)];
         BOOL            inited;          REG8 flag;
 } joyinfo = {  } joyinfo = {
         NULL,          NULL,
           FALSE,
   
           NULL,
   
         { 0, },          { 0, },
         0xff,          0xff,
   
         NULL,  
         FALSE,  
 };  };
   
   typedef struct {
           SINT16  axis[JOY_NAXIS];
           BYTE    button[JOY_NBUTTON];
   } JOYINFO_T;
   
   static const joymng_devinfo_t **joydrv_initialize(void);
   static void joydrv_terminate(void);
   static void *joydrv_open(const char *dev);
   static void joydrv_close(void *hdl);
   static BOOL joydrv_getstat(void *hdl, JOYINFO_T *ji);
   
 void  void
 joymng_initialize(void)  joymng_initialize(void)
 {  {
Line 99  joymng_deinitialize(void) Line 109  joymng_deinitialize(void)
         np2oscfg.JOYPAD1 &= 1;          np2oscfg.JOYPAD1 &= 1;
 }  }
   
 const joydrv_handle_t *  const joymng_devinfo_t **
 joymng_get_devinfo_list(void)  joymng_get_devinfo_list(void)
 {  {
   
         return (const joydrv_handle_t *)joyinfo.devlist;          return joyinfo.devlist;
 }  }
   
 void  void
Line 147  joymng_getstat(void) Line 157  joymng_getstat(void)
                         }                          }
                 }                  }
         }          }
   
         return joyinfo.flag;          return joyinfo.flag;
 }  }
   
 REG8  #if defined(USE_SDL_JOYSTICK)
 joymng_getstat_with_map(UINT8 *axismap, UINT8 *btnmap)  
   #include <SDL.h>
   #include <SDL_joystick.h>
   
   typedef struct {
           joymng_devinfo_t        dev;
           SDL_Joystick            *joyhdl;
   } joydrv_sdl_hdl_t;
   
   const joymng_devinfo_t **
   joydrv_initialize(void)
 {  {
         JOYINFO_T ji;          char str[32];
         int i;          joydrv_sdl_hdl_t *shdl;
         REG8 joyflag;          joymng_devinfo_t **devlist = NULL;
           size_t allocsize;
           int ndrv = 0;
           int rv;
           int i, n;
   
           rv = SDL_InitSubSystem(SDL_INIT_JOYSTICK);
           if (rv < 0) {
                   return NULL;
           }
   
         if (joyinfo.hdl) {          ndrv = SDL_NumJoysticks();
                 if (joydrv_getstat_with_map(joyinfo.hdl, &ji, axismap, btnmap) == SUCCESS) {          if (ndrv <= 0) {
                         joyflag = 0xff;                  goto sdl_err;
           }
   
                         /* X */          allocsize = sizeof(joymng_devinfo_t *) * (ndrv + 1);
                         if (ji.axis[0] > 0x4000) {          devlist = _MALLOC(allocsize, "joy device list");
                                 joyflag &= ~JOY_RIGHT_BIT;          if (devlist == NULL) {
                         } else if (ji.axis[0] < -0x4000) {                  goto sdl_err;
                                 joyflag &= ~JOY_LEFT_BIT;          }
                         }          memset(devlist, 0, allocsize);
   
                         /* Y */          for (n = 0, i = 0; i < ndrv; ++i) {
                         if (ji.axis[1] > 0x4000) {                  g_snprintf(str, sizeof(str), "%d", i);
                                 joyflag &= ~JOY_DOWN_BIT;                  devlist[n] = joydrv_open(str);
                         } else if (ji.axis[1] < -0x4000) {                  if (devlist[n] == NULL) {
                                 joyflag &= ~JOY_UP_BIT;                          continue;
                         }                  }
                   shdl = (joydrv_sdl_hdl_t *)devlist[n];
                   SDL_JoystickClose(shdl->joyhdl);
                   shdl->joyhdl = NULL;
                   n++;
           }
   
                         /* button */          return (const joymng_devinfo_t **)devlist;
                         for (i = 0; i < JOY_NBUTTON; ++i) {  
                                 if (ji.button[i]) {  sdl_err:
                                         joyflag &= joyinfo.pad1btn[i];          if (devlist) {
                                 }                  for (i = 0; i < ndrv; ++i) {
                           if (devlist[i]) {
                                   joydrv_close(devlist[i]);
                         }                          }
                         return joyflag;  
                 }                  }
                   _MFREE(devlist);
         }          }
         return 0xff;  
           SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
   
           return NULL;
 }  }
   
 void  void
 joymng_update(void)  joydrv_terminate(void)
 {  {
   
         if (joyinfo.hdl) {          SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
                 joydrv_update(joyinfo.hdl);  }
   
   void *
   joydrv_open(const char *dvname)
   {
           joydrv_sdl_hdl_t *shdl = NULL;
           joymng_devinfo_t *dev;
           SDL_Joystick *joy = NULL;
           char *endptr;
           size_t allocsize;
           long lval;
           int drv;
           int ndrv;
           int naxis;
           int nbutton;
           int i;
   
           if (dvname == NULL) {
                   goto sdl_err;
           }
   
           errno = 0;
           lval = strtol(dvname, &endptr, 10);
           if (dvname[0] == '\0' || *endptr != '\0') {
                   goto sdl_err;
           }
           if (errno == ERANGE && (lval == LONG_MAX || lval == LONG_MIN)) {
                   goto sdl_err;
           }
           if (lval < 0 || lval > INT_MAX) {
                   goto sdl_err;
           }
           drv = (int)lval;
   
           ndrv = SDL_NumJoysticks();
           if (ndrv <= 0 || drv >= ndrv) {
                   goto sdl_err;
           }
   
           joy = SDL_JoystickOpen(drv);
           if (joy == NULL) {
                   goto sdl_err;
           }
   
           naxis = SDL_JoystickNumAxes(joy);
           if (naxis < 2 || naxis >= 255) {
                   goto sdl_err;
           }
           nbutton = SDL_JoystickNumButtons(joy);
           if (nbutton < 2 || nbutton >= 255) {
                   goto sdl_err;
           }
   
           allocsize = sizeof(joydrv_sdl_hdl_t);
           shdl = _MALLOC(allocsize, "SDL joystick handle");
           if (shdl == NULL) {
                   goto sdl_err;
           }
           memset(shdl, 0, allocsize);
   
           shdl->joyhdl = joy;
   
           dev = &shdl->dev;
           dev->devindex = drv;
           dev->devname = strdup(SDL_JoystickName(drv));
           dev->naxis = naxis;
           for (i = 0; i < JOY_NAXIS; ++i) {
                   if (np2oscfg.JOYAXISMAP[0][i] < naxis) {
                           dev->axis[i] = np2oscfg.JOYAXISMAP[0][i];
                   } else {
                           dev->axis[i] = JOY_AXIS_INVALID;
                   }
           }
           dev->nbutton = nbutton;
           for (i = 0; i < JOY_NBUTTON; ++i) {
                   if (np2oscfg.JOYBTNMAP[0][i] < nbutton) {
                           dev->button[i] = np2oscfg.JOYBTNMAP[0][i];
                   } else {
                           dev->button[i] = JOY_BUTTON_INVALID;
                   }
           }
   
           return shdl;
   
   sdl_err:
           if (shdl) {
                   if (shdl->dev.devname) {
                           free(shdl->dev.devname);
                           shdl->dev.devname = NULL;
                   }
                   _MFREE(shdl);
           }
           if (joy) {
                   SDL_JoystickClose(joy);
         }          }
           return NULL;
 }  }
   
 int  void
 joymng_update_task(void *p)  joydrv_close(void *hdl)
 {  {
           joydrv_sdl_hdl_t *shdl = (joydrv_sdl_hdl_t *)hdl;
           joymng_devinfo_t *dev = &shdl->dev;
           SDL_Joystick *joy = shdl->joyhdl;
   
         UNUSED(p);          if (joy) {
                   SDL_JoystickClose(joy);
           }
           if (dev->devname) {
                   free(dev->devname);
                   dev->devname = NULL;
           }
           _MFREE(shdl);
   }
   
         if (joyinfo.hdl) {  BOOL
                 joydrv_update(joyinfo.hdl);  joydrv_getstat(void *hdl, JOYINFO_T *ji)
   {
           joydrv_sdl_hdl_t *shdl = (joydrv_sdl_hdl_t *)hdl;
           joymng_devinfo_t *dev = &shdl->dev;
           SDL_Joystick *joy = shdl->joyhdl;
           int i;
   
           SDL_JoystickUpdate();
   
           for (i = 0; i < JOY_NAXIS; ++i) {
                   ji->axis[i] = (dev->axis[i] == JOY_AXIS_INVALID) ? 0 :
                       SDL_JoystickGetAxis(joy, dev->axis[i]);
           }
           for (i = 0; i < JOY_NBUTTON; ++i) {
                   ji->button[i] = (dev->button[i] == JOY_BUTTON_INVALID) ? 0 :
                       SDL_JoystickGetButton(joy, dev->button[i]);
         }          }
   
         return TRUE;          return SUCCESS;
 }  }
   #endif  /* USE_SDL_JOYSTICK */
   
 #endif  /* SUPPORT_JOYSTICK */  #endif  /* SUPPORT_JOYSTICK */

Removed from v.1.2  
changed lines
  Added in v.1.6


RetroPC.NET-CVS <cvs@retropc.net>