From be75d3d623dc51638c32458b94fba38b99e7c535 Mon Sep 17 00:00:00 2001 From: Sorgelig Date: Sun, 10 Oct 2021 19:09:15 +0800 Subject: [PATCH] input: support for second analog stick. --- input.cpp | 82 ++++++++++++++++++++++++++++++++++++++--------------- user_io.cpp | 21 ++++++++++++-- user_io.h | 4 ++- 3 files changed, 81 insertions(+), 26 deletions(-) diff --git a/input.cpp b/input.cpp index 823e740..6f63564 100644 --- a/input.cpp +++ b/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; diff --git a/user_io.cpp b/user_io.cpp index a7fc5d8..fd68f13 100644 --- a/user_io.cpp +++ b/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); } } diff --git a/user_io.h b/user_io.h index 01fd271..a61294f 100644 --- a/user_io.h +++ b/user_io.h @@ -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();