|
|
| version 1.2, 2004/07/26 15:53:26 | version 1.3, 2007/01/23 15:48:20 |
|---|---|
| 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) { | sprintf(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_sdl_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 *devname) | |
| { | |
| 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 (devname == NULL) { | |
| goto sdl_err; | |
| } | |
| errno = 0; | |
| lval = strtol(devname, &endptr, 10); | |
| if (devname[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 */ |