Simplified the controller functions

The three functions related to updating the arrays of buttons tates are now a single function, updateButtons.

The three functions isPressed(), isHeld(), and isReleased() have been merged into a single function, checkButton() which takes parameters for which button to check and what state or event (PRESS, HOLD, RELEASE) to check for.
This commit is contained in:
jakobkg 2018-03-02 20:09:33 +01:00
parent 087c4cddd8
commit 6d5cbf9af5
4 changed files with 101 additions and 589 deletions

View File

@ -15,9 +15,11 @@ void pingControllers() {
}
}
void updatePressedButtons() {
VPADRead(0, &vpad, 1, &vpadError);
buttons_pressed[0] = vpad.btns_d;
void updateButtons() {
VPADRead(0, &vpad, 1, &vpadError);
buttons_pressed[0] = vpad.btns_d;
buttons_hold[0] = vpad.btns_h;
buttons_released[0] = vpad.btns_r;
pingControllers();
for (int i = 0; i < 4; i++) {
@ -25,54 +27,17 @@ void updatePressedButtons() {
KPADRead(i, &pads[i], 1);
if (isWiimote(&pads[i])) {
buttons_pressed[i + 1] = pads[i].btns_d;
}
else if (isClassicController(&pads[i])) {
buttons_pressed[i + 1] = pads[i].classic.btns_d;
}
else if (isProController(&pads[i])) {
buttons_pressed[i + 1] = pads[i].pro.btns_d;
}
}
}
}
void updateHeldButtons() {
VPADRead(0, &vpad, 1, &vpadError);
buttons_hold[0] = vpad.btns_h;
pingControllers();
for (int i = 0; i < 4; i++) {
if (padErrors[i] == 0) {
KPADRead(i, &pads[i], 1);
if (isWiimote(&pads[i])) {
buttons_hold[i + 1] = pads[i].btns_h;
}
else if (isClassicController(&pads[i])) {
buttons_hold[i + 1] = pads[i].classic.btns_h;
}
else if (isProController(&pads[i])) {
buttons_hold[i + 1] = pads[i].pro.btns_h;
}
}
}
}
void updateReleasedButtons() {
VPADRead(0, &vpad, 1, &vpadError);
buttons_released[0] = vpad.btns_r;
pingControllers();
for (int i = 0; i < 4; i++) {
if (padErrors[i] == 0) {
KPADRead(i, &pads[i], 1);
if (isWiimote(&pads[i])) {
buttons_released[i + 1] = pads[i].btns_r;
}
else if (isClassicController(&pads[i])) {
buttons_pressed[i + 1] = pads[i].classic.btns_d;
buttons_hold[i + 1] = pads[i].classic.btns_h;
buttons_released[i + 1] = pads[i].classic.btns_r;
}
else if (isProController(&pads[i])) {
buttons_pressed[i + 1] = pads[i].pro.btns_d;
buttons_hold[i + 1] = pads[i].pro.btns_h;
buttons_released[i + 1] = pads[i].pro.btns_r;
}
}
@ -112,327 +77,109 @@ bool isProController(KPADData *padData){
return padData->device_type == 31;
}
int isPressed(int button) {
//Check for any button at all
if (button == PAD_BUTTON_ANY) {
for (int i = 0; i < 5; i++) {
if (buttons_pressed[i] > 0) return 1;
}
}
//VPad buttons
switch (button) {
case PAD_BUTTON_A:
if (buttons_pressed[0] & VPAD_BUTTON_A) return 1;
int checkButton(int button, int state) {
uint32_t *stateArray;
switch(state) {
case PRESS:
stateArray = &buttons_pressed;
break;
case PAD_BUTTON_B:
if (buttons_pressed[0] & VPAD_BUTTON_B) return 1;
case HOLD:
stateArray = &buttons_hold;
break;
case PAD_BUTTON_X:
if (buttons_pressed[0] & VPAD_BUTTON_X) return 1;
break;
case PAD_BUTTON_Y:
if (buttons_pressed[0] & VPAD_BUTTON_Y) return 1;
break;
case PAD_BUTTON_UP:
if (buttons_pressed[0] & VPAD_BUTTON_UP) return 1;
break;
case PAD_BUTTON_DOWN:
if (buttons_pressed[0] & VPAD_BUTTON_DOWN) return 1;
break;
case PAD_BUTTON_LEFT:
if (buttons_pressed[0] & VPAD_BUTTON_LEFT) return 1;
break;
case PAD_BUTTON_RIGHT:
if (buttons_pressed[0] & VPAD_BUTTON_RIGHT) return 1;
break;
case PAD_BUTTON_L:
if (buttons_pressed[0] & VPAD_BUTTON_L) return 1;
break;
case PAD_BUTTON_R:
if (buttons_pressed[0] & VPAD_BUTTON_R) return 1;
break;
case PAD_BUTTON_ZL:
if (buttons_pressed[0] & VPAD_BUTTON_ZL) return 1;
break;
case PAD_BUTTON_ZR:
if (buttons_pressed[0] & VPAD_BUTTON_ZR) return 1;
break;
case PAD_BUTTON_PLUS:
if (buttons_pressed[0] & VPAD_BUTTON_PLUS) return 1;
break;
case PAD_BUTTON_MINUS:
if (buttons_pressed[0] & VPAD_BUTTON_MINUS) return 1;
break;
case PAD_BUTTON_HOME:
if (buttons_pressed[0] & VPAD_BUTTON_HOME) return 1;
break;
case PAD_BUTTON_SYNC:
if (buttons_pressed[0] & VPAD_BUTTON_SYNC) return 1;
break;
case PAD_BUTTON_STICK_L:
if (buttons_pressed[0] & VPAD_BUTTON_L) return 1;
break;
case PAD_BUTTON_STICK_R:
if (buttons_pressed[0] & VPAD_BUTTON_STICK_R) return 1;
break;
case PAD_BUTTON_TV:
if (buttons_pressed[0] & VPAD_BUTTON_TV) return 1;
case RELEASE:
stateArray = &buttons_released;
break;
default:
break;
return 0;
}
//Buttons handled by the padscore library
for (int i = 0; i < 4; i++) {
if (padErrors[i] == 0) {
if (isWiimote(&pads[i])) {
switch (button) {
case PAD_BUTTON_UP:
if (buttons_pressed[i + 1] & WPAD_BUTTON_UP) return 1;
break;
case PAD_BUTTON_DOWN:
if (buttons_pressed[i + 1] & WPAD_BUTTON_DOWN) return 1;
break;
case PAD_BUTTON_LEFT:
if (buttons_pressed[i + 1] & WPAD_BUTTON_LEFT) return 1;
break;
case PAD_BUTTON_RIGHT:
if (buttons_pressed[i + 1] & WPAD_BUTTON_RIGHT) return 1;
break;
case PAD_BUTTON_A:
if (buttons_pressed[i + 1] & WPAD_BUTTON_A) return 1;
break;
case PAD_BUTTON_B:
if (buttons_pressed[i + 1] & WPAD_BUTTON_B) return 1;
break;
case PAD_BUTTON_L:
if (buttons_pressed[i + 1] & WPAD_BUTTON_1) return 1;
break;
case PAD_BUTTON_R:
if (buttons_pressed[i + 1] & WPAD_BUTTON_2) return 1;
break;
case PAD_BUTTON_1:
if (buttons_pressed[i + 1] & WPAD_BUTTON_1) return 1;
break;
case PAD_BUTTON_2:
if (buttons_pressed[i + 1] & WPAD_BUTTON_2) return 1;
break;
case PAD_BUTTON_Z:
if (buttons_pressed[i + 1] & WPAD_BUTTON_Z) return 1;
break;
case PAD_BUTTON_C:
if (buttons_pressed[i + 1] & WPAD_BUTTON_C) return 1;
break;
case PAD_BUTTON_PLUS:
if (buttons_pressed[i + 1] & WPAD_BUTTON_PLUS) return 1;
break;
case PAD_BUTTON_MINUS:
if (buttons_pressed[i + 1] & WPAD_BUTTON_MINUS) return 1;
break;
case PAD_BUTTON_HOME:
if (buttons_pressed[i + 1] & WPAD_BUTTON_HOME) return 1;
break;
}
}
//Turns out the Pro Controller and Classic Controller have almost the exact same mapping
//Except for the Pro Controller having clicky sticks
else if (isClassicController(&pads[i]) || isProController(&pads[i])) {
switch (button) {
case PAD_BUTTON_UP:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_UP) return 1;
break;
case PAD_BUTTON_DOWN:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_DOWN) return 1;
break;
case PAD_BUTTON_LEFT:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_LEFT) return 1;
break;
case PAD_BUTTON_RIGHT:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_RIGHT) return 1;
break;
case PAD_BUTTON_A:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_A) return 1;
break;
case PAD_BUTTON_B:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_B) return 1;
break;
case PAD_BUTTON_X:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_X) return 1;
break;
case PAD_BUTTON_Y:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_Y) return 1;
break;
case PAD_BUTTON_L:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_L) return 1;
break;
case PAD_BUTTON_R:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_R) return 1;
break;
case PAD_BUTTON_ZL:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_ZL) return 1;
break;
case PAD_BUTTON_ZR:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_ZR) return 1;
break;
case PAD_BUTTON_PLUS:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_PLUS) return 1;
break;
case PAD_BUTTON_MINUS:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_MINUS) return 1;
break;
case PAD_BUTTON_HOME:
if (buttons_pressed[i + 1] & WPAD_CLASSIC_BUTTON_HOME) return 1;
break;
}
//Here, we handle the aforementioned clicky sticks
if (isProController(&pads[i])) {
switch (button) {
case PAD_BUTTON_STICK_L:
if (buttons_pressed[i + 1] & WPAD_PRO_BUTTON_STICK_L) return 1;
break;
case PAD_BUTTON_STICK_R:
if (buttons_pressed[i + 1] & WPAD_PRO_BUTTON_STICK_R) return 1;
break;
}
}
}
}
}
return 0;
}
int isHeld(int button) {
//Check for any button at all
if (button == PAD_BUTTON_ANY) {
for (int i = 0; i < 5; i++) {
if (buttons_hold[i] > 0) return 1;
if (stateArray[i] > 0) return 1;
}
}
//VPad buttons
switch (button) {
case PAD_BUTTON_A:
if (buttons_hold[0] & VPAD_BUTTON_A) return 1;
if (stateArray[0] & VPAD_BUTTON_A) return 1;
break;
case PAD_BUTTON_B:
if (buttons_hold[0] & VPAD_BUTTON_B) return 1;
if (stateArray[0] & VPAD_BUTTON_B) return 1;
break;
case PAD_BUTTON_X:
if (buttons_hold[0] & VPAD_BUTTON_X) return 1;
if (stateArray[0] & VPAD_BUTTON_X) return 1;
break;
case PAD_BUTTON_Y:
if (buttons_hold[0] & VPAD_BUTTON_Y) return 1;
if (stateArray[0] & VPAD_BUTTON_Y) return 1;
break;
case PAD_BUTTON_UP:
if (buttons_hold[0] & VPAD_BUTTON_UP) return 1;
if (stateArray[0] & VPAD_BUTTON_UP) return 1;
break;
case PAD_BUTTON_DOWN:
if (buttons_hold[0] & VPAD_BUTTON_DOWN) return 1;
if (stateArray[0] & VPAD_BUTTON_DOWN) return 1;
break;
case PAD_BUTTON_LEFT:
if (buttons_hold[0] & VPAD_BUTTON_LEFT) return 1;
if (stateArray[0] & VPAD_BUTTON_LEFT) return 1;
break;
case PAD_BUTTON_RIGHT:
if (buttons_hold[0] & VPAD_BUTTON_RIGHT) return 1;
if (stateArray[0] & VPAD_BUTTON_RIGHT) return 1;
break;
case PAD_BUTTON_L:
if (buttons_hold[0] & VPAD_BUTTON_L) return 1;
if (stateArray[0] & VPAD_BUTTON_L) return 1;
break;
case PAD_BUTTON_R:
if (buttons_hold[0] & VPAD_BUTTON_R) return 1;
if (stateArray[0] & VPAD_BUTTON_R) return 1;
break;
case PAD_BUTTON_ZL:
if (buttons_hold[0] & VPAD_BUTTON_ZL) return 1;
if (stateArray[0] & VPAD_BUTTON_ZL) return 1;
break;
case PAD_BUTTON_ZR:
if (buttons_hold[0] & VPAD_BUTTON_ZR) return 1;
if (stateArray[0] & VPAD_BUTTON_ZR) return 1;
break;
case PAD_BUTTON_PLUS:
if (buttons_hold[0] & VPAD_BUTTON_PLUS) return 1;
if (stateArray[0] & VPAD_BUTTON_PLUS) return 1;
break;
case PAD_BUTTON_MINUS:
if (buttons_hold[0] & VPAD_BUTTON_MINUS) return 1;
if (stateArray[0] & VPAD_BUTTON_MINUS) return 1;
break;
case PAD_BUTTON_HOME:
if (buttons_hold[0] & VPAD_BUTTON_HOME) return 1;
if (stateArray[0] & VPAD_BUTTON_HOME) return 1;
break;
case PAD_BUTTON_SYNC:
if (buttons_hold[0] & VPAD_BUTTON_SYNC) return 1;
if (stateArray[0] & VPAD_BUTTON_SYNC) return 1;
break;
case PAD_BUTTON_STICK_L:
if (buttons_hold[0] & VPAD_BUTTON_L) return 1;
if (stateArray[0] & VPAD_BUTTON_L) return 1;
break;
case PAD_BUTTON_STICK_R:
if (buttons_hold[0] & VPAD_BUTTON_STICK_R) return 1;
if (stateArray[0] & VPAD_BUTTON_STICK_R) return 1;
break;
case PAD_BUTTON_TV:
if (buttons_hold[0] & VPAD_BUTTON_TV) return 1;
if (stateArray[0] & VPAD_BUTTON_TV) return 1;
break;
default:
@ -445,63 +192,63 @@ int isHeld(int button) {
if (isWiimote(&pads[i])) {
switch (button) {
case PAD_BUTTON_UP:
if (buttons_hold[i + 1] & WPAD_BUTTON_UP) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_UP) return 1;
break;
case PAD_BUTTON_DOWN:
if (buttons_hold[i + 1] & WPAD_BUTTON_DOWN) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_DOWN) return 1;
break;
case PAD_BUTTON_LEFT:
if (buttons_hold[i + 1] & WPAD_BUTTON_LEFT) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_LEFT) return 1;
break;
case PAD_BUTTON_RIGHT:
if (buttons_hold[i + 1] & WPAD_BUTTON_RIGHT) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_RIGHT) return 1;
break;
case PAD_BUTTON_A:
if (buttons_hold[i + 1] & WPAD_BUTTON_A) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_A) return 1;
break;
case PAD_BUTTON_B:
if (buttons_hold[i + 1] & WPAD_BUTTON_B) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_B) return 1;
break;
case PAD_BUTTON_L:
if (buttons_hold[i + 1] & WPAD_BUTTON_1) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_1) return 1;
break;
case PAD_BUTTON_R:
if (buttons_hold[i + 1] & WPAD_BUTTON_2) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_2) return 1;
break;
case PAD_BUTTON_1:
if (buttons_hold[i + 1] & WPAD_BUTTON_1) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_1) return 1;
break;
case PAD_BUTTON_2:
if (buttons_hold[i + 1] & WPAD_BUTTON_2) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_2) return 1;
break;
case PAD_BUTTON_Z:
if (buttons_hold[i + 1] & WPAD_BUTTON_Z) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_Z) return 1;
break;
case PAD_BUTTON_C:
if (buttons_hold[i + 1] & WPAD_BUTTON_C) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_C) return 1;
break;
case PAD_BUTTON_PLUS:
if (buttons_hold[i + 1] & WPAD_BUTTON_PLUS) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_PLUS) return 1;
break;
case PAD_BUTTON_MINUS:
if (buttons_hold[i + 1] & WPAD_BUTTON_MINUS) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_MINUS) return 1;
break;
case PAD_BUTTON_HOME:
if (buttons_hold[i + 1] & WPAD_BUTTON_HOME) return 1;
if (stateArray[i + 1] & WPAD_BUTTON_HOME) return 1;
break;
}
}
@ -510,312 +257,74 @@ int isHeld(int button) {
else if (isClassicController(&pads[i]) || isProController(&pads[i])) {
switch (button) {
case PAD_BUTTON_UP:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_UP) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_UP) return 1;
break;
case PAD_BUTTON_DOWN:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_DOWN) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_DOWN) return 1;
break;
case PAD_BUTTON_LEFT:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_LEFT) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_LEFT) return 1;
break;
case PAD_BUTTON_RIGHT:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_RIGHT) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_RIGHT) return 1;
break;
case PAD_BUTTON_A:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_A) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_A) return 1;
break;
case PAD_BUTTON_B:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_B) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_B) return 1;
break;
case PAD_BUTTON_X:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_X) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_X) return 1;
break;
case PAD_BUTTON_Y:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_Y) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_Y) return 1;
break;
case PAD_BUTTON_L:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_L) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_L) return 1;
break;
case PAD_BUTTON_R:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_R) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_R) return 1;
break;
case PAD_BUTTON_ZL:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_ZL) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_ZL) return 1;
break;
case PAD_BUTTON_ZR:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_ZR) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_ZR) return 1;
break;
case PAD_BUTTON_PLUS:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_PLUS) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_PLUS) return 1;
break;
case PAD_BUTTON_MINUS:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_MINUS) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_MINUS) return 1;
break;
case PAD_BUTTON_HOME:
if (buttons_hold[i + 1] & WPAD_CLASSIC_BUTTON_HOME) return 1;
if (stateArray[i + 1] & WPAD_CLASSIC_BUTTON_HOME) return 1;
break;
}
//Here, we handle the aforementioned clicky sticks
if (isProController(&pads[i])) {
switch (button) {
case PAD_BUTTON_STICK_L:
if (buttons_hold[i + 1] & WPAD_PRO_BUTTON_STICK_L) return 1;
if (stateArray[i + 1] & WPAD_PRO_BUTTON_STICK_L) return 1;
break;
case PAD_BUTTON_STICK_R:
if (buttons_hold[i + 1] & WPAD_PRO_BUTTON_STICK_R) return 1;
break;
}
}
}
}
}
return 0;
}
int isReleased(int button) {
//Check for any button at all
if (button == PAD_BUTTON_ANY) {
for (int i = 0; i < 5; i++) {
if (buttons_released[i] > 0) return 1;
}
}
//VPad buttons
switch (button) {
case PAD_BUTTON_A:
if (buttons_released[0] & VPAD_BUTTON_A) return 1;
break;
case PAD_BUTTON_B:
if (buttons_released[0] & VPAD_BUTTON_B) return 1;
break;
case PAD_BUTTON_X:
if (buttons_released[0] & VPAD_BUTTON_X) return 1;
break;
case PAD_BUTTON_Y:
if (buttons_released[0] & VPAD_BUTTON_Y) return 1;
break;
case PAD_BUTTON_UP:
if (buttons_released[0] & VPAD_BUTTON_UP) return 1;
break;
case PAD_BUTTON_DOWN:
if (buttons_released[0] & VPAD_BUTTON_DOWN) return 1;
break;
case PAD_BUTTON_LEFT:
if (buttons_released[0] & VPAD_BUTTON_LEFT) return 1;
break;
case PAD_BUTTON_RIGHT:
if (buttons_released[0] & VPAD_BUTTON_RIGHT) return 1;
break;
case PAD_BUTTON_L:
if (buttons_released[0] & VPAD_BUTTON_L) return 1;
break;
case PAD_BUTTON_R:
if (buttons_released[0] & VPAD_BUTTON_R) return 1;
break;
case PAD_BUTTON_ZL:
if (buttons_released[0] & VPAD_BUTTON_ZL) return 1;
break;
case PAD_BUTTON_ZR:
if (buttons_released[0] & VPAD_BUTTON_ZR) return 1;
break;
case PAD_BUTTON_PLUS:
if (buttons_released[0] & VPAD_BUTTON_PLUS) return 1;
break;
case PAD_BUTTON_MINUS:
if (buttons_released[0] & VPAD_BUTTON_MINUS) return 1;
break;
case PAD_BUTTON_HOME:
if (buttons_released[0] & VPAD_BUTTON_HOME) return 1;
break;
case PAD_BUTTON_SYNC:
if (buttons_released[0] & VPAD_BUTTON_SYNC) return 1;
break;
case PAD_BUTTON_STICK_L:
if (buttons_released[0] & VPAD_BUTTON_L) return 1;
break;
case PAD_BUTTON_STICK_R:
if (buttons_released[0] & VPAD_BUTTON_STICK_R) return 1;
break;
case PAD_BUTTON_TV:
if (buttons_released[0] & VPAD_BUTTON_TV) return 1;
break;
default:
break;
}
//Buttons handled by the padscore library
for (int i = 0; i < 4; i++) {
if (padErrors[i] == 0) {
if (isWiimote(&pads[i])) {
switch (button) {
case PAD_BUTTON_UP:
if (buttons_released[i + 1] & WPAD_BUTTON_UP) return 1;
break;
case PAD_BUTTON_DOWN:
if (buttons_released[i + 1] & WPAD_BUTTON_DOWN) return 1;
break;
case PAD_BUTTON_LEFT:
if (buttons_released[i + 1] & WPAD_BUTTON_LEFT) return 1;
break;
case PAD_BUTTON_RIGHT:
if (buttons_released[i + 1] & WPAD_BUTTON_RIGHT) return 1;
break;
case PAD_BUTTON_A:
if (buttons_released[i + 1] & WPAD_BUTTON_A) return 1;
break;
case PAD_BUTTON_B:
if (buttons_released[i + 1] & WPAD_BUTTON_B) return 1;
break;
case PAD_BUTTON_L:
if (buttons_released[i + 1] & WPAD_BUTTON_1) return 1;
break;
case PAD_BUTTON_R:
if (buttons_released[i + 1] & WPAD_BUTTON_2) return 1;
break;
case PAD_BUTTON_1:
if (buttons_released[i + 1] & WPAD_BUTTON_1) return 1;
break;
case PAD_BUTTON_2:
if (buttons_released[i + 1] & WPAD_BUTTON_2) return 1;
break;
case PAD_BUTTON_Z:
if (buttons_released[i + 1] & WPAD_BUTTON_Z) return 1;
break;
case PAD_BUTTON_C:
if (buttons_released[i + 1] & WPAD_BUTTON_C) return 1;
break;
case PAD_BUTTON_PLUS:
if (buttons_released[i + 1] & WPAD_BUTTON_PLUS) return 1;
break;
case PAD_BUTTON_MINUS:
if (buttons_released[i + 1] & WPAD_BUTTON_MINUS) return 1;
break;
case PAD_BUTTON_HOME:
if (buttons_released[i + 1] & WPAD_BUTTON_HOME) return 1;
break;
}
}
//Turns out the Pro Controller and Classic Controller have almost the exact same mapping
//Except for the Pro Controller having clicky sticks
else if (isClassicController(&pads[i]) || isProController(&pads[i])) {
switch (button) {
case PAD_BUTTON_UP:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_UP) return 1;
break;
case PAD_BUTTON_DOWN:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_DOWN) return 1;
break;
case PAD_BUTTON_LEFT:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_LEFT) return 1;
break;
case PAD_BUTTON_RIGHT:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_RIGHT) return 1;
break;
case PAD_BUTTON_A:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_A) return 1;
break;
case PAD_BUTTON_B:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_B) return 1;
break;
case PAD_BUTTON_X:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_X) return 1;
break;
case PAD_BUTTON_Y:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_Y) return 1;
break;
case PAD_BUTTON_L:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_L) return 1;
break;
case PAD_BUTTON_R:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_R) return 1;
break;
case PAD_BUTTON_ZL:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_ZL) return 1;
break;
case PAD_BUTTON_ZR:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_ZR) return 1;
break;
case PAD_BUTTON_PLUS:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_PLUS) return 1;
break;
case PAD_BUTTON_MINUS:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_MINUS) return 1;
break;
case PAD_BUTTON_HOME:
if (buttons_released[i + 1] & WPAD_CLASSIC_BUTTON_HOME) return 1;
break;
}
//Here, we handle the aforementioned clicky sticks
if (isProController(&pads[i])) {
switch (button) {
case PAD_BUTTON_STICK_L:
if (buttons_released[i + 1] & WPAD_PRO_BUTTON_STICK_L) return 1;
break;
case PAD_BUTTON_STICK_R:
if (buttons_released[i + 1] & WPAD_PRO_BUTTON_STICK_R) return 1;
if (stateArray[i + 1] & WPAD_PRO_BUTTON_STICK_R) return 1;
break;
}
}

