From 907b83065bf9eca77021a3c454e033981abffa41 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Sat, 4 Oct 2014 22:32:14 +0200 Subject: [PATCH] (pad_connection) Add pad_connection_init --- apple/iOS/bluetooth/btpad.c | 4 ---- input/apple_joypad_hid.c | 21 ++++++++++++--------- input/apple_joypad_ios.c | 11 +++++++++++ input/joypad_connection.c | 19 ++++++++++++++++++- input/joypad_connection.h | 5 +++++ 5 files changed, 46 insertions(+), 14 deletions(-) diff --git a/apple/iOS/bluetooth/btpad.c b/apple/iOS/bluetooth/btpad.c index 020e4bdb31..377ed72108 100644 --- a/apple/iOS/bluetooth/btpad.c +++ b/apple/iOS/bluetooth/btpad.c @@ -132,16 +132,12 @@ 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->slot); - for (i = 0; i < 4; i++) - apple->axes[connection->slot][i] = pad_connection_get_axis(connection->slot, i); } } break; diff --git a/input/apple_joypad_hid.c b/input/apple_joypad_hid.c index d12dcbbbb1..ea20ffe75c 100644 --- a/input/apple_joypad_hid.c +++ b/input/apple_joypad_hid.c @@ -146,17 +146,18 @@ 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->slot); - for (i = 0; i < 4; i++) - apple->axes[connection->slot][i] = pad_connection_get_axis(connection->slot, i); - } +} + +static void apple_hid_receive_control(unsigned index) +{ + int i; + apple_input_data_t *apple = (apple_input_data_t*)driver.input_data; + apple->buttons[index] = pad_connection_get_buttons(index); + for (i = 0; i < 4; i++) + apple->axes[index][i] = pad_connection_get_axis(index, i); } static void add_device(void* context, IOReturn result, @@ -257,6 +258,8 @@ static bool apple_joypad_init(void) kCFRunLoopCommonModes); IOHIDManagerOpen(g_hid_manager, kIOHIDOptionsTypeNone); + + pad_connection_init(&apple_hid_receive_control); return true; } diff --git a/input/apple_joypad_ios.c b/input/apple_joypad_ios.c index cce2d51cd0..8783040399 100644 --- a/input/apple_joypad_ios.c +++ b/input/apple_joypad_ios.c @@ -22,9 +22,20 @@ #include "../apple/iOS/bluetooth/btdynamic.c" #include "../apple/iOS/bluetooth/btpad.c" #include "../apple/iOS/bluetooth/btpad_queue.c" +#include "joypad_connection.h" + +static void apple_joypad_ios_receive_control(unsigned index) +{ + int i; + apple_input_data_t *apple = (apple_input_data_t*)driver.input_data; + apple->buttons[index] = pad_connection_get_buttons(index); + for (i = 0; i < 4; i++) + apple->axes[index][i] = pad_connection_get_axis(index, i); +} static bool apple_joypad_init(void) { + pad_connection_init(&apple_joypad_ios_receive_control); return true; } diff --git a/input/joypad_connection.c b/input/joypad_connection.c index ac2d449182..1934804f61 100644 --- a/input/joypad_connection.c +++ b/input/joypad_connection.c @@ -20,6 +20,7 @@ typedef struct { bool used; struct pad_connection_interface *iface; + receive_control_t receive_control; void* data; bool is_gcapi; @@ -36,12 +37,21 @@ static int find_vacant_pad(void) if (slots[i].used) continue; - memset(&slots[i], 0, sizeof(slots[0])); return i; } return -1; } +void pad_connection_init(receive_control_t receive_control) +{ + int i; + for (i = 0; i < MAX_PLAYERS; i++) + { + memset(&slots[i], 0, sizeof(slots[0])); + slots[i].receive_control = receive_control; + } +} + int32_t pad_connection_connect(const char* name, void *data, send_control_t ptr) { int pad = find_vacant_pad(); @@ -117,8 +127,13 @@ void pad_connection_packet(uint32_t pad, { joypad_slot_t *s = (joypad_slot_t*)&slots[pad]; + if (!s) + return; + if (s->iface && s->data && s->iface->packet_handler) s->iface->packet_handler(s->data, data, length); + if (s->receive_control) + s->receive_control(pad); } } @@ -157,6 +172,8 @@ void pad_connection_destroy(void) if (slots[i].used && slots[i].iface && slots[i].iface->set_rumble) { + slots[i].used = false; + slots[i].iface = NULL; slots[i].iface->set_rumble(slots[i].data, RETRO_RUMBLE_STRONG, 0); slots[i].iface->set_rumble(slots[i].data, RETRO_RUMBLE_WEAK, 0); } diff --git a/input/joypad_connection.h b/input/joypad_connection.h index 9aff5b1363..3435648181 100644 --- a/input/joypad_connection.h +++ b/input/joypad_connection.h @@ -21,6 +21,7 @@ #include typedef void (*send_control_t)(void *data, uint8_t *buf, size_t size); +typedef void (*receive_control_t)(unsigned index); typedef struct pad_connection_interface { @@ -40,6 +41,10 @@ int32_t pad_connection_connect(const char* name, void *data, send_control_t ptr) int32_t apple_joypad_connect_gcapi(void); +void pad_connection_init(receive_control_t receive_control); + +void pad_connection_destroy(void); + void pad_connection_disconnect(uint32_t slot); void pad_connection_packet(uint32_t slot, uint8_t* data, uint32_t length);