(PS3) Add preliminary analog stick support

This commit is contained in:
twinaphex 2013-11-03 19:39:43 +01:00
parent abf2079920
commit ae981ab946
1 changed files with 26 additions and 11 deletions

View File

@ -69,20 +69,26 @@ typedef struct ps3_input
#endif #endif
} ps3_input_t; } ps3_input_t;
int16_t analog_state[MAX_PADS][2][2];
static void ps3_input_poll(void *data) static void ps3_input_poll(void *data)
{ {
CellPadInfo2 pad_info; CellPadInfo2 pad_info;
ps3_input_t *ps3 = (ps3_input_t*)data; ps3_input_t *ps3 = (ps3_input_t*)data;
for (unsigned i = 0; i < MAX_PADS; i++) for (unsigned port = 0; port < MAX_PADS; port++)
{ {
static CellPadData state_tmp; static CellPadData state_tmp;
cellPadGetData(i, &state_tmp); cellPadGetData(port, &state_tmp);
if (state_tmp.len != 0) if (state_tmp.len != 0)
{ {
uint64_t *state_cur = &ps3->state[i]; uint64_t *state_cur = &ps3->state[port];
*state_cur = 0; *state_cur = 0;
analog_state[0][0][0] = analog_state[0][0][1] = analog_state[0][1][0] = analog_state[0][1][1] = 0;
analog_state[1][0][0] = analog_state[1][0][1] = analog_state[1][1][0] = analog_state[1][1][1] = 0;
analog_state[2][0][0] = analog_state[2][0][1] = analog_state[2][1][0] = analog_state[2][1][1] = 0;
analog_state[3][0][0] = analog_state[3][0][1] = analog_state[3][1][0] = analog_state[3][1][1] = 0;
#ifdef __PSL1GHT__ #ifdef __PSL1GHT__
*state_cur |= (state_tmp.BTN_LEFT) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; *state_cur |= (state_tmp.BTN_LEFT) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0;
*state_cur |= (state_tmp.BTN_DOWN) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; *state_cur |= (state_tmp.BTN_DOWN) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0;
@ -117,6 +123,11 @@ static void ps3_input_poll(void *data)
*state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_L1) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_L) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_L1) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_L) : 0;
*state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_R2) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_R2) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_R2) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_R2) : 0;
*state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_L2) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_L2) : 0; *state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_L2) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_L2) : 0;
*state_cur |= (state_tmp.button[CELL_PAD_BTN_OFFSET_DIGITAL2] & CELL_PAD_CTRL_L2) ? (1ULL << RETRO_DEVICE_ID_JOYPAD_L2) : 0;
analog_state[port][RETRO_DEVICE_INDEX_ANALOG_LEFT ][RETRO_DEVICE_ID_ANALOG_X] = (int16_t)state_tmp.button[CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X];
analog_state[port][RETRO_DEVICE_INDEX_ANALOG_LEFT ][RETRO_DEVICE_ID_ANALOG_Y] = (int16_t)state_tmp.button[CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y];
analog_state[port][RETRO_DEVICE_INDEX_ANALOG_RIGHT][RETRO_DEVICE_ID_ANALOG_X] = (int16_t)state_tmp.button[CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X];
analog_state[port][RETRO_DEVICE_INDEX_ANALOG_RIGHT][RETRO_DEVICE_ID_ANALOG_Y] = (int16_t)state_tmp.button[CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y];
#endif #endif
} }
} }
@ -125,8 +136,7 @@ static void ps3_input_poll(void *data)
uint64_t *lifecycle_state = &g_extern.lifecycle_state; uint64_t *lifecycle_state = &g_extern.lifecycle_state;
*lifecycle_state &= ~( *lifecycle_state &= ~(
(1ULL << RARCH_FAST_FORWARD_HOLD_KEY) | (1ULL << RARCH_FAST_FORWARD_HOLD_KEY) | (1ULL << RARCH_LOAD_STATE_KEY) |
(1ULL << RARCH_LOAD_STATE_KEY) |
(1ULL << RARCH_SAVE_STATE_KEY) | (1ULL << RARCH_SAVE_STATE_KEY) |
(1ULL << RARCH_STATE_SLOT_PLUS) | (1ULL << RARCH_STATE_SLOT_PLUS) |
(1ULL << RARCH_STATE_SLOT_MINUS) | (1ULL << RARCH_STATE_SLOT_MINUS) |
@ -177,20 +187,22 @@ static int16_t ps3_input_state(void *data, const struct retro_keybind **binds,
{ {
ps3_input_t *ps3 = (ps3_input_t*)data; ps3_input_t *ps3 = (ps3_input_t*)data;
unsigned player = port; uint64_t button = binds[port][id].joykey;
uint64_t button = binds[player][id].joykey;
int16_t retval = 0; int16_t retval = 0;
if (player < ps3->pads_connected) if (port < ps3->pads_connected)
{ {
switch (device) switch (device)
{ {
case RETRO_DEVICE_JOYPAD: case RETRO_DEVICE_JOYPAD:
retval = (ps3->state[player] & button) ? 1 : 0; retval = (ps3->state[port] & button) ? 1 : 0;
break;
case RETRO_DEVICE_ANALOG:
retval = analog_state[port][index][id];
break; break;
#ifdef HAVE_MOUSE #ifdef HAVE_MOUSE
case RETRO_DEVICE_MOUSE: case RETRO_DEVICE_MOUSE:
retval = ps3_mouse_device_state(data, player, id); retval = ps3_mouse_device_state(data, port, id);
break; break;
#endif #endif
} }
@ -306,7 +318,9 @@ static void ps3_input_free_input(void *data)
if (!data) if (!data)
return; return;
//cellPadEnd(); #ifndef __CELLOS_LV2__
cellPadEnd();
#endif
#ifdef HAVE_MOUSE #ifdef HAVE_MOUSE
//cellMouseEnd(); //cellMouseEnd();
#endif #endif
@ -382,6 +396,7 @@ static uint64_t ps3_input_get_capabilities(void *data)
#ifdef HAVE_MOUSE #ifdef HAVE_MOUSE
caps |= (1 << RETRO_DEVICE_MOUSE); caps |= (1 << RETRO_DEVICE_MOUSE);
#endif #endif
caps |= (1 << RETRO_DEVICE_ANALOG);
return caps; return caps;
} }