View File

@ -31,20 +31,25 @@ enum buttons {
PAD_BUTTON_ANY
};
enum buttonStates {
PRESS,
HOLD,
RELEASE
};
uint32_t buttons_hold[5]; //Held buttons
uint32_t buttons_pressed[5]; //Pressed buttons
uint32_t buttons_released[5]; //Released buttons
void pingControllers();
void updatePressedButtons();
void updateHeldButtons();
void updateReleasedButtons();
void updateButtons();
bool stickPos(u8 stick, f32 value);
bool isWiimote(KPADData *padData);
bool isClassicController(KPADData *padData);
bool isProController(KPADData *padData);
int isPressed(int button);
int isHeld(int button);
int isReleased(int button);
int checkButton(int button, int state);
// int isPressed(int button);
// int isHeld(int button);
// int isReleased(int button);
#endif //CONTROLLERS_H

View File

@ -677,20 +677,18 @@ int Menu_Main(void) {
flipBuffers();
while(1) {
updatePressedButtons();
updateHeldButtons();
if (isPressed(PAD_BUTTON_ANY) || isHeld(PAD_BUTTON_ANY) || stickPos(4, 0.7)) break;
updateButtons();
if (checkButton(PAD_BUTTON_ANY, PRESS) || checkButton(PAD_BUTTON_ANY, HOLD) || stickPos(4, 0.7)) break;
}
updatePressedButtons();
updateHeldButtons();
updateButtons();
if (isPressed(PAD_BUTTON_DOWN) || isHeld(PAD_BUTTON_DOWN) || stickPos(1, -0.7) || stickPos(3, -0.7)) {
if (checkButton(PAD_BUTTON_DOWN, PRESS) || checkButton(PAD_BUTTON_DOWN, HOLD) || stickPos(1, -0.7) || stickPos(3, -0.7)) {
if (entrycount <= 14) cursor = (cursor + 1) % entrycount;
else if (cursor < 6) cursor++;
else if ((cursor + scroll + 1) % entrycount) scroll++;
else cursor = scroll = 0;
os_usleep(100000);
} else if (isPressed(PAD_BUTTON_UP) || isHeld(PAD_BUTTON_UP) || stickPos(1, 0.7) || stickPos(3, 0.7)) {
} else if (checkButton(PAD_BUTTON_UP, PRESS) || checkButton(PAD_BUTTON_UP, HOLD) || stickPos(1, 0.7) || stickPos(3, 0.7)) {
if (scroll > 0) cursor -= (cursor>6) ? 1 : 0 * (scroll--);
else if (cursor > 0) cursor--;
else if (entrycount > 14) scroll = entrycount - (cursor = 6) - 1;
@ -698,7 +696,7 @@ int Menu_Main(void) {
os_usleep(100000);
}
if (isPressed(PAD_BUTTON_LEFT) || isHeld(PAD_BUTTON_LEFT) || stickPos(0, -0.7) || stickPos(2, -0.7)) {
if (checkButton(PAD_BUTTON_LEFT, PRESS) || checkButton(PAD_BUTTON_LEFT, HOLD) || stickPos(0, -0.7) || stickPos(2, -0.7)) {
if (menu==3) {
if (task == 5) {
switch(cursor) {
@ -746,7 +744,7 @@ int Menu_Main(void) {
}
}
os_usleep(100000);
} else if (isPressed(PAD_BUTTON_RIGHT) || isHeld(PAD_BUTTON_RIGHT) || stickPos(0, 0.7) || stickPos(2, 0.7)) {
} else if (checkButton(PAD_BUTTON_RIGHT, PRESS) || checkButton(PAD_BUTTON_RIGHT, HOLD) || stickPos(0, 0.7) || stickPos(2, 0.7)) {
if (menu == 3) {
if (task == 5) {
switch(cursor) {
@ -796,7 +794,7 @@ int Menu_Main(void) {
os_usleep(100000);
}
if (isPressed(PAD_BUTTON_R)) {
if (checkButton(PAD_BUTTON_R, PRESS)) {
if (menu == 1) {
tsort = (tsort + 1) % 4;
qsort(titles, count, sizeof(Title), titleSort);
@ -806,7 +804,7 @@ int Menu_Main(void) {
}
}
if (isPressed(PAD_BUTTON_L)) {
if (checkButton(PAD_BUTTON_L, PRESS)) {
if ((menu==1) && (tsort > 0)) {
sorta *= -1;
qsort(titles, count, sizeof(Title), titleSort);
@ -816,7 +814,7 @@ int Menu_Main(void) {
}
}
if (isPressed(PAD_BUTTON_A)) {
if (checkButton(PAD_BUTTON_A, PRESS)) {
clearBuffers();
if (menu < 3) {
if (menu == 0) {
@ -928,7 +926,7 @@ int Menu_Main(void) {
} break;
}
}
} else if (isPressed(PAD_BUTTON_B) && menu > 0) {
} else if (checkButton(PAD_BUTTON_B, PRESS) && menu > 0) {
clearBuffers();
menu--;
cursor = scroll = 0;
@ -938,7 +936,7 @@ int Menu_Main(void) {
}
if (menu == 2) cursor = cursort;
}
if (isPressed(PAD_BUTTON_HOME)) break;
if (checkButton(PAD_BUTTON_HOME, PRESS)) break;
}
if (tgaBufDRC) free(tgaBufDRC);

View File

@ -299,9 +299,9 @@ bool promptConfirm(Style st, const char* question) {
int ret = 0;
while(1) {
updatePressedButtons();
if (isPressed(PAD_BUTTON_ANY)) {
ret = isPressed(PAD_BUTTON_A);
updateButtons();
if (checkButton(PAD_BUTTON_ANY, PRESS)) {
ret = checkButton(PAD_BUTTON_A, PRESS);
break;
}
}
@ -329,8 +329,8 @@ void promptError(const char* message, ...) {
flipBuffers();
va_end(va);
while(1) {
updatePressedButtons();
if (isPressed(PAD_BUTTON_ANY)) break;
updateButtons();
if (checkButton(PAD_BUTTON_ANY, PRESS)) break;
}
}