(GX) Input polling refactor - do Wiimote first - skip GC poll

if no GC pads are connected
This commit is contained in:
twinaphex 2013-01-06 20:17:05 +01:00
parent 33154c1a04
commit 3f2112d2fd

View File

@ -267,180 +267,172 @@ static void gx_input_poll(void *data)
{
(void)data;
bool quit_gc = false;
u32 gc_pads_connected = PAD_ScanPads();
pad_state[0] = 0;
pad_state[1] = 0;
pad_state[2] = 0;
pad_state[3] = 0;
#ifdef HW_RVL
bool quit_classic = false;
bool quit_wiimote = false;
WPAD_ReadPending(WPAD_CHAN_ALL, NULL);
#endif
for (unsigned port = 0; port < MAX_PADS; port++)
{
uint64_t state = 0;
if (gc_pads_connected)
{
uint16_t down = PAD_ButtonsHeld(port);
state |= (down & PAD_BUTTON_A) ? GX_GC_A : 0;
state |= (down & PAD_BUTTON_B) ? GX_GC_B : 0;
state |= (down & PAD_BUTTON_X) ? GX_GC_X : 0;
state |= (down & PAD_BUTTON_Y) ? GX_GC_Y : 0;
state |= (down & PAD_BUTTON_UP) ? GX_GC_UP : 0;
state |= (down & PAD_BUTTON_DOWN) ? GX_GC_DOWN : 0;
state |= (down & PAD_BUTTON_LEFT) ? GX_GC_LEFT : 0;
state |= (down & PAD_BUTTON_RIGHT) ? GX_GC_RIGHT : 0;
state |= (down & PAD_BUTTON_START) ? GX_GC_START : 0;
state |= (down & PAD_TRIGGER_Z) ? GX_GC_Z_TRIGGER : 0;
state |= ((down & PAD_TRIGGER_L) || PAD_TriggerL(port) > 127) ? GX_GC_L_TRIGGER : 0;
state |= ((down & PAD_TRIGGER_R) || PAD_TriggerR(port) > 127) ? GX_GC_R_TRIGGER : 0;
s8 x = PAD_StickX(port);
s8 y = PAD_StickY(port);
if (abs(x) > JOYSTICK_THRESHOLD)
state |= x > 0 ? GX_GC_LSTICK_RIGHT : GX_GC_LSTICK_LEFT;
if (abs(y) > JOYSTICK_THRESHOLD)
state |= y > 0 ? GX_GC_LSTICK_UP : GX_GC_LSTICK_DOWN;
x = PAD_SubStickX(port);
y = PAD_SubStickY(port);
if (abs(x) > JOYSTICK_THRESHOLD)
state |= x > 0 ? GX_GC_RSTICK_RIGHT : GX_GC_RSTICK_LEFT;
if (abs(y) > JOYSTICK_THRESHOLD)
state |= y > 0 ? GX_GC_RSTICK_UP : GX_GC_RSTICK_DOWN;
if ((state & (GX_GC_LSTICK_DOWN | GX_GC_RSTICK_DOWN | GX_GC_L_TRIGGER | GX_GC_R_TRIGGER)) == (GX_GC_LSTICK_DOWN | GX_GC_RSTICK_DOWN | GX_GC_L_TRIGGER | GX_GC_R_TRIGGER))
quit_gc = true;
}
#ifdef HW_RVL
uint32_t type = 0;
if (WPAD_Probe(port, &type) == WPAD_ERR_NONE)
if (WPAD_Probe(port, &type) != WPAD_ERR_NONE)
continue;
uint64_t *state_cur = &pad_state[port];
WPADData *wpaddata = WPAD_Data(port);
uint32_t down = wpaddata->btns_h;
*state_cur |= (down & WPAD_BUTTON_A) ? GX_WIIMOTE_A : 0;
*state_cur |= (down & WPAD_BUTTON_B) ? GX_WIIMOTE_B : 0;
*state_cur |= (down & WPAD_BUTTON_1) ? GX_WIIMOTE_1 : 0;
*state_cur |= (down & WPAD_BUTTON_2) ? GX_WIIMOTE_2 : 0;
*state_cur |= (down & WPAD_BUTTON_PLUS) ? GX_WIIMOTE_PLUS : 0;
*state_cur |= (down & WPAD_BUTTON_MINUS) ? GX_WIIMOTE_MINUS : 0;
*state_cur |= (down & WPAD_BUTTON_HOME) ? GX_WIIMOTE_HOME : 0;
// rotated d-pad on Wiimote
*state_cur |= (down & WPAD_BUTTON_UP) ? GX_WIIMOTE_LEFT : 0;
*state_cur |= (down & WPAD_BUTTON_DOWN) ? GX_WIIMOTE_RIGHT : 0;
*state_cur |= (down & WPAD_BUTTON_LEFT) ? GX_WIIMOTE_DOWN : 0;
*state_cur |= (down & WPAD_BUTTON_RIGHT) ? GX_WIIMOTE_UP : 0;
if((down & WPAD_BUTTON_HOME) && (down & WPAD_BUTTON_B))
*state_cur |= GX_QUIT_KEY;
expansion_t *exp = &wpaddata->exp;
if (type == WPAD_EXP_CLASSIC)
{
WPADData *wpaddata = WPAD_Data(port);
*state_cur |= (down & WPAD_CLASSIC_BUTTON_A) ? GX_CLASSIC_A : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_B) ? GX_CLASSIC_B : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_X) ? GX_CLASSIC_X : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_Y) ? GX_CLASSIC_Y : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_UP) ? GX_CLASSIC_UP : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_DOWN) ? GX_CLASSIC_DOWN : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_LEFT) ? GX_CLASSIC_LEFT : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_RIGHT) ? GX_CLASSIC_RIGHT : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_PLUS) ? GX_CLASSIC_PLUS : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_MINUS) ? GX_CLASSIC_MINUS : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_HOME) ? GX_CLASSIC_HOME : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_FULL_L) ? GX_CLASSIC_L_TRIGGER : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_FULL_R) ? GX_CLASSIC_R_TRIGGER : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_ZL) ? GX_CLASSIC_ZL_TRIGGER : 0;
*state_cur |= (down & WPAD_CLASSIC_BUTTON_ZR) ? GX_CLASSIC_ZR_TRIGGER : 0;
uint32_t down = wpaddata->btns_h;
if((down & WPAD_CLASSIC_BUTTON_HOME) && (down & WPAD_CLASSIC_BUTTON_ZL)
&& (down & WPAD_CLASSIC_BUTTON_ZR))
*state_cur |= GX_QUIT_KEY;
state |= (down & WPAD_BUTTON_A) ? GX_WIIMOTE_A : 0;
state |= (down & WPAD_BUTTON_B) ? GX_WIIMOTE_B : 0;
state |= (down & WPAD_BUTTON_1) ? GX_WIIMOTE_1 : 0;
state |= (down & WPAD_BUTTON_2) ? GX_WIIMOTE_2 : 0;
state |= (down & WPAD_BUTTON_PLUS) ? GX_WIIMOTE_PLUS : 0;
state |= (down & WPAD_BUTTON_MINUS) ? GX_WIIMOTE_MINUS : 0;
state |= (down & WPAD_BUTTON_HOME) ? GX_WIIMOTE_HOME : 0;
if((down & WPAD_BUTTON_HOME) && (down & WPAD_BUTTON_B))
quit_wiimote = true;
expansion_t exp = wpaddata->exp;
switch (type)
//TODO: Hack, analog stick twitchiness needs to be properly fixed
if(g_extern.draw_menu)
{
case WPAD_EXP_NUNCHUK:
{
// wiimote is held upright with nunchuk, do not change d-pad orientation
state |= (down & WPAD_BUTTON_UP) ? GX_WIIMOTE_UP : 0;
state |= (down & WPAD_BUTTON_DOWN) ? GX_WIIMOTE_DOWN : 0;
state |= (down & WPAD_BUTTON_LEFT) ? GX_WIIMOTE_LEFT : 0;
state |= (down & WPAD_BUTTON_RIGHT) ? GX_WIIMOTE_RIGHT : 0;
s8 x = gx_stick_x(exp->classic.ljs);
s8 y = gx_stick_y(exp->classic.ljs);
state |= (down & WPAD_NUNCHUK_BUTTON_Z) ? GX_NUNCHUK_Z : 0;
state |= (down & WPAD_NUNCHUK_BUTTON_C) ? GX_NUNCHUK_C : 0;
if (abs(x) > JOYSTICK_THRESHOLD)
*state_cur |= x > 0 ? GX_CLASSIC_LSTICK_RIGHT : GX_CLASSIC_LSTICK_LEFT;
if (abs(y) > JOYSTICK_THRESHOLD)
*state_cur |= y > 0 ? GX_CLASSIC_LSTICK_UP : GX_CLASSIC_LSTICK_DOWN;
s8 x = gx_stick_x(exp.nunchuk.js);
s8 y = gx_stick_y(exp.nunchuk.js);
x = gx_stick_x(exp->classic.rjs);
y = gx_stick_y(exp->classic.rjs);
if (abs(x) > JOYSTICK_THRESHOLD)
state |= x > 0 ? GX_NUNCHUK_RIGHT : GX_NUNCHUK_LEFT;
if (abs(y) > JOYSTICK_THRESHOLD)
state |= y > 0 ? GX_NUNCHUK_UP : GX_NUNCHUK_DOWN;
break;
}
case WPAD_EXP_CLASSIC:
{
state |= (down & WPAD_CLASSIC_BUTTON_A) ? GX_CLASSIC_A : 0;
state |= (down & WPAD_CLASSIC_BUTTON_B) ? GX_CLASSIC_B : 0;
state |= (down & WPAD_CLASSIC_BUTTON_X) ? GX_CLASSIC_X : 0;
state |= (down & WPAD_CLASSIC_BUTTON_Y) ? GX_CLASSIC_Y : 0;
state |= (down & WPAD_CLASSIC_BUTTON_UP) ? GX_CLASSIC_UP : 0;
state |= (down & WPAD_CLASSIC_BUTTON_DOWN) ? GX_CLASSIC_DOWN : 0;
state |= (down & WPAD_CLASSIC_BUTTON_LEFT) ? GX_CLASSIC_LEFT : 0;
state |= (down & WPAD_CLASSIC_BUTTON_RIGHT) ? GX_CLASSIC_RIGHT : 0;
state |= (down & WPAD_CLASSIC_BUTTON_PLUS) ? GX_CLASSIC_PLUS : 0;
state |= (down & WPAD_CLASSIC_BUTTON_MINUS) ? GX_CLASSIC_MINUS : 0;
state |= (down & WPAD_CLASSIC_BUTTON_HOME) ? GX_CLASSIC_HOME : 0;
state |= (down & WPAD_CLASSIC_BUTTON_FULL_L) ? GX_CLASSIC_L_TRIGGER : 0;
state |= (down & WPAD_CLASSIC_BUTTON_FULL_R) ? GX_CLASSIC_R_TRIGGER : 0;
state |= (down & WPAD_CLASSIC_BUTTON_ZL) ? GX_CLASSIC_ZL_TRIGGER : 0;
state |= (down & WPAD_CLASSIC_BUTTON_ZR) ? GX_CLASSIC_ZR_TRIGGER : 0;
if (abs(x) > JOYSTICK_THRESHOLD)
*state_cur |= x > 0 ? GX_CLASSIC_RSTICK_RIGHT : GX_CLASSIC_RSTICK_LEFT;
if (abs(y) > JOYSTICK_THRESHOLD)
*state_cur |= y > 0 ? GX_CLASSIC_RSTICK_UP : GX_CLASSIC_RSTICK_DOWN;
}
else
{
u8 ls_x = exp->classic.ljs.pos.x;
u8 ls_y = exp->classic.ljs.pos.y;
u8 rs_x = exp->classic.rjs.pos.x;
u8 rs_y = exp->classic.rjs.pos.y;
if((down & WPAD_CLASSIC_BUTTON_HOME) && (down & WPAD_CLASSIC_BUTTON_ZL) && (down & WPAD_CLASSIC_BUTTON_ZR))
quit_classic = true;
//TODO: Hack, analog stick twitchiness needs to be properly fixed
if(g_extern.draw_menu)
{
s8 x = gx_stick_x(exp.classic.ljs);
s8 y = gx_stick_y(exp.classic.ljs);
if (abs(x) > JOYSTICK_THRESHOLD)
state |= x > 0 ? GX_CLASSIC_LSTICK_RIGHT : GX_CLASSIC_LSTICK_LEFT;
if (abs(y) > JOYSTICK_THRESHOLD)
state |= y > 0 ? GX_CLASSIC_LSTICK_UP : GX_CLASSIC_LSTICK_DOWN;
x = gx_stick_x(exp.classic.rjs);
y = gx_stick_y(exp.classic.rjs);
if (abs(x) > JOYSTICK_THRESHOLD)
state |= x > 0 ? GX_CLASSIC_RSTICK_RIGHT : GX_CLASSIC_RSTICK_LEFT;
if (abs(y) > JOYSTICK_THRESHOLD)
state |= y > 0 ? GX_CLASSIC_RSTICK_UP : GX_CLASSIC_RSTICK_DOWN;
}
else
{
u8 ls_x = exp.classic.ljs.pos.x;
u8 ls_y = exp.classic.ljs.pos.y;
u8 rs_x = exp.classic.rjs.pos.x;
u8 rs_y = exp.classic.rjs.pos.y;
state |= (ls_x > 40) ? GX_CLASSIC_LSTICK_RIGHT : 0;
state |= (ls_x < 25) ? GX_CLASSIC_LSTICK_LEFT : 0;
state |= (ls_y > 45) ? GX_CLASSIC_LSTICK_UP : 0;
state |= (ls_y < 20) ? GX_CLASSIC_LSTICK_DOWN : 0;
state |= (rs_x > 40) ? GX_CLASSIC_RSTICK_RIGHT : 0;
state |= (rs_x < 25) ? GX_CLASSIC_RSTICK_LEFT: 0;
state |= (rs_y > 45) ? GX_CLASSIC_RSTICK_UP : 0;
state |= (rs_y < 20) ? GX_CLASSIC_RSTICK_DOWN : 0;
}
// do not return, fall through for wiimote d-pad
}
default:
// rotated d-pad
state |= (down & WPAD_BUTTON_UP) ? GX_WIIMOTE_LEFT : 0;
state |= (down & WPAD_BUTTON_DOWN) ? GX_WIIMOTE_RIGHT : 0;
state |= (down & WPAD_BUTTON_LEFT) ? GX_WIIMOTE_DOWN : 0;
state |= (down & WPAD_BUTTON_RIGHT) ? GX_WIIMOTE_UP : 0;
break;
*state_cur |= (ls_x > 40) ? GX_CLASSIC_LSTICK_RIGHT : 0;
*state_cur |= (ls_x < 25) ? GX_CLASSIC_LSTICK_LEFT : 0;
*state_cur |= (ls_y > 45) ? GX_CLASSIC_LSTICK_UP : 0;
*state_cur |= (ls_y < 20) ? GX_CLASSIC_LSTICK_DOWN : 0;
*state_cur |= (rs_x > 40) ? GX_CLASSIC_RSTICK_RIGHT : 0;
*state_cur |= (rs_x < 25) ? GX_CLASSIC_RSTICK_LEFT: 0;
*state_cur |= (rs_y > 45) ? GX_CLASSIC_RSTICK_UP : 0;
*state_cur |= (rs_y < 20) ? GX_CLASSIC_RSTICK_DOWN : 0;
}
}
else if (type == WPAD_EXP_NUNCHUK)
{
// wiimote is held upright with nunchuk, do not change d-pad orientation
*state_cur |= (down & WPAD_BUTTON_UP) ? GX_WIIMOTE_UP : 0;
*state_cur |= (down & WPAD_BUTTON_DOWN) ? GX_WIIMOTE_DOWN : 0;
*state_cur |= (down & WPAD_BUTTON_LEFT) ? GX_WIIMOTE_LEFT : 0;
*state_cur |= (down & WPAD_BUTTON_RIGHT) ? GX_WIIMOTE_RIGHT : 0;
*state_cur |= (down & WPAD_NUNCHUK_BUTTON_Z) ? GX_NUNCHUK_Z : 0;
*state_cur |= (down & WPAD_NUNCHUK_BUTTON_C) ? GX_NUNCHUK_C : 0;
s8 x = gx_stick_x(exp->nunchuk.js);
s8 y = gx_stick_y(exp->nunchuk.js);
if (abs(x) > JOYSTICK_THRESHOLD)
*state_cur |= x > 0 ? GX_NUNCHUK_RIGHT : GX_NUNCHUK_LEFT;
if (abs(y) > JOYSTICK_THRESHOLD)
*state_cur |= y > 0 ? GX_NUNCHUK_UP : GX_NUNCHUK_DOWN;
}
}
#endif
if ((state & (GX_GC_LSTICK_UP | GX_GC_RSTICK_UP | GX_GC_L_TRIGGER | GX_GC_R_TRIGGER)) == (GX_GC_LSTICK_UP | GX_GC_RSTICK_UP | GX_GC_L_TRIGGER | GX_GC_R_TRIGGER))
state |= GX_WIIMOTE_HOME;
u32 gc_pads_connected = PAD_ScanPads();
if (quit_gc
#ifdef HW_RVL
|| quit_wiimote || quit_classic
#endif
)
state |= GX_QUIT_KEY;
if (!gc_pads_connected)
goto do_exit;
pad_state[port] = state;
for (unsigned port = 0; port < MAX_PADS; port++)
{
uint64_t *state_cur = &pad_state[port];
uint16_t down = PAD_ButtonsHeld(port);
*state_cur |= (down & PAD_BUTTON_A) ? GX_GC_A : 0;
*state_cur |= (down & PAD_BUTTON_B) ? GX_GC_B : 0;
*state_cur |= (down & PAD_BUTTON_X) ? GX_GC_X : 0;
*state_cur |= (down & PAD_BUTTON_Y) ? GX_GC_Y : 0;
*state_cur |= (down & PAD_BUTTON_UP) ? GX_GC_UP : 0;
*state_cur |= (down & PAD_BUTTON_DOWN) ? GX_GC_DOWN : 0;
*state_cur |= (down & PAD_BUTTON_LEFT) ? GX_GC_LEFT : 0;
*state_cur |= (down & PAD_BUTTON_RIGHT) ? GX_GC_RIGHT : 0;
*state_cur |= (down & PAD_BUTTON_START) ? GX_GC_START : 0;
*state_cur |= (down & PAD_TRIGGER_Z) ? GX_GC_Z_TRIGGER : 0;
*state_cur |= ((down & PAD_TRIGGER_L) || PAD_TriggerL(port) > 127) ? GX_GC_L_TRIGGER : 0;
*state_cur |= ((down & PAD_TRIGGER_R) || PAD_TriggerR(port) > 127) ? GX_GC_R_TRIGGER : 0;
s8 x = PAD_StickX(port);
s8 y = PAD_StickY(port);
if (abs(x) > JOYSTICK_THRESHOLD)
*state_cur |= x > 0 ? GX_GC_LSTICK_RIGHT : GX_GC_LSTICK_LEFT;
if (abs(y) > JOYSTICK_THRESHOLD)
*state_cur |= y > 0 ? GX_GC_LSTICK_UP : GX_GC_LSTICK_DOWN;
x = PAD_SubStickX(port);
y = PAD_SubStickY(port);
if (abs(x) > JOYSTICK_THRESHOLD)
*state_cur |= x > 0 ? GX_GC_RSTICK_RIGHT : GX_GC_RSTICK_LEFT;
if (abs(y) > JOYSTICK_THRESHOLD)
*state_cur |= y > 0 ? GX_GC_RSTICK_UP : GX_GC_RSTICK_DOWN;
if ((*state_cur & (GX_GC_LSTICK_DOWN | GX_GC_RSTICK_DOWN | GX_GC_L_TRIGGER | GX_GC_R_TRIGGER)) == (GX_GC_LSTICK_DOWN | GX_GC_RSTICK_DOWN | GX_GC_L_TRIGGER | GX_GC_R_TRIGGER))
*state_cur |= GX_QUIT_KEY;
if ((*state_cur & (GX_GC_LSTICK_UP | GX_GC_RSTICK_UP | GX_GC_L_TRIGGER | GX_GC_R_TRIGGER)) == (GX_GC_LSTICK_UP | GX_GC_RSTICK_UP | GX_GC_L_TRIGGER | GX_GC_R_TRIGGER))
*state_cur |= GX_WIIMOTE_HOME;
}
do_exit:
if (g_menu)
{
pad_state[0] |= GX_WIIMOTE_HOME;