diff --git a/input.cpp b/input.cpp index e302307..d8f0cce 100644 --- a/input.cpp +++ b/input.cpp @@ -1142,6 +1142,7 @@ static int mapping_button; static int mapping_dev; static int mapping_type; static int mapping_count; +static int mapping_clear; static uint32_t tmp_axis[4]; static int tmp_axis_n = 0; @@ -1153,6 +1154,7 @@ void start_map_setting(int cnt) mapping_dev = -1; mapping_type = (cnt<0) ? 3 : cnt ? 1 : 2; mapping_count = cnt; + mapping_clear = 0; tmp_axis_n = 0; if (mapping_type <= 1 && is_menu_core()) mapping_button = -6; @@ -1169,6 +1171,11 @@ int get_map_type() return mapping_type; } +int get_map_clear() +{ + return mapping_clear; +} + static char *get_map_name(int dev, int def) { static char name[128]; @@ -1536,9 +1543,16 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int memset(input[dev].map, 0, sizeof(input[dev].map)); input[dev].has_map++; } - - //remove system controls from default map - for (uint i = 8; i < sizeof(input[0].map) / sizeof(input[0].map[0]); i++) input[dev].map[i] = 0; + else + { + //copy alternative directional buttons, remove system buttons + for (uint i = 0; i < sizeof(input[0].map) / sizeof(input[0].map[0]); i++) + { + if(i < 4) input[dev].map[i] = (input[dev].map[i] << 16) | (input[dev].map[i + 8] & 0xFFFF); + else if(i < 8) input[dev].map[i] = input[dev].map[i] << 16; + else input[dev].map[i] = 0; + } + } input[dev].has_map++; } input[dev].has_map++; @@ -1601,30 +1615,69 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int } return; } - else if ((mapping_dev < 0) || ((ev->code >= 256) ? mapping_type : !mapping_type)) + else { - if (mapping_dev < 0) + int clear = ev->code == KEY_F12 || ev->code == KEY_MENU || ev->code == KEY_HOMEPAGE; + if (mapping_dev < 0 && !clear) { mapping_dev = dev; mapping_type = (ev->code >= 256) ? 1 : 0; } - if (mapping_dev == dev && mapping_button < (is_menu_core() ? 17 : mapping_count)) + mapping_clear = 0; + if (mapping_dev >= 0 && (mapping_dev == dev || clear) && mapping_button < (is_menu_core() ? 17 : mapping_count)) { if (ev->value == 1) { - if (!mapping_button) memset(input[dev].map, 0, sizeof(input[dev].map)); - - int found = 0; - for (int i = (is_menu_core() && mapping_button >= 8) ? 8 : 0; i < mapping_button; i++) if (input[dev].map[i] == ev->code) found = 1; - - if (!found) + if (is_menu_core()) { - input[dev].map[(mapping_button == 16 && is_menu_core()) ? 16 + mapping_type : mapping_button] = ev->code; - key_mapped = ev->code; + if (mapping_dev == dev) + { + if (!mapping_button) memset(input[dev].map, 0, sizeof(input[dev].map)); + + int found = 0; + for (int i = (mapping_button >= 8) ? 8 : 0; i < mapping_button; i++) if (input[dev].map[i] == ev->code) found = 1; + + if (!found) + { + input[dev].map[(mapping_button == 16) ? 16 + mapping_type : mapping_button] = ev->code; + key_mapped = ev->code; + } + } + } + else + { + if ((mapping_type && (input[dev].mmap[17] == ev->code)) || clear) + { + memset(input[mapping_dev].map, 0, sizeof(input[mapping_dev].map)); + mapping_button = 0; + mapping_clear = 1; + } + else + { + if (!mapping_button) + { + for (uint i = 0; i < sizeof(input[0].map) / sizeof(input[0].map[0]); i++) + { + input[dev].map[i] = mapping_type ? input[dev].map[i] << 16 : 0; + } + } + + int found = 0; + for (int i = 0; i < mapping_button; i++) + { + if ((input[dev].map[i] & 0xFFFF) == ev->code) found = 1; + } + + if (!found) + { + input[dev].map[mapping_button] = input[dev].map[mapping_button] | (ev->code & 0xFFFF); + key_mapped = ev->code; + } + } } } - else if(ev->value == 0 && key_mapped == ev->code) + else if(mapping_dev == dev && ev->value == 0 && key_mapped == ev->code) { mapping_button++; key_mapped = 0; @@ -1745,7 +1798,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int { if (ev->value == 1) { - if (idx && mapping_dev >= 0) input[mapping_dev].map[idx] = 0; + if (idx && mapping_dev >= 0) input[mapping_dev].map[idx] = is_menu_core() ? 0 : (input[mapping_dev].map[idx] & 0xFFFF0000); mapping_button++; if (mapping_button < 0 && (mapping_button&1)) mapping_button++; } @@ -1848,48 +1901,22 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int return; } } - - for (uint i = 0; i < BTN_NUM; i++) - { - if (ev->code == input[dev].map[i]) - { - if (ev->value <= 1) joy_digital(input[dev].num, 1 << i, 0, ev->value, i); - return; - } - } } - else + + if (input[dev].has_map >= 2) { - if (input[dev].has_map == 2) - { - Info("This joystick is not defined\n Using default map"); - input[dev].has_map = 1; - } + Info((input[dev].has_map == 3) ? "This joystick is not defined" : "This joystick is not defined\n Using default map"); + input[dev].has_map = 1; + } - if (input[dev].has_map == 3) + for (uint i = 0; i < BTN_NUM; i++) + { + if (ev->code == (input[dev].map[i] & 0xFFFF) || ev->code == (input[dev].map[i] >> 16)) { - Info("This joystick is not defined"); - input[dev].has_map = 1; - } + if (i <= 3 && origcode == ev->code) origcode = 0; // prevent autofire for original dpad + if (ev->value <= 1) joy_digital(input[dev].num, 1 << i, origcode, ev->value, i); - for (uint i = 0; i < BTN_NUM; i++) - { - if (ev->code == input[dev].map[i]) - { - if (i <= 3 && origcode == ev->code) origcode = 0; // prevent autofire for original dpad - if (ev->value <= 1) joy_digital(input[dev].num, 1 << i, origcode, ev->value, i); - return; - } - } - - for (int i = 8; i <= 11; i++) - { - if (ev->code == input[dev].mmap[i]) - { - if (origcode == ev->code) origcode = 0; // prevent autofire for original dpad - if (ev->value <= 1) joy_digital(input[dev].num, 1 << (i - 8), origcode, ev->value, i - 8); - return; - } + // support 2 simultaneous functions for 1 button if defined in 2 sets. No return. } } diff --git a/input.h b/input.h index 6b497b5..ea25f30 100644 --- a/input.h +++ b/input.h @@ -40,6 +40,7 @@ int is_key_pressed(int key); void start_map_setting(int cnt); int get_map_button(); int get_map_type(); +int get_map_clear(); void finish_map_setting(int dismiss); uint16_t get_map_vid(); uint16_t get_map_pid(); diff --git a/menu.cpp b/menu.cpp index c0346ad..e9cf31b 100644 --- a/menu.cpp +++ b/menu.cpp @@ -170,7 +170,7 @@ const char *config_autofire_msg[] = { " AUTOFIRE OFF", " AUTOFIRE const char *config_cd32pad_msg[] = { "OFF", "ON" }; const char *config_button_turbo_msg[] = { "OFF", "FAST", "MEDIUM", "SLOW" }; const char *config_button_turbo_choice_msg[] = { "A only", "B only", "A & B" }; -const char *joy_button_map[] = { "RIGHT", "LEFT", "DOWN", "UP", "BUTTON 1", "BUTTON 2", "BUTTON 3", "BUTTON 4", "KBD TOGGLE", "BUTTON OSD", " Stick X: Tilt RIGHT", " Stick Y: Tilt DOWN", " Mouse emu X: Tilt RIGHT", " Mouse emu Y: Tilt DOWN" }; +const char *joy_button_map[] = { "RIGHT", "LEFT", "DOWN", "UP", "BUTTON 1", "BUTTON 2", "BUTTON 3", "BUTTON 4", "KBD TOGGLE", "MENU", " Stick X: Tilt RIGHT", " Stick Y: Tilt DOWN", " Mouse emu X: Tilt RIGHT", " Mouse emu Y: Tilt DOWN" }; const char *joy_ana_map[] = { " DPAD test: Press RIGHT", " DPAD test: Press DOWN", " Stick 1: Tilt RIGHT", " Stick 1: Tilt DOWN", " Stick 2: Tilt RIGHT", " Stick 2: Tilt DOWN" }; const char *config_stereo_msg[] = { "0%", "25%", "50%", "100%" }; const char *config_uart_msg[] = { " None", " PPP", " Console", " MIDI" }; @@ -1754,14 +1754,27 @@ void HandleUI(void) OsdSetTitle("Define buttons", 0); menustate = MENU_JOYDIGMAP1; parentstate = MENU_JOYDIGMAP; - for (int i = 0; i < OsdGetSize(); i++) OsdWrite(i, "", 0, 0); - OsdWrite(8, " Esc -> Cancel", 0, 0); - OsdWrite(9, " Enter -> Cancel", 0, 0); - OsdWrite(10," Space -> Skip", 0, 0); + for (int i = 0; i < OsdGetSize(); i++) OsdWrite(i); + OsdWrite(7, " Esc \x16 Cancel"); + OsdWrite(8, " Enter \x16 Finish"); + OsdWrite(9, " Space \x16 Skip"); + if (!is_menu_core()) + { + OsdWrite(13, " You may define 2 sets of"); + OsdWrite(14, " buttons on the same gamepad"); + } break; case MENU_JOYDIGMAP1: { + if (get_map_clear()) + { + OsdWrite(3); + OsdWrite(4, " Clearing"); + OsdWrite(5); + break; + } + const char* p = 0; if (get_map_button() < 0) { @@ -1807,11 +1820,12 @@ void HandleUI(void) } OsdWrite(3, s, 0, 0); + OsdWrite(4); if (get_map_vid() || get_map_pid()) { if (!is_menu_core() && get_map_type() && !has_default_map()) { - for (int i = 0; i < OsdGetSize(); i++) OsdWrite(i, "", 0, 0); + for (int i = 0; i < OsdGetSize(); i++) OsdWrite(i); OsdWrite(6, " You need to define this"); OsdWrite(7, " joystick in Menu core first"); OsdWrite(9, " Press ESC/Enter"); @@ -1823,10 +1837,10 @@ void HandleUI(void) sprintf(s, " %s ID: %04x:%04x", get_map_type() ? "Joystick" : "Keyboard", get_map_vid(), get_map_pid()); if (get_map_button() > 0) { - OsdWrite(9, " Enter -> Finish", 0, 0); - if (!get_map_type()) OsdWrite(10); + if (!get_map_type()) OsdWrite(9); } - OsdWrite(5, s, 0, 0); + OsdWrite(5, s); + if (!is_menu_core()) OsdWrite(10, " Menu/F12 \x16 Clear all"); } }