From 4393e17ea73ea83938be2f76ec573530fcd67663 Mon Sep 17 00:00:00 2001 From: Maschell Date: Mon, 8 May 2017 21:46:34 +0200 Subject: [PATCH] [Wii U] Using the HID Controller as a own controller. Currently the stick only work when it's bind manually. Mapping from controller to retroarch input port may change when you attach a new device. --- frontend/drivers/platform_wiiu.c | 2 +- input/drivers_joypad/wiiu_joypad.c | 57 +++++++++++++++++++++++++----- input/input_autodetect_builtin.c | 1 + wiiu/controller_patcher | 2 +- 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index ce383019ab..c7e2e06e98 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -407,9 +407,9 @@ int main(int argc, char **argv) #endif verbosity_enable(); + printf("starting\n"); ControllerPatcherInit(); - printf("starting\n"); fflush(stdout); DEBUG_VAR(ARGV_PTR); if(ARGV_PTR && ((u32)ARGV_PTR < 0x01000000)) diff --git a/input/drivers_joypad/wiiu_joypad.c b/input/drivers_joypad/wiiu_joypad.c index 3c4414eb52..790f09e114 100644 --- a/input/drivers_joypad/wiiu_joypad.c +++ b/input/drivers_joypad/wiiu_joypad.c @@ -35,7 +35,7 @@ #include "wiiu_dbg.h" #ifndef MAX_PADS -#define MAX_PADS 5 +#define MAX_PADS 16 #endif #define WIIUINPUT_TYPE_WIIMOTE 0x00 @@ -44,22 +44,31 @@ #define WIIUINPUT_TYPE_PRO_CONTROLLER 0x1F #define WIIUINPUT_TYPE_NONE 0xFD +#define GAMEPAD_COUNT 1 +#define KPAD_COUNT 4 +#define HID_COUNT (MAX_PADS - GAMEPAD_COUNT - KPAD_COUNT) +#define GAMEPAD_OFFSET 0 +#define KPAD_OFFSET (GAMEPAD_OFFSET + GAMEPAD_COUNT) +#define HID_OFFSET (KPAD_OFFSET + KPAD_COUNT) + static uint64_t pad_state[MAX_PADS]; -static u8 pad_type[MAX_PADS - 1] = {WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE}; +static u8 pad_type[KPAD_COUNT] = {WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE}; + +static u8 hid_status[HID_COUNT]; +static InputDataEx hid_data[HID_COUNT]; static int16_t analog_state[MAX_PADS][2][2]; extern uint64_t lifecycle_state; static bool wiiu_pad_inited = false; - - static const char* wiiu_joypad_name(unsigned pad) { if (pad == 0) return "WIIU Gamepad"; - if (pad < MAX_PADS) + if (pad < MAX_PADS && pad < (HID_OFFSET) && pad > GAMEPAD_OFFSET) { - switch (pad_type[pad - 1]) + int i = pad - KPAD_OFFSET; + switch (pad_type[i]) { case WIIUINPUT_TYPE_NONE: return "N/A"; @@ -78,6 +87,10 @@ static const char* wiiu_joypad_name(unsigned pad) } } + if(pad < MAX_PADS){ + return "HID Controller"; + } + return "unknown"; } @@ -91,7 +104,7 @@ static void wiiu_joypad_autodetect_add(unsigned autoconf_pad) 0, 0 )) - input_config_set_device_name(autoconf_pad, wiiu_joypad_name(autoconf_pad)); + input_config_set_device_name(autoconf_pad, wiiu_joypad_name(autoconf_pad)); } static bool wiiu_joypad_button(unsigned port_num, uint16_t key) @@ -161,7 +174,6 @@ static void wiiu_joypad_poll(void) VPADStatus vpad; VPADReadError vpadError; VPADRead(0, &vpad, 1, &vpadError); - setControllerDataFromHID(&vpad); vpadError = VPAD_READ_SUCCESS; if (!vpadError) { @@ -230,11 +242,40 @@ static void wiiu_joypad_poll(void) break; } } + + memset(hid_data,0,sizeof(hid_data)); + int result = gettingInputAllDevicesEx(hid_data,HID_COUNT); + + if(result+HID_OFFSET > MAX_PADS){ + result = MAX_PADS - HID_OFFSET; + } + for(int i = HID_OFFSET;i