static int _GetKeys(int Control, BUTTONS * Keys, controller_config_t* config, int (*available)(int), unsigned int (*getButtons)(WPADData*)) { if(wpadNeedScan){ WPAD_ScanPads(); wpadNeedScan = 0; } WPADData* wpad = WPAD_Data(Control); BUTTONS* c = Keys; memset(c, 0, sizeof(BUTTONS)); //Reset buttons & sticks c->btns.All = 0xFFFF; c->leftStickX = c->leftStickY = c->rightStickX = c->rightStickY = 128; // Only use a connected nunchuck controller if(!available(Control)) return 0; unsigned int b = getButtons(wpad); inline int isHeld(button_tp button){ return (b & button->mask) == button->mask ? 0 : 1; } c->btns.SQUARE_BUTTON = isHeld(config->SQU); c->btns.CROSS_BUTTON = isHeld(config->CRO); c->btns.CIRCLE_BUTTON = isHeld(config->CIR); c->btns.TRIANGLE_BUTTON = isHeld(config->TRI); c->btns.R1_BUTTON = isHeld(config->R1); c->btns.L1_BUTTON = isHeld(config->L1); c->btns.R2_BUTTON = isHeld(config->R2); c->btns.L2_BUTTON = isHeld(config->L2); c->btns.L_DPAD = isHeld(config->DL); c->btns.R_DPAD = isHeld(config->DR); c->btns.U_DPAD = isHeld(config->DU); c->btns.D_DPAD = isHeld(config->DD); c->btns.START_BUTTON = isHeld(config->START); c->btns.R3_BUTTON = isHeld(config->R3); c->btns.L3_BUTTON = isHeld(config->L3); c->btns.SELECT_BUTTON = isHeld(config->SELECT); //adjust values by 128 cause PSX sticks range 0-255 with a 128 center pos s8 stickX = 0; s8 stickY = 0; if(config->analogL->mask == NUNCHUK_AS_ANALOG){ stickX = getStickValue(&wpad->exp.nunchuk.js, STICK_X, 127); stickY = getStickValue(&wpad->exp.nunchuk.js, STICK_Y, 127); } else if(config->analogL->mask == IR_AS_ANALOG){ if(wpad->ir.smooth_valid){ stickX = ((short)(wpad->ir.sx - 512)) >> 2; stickY = -(signed char)((wpad->ir.sy - 384) / 3); } else {
static int _GetKeys(int Control, BUTTONS * Keys, controller_config_t* config, int (*available)(int), unsigned int (*getButtons)(WPADData*)) { WPADData* wpad = WPAD_Data(Control); BUTTONS* c = Keys; memset(c, 0, sizeof(BUTTONS)); // Only use a connected nunchuck controller if(!available(Control)) return 0; WPAD_ReadPending(Control, NULL); unsigned int b = getButtons(wpad); inline int isHeld(button_tp button){ return (b & button->mask) == button->mask; } c->R_DPAD = isHeld(config->DR); c->L_DPAD = isHeld(config->DL); c->D_DPAD = isHeld(config->DD); c->U_DPAD = isHeld(config->DU); c->START_BUTTON = isHeld(config->START); c->B_BUTTON = isHeld(config->B); c->A_BUTTON = isHeld(config->A); c->Z_TRIG = isHeld(config->Z); c->R_TRIG = isHeld(config->R); c->L_TRIG = isHeld(config->L); c->R_CBUTTON = isHeld(config->CR); c->L_CBUTTON = isHeld(config->CL); c->D_CBUTTON = isHeld(config->CD); c->U_CBUTTON = isHeld(config->CU); if(config->analog->mask == NUNCHUK_AS_ANALOG){ c->X_AXIS = getStickValue(&wpad->exp.nunchuk.js, STICK_X, 128); c->Y_AXIS = getStickValue(&wpad->exp.nunchuk.js, STICK_Y, 128); } else if(config->analog->mask == IR_AS_ANALOG){ if(wpad->ir.smooth_valid){ c->X_AXIS = ((short)(wpad->ir.sx - 512)) >> 2; c->Y_AXIS = -(signed char)((wpad->ir.sy - 384) / 3); } else {
static unsigned int getButtons(classic_ctrl_t* controller) { unsigned int b = (unsigned)controller->btns; s8 stickX = getStickValue(&controller->ljs, STICK_X, 7); s8 stickY = getStickValue(&controller->ljs, STICK_Y, 7); s8 substickX = getStickValue(&controller->rjs, STICK_X, 7); s8 substickY = getStickValue(&controller->rjs, STICK_Y, 7); if(stickX < -3) b |= L_STICK_L; if(stickX > 3) b |= L_STICK_R; if(stickY > 3) b |= L_STICK_U; if(stickY < -3) b |= L_STICK_D; if(substickX < -3) b |= R_STICK_L; if(substickX > 3) b |= R_STICK_R; if(substickY > 3) b |= R_STICK_U; if(substickY < -3) b |= R_STICK_D; return b; }
static int _GetKeys(int Control, BUTTONS * Keys, controller_config_t* config) { if(wpadNeedScan){ WPAD_ScanPads(); wpadNeedScan = 0; } WPADData* wpad = WPAD_Data(Control); BUTTONS* c = Keys; memset(c, 0, sizeof(BUTTONS)); //Reset buttons & sticks c->btns.All = 0xFFFF; c->leftStickX = c->leftStickY = c->rightStickX = c->rightStickY = 128; // Only use a connected classic controller if(!available(Control)) return 0; unsigned int b = getButtons(&wpad->exp.classic); inline int isHeld(button_tp button){ return (b & button->mask) == button->mask ? 0 : 1; } c->btns.SQUARE_BUTTON = isHeld(config->SQU); c->btns.CROSS_BUTTON = isHeld(config->CRO); c->btns.CIRCLE_BUTTON = isHeld(config->CIR); c->btns.TRIANGLE_BUTTON = isHeld(config->TRI); c->btns.R1_BUTTON = isHeld(config->R1); c->btns.L1_BUTTON = isHeld(config->L1); c->btns.R2_BUTTON = isHeld(config->R2); c->btns.L2_BUTTON = isHeld(config->L2); c->btns.L_DPAD = isHeld(config->DL); c->btns.R_DPAD = isHeld(config->DR); c->btns.U_DPAD = isHeld(config->DU); c->btns.D_DPAD = isHeld(config->DD); c->btns.START_BUTTON = isHeld(config->START); c->btns.R3_BUTTON = isHeld(config->R3); c->btns.L3_BUTTON = isHeld(config->L3); c->btns.SELECT_BUTTON = isHeld(config->SELECT); //adjust values by 128 cause PSX sticks range 0-255 with a 128 center pos s8 stickX = 0; s8 stickY = 0; if(config->analogL->mask == L_STICK_AS_ANALOG){ stickX = getStickValue(&wpad->exp.classic.ljs, STICK_X, 127); stickY = getStickValue(&wpad->exp.classic.ljs, STICK_Y, 127); } else if(config->analogL->mask == R_STICK_AS_ANALOG){ stickX = getStickValue(&wpad->exp.classic.rjs, STICK_X, 127); stickY = getStickValue(&wpad->exp.classic.rjs, STICK_Y, 127); } c->leftStickX = (u8)(stickX+127) & 0xFF; if(config->invertedYL) c->leftStickY = (u8)(stickY+127) & 0xFF; else c->leftStickY = (u8)(-stickY+127) & 0xFF; if(config->analogR->mask == L_STICK_AS_ANALOG){ stickX = getStickValue(&wpad->exp.classic.ljs, STICK_X, 127); stickY = getStickValue(&wpad->exp.classic.ljs, STICK_Y, 127); } else if(config->analogR->mask == R_STICK_AS_ANALOG){ stickX = getStickValue(&wpad->exp.classic.rjs, STICK_X, 127); stickY = getStickValue(&wpad->exp.classic.rjs, STICK_Y, 127); } c->rightStickX = (u8)(stickX+127) & 0xFF; if(config->invertedYR) c->rightStickY = (u8)(stickY+127) & 0xFF; else c->rightStickY = (u8)(-stickY+127) & 0xFF; // Return 1 if whether the exit button(s) are pressed return isHeld(config->exit) ? 0 : 1; }