Пример #1
0
void PadInitPads(void)
{
	padInit(0);
	padPortOpen(0, 0, padArea[0]);
	padPortOpen(1, 0, padArea[1]);

	memset(old_pad, 0, sizeof(old_pad));
}
Пример #2
0
/** Tries to start a single pad.
* @param pad The pad data holding structure 
* @return 0 Error, != 0 Ok */
static int startPad(struct pad_data_t* pad) {
	if(padPortOpen(pad->port, pad->slot, pad->padBuf) == 0) {
		return 0;
	}
	
	if(!initializePad(pad)) {
	        return 0;
	}

	waitPadReady(pad);
	return 1;
}
Пример #3
0
void initalise(void)
{
	int ret;
	
	// load all modules
	loadModules();
	// init pad
	padInit(0);
	if((ret = padPortOpen(0, 0, padBuf)) == 0) {
		#if defined DEBUG
			scr_printf("padOpenPort failed: %d\n", ret);
		#endif
		SleepThread();
	}

	if(!initializePad(0, 0)) {
		#if defined DEBUG
			scr_printf("pad initalization failed!\n");
		#endif
		SleepThread();
	}
}
Пример #4
0
/* Function to scan the system for joysticks.
 * This function should set SDL_numjoysticks to the number of available
 * joysticks.  Joystick 0 should be the system default joystick.
 * It should return number of joysticks, or -1 on an unrecoverable fatal error.
 */
