diff --git a/input/connect/connect_nesusb.c b/input/connect/connect_nesusb.c index 38493c4556..ccb8031d9a 100644 --- a/input/connect/connect_nesusb.c +++ b/input/connect/connect_nesusb.c @@ -139,6 +139,14 @@ const char * hidpad_nesusb_get_name(void *data) return "Generic NES USB Controller"; } +static int32_t hidpad_nesusb_button(void *data, uint16_t joykey) +{ + struct hidpad_nesusb_data *pad = (struct hidpad_nesusb_data*)data; + if (!pad || joykey > 31) + return 0; + return pad->buttons & (1 << joykey); +} + pad_connection_interface_t pad_connection_nesusb = { hidpad_nesusb_init, hidpad_nesusb_deinit, @@ -147,6 +155,6 @@ pad_connection_interface_t pad_connection_nesusb = { hidpad_nesusb_get_buttons, hidpad_nesusb_get_axis, hidpad_nesusb_get_name, - NULL, /* button */ + hidpad_nesusb_button, false, }; diff --git a/input/connect/connect_ps2adapter.c b/input/connect/connect_ps2adapter.c index 74b1cd47be..1dbc079b6a 100644 --- a/input/connect/connect_ps2adapter.c +++ b/input/connect/connect_ps2adapter.c @@ -174,6 +174,14 @@ const char * hidpad_ps2adapter_get_name(void *data) return "PS2/PSX Controller Adapter"; } +static int32_t hidpad_ps2adapter_button(void *data, uint16_t joykey) +{ + struct hidpad_ps2adapter_data *pad = (struct hidpad_ps2adapter_data*)data; + if (!pad || joykey > 31) + return 0; + return pad->buttons & (1 << joykey); +} + pad_connection_interface_t pad_connection_ps2adapter = { hidpad_ps2adapter_init, hidpad_ps2adapter_deinit, @@ -182,6 +190,6 @@ pad_connection_interface_t pad_connection_ps2adapter = { hidpad_ps2adapter_get_buttons, hidpad_ps2adapter_get_axis, hidpad_ps2adapter_get_name, - NULL, + hidpad_ps2adapter_button, false, }; diff --git a/input/connect/connect_ps4.c b/input/connect/connect_ps4.c index 33e9ccc782..a0a236c662 100644 --- a/input/connect/connect_ps4.c +++ b/input/connect/connect_ps4.c @@ -285,6 +285,52 @@ static void hidpad_ps4_set_rumble(void *data, #endif } +static int32_t hidpad_ps4_button(void *data, uint16_t joykey) +{ + struct hidpad_ps4_data *device = (struct hidpad_ps4_data*)data; + struct ps4 *rpt = device ? + (struct ps4*)&device->data : NULL; + if (!device || !rpt || joykey > 31) + return 0; + + switch(joykey) { + case RETRO_DEVICE_ID_JOYPAD_R3: + return rpt->btn.r3; + case RETRO_DEVICE_ID_JOYPAD_L3: + return rpt->btn.l3; + case RETRO_DEVICE_ID_JOYPAD_START: + return rpt->btn.options; + case RETRO_DEVICE_ID_JOYPAD_SELECT: + return rpt->btn.share; + case RETRO_DEVICE_ID_JOYPAD_R2: + return rpt->btn.r2; + case RETRO_DEVICE_ID_JOYPAD_L2: + return rpt->btn.l2; + case RETRO_DEVICE_ID_JOYPAD_R: + return rpt->btn.r1; + case RETRO_DEVICE_ID_JOYPAD_L: + return rpt->btn.l1; + case RETRO_DEVICE_ID_JOYPAD_X: + return rpt->btn.triangle; + case RETRO_DEVICE_ID_JOYPAD_A: + return rpt->btn.circle; + case RETRO_DEVICE_ID_JOYPAD_B: + return rpt->btn.cross; + case RETRO_DEVICE_ID_JOYPAD_Y: + return rpt->btn.square; + case RETRO_DEVICE_ID_JOYPAD_LEFT: + case RETRO_DEVICE_ID_JOYPAD_RIGHT: + case RETRO_DEVICE_ID_JOYPAD_DOWN: + case RETRO_DEVICE_ID_JOYPAD_UP: + return hidpad_ps4_check_dpad(rpt, joykey); + case RARCH_MENU_TOGGLE: + return rpt->btn.ps; + default: + return 0; + } +} + + pad_connection_interface_t pad_connection_ps4 = { hidpad_ps4_init, hidpad_ps4_deinit, @@ -293,6 +339,6 @@ pad_connection_interface_t pad_connection_ps4 = { hidpad_ps4_get_buttons, hidpad_ps4_get_axis, NULL, /* get_name */ - NULL, /* button */ + hidpad_ps4_button, false }; diff --git a/input/connect/connect_ps4_hori_mini.c b/input/connect/connect_ps4_hori_mini.c index ee38f5d73a..31499687da 100644 --- a/input/connect/connect_ps4_hori_mini.c +++ b/input/connect/connect_ps4_hori_mini.c @@ -178,6 +178,14 @@ const char * hidpad_ps4_hori_mini_get_name(void *data) return "HORI mini wired PS4"; } +static int32_t hidpad_ps4_hori_mini_button(void *data, uint16_t joykey) +{ + struct hidpad_ps4_hori_mini_data *pad = (struct hidpad_ps4_hori_mini_data*)data; + if (!pad || joykey > 31) + return 0; + return pad->buttons & (1 << joykey); +} + pad_connection_interface_t pad_connection_ps4_hori_mini = { hidpad_ps4_hori_mini_init, hidpad_ps4_hori_mini_deinit, @@ -186,6 +194,6 @@ pad_connection_interface_t pad_connection_ps4_hori_mini = { hidpad_ps4_hori_mini_get_buttons, hidpad_ps4_hori_mini_get_axis, hidpad_ps4_hori_mini_get_name, - NULL, /* button */ + hidpad_ps4_hori_mini_button, /* button */ false }; diff --git a/input/connect/connect_psxadapter.c b/input/connect/connect_psxadapter.c index 89ec500e84..094ed4c16a 100644 --- a/input/connect/connect_psxadapter.c +++ b/input/connect/connect_psxadapter.c @@ -183,6 +183,14 @@ const char * hidpad_psxadapter_get_name(void *data) return "PSX to PS3 Controller Adapter"; } +static int32_t hidpad_psxadapter_button(void *data, uint16_t joykey) +{ + struct hidpad_psxadapter_data *pad = (struct hidpad_psxadapter_data*)data; + if (!pad || joykey > 31) + return 0; + return pad->buttons & (1 << joykey); +} + pad_connection_interface_t pad_connection_psxadapter = { hidpad_psxadapter_init, hidpad_psxadapter_deinit, @@ -191,6 +199,6 @@ pad_connection_interface_t pad_connection_psxadapter = { hidpad_psxadapter_get_buttons, hidpad_psxadapter_get_axis, hidpad_psxadapter_get_name, - NULL, /* button */ + hidpad_psxadapter_button, false }; diff --git a/input/connect/connect_retrode.c b/input/connect/connect_retrode.c index eaf5bd8d51..648bf18a01 100644 --- a/input/connect/connect_retrode.c +++ b/input/connect/connect_retrode.c @@ -189,6 +189,14 @@ const char * hidpad_retrode_get_name(void *data) return "Retrode"; } +static int32_t hidpad_retrode_button(void *data, uint16_t joykey) +{ + struct hidpad_retrode_data *pad = (struct hidpad_retrode_data*)data; + if (!pad || joykey > 31) + return 0; + return pad->buttons & (1 << joykey); +} + pad_connection_interface_t pad_connection_retrode = { hidpad_retrode_init, hidpad_retrode_deinit, @@ -197,6 +205,6 @@ pad_connection_interface_t pad_connection_retrode = { hidpad_retrode_get_buttons, hidpad_retrode_get_axis, hidpad_retrode_get_name, - NULL, /* button */ + hidpad_retrode_button, false, }; diff --git a/input/connect/connect_snesusb.c b/input/connect/connect_snesusb.c index 7a452abe41..39fb9a9340 100644 --- a/input/connect/connect_snesusb.c +++ b/input/connect/connect_snesusb.c @@ -140,6 +140,14 @@ const char * hidpad_snesusb_get_name(void *data) return "Generic SNES USB Controller"; } +static int32_t hidpad_snesusb_button(void *data, uint16_t joykey) +{ + struct hidpad_snesusb_data *pad = (struct hidpad_snesusb_data*)data; + if (!pad || joykey > 31) + return 0; + return pad->buttons & (1 << joykey); +} + pad_connection_interface_t pad_connection_snesusb = { hidpad_snesusb_init, hidpad_snesusb_deinit, @@ -148,6 +156,6 @@ pad_connection_interface_t pad_connection_snesusb = { hidpad_snesusb_get_buttons, hidpad_snesusb_get_axis, hidpad_snesusb_get_name, - NULL, /* button */ + hidpad_snesusb_button, false }; diff --git a/input/connect/connect_wii.c b/input/connect/connect_wii.c index c3d5a5a783..1c7029a56f 100644 --- a/input/connect/connect_wii.c +++ b/input/connect/connect_wii.c @@ -722,6 +722,8 @@ static void hidpad_wii_set_rumble(void *data, (void)strength; } +/* TODO: implement hidpad_wii_button(). */ + pad_connection_interface_t pad_connection_wii = { hidpad_wii_init, hidpad_wii_deinit, diff --git a/input/connect/connect_wiiupro.c b/input/connect/connect_wiiupro.c index ff26bb5064..51ee3f3ad1 100644 --- a/input/connect/connect_wiiupro.c +++ b/input/connect/connect_wiiupro.c @@ -248,6 +248,56 @@ static void hidpad_wiiupro_set_rumble(void *data, /* TODO */ } +static int32_t hidpad_wiiupro_button(void *data, uint16_t joykey) +{ + struct hidpad_wiiupro_data *device = (struct hidpad_wiiupro_data*)data; + struct wiiupro *rpt = device ? + (struct wiiupro*)&device->data : NULL; + + if (!device || !rpt) + return 0; + + switch(joykey) { + case RETRO_DEVICE_ID_JOYPAD_R3: + return rpt->btn.r3; + case RETRO_DEVICE_ID_JOYPAD_L3: + return rpt->btn.l3; + case RETRO_DEVICE_ID_JOYPAD_START: + return rpt->btn.plus; + case RETRO_DEVICE_ID_JOYPAD_SELECT: + return rpt->btn.minus; + case RETRO_DEVICE_ID_JOYPAD_R2: + return rpt->btn.zr; + case RETRO_DEVICE_ID_JOYPAD_L2: + return rpt->btn.zl; + case RETRO_DEVICE_ID_JOYPAD_R: + return rpt->btn.r; + case RETRO_DEVICE_ID_JOYPAD_L: + return rpt->btn.l; + case RETRO_DEVICE_ID_JOYPAD_X: + return rpt->btn.x; + case RETRO_DEVICE_ID_JOYPAD_A: + return rpt->btn.a; + case RETRO_DEVICE_ID_JOYPAD_B: + return rpt->btn.b; + case RETRO_DEVICE_ID_JOYPAD_Y: + return rpt->btn.y; + case RETRO_DEVICE_ID_JOYPAD_LEFT: + return rpt->btn.left; + case RETRO_DEVICE_ID_JOYPAD_RIGHT: + return rpt->btn.right; + case RETRO_DEVICE_ID_JOYPAD_DOWN: + return rpt->btn.down; + case RETRO_DEVICE_ID_JOYPAD_UP: + return rpt->btn.up; + case RARCH_MENU_TOGGLE: + return rpt->btn.home; + default: + return 0; + } + +} + pad_connection_interface_t pad_connection_wiiupro = { hidpad_wiiupro_init, hidpad_wiiupro_deinit, @@ -256,6 +306,6 @@ pad_connection_interface_t pad_connection_wiiupro = { hidpad_wiiupro_get_buttons, hidpad_wiiupro_get_axis, NULL, /* get_name */ - NULL, /* button */ + hidpad_wiiupro_button, false };