diff --git a/gx/gx_input.c b/gx/gx_input.c index 700e33f83f..a641633229 100644 --- a/gx/gx_input.c +++ b/gx/gx_input.c @@ -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;