int SDL_SYS_JoystickInit(void)
{
	int ret;
	int mtap_enabled;
	int index;
	int numports, numdevs;
	int port, slot;

	printf("SDL_Joystick: JoystickInit begins\n");

#ifdef PS2SDL_ENABLE_MTAP
	ret = SifLoadModule("rom0:XSIO2MAN", 0, NULL);
	if (ret < 0)
	{
		SDL_SetError("Failed to load XSIO2MAN");
		return 0;
	}

	ret = SifLoadModule("rom0:XPADMAN", 0, NULL);
	if (ret < 0)
	{
		SDL_SetError("Failed to load XPADMAN");
		return 0;
	}

	ret = SifLoadModule("rom0:XMTAPMAN", 0, NULL);
	if (ret < 0)
	{
		SDL_SetError("Failed to load XMTAPMAN");
		return 0;
	}
#else
	ret = SifLoadModule("rom0:SIO2MAN", 0, NULL);
	if (ret < 0)
	{
		SDL_SetError("Failed to load SIO2MAN");
		return 0;
	}

	ret = SifLoadModule("rom0:PADMAN", 0, NULL);
	if (ret < 0)
	{
		SDL_SetError("Failed to load PADMAN");
		return 0;
	}
#endif

	ret = padInit(0);
	printf("SDL_Joystick: padInit: %d\n", ret);

#ifdef PS2SDL_ENABLE_MTAP
	ret = mtapInit();
	printf("SDL_Joystick: mtapInit: %d\n", ret);
#endif

	numdevs = 0;
	numports = padGetPortMax();
	
	printf("SDL_Joystick: numports %d\n", numports);
	
	index = 0;

#ifdef PS2SDL_ENABLE_MTAP
	/* gawd: look for mtap connection on one of the ports. if it's there,
	 * then don't support the only interface.
	 */
	if (mtapPortOpen(0) == 1 && mtapGetConnection(0) == 1)
	{
		/* found on port 0 */
		mtap_enabled = 1;
		mtapPortClose(0);
		printf("SDL_Joystick: found mtap on port 0\n");
	}
	else if (mtapPortOpen(1) == 1 && mtapGetConnection(1) == 1)
	{
		/* found on port 1 */
		mtap_enabled = 1;
		mtapPortClose(1);
		printf("SDL_Joystick: found mtap on port 1\n");
	}
	else
	{
		mtap_enabled = 0;
		printf("SDL_Joystick: mtap adapter not found on either ports\n");
	}
#endif

	for (port=0; port<numports; port++)
	{
		int maxslots;

#ifdef PS2SDL_ENABLE_MTAP
		if (mtap_enabled)
		{
			ret = mtapPortOpen(port);
			printf("\nSDL_Joystick: Port: %d, mtapPortOpen: %d\n", port, ret);

			ret = mtapGetConnection(port);
			printf("SDL_Joystick: Port: %d, mtapGetConnection: %d\n", port, ret);

			if (ret != 1)
			{
				/* failed */
				mtapPortClose(port);
				continue;
			}
		}
#endif

		maxslots = padGetSlotMax(port);
		printf("SDL_Joystick: Port %d, MaxSlots: %d\n", port, maxslots);

		for (slot=0; slot<maxslots; slot++)
		{
			ret = padPortOpen(port, slot, &padbufs[256*index]);
			if (ret < 0)
			{
				//SDL_SetError("padPortOpen %d, %d failed\n", port, slot);
				//return 0;
				continue;
			}

			printf("Joystick %d at port=%d slot=%d\n", index, port, slot);
			joyports[index] = port;
			joyslots[index] = slot;
			index++;
		}
	}
 	
	SDL_numjoysticks = index;
	printf("SDL_Joystick: JoystickInit ends with %d joysticks\n", SDL_numjoysticks);
	return SDL_numjoysticks;
}
Пример #5
0
void Ps2Pad::initPad(void) {
	int modes = 0;
	if (_padStatus == STAT_NONE) {
		if (padPortOpen(_port, _slot, _padBuf) == 1) {
			_padStatus = STAT_OPEN;
			_padInitTime = _system->getMillis();
		} else {
			padPortClose(_port, _slot);
			printf("Unable to open port (%d/%d)!\n", _port, _slot);
		}
	} else {
		if (checkPadReady(_port, _slot)) {
			switch (_padStatus) {
				case STAT_OPEN:
					_padStatus = STAT_DETECT;
					break;
				case STAT_DETECT:
					_isDualShock = false;
					modes = padInfoMode(_port, _slot, PAD_MODETABLE, -1);

					// Verify that the controller has a DUAL SHOCK mode
					for (int cnt = 0; cnt < modes; cnt++)
						if (padInfoMode(_port, _slot, PAD_MODETABLE, cnt) == PAD_TYPE_DUALSHOCK)
							_isDualShock = true;

					// If ExId != 0x0 => This controller has actuator engines
					// This check should always pass if the Dual Shock test above passed
					if (_isDualShock)
						if (padInfoMode(_port, _slot, PAD_MODECUREXID, 0) == 0)
							_isDualShock = false;

					if (_isDualShock) {
						// When using MMODE_LOCK, user cant change mode with Select button
						padSetMainMode(_port, _slot, PAD_MMODE_DUALSHOCK, PAD_MMODE_LOCK);
						_padStatus = STAT_INIT_DSHOCK;
					} else
						_padStatus = STAT_WAIT_READY;
					break;
				case STAT_INIT_DSHOCK:
					padEnterPressMode(_port, _slot);
					_padStatus = STAT_CHECK_ACT;
					break;
				case STAT_CHECK_ACT:
					_actuators = padInfoAct(_port, _slot, -1, 0);
					if (_actuators != 0)
						_padStatus = STAT_INIT_ACT;
					else {
						_isDualShock = false;
						_padStatus = STAT_WAIT_READY;
					}
					break;
				case STAT_INIT_ACT:
					char actAlign[6];
					actAlign[0] = 0;
					actAlign[1] = 1;
					actAlign[2] = actAlign[3] = actAlign[4] = actAlign[5] = 0xff;
					padSetActAlign(_port, _slot, actAlign);
					_padStatus = STAT_WAIT_READY;
					break;
				case STAT_WAIT_READY:
					_padStatus = STAT_OKAY;
					break;
				case STAT_OKAY:
				case STAT_NONE:
					// pad is already initialized (or not there)
					break;
			}
		} else {
			// check for timeout...
			if (_system->getMillis() - _padInitTime > 5000) {
				// still no pad, give up.
				if (padPortClose(_port, _slot) != 1)
					printf("WARNING: can't close port: %d/%d\n", _port, _slot);
				printf("looking for pad, gave up and closed port\n");
				_padStatus = STAT_NONE;
			}
		}
	}
}
Пример #6
0
Файл: padx.c Проект: jur/ps2sdk
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;
}