bool Pad::waitReady() { int state; char stateString[16]; state = padGetState(m_port, m_slot); int lastState = -1; while ((state != PAD_STATE_STABLE) && (state != PAD_STATE_FINDCTP1)) { if (state != lastState) { padStateInt2String(state, stateString); //printf("Please wait, pad(%d,%d) is in state %s\n",m_port, m_slot, stateString); } lastState = state; state = padGetState(m_port, m_slot); } // Were the pad ever 'out of sync'? if (lastState != -1) { //printf("Pad OK!\n"); } return true; }
static int wait_pad(int port, int slot, int tries) { int state, last_state; char state_string[16]; state = padGetState(port, slot); if (state == PAD_STATE_DISCONN) { /* printf("SDL_Joystick: pad (%d, %d) is disconnected\n", port, slot); */ return -1; } last_state = -1; while ((state != PAD_STATE_STABLE) && (state != PAD_STATE_FINDCTP1)) { if (state != last_state) { padStateInt2String(state, state_string); printf("SDL_Joystick: pad (%d,%d) is in state %s\n", port, slot, state_string); } last_state = state; state = padGetState(port, slot); tries--; if (tries == 0) { printf("waited too long! giving up\n"); break; } } return 0; }
///////////////////////////////////////////////////////////////////// //checkPadConnected ///////////////////////////////////////////////////////////////////// void checkPadConnected(void) { int ret, i; ret=padGetState(0, 0); while((ret != PAD_STATE_STABLE) && (ret != PAD_STATE_FINDCTP1)) { if(ret==PAD_STATE_DISCONN) { #if defined DEBUG scr_printf(" Pad(%d, %d) is disconnected\n", 0, 0); #endif } ret=padGetState(0, 0); } if(i==1) { //scr_printf(" Pad: OK!\n"); } }
/* * waitPadReady() */ static int waitPadReady(struct pad_data_t* pad) { int state; // busy wait for the pad to get ready do { state = padGetState(pad->port, pad->slot); } while((state != PAD_STATE_STABLE) && (state != PAD_STATE_FINDCTP1) && (state != PAD_STATE_DISCONN)); return state; };
void padWait(int port) { /* Wait for request to complete. */ while(padGetReqState(port, 0) != PAD_RSTAT_COMPLETE) wait_vsync(); /* Wait for pad to be stable. */ while(padGetState(port, 0) != PAD_STATE_STABLE) wait_vsync(); }
static int waitPadReady(int port, int slot) { int state; int lastState; char stateString[16]; state = padGetState(port, slot); lastState = -1; while((state != PAD_STATE_STABLE) && (state != PAD_STATE_FINDCTP1)) { if (state != lastState) { padStateInt2String(state, stateString); } lastState = state; state=padGetState(port, slot); } // Were the pad ever 'out of sync'? if (lastState != -1) { } return 0; }
int menu_input(int port, int center_screen) { int ret[2]; u32 paddata[2]; u32 new_pad[2]; u16 slot = 0; int change = 0; //check to see if pads are disconnected ret[port]=padGetState(0, slot); if((ret[port] != PAD_STATE_STABLE) && (ret[port] != PAD_STATE_FINDCTP1)) { if(ret[port]==PAD_STATE_DISCONN) { printf("Pad(%d, %d) is disconnected\n", 0, slot); } ret[port]=padGetState(0, slot); } ret[port] = padRead(0, slot, &buttons[port]); // port, slot, buttons if (ret[port] != 0) { paddata[port]= 0xffff ^ buttons[port].btns; new_pad[port] = paddata[port] & ~old_pad[port]; // buttons pressed AND NOT buttons previously pressed old_pad[port] = paddata[port]; if(paddata[port] & PAD_LEFT && center_screen) { Settings.offset_x--; change = 1; } if(new_pad[port] & PAD_DOWN && !center_screen) { change = 1; } if(paddata[port] & PAD_DOWN && center_screen) { Settings.offset_y++; change = 1; } if(paddata[port] & PAD_RIGHT && center_screen) { Settings.offset_x++; change = 1; } if(new_pad[port] & PAD_UP && !center_screen) { change = -1; } if(paddata[port] & PAD_UP && center_screen) { Settings.offset_y--; change = 1; } if(new_pad[port] & PAD_START && center_screen) { change = 2; } if(new_pad[port] & PAD_SELECT && center_screen) { Settings.offset_x = 0; Settings.offset_y = 0; change = 1; } if(new_pad[port] & PAD_CIRCLE) { selected = 1; } if(new_pad[port] & PAD_CROSS) { } if((new_pad[port] == Settings.PlayerInput[port][0]) && !center_screen) { selected = 2; } } if((center_screen && change) || (center_screen == 2)) { gsGlobal->StartX = defaultx + Settings.offset_x; gsGlobal->StartY = defaulty + Settings.offset_y; normalize_screen(); gsKit_clear(gsGlobal,GS_SETREG_RGBAQ(0x00,0x00,0x00,0x00,0x00)); menu_primitive("Centering", &BG_TEX, 0, 0, gsGlobal->Width, gsGlobal->Height); DrawScreen(gsGlobal); center_screen = 1; } return change; }
void Pad::update() { int ret = padGetState(m_port, m_slot ); while ((ret != PAD_STATE_STABLE) && (ret != PAD_STATE_FINDCTP1)) { if (ret == PAD_STATE_DISCONN) { //printf("Pad(%d, %d) is disconnected\n", m_port, m_slot); } ret = padGetState(m_port, m_slot); } ret = padRead(m_port, m_slot, (padButtonStatus*)&m_buttonStatus); // port, slot, buttons if (ret != 0) { m_padData = 0xffff ^ m_buttonStatus.btns; m_newPad = m_padData & ~m_oldPad; m_oldPad = m_padData; memset(&m_buttons, 0, sizeof(Buttons)); if (m_newPad & PAD_LEFT) m_buttons.left = true; if (m_newPad & PAD_DOWN) m_buttons.down = true; if (m_newPad & PAD_RIGHT) m_buttons.rigth = true; if (m_newPad & PAD_UP) m_buttons.up = true; if (m_newPad & PAD_START) m_buttons.start = true; if (m_newPad & PAD_SELECT) m_buttons.select = true; if (m_newPad & PAD_SQUARE) m_buttons.square = true; if (m_newPad & PAD_CROSS) m_buttons.cross = true; if (m_newPad & PAD_CIRCLE) m_buttons.circle = true; if (m_newPad & PAD_TRIANGLE) m_buttons.triangle = true; if (m_newPad & PAD_R1) m_buttons.r1 = true; if (m_newPad & PAD_L1) m_buttons.l1 = true; if (m_newPad & PAD_R2) m_buttons.r2 = true; if (m_newPad & PAD_L2) m_buttons.l2 = true; const int deadRange = 30; const int deadMin = 127 - deadRange; const int deadMax = 128 + deadRange; int test = 0; if (m_buttonStatus.rjoy_h < deadMin) { m_rStickH = (m_buttonStatus.rjoy_h - 127) / 127.0f; } else if (m_buttonStatus.rjoy_h > deadMax) { m_rStickH = (m_buttonStatus.rjoy_h - 127) / 127.0f; } else { m_buttonStatus.rjoy_h = 0; m_rStickH = 0.0f; } if (m_buttonStatus.rjoy_v < deadMin) { m_rStickV = (m_buttonStatus.rjoy_v - 127) / 127.0f; } else if (m_buttonStatus.rjoy_v > deadMax) { test = m_buttonStatus.rjoy_v - 127; m_rStickV = (m_buttonStatus.rjoy_v - 127) / 127.0f; } else { m_buttonStatus.rjoy_v = 0; m_rStickV = 0.0f; } if (m_buttonStatus.ljoy_h < deadMin) { m_lStickH = (m_buttonStatus.ljoy_h - 127) / 127.0f; } else if (m_buttonStatus.ljoy_h > deadMax) { m_lStickH = (m_buttonStatus.ljoy_h - 127) / 127.0f; } else { m_buttonStatus.ljoy_h = 0; m_lStickH = 0.0f; } if (m_buttonStatus.ljoy_v < deadMin) { m_lStickV = (m_buttonStatus.ljoy_v - 127) / 127.0f; } else if (m_buttonStatus.ljoy_v > deadMax) { test = m_buttonStatus.ljoy_v - 127; m_lStickV = (m_buttonStatus.ljoy_v - 127) / 127.0f; } else { m_buttonStatus.ljoy_v = 0; m_lStickV = 0.0f; } } }
bool Ps2Pad::checkPadReady(int port, int slot) { int state = padGetState(port, slot); return (state == PAD_STATE_STABLE) || (state == PAD_STATE_FINDCTP1); }
int main(int argc, char **argv) { u32 port; struct padButtonStatus buttons; int dualshock[2]; int acts[2]; SifInitRpc(0); printf("libpadx sample"); if((argc == 2) && (strncmp(argv[1], "free", 4) == 0)) { printf(" - Using PS2SDK freesio2.irx and freepad.irx modules.\n"); loadmodules(1); } else { printf(" - Using ROM XSIO2MAN and XPADMAN modules.\n"); printf("Start this sample with 'free' as an argument to load freesio2.irx and freepad.irx\n"); printf("Example: ps2client execee host:padx_sample.elf free\n"); loadmodules(0); } padInit(0); padBuf[0] = memalign(64, 256); padBuf[1] = memalign(64, 256); old_pad[0] = 0; old_pad[1] = 0; portConnected[0] = 0; portConnected[1] = 0; dualshock[0] = 0; dualshock[1] = 0; acts[0] = 0; acts[1] = 0; padPortOpen(0, 0, padBuf[0]); padPortOpen(1, 0, padBuf[1]); while(1) { for(port=0; port < 2; port++) { s32 state = padGetState(port, 0); if((state == PAD_STATE_STABLE) && (portConnected[port] == 0)) { u32 i; u8 mTable[8]; u32 ModeCurId; u32 ModeCurOffs; u32 ModeCurExId; u32 ModeTableNum = padInfoMode(port, 0, PAD_MODETABLE, -1); printf("Controller (%i) connected\n", port); /* Check if dualshock and if so, activate analog mode */ for(i = 0; i < ModeTableNum; i++) mTable[i] = padInfoMode(port, 0, PAD_MODETABLE, i); /* Works for dualshock2 */ if((mTable[0] == 4) && (mTable[1] == 7) && (ModeTableNum == 2)) dualshock[port] = 1; /* Active and lock analog mode */ if(dualshock[port] == 1) { padSetMainMode(port, 0, PAD_MMODE_DUALSHOCK, PAD_MMODE_LOCK); padWait(port); } ModeCurId = padInfoMode(port, 0, PAD_MODECURID, 0); ModeCurOffs = padInfoMode(port, 0, PAD_MODECUROFFS, 0); ModeCurExId = padInfoMode(port, 0, PAD_MODECUREXID, 0); ModeTableNum = padInfoMode(port, 0, PAD_MODETABLE, -1); acts[port] = padInfoAct(port, 0, -1, 0); printf(" ModeCurId : %i (%s)\n", (int)ModeCurId, padTypeStr[ModeCurId]); printf(" ModeCurExId : %i\n", (int)ModeCurExId); printf(" ModeTable : "); for(i = 0; i < ModeTableNum; i++) { mTable[i] = padInfoMode(port, 0, PAD_MODETABLE, i); printf("%i ", (int)mTable[i]); } printf("\n"); printf(" ModeTableNum : %i\n", (int)ModeTableNum); printf(" ModeCurOffs : %i\n", (int)ModeCurOffs); printf(" NumOfAct : %i\n", (int)acts[port]); printf(" PressMode : %i\n", (int)padInfoPressMode(port, 0)); if(acts[port] > 0) { u8 actAlign[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; u32 i; /* Set offsets for motor parameters for SetActDirect. */ for(i=0; i < acts[port]; i++) actAlign[i] = i; padSetActAlign(port, 0, actAlign); padWait(port); } printf(" EnterPressMode : %i\n", (int)padEnterPressMode(port, 0)); padWait(port); printf("Ready\n"); portConnected[port] = 1; } if((state == PAD_STATE_DISCONN) && (portConnected[port] == 1)) { printf("Controller (%i) disconnected\n", port); portConnected[port] = 0; } if(portConnected[port] == 1) { s32 ret = padRead(port, 0, &buttons); if(ret != 0) { paddata[port] = 0xffff ^ buttons.btns; new_pad[port] = paddata[port] & ~old_pad[port]; old_pad[port] = paddata[port]; // Values 50 and 200 used because my controllers are worn out :-) if((buttons.ljoy_h <= 50) || (buttons.ljoy_h >= 200)) printf("Left Analog X: %i\n", (int)buttons.ljoy_h); if((buttons.ljoy_v <= 50) || (buttons.ljoy_v >= 200)) printf("Left Analog Y: %i\n", (int)buttons.ljoy_v); if((buttons.rjoy_h <= 50) || (buttons.rjoy_h >= 200)) printf("Right Analog X: %i\n", (int)buttons.rjoy_h); if((buttons.rjoy_v <= 50) || (buttons.rjoy_v >= 200)) printf("Right Analog Y: %i\n", (int)buttons.rjoy_v); if(new_pad[port]) printf("Controller (%i) button(s) pressed: ", (int)port); if(new_pad[port] & PAD_LEFT) printf("LEFT "); if(new_pad[port] & PAD_RIGHT) printf("RIGHT "); if(new_pad[port] & PAD_UP) printf("UP "); if(new_pad[port] & PAD_DOWN) printf("DOWN "); if(new_pad[port] & PAD_START) printf("START "); if(new_pad[port] & PAD_SELECT) printf("SELECT "); if(new_pad[port] & PAD_SQUARE) printf("SQUARE (Pressure: %i) ", (int)buttons.square_p); if(new_pad[port] & PAD_TRIANGLE) printf("TRIANGLE (Pressure: %i) ", (int)buttons.triangle_p); if(new_pad[port] & PAD_CIRCLE) printf("CIRCLE (Pressure: %i) ", (int)buttons.circle_p); if(new_pad[port] & PAD_CROSS) printf("CROSS (Pressure: %i) ", (int)buttons.cross_p); if(new_pad[port] & PAD_L1) { printf("L1 (Start Little Motor) "); padStartAct(port, 0, 1); } if(new_pad[port] & PAD_L2) { printf("L2 (Stop Little Motor) "); padStartAct(port, 0, 0); } if(new_pad[port] & PAD_L3) printf("L3 "); if(new_pad[port] & PAD_R1) { printf("R1 (Start Big Motor) "); padStartAct(port, 1, 255); } if(new_pad[port] & PAD_R2) { printf("R2 (Stop Big Motor) "); padStopAct(port, 1); } if(new_pad[port] & PAD_R3) printf("R3 "); if(new_pad[port]) printf("\n"); } } } wait_vsync(); } return 0; }