input: support for second analog stick.
This commit is contained in:
82
input.cpp
82
input.cpp
@@ -879,6 +879,8 @@ typedef struct
|
||||
uint8_t has_mmap;
|
||||
uint32_t mmap[NUMBUTTONS];
|
||||
uint16_t jkmap[1024];
|
||||
int stick_l[2];
|
||||
int stick_r[2];
|
||||
|
||||
uint8_t has_kbdmap;
|
||||
uint8_t kbdmap[256];
|
||||
@@ -1719,15 +1721,16 @@ static void joy_digital(int jnum, uint32_t mask, uint32_t code, char press, int
|
||||
}
|
||||
}
|
||||
|
||||
static void joy_analog(int num, int axis, int offset)
|
||||
static void joy_analog(int num, int axis, int offset, int stick = 0)
|
||||
{
|
||||
static int pos[NUMPLAYERS][2] = {};
|
||||
static int pos[2][NUMPLAYERS][2] = {};
|
||||
|
||||
if (grabbed && num > 0 && num < NUMPLAYERS+1)
|
||||
{
|
||||
num--;
|
||||
pos[num][axis] = offset;
|
||||
user_io_analog_joystick(num, (char)(pos[num][0]), (char)(pos[num][1]));
|
||||
pos[stick][num][axis] = offset;
|
||||
if(stick) user_io_r_analog_joystick(num, (char)(pos[1][num][0]), (char)(pos[1][num][1]));
|
||||
else user_io_l_analog_joystick(num, (char)(pos[0][num][0]), (char)(pos[0][num][1]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2001,6 +2004,27 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
|
||||
//input[dev].has_mmap++;
|
||||
}
|
||||
if (!input[dev].mmap[SYS_BTN_OSD_KTGL + 2]) input[dev].mmap[SYS_BTN_OSD_KTGL + 2] = input[dev].mmap[SYS_BTN_OSD_KTGL + 1];
|
||||
|
||||
if (input[dev].mmap[SYS_AXIS_X] == input[dev].mmap[SYS_AXIS1_X])
|
||||
{
|
||||
input[dev].stick_l[0] = SYS_AXIS1_X;
|
||||
if((input[dev].mmap[SYS_AXIS2_X] >> 16) == 2) input[dev].stick_r[0] = SYS_AXIS2_X;
|
||||
}
|
||||
if (input[dev].mmap[SYS_AXIS_Y] == input[dev].mmap[SYS_AXIS1_Y])
|
||||
{
|
||||
input[dev].stick_l[1] = SYS_AXIS1_Y;
|
||||
if ((input[dev].mmap[SYS_AXIS2_Y] >> 16) == 2) input[dev].stick_r[1] = SYS_AXIS2_Y;
|
||||
}
|
||||
if (input[dev].mmap[SYS_AXIS_X] == input[dev].mmap[SYS_AXIS2_X])
|
||||
{
|
||||
input[dev].stick_l[0] = SYS_AXIS2_X;
|
||||
if ((input[dev].mmap[SYS_AXIS1_X] >> 16) == 2) input[dev].stick_r[0] = SYS_AXIS1_X;
|
||||
}
|
||||
if (input[dev].mmap[SYS_AXIS_Y] == input[dev].mmap[SYS_AXIS2_Y])
|
||||
{
|
||||
input[dev].stick_l[1] = SYS_AXIS2_Y;
|
||||
if ((input[dev].mmap[SYS_AXIS1_Y] >> 16) == 2) input[dev].stick_r[1] = SYS_AXIS1_Y;
|
||||
}
|
||||
}
|
||||
input[dev].has_mmap++;
|
||||
}
|
||||
@@ -2758,7 +2782,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
|
||||
{
|
||||
value -= absinfo->minimum;
|
||||
value = (value * 255) / (absinfo->maximum - absinfo->minimum);
|
||||
user_io_analog_joystick(((input[dev].num - 1) << 4) | 0xF, value, 0);
|
||||
user_io_l_analog_joystick(((input[dev].num - 1) << 4) | 0xF, value, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2806,27 +2830,39 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
|
||||
mouse_emu_y /= 12;
|
||||
return;
|
||||
}
|
||||
else if (((input[dev].mmap[SYS_AXIS_X] >> 16) == 2 && ev->code == (input[dev].mmap[SYS_AXIS_X] & 0xFFFF)) || (ev->code == 0 && input[dev].lightgun))
|
||||
else
|
||||
{
|
||||
// skip if joystick is undefined.
|
||||
if (!input[dev].num) break;
|
||||
|
||||
int offset = 0;
|
||||
if (value < -1 || value>1 || input[dev].lightgun) offset = value;
|
||||
//printf("analog_x = %d\n", offset);
|
||||
joy_analog(input[dev].num, 0, offset);
|
||||
return;
|
||||
}
|
||||
else if (((input[dev].mmap[SYS_AXIS_Y] >> 16) == 2 && ev->code == (input[dev].mmap[SYS_AXIS_Y] & 0xFFFF)) || (ev->code == 1 && input[dev].lightgun))
|
||||
{
|
||||
// skip if joystick is undefined.
|
||||
if (!input[dev].num) break;
|
||||
|
||||
int offset = 0;
|
||||
if (value < -1 || value>1 || input[dev].lightgun) offset = value;
|
||||
//printf("analog_y = %d\n", offset);
|
||||
joy_analog(input[dev].num, 1, offset);
|
||||
return;
|
||||
if (ev->code == 0 && input[dev].lightgun)
|
||||
{
|
||||
joy_analog(input[dev].num, 0, value);
|
||||
}
|
||||
else if (ev->code == 1 && input[dev].lightgun)
|
||||
{
|
||||
joy_analog(input[dev].num, 1, value);
|
||||
}
|
||||
else
|
||||
{
|
||||
int offset = (value < -1 || value>1) ? value : 0;
|
||||
if (input[dev].stick_l[0] && ev->code == (uint16_t)input[dev].mmap[input[dev].stick_l[0]])
|
||||
{
|
||||
joy_analog(input[dev].num, 0, offset, 0);
|
||||
}
|
||||
else if (input[dev].stick_l[1] && ev->code == (uint16_t)input[dev].mmap[input[dev].stick_l[1]])
|
||||
{
|
||||
joy_analog(input[dev].num, 1, offset, 0);
|
||||
}
|
||||
else if (input[dev].stick_r[0] && ev->code == (uint16_t)input[dev].mmap[input[dev].stick_r[0]])
|
||||
{
|
||||
joy_analog(input[dev].num, 0, offset, 1);
|
||||
}
|
||||
else if (input[dev].stick_r[1] && ev->code == (uint16_t)input[dev].mmap[input[dev].stick_r[1]])
|
||||
{
|
||||
joy_analog(input[dev].num, 1, offset, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2841,7 +2877,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
|
||||
if (ev->value < -128) value = -128;
|
||||
else if (ev->value > 127) value = 127;
|
||||
|
||||
user_io_analog_joystick(((input[dev].num - 1) << 4) | 0x8F, value, 0);
|
||||
user_io_l_analog_joystick(((input[dev].num - 1) << 4) | 0x8F, value, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
21
user_io.cpp
21
user_io.cpp
@@ -1291,7 +1291,7 @@ int user_io_get_joyswap()
|
||||
return joyswap;
|
||||
}
|
||||
|
||||
void user_io_analog_joystick(unsigned char joystick, char valueX, char valueY)
|
||||
void user_io_l_analog_joystick(unsigned char joystick, char valueX, char valueY)
|
||||
{
|
||||
uint8_t joy = (joystick > 1 || !joyswap) ? joystick : (joystick >= 15) ? (joystick ^ 16) : (joystick ^ 1);
|
||||
|
||||
@@ -1308,6 +1308,23 @@ void user_io_analog_joystick(unsigned char joystick, char valueX, char valueY)
|
||||
}
|
||||
}
|
||||
|
||||
void user_io_r_analog_joystick(unsigned char joystick, char valueX, char valueY)
|
||||
{
|
||||
uint8_t joy = (joystick > 1 || !joyswap) ? joystick : (joystick ^ 1);
|
||||
|
||||
if (core_type == CORE_TYPE_8BIT)
|
||||
{
|
||||
spi_uio_cmd8_cont(UIO_ASTICK_2, joy);
|
||||
if (io_ver) spi_w((valueY << 8) | (uint8_t)(valueX));
|
||||
else
|
||||
{
|
||||
spi8(valueX);
|
||||
spi8(valueY);
|
||||
}
|
||||
DisableIO();
|
||||
}
|
||||
}
|
||||
|
||||
void user_io_digital_joystick(unsigned char joystick, uint32_t map, int newdir)
|
||||
{
|
||||
uint8_t joy = (joystick>1 || !joyswap) ? joystick : joystick ^ 1;
|
||||
@@ -1322,7 +1339,7 @@ void user_io_digital_joystick(unsigned char joystick, uint32_t map, int newdir)
|
||||
|
||||
if (!is_minimig() && joy_transl == 1 && newdir)
|
||||
{
|
||||
user_io_analog_joystick(joystick, (map & 2) ? 128 : (map & 1) ? 127 : 0, (map & 8) ? 128 : (map & 4) ? 127 : 0);
|
||||
user_io_l_analog_joystick(joystick, (map & 2) ? 128 : (map & 1) ? 127 : 0, (map & 8) ? 128 : (map & 4) ? 127 : 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
#define UIO_SET_AR_CUST 0x3A
|
||||
#define UIO_SET_UART 0x3B
|
||||
#define UIO_CHK_UPLOAD 0x3C
|
||||
#define UIO_ASTICK_2 0x3D
|
||||
|
||||
// codes as used by 8bit for file loading from OSD
|
||||
#define FIO_FILE_TX 0x53
|
||||
@@ -212,7 +213,8 @@ void user_io_kbd(uint16_t key, int press);
|
||||
char* user_io_create_config_name();
|
||||
int user_io_get_joy_transl();
|
||||
void user_io_digital_joystick(unsigned char, uint32_t, int);
|
||||
void user_io_analog_joystick(unsigned char, char, char);
|
||||
void user_io_l_analog_joystick(unsigned char, char, char);
|
||||
void user_io_r_analog_joystick(unsigned char, char, char);
|
||||
void user_io_set_joyswap(int swap);
|
||||
int user_io_get_joyswap();
|
||||
char user_io_osd_is_visible();
|
||||
|
||||
Reference in New Issue
Block a user