diff --git a/MiSTer.ini b/MiSTer.ini index 501d147..4326a1b 100644 --- a/MiSTer.ini +++ b/MiSTer.ini @@ -312,4 +312,8 @@ disable_autofire=0 ; Enable per controller and per USB port mapping, both gamepads and keyboards ; Even same model of controller connected to different USB ports will have different button sets, ; thus make sure to define buttons for all controllers if you set this option to 1. +; Option also accepts VIDPID value to define per-port mapping only for specific VID:PID device. +; It's useful for DIY controllers using off-the-shelf boards like arduino. +; You may use several controller_unique_mapping instances to assign several VID:PID. +;controller_unique_mapping=0x23418037 ; example for Arduino Micro controller_unique_mapping=0 diff --git a/cfg.cpp b/cfg.cpp index e030040..8c9d89d 100644 --- a/cfg.cpp +++ b/cfg.cpp @@ -119,7 +119,7 @@ static const ini_var_t ini_vars[] = { "HDR_AVG_NITS", (void*)(&(cfg.hdr_avg_nits)), UINT16, 100, 10000}, { "VGA_MODE", (void*)(&(cfg.vga_mode)), STRING, 0, sizeof(cfg.vga_mode) - 1 }, { "NTSC_MODE", (void *)(&(cfg.ntsc_mode)), UINT8, 0, 2}, - { "CONTROLLER_UNIQUE_MAPPING", (void *)(&(cfg.controller_unique_mapping)), UINT8, 0, 1}, + { "CONTROLLER_UNIQUE_MAPPING", (void *)(cfg.controller_unique_mapping), UINT32ARR, 0, 0xFFFFFFFF }, }; static const int nvars = (int)(sizeof(ini_vars) / sizeof(ini_var_t)); diff --git a/cfg.h b/cfg.h index e7bac8e..f0fc704 100644 --- a/cfg.h +++ b/cfg.h @@ -91,7 +91,7 @@ typedef struct { char vga_mode[16]; char vga_mode_int; char ntsc_mode; - uint8_t controller_unique_mapping; + uint32_t controller_unique_mapping[256]; } cfg_t; extern cfg_t cfg; diff --git a/input.cpp b/input.cpp index b11d3aa..81bac81 100644 --- a/input.cpp +++ b/input.cpp @@ -1439,12 +1439,22 @@ int get_map_cancel() return (mapping && !is_menu() && osd_timer && CheckTimer(osd_timer)); } +static int has_unique_mapping(uint32_t vidpid) +{ + for (uint i = 0; i < cfg.controller_unique_mapping[0]; i++) + { + if (!cfg.controller_unique_mapping[i + 1]) break; + if (cfg.controller_unique_mapping[i + 1] == 1 || cfg.controller_unique_mapping[i + 1] == vidpid) return 1; + } + return 0; +} + static char *get_map_name(int dev, int def) { static char name[128]; char id[32]; - if (cfg.controller_unique_mapping) sprintfz(id, "%s_%08x", input[dev].idstr, input[dev].unique_hash); + if (has_unique_mapping((input[dev].vid << 16) | input[dev].pid)) sprintfz(id, "%s_%08x", input[dev].idstr, input[dev].unique_hash); else strcpyz(id, input[dev].idstr); if (def || is_menu()) sprintf(name, "input_%s%s_v3.map", id, input[dev].mod ? "_m" : ""); @@ -1456,7 +1466,7 @@ static char *get_kbdmap_name(int dev) { static char name[128]; - if (cfg.controller_unique_mapping) sprintfz(name, "kbd_%s_%08x.map", input[dev].idstr, input[dev].unique_hash); + if (has_unique_mapping((input[dev].vid << 16) | input[dev].pid)) sprintfz(name, "kbd_%s_%08x.map", input[dev].idstr, input[dev].unique_hash); else sprintfz(name, "kbd_%s.map", input[dev].idstr); return name;