(Input autodetect) Start setting up input autodetect so that it

can look at matching VID/PIDs
This commit is contained in:
twinaphex 2014-09-30 18:18:02 +02:00
parent c9bee62761
commit aea679456d
16 changed files with 81 additions and 25 deletions

View File

@ -477,7 +477,8 @@ static void handle_hotplug(android_input_t *android,
{
strlcpy(g_settings.input.device_names[*port],
name_buf, sizeof(g_settings.input.device_names[*port]));
input_config_autoconfigure_joypad(*port, name_buf, android_joypad.ident);
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(*port, name_buf, 0, 0, android_joypad.ident);
RARCH_LOG("Port %d: %s.\n", *port, name_buf);
}

View File

@ -30,8 +30,9 @@ static bool android_joypad_init(void)
strlcpy(g_settings.input.device_names[autoconf_pad],
android_joypad_name(autoconf_pad),
sizeof(g_settings.input.device_names[autoconf_pad]));
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(autoconf_pad,
android_joypad_name(autoconf_pad),
android_joypad_name(autoconf_pad), 0, 0,
android_joypad.ident);
}

View File

@ -778,8 +778,9 @@ static BOOL CALLBACK enum_joypad_cb(const DIDEVICEINSTANCE *inst, void *p)
strlcpy(g_settings.input.device_names[g_joypad_cnt],
dinput_joypad_name(g_joypad_cnt),
sizeof(g_settings.input.device_names[g_joypad_cnt]));
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(g_joypad_cnt,
dinput_joypad_name(g_joypad_cnt),
dinput_joypad_name(g_joypad_cnt), 0, 0,
dinput_joypad.ident);
}

View File

@ -258,8 +258,10 @@ static void *gx_input_init(void)
strlcpy(g_settings.input.device_names[autoconf_pad],
gx_joypad_name_static(gx, autoconf_pad),
sizeof(g_settings.input.device_names[autoconf_pad]));
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(autoconf_pad,
gx_joypad_name_static(gx, autoconf_pad),
0, 0,
gx->joypad->ident);
}
@ -279,8 +281,11 @@ static void handle_hotplug(void *data, unsigned port, uint32_t ptype)
strlcpy(g_settings.input.device_names[port],
gx_joypad_name(port),
sizeof(g_settings.input.device_names[port]));
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(port,
gx_joypad_name(port), gx_joypad.ident);
gx_joypad_name(port),
0, 0,
gx_joypad.ident);
}
static void gx_input_poll(void *data)

View File

