2001-04-26 16:45:43 +00:00
|
|
|
/*
|
|
|
|
SDL - Simple DirectMedia Layer
|
2004-01-04 16:49:27 +00:00
|
|
|
Copyright (C) 1997-2004 Sam Lantinga
|
2001-04-26 16:45:43 +00:00
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Library General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Library General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
|
|
License along with this library; if not, write to the Free
|
|
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
|
|
|
|
Sam Lantinga
|
2001-12-14 12:38:15 +00:00
|
|
|
slouken@libsdl.org
|
2001-04-26 16:45:43 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef SAVE_RCSID
|
|
|
|
static char rcsid =
|
|
|
|
"@(#) $Id$";
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* This is the system specific header for the SDL joystick API */
|
|
|
|
|
|
|
|
#include <stdio.h> /* For the definition of NULL */
|
|
|
|
#include <stdlib.h> /* For getenv() prototype */
|
|
|
|
#include <string.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <limits.h> /* For the definition of PATH_MAX */
|
2002-05-20 17:40:55 +00:00
|
|
|
#ifdef __arm__
|
|
|
|
#include <linux/limits.h> /* Arm cross-compiler needs this */
|
|
|
|
#endif
|
2001-04-26 16:45:43 +00:00
|
|
|
#include <linux/joystick.h>
|
|
|
|
#ifdef USE_INPUT_EVENTS
|
|
|
|
#include <linux/input.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "SDL_error.h"
|
|
|
|
#include "SDL_joystick.h"
|
|
|
|
#include "SDL_sysjoystick.h"
|
|
|
|
#include "SDL_joystick_c.h"
|
|
|
|
|
2002-12-02 03:11:36 +00:00
|
|
|
/* Special joystick configurations */
|
|
|
|
static struct {
|
|
|
|
const char *name;
|
|
|
|
int naxes;
|
|
|
|
int nhats;
|
|
|
|
int nballs;
|
|
|
|
} special_joysticks[] = {
|
|
|
|
{ "MadCatz Panther XL", 3, 2, 1 }, /* We don't handle rudder (axis 8) */
|
|
|
|
{ "SideWinder Precision Pro", 4, 1, 0 },
|
|
|
|
{ "SideWinder 3D Pro", 4, 1, 0 },
|
|
|
|
{ "Microsoft SideWinder 3D Pro", 4, 1, 0 },
|
|
|
|
{ "Microsoft SideWinder Dual Strike USB version 1.0", 2, 1, 0 },
|
|
|
|
{ "WingMan Interceptor", 3, 3, 0 },
|
|
|
|
{ "WingMan Extreme Digital 3D", 4, 1, 0 },
|
|
|
|
{ "Microsoft SideWinder Precision 2 Joystick", 4, 1, 0 },
|
|
|
|
{ "Logitech Inc. WingMan Extreme Digital 3D", 4, 1, 0 },
|
|
|
|
{ "Saitek Saitek X45", 6, 1, 0 }
|
2001-04-26 16:45:43 +00:00
|
|
|
};
|
|
|
|
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
/*
|
|
|
|
Some USB HIDs show up as a single joystick even though they actually
|
|
|
|
control 2 or more joysticks.
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
This code handles the MP-8800 (Quad) and MP-8866 (Dual), which can
|
|
|
|
be identified by their transparent blue design. It's quite trivial
|
|
|
|
to add other joysticks with similar quirky behavior.
|
|
|
|
-id
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct joystick_logical_mapping {
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
int njoy;
|
|
|
|
int nthing;
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
{logical joy, logical axis},
|
|
|
|
{logical joy, logical hat},
|
|
|
|
{logical joy, logical ball},
|
|
|
|
{logical joy, logical button}
|
|
|
|
*/
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
static struct joystick_logical_mapping mp88xx_1_logical_axismap[] = {
|
|
|
|
{0,0},{0,1},{0,2},{0,3},{0,4},{0,5}
|
|
|
|
};
|
|
|
|
static struct joystick_logical_mapping mp88xx_1_logical_buttonmap[] = {
|
|
|
|
{0,0},{0,1},{0,2},{0,3},{0,4},{0,5},{0,6},{0,7},{0,8},{0,9},{0,10},{0,11}
|
|
|
|
};
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
static struct joystick_logical_mapping mp88xx_2_logical_axismap[] = {
|
|
|
|
{0,0},{0,1},{0,2},{1,0},{1,1},{0,3},
|
|
|
|
{1,2},{1,3},{0,4},{0,5},{1,4},{1,5}
|
|
|
|
};
|
|
|
|
static struct joystick_logical_mapping mp88xx_2_logical_buttonmap[] = {
|
|
|
|
{0,0},{0,1},{0,2},{0,3},{0,4},{0,5},{0,6},{0,7},{0,8},{0,9},{0,10},{0,11},
|
|
|
|
{1,0},{1,1},{1,2},{1,3},{1,4},{1,5},{1,6},{1,7},{1,8},{1,9},{1,10},{1,11}
|
|
|
|
};
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
static struct joystick_logical_mapping mp88xx_3_logical_axismap[] = {
|
|
|
|
{0,0},{0,1},{0,2},{1,0},{1,1},{0,3},
|
|
|
|
{1,2},{1,3},{2,0},{2,1},{2,2},{2,3},
|
|
|
|
{0,4},{0,5},{1,4},{1,5},{2,4},{2,5}
|
|
|
|
};
|
|
|
|
static struct joystick_logical_mapping mp88xx_3_logical_buttonmap[] = {
|
|
|
|
{0,0},{0,1},{0,2},{0,3},{0,4},{0,5},{0,6},{0,7},{0,8},{0,9},{0,10},{0,11},
|
|
|
|
{1,0},{1,1},{1,2},{1,3},{1,4},{1,5},{1,6},{1,7},{1,8},{1,9},{1,10},{1,11},
|
|
|
|
{2,0},{2,1},{2,2},{2,3},{2,4},{2,5},{2,6},{2,7},{2,8},{2,9},{2,10},{2,11}
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct joystick_logical_mapping mp88xx_4_logical_axismap[] = {
|
|
|
|
{0,0},{0,1},{0,2},{1,0},{1,1},{0,3},
|
|
|
|
{1,2},{1,3},{2,0},{2,1},{2,2},{2,3},
|
|
|
|
{3,0},{3,1},{3,2},{3,3},{0,4},{0,5},
|
|
|
|
{1,4},{1,5},{2,4},{2,5},{3,4},{3,5}
|
|
|
|
};
|
|
|
|
static struct joystick_logical_mapping mp88xx_4_logical_buttonmap[] = {
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
{0,0},{0,1},{0,2},{0,3},{0,4},{0,5},{0,6},{0,7},{0,8},{0,9},{0,10},{0,11},
|
|
|
|
{1,0},{1,1},{1,2},{1,3},{1,4},{1,5},{1,6},{1,7},{1,8},{1,9},{1,10},{1,11},
|
|
|
|
{2,0},{2,1},{2,2},{2,3},{2,4},{2,5},{2,6},{2,7},{2,8},{2,9},{2,10},{2,11},
|
|
|
|
{3,0},{3,1},{3,2},{3,3},{3,4},{3,5},{3,6},{3,7},{3,8},{3,9},{3,10},{3,11}
|
|
|
|
};
|
|
|
|
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
struct joystick_logical_layout {
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
int naxes;
|
|
|
|
int nhats;
|
|
|
|
int nballs;
|
|
|
|
int nbuttons;
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static struct joystick_logical_layout mp88xx_1_logical_layout[] = {
|
|
|
|
{6, 0, 0, 12}
|
|
|
|
};
|
|
|
|
static struct joystick_logical_layout mp88xx_2_logical_layout[] = {
|
|
|
|
{6, 0, 0, 12},
|
|
|
|
{6, 0, 0, 12}
|
|
|
|
};
|
|
|
|
static struct joystick_logical_layout mp88xx_3_logical_layout[] = {
|
|
|
|
{6, 0, 0, 12},
|
|
|
|
{6, 0, 0, 12},
|
|
|
|
{6, 0, 0, 12}
|
|
|
|
};
|
|
|
|
static struct joystick_logical_layout mp88xx_4_logical_layout[] = {
|
|
|
|
{6, 0, 0, 12},
|
|
|
|
{6, 0, 0, 12},
|
|
|
|
{6, 0, 0, 12},
|
|
|
|
{6, 0, 0, 12}
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
This array sets up a means of mapping a single physical joystick to
|
|
|
|
multiple logical joysticks. (djm)
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
|
|
|
|
njoys
|
|
|
|
the number of logical joysticks
|
|
|
|
|
|
|
|
layouts
|
|
|
|
an array of layout structures, one to describe each logical joystick
|
|
|
|
|
|
|
|
axes, hats, balls, buttons
|
|
|
|
arrays that map a physical thingy to a logical thingy
|
|
|
|
*/
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
struct joystick_logicalmap {
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
const char *name;
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
int nbuttons;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
int njoys;
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
struct joystick_logical_layout *layout;
|
|
|
|
struct joystick_logical_mapping *axismap;
|
|
|
|
struct joystick_logical_mapping *hatmap;
|
|
|
|
struct joystick_logical_mapping *ballmap;
|
|
|
|
struct joystick_logical_mapping *buttonmap;
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct joystick_logicalmap joystick_logicalmap[] = {
|
|
|
|
{
|
|
|
|
"WiseGroup.,Ltd MP-8866 Dual USB Joypad",
|
|
|
|
12,
|
|
|
|
1,
|
|
|
|
mp88xx_1_logical_layout,
|
|
|
|
mp88xx_1_logical_axismap,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
mp88xx_1_logical_buttonmap
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"WiseGroup.,Ltd MP-8866 Dual USB Joypad",
|
|
|
|
24,
|
|
|
|
2,
|
|
|
|
mp88xx_2_logical_layout,
|
|
|
|
mp88xx_2_logical_axismap,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
mp88xx_2_logical_buttonmap
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"WiseGroup.,Ltd MP-8800 Quad USB Joypad",
|
|
|
|
12,
|
|
|
|
1,
|
|
|
|
mp88xx_1_logical_layout,
|
|
|
|
mp88xx_1_logical_axismap,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
mp88xx_1_logical_buttonmap
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"WiseGroup.,Ltd MP-8800 Quad USB Joypad",
|
|
|
|
24,
|
|
|
|
2,
|
|
|
|
mp88xx_2_logical_layout,
|
|
|
|
mp88xx_2_logical_axismap,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
mp88xx_2_logical_buttonmap
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"WiseGroup.,Ltd MP-8800 Quad USB Joypad",
|
|
|
|
36,
|
|
|
|
3,
|
|
|
|
mp88xx_3_logical_layout,
|
|
|
|
mp88xx_3_logical_axismap,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
mp88xx_3_logical_buttonmap
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"WiseGroup.,Ltd MP-8800 Quad USB Joypad",
|
|
|
|
48,
|
|
|
|
4,
|
|
|
|
mp88xx_4_logical_layout,
|
|
|
|
mp88xx_4_logical_axismap,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
mp88xx_4_logical_buttonmap
|
|
|
|
}
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* find the head of a linked list, given a point in it
|
|
|
|
*/
|
|
|
|
#define SDL_joylist_head(i, start)\
|
|
|
|
for(i = start; SDL_joylist[i].fname == NULL;) i = SDL_joylist[i].prev;
|
|
|
|
|
|
|
|
#define SDL_logical_joydecl(d) d
|
|
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#define SDL_logical_joydecl(d)
|
|
|
|
|
|
|
|
#endif /* USE_LOGICAL_JOYSTICKS */
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
/* The maximum number of joysticks we'll detect */
|
|
|
|
#define MAX_JOYSTICKS 32
|
|
|
|
|
|
|
|
/* A list of available joysticks */
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
static struct
|
|
|
|
{
|
|
|
|
char* fname;
|
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
SDL_Joystick* joy;
|
|
|
|
struct joystick_logicalmap* map;
|
|
|
|
int prev;
|
|
|
|
int next;
|
|
|
|
int logicalno;
|
|
|
|
#endif /* USE_LOGICAL_JOYSTICKS */
|
|
|
|
} SDL_joylist[MAX_JOYSTICKS];
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
|
|
|
|
/* The private structure used to keep track of a joystick */
|
|
|
|
struct joystick_hwdata {
|
|
|
|
int fd;
|
|
|
|
/* The current linux joystick driver maps hats to two axes */
|
|
|
|
struct hwdata_hat {
|
|
|
|
int axis[2];
|
|
|
|
} *hats;
|
|
|
|
/* The current linux joystick driver maps balls to two axes */
|
|
|
|
struct hwdata_ball {
|
|
|
|
int axis[2];
|
|
|
|
} *balls;
|
|
|
|
|
|
|
|
/* Support for the Linux 2.4 unified input interface */
|
|
|
|
#ifdef USE_INPUT_EVENTS
|
2002-12-02 03:11:36 +00:00
|
|
|
SDL_bool is_hid;
|
2001-04-26 16:45:43 +00:00
|
|
|
Uint8 key_map[KEY_MAX-BTN_MISC];
|
|
|
|
Uint8 abs_map[ABS_MAX];
|
|
|
|
struct axis_correct {
|
|
|
|
int used;
|
|
|
|
int coef[3];
|
|
|
|
} abs_correct[ABS_MAX];
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
static char *mystrdup(const char *string)
|
|
|
|
{
|
|
|
|
char *newstring;
|
|
|
|
|
|
|
|
newstring = (char *)malloc(strlen(string)+1);
|
|
|
|
if ( newstring ) {
|
|
|
|
strcpy(newstring, string);
|
|
|
|
}
|
|
|
|
return(newstring);
|
|
|
|
}
|
|
|
|
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
|
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
|
|
|
|
static int CountLogicalJoysticks(int max)
|
|
|
|
{
|
|
|
|
register int i, j, k, ret, prev;
|
|
|
|
const char* name;
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
int nbuttons, fd;
|
|
|
|
unsigned char n;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
for(i = 0; i < max; i++) {
|
|
|
|
name = SDL_SYS_JoystickName(i);
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
|
|
|
|
fd = open(SDL_joylist[i].fname, O_RDONLY, 0);
|
|
|
|
if ( fd >= 0 ) {
|
|
|
|
if ( ioctl(fd, JSIOCGBUTTONS, &n) < 0 ) {
|
|
|
|
nbuttons = -1;
|
|
|
|
} else {
|
|
|
|
nbuttons = n;
|
|
|
|
}
|
|
|
|
close(fd);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
nbuttons=-1;
|
|
|
|
}
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
|
|
|
|
if (name) {
|
|
|
|
for(j = 0; j < SDL_TABLESIZE(joystick_logicalmap); j++) {
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
if (!strcmp(name, joystick_logicalmap[j].name) && (nbuttons==-1 || nbuttons==joystick_logicalmap[j].nbuttons)) {
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
prev = i;
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
SDL_joylist[prev].map = &(joystick_logicalmap[j]);
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
|
|
|
|
for(k = 1; k < joystick_logicalmap[j].njoys; k++) {
|
|
|
|
SDL_joylist[prev].next = max + ret;
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
SDL_joylist[max+ret].prev = prev;
|
|
|
|
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
prev = max + ret;
|
|
|
|
SDL_joylist[prev].logicalno = k;
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
SDL_joylist[prev].map = &(joystick_logicalmap[j]);
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
ret++;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void LogicalSuffix(int logicalno, char* namebuf, int len)
|
|
|
|
{
|
|
|
|
register int slen;
|
|
|
|
const static char suffixs[] =
|
|
|
|
"01020304050607080910111213141516171819"
|
|
|
|
"20212223242526272829303132";
|
|
|
|
const char* suffix;
|
|
|
|
slen = strlen(namebuf);
|
|
|
|
suffix = NULL;
|
|
|
|
|
|
|
|
if (logicalno*2<sizeof(suffixs))
|
|
|
|
suffix = suffixs + (logicalno*2);
|
|
|
|
|
|
|
|
if (slen + 4 < len && suffix) {
|
|
|
|
namebuf[slen++] = ' ';
|
|
|
|
namebuf[slen++] = '#';
|
|
|
|
namebuf[slen++] = suffix[0];
|
|
|
|
namebuf[slen++] = suffix[1];
|
|
|
|
namebuf[slen++] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* USE_LOGICAL_JOYSTICKS */
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
#ifdef USE_INPUT_EVENTS
|
|
|
|
#define test_bit(nr, addr) \
|
|
|
|
(((1UL << ((nr) & 31)) & (((const unsigned int *) addr)[(nr) >> 5])) != 0)
|
|
|
|
|
|
|
|
static int EV_IsJoystick(int fd)
|
|
|
|
{
|
|
|
|
unsigned long evbit[40];
|
|
|
|
unsigned long keybit[40];
|
|
|
|
unsigned long absbit[40];
|
|
|
|
|
|
|
|
if ( (ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), evbit) < 0) ||
|
|
|
|
(ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) < 0) ||
|
|
|
|
(ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit) < 0) ) {
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
if (!(test_bit(EV_KEY, evbit) && test_bit(EV_ABS, evbit) &&
|
|
|
|
test_bit(ABS_X, absbit) && test_bit(ABS_Y, absbit) &&
|
|
|
|
(test_bit(BTN_TRIGGER, keybit) || test_bit(BTN_A, keybit) || test_bit(BTN_1, keybit)))) return 0;
|
|
|
|
return(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* USE_INPUT_EVENTS */
|
|
|
|
|
|
|
|
/* Function to scan the system for joysticks */
|
|
|
|
int SDL_SYS_JoystickInit(void)
|
|
|
|
{
|
|
|
|
/* The base path of the joystick devices */
|
2001-11-26 22:22:20 +00:00
|
|
|
const char *joydev_pattern[] = {
|
2001-04-26 16:45:43 +00:00
|
|
|
#ifdef USE_INPUT_EVENTS
|
2001-11-26 22:22:20 +00:00
|
|
|
"/dev/input/event%d",
|
2001-04-26 16:45:43 +00:00
|
|
|
#endif
|
2002-12-02 03:11:36 +00:00
|
|
|
"/dev/input/js%d",
|
|
|
|
"/dev/js%d"
|
2001-04-26 16:45:43 +00:00
|
|
|
};
|
|
|
|
int numjoysticks;
|
2002-12-02 03:11:36 +00:00
|
|
|
int i, j;
|
2001-04-26 16:45:43 +00:00
|
|
|
int fd;
|
|
|
|
char path[PATH_MAX];
|
|
|
|
dev_t dev_nums[MAX_JOYSTICKS]; /* major/minor device numbers */
|
|
|
|
struct stat sb;
|
|
|
|
int n, duplicate;
|
|
|
|
|
|
|
|
numjoysticks = 0;
|
|
|
|
|
|
|
|
/* First see if the user specified a joystick to use */
|
|
|
|
if ( getenv("SDL_JOYSTICK_DEVICE") != NULL ) {
|
|
|
|
strncpy(path, getenv("SDL_JOYSTICK_DEVICE"), sizeof(path));
|
|
|
|
path[sizeof(path)-1] = '\0';
|
|
|
|
if ( stat(path, &sb) == 0 ) {
|
|
|
|
fd = open(path, O_RDONLY, 0);
|
|
|
|
if ( fd >= 0 ) {
|
|
|
|
/* Assume the user knows what they're doing. */
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
SDL_joylist[numjoysticks].fname =mystrdup(path);
|
|
|
|
if ( SDL_joylist[numjoysticks].fname ) {
|
2001-04-26 16:45:43 +00:00
|
|
|
dev_nums[numjoysticks] = sb.st_rdev;
|
|
|
|
++numjoysticks;
|
|
|
|
}
|
|
|
|
close(fd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2002-12-02 03:11:36 +00:00
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
for ( i=0; i<SDL_TABLESIZE(joydev_pattern); ++i ) {
|
2002-12-02 03:11:36 +00:00
|
|
|
for ( j=0; j < MAX_JOYSTICKS; ++j ) {
|
2001-04-26 16:45:43 +00:00
|
|
|
sprintf(path, joydev_pattern[i], j);
|
|
|
|
|
|
|
|
/* rcg06302000 replaced access(F_OK) call with stat().
|
|
|
|
* stat() will fail if the file doesn't exist, so it's
|
|
|
|
* equivalent behaviour.
|
|
|
|
*/
|
|
|
|
if ( stat(path, &sb) == 0 ) {
|
|
|
|
/* Check to make sure it's not already in list.
|
|
|
|
* This happens when we see a stick via symlink.
|
|
|
|
*/
|
|
|
|
duplicate = 0;
|
|
|
|
for (n=0; (n<numjoysticks) && !duplicate; ++n) {
|
|
|
|
if ( sb.st_rdev == dev_nums[n] ) {
|
|
|
|
duplicate = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (duplicate) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
fd = open(path, O_RDONLY, 0);
|
|
|
|
if ( fd < 0 ) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
#ifdef USE_INPUT_EVENTS
|
|
|
|
#ifdef DEBUG_INPUT_EVENTS
|
|
|
|
printf("Checking %s\n", path);
|
|
|
|
#endif
|
2002-12-02 03:11:36 +00:00
|
|
|
if ( (i == 0) && ! EV_IsJoystick(fd) ) {
|
2001-04-26 16:45:43 +00:00
|
|
|
close(fd);
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
close(fd);
|
|
|
|
|
|
|
|
/* We're fine, add this joystick */
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
SDL_joylist[numjoysticks].fname =mystrdup(path);
|
|
|
|
if ( SDL_joylist[numjoysticks].fname ) {
|
2001-04-26 16:45:43 +00:00
|
|
|
dev_nums[numjoysticks] = sb.st_rdev;
|
|
|
|
++numjoysticks;
|
|
|
|
}
|
2002-12-02 03:11:36 +00:00
|
|
|
} else
|
|
|
|
break;
|
2001-04-26 16:45:43 +00:00
|
|
|
}
|
2002-12-02 03:11:36 +00:00
|
|
|
|
|
|
|
#ifdef USE_INPUT_EVENTS
|
|
|
|
/* This is a special case...
|
|
|
|
If the event devices are valid then the joystick devices
|
|
|
|
will be duplicates but without extra information about their
|
|
|
|
hats or balls. Unfortunately, the event devices can't
|
|
|
|
currently be calibrated, so it's a win-lose situation.
|
|
|
|
So : /dev/input/eventX = /dev/input/jsY = /dev/jsY
|
|
|
|
*/
|
|
|
|
if ( (i == 0) && (numjoysticks > 0) )
|
|
|
|
break;
|
|
|
|
#endif
|
2001-04-26 16:45:43 +00:00
|
|
|
}
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
numjoysticks += CountLogicalJoysticks(numjoysticks);
|
|
|
|
#endif
|
2002-12-02 03:11:36 +00:00
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
return(numjoysticks);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Function to get the device-dependent name of a joystick */
|
|
|
|
const char *SDL_SYS_JoystickName(int index)
|
|
|
|
{
|
|
|
|
int fd;
|
|
|
|
static char namebuf[128];
|
|
|
|
char *name;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
SDL_logical_joydecl(int oindex = index);
|
2001-04-26 16:45:43 +00:00
|
|
|
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
SDL_joylist_head(index, index);
|
|
|
|
#endif
|
2001-04-26 16:45:43 +00:00
|
|
|
name = NULL;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
fd = open(SDL_joylist[index].fname, O_RDONLY, 0);
|
2001-04-26 16:45:43 +00:00
|
|
|
if ( fd >= 0 ) {
|
|
|
|
if (
|
|
|
|
#ifdef USE_INPUT_EVENTS
|
|
|
|
(ioctl(fd, EVIOCGNAME(sizeof(namebuf)), namebuf) <= 0) &&
|
|
|
|
#endif
|
|
|
|
(ioctl(fd, JSIOCGNAME(sizeof(namebuf)), namebuf) <= 0) ) {
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
name = SDL_joylist[index].fname;
|
2001-04-26 16:45:43 +00:00
|
|
|
} else {
|
|
|
|
name = namebuf;
|
|
|
|
}
|
|
|
|
close(fd);
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
if (SDL_joylist[oindex].prev || SDL_joylist[oindex].next || index!=oindex)
|
|
|
|
{
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
LogicalSuffix(SDL_joylist[oindex].logicalno, namebuf, 128);
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
}
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#endif
|
2001-04-26 16:45:43 +00:00
|
|
|
}
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int allocate_hatdata(SDL_Joystick *joystick)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
joystick->hwdata->hats = (struct hwdata_hat *)malloc(
|
|
|
|
joystick->nhats * sizeof(struct hwdata_hat));
|
|
|
|
if ( joystick->hwdata->hats == NULL ) {
|
|
|
|
return(-1);
|
|
|
|
}
|
|
|
|
for ( i=0; i<joystick->nhats; ++i ) {
|
|
|
|
joystick->hwdata->hats[i].axis[0] = 1;
|
|
|
|
joystick->hwdata->hats[i].axis[1] = 1;
|
|
|
|
}
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int allocate_balldata(SDL_Joystick *joystick)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
joystick->hwdata->balls = (struct hwdata_ball *)malloc(
|
|
|
|
joystick->nballs * sizeof(struct hwdata_ball));
|
|
|
|
if ( joystick->hwdata->balls == NULL ) {
|
|
|
|
return(-1);
|
|
|
|
}
|
|
|
|
for ( i=0; i<joystick->nballs; ++i ) {
|
|
|
|
joystick->hwdata->balls[i].axis[0] = 0;
|
|
|
|
joystick->hwdata->balls[i].axis[1] = 0;
|
|
|
|
}
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
2002-12-02 03:11:36 +00:00
|
|
|
static SDL_bool JS_ConfigJoystick(SDL_Joystick *joystick, int fd)
|
2001-04-26 16:45:43 +00:00
|
|
|
{
|
|
|
|
SDL_bool handled;
|
2002-12-02 03:11:36 +00:00
|
|
|
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;
|
2001-04-26 16:45:43 +00:00
|
|
|
|
2002-12-02 03:11:36 +00:00
|
|
|
/* Default joystick device settings */
|
|
|
|
if ( ioctl(fd, JSIOCGAXES, &n) < 0 ) {
|
|
|
|
joystick->naxes = 2;
|
|
|
|
} else {
|
|
|
|
joystick->naxes = n;
|
2001-04-26 16:45:43 +00:00
|
|
|
}
|
2002-12-02 03:11:36 +00:00
|
|
|
if ( ioctl(fd, JSIOCGBUTTONS, &n) < 0 ) {
|
|
|
|
joystick->nbuttons = 2;
|
2001-04-26 16:45:43 +00:00
|
|
|
} else {
|
2002-12-02 03:11:36 +00:00
|
|
|
joystick->nbuttons = n;
|
2001-04-26 16:45:43 +00:00
|
|
|
}
|
|
|
|
|
2002-12-02 03:11:36 +00:00
|
|
|
name = SDL_SYS_JoystickName(joystick->index);
|
|
|
|
old_axes = joystick->naxes;
|
|
|
|
|
|
|
|
/* Generic analog joystick support */
|
|
|
|
if ( strstr(name, "Analog") == name && strstr(name, "-hat") ) {
|
|
|
|
if ( 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_TABLESIZE(special_joysticks); ++i ) {
|
|
|
|
if ( 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 = getenv("SDL_LINUX_JOYSTICK")) ) {
|
|
|
|
strcpy(env_name, "");
|
|
|
|
if ( *env == '\'' && sscanf(env, "'%[^']s'", env_name) == 1 )
|
|
|
|
env += strlen(env_name)+2;
|
|
|
|
else if ( sscanf(env, "%s", env_name) == 1 )
|
|
|
|
env += strlen(env_name);
|
|
|
|
|
|
|
|
if ( strcmp(name, env_name) == 0 ) {
|
|
|
|
|
|
|
|
if ( 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) {
|
2001-04-26 16:45:43 +00:00
|
|
|
if ( joystick->nhats > 0 ) {
|
2003-02-01 20:25:34 +00:00
|
|
|
if ( allocate_hatdata(joystick) < 0 ) {
|
|
|
|
joystick->nhats = 0;
|
2001-04-26 16:45:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( joystick->nballs > 0 ) {
|
|
|
|
if ( allocate_balldata(joystick) < 0 ) {
|
|
|
|
joystick->nballs = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2002-12-02 03:11:36 +00:00
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
return(handled);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef USE_INPUT_EVENTS
|
|
|
|
|
|
|
|
static SDL_bool EV_ConfigJoystick(SDL_Joystick *joystick, int fd)
|
|
|
|
{
|
2004-03-05 15:09:18 +00:00
|
|
|
int i, t;
|
2001-04-26 16:45:43 +00:00
|
|
|
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];
|
|
|
|
|
2004-05-16 22:48:06 +00:00
|
|
|
if ( ioctl(fd, EVIOCGABS(i), values) < 0 )
|
|
|
|
continue;
|
2001-04-26 16:45:43 +00:00
|
|
|
#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;
|
2004-03-06 02:58:06 +00:00
|
|
|
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];
|
2004-03-05 15:09:18 +00:00
|
|
|
t = ((values[2] - values[1]) / 2 - 2 * values[4]);
|
|
|
|
if ( t != 0 ) {
|
|
|
|
joystick->hwdata->abs_correct[i].coef[2] = (1 << 29) / t;
|
2004-03-06 02:58:06 +00:00
|
|
|
} else {
|
|
|
|
joystick->hwdata->abs_correct[i].coef[2] = 0;
|
2004-03-05 15:09:18 +00:00
|
|
|
}
|
2001-04-26 16:45:43 +00:00
|
|
|
}
|
|
|
|
++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);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* USE_INPUT_EVENTS */
|
|
|
|
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
static void ConfigLogicalJoystick(SDL_Joystick *joystick)
|
|
|
|
{
|
|
|
|
struct joystick_logical_layout* layout;
|
|
|
|
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
layout = SDL_joylist[joystick->index].map->layout +
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
SDL_joylist[joystick->index].logicalno;
|
|
|
|
|
|
|
|
joystick->nbuttons = layout->nbuttons;
|
|
|
|
joystick->nhats = layout->nhats;
|
|
|
|
joystick->naxes = layout->naxes;
|
|
|
|
joystick->nballs = layout->nballs;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
/* Function to open a joystick for use.
|
|
|
|
The joystick to open is specified by the index field of the joystick.
|
|
|
|
This should fill the nbuttons and naxes fields of the joystick structure.
|
|
|
|
It returns 0, or -1 if there is an error.
|
|
|
|
*/
|
|
|
|
int SDL_SYS_JoystickOpen(SDL_Joystick *joystick)
|
|
|
|
{
|
|
|
|
int fd;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
SDL_logical_joydecl(int realindex);
|
|
|
|
SDL_logical_joydecl(SDL_Joystick *realjoy = NULL);
|
2001-04-26 16:45:43 +00:00
|
|
|
|
|
|
|
/* Open the joystick and set the joystick file descriptor */
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
if (SDL_joylist[joystick->index].fname == NULL) {
|
|
|
|
SDL_joylist_head(realindex, joystick->index);
|
|
|
|
realjoy = SDL_JoystickOpen(realindex);
|
|
|
|
|
|
|
|
if (realjoy == NULL)
|
|
|
|
return(-1);
|
|
|
|
|
|
|
|
fd = realjoy->hwdata->fd;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
fd = open(SDL_joylist[joystick->index].fname, O_RDONLY, 0);
|
|
|
|
}
|
|
|
|
SDL_joylist[joystick->index].joy = joystick;
|
|
|
|
#else
|
|
|
|
fd = open(SDL_joylist[joystick->index].fname, O_RDONLY, 0);
|
|
|
|
#endif
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
if ( fd < 0 ) {
|
|
|
|
SDL_SetError("Unable to open %s\n",
|
|
|
|
SDL_joylist[joystick->index]);
|
|
|
|
return(-1);
|
|
|
|
}
|
|
|
|
joystick->hwdata = (struct joystick_hwdata *)
|
|
|
|
malloc(sizeof(*joystick->hwdata));
|
|
|
|
if ( joystick->hwdata == NULL ) {
|
|
|
|
SDL_OutOfMemory();
|
|
|
|
close(fd);
|
|
|
|
return(-1);
|
|
|
|
}
|
|
|
|
memset(joystick->hwdata, 0, sizeof(*joystick->hwdata));
|
|
|
|
joystick->hwdata->fd = fd;
|
|
|
|
|
|
|
|
/* Set the joystick to non-blocking read mode */
|
|
|
|
fcntl(fd, F_SETFL, O_NONBLOCK);
|
|
|
|
|
|
|
|
/* Get the number of buttons and axes on the joystick */
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
if (realjoy)
|
|
|
|
ConfigLogicalJoystick(joystick);
|
|
|
|
else
|
|
|
|
#endif
|
2001-04-26 16:45:43 +00:00
|
|
|
#ifdef USE_INPUT_EVENTS
|
|
|
|
if ( ! EV_ConfigJoystick(joystick, fd) )
|
|
|
|
#endif
|
2002-12-02 03:11:36 +00:00
|
|
|
JS_ConfigJoystick(joystick, fd);
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
|
|
|
|
static SDL_Joystick* FindLogicalJoystick(
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
SDL_Joystick *joystick, struct joystick_logical_mapping* v)
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
{
|
|
|
|
SDL_Joystick *logicaljoy;
|
|
|
|
register int i;
|
|
|
|
|
|
|
|
i = joystick->index;
|
|
|
|
logicaljoy = NULL;
|
|
|
|
|
|
|
|
/* get the fake joystick that will receive the event
|
|
|
|
*/
|
|
|
|
for(;;) {
|
|
|
|
|
|
|
|
if (SDL_joylist[i].logicalno == v->njoy) {
|
|
|
|
logicaljoy = SDL_joylist[i].joy;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (SDL_joylist[i].next == 0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
i = SDL_joylist[i].next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return logicaljoy;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int LogicalJoystickButton(
|
|
|
|
SDL_Joystick *joystick, Uint8 button, Uint8 state){
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
struct joystick_logical_mapping* buttons;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
SDL_Joystick *logicaljoy = NULL;
|
|
|
|
|
|
|
|
/* if there's no map then this is just a regular joystick
|
|
|
|
*/
|
|
|
|
if (SDL_joylist[joystick->index].map == NULL)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* get the logical joystick that will receive the event
|
|
|
|
*/
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
buttons = SDL_joylist[joystick->index].map->buttonmap+button;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
logicaljoy = FindLogicalJoystick(joystick, buttons);
|
|
|
|
|
|
|
|
if (logicaljoy == NULL)
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
SDL_PrivateJoystickButton(logicaljoy, buttons->nthing, state);
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int LogicalJoystickAxis(
|
|
|
|
SDL_Joystick *joystick, Uint8 axis, Sint16 value)
|
|
|
|
{
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
struct joystick_logical_mapping* axes;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
SDL_Joystick *logicaljoy = NULL;
|
|
|
|
|
|
|
|
/* if there's no map then this is just a regular joystick
|
|
|
|
*/
|
|
|
|
if (SDL_joylist[joystick->index].map == NULL)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* get the logical joystick that will receive the event
|
|
|
|
*/
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
axes = SDL_joylist[joystick->index].map->axismap+axis;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
logicaljoy = FindLogicalJoystick(joystick, axes);
|
|
|
|
|
|
|
|
if (logicaljoy == NULL)
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
SDL_PrivateJoystickAxis(logicaljoy, axes->nthing, value);
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
#endif /* USE_LOGICAL_JOYSTICKS */
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
static __inline__
|
|
|
|
void HandleHat(SDL_Joystick *stick, Uint8 hat, int axis, int value)
|
|
|
|
{
|
|
|
|
struct hwdata_hat *the_hat;
|
|
|
|
const Uint8 position_map[3][3] = {
|
|
|
|
{ SDL_HAT_LEFTUP, SDL_HAT_UP, SDL_HAT_RIGHTUP },
|
|
|
|
{ SDL_HAT_LEFT, SDL_HAT_CENTERED, SDL_HAT_RIGHT },
|
|
|
|
{ SDL_HAT_LEFTDOWN, SDL_HAT_DOWN, SDL_HAT_RIGHTDOWN }
|
|
|
|
};
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
SDL_logical_joydecl(SDL_Joystick *logicaljoy = NULL);
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
SDL_logical_joydecl(struct joystick_logical_mapping* hats = NULL);
|
2001-04-26 16:45:43 +00:00
|
|
|
|
|
|
|
the_hat = &stick->hwdata->hats[hat];
|
|
|
|
if ( value < 0 ) {
|
|
|
|
value = 0;
|
|
|
|
} else
|
|
|
|
if ( value == 0 ) {
|
|
|
|
value = 1;
|
|
|
|
} else
|
|
|
|
if ( value > 0 ) {
|
|
|
|
value = 2;
|
|
|
|
}
|
|
|
|
if ( value != the_hat->axis[axis] ) {
|
|
|
|
the_hat->axis[axis] = value;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
|
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
/* if there's no map then this is just a regular joystick
|
|
|
|
*/
|
|
|
|
if (SDL_joylist[stick->index].map != NULL) {
|
|
|
|
|
|
|
|
/* get the fake joystick that will receive the event
|
|
|
|
*/
|
Date: Wed, 23 Jun 2004 17:05:33 -0400
From: Chris Nelson
Subject: [SDL] [Patch] WiseGroup MP-8800 / MP-8866 (PS2 Joystick)
In the current cvs version, SDL doesn't handle these Playstation2
controller => USB adapters correctly, in linux.
It will always assume that the maximum number of joysticks (2 in the
case of the MP-8866, 4 in the case of the 8800) are plugged in. This is
bad not only because it allows SDL to exaggerate the number of logical
joysticks, but primarily because the joystick axes are mapped
incorrectly, all over the place, such that the devices are effectively
unusable unless you have the maximum number of joysticks plugged in.
My changes to src/joystick/linux/SDL_sysjoystick.c build on another's
previous work (which was a special case for this very joystick,
actually), and fix both of these problems, as well as making the current
code a little more general, to allow for others to more easily drop in
code for quirky joysticks such as these.
I've tested this code under 2.6.7 as well as 2.4.24... Both work as
advertised (provided you load the JOYDEV linux code as a module,
otherwise they won't work at all, new code or old, but that's another
issue entirely).
Though this sounds horribly formal, you have my permission to distribute
all of my work on this issue under the LGPL. So there.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40915
2004-07-25 18:31:50 +00:00
|
|
|
hats = SDL_joylist[stick->index].map->hatmap+hat;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
logicaljoy = FindLogicalJoystick(stick, hats);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (logicaljoy) {
|
|
|
|
stick = logicaljoy;
|
|
|
|
hat = hats->nthing;
|
|
|
|
}
|
|
|
|
#endif /* USE_LOGICAL_JOYSTICKS */
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
SDL_PrivateJoystickHat(stick, hat,
|
|
|
|
position_map[the_hat->axis[1]][the_hat->axis[0]]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static __inline__
|
|
|
|
void HandleBall(SDL_Joystick *stick, Uint8 ball, int axis, int value)
|
|
|
|
{
|
|
|
|
stick->hwdata->balls[ball].axis[axis] += value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Function to update the state of a joystick - called as a device poll.
|
|
|
|
* This function shouldn't update the joystick structure directly,
|
|
|
|
* but instead should call SDL_PrivateJoystick*() to deliver events
|
|
|
|
* and update joystick device state.
|
|
|
|
*/
|
|
|
|
static __inline__ void JS_HandleEvents(SDL_Joystick *joystick)
|
|
|
|
{
|
|
|
|
struct js_event events[32];
|
|
|
|
int i, len;
|
|
|
|
Uint8 other_axis;
|
|
|
|
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
if (SDL_joylist[joystick->index].fname == NULL) {
|
|
|
|
SDL_joylist_head(i, joystick->index);
|
|
|
|
return JS_HandleEvents(SDL_joylist[i].joy);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
while ((len=read(joystick->hwdata->fd, events, (sizeof events))) > 0) {
|
|
|
|
len /= sizeof(events[0]);
|
|
|
|
for ( i=0; i<len; ++i ) {
|
|
|
|
switch (events[i].type & ~JS_EVENT_INIT) {
|
|
|
|
case JS_EVENT_AXIS:
|
|
|
|
if ( events[i].number < joystick->naxes ) {
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
if (!LogicalJoystickAxis(joystick,
|
|
|
|
events[i].number, events[i].value))
|
|
|
|
#endif
|
2001-04-26 16:45:43 +00:00
|
|
|
SDL_PrivateJoystickAxis(joystick,
|
|
|
|
events[i].number, events[i].value);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
events[i].number -= joystick->naxes;
|
2003-02-01 20:25:34 +00:00
|
|
|
other_axis = (events[i].number / 2);
|
|
|
|
if ( other_axis < joystick->nhats ) {
|
|
|
|
HandleHat(joystick, other_axis,
|
|
|
|
events[i].number%2,
|
|
|
|
events[i].value);
|
|
|
|
break;
|
2001-04-26 16:45:43 +00:00
|
|
|
}
|
|
|
|
events[i].number -= joystick->nhats*2;
|
|
|
|
other_axis = (events[i].number / 2);
|
|
|
|
if ( other_axis < joystick->nballs ) {
|
|
|
|
HandleBall(joystick, other_axis,
|
|
|
|
events[i].number%2,
|
|
|
|
events[i].value);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case JS_EVENT_BUTTON:
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
if (!LogicalJoystickButton(joystick,
|
|
|
|
events[i].number, events[i].value))
|
|
|
|
#endif
|
2001-04-26 16:45:43 +00:00
|
|
|
SDL_PrivateJoystickButton(joystick,
|
|
|
|
events[i].number, events[i].value);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
/* ?? */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#ifdef USE_INPUT_EVENTS
|
|
|
|
static __inline__ int EV_AxisCorrect(SDL_Joystick *joystick, int which, int value)
|
|
|
|
{
|
|
|
|
struct axis_correct *correct;
|
|
|
|
|
|
|
|
correct = &joystick->hwdata->abs_correct[which];
|
|
|
|
if ( correct->used ) {
|
|
|
|
if ( value > correct->coef[0] ) {
|
|
|
|
if ( value < correct->coef[1] ) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
value -= correct->coef[1];
|
|
|
|
} else {
|
|
|
|
value -= correct->coef[0];
|
|
|
|
}
|
|
|
|
value *= correct->coef[2];
|
|
|
|
value >>= 14;
|
|
|
|
}
|
2002-12-02 03:11:36 +00:00
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
/* Clamp and return */
|
2002-12-02 03:11:36 +00:00
|
|
|
if ( value < -32767 ) return -32767;
|
|
|
|
if ( value > 32767 ) return 32767;
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
static __inline__ void EV_HandleEvents(SDL_Joystick *joystick)
|
|
|
|
{
|
|
|
|
struct input_event events[32];
|
|
|
|
int i, len;
|
|
|
|
int code;
|
|
|
|
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
if (SDL_joylist[joystick->index].fname == NULL) {
|
|
|
|
SDL_joylist_head(i, joystick->index);
|
|
|
|
return EV_HandleEvents(SDL_joylist[i].joy);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
while ((len=read(joystick->hwdata->fd, events, (sizeof events))) > 0) {
|
|
|
|
len /= sizeof(events[0]);
|
|
|
|
for ( i=0; i<len; ++i ) {
|
|
|
|
code = events[i].code;
|
|
|
|
switch (events[i].type) {
|
|
|
|
case EV_KEY:
|
|
|
|
if ( code >= BTN_MISC ) {
|
|
|
|
code -= BTN_MISC;
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
if (!LogicalJoystickButton(joystick,
|
|
|
|
joystick->hwdata->key_map[code],
|
|
|
|
events[i].value))
|
|
|
|
#endif
|
2001-04-26 16:45:43 +00:00
|
|
|
SDL_PrivateJoystickButton(joystick,
|
|
|
|
joystick->hwdata->key_map[code],
|
|
|
|
events[i].value);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EV_ABS:
|
|
|
|
switch (code) {
|
|
|
|
case ABS_HAT0X:
|
|
|
|
case ABS_HAT0Y:
|
|
|
|
case ABS_HAT1X:
|
|
|
|
case ABS_HAT1Y:
|
|
|
|
case ABS_HAT2X:
|
|
|
|
case ABS_HAT2Y:
|
|
|
|
case ABS_HAT3X:
|
|
|
|
case ABS_HAT3Y:
|
|
|
|
code -= ABS_HAT0X;
|
|
|
|
HandleHat(joystick, code/2, code%2,
|
|
|
|
events[i].value);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
events[i].value = EV_AxisCorrect(joystick, code, events[i].value);
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
if (!LogicalJoystickAxis(joystick,
|
|
|
|
joystick->hwdata->abs_map[code],
|
|
|
|
events[i].value))
|
|
|
|
#endif
|
2001-04-26 16:45:43 +00:00
|
|
|
SDL_PrivateJoystickAxis(joystick,
|
|
|
|
joystick->hwdata->abs_map[code],
|
|
|
|
events[i].value);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EV_REL:
|
|
|
|
switch (code) {
|
|
|
|
case REL_X:
|
|
|
|
case REL_Y:
|
|
|
|
code -= REL_X;
|
|
|
|
HandleBall(joystick, code/2, code%2,
|
|
|
|
events[i].value);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif /* USE_INPUT_EVENTS */
|
|
|
|
|
|
|
|
void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
#ifdef USE_INPUT_EVENTS
|
|
|
|
if ( joystick->hwdata->is_hid )
|
|
|
|
EV_HandleEvents(joystick);
|
|
|
|
else
|
|
|
|
#endif
|
|
|
|
JS_HandleEvents(joystick);
|
|
|
|
|
|
|
|
/* Deliver ball motion updates */
|
|
|
|
for ( i=0; i<joystick->nballs; ++i ) {
|
|
|
|
int xrel, yrel;
|
|
|
|
|
|
|
|
xrel = joystick->hwdata->balls[i].axis[0];
|
|
|
|
yrel = joystick->hwdata->balls[i].axis[1];
|
|
|
|
if ( xrel || yrel ) {
|
|
|
|
joystick->hwdata->balls[i].axis[0] = 0;
|
|
|
|
joystick->hwdata->balls[i].axis[1] = 0;
|
|
|
|
SDL_PrivateJoystickBall(joystick, (Uint8)i, xrel, yrel);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Function to close a joystick after use */
|
|
|
|
void SDL_SYS_JoystickClose(SDL_Joystick *joystick)
|
|
|
|
{
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
register int i;
|
|
|
|
if (SDL_joylist[joystick->index].fname == NULL) {
|
|
|
|
SDL_joylist_head(i, joystick->index);
|
|
|
|
SDL_JoystickClose(SDL_joylist[i].joy);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2001-04-26 16:45:43 +00:00
|
|
|
if ( joystick->hwdata ) {
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
#ifndef NO_LOGICAL_JOYSTICKS
|
|
|
|
if (SDL_joylist[joystick->index].fname != NULL)
|
|
|
|
#endif
|
2001-04-26 16:45:43 +00:00
|
|
|
close(joystick->hwdata->fd);
|
|
|
|
if ( joystick->hwdata->hats ) {
|
|
|
|
free(joystick->hwdata->hats);
|
|
|
|
}
|
|
|
|
if ( joystick->hwdata->balls ) {
|
|
|
|
free(joystick->hwdata->balls);
|
|
|
|
}
|
|
|
|
free(joystick->hwdata);
|
|
|
|
joystick->hwdata = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Function to perform any system-specific joystick related cleanup */
|
|
|
|
void SDL_SYS_JoystickQuit(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
for ( i=0; SDL_joylist[i].fname; ++i ) {
|
|
|
|
free(SDL_joylist[i].fname);
|
2001-04-26 16:45:43 +00:00
|
|
|
}
|
Date: Sun, 18 Apr 2004 16:09:53 -0400 (EDT)
From: David MacCormack
Subject: [SDL] Linux joystick patch
I recently got myself a PS2 -> USB converter (a super joybox 5). It
accepts 4 PSX/PS2 controllers. It's implemented as a HID, which is nice
because it doesn't require its own driver, but the problem is that it's
implemented as a *single* HID -- that is, it shows up as a single
joystick with 19 axes, 4 hats, and 48 buttons. This poses a problem for a
number of apps which use SDL (stella, fce ultra, zsnes, to name a few) and
see only a single (physical) joystick even though there are really 4
(logical) joysticks. There are a number of these types of devices on the
market, and I've seen others post messages (in the zsnes forum, for
example) with the same problem, so I came up with what I think is a pretty
generic solution.
I patched src/joystick/linux/SDL_sysjoystic.c to include support for
logical joysticks; basically, it's a static array and supporting functions
that map a single physical joystick to multiple logical joysticks. The
attached patch has the new code. It's wrapped inside #ifndef
statements so that you can get the old behavior if you want.
--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40893
2004-05-16 18:46:24 +00:00
|
|
|
SDL_joylist[0].fname = NULL;
|
2001-04-26 16:45:43 +00:00
|
|
|
}
|
|
|
|
|