/* 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) */