(input/connect) Cleanups

This commit is contained in:
twinaphex 2015-01-19 05:01:31 +01:00
parent 94ca700059
commit 824f00be15
5 changed files with 182 additions and 165 deletions

View File

@ -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 = {

View File

@ -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,

View File

@ -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;
} }

View File

@ -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;

View File

@ -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;