@ -37,19 +37,23 @@ static void input_autoconfigure_joypad_conf(config_file_t *conf,
static bool input_try_autoconfigure_joypad_from_conf(config_file_t *conf,
unsigned index, const char *name, const char *driver,
bool block_osd_spam)
const char *vid, const char *pid, bool block_osd_spam)
{
if (!conf)
return false;
char ident[1024], ident_idx[1024];
char input_driver[1024];
bool cond_found_idx, cond_found_general;
char ident[PATH_MAX], ident_idx[PATH_MAX];
char input_driver[PATH_MAX], input_vid[PATH_MAX],
input_pid[PATH_MAX];
bool cond_found_idx, cond_found_general,
cond_found_vid = false, cond_found_pid = false;
*ident = *input_driver = '\0';
config_get_array(conf, "input_device", ident, sizeof(ident));
config_get_array(conf, "input_driver", input_driver, sizeof(input_driver));
config_get_array(conf, "input_vendor_id", input_vid, sizeof(input_vid));
config_get_array(conf, "input_product_id", input_pid, sizeof(input_pid));
snprintf(ident_idx, sizeof(ident_idx), "%s_p%u", ident, index);
@ -57,7 +61,17 @@ static bool input_try_autoconfigure_joypad_from_conf(config_file_t *conf,
cond_found_idx = !strcmp(ident_idx, name);
cond_found_general = !strcmp(ident, name) && !strcmp(driver, input_driver);
if (vid != 0)
cond_found_vid = !strcmp(vid, input_vid);
if (pid != 0)
cond_found_pid = !strcmp(vid, input_pid);
/* If Vendor ID and Product ID matches, we've found our
* entry. */
if (cond_found_vid && cond_found_pid)
goto found;
/* Check for name match. */
if (cond_found_idx)
goto found;
else if (cond_found_general)
@ -81,7 +95,8 @@ found:
}
void input_config_autoconfigure_joypad(unsigned index,
const char *name, const char *driver)
const char *name, const char *vid, const char *pid,
const char *driver)
{
size_t i;
@ -113,7 +128,7 @@ void input_config_autoconfigure_joypad(unsigned index,
config_file_t *conf = (config_file_t*)
config_file_new_from_string(input_builtin_autoconfs[i]);
bool success = input_try_autoconfigure_joypad_from_conf(conf,
index, name, driver, block_osd_spam);
index, name, driver, vid, pid, block_osd_spam);
config_file_free(conf);
if (success)
break;
@ -134,7 +149,7 @@ void input_config_autoconfigure_joypad(unsigned index,
if (!conf)
continue;
bool success = input_try_autoconfigure_joypad_from_conf(conf,
index, name, driver, block_osd_spam);
index, name, driver, vid, pid, block_osd_spam);
config_file_free(conf);
if (success)
break;

View File

@ -21,7 +21,8 @@ const struct retro_keybind *input_get_auto_bind(unsigned port,
unsigned id);
void input_config_autoconfigure_joypad(unsigned index,
const char *name, const char *driver);
const char *name, const char *vid, const char *pid,
const char *driver);
extern const char* const input_builtin_autoconfs[];

View File

@ -151,7 +151,8 @@ static void handle_plugged_pad(void)
g_pads[index].fd = -1;
*g_pads[index].ident = '\0';
input_config_autoconfigure_joypad(index, NULL, NULL);
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(index, NULL, 0, 0, NULL);
}
}
// Sometimes, device will be created before acess to it is established.
@ -162,7 +163,8 @@ static void handle_plugged_pad(void)
bool ret = linuxraw_joypad_init_pad(path, &g_pads[index]);
if (*g_pads[index].ident && ret)
input_config_autoconfigure_joypad(index, g_pads[index].ident, "linuxraw");
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(index, g_pads[index].ident, 0, 0, "linuxraw");
}
}
}
@ -211,13 +213,14 @@ static bool linuxraw_joypad_init(void)
char path[PATH_MAX];
snprintf(path, sizeof(path), "/dev/input/js%u", i);
/* TODO - implement VID/PID? */
if (linuxraw_joypad_init_pad(path, pad))
{
input_config_autoconfigure_joypad(i, pad->ident, "linuxraw");
input_config_autoconfigure_joypad(i, pad->ident, 0, 0, "linuxraw");
poll_pad(pad);
}
else
input_config_autoconfigure_joypad(i, NULL, NULL);
input_config_autoconfigure_joypad(i, NULL, 0, 0, NULL);
}
g_notify = inotify_init();

View File

@ -28,8 +28,10 @@ static bool ps3_joypad_init(void)
strlcpy(g_settings.input.device_names[autoconf_pad],
"SixAxis Controller",
sizeof(g_settings.input.device_names[autoconf_pad]));
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(autoconf_pad,
ps3_joypad_name(autoconf_pad),
0, 0,
ps3_joypad.ident);
}

View File

@ -28,8 +28,10 @@ static bool psp_joypad_init(void)
strlcpy(g_settings.input.device_names[autoconf_pad],
psp_joypad_name(autoconf_pad),
sizeof(g_settings.input.device_names[autoconf_pad]));
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(autoconf_pad,
psp_joypad_name(autoconf_pad),
0, 0,
psp_joypad.ident);
}

View File

