diff --git a/input/common/hid/device_ds3.c b/input/common/hid/device_ds3.c index 8b156d2ef5..3c1a805d60 100644 --- a/input/common/hid/device_ds3.c +++ b/input/common/hid/device_ds3.c @@ -16,38 +16,124 @@ #include "hid_device_driver.h" -struct ds3_instance { - hid_driver_t *driver; - void *handle; +#define DS3_ACTIVATION_REPORT_ID 0xf4 +#define DS3_RUMBLE_REPORT_ID 0x01 + +typedef struct ds3_instance { + void *handle; + joypad_connection_t *pad; +} ds3_instance_t; + +static uint8_t activation_packet[] = { + 0x42, 0x0c, 0x00, 0x00 }; +extern pad_connection_interface_t ds3_pad_connection; + static void *ds3_init(void *handle) { - return NULL; + ds3_instance_t *instance; + + instance = (ds3_instance_t *)calloc(1, sizeof(ds3_instance_t)); + if(!instance) + goto error; + + instance->handle = handle; + +/* TODO: do whatever is needed so that the read loop doesn't bomb out */ + + instance->pad = hid_pad_register(instance, &ds3_pad_connection); + if(!instance->pad) + goto error; + + return instance; + + error: + if(instance) + free(instance); + return NULL; } static void ds3_free(void *data) { - struct ds3_instance *instance = (struct ds3_instance *)data; - if(!instance) - return; + ds3_instance_t *instance = (ds3_instance_t *)data; - free(instance); + if(instance) + free(instance); } static void ds3_handle_packet(void *data, uint8_t *buffer, size_t size) { + ds3_instance_t *instance = (ds3_instance_t *)data; } static bool ds3_detect(uint16_t vendor_id, uint16_t product_id) { - return vendor_id == VID_SONY && product_id == PID_SONY_DS3; + return vendor_id == VID_SONY && product_id == PID_SONY_DS3; } hid_device_t ds3_hid_device = { - ds3_init, - ds3_free, - ds3_handle_packet, - ds3_detect, - "Sony DualShock 3" + ds3_init, + ds3_free, + ds3_handle_packet, + ds3_detect, + "Sony DualShock 3" +}; + +/** + * pad interface implementation + */ + +static void *ds3_pad_init(void *data, uint32_t slot, hid_driver_t *driver) +{ + return data; +} + +static void ds3_pad_deinit(void *data) +{ + ds3_instance_t *pad = (ds3_instance_t *)data; +} + +static void ds3_get_buttons(void *data, retro_bits_t *state) +{ + ds3_instance_t *pad = (ds3_instance_t *)data; +} + +static void ds3_packet_handler(void *data, uint8_t *packet, uint16_t size) +{ + ds3_instance_t *pad = (ds3_instance_t *)data; +} + +static void ds3_set_rumble(void *data, enum retro_rumble_effect effect, uint16_t strength) +{ + ds3_instance_t *pad = (ds3_instance_t *)data; +} + +static int16_t ds3_get_axis(void *data, unsigned axis) +{ + ds3_instance_t *pad = (ds3_instance_t *)data; + return 0; +} + +static const char *ds3_get_name(void *data) +{ + ds3_instance_t *pad = (ds3_instance_t *)data; + return "Sony DualShock 3"; +} + +static bool ds3_button(void *data, uint16_t joykey) +{ + ds3_instance_t *pad = (ds3_instance_t *)data; + return false; +} + +pad_connection_interface_t ds3_pad_connection = { + ds3_pad_init, + ds3_pad_deinit, + ds3_packet_handler, + ds3_set_rumble, + ds3_get_buttons, + ds3_get_axis, + ds3_get_name, + ds3_button }; diff --git a/input/common/hid/device_wiiu_gca.c b/input/common/hid/device_wiiu_gca.c index 1275c958d8..1d50c513ee 100644 --- a/input/common/hid/device_wiiu_gca.c +++ b/input/common/hid/device_wiiu_gca.c @@ -44,7 +44,6 @@ typedef struct gca_pad_data static void update_pad_state(wiiu_gca_instance_t *instance); -static joypad_connection_t *register_pad(wiiu_gca_instance_t *instance, int port); static void unregister_pad(wiiu_gca_instance_t *instance, int port); extern pad_connection_interface_t wiiu_gca_pad_connection; @@ -131,7 +130,7 @@ static void update_pad_state(wiiu_gca_instance_t *instance) if(pad == NULL) { RARCH_LOG("[gca]: Gamepad at port %d connected.\n", port+1); - instance->pads[port] = register_pad(instance, port); + instance->pads[port] = hid_pad_register(instance, &wiiu_gca_pad_connection); pad = instance->pads[port]; if(pad == NULL) { @@ -146,6 +145,7 @@ static void update_pad_state(wiiu_gca_instance_t *instance) } } +/* static joypad_connection_t *register_pad(wiiu_gca_instance_t *instance, int port) { int slot; joypad_connection_t *result; @@ -171,6 +171,7 @@ static joypad_connection_t *register_pad(wiiu_gca_instance_t *instance, int port return result; } +*/ static void unregister_pad(wiiu_gca_instance_t *instance, int slot) { diff --git a/input/common/hid/hid_device_driver.c b/input/common/hid/hid_device_driver.c index 13bbf89d40..587f0dc33d 100644 --- a/input/common/hid/hid_device_driver.c +++ b/input/common/hid/hid_device_driver.c @@ -36,12 +36,25 @@ hid_device_t *hid_device_driver_lookup(uint16_t vendor_id, uint16_t product_id) return NULL; } -void hid_pad_connect(hid_driver_instance_t *instance, int pad) +joypad_connection_t *hid_pad_register(void *pad_handle, pad_connection_interface_t *iface) { - if(!instance || !instance->pad_driver) - return; + int slot; + joypad_connection_t *result; - input_pad_connect(pad, instance->pad_driver); + if(!pad_handle) + return NULL; + + slot = pad_connection_find_vacant_pad(hid_instance.pad_list); + if(slot < 0) + return NULL; + + result = &(hid_instance.pad_list[slot]); + result->iface = iface; + result->data = iface->init(pad_handle, slot, hid_instance.os_driver); + result->connected = true; + input_pad_connect(slot, hid_instance.pad_driver); + + return result; } /** diff --git a/input/common/hid/hid_device_driver.h b/input/common/hid/hid_device_driver.h index 8cd9f19944..715fd7cfea 100644 --- a/input/common/hid/hid_device_driver.h +++ b/input/common/hid/hid_device_driver.h @@ -36,8 +36,7 @@ extern hid_device_t ds4_hid_device; extern hid_driver_instance_t hid_instance; hid_device_t *hid_device_driver_lookup(uint16_t vendor_id, uint16_t product_id); - -void hid_pad_connect(hid_driver_instance_t *instance, int pad); +joypad_connection_t *hid_pad_register(void *pad_handle, pad_connection_interface_t *iface); bool hid_init(hid_driver_instance_t *instance, hid_driver_t *hid_driver, input_device_driver_t *pad_driver, unsigned slots); void hid_deinit(hid_driver_instance_t *instance);