input: support for 2 buttons sets.
This commit is contained in:
133
input.cpp
133
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.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
1
input.h
1
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();
|
||||
|
||||
32
menu.cpp
32
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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user