mirror of
https://github.com/RaySollium99/libpicofe.git
synced 2025-09-05 06:47:45 -04:00
extracted OSS code to sndout_oss_*, BTN->PBTN, refactoring
git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@599 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
725d7f6c16
commit
b3972d826f
21 changed files with 386 additions and 478 deletions
|
@ -27,8 +27,8 @@ COPT += `pkg-config --cflags gthread-2.0`
|
|||
LDFLAGS += `pkg-config --libs gthread-2.0`
|
||||
|
||||
# frontend
|
||||
OBJS += platform/gp2x/main.o platform/gp2x/menu.o platform/gp2x/emu.o platform/gp2x/usbjoy.o blit.o \
|
||||
gp2x.o 940ctl_ym2612.o log_io.o
|
||||
OBJS += platform/gp2x/main.o platform/gp2x/menu.o platform/gp2x/emu.o usbjoy.o blit.o \
|
||||
sndout_oss.o gp2x.o 940ctl_ym2612.o log_io.o
|
||||
|
||||
# common
|
||||
OBJS += platform/common/emu.o platform/common/menu.o platform/common/config.o platform/common/fonts.o \
|
||||
|
|
69
linux/gp2x.c
69
linux/gp2x.c
|
@ -9,15 +9,14 @@
|
|||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/soundcard.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "../gp2x/emu.h"
|
||||
#include "../gp2x/gp2x.h"
|
||||
#include "../gp2x/usbjoy.h"
|
||||
#include "../gp2x/version.h"
|
||||
#include "sndout_oss.h"
|
||||
#include "usbjoy.h"
|
||||
|
||||
#include "log_io.h"
|
||||
|
||||
|
@ -25,7 +24,6 @@ void *gp2x_screen;
|
|||
static int current_bpp = 8;
|
||||
static int current_pal[256];
|
||||
static unsigned long current_keys = 0;
|
||||
static int sounddev = 0, mixerdev = 0;
|
||||
static const char *verstring = "PicoDrive " VERSION;
|
||||
|
||||
// dummies
|
||||
|
@ -184,13 +182,11 @@ void gp2x_init(void)
|
|||
memset(gp2x_screen, 0, 320*240*2 + 320*2);
|
||||
|
||||
// snd
|
||||
mixerdev = open("/dev/mixer", O_RDWR);
|
||||
if (mixerdev == -1)
|
||||
printf("open(\"/dev/mixer\") failed with %i\n", errno);
|
||||
sndout_oss_init();
|
||||
|
||||
gtk_initf();
|
||||
|
||||
gp2x_usbjoy_init();
|
||||
usbjoy_init();
|
||||
|
||||
printf("exitting init()\n"); fflush(stdout);
|
||||
}
|
||||
|
@ -198,9 +194,8 @@ void gp2x_init(void)
|
|||
void gp2x_deinit(void)
|
||||
{
|
||||
free(gp2x_screen);
|
||||
if (sounddev > 0) close(sounddev);
|
||||
close(mixerdev);
|
||||
gp2x_usbjoy_deinit();
|
||||
sndout_oss_exit();
|
||||
usbjoy_deinit();
|
||||
}
|
||||
|
||||
/* video */
|
||||
|
@ -304,54 +299,6 @@ void gp2x_pd_clone_buffer2(void)
|
|||
memset(gp2x_screen, 0, 320*240*2);
|
||||
}
|
||||
|
||||
/* sound */
|
||||
static int s_oldrate = 0, s_oldbits = 0, s_oldstereo = 0;
|
||||
|
||||
void gp2x_start_sound(int rate, int bits, int stereo)
|
||||
{
|
||||
int frag = 0, bsize, buffers;
|
||||
|
||||
// if no settings change, we don't need to do anything
|
||||
if (rate == s_oldrate && s_oldbits == bits && s_oldstereo == stereo) return;
|
||||
|
||||
if (sounddev > 0) close(sounddev);
|
||||
sounddev = open("/dev/dsp", O_WRONLY|O_ASYNC);
|
||||
if (sounddev == -1)
|
||||
printf("open(\"/dev/dsp\") failed with %i\n", errno);
|
||||
|
||||
ioctl(sounddev, SNDCTL_DSP_SPEED, &rate);
|
||||
ioctl(sounddev, SNDCTL_DSP_SETFMT, &bits);
|
||||
ioctl(sounddev, SNDCTL_DSP_STEREO, &stereo);
|
||||
// calculate buffer size
|
||||
buffers = 16;
|
||||
bsize = rate / 32;
|
||||
if (rate > 22050) { bsize*=4; buffers*=2; } // 44k mode seems to be very demanding
|
||||
while ((bsize>>=1)) frag++;
|
||||
frag |= buffers<<16; // 16 buffers
|
||||
ioctl(sounddev, SNDCTL_DSP_SETFRAGMENT, &frag);
|
||||
printf("gp2x_set_sound: %i/%ibit/%s, %i buffers of %i bytes\n",
|
||||
rate, bits, stereo?"stereo":"mono", frag>>16, 1<<(frag&0xffff));
|
||||
|
||||
s_oldrate = rate; s_oldbits = bits; s_oldstereo = stereo;
|
||||
}
|
||||
|
||||
void gp2x_sound_write(void *buff, int len)
|
||||
{
|
||||
write(sounddev, buff, len);
|
||||
}
|
||||
|
||||
void gp2x_sound_sync(void)
|
||||
{
|
||||
ioctl(sounddev, SOUND_PCM_SYNC, 0);
|
||||
}
|
||||
|
||||
void gp2x_sound_volume(int l, int r)
|
||||
{
|
||||
l=l<0?0:l; l=l>255?255:l; r=r<0?0:r; r=r>255?255:r;
|
||||
l<<=8; l|=r;
|
||||
ioctl(mixerdev, SOUND_MIXER_WRITE_PCM, &l); /*SOUND_MIXER_WRITE_VOLUME*/
|
||||
}
|
||||
|
||||
/* joy */
|
||||
unsigned long gp2x_joystick_read(int allow_usb_joy)
|
||||
{
|
||||
|
@ -360,9 +307,9 @@ unsigned long gp2x_joystick_read(int allow_usb_joy)
|
|||
|
||||
if (allow_usb_joy && num_of_joys > 0) {
|
||||
// check the usb joy as well..
|
||||
gp2x_usbjoy_update();
|
||||
usbjoy_update();
|
||||
for (i = 0; i < num_of_joys; i++)
|
||||
value |= gp2x_usbjoy_check(i);
|
||||
value |= usbjoy_check(i);
|
||||
}
|
||||
|
||||
return value;
|
||||
|
|
96
linux/sndout_oss.c
Normal file
96
linux/sndout_oss.c
Normal file
|
@ -0,0 +1,96 @@
|
|||
/* sound output via OSS */
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/soundcard.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "sndout_oss.h"
|
||||
|
||||
static int sounddev = -1, mixerdev = -1;
|
||||
|
||||
int sndout_oss_init(void)
|
||||
{
|
||||
if (mixerdev >= 0) close(mixerdev);
|
||||
mixerdev = open("/dev/mixer", O_RDWR);
|
||||
if (mixerdev == -1)
|
||||
{
|
||||
perror("open(\"/dev/mixer\")");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int sndout_oss_start(int rate, int bits, int stereo)
|
||||
{
|
||||
static int s_oldrate = 0, s_oldbits = 0, s_oldstereo = 0;
|
||||
int frag = 0, bsize, buffers, ret;
|
||||
|
||||
// if no settings change, we don't need to do anything,
|
||||
// since audio is never stopped
|
||||
if (rate == s_oldrate && s_oldbits == bits && s_oldstereo == stereo)
|
||||
return 0;
|
||||
|
||||
if (sounddev >= 0) close(sounddev);
|
||||
sounddev = open("/dev/dsp", O_WRONLY|O_ASYNC);
|
||||
if (sounddev == -1)
|
||||
{
|
||||
perror("open(\"/dev/dsp\")");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// calculate buffer size
|
||||
// this is tuned for GP2X
|
||||
buffers = 16;
|
||||
bsize = rate / 32;
|
||||
if (rate > 22050) { bsize*=4; buffers*=2; }
|
||||
while ((bsize>>=1)) frag++;
|
||||
frag |= buffers<<16; // 16 buffers
|
||||
ret = ioctl(sounddev, SNDCTL_DSP_SETFRAGMENT, &frag);
|
||||
if (ret) perror("SNDCTL_DSP_SETFRAGMENT failed");
|
||||
|
||||
ret = ioctl(sounddev, SNDCTL_DSP_STEREO, &stereo);
|
||||
ret |= ioctl(sounddev, SNDCTL_DSP_SETFMT, &bits);
|
||||
ret |= ioctl(sounddev, SNDCTL_DSP_SPEED, &rate);
|
||||
if (ret) printf("failed to set audio format\n");
|
||||
usleep(192*1024);
|
||||
|
||||
printf("gp2x_set_sound: %i/%ibit/%s, %i buffers of %i bytes\n",
|
||||
rate, bits, stereo?"stereo":"mono", frag>>16, 1<<(frag&0xffff));
|
||||
|
||||
s_oldrate = rate; s_oldbits = bits; s_oldstereo = stereo;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int sndout_oss_write(const void *buff, int len)
|
||||
{
|
||||
return write(sounddev, buff, len);
|
||||
}
|
||||
|
||||
|
||||
void sndout_oss_sync(void)
|
||||
{
|
||||
ioctl(sounddev, SOUND_PCM_SYNC, 0);
|
||||
}
|
||||
|
||||
|
||||
void sndout_oss_setvol(int l, int r)
|
||||
{
|
||||
if (mixerdev < 0) return;
|
||||
|
||||
l=l<0?0:l; l=l>255?255:l; r=r<0?0:r; r=r>255?255:r;
|
||||
l<<=8; l|=r;
|
||||
ioctl(mixerdev, SOUND_MIXER_WRITE_PCM, &l); /*SOUND_MIXER_WRITE_VOLUME*/
|
||||
}
|
||||
|
||||
|
||||
void sndout_oss_exit(void)
|
||||
{
|
||||
if (sounddev >= 0) close(sounddev); sounddev = -1;
|
||||
if (mixerdev >= 0) close(mixerdev); mixerdev = -1;
|
||||
}
|
||||
|
6
linux/sndout_oss.h
Normal file
6
linux/sndout_oss.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
int sndout_oss_init(void);
|
||||
int sndout_oss_start(int rate, int bits, int stereo);
|
||||
int sndout_oss_write(const void *buff, int len);
|
||||
void sndout_oss_sync(void);
|
||||
void sndout_oss_setvol(int l, int r);
|
||||
void sndout_oss_exit(void);
|
439
linux/usbjoy.c
Normal file
439
linux/usbjoy.c
Normal file
|
@ -0,0 +1,439 @@
|
|||
/* Title: USB Joystick library
|
||||
Version 0.2
|
||||
Written by Puck2099 (puck2099@gmail.com), (c) 2006.
|
||||
<http://www.gp32wip.com>
|
||||
|
||||
If you use this library or a part of it, please, let it know.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h> /* For the definition of NULL */
|
||||
#include <sys/types.h> // For Device open
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h> // For Device read
|
||||
|
||||
#include <string.h>
|
||||
#include <limits.h> /* For the definition of PATH_MAX */
|
||||
#include <linux/joystick.h>
|
||||
|
||||
#include "usbjoy.h"
|
||||
|
||||
/* This is a try to support analog joys. Untested. */
|
||||
#define DEAD_ZONE (8*1024)
|
||||
|
||||
/*
|
||||
Function: joy_open
|
||||
|
||||
Opens a USB joystick and fills its information.
|
||||
|
||||
Parameters:
|
||||
|
||||
joynumber - Joystick's identifier (0 reserved for GP2X's builtin Joystick).
|
||||
|
||||
Returns:
|
||||
|
||||
Filled usbjoy structure.
|
||||
|
||||
*/
|
||||
struct usbjoy *joy_open(int joynumber)
|
||||
{
|
||||
int fd;
|
||||
char path [128];
|
||||
struct usbjoy * joy = NULL;
|
||||
struct js_event event;
|
||||
#ifdef __GP2X__
|
||||
static char insmod_done = 0;
|
||||
// notaz: on my system I get unresolved input_* symbols, so have to 'insmod input' too
|
||||
// also we should insmod only once, not on every joy_open() call.
|
||||
if (!insmod_done) {
|
||||
system ("insmod input");
|
||||
system ("insmod joydev"); // Loads joydev module
|
||||
insmod_done = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (joynumber == 0) {
|
||||
}
|
||||
else if (joynumber > 0) {
|
||||
sprintf (path, "/dev/input/js%d", joynumber-1);
|
||||
fd = open(path, O_RDONLY, 0);
|
||||
if (fd == -1) {
|
||||
sprintf (path, "/dev/js%d", joynumber-1);
|
||||
fd = open(path, O_RDONLY, 0);
|
||||
}
|
||||
if (fd != -1) {
|
||||
joy = (struct usbjoy *) malloc(sizeof(*joy));
|
||||
if (joy == NULL) { close(fd); return NULL; }
|
||||
memset(joy, 0, sizeof(*joy));
|
||||
|
||||
// Set the joystick to non-blocking read mode
|
||||
fcntl(fd, F_SETFL, O_NONBLOCK);
|
||||
|
||||
// notaz: maybe we should flush init events now.
|
||||
// My pad returns axis as active when I plug it in, which is kind of annoying.
|
||||
while (read(fd, &event, sizeof(event)) > 0);
|
||||
|
||||
// Joystick's file descriptor
|
||||
joy->fd = fd;
|
||||
|
||||
// Joystick's name
|
||||
ioctl(joy->fd, JSIOCGNAME(128*sizeof(char)), joy->name);
|
||||
|
||||
// Joystick's device
|
||||
strcpy(joy->device, path);
|
||||
|
||||
// Joystick's buttons
|
||||
ioctl(joy->fd, JSIOCGBUTTONS, &joy->numbuttons);
|
||||
|
||||
// Joystick's axes
|
||||
ioctl(joy->fd, JSIOCGAXES, &joy->numaxes);
|
||||
|
||||
// Joystick's type (derived from name)
|
||||
if (strncasecmp(joy->name, "logitech", strlen("logitech")) == 0)
|
||||
joy->type = JOY_TYPE_LOGITECH;
|
||||
else joy->type = JOY_TYPE_GENERIC;
|
||||
} else {
|
||||
// printf ("ERROR: No Joystick found\n");
|
||||
}
|
||||
}
|
||||
return joy;
|
||||
}
|
||||
|
||||
/*
|
||||
Function: joy_name
|
||||
|
||||
Returns Joystick's name.
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
Joystick's name or NULL if <usbjoy> struct is empty.
|
||||
*/
|
||||
char * joy_name (struct usbjoy * joy) {
|
||||
if (joy != NULL) return joy->name;
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_device
|
||||
|
||||
Returns Joystick's device.
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
Joystick's device or NULL if <usbjoy> struct is empty.
|
||||
*/
|
||||
char * joy_device (struct usbjoy * joy) {
|
||||
if (joy != NULL) return joy->device;
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_buttons
|
||||
|
||||
Returns Joystick's buttons number.
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
Joystick's buttons or 0 if <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_buttons (struct usbjoy * joy) {
|
||||
if (joy != NULL) return joy->numbuttons;
|
||||
else return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_axes
|
||||
|
||||
Returns Joystick's axes number.
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
Joystick's axes or 0 if <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_axes (struct usbjoy * joy) {
|
||||
if (joy != NULL) return joy->numaxes;
|
||||
else return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_update
|
||||
|
||||
Updates Joystick's internal information (<statebuttons> and <stateaxes> fields).
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
0 - No events registered (no need to update).
|
||||
1 - Events registered (a button or axe has been pushed).
|
||||
-1 - Error: <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_update (struct usbjoy * joy) {
|
||||
struct js_event events[0xff];
|
||||
int i, len;
|
||||
int event = 0;
|
||||
if (joy != NULL) {
|
||||
if ((len=read(joy->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 == 0) {
|
||||
joy->stateaxes[JOYLEFT] = joy->stateaxes[JOYRIGHT] = 0;
|
||||
if (events[i].value < -DEAD_ZONE) joy->stateaxes[JOYLEFT] = 1;
|
||||
else if (events[i].value > DEAD_ZONE) joy->stateaxes[JOYRIGHT] = 1;
|
||||
joy->axevals[0] = events[i].value;
|
||||
}
|
||||
else if (events[i].number == 1) {
|
||||
joy->stateaxes[JOYUP] = joy->stateaxes[JOYDOWN] = 0;
|
||||
if (events[i].value < -DEAD_ZONE) joy->stateaxes[JOYUP] = 1;
|
||||
else if (events[i].value > DEAD_ZONE) joy->stateaxes[JOYDOWN] = 1;
|
||||
joy->axevals[1] = events[i].value;
|
||||
}
|
||||
event = 1;
|
||||
break;
|
||||
case JS_EVENT_BUTTON:
|
||||
joy->statebuttons[events[i].number] = events[i].value;
|
||||
event = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
event = -1;
|
||||
}
|
||||
return event;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_getbutton
|
||||
|
||||
Returns Joystick's button information.
|
||||
|
||||
Parameters:
|
||||
|
||||
button - Button which value you want to know (from 0 to 31).
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
0 - Button NOT pushed.
|
||||
1 - Button pushed.
|
||||
-1 - Error: <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_getbutton (int button, struct usbjoy * joy) {
|
||||
if (joy != NULL) {
|
||||
if (button < joy_buttons(joy)) return joy->statebuttons[button];
|
||||
else return 0;
|
||||
}
|
||||
else return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_getaxe
|
||||
|
||||
Returns Joystick's axes information.
|
||||
|
||||
Parameters:
|
||||
|
||||
axe - Axe which value you want to know (see <Axes values>).
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
0 - Direction NOT pushed.
|
||||
1 - Direction pushed.
|
||||
-1 - Error: <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_getaxe (int axe, struct usbjoy * joy) {
|
||||
if (joy != NULL) {
|
||||
if (axe < 4) return joy->stateaxes[axe];
|
||||
else return 0;
|
||||
}
|
||||
else return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_close
|
||||
|
||||
Closes selected joystick's file descriptor and detroys it's fields.
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
0 - Joystick successfully closed.
|
||||
-1 - Error: <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_close (struct usbjoy * joy) {
|
||||
if (joy != NULL) {
|
||||
close (joy->fd);
|
||||
free (joy);
|
||||
return 0;
|
||||
}
|
||||
else return -1;
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************/
|
||||
|
||||
#include "../common/common.h"
|
||||
|
||||
int num_of_joys = 0;
|
||||
struct usbjoy *joys[4];
|
||||
|
||||
void usbjoy_init (void)
|
||||
{
|
||||
/* Open available joysticks -GnoStiC */
|
||||
int i, n = 0;
|
||||
|
||||
printf("\n");
|
||||
for (i = 0; i < 4; i++) {
|
||||
joys[n] = joy_open(i+1);
|
||||
if (joys[n] && joy_buttons(joys[n]) > 0) {
|
||||
printf ("+-Joystick %d: \"%s\", buttons = %i\n", i+1, joy_name(joys[n]), joy_buttons(joys[n]));
|
||||
n++;
|
||||
}
|
||||
}
|
||||
num_of_joys = n;
|
||||
|
||||
printf("Found %d Joystick(s)\n",num_of_joys);
|
||||
}
|
||||
|
||||
void usbjoy_update (void)
|
||||
{
|
||||
/* Update Joystick Event Cache */
|
||||
int q, foo;
|
||||
for (q=0; q < num_of_joys; q++) {
|
||||
foo = joy_update (joys[q]);
|
||||
}
|
||||
}
|
||||
|
||||
int usbjoy_check (int joyno)
|
||||
{
|
||||
/* Check Joystick */
|
||||
int q, joyExKey = 0;
|
||||
struct usbjoy *joy = joys[joyno];
|
||||
|
||||
if (joy != NULL) {
|
||||
if (joy_getaxe(JOYUP, joy)) { joyExKey |= PBTN_UP; }
|
||||
if (joy_getaxe(JOYDOWN, joy)) { joyExKey |= PBTN_DOWN; }
|
||||
if (joy_getaxe(JOYLEFT, joy)) { joyExKey |= PBTN_LEFT; }
|
||||
if (joy_getaxe(JOYRIGHT, joy)) { joyExKey |= PBTN_RIGHT; }
|
||||
|
||||
/* loop through joy buttons to check if they are pushed */
|
||||
for (q=0; q<joy_buttons (joy); q++) {
|
||||
if (joy_getbutton (q, joy)) {
|
||||
if (joy->type == JOY_TYPE_LOGITECH) {
|
||||
switch (q) {
|
||||
case 0: joyExKey |= PBTN_WEST; break;
|
||||
case 1: joyExKey |= PBTN_SOUTH; break;
|
||||
case 2: joyExKey |= PBTN_EAST; break;
|
||||
case 3: joyExKey |= PBTN_NORTH; break;
|
||||
}
|
||||
} else {
|
||||
switch (q) {
|
||||
case 0: joyExKey |= PBTN_NORTH; break;
|
||||
case 1: joyExKey |= PBTN_EAST; break;
|
||||
case 2: joyExKey |= PBTN_SOUTH; break;
|
||||
case 3: joyExKey |= PBTN_WEST; break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (q) {
|
||||
case 4: joyExKey |= PBTN_L; break;
|
||||
case 5: joyExKey |= PBTN_R; break;
|
||||
case 6: joyExKey |= PBTN_L; break; /* left shoulder button 2 */
|
||||
case 7: joyExKey |= PBTN_R; break; /* right shoulder button 2 */
|
||||
/*
|
||||
case 8: joyExKey |= GP2X_SELECT;break;
|
||||
case 9: joyExKey |= GP2X_START; break;
|
||||
case 10: joyExKey |= GP2X_PUSH; break;
|
||||
case 11: joyExKey |= GP2X_PUSH; break;
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return joyExKey;
|
||||
}
|
||||
|
||||
int usbjoy_check2 (int joyno)
|
||||
{
|
||||
/* Check Joystick, don't map to gp2x joy */
|
||||
int q, to, joyExKey = 0;
|
||||
struct usbjoy *joy = joys[joyno];
|
||||
|
||||
if (joy != NULL) {
|
||||
if (joy_getaxe(JOYUP, joy)) { joyExKey |= 1 << 0; }
|
||||
if (joy_getaxe(JOYDOWN, joy)) { joyExKey |= 1 << 1; }
|
||||
if (joy_getaxe(JOYLEFT, joy)) { joyExKey |= 1 << 2; }
|
||||
if (joy_getaxe(JOYRIGHT, joy)) { joyExKey |= 1 << 3; }
|
||||
|
||||
/* loop through joy buttons to check if they are pushed */
|
||||
to = joy->numbuttons;
|
||||
if (to > 32-4) to = 32-4;
|
||||
for (q=0; q < to; q++)
|
||||
if (joy->statebuttons[q]) joyExKey |= 1 << (q+4);
|
||||
}
|
||||
return joyExKey;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void usbjoy_deinit (void)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<num_of_joys; i++) {
|
||||
joy_close (joys[i]);
|
||||
joys[i] = NULL;
|
||||
}
|
||||
num_of_joys = 0;
|
||||
}
|
||||
|
242
linux/usbjoy.h
Normal file
242
linux/usbjoy.h
Normal file
|
@ -0,0 +1,242 @@
|
|||
/* Title: USB Joystick library
|
||||
Version 0.2
|
||||
Written by Puck2099 (puck2099@gmail.com), (c) 2006.
|
||||
<http://www.gp32wip.com>
|
||||
|
||||
If you use this library or a part of it, please, let it know.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef USBJOY_H
|
||||
#define USBJOY_H
|
||||
|
||||
/* notaz: my Logitech has different button layout, and I want it to match gp2x's */
|
||||
typedef enum {
|
||||
JOY_TYPE_GENERIC,
|
||||
JOY_TYPE_LOGITECH
|
||||
} joy_type;
|
||||
|
||||
/*
|
||||
Enumeration: Axes values
|
||||
This enumeration contains shortcuts to the values used on axes.
|
||||
|
||||
Constants:
|
||||
JOYUP - Joystick Up
|
||||
JOYDOWN - Joystick Down
|
||||
JOYLEFT - Joystick Left
|
||||
JOYRIGHT - Joystick Right
|
||||
|
||||
See also:
|
||||
<joy_getaxe>
|
||||
*/
|
||||
#define JOYUP (0)
|
||||
#define JOYDOWN (1)
|
||||
#define JOYLEFT (2)
|
||||
#define JOYRIGHT (3)
|
||||
|
||||
|
||||
/*
|
||||
Struct: usbjoy
|
||||
|
||||
Contains all Joystick needed information.
|
||||
|
||||
Fields:
|
||||
fd - File descriptor used.
|
||||
name - Joystick's name.
|
||||
device - /dev/input/jsX device.
|
||||
numbuttons - Joystick's buttons.
|
||||
numaxes - Joystick's axes.
|
||||
numhats - Joystick's hats.
|
||||
statebuttons - Current state of each button.
|
||||
stateaxes - Current state of each direction.
|
||||
*/
|
||||
struct usbjoy {
|
||||
int fd;
|
||||
char name [128];
|
||||
char device [128];
|
||||
int numbuttons;
|
||||
int numaxes;
|
||||
int numhats;
|
||||
int statebuttons[32];
|
||||
int stateaxes[4];
|
||||
int axevals[2];
|
||||
joy_type type;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_open
|
||||
|
||||
Opens a USB joystick and fills its information.
|
||||
|
||||
Parameters:
|
||||
|
||||
joynumber - Joystick's identifier (0 reserved for GP2X's builtin Joystick).
|
||||
|
||||
Returns:
|
||||
|
||||
Filled usbjoy structure.
|
||||
*/
|
||||
struct usbjoy * joy_open (int joynumber);
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_name
|
||||
|
||||
Returns Joystick's name.
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
Joystick's name or NULL if <usbjoy> struct is empty.
|
||||
*/
|
||||
char * joy_name (struct usbjoy * joy);
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_device
|
||||
|
||||
Returns Joystick's device.
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
Joystick's device or NULL if <usbjoy> struct is empty.
|
||||
*/
|
||||
char * joy_device (struct usbjoy * joy);
|
||||
|
||||
/*
|
||||
Function: joy_buttons
|
||||
|
||||
Returns Joystick's buttons number.
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
Joystick's buttons or 0 if <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_buttons (struct usbjoy * joy);
|
||||
|
||||
/*
|
||||
Function: joy_axes
|
||||
|
||||
Returns Joystick's axes number.
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
Joystick's axes or 0 if <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_axes (struct usbjoy * joy);
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_update
|
||||
|
||||
Updates Joystick's internal information (<statebuttons> and <stateaxes> fields).
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
0 - No events registered (no need to update).
|
||||
1 - Events registered (a button or axe has been pushed).
|
||||
-1 - Error: <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_update (struct usbjoy * joy);
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_getbutton
|
||||
|
||||
Returns Joystick's button information.
|
||||
|
||||
Parameters:
|
||||
|
||||
button - Button which value you want to know (from 0 to 31).
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
0 - Button NOT pushed.
|
||||
1 - Button pushed.
|
||||
-1 - Error: <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_getbutton (int button, struct usbjoy * joy);
|
||||
|
||||
|
||||
/*
|
||||
Function: joy_getaxe
|
||||
|
||||
Returns Joystick's axes information.
|
||||
|
||||
Parameters:
|
||||
|
||||
axe - Axe which value you want to know (see <Axes values>).
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
0 - Direction NOT pushed.
|
||||
1 - Direction pushed.
|
||||
-1 - Error: <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_getaxe (int axe, struct usbjoy * joy);
|
||||
|
||||
/*
|
||||
Function: joy_close
|
||||
|
||||
Closes selected joystick's file descriptor and detroys it's fields.
|
||||
|
||||
Parameters:
|
||||
|
||||
joy - Selected joystick.
|
||||
|
||||
Returns:
|
||||
|
||||
0 - Joystick successfully closed.
|
||||
-1 - Error: <usbjoy> struct is empty.
|
||||
*/
|
||||
int joy_close (struct usbjoy * joy);
|
||||
|
||||
|
||||
|
||||
/* more stuff */
|
||||
extern int num_of_joys;
|
||||
extern struct usbjoy *joys[4];
|
||||
|
||||
void usbjoy_update(void);
|
||||
void usbjoy_init(void);
|
||||
int usbjoy_check(int joyno);
|
||||
int usbjoy_check2(int joyno);
|
||||
void usbjoy_deinit(void);
|
||||
|
||||
|
||||
#endif // USBJOY_H
|
Loading…
Add table
Add a link
Reference in a new issue