(input/connect) Cleanups
This commit is contained in:
parent
94ca700059
commit
824f00be15
|
@ -57,6 +57,10 @@ static void hidpad_ps3_send_control(struct hidpad_ps3_data* device)
|
||||||
|
|
||||||
static void* hidpad_ps3_init(void *data, uint32_t slot, send_control_t ptr)
|
static void* hidpad_ps3_init(void *data, uint32_t slot, send_control_t ptr)
|
||||||
{
|
{
|
||||||
|
#ifdef IOS
|
||||||
|
/* Magic packet to start reports. */
|
||||||
|
static uint8_t magic_data[] = {0x53, 0xF4, 0x42, 0x03, 0x00, 0x00};
|
||||||
|
#endif
|
||||||
struct pad_connection* connection = (struct pad_connection*)data;
|
struct pad_connection* connection = (struct pad_connection*)data;
|
||||||
struct hidpad_ps3_data* device = (struct hidpad_ps3_data*)
|
struct hidpad_ps3_data* device = (struct hidpad_ps3_data*)
|
||||||
calloc(1, sizeof(struct hidpad_ps3_data));
|
calloc(1, sizeof(struct hidpad_ps3_data));
|
||||||
|
@ -75,8 +79,6 @@ static void* hidpad_ps3_init(void *data, uint32_t slot, send_control_t ptr)
|
||||||
device->send_control = ptr;
|
device->send_control = ptr;
|
||||||
|
|
||||||
#ifdef IOS
|
#ifdef IOS
|
||||||
/* Magic packet to start reports. */
|
|
||||||
static uint8_t magic_data[] = {0x53, 0xF4, 0x42, 0x03, 0x00, 0x00};
|
|
||||||
device->send_control(device->connection, magic_data, 6);
|
device->send_control(device->connection, magic_data, 6);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -97,23 +99,23 @@ static void hidpad_ps3_deinit(void *data)
|
||||||
static uint32_t hidpad_ps3_get_buttons(void *data)
|
static uint32_t hidpad_ps3_get_buttons(void *data)
|
||||||
{
|
{
|
||||||
struct hidpad_ps3_data *device = (struct hidpad_ps3_data*)data;
|
struct hidpad_ps3_data *device = (struct hidpad_ps3_data*)data;
|
||||||
if (device)
|
if (!device)
|
||||||
return device->buttons;
|
return 0;
|
||||||
return 0;
|
return device->buttons;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int16_t hidpad_ps3_get_axis(void *data, unsigned axis)
|
static int16_t hidpad_ps3_get_axis(void *data, unsigned axis)
|
||||||
{
|
{
|
||||||
|
int val;
|
||||||
struct hidpad_ps3_data *device = (struct hidpad_ps3_data*)data;
|
struct hidpad_ps3_data *device = (struct hidpad_ps3_data*)data;
|
||||||
|
|
||||||
if (device && (axis < 4))
|
|
||||||
{
|
|
||||||
int val = device->data[7 + axis];
|
|
||||||
val = (val << 8) - 0x8000;
|
|
||||||
return (abs(val) > 0x1000) ? val : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
if (!device || axis >= 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
val = device->data[7 + axis];
|
||||||
|
val = (val << 8) - 0x8000;
|
||||||
|
|
||||||
|
return (abs(val) > 0x1000) ? val : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hidpad_ps3_packet_handler(void *data, uint8_t *packet, uint16_t size)
|
static void hidpad_ps3_packet_handler(void *data, uint8_t *packet, uint16_t size)
|
||||||
|
@ -168,11 +170,13 @@ static void hidpad_ps3_set_rumble(void *data,
|
||||||
struct hidpad_ps3_data *device = (struct hidpad_ps3_data*)data;
|
struct hidpad_ps3_data *device = (struct hidpad_ps3_data*)data;
|
||||||
unsigned idx = (effect == RETRO_RUMBLE_STRONG) ? 0 : 1;
|
unsigned idx = (effect == RETRO_RUMBLE_STRONG) ? 0 : 1;
|
||||||
|
|
||||||
if (device && (device->motors[idx] != strength))
|
if (!device)
|
||||||
{
|
return;
|
||||||
device->motors[idx] = strength;
|
if ((device->motors[idx] == strength))
|
||||||
hidpad_ps3_send_control(device);
|
return;
|
||||||
}
|
|
||||||
|
device->motors[idx] = strength;
|
||||||
|
hidpad_ps3_send_control(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
pad_connection_interface_t pad_connection_ps3 = {
|
pad_connection_interface_t pad_connection_ps3 = {
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <retro_miscellaneous.h>
|
||||||
|
|
||||||
#include "connect_wii.h"
|
#include "connect_wii.h"
|
||||||
#include "joypad_connection.h"
|
#include "joypad_connection.h"
|
||||||
|
@ -29,8 +30,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int wiimote_send(struct wiimote_t* wm,
|
static int wiimote_send(struct wiimote_t* wm,
|
||||||
byte report_type, byte* msg, int len)
|
byte report_type, byte* msg, int len)
|
||||||
{
|
{
|
||||||
|
int x = 2;
|
||||||
byte buf[32];
|
byte buf[32];
|
||||||
|
|
||||||
buf[0] = WM_SET_REPORT | WM_BT_OUTPUT;
|
buf[0] = WM_SET_REPORT | WM_BT_OUTPUT;
|
||||||
|
@ -39,7 +41,6 @@ static int wiimote_send(struct wiimote_t* wm,
|
||||||
memcpy(buf+2, msg, len);
|
memcpy(buf+2, msg, len);
|
||||||
|
|
||||||
#ifdef WIIMOTE_DBG
|
#ifdef WIIMOTE_DBG
|
||||||
int x = 2;
|
|
||||||
printf("[DEBUG] (id %i) SEND: (%x) %.2x ", wm->unid, buf[0], buf[1]);
|
printf("[DEBUG] (id %i) SEND: (%x) %.2x ", wm->unid, buf[0], buf[1]);
|
||||||
for (; x < len+2; ++x)
|
for (; x < len+2; ++x)
|
||||||
printf("%.2x ", buf[x]);
|
printf("%.2x ", buf[x]);
|
||||||
|
@ -55,7 +56,6 @@ static int wiimote_send(struct wiimote_t* wm,
|
||||||
*
|
*
|
||||||
* Controller status includes: battery level, LED status, expansions.
|
* Controller status includes: battery level, LED status, expansions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void wiimote_status(struct wiimote_t* wm)
|
static void wiimote_status(struct wiimote_t* wm)
|
||||||
{
|
{
|
||||||
byte buf = 0;
|
byte buf = 0;
|
||||||
|
@ -122,7 +122,7 @@ static void wiimote_pressed_buttons(struct wiimote_t* wm, byte* msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int classic_ctrl_handshake(struct wiimote_t* wm,
|
static int classic_ctrl_handshake(struct wiimote_t* wm,
|
||||||
struct classic_ctrl_t* cc, byte* data, unsigned short len)
|
struct classic_ctrl_t* cc, byte* data, unsigned short len)
|
||||||
{
|
{
|
||||||
memset(cc, 0, sizeof(*cc));
|
memset(cc, 0, sizeof(*cc));
|
||||||
wm->exp.type = EXP_CLASSIC;
|
wm->exp.type = EXP_CLASSIC;
|
||||||
|
@ -131,7 +131,9 @@ static int classic_ctrl_handshake(struct wiimote_t* wm,
|
||||||
|
|
||||||
static float normalize_and_interpolate(float min, float max, float t)
|
static float normalize_and_interpolate(float min, float max, float t)
|
||||||
{
|
{
|
||||||
return (min == max) ? 0.0f : (t - min) / (max - min);
|
if (min == max)
|
||||||
|
return 0.0f;
|
||||||
|
return (t - min) / (max - min);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_axis(struct axis_t* axis, byte raw)
|
static void process_axis(struct axis_t* axis, byte raw)
|
||||||
|
@ -192,6 +194,7 @@ static void wiimote_handle_expansion(struct wiimote_t* wm, byte* msg)
|
||||||
static int wiimote_write_data(struct wiimote_t* wm,
|
static int wiimote_write_data(struct wiimote_t* wm,
|
||||||
unsigned int addr, byte* data, byte len)
|
unsigned int addr, byte* data, byte len)
|
||||||
{
|
{
|
||||||
|
int i = 0;
|
||||||
byte buf[21] = {0}; /* the payload is always 23 */
|
byte buf[21] = {0}; /* the payload is always 23 */
|
||||||
|
|
||||||
if (!wm || !WIIMOTE_IS_CONNECTED(wm))
|
if (!wm || !WIIMOTE_IS_CONNECTED(wm))
|
||||||
|
@ -201,8 +204,6 @@ static int wiimote_write_data(struct wiimote_t* wm,
|
||||||
|
|
||||||
#ifdef WIIMOTE_DBG
|
#ifdef WIIMOTE_DBG
|
||||||
printf("Writing %i bytes to memory location 0x%x...\n", len, addr);
|
printf("Writing %i bytes to memory location 0x%x...\n", len, addr);
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
printf("Write data is: ");
|
printf("Write data is: ");
|
||||||
for (; i < len; ++i)
|
for (; i < len; ++i)
|
||||||
printf("%x ", data[i]);
|
printf("%x ", data[i]);
|
||||||
|
@ -244,7 +245,7 @@ static int wiimote_read_data(struct wiimote_t* wm, unsigned int addr,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* the offset is in big endian */
|
/* the offset is in big endian */
|
||||||
*(int*)(buf) = BIG_ENDIAN_LONG(addr);
|
*(int*)(buf) = BIG_ENDIAN_LONG(addr);
|
||||||
|
|
||||||
/* the length is in big endian */
|
/* the length is in big endian */
|
||||||
*(short*)(buf + 4) = BIG_ENDIAN_SHORT(len);
|
*(short*)(buf + 4) = BIG_ENDIAN_SHORT(len);
|
||||||
|
@ -342,12 +343,12 @@ static int wiimote_handshake(struct wiimote_t* wm, byte event, byte* data,
|
||||||
* 0x00 to 0x(4)A400FB. (support clones) */
|
* 0x00 to 0x(4)A400FB. (support clones) */
|
||||||
buf = 0x55;
|
buf = 0x55;
|
||||||
wiimote_write_data(wm, 0x04A400F0, &buf, 1);
|
wiimote_write_data(wm, 0x04A400F0, &buf, 1);
|
||||||
usleep(100000);
|
retro_sleep(100000);
|
||||||
buf = 0x00;
|
buf = 0x00;
|
||||||
wiimote_write_data(wm, 0x04A400FB, &buf, 1);
|
wiimote_write_data(wm, 0x04A400FB, &buf, 1);
|
||||||
|
|
||||||
/* check extension type! */
|
/* check extension type! */
|
||||||
usleep(100000);
|
retro_sleep(100000);
|
||||||
wiimote_read_data(wm, WM_EXP_MEM_CALIBR+220, 4);
|
wiimote_read_data(wm, WM_EXP_MEM_CALIBR+220, 4);
|
||||||
#if 0
|
#if 0
|
||||||
wiimote_read_data(wm, WM_EXP_MEM_CALIBR, EXP_HANDSHAKE_LEN);
|
wiimote_read_data(wm, WM_EXP_MEM_CALIBR, EXP_HANDSHAKE_LEN);
|
||||||
|
@ -399,32 +400,34 @@ static int wiimote_handshake(struct wiimote_t* wm, byte event, byte* data,
|
||||||
wm->handshake_state = 6;
|
wm->handshake_state = 6;
|
||||||
continue;
|
continue;
|
||||||
case 4:
|
case 4:
|
||||||
if(event != WM_RPT_READ)
|
{
|
||||||
return 0;
|
int id;
|
||||||
|
if(event != WM_RPT_READ)
|
||||||
|
return 0;
|
||||||
|
|
||||||
int id = BIG_ENDIAN_LONG(*(int*)(data));
|
id = BIG_ENDIAN_LONG(*(int*)(data));
|
||||||
|
|
||||||
#ifdef WIIMOTE_DBG
|
#ifdef WIIMOTE_DBG
|
||||||
printf("Expansion id=0x%04x\n",id);
|
printf("Expansion id=0x%04x\n",id);
|
||||||
#endif
|
#endif
|
||||||
/* EXP_ID_CODE_CLASSIC_CONTROLLER */
|
/* EXP_ID_CODE_CLASSIC_CONTROLLER */
|
||||||
|
|
||||||
if(id != 0xa4200101)
|
if(id != 0xa4200101)
|
||||||
{
|
{
|
||||||
wm->handshake_state = 2;
|
wm->handshake_state = 2;
|
||||||
#if 0
|
#if 0
|
||||||
WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_EXP);
|
WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_EXP);
|
||||||
#endif
|
#endif
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retro_sleep(100000);
|
||||||
|
/* pedimos datos de calibracion del JOY! */
|
||||||
|
wiimote_read_data(wm, WM_EXP_MEM_CALIBR, 16);
|
||||||
|
wm->handshake_state = 5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
usleep(100000);
|
|
||||||
/* pedimos datos de calibracion del JOY! */
|
|
||||||
wiimote_read_data(wm, WM_EXP_MEM_CALIBR, 16);
|
|
||||||
wm->handshake_state = 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
case 5:
|
case 5:
|
||||||
if(event != WM_RPT_READ)
|
if(event != WM_RPT_READ)
|
||||||
|
@ -458,7 +461,7 @@ static int wiimote_handshake(struct wiimote_t* wm, byte event, byte* data,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void* hidpad_wii_init(void *data, uint32_t slot,
|
static void* hidpad_wii_init(void *data, uint32_t slot,
|
||||||
send_control_t ptr)
|
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*)
|
||||||
|
@ -517,9 +520,9 @@ static int16_t hidpad_wii_get_axis(void *data, unsigned axis)
|
||||||
static uint32_t hidpad_wii_get_buttons(void *data)
|
static uint32_t hidpad_wii_get_buttons(void *data)
|
||||||
{
|
{
|
||||||
struct wiimote_t* device = (struct wiimote_t*)data;
|
struct wiimote_t* device = (struct wiimote_t*)data;
|
||||||
if (device)
|
if (!device)
|
||||||
return device->btns | (device->exp.cc.classic.btns << 16);
|
return 0;
|
||||||
return 0;
|
return device->btns | (device->exp.cc.classic.btns << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hidpad_wii_packet_handler(void *data,
|
static void hidpad_wii_packet_handler(void *data,
|
||||||
|
|
|
@ -26,27 +26,30 @@ static int find_vacant_pad(joypad_connection_t *joyconn)
|
||||||
if (conn && !conn->used)
|
if (conn && !conn->used)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *pad_connection_init(unsigned pads)
|
void *pad_connection_init(unsigned pads)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
joypad_connection_t *joyconn = (joypad_connection_t*)
|
joypad_connection_t *joyconn = (joypad_connection_t*)
|
||||||
calloc(pads, sizeof(*joyconn));
|
calloc(pads, sizeof(*joyconn));
|
||||||
if (!joyconn)
|
|
||||||
return NULL;
|
if (!joyconn)
|
||||||
|
return NULL;
|
||||||
for (i = 0; i < pads; i++)
|
|
||||||
{
|
for (i = 0; i < pads; i++)
|
||||||
joypad_connection_t *conn = (joypad_connection_t*)&joyconn[i];
|
{
|
||||||
conn->used = false;
|
joypad_connection_t *conn = (joypad_connection_t*)&joyconn[i];
|
||||||
conn->iface = NULL;
|
|
||||||
conn->is_gcapi = false;
|
conn->used = false;
|
||||||
conn->data = NULL;
|
conn->iface = NULL;
|
||||||
}
|
conn->is_gcapi = false;
|
||||||
|
conn->data = NULL;
|
||||||
return joyconn;
|
}
|
||||||
|
|
||||||
|
return joyconn;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t pad_connection_pad_init(joypad_connection_t *joyconn,
|
int32_t pad_connection_pad_init(joypad_connection_t *joyconn,
|
||||||
|
@ -97,8 +100,8 @@ int32_t apple_joypad_connect_gcapi(joypad_connection_t *joyconn)
|
||||||
|
|
||||||
if (s)
|
if (s)
|
||||||
{
|
{
|
||||||
s->used = true;
|
s->used = true;
|
||||||
s->is_gcapi = true;
|
s->is_gcapi = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,17 +113,17 @@ void pad_connection_pad_deinit(joypad_connection_t *s, uint32_t pad)
|
||||||
if (!s || !s->used)
|
if (!s || !s->used)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (s->iface)
|
if (s->iface)
|
||||||
{
|
{
|
||||||
s->iface->set_rumble(s->data, RETRO_RUMBLE_STRONG, 0);
|
s->iface->set_rumble(s->data, RETRO_RUMBLE_STRONG, 0);
|
||||||
s->iface->set_rumble(s->data, RETRO_RUMBLE_WEAK, 0);
|
s->iface->set_rumble(s->data, RETRO_RUMBLE_WEAK, 0);
|
||||||
if (s->iface->deinit)
|
if (s->iface->deinit)
|
||||||
s->iface->deinit(s->data);
|
s->iface->deinit(s->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
s->iface = NULL;
|
s->iface = NULL;
|
||||||
s->used = false;
|
s->used = false;
|
||||||
s->is_gcapi = false;
|
s->is_gcapi = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pad_connection_packet(joypad_connection_t *s, uint32_t pad,
|
void pad_connection_packet(joypad_connection_t *s, uint32_t pad,
|
||||||
|
@ -135,17 +138,17 @@ void pad_connection_packet(joypad_connection_t *s, uint32_t pad,
|
||||||
|
|
||||||
uint32_t pad_connection_get_buttons(joypad_connection_t *s, unsigned pad)
|
uint32_t pad_connection_get_buttons(joypad_connection_t *s, unsigned pad)
|
||||||
{
|
{
|
||||||
if (s->iface)
|
if (!s->iface)
|
||||||
return s->iface->get_buttons(s->data);
|
return 0;
|
||||||
return 0;
|
return s->iface->get_buttons(s->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t pad_connection_get_axis(joypad_connection_t *s,
|
int16_t pad_connection_get_axis(joypad_connection_t *s,
|
||||||
unsigned idx, unsigned i)
|
unsigned idx, unsigned i)
|
||||||
{
|
{
|
||||||
if (s->iface)
|
if (!s->iface)
|
||||||
return s->iface->get_axis(s->data, i);
|
return 0;
|
||||||
return 0;
|
return s->iface->get_axis(s->data, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pad_connection_has_interface(joypad_connection_t *s, unsigned pad)
|
bool pad_connection_has_interface(joypad_connection_t *s, unsigned pad)
|
||||||
|
@ -169,11 +172,13 @@ void pad_connection_destroy(joypad_connection_t *joyconn)
|
||||||
bool pad_connection_rumble(joypad_connection_t *s,
|
bool pad_connection_rumble(joypad_connection_t *s,
|
||||||
unsigned pad, enum retro_rumble_effect effect, uint16_t strength)
|
unsigned pad, enum retro_rumble_effect effect, uint16_t strength)
|
||||||
{
|
{
|
||||||
if (s->used && s->iface && s->iface->set_rumble)
|
if (!s->used)
|
||||||
{
|
return false;
|
||||||
s->iface->set_rumble(s->data, effect, strength);
|
if (!s->iface)
|
||||||
return true;
|
return false;
|
||||||
}
|
if (!s->iface->set_rumble)
|
||||||
|
return;
|
||||||
|
|
||||||
return false;
|
s->iface->set_rumble(s->data, effect, strength);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,73 +48,71 @@ static void hid_pad_connection_send_control(void *data, uint8_t* data_buf, size_
|
||||||
static void hid_device_input_callback(void* context, IOReturn result,
|
static void hid_device_input_callback(void* context, IOReturn result,
|
||||||
void* sender, IOHIDValueRef value)
|
void* sender, IOHIDValueRef value)
|
||||||
{
|
{
|
||||||
apple_input_data_t *apple = (apple_input_data_t*)driver.input_data;
|
apple_input_data_t *apple = (apple_input_data_t*)driver.input_data;
|
||||||
struct pad_connection* connection = (struct pad_connection*)context;
|
struct pad_connection* connection = (struct pad_connection*)context;
|
||||||
IOHIDElementRef element = IOHIDValueGetElement(value);
|
IOHIDElementRef element = IOHIDValueGetElement(value);
|
||||||
uint32_t type = IOHIDElementGetType(element);
|
uint32_t type = IOHIDElementGetType(element);
|
||||||
uint32_t page = IOHIDElementGetUsagePage(element);
|
uint32_t page = IOHIDElementGetUsagePage(element);
|
||||||
uint32_t use = IOHIDElementGetUsage(element);
|
uint32_t use = IOHIDElementGetUsage(element);
|
||||||
|
|
||||||
|
if (type != kIOHIDElementTypeInput_Misc)
|
||||||
|
if (type != kIOHIDElementTypeInput_Button)
|
||||||
|
if (type != kIOHIDElementTypeInput_Axis)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Joystick handler.
|
/* Joystick handler.
|
||||||
* TODO: Can GamePad work the same? */
|
* TODO: Can GamePad work the same? */
|
||||||
|
|
||||||
if (
|
switch (page)
|
||||||
(type == kIOHIDElementTypeInput_Misc) ||
|
|
||||||
(type == kIOHIDElementTypeInput_Button) ||
|
|
||||||
(type == kIOHIDElementTypeInput_Axis)
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
switch (page)
|
case kHIDPage_GenericDesktop:
|
||||||
{
|
switch (type)
|
||||||
case kHIDPage_GenericDesktop:
|
{
|
||||||
switch (type)
|
case kIOHIDElementTypeInput_Misc:
|
||||||
{
|
switch (use)
|
||||||
case kIOHIDElementTypeInput_Misc:
|
{
|
||||||
switch (use)
|
case kHIDUsage_GD_Hatswitch:
|
||||||
{
|
break;
|
||||||
case kHIDUsage_GD_Hatswitch:
|
default:
|
||||||
break;
|
{
|
||||||
default:
|
int i;
|
||||||
|
static const uint32_t axis_use_ids[4] = { 48, 49, 50, 53 };
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i ++)
|
||||||
{
|
{
|
||||||
static const uint32_t axis_use_ids[4] = { 48, 49, 50, 53 };
|
CFIndex min = IOHIDElementGetPhysicalMin(element);
|
||||||
int i;
|
CFIndex max = IOHIDElementGetPhysicalMax(element) - min;
|
||||||
|
CFIndex state = IOHIDValueGetIntegerValue(value) - min;
|
||||||
|
float val = (float)state / (float)max;
|
||||||
|
|
||||||
for (i = 0; i < 4; i ++)
|
if (use != axis_use_ids[i])
|
||||||
{
|
continue;
|
||||||
CFIndex min = IOHIDElementGetPhysicalMin(element);
|
|
||||||
CFIndex max = IOHIDElementGetPhysicalMax(element) - min;
|
|
||||||
CFIndex state = IOHIDValueGetIntegerValue(value) - min;
|
|
||||||
float val = (float)state / (float)max;
|
|
||||||
|
|
||||||
if (use != axis_use_ids[i])
|
apple->axes[connection->slot][i] =
|
||||||
continue;
|
((val * 2.0f) - 1.0f) * 32767.0f;
|
||||||
|
|
||||||
apple->axes[connection->slot][i] =
|
|
||||||
((val * 2.0f) - 1.0f) * 32767.0f;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
}
|
break;
|
||||||
break;
|
}
|
||||||
}
|
break;
|
||||||
break;
|
}
|
||||||
case kHIDPage_Button:
|
break;
|
||||||
switch (type)
|
case kHIDPage_Button:
|
||||||
{
|
switch (type)
|
||||||
case kIOHIDElementTypeInput_Button:
|
{
|
||||||
{
|
case kIOHIDElementTypeInput_Button:
|
||||||
CFIndex state = IOHIDValueGetIntegerValue(value);
|
{
|
||||||
unsigned id = use - 1;
|
CFIndex state = IOHIDValueGetIntegerValue(value);
|
||||||
|
unsigned id = use - 1;
|
||||||
|
|
||||||
if (state)
|
if (state)
|
||||||
BIT32_SET(apple->buttons[connection->slot], id);
|
BIT32_SET(apple->buttons[connection->slot], id);
|
||||||
else
|
else
|
||||||
BIT32_CLEAR(apple->buttons[connection->slot], id);
|
BIT32_CLEAR(apple->buttons[connection->slot], id);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,7 +123,8 @@ static void remove_device(void* context, IOReturn result, void* sender)
|
||||||
|
|
||||||
if (connection && connection->slot < MAX_USERS)
|
if (connection && connection->slot < MAX_USERS)
|
||||||
{
|
{
|
||||||
char msg[512];
|
char msg[PATH_MAX_LENGTH];
|
||||||
|
|
||||||
snprintf(msg, sizeof(msg), "Joypad #%u (%s) disconnected.",
|
snprintf(msg, sizeof(msg), "Joypad #%u (%s) disconnected.",
|
||||||
connection->slot, "N/A");
|
connection->slot, "N/A");
|
||||||
msg_queue_push(g_extern.msg_queue, msg, 0, 60);
|
msg_queue_push(g_extern.msg_queue, msg, 0, 60);
|
||||||
|
@ -196,25 +195,25 @@ static void add_device(void* context, IOReturn result,
|
||||||
IOHIDDeviceRegisterInputValueCallback(device,
|
IOHIDDeviceRegisterInputValueCallback(device,
|
||||||
hid_device_input_callback, connection);
|
hid_device_input_callback, connection);
|
||||||
|
|
||||||
if (device_name[0] != '\0')
|
if (device_name[0] == '\0')
|
||||||
{
|
return;
|
||||||
strlcpy(g_settings.input.device_names[connection->slot],
|
|
||||||
device_name, sizeof(g_settings.input.device_names));
|
|
||||||
|
|
||||||
input_config_autoconfigure_joypad(connection->slot,
|
strlcpy(g_settings.input.device_names[connection->slot],
|
||||||
device_name, connection->v_id, connection->p_id, apple_hid_joypad.ident);
|
device_name, sizeof(g_settings.input.device_names));
|
||||||
RARCH_LOG("Port %d: %s.\n", connection->slot, device_name);
|
|
||||||
}
|
input_config_autoconfigure_joypad(connection->slot,
|
||||||
|
device_name, connection->v_id, connection->p_id, apple_hid_joypad.ident);
|
||||||
|
RARCH_LOG("Port %d: %s.\n", connection->slot, device_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void append_matching_dictionary(CFMutableArrayRef array,
|
static void append_matching_dictionary(CFMutableArrayRef array,
|
||||||
uint32_t page, uint32_t use)
|
uint32_t page, uint32_t use)
|
||||||
{
|
{
|
||||||
CFNumberRef usen;
|
CFNumberRef usen, pagen;
|
||||||
CFMutableDictionaryRef matcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
|
CFMutableDictionaryRef matcher = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
|
||||||
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
|
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
|
||||||
CFNumberRef pagen = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &page);
|
|
||||||
|
|
||||||
|
pagen = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &page);
|
||||||
CFDictionarySetValue(matcher, CFSTR(kIOHIDDeviceUsagePageKey), pagen);
|
CFDictionarySetValue(matcher, CFSTR(kIOHIDDeviceUsagePageKey), pagen);
|
||||||
CFRelease(pagen);
|
CFRelease(pagen);
|
||||||
|
|
||||||
|
@ -285,7 +284,7 @@ static void apple_joypad_destroy(void)
|
||||||
static bool apple_joypad_button(unsigned port, uint16_t joykey)
|
static bool apple_joypad_button(unsigned port, uint16_t joykey)
|
||||||
{
|
{
|
||||||
apple_input_data_t *apple = (apple_input_data_t*)driver.input_data;
|
apple_input_data_t *apple = (apple_input_data_t*)driver.input_data;
|
||||||
uint32_t buttons = pad_connection_get_buttons(&slots[port], port);
|
uint32_t buttons = pad_connection_get_buttons(&slots[port], port);
|
||||||
|
|
||||||
if (!apple || joykey == NO_BTN)
|
if (!apple || joykey == NO_BTN)
|
||||||
return false;
|
return false;
|
||||||
|
@ -313,13 +312,17 @@ static int16_t apple_joypad_axis(unsigned port, uint32_t joyaxis)
|
||||||
{
|
{
|
||||||
val = apple->axes[port][AXIS_NEG_GET(joyaxis)];
|
val = apple->axes[port][AXIS_NEG_GET(joyaxis)];
|
||||||
val += pad_connection_get_axis(&slots[port], port, AXIS_NEG_GET(joyaxis));
|
val += pad_connection_get_axis(&slots[port], port, AXIS_NEG_GET(joyaxis));
|
||||||
val = (val < 0) ? val : 0;
|
|
||||||
|
if (val >= 0)
|
||||||
|
val = 0;
|
||||||
}
|
}
|
||||||
else if(AXIS_POS_GET(joyaxis) < 4)
|
else if(AXIS_POS_GET(joyaxis) < 4)
|
||||||
{
|
{
|
||||||
val = apple->axes[port][AXIS_POS_GET(joyaxis)];
|
val = apple->axes[port][AXIS_POS_GET(joyaxis)];
|
||||||
val += pad_connection_get_axis(&slots[port], port, AXIS_POS_GET(joyaxis));
|
val += pad_connection_get_axis(&slots[port], port, AXIS_POS_GET(joyaxis));
|
||||||
val = (val > 0) ? val : 0;
|
|
||||||
|
if (val <= 0)
|
||||||
|
val = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
|
|
|
@ -53,10 +53,10 @@ static bool apple_joypad_button(unsigned port, uint16_t joykey)
|
||||||
if (!apple || joykey == NO_BTN)
|
if (!apple || joykey == NO_BTN)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Check hat.
|
/* Check hat. */
|
||||||
if (GET_HAT_DIR(joykey))
|
if (GET_HAT_DIR(joykey))
|
||||||
return false;
|
return false;
|
||||||
// Check the button
|
/* Check the button */
|
||||||
if ((port < MAX_USERS) && (joykey < 32))
|
if ((port < MAX_USERS) && (joykey < 32))
|
||||||
return ((apple->buttons[port] & (1 << joykey)) != 0) ||
|
return ((apple->buttons[port] & (1 << joykey)) != 0) ||
|
||||||
((buttons & (1 << joykey)) != 0);
|
((buttons & (1 << joykey)) != 0);
|
||||||
|
@ -75,13 +75,15 @@ static int16_t apple_joypad_axis(unsigned port, uint32_t joyaxis)
|
||||||
{
|
{
|
||||||
val = apple->axes[port][AXIS_NEG_GET(joyaxis)];
|
val = apple->axes[port][AXIS_NEG_GET(joyaxis)];
|
||||||
val += pad_connection_get_axis(&slots[port], port, AXIS_NEG_GET(joyaxis));
|
val += pad_connection_get_axis(&slots[port], port, AXIS_NEG_GET(joyaxis));
|
||||||
val = (val < 0) ? val : 0;
|
if (val >= 0)
|
||||||
|
val = 0;
|
||||||
}
|
}
|
||||||
else if(AXIS_POS_GET(joyaxis) < 4)
|
else if(AXIS_POS_GET(joyaxis) < 4)
|
||||||
{
|
{
|
||||||
val = apple->axes[port][AXIS_POS_GET(joyaxis)];
|
val = apple->axes[port][AXIS_POS_GET(joyaxis)];
|
||||||
val += pad_connection_get_axis(&slots[port], port, AXIS_POS_GET(joyaxis));
|
val += pad_connection_get_axis(&slots[port], port, AXIS_POS_GET(joyaxis));
|
||||||
val = (val > 0) ? val : 0;
|
if (val <= 0)
|
||||||
|
val = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
|
|
Loading…
Reference in New Issue