Added virtual SNES gamepad
* Added virtual SNES gamepad * Added "magic" joy mapping logic based on button names and core name * minor fixes after testing
This commit is contained in:
85
input.cpp
85
input.cpp
@@ -24,8 +24,8 @@
|
||||
#include "fpga_io.h"
|
||||
#include "osd.h"
|
||||
#include "video.h"
|
||||
#include "joymapping.h"
|
||||
|
||||
#define NUMDEV 30
|
||||
#define NUMPLAYERS 6
|
||||
#define UINPUT_NAME "MiSTer virtual input"
|
||||
|
||||
@@ -988,41 +988,6 @@ enum QUIRK
|
||||
QUIRK_DS4TOUCH,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t vid, pid;
|
||||
uint8_t led;
|
||||
uint8_t mouse;
|
||||
uint8_t axis_edge[256];
|
||||
int8_t axis_pos[256];
|
||||
|
||||
uint8_t num;
|
||||
uint8_t has_map;
|
||||
uint32_t map[32];
|
||||
|
||||
uint8_t osd_combo;
|
||||
|
||||
uint8_t has_mmap;
|
||||
uint32_t mmap[32];
|
||||
uint16_t jkmap[1024];
|
||||
|
||||
uint8_t has_kbdmap;
|
||||
uint8_t kbdmap[256];
|
||||
|
||||
uint16_t guncal[4];
|
||||
|
||||
int accx, accy;
|
||||
int quirk;
|
||||
|
||||
int lightgun_req;
|
||||
int lightgun;
|
||||
|
||||
int bind;
|
||||
char devname[32];
|
||||
char uniq[32];
|
||||
char name[128];
|
||||
} devInput;
|
||||
|
||||
static devInput input[NUMDEV] = {};
|
||||
|
||||
#define BTN_NUM (sizeof(devInput::map) / sizeof(devInput::map[0]))
|
||||
@@ -1251,6 +1216,15 @@ void finish_map_setting(int dismiss)
|
||||
}
|
||||
}
|
||||
|
||||
int convert_from_menu_mapping(int dev) {
|
||||
//attempts to map from Menu joystick config file
|
||||
//returns: 0 if failed to map or 1 if success
|
||||
if(!FileLoadConfig(get_map_name(dev, 1), &input[dev].map, sizeof(input[dev].map))) {
|
||||
return 0;
|
||||
}
|
||||
return map_joystick (user_io_get_core_name_ex(), input, dev);
|
||||
}
|
||||
|
||||
void input_lightgun_cal(uint16_t *cal)
|
||||
{
|
||||
FileSaveConfig("wiimote_cal.cfg", cal, 4 * sizeof(uint16_t));
|
||||
@@ -1730,16 +1704,19 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
|
||||
{
|
||||
if (!FileLoadConfig(get_map_name(dev, 0), &input[dev].map, sizeof(input[dev].map)))
|
||||
{
|
||||
if (is_menu_core() || !FileLoadConfig(get_map_name(dev, 1), &input[dev].map, sizeof(input[dev].map)))
|
||||
{
|
||||
memset(input[dev].map, 0, sizeof(input[dev].map));
|
||||
input[dev].has_map++;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (uint i = 8; i < sizeof(input[0].map) / sizeof(input[0].map[0]); i++)
|
||||
if(!convert_from_menu_mapping(dev)) {
|
||||
if (is_menu_core() || !FileLoadConfig(get_map_name(dev, 1), &input[dev].map, sizeof(input[dev].map)))
|
||||
{
|
||||
input[dev].map[i] = 0;
|
||||
// nothing found so blank out everything
|
||||
memset(input[dev].map, 0, sizeof(input[dev].map));
|
||||
input[dev].has_map++;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (uint i = 8; i < sizeof(input[0].map) / sizeof(input[0].map[0]); i++)
|
||||
{
|
||||
input[dev].map[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
input[dev].has_map++;
|
||||
@@ -1849,24 +1826,24 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
|
||||
input[dev].osd_combo = 0;
|
||||
|
||||
int found = 0;
|
||||
for (int i = (mapping_button >= 8) ? 8 : 0; i < mapping_button; i++) if (input[dev].map[i] == ev->code) found = 1;
|
||||
for (int i = (mapping_button >= BUTTON_DPAD_COUNT) ? BUTTON_DPAD_COUNT : 0; i < mapping_button; i++) if (input[dev].map[i] == ev->code) found = 1;
|
||||
|
||||
if (!found || (mapping_button == 16 && mapping_type))
|
||||
if (!found || (mapping_button == BUTTON_IDX_OSD && mapping_type))
|
||||
{
|
||||
input[dev].map[(mapping_button == 16) ? 16 + mapping_type : mapping_button] = ev->code;
|
||||
input[dev].map[18] = input[dev].map[17];
|
||||
input[dev].map[(mapping_button == BUTTON_IDX_OSD) ? BUTTON_IDX_OSD + mapping_type : mapping_button] = ev->code;
|
||||
input[dev].map[BUTTON_IDX_OSD+2] = input[dev].map[BUTTON_IDX_OSD+1];
|
||||
|
||||
key_mapped = ev->code;
|
||||
|
||||
//check if analog stick has been used for mouse
|
||||
if (mapping_button == 9 || mapping_button == 11)
|
||||
if (mapping_button == BUTTON_DPAD_COUNT+1 || mapping_button == BUTTON_DPAD_COUNT+3)
|
||||
{
|
||||
if (input[dev].map[mapping_button] >= KEY_EMU &&
|
||||
input[dev].map[mapping_button - 1] >= KEY_EMU &&
|
||||
(input[dev].map[mapping_button - 1] - input[dev].map[mapping_button] == 1) && // same axis
|
||||
absinfo)
|
||||
{
|
||||
input[dev].map[AXIS_MX + (mapping_button - 9)/2] = ((input[dev].map[mapping_button] - KEY_EMU)/2) | 0x20000;
|
||||
input[dev].map[AXIS_MX + (mapping_button - (BUTTON_DPAD_COUNT+1))/2] = ((input[dev].map[mapping_button] - KEY_EMU)/2) | 0x20000;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1907,10 +1884,10 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
|
||||
}
|
||||
}
|
||||
//combo for osd button
|
||||
if (ev->value == 1 && key_mapped && key_mapped != ev->code && is_menu_core() && mapping_button == 16 && mapping_type)
|
||||
if (ev->value == 1 && key_mapped && key_mapped != ev->code && is_menu_core() && mapping_button == BUTTON_IDX_OSD && mapping_type)
|
||||
{
|
||||
input[dev].map[18] = ev->code;
|
||||
printf("Set combo: %x + %x\n", input[dev].map[17], input[dev].map[18]);
|
||||
input[dev].map[BUTTON_IDX_OSD+2] = ev->code;
|
||||
printf("Set combo: %x + %x\n", input[dev].map[BUTTON_IDX_OSD+1], input[dev].map[BUTTON_IDX_OSD+2]);
|
||||
}
|
||||
else if(mapping_dev == dev && ev->value == 0 && key_mapped == ev->code)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user