diff --git a/apple/iOS/bluetooth/btpad.c b/apple/iOS/bluetooth/btpad.c index 51988f3f7f..450ad3a143 100644 --- a/apple/iOS/bluetooth/btpad.c +++ b/apple/iOS/bluetooth/btpad.c @@ -131,11 +131,17 @@ void btpad_packet_handler(uint8_t packet_type, { struct pad_connection* connection = (struct pad_connection*)&g_connections[i]; + apple_input_data_t *apple = (apple_input_data_t*)driver.input_data; if (connection && connection->state == BTPAD_CONNECTED && (connection->channels[0] == channel || connection->channels[1] == channel)) + { pad_connection_packet(connection->slot, packet, size); + apple->buttons[connection->slot] = pad_connection_get_buttons(connection->data); + for (i = 0; i < 4; i++) + apple->axes[device->slot][i] = pad_connection_get_axis(connection->data, i); + } } break; case HCI_EVENT_PACKET: diff --git a/input/apple_joypad_hid.c b/input/apple_joypad_hid.c index 62fb997fd9..5664df0f25 100644 --- a/input/apple_joypad_hid.c +++ b/input/apple_joypad_hid.c @@ -146,9 +146,17 @@ static void hid_device_report(void* context, IOReturn result, void *sender, CFIndex reportLength) { struct pad_connection* connection = (struct pad_connection*)context; + apple_input_data_t *apple = (apple_input_data_t*)driver.input_data; + + if (connection && apple) + { + int i; - if (connection) pad_connection_packet(connection->slot, connection->data, reportLength + 1); + apple->buttons[connection->slot] = pad_connection_get_buttons(connection->data); + for (i = 0; i < 4; i++) + apple->axes[device->slot][i] = pad_connection_get_axis(connection->data, i); + } } static void add_device(void* context, IOReturn result, diff --git a/input/apple_joypad_ps3.c b/input/apple_joypad_ps3.c index c0cea59fa6..07df538639 100644 --- a/input/apple_joypad_ps3.c +++ b/input/apple_joypad_ps3.c @@ -136,11 +136,9 @@ static int16_t hidpad_ps3_get_axis(void *data, unsigned axis) static void hidpad_ps3_packet_handler(void *data, uint8_t *packet, uint16_t size) { - int i; - apple_input_data_t *apple = (apple_input_data_t*)driver.input_data; struct hidpad_ps3_data *device = (struct hidpad_ps3_data*)data; - if (!device || !apple) + if (!device) return; if (!device->have_led) @@ -150,10 +148,6 @@ static void hidpad_ps3_packet_handler(void *data, uint8_t *packet, uint16_t size } memcpy(device->data, packet, size); - - apple->buttons[device->slot] = hidpad_ps3_get_buttons(device); - for (i = 0; i < 4; i ++) - apple->axes[device->slot][i] = hidpad_ps3_get_axis(device, i); } static void hidpad_ps3_set_rumble(void *data, @@ -173,5 +167,7 @@ pad_connection_interface_t apple_pad_ps3 = { hidpad_ps3_connect, hidpad_ps3_disconnect, hidpad_ps3_packet_handler, - hidpad_ps3_set_rumble + hidpad_ps3_set_rumble, + hidpad_ps3_get_buttons, + hidpad_ps3_get_axis, }; diff --git a/input/apple_joypad_ps4.c b/input/apple_joypad_ps4.c index d9cf3ef702..2a7becb4df 100644 --- a/input/apple_joypad_ps4.c +++ b/input/apple_joypad_ps4.c @@ -137,10 +137,9 @@ static int16_t hidpad_ps4_get_axis(void *data, unsigned axis) static void hidpad_ps4_packet_handler(void *data, uint8_t *packet, uint16_t size) { int i; - apple_input_data_t *apple = (apple_input_data_t*)driver.input_data; struct hidpad_ps4_data *device = (struct hidpad_ps4_data*)data; - if (!device || !apple) + if (!device) return; (void)i; @@ -154,12 +153,6 @@ static void hidpad_ps4_packet_handler(void *data, uint8_t *packet, uint16_t size #endif memcpy(device->data, packet, size); - - apple->buttons[device->slot] = hidpad_ps4_get_buttons(device); -#if 0 - for (i = 0; i < 4; i ++) - g_current_input_data.axes[device->slot][i] = hidpad_ps4_get_axis(device, i); -#endif } static void hidpad_ps4_set_rumble(void *data, diff --git a/input/apple_joypad_wii.c b/input/apple_joypad_wii.c index 49b1afe371..b4da7d8529 100644 --- a/input/apple_joypad_wii.c +++ b/input/apple_joypad_wii.c @@ -69,15 +69,22 @@ static int16_t hidpad_wii_get_axis(void *data, unsigned axis) return 0; } +static uint32_t hidpad_wii_get_buttons(void *data) +{ + struct wiimote_t* device = (struct wiimote_t*)data; + if (device) + return device->btns | (device->exp.cc.classic.btns << 16); + return 0; +} + static void hidpad_wii_packet_handler(void *data, uint8_t *packet, uint16_t size) { int i; - apple_input_data_t *apple = (apple_input_data_t*)driver.input_data; struct wiimote_t* device = (struct wiimote_t*)data; byte* msg = packet + 2; - if (!device || !apple) + if (!device) return; switch (packet[1]) @@ -99,12 +106,6 @@ static void hidpad_wii_packet_handler(void *data, wiimote_handle_expansion(device, msg+2); break; } - - apple->buttons[device->unid] = device->btns | - (device->exp.cc.classic.btns << 16); - - for (i = 0; i < 4; i++) - apple->axes[device->unid][i] = hidpad_wii_get_axis(device, i); } static void hidpad_wii_set_rumble(void *data, @@ -120,5 +121,7 @@ pad_connection_interface_t apple_pad_wii = { hidpad_wii_connect, hidpad_wii_disconnect, hidpad_wii_packet_handler, - hidpad_wii_set_rumble + hidpad_wii_set_rumble, + hidpad_wii_get_buttons, + hidpad_wii_get_axis, }; diff --git a/input/joypad_connection.c b/input/joypad_connection.c index 3ac154a348..200ab2a2a8 100644 --- a/input/joypad_connection.c +++ b/input/joypad_connection.c @@ -60,8 +60,10 @@ int32_t pad_connection_connect(const char* name, void *data) } pad_map[] = { { "Nintendo RVL-CNT-01", &apple_pad_wii }, - /* { "Nintendo RVL-CNT-01-UC", &apple_pad_wii }, */ /* WiiU */ - /* { "Wireless Controller", &apple_pad_ps4 }, */ /* DualShock4 */ +#if 0 + { "Nintendo RVL-CNT-01-UC", &apple_pad_wii_u }, + { "Wireless Controller", &apple_pad_ps4 }, +#endif { "PLAYSTATION(R)3 Controller", &apple_pad_ps3 }, { 0, 0} }; @@ -120,6 +122,24 @@ void pad_connection_packet(uint32_t pad, } } +uint32_t pad_connection_get_buttons(void *data, unsigned index) +{ + joypad_slot_t *s = (joypad_slot_t*)&slots[index]; + + if (s && s->iface && s->data) + return s->iface->get_buttons(s->data, index); + return 0; +} + +int16_t pad_connection_get_axis(void *data, unsigned index, unsigned i) +{ + joypad_slot_t *s = (joypad_slot_t*)&slots[index]; + + if (s && s->iface && s->data) + return s->iface->get_axis(s->data, index, i); + return 0; +} + bool pad_connection_has_interface(uint32_t pad) { if (pad < MAX_PLAYERS && slots[pad].used) diff --git a/input/joypad_connection.h b/input/joypad_connection.h index 62e8054b3e..e450a06f9c 100644 --- a/input/joypad_connection.h +++ b/input/joypad_connection.h @@ -22,14 +22,13 @@ typedef struct pad_connection_interface { - void* (*connect)(void *data, uint32_t slot); - - void (*disconnect)(void* device); - - void (*packet_handler)(void* device, uint8_t *packet, uint16_t size); - - void (*set_rumble)(void* device, enum retro_rumble_effect effect, + void* (*connect)(void *data, uint32_t slot); + void (*disconnect)(void* device); + void (*packet_handler)(void* device, uint8_t *packet, uint16_t size); + void (*set_rumble)(void* device, enum retro_rumble_effect effect, uint16_t strength); + uint32_t (*get_buttons)(void *data); + int16_t (*get_axis)(void *data, unsigned axis); } pad_connection_interface_t; extern pad_connection_interface_t apple_pad_wii; @@ -43,6 +42,10 @@ void pad_connection_disconnect(uint32_t slot); void pad_connection_packet(uint32_t slot, uint8_t* data, uint32_t length); +uint32_t pad_connection_get_buttons(void *data); + +int16_t pad_connection_get_axis(void *data, unsigned i); + /* Determine if connected joypad is a hidpad backed device. * If false, pad_connection_packet cannot be used */