Set a function pointer inside each pad_connection device for
send_control
This commit is contained in:
parent
c90c2c5829
commit
8c269f119d
|
@ -50,7 +50,8 @@ static bool inquiry_off;
|
||||||
static bool inquiry_running;
|
static bool inquiry_running;
|
||||||
static struct pad_connection g_connections[MAX_PLAYERS];
|
static struct pad_connection g_connections[MAX_PLAYERS];
|
||||||
|
|
||||||
void pad_connection_send_control(void *data, uint8_t* data_buf, size_t size)
|
static void btpad_connection_send_control(void *data,
|
||||||
|
uint8_t* data_buf, size_t size)
|
||||||
{
|
{
|
||||||
struct pad_connection *connection = (struct pad_connection*)data;
|
struct pad_connection *connection = (struct pad_connection*)data;
|
||||||
|
|
||||||
|
@ -326,7 +327,7 @@ void btpad_packet_handler(uint8_t packet_type,
|
||||||
RARCH_LOG("BTpad: Got %.200s\n", (char*)&packet[9]);
|
RARCH_LOG("BTpad: Got %.200s\n", (char*)&packet[9]);
|
||||||
|
|
||||||
connection->slot = pad_connection_connect(
|
connection->slot = pad_connection_connect(
|
||||||
(char*)packet + 9, connection);
|
(char*)packet + 9, connection, btpad_connection_send_control);
|
||||||
connection->state = BTPAD_CONNECTED;
|
connection->state = BTPAD_CONNECTED;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -31,7 +31,7 @@ struct pad_connection
|
||||||
|
|
||||||
static IOHIDManagerRef g_hid_manager;
|
static IOHIDManagerRef g_hid_manager;
|
||||||
|
|
||||||
void pad_connection_send_control(void *data, uint8_t* data_buf, size_t size)
|
static void hid_pad_connection_send_control(void *data, uint8_t* data_buf, size_t size)
|
||||||
{
|
{
|
||||||
struct pad_connection* connection = (struct pad_connection*)data;
|
struct pad_connection* connection = (struct pad_connection*)data;
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ static void add_device(void* context, IOReturn result,
|
||||||
productID = (CFNumberRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductIDKey));
|
productID = (CFNumberRef)IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductIDKey));
|
||||||
CFNumberGetValue(productID, kCFNumberIntType, &connection->p_id);
|
CFNumberGetValue(productID, kCFNumberIntType, &connection->p_id);
|
||||||
|
|
||||||
connection->slot = pad_connection_connect(device_name, connection);
|
connection->slot = pad_connection_connect(device_name, connection, hid_pad_connection_send_control);
|
||||||
|
|
||||||
if (pad_connection_has_interface(connection->slot))
|
if (pad_connection_has_interface(connection->slot))
|
||||||
IOHIDDeviceRegisterInputReportCallback(device,
|
IOHIDDeviceRegisterInputReportCallback(device,
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
struct hidpad_ps3_data
|
struct hidpad_ps3_data
|
||||||
{
|
{
|
||||||
struct pad_connection* connection;
|
struct pad_connection* connection;
|
||||||
|
send_control_t send_control;
|
||||||
uint8_t data[512];
|
uint8_t data[512];
|
||||||
uint32_t slot;
|
uint32_t slot;
|
||||||
bool have_led;
|
bool have_led;
|
||||||
|
@ -49,11 +50,10 @@ static void hidpad_ps3_send_control(struct hidpad_ps3_data* device)
|
||||||
report_buffer[4] = device->motors[1] >> 8;
|
report_buffer[4] = device->motors[1] >> 8;
|
||||||
report_buffer[6] = device->motors[0] >> 8;
|
report_buffer[6] = device->motors[0] >> 8;
|
||||||
|
|
||||||
pad_connection_send_control(
|
device->send_control(device->connection, report_buffer, sizeof(report_buffer));
|
||||||
device->connection, report_buffer, sizeof(report_buffer));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void* hidpad_ps3_connect(void *connect_data, uint32_t slot)
|
static void* hidpad_ps3_connect(void *connect_data, uint32_t slot, send_control_t ptr)
|
||||||
{
|
{
|
||||||
struct pad_connection* connection = (struct pad_connection*)connect_data;
|
struct pad_connection* connection = (struct pad_connection*)connect_data;
|
||||||
struct hidpad_ps3_data* device = (struct hidpad_ps3_data*)
|
struct hidpad_ps3_data* device = (struct hidpad_ps3_data*)
|
||||||
|
@ -64,11 +64,12 @@ static void* hidpad_ps3_connect(void *connect_data, uint32_t slot)
|
||||||
|
|
||||||
device->connection = connection;
|
device->connection = connection;
|
||||||
device->slot = slot;
|
device->slot = slot;
|
||||||
|
device->send_control = ptr;
|
||||||
|
|
||||||
#ifdef IOS
|
#ifdef IOS
|
||||||
/* Magic packet to start reports. */
|
/* Magic packet to start reports. */
|
||||||
static uint8_t data[] = {0x53, 0xF4, 0x42, 0x03, 0x00, 0x00};
|
static uint8_t data[] = {0x53, 0xF4, 0x42, 0x03, 0x00, 0x00};
|
||||||
pad_connection_send_control(device->connection, data, 6);
|
device->send_control(device->connection, data, 6);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Without this, the digital buttons won't be reported. */
|
/* Without this, the digital buttons won't be reported. */
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
struct hidpad_ps4_data
|
struct hidpad_ps4_data
|
||||||
{
|
{
|
||||||
struct pad_connection* connection;
|
struct pad_connection* connection;
|
||||||
|
send_control_t send_control;
|
||||||
uint8_t data[512];
|
uint8_t data[512];
|
||||||
uint32_t slot;
|
uint32_t slot;
|
||||||
bool have_led;
|
bool have_led;
|
||||||
|
@ -43,11 +44,10 @@ static void hidpad_ps4_send_control(struct hidpad_ps4_data* device)
|
||||||
report_buffer[11] = rgb[(device->slot % 4)][2];
|
report_buffer[11] = rgb[(device->slot % 4)][2];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pad_connection_send_control(
|
device->send_control(device->connection, report_buffer, sizeof(report_buffer));
|
||||||
device->connection, report_buffer, sizeof(report_buffer));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void* hidpad_ps4_connect(void *connect_data, uint32_t slot)
|
static void* hidpad_ps4_connect(void *connect_data, uint32_t slot, send_control_t ptr)
|
||||||
{
|
{
|
||||||
uint8_t data[0x25];
|
uint8_t data[0x25];
|
||||||
struct pad_connection* connection = (struct pad_connection*)connect_data;
|
struct pad_connection* connection = (struct pad_connection*)connect_data;
|
||||||
|
@ -59,10 +59,11 @@ static void* hidpad_ps4_connect(void *connect_data, uint32_t slot)
|
||||||
|
|
||||||
device->connection = connection;
|
device->connection = connection;
|
||||||
device->slot = slot;
|
device->slot = slot;
|
||||||
|
device->send_control = ptr;
|
||||||
|
|
||||||
/* TODO - unsure of this */
|
/* TODO - unsure of this */
|
||||||
/* This is needed to get full input packet over bluetooth. */
|
/* This is needed to get full input packet over bluetooth. */
|
||||||
pad_connection_send_control(device->connection, data, 0x2);
|
device->send_control(device->connection, data, 0x2);
|
||||||
|
|
||||||
/* Without this, the digital buttons won't be reported. */
|
/* Without this, the digital buttons won't be reported. */
|
||||||
hidpad_ps4_send_control(device);
|
hidpad_ps4_send_control(device);
|
||||||
|
|
|
@ -46,7 +46,7 @@ static int wiimote_send(struct wiimote_t* wm,
|
||||||
printf("\n");
|
printf("\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pad_connection_send_control(wm->connection, buf, len + 2);
|
wm->send_control(wm->connection, buf, len + 2);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -457,7 +457,8 @@ static int wiimote_handshake(struct wiimote_t* wm, byte event, byte* data,
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void* hidpad_wii_connect(void *data, uint32_t slot)
|
static void* hidpad_wii_connect(void *data, uint32_t slot,
|
||||||
|
send_control_t ptr)
|
||||||
{
|
{
|
||||||
struct pad_connection *connection = (struct pad_connection*)data;
|
struct pad_connection *connection = (struct pad_connection*)data;
|
||||||
struct wiimote_t *device = (struct wiimote_t*)
|
struct wiimote_t *device = (struct wiimote_t*)
|
||||||
|
@ -470,6 +471,7 @@ static void* hidpad_wii_connect(void *data, uint32_t slot)
|
||||||
device->unid = slot;
|
device->unid = slot;
|
||||||
device->state = WIIMOTE_STATE_CONNECTED;
|
device->state = WIIMOTE_STATE_CONNECTED;
|
||||||
device->exp.type = EXP_NONE;
|
device->exp.type = EXP_NONE;
|
||||||
|
device->send_control = ptr;
|
||||||
|
|
||||||
wiimote_handshake(device, -1, NULL, -1);
|
wiimote_handshake(device, -1, NULL, -1);
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ static int find_vacant_pad(void)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t pad_connection_connect(const char* name, void *data)
|
int32_t pad_connection_connect(const char* name, void *data, send_control_t ptr)
|
||||||
{
|
{
|
||||||
int pad = find_vacant_pad();
|
int pad = find_vacant_pad();
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ int32_t pad_connection_connect(const char* name, void *data)
|
||||||
if (strstr(name, pad_map[i].name))
|
if (strstr(name, pad_map[i].name))
|
||||||
{
|
{
|
||||||
s->iface = pad_map[i].iface;
|
s->iface = pad_map[i].iface;
|
||||||
s->data = s->iface->connect(data, pad);
|
s->data = s->iface->connect(data, pad, ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,9 +20,11 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
typedef void (*send_control_t)(void *data, uint8_t *buf, size_t size);
|
||||||
|
|
||||||
typedef struct pad_connection_interface
|
typedef struct pad_connection_interface
|
||||||
{
|
{
|
||||||
void* (*connect)(void *data, uint32_t slot);
|
void* (*connect)(void *data, uint32_t slot, send_control_t ptr);
|
||||||
void (*disconnect)(void* device);
|
void (*disconnect)(void* device);
|
||||||
void (*packet_handler)(void* device, uint8_t *packet, uint16_t size);
|
void (*packet_handler)(void* device, uint8_t *packet, uint16_t size);
|
||||||
void (*set_rumble)(void* device, enum retro_rumble_effect effect,
|
void (*set_rumble)(void* device, enum retro_rumble_effect effect,
|
||||||
|
@ -34,7 +36,7 @@ typedef struct pad_connection_interface
|
||||||
extern pad_connection_interface_t pad_connection_wii;
|
extern pad_connection_interface_t pad_connection_wii;
|
||||||
extern pad_connection_interface_t pad_connection_ps3;
|
extern pad_connection_interface_t pad_connection_ps3;
|
||||||
|
|
||||||
int32_t pad_connection_connect(const char* name, void *data);
|
int32_t pad_connection_connect(const char* name, void *data, send_control_t ptr);
|
||||||
|
|
||||||
int32_t apple_joypad_connect_gcapi(void);
|
int32_t apple_joypad_connect_gcapi(void);
|
||||||
|
|
||||||
|
|
|
@ -173,6 +173,7 @@ typedef struct wiimote_t
|
||||||
int unid;
|
int unid;
|
||||||
|
|
||||||
struct pad_connection* connection;
|
struct pad_connection* connection;
|
||||||
|
send_control_t send_control;
|
||||||
|
|
||||||
/* Various state flags. */
|
/* Various state flags. */
|
||||||
int state;
|
int state;
|
||||||
|
|
Loading…
Reference in New Issue