diff --git a/input/connect/joypad_connection.c b/input/connect/joypad_connection.c index dcc6000bdf..b1f9a360c7 100644 --- a/input/connect/joypad_connection.c +++ b/input/connect/joypad_connection.c @@ -42,11 +42,28 @@ int pad_connection_find_vacant_pad(joypad_connection_t *joyconn) return -1; } +static void set_end_of_list(joypad_connection_t *list, unsigned end) +{ + joypad_connection_t *entry = (joypad_connection_t *)&list[end]; + entry->connected = false; + entry->iface = NULL; + entry->data = (void *)0xdeadbeef; +} + +static bool joypad_is_end_of_list(joypad_connection_t *pad) { + return pad && !pad->connected && !pad->iface && pad->data == (void *)0xdeadbeef; +} + +/** + * Since the pad_connection_destroy() call needs to iterate through this + * list, we allocate pads+1 entries and use the extra spot to store a + * marker. + */ joypad_connection_t *pad_connection_init(unsigned pads) { unsigned i; joypad_connection_t *joyconn = (joypad_connection_t*) - calloc(pads, sizeof(joypad_connection_t)); + calloc(pads+1, sizeof(joypad_connection_t)); if (!joyconn) return NULL; @@ -60,6 +77,8 @@ joypad_connection_t *pad_connection_init(unsigned pads) conn->data = NULL; } + set_end_of_list(joyconn, pads); + return joyconn; } @@ -208,7 +227,12 @@ void pad_connection_destroy(joypad_connection_t *joyconn) unsigned i; for (i = 0; i < MAX_USERS; i ++) - pad_connection_pad_deinit(&joyconn[i], i); + { + if(joypad_is_end_of_list(&joyconn[i])) + break; + + pad_connection_pad_deinit(&joyconn[i], i); + } free(joyconn); } diff --git a/input/drivers/wiiu_input.c b/input/drivers/wiiu_input.c index 4dee87a4bb..0017f8d633 100644 --- a/input/drivers/wiiu_input.c +++ b/input/drivers/wiiu_input.c @@ -44,7 +44,6 @@ typedef struct wiiu_input { bool blocked; const input_device_driver_t *joypad; - const hid_driver_t *hid_joypad; } wiiu_input_t; void kb_connection_callback(KBDKeyEvent *key) @@ -126,8 +125,6 @@ static void wiiu_input_poll(void *data) if(wiiu->joypad) wiiu->joypad->poll(); - if(wiiu->hid_joypad) - wiiu->hid_joypad->poll(hid_driver_get_data()); } static bool wiiu_key_pressed(int key) @@ -181,12 +178,6 @@ static void wiiu_input_free_input(void *data) if (wiiu && wiiu->joypad) wiiu->joypad->destroy(); - if (wiiu && wiiu->hid_joypad) - { - wiiu->hid_joypad->free(hid_driver_get_data()); - hid_driver_reset_data(); - } - KBDTeardown(); free(data); @@ -200,7 +191,6 @@ static void* wiiu_input_init(const char *joypad_driver) DEBUG_STR(joypad_driver); wiiu->joypad = input_joypad_init_driver(joypad_driver, wiiu); - wiiu->hid_joypad = input_hid_init_first(); KBDSetup(&kb_connection_callback, &kb_disconnection_callback,&kb_key_callback); diff --git a/input/drivers_hid/btstack_hid.c b/input/drivers_hid/btstack_hid.c index dc6ea0b645..1d277484aa 100644 --- a/input/drivers_hid/btstack_hid.c +++ b/input/drivers_hid/btstack_hid.c @@ -1424,7 +1424,7 @@ static int16_t btstack_hid_joypad_axis(void *data, unsigned port, uint32_t joyax return val; } -static void btstack_hid_free(void *data) +static void btstack_hid_free(const void *data) { btstack_hid_t *hid = (btstack_hid_t*)data; diff --git a/input/drivers_hid/iohidmanager_hid.c b/input/drivers_hid/iohidmanager_hid.c index 2aa88b3a86..98a53901db 100644 --- a/input/drivers_hid/iohidmanager_hid.c +++ b/input/drivers_hid/iohidmanager_hid.c @@ -830,7 +830,7 @@ error: return NULL; } -static void iohidmanager_hid_free(void *data) +static void iohidmanager_hid_free(const void *data) { iohidmanager_hid_t *hid_apple = (iohidmanager_hid_t*)data; diff --git a/input/drivers_hid/libusb_hid.c b/input/drivers_hid/libusb_hid.c index a28ee4d96e..44580359fa 100644 --- a/input/drivers_hid/libusb_hid.c +++ b/input/drivers_hid/libusb_hid.c @@ -509,7 +509,7 @@ static int16_t libusb_hid_joypad_axis(void *data, return val; } -static void libusb_hid_free(void *data) +static void libusb_hid_free(const void *data) { libusb_hid_t *hid = (libusb_hid_t*)data; diff --git a/input/drivers_hid/null_hid.c b/input/drivers_hid/null_hid.c index ce657d8b90..70a34d4bf8 100644 --- a/input/drivers_hid/null_hid.c +++ b/input/drivers_hid/null_hid.c @@ -80,7 +80,7 @@ static void *null_hid_init(void) return (null_hid_t*)calloc(1, sizeof(null_hid_t)); } -static void null_hid_free(void *data) +static void null_hid_free(const void *data) { null_hid_t *hid_null = (null_hid_t*)data; diff --git a/input/drivers_hid/wiiu_hid.c b/input/drivers_hid/wiiu_hid.c index a08937e628..5a61f2273e 100644 --- a/input/drivers_hid/wiiu_hid.c +++ b/input/drivers_hid/wiiu_hid.c @@ -111,7 +111,7 @@ static void *wiiu_hid_init(void) return NULL; } -static void wiiu_hid_free(void *data) +static void wiiu_hid_free(const void *data) { wiiu_hid_t *hid = (wiiu_hid_t*)data; diff --git a/input/drivers_hid/wiiusb_hid.c b/input/drivers_hid/wiiusb_hid.c index 031e54db8c..397f0a0a64 100644 --- a/input/drivers_hid/wiiusb_hid.c +++ b/input/drivers_hid/wiiusb_hid.c @@ -546,7 +546,7 @@ static int16_t wiiusb_hid_joypad_axis(void *data, return val; } -static void wiiusb_hid_free(void *data) +static void wiiusb_hid_free(const void *data) { struct wiiusb_adapter *adapter = NULL; struct wiiusb_adapter *next_adapter = NULL; diff --git a/input/input_driver.h b/input/input_driver.h index 38d1401d67..f9795e087a 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -185,7 +185,7 @@ struct hid_driver { void *(*init)(void); bool (*query_pad)(void *, unsigned); - void (*free)(void *); + void (*free)(const void *); bool (*button)(void *, unsigned, uint16_t); void (*get_buttons)(void *, unsigned, retro_bits_t *); int16_t (*axis)(void *, unsigned, uint32_t); diff --git a/wiiu/include/wiiu/pad_driver.h b/wiiu/include/wiiu/pad_driver.h index c91104c249..9cdcb47f41 100644 --- a/wiiu/include/wiiu/pad_driver.h +++ b/wiiu/include/wiiu/pad_driver.h @@ -69,6 +69,18 @@ // wiimote not attached on this channel #define WIIMOTE_TYPE_NONE 0xFD +/** + * These are used to map pad names to controller mappings. You can + * change these relatively free-form. + */ + +#define PAD_NAME_WIIU_GAMEPAD "WiiU Gamepad" +#define PAD_NAME_WIIU_PRO "WiiU Pro Controller" +#define PAD_NAME_WIIMOTE "Wiimote Controller" +#define PAD_NAME_NUNCHUK "Wiimote+Nunchuk Controller" +#define PAD_NAME_CLASSIC "Classic Controller" +#define PAD_NAME_HID "HID Controller" + /** * The Wii U gamepad and wiimotes have 3 sets of x/y axes. The third * is used by the gamepad for the touchpad driver; the wiimotes is @@ -95,6 +107,7 @@ struct _wiiu_pad_functions { }; extern wiiu_pad_functions_t pad_functions; +extern input_device_driver_t wiiu_joypad; extern input_device_driver_t wpad_driver; extern input_device_driver_t kpad_driver; extern input_device_driver_t hidpad_driver;