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:
Newsdee
2019-10-22 00:08:00 +08:00
committed by sorgelig
parent 985486385d
commit 22adac00dd
5 changed files with 265 additions and 77 deletions

View File

@@ -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)
{