input: support for 2 buttons sets.

This commit is contained in:
sorgelig
2019-04-21 20:21:26 +08:00
parent 9740549327
commit 04518562cc
3 changed files with 104 additions and 62 deletions

133
input.cpp
View File

@@ -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.
}
}

View File

@@ -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();

View File

@@ -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");
}
}