2019-09-07 12:37:39 +00:00
|
|
|
#include "joystick.h"
|
2015-08-15 03:07:37 +00:00
|
|
|
|
|
|
|
#if defined(USE_JOYSTICK)
|
2020-03-28 16:58:01 +00:00
|
|
|
#include <fcntl.h>
|
2018-03-06 22:54:46 +00:00
|
|
|
#include <linux/joystick.h>
|
2020-03-28 16:58:01 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <unistd.h>
|
2018-03-06 22:54:46 +00:00
|
|
|
|
2015-08-17 21:46:28 +00:00
|
|
|
const u32 joystick_map_btn_usb[JOYSTICK_MAP_SIZE] = { DC_BTN_Y, DC_BTN_B, DC_BTN_A, DC_BTN_X, 0, 0, 0, 0, 0, DC_BTN_START };
|
|
|
|
const u32 joystick_map_axis_usb[JOYSTICK_MAP_SIZE] = { DC_AXIS_X, DC_AXIS_Y, 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
|
|
|
|
|
|
const u32 joystick_map_btn_xbox360[JOYSTICK_MAP_SIZE] = { DC_BTN_A, DC_BTN_B, DC_BTN_X, DC_BTN_Y, 0, 0, 0, DC_BTN_START, 0, 0 };
|
|
|
|
const u32 joystick_map_axis_xbox360[JOYSTICK_MAP_SIZE] = { DC_AXIS_X, DC_AXIS_Y, DC_AXIS_LT, 0, 0, DC_AXIS_RT, DC_DPAD_LEFT, DC_DPAD_UP, 0, 0 };
|
|
|
|
|
|
|
|
const u32* joystick_map_btn = joystick_map_btn_usb;
|
|
|
|
const u32* joystick_map_axis = joystick_map_axis_usb;
|
|
|
|
|
|
|
|
int input_joystick_init(const char* device)
|
|
|
|
{
|
|
|
|
int axis_count = 0;
|
|
|
|
int button_count = 0;
|
|
|
|
char name[128] = "Unknown";
|
|
|
|
|
|
|
|
printf("joystick: Trying to open device at '%s'\n", device);
|
|
|
|
|
|
|
|
int fd = open(device, O_RDONLY);
|
|
|
|
|
|
|
|
if(fd >= 0)
|
|
|
|
{
|
|
|
|
fcntl(fd, F_SETFL, O_NONBLOCK);
|
|
|
|
ioctl(fd, JSIOCGAXES, &axis_count);
|
|
|
|
ioctl(fd, JSIOCGBUTTONS, &button_count);
|
|
|
|
ioctl(fd, JSIOCGNAME(sizeof(name)), &name);
|
|
|
|
|
|
|
|
printf("joystick: Found '%s' with %d axis and %d buttons at '%s'.\n", name, axis_count, button_count, device);
|
|
|
|
|
|
|
|
if (strcmp(name, "Microsoft X-Box 360 pad") == 0 ||
|
|
|
|
strcmp(name, "Xbox Gamepad (userspace driver)") == 0 ||
|
|
|
|
strcmp(name, "Xbox 360 Wireless Receiver (XBOX)") == 0)
|
|
|
|
{
|
|
|
|
joystick_map_btn = joystick_map_btn_xbox360;
|
|
|
|
joystick_map_axis = joystick_map_axis_xbox360;
|
|
|
|
printf("joystick: Using Xbox 360 map\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
perror("joystick open");
|
|
|
|
}
|
|
|
|
|
|
|
|
return fd;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool input_joystick_handle(int fd, u32 port)
|
|
|
|
{
|
|
|
|
// Joystick must be connected
|
|
|
|
if(fd < 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct js_event JE;
|
|
|
|
while(read(fd, &JE, sizeof(JE)) == sizeof(JE))
|
|
|
|
if (JE.number < JOYSTICK_MAP_SIZE)
|
|
|
|
{
|
|
|
|
switch(JE.type & ~JS_EVENT_INIT)
|
|
|
|
{
|
|
|
|
case JS_EVENT_AXIS:
|
|
|
|
{
|
|
|
|
u32 mt = joystick_map_axis[JE.number] >> 16;
|
|
|
|
u32 mo = joystick_map_axis[JE.number] & 0xFFFF;
|
|
|
|
|
|
|
|
//printf("AXIS %d,%d\n",JE.number,JE.value);
|
|
|
|
s8 v=(s8)(JE.value/256); //-127 ... + 127 range
|
|
|
|
|
|
|
|
if (mt == 0)
|
|
|
|
{
|
|
|
|
kcode[port] |= mo;
|
|
|
|
kcode[port] |= mo*2;
|
|
|
|
if (v<-64)
|
|
|
|
{
|
|
|
|
kcode[port] &= ~mo;
|
|
|
|
}
|
|
|
|
else if (v>64)
|
|
|
|
{
|
|
|
|
kcode[port] &= ~(mo*2);
|
|
|
|
}
|
|
|
|
|
|
|
|
//printf("Mapped to %d %d %d\n",mo,kcode[port]&mo,kcode[port]&(mo*2));
|
|
|
|
}
|
|
|
|
else if (mt == 1)
|
|
|
|
{
|
|
|
|
if (v >= 0)
|
|
|
|
{
|
|
|
|
v++; //up to 255
|
|
|
|
}
|
|
|
|
//printf("AXIS %d,%d Mapped to %d %d %d\n",JE.number,JE.value,mo,v,v+127);
|
|
|
|
if (mo == 0)
|
|
|
|
{
|
|
|
|
lt[port] = (v + 127);
|
|
|
|
}
|
|
|
|
else if (mo == 1)
|
|
|
|
{
|
|
|
|
rt[port] = (v + 127);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (mt == 2)
|
|
|
|
{
|
|
|
|
// printf("AXIS %d,%d Mapped to %d %d [%d]",JE.number,JE.value,mo,v);
|
|
|
|
if (mo == 0)
|
|
|
|
{
|
|
|
|
joyx[port] = v;
|
|
|
|
}
|
|
|
|
else if (mo == 1)
|
|
|
|
{
|
|
|
|
joyy[port] = v;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case JS_EVENT_BUTTON:
|
|
|
|
{
|
|
|
|
u32 mt = joystick_map_btn[JE.number] >> 16;
|
|
|
|
u32 mo = joystick_map_btn[JE.number] & 0xFFFF;
|
|
|
|
|
|
|
|
// printf("BUTTON %d,%d\n",JE.number,JE.value);
|
|
|
|
|
|
|
|
if (mt == 0)
|
|
|
|
{
|
|
|
|
// printf("Mapped to %d\n",mo);
|
|
|
|
if (JE.value)
|
|
|
|
{
|
|
|
|
kcode[port] &= ~mo;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
kcode[port] |= mo;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (mt == 1)
|
|
|
|
{
|
|
|
|
// printf("Mapped to %d %d\n",mo,JE.value?255:0);
|
|
|
|
if (mo==0)
|
|
|
|
{
|
|
|
|
lt[port] = JE.value ? 255 : 0;
|
|
|
|
}
|
|
|
|
else if (mo==1)
|
|
|
|
{
|
|
|
|
rt[port] = JE.value ? 255 : 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
#endif
|