@ -304,7 +304,9 @@ static void qnx_input_autodetect_gamepad(void *data,
{
strlcpy(g_settings.input.device_names[port],
name_buf, sizeof(g_settings.input.device_names[port]));
input_config_autoconfigure_joypad(port, name_buf, qnx->joypad);
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(port, name_buf, 0, 0,
qnx->joypad);
controller->port = port;
qnx->port_device[port] = controller;

View File

@ -28,8 +28,11 @@ static bool qnx_joypad_init(void)
{
strlcpy(g_settings.input.device_names[autoconf_pad], "None",
sizeof(g_settings.input.device_names[autoconf_pad]));
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(autoconf_pad,
qnx_joypad_name(autoconf_pad), qnx_joypad.ident);
qnx_joypad_name(autoconf_pad),
0, 0,
qnx_joypad.ident);
}
return true;

View File

@ -117,7 +117,9 @@ static void pad_connect(unsigned id)
}
strlcpy(g_settings.input.device_names[id], pad_name(id), sizeof(g_settings.input.device_names[id]));
input_config_autoconfigure_joypad(id, pad_name(id), sdl_joypad.ident);
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(id, pad_name(id),
0, 0, sdl_joypad.ident);
RARCH_LOG("[SDL]: Joypad #%u connected: %s.\n", id, pad_name(id));

View File

@ -301,8 +301,11 @@ static void free_pad(unsigned pad, bool hotplug)
g_pads[pad].ident = g_settings.input.device_names[pad];
// Avoid autoconfig spam if we're reiniting driver.
/* TODO - implement VID/PID? */
if (hotplug)
input_config_autoconfigure_joypad(pad, NULL, NULL);
input_config_autoconfigure_joypad(pad, NULL,
0, 0,
NULL);
}
static bool add_pad(unsigned p, int fd, const char *path)
@ -363,8 +366,11 @@ static bool add_pad(unsigned p, int fd, const char *path)
pad->device = st.st_rdev;
pad->fd = fd;
pad->path = strdup(path);
/* TODO - implement VID/PID? */
if (*pad->ident)
input_config_autoconfigure_joypad(p, pad->ident, "udev");
input_config_autoconfigure_joypad(p, pad->ident,
0, 0, "udev");
// Check for rumble features.
unsigned long ffbit[NBITS(FF_MAX)] = {0};

View File

@ -231,8 +231,15 @@ static bool winxinput_joypad_init(void)
{
if (pad_index_to_xplayer_index(autoconf_pad) > -1)
{
strlcpy(g_settings.input.device_names[autoconf_pad], winxinput_joypad_name(autoconf_pad), sizeof(g_settings.input.device_names[autoconf_pad]));
input_config_autoconfigure_joypad(autoconf_pad, winxinput_joypad_name(autoconf_pad), winxinput_joypad.ident);
strlcpy(g_settings.input.device_names[autoconf_pad],
winxinput_joypad_name(autoconf_pad),
sizeof(g_settings.input.device_names[autoconf_pad]));
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(autoconf_pad,
winxinput_joypad_name(autoconf_pad),
0, 0,
winxinput_joypad.ident);
}
}

View File

@ -36,8 +36,12 @@ static bool xdk_joypad_init(void)
strlcpy(g_settings.input.device_names[autoconf_pad],
"XInput Controller",
sizeof(g_settings.input.device_names[autoconf_pad]));
/* TODO - implement VID/PID? */
input_config_autoconfigure_joypad(autoconf_pad,
xdk_joypad_name(autoconf_pad), xdk_joypad.ident);
xdk_joypad_name(autoconf_pad),
0, 0,
xdk_joypad.ident);
}
return true;

View File

@ -431,7 +431,8 @@ static void parse_input(int argc, char *argv[])
}
void input_config_autoconfigure_joypad(unsigned index,
const char *name, const char *driver)
const char *name, const char *vid, const char *pid,
const char *driver)
{
}