/* joystick thingie, written for my xpad running in linux-xbox
* looked at freevo plugin: joystick_adv
* this is LGPL, Copyright 2004 Tobias Bengtsson
*/
#include
#include
#include
#include
#include
#include
#include
#include
#define JS_EVENT_BUTTON 0x01
#define JS_EVENT_AXIS 0x02
#define JS_EVENT_INIT 0x80
#define MAX_AXIS 32
#define MAX_BUTTONS 32
#define BUTTON_EVENT_PRESS 1
#define BUTTON_EVENT_RELEASE 2
int main() {
int joyfd;
int *buttons;
int *axes;
int *binaxes;
int *oldbinaxes;
struct pollfd *pollfds;
int poll_interval = 1;
char *device_name = "/dev/input/js0";
int i;
typedef struct _js_event {
unsigned int time; /* event timestamp in milliseconds */
short value; /* value */
unsigned char type; /* event type */
unsigned char number; /* axis/button number */
} js_event;
joyfd = open(device_name, O_RDONLY | O_NONBLOCK);
if(joyfd == -1) {
fprintf(stderr,"Unable to open %s: %s",device_name,strerror(errno));
return 1;
}
buttons = calloc(MAX_BUTTONS,sizeof(int));
axes = calloc(MAX_AXIS,sizeof(int));
binaxes = calloc(MAX_AXIS,sizeof(int));
oldbinaxes = calloc(MAX_AXIS,sizeof(int));
pollfds = calloc(1,sizeof(struct pollfd));
pollfds->fd = joyfd;
pollfds->events = POLLIN;
while(poll(pollfds,1,-1) > 0) {
int buttonevent[2];
js_event e;
int nread = read(joyfd,&e,sizeof(js_event));
if(nread == -1 &&
errno != EAGAIN)
break;
else if(nread != sizeof(js_event))
continue;
buttonevent[0] = buttonevent[1] = 0;
e.type &= ~JS_EVENT_INIT;
if(e.type==JS_EVENT_AXIS) {
if(e.number16383) {
binaxes[e.number]=1;
} else if(e.value<-16383) {
binaxes[e.number]=-1;
} else if(e.value>-8191 && e.value<8191) {
binaxes[e.number]=0;
}
}
} else if(e.type==JS_EVENT_BUTTON) {
if(e.number16383:
# axis = 'axis '+str(i+1)+'+'
if self.binaxes[i]==-1 and self.oldbinaxes[i]!=-1:
axis = 'axis '+str(i+1)+'-'
if self.binaxes[i]==1 and self.oldbinaxes[i]!=1:
axis = 'axis '+str(i+1)+'+'
self.oldbinaxes[i]=self.binaxes[i]
if axis!='':
command = config.JOY_CMDS.get(axis,'')
#TODO: be compatible: up,down,left,right
# print "%s -> %s" % (axis,command)
*/