/**************************************************************************** * libwiigui Template * Tantric 2009 * * input.cpp * Wii/GameCube controller management ***************************************************************************/ #include #include #include #include #include #include #include #include #include "menu.h" #include "video.h" #include "input.h" #include "libwiigui/gui.h" int rumbleRequest[4] = {0, 0, 0, 0}; GuiTrigger userInput[4]; static int rumbleCount[4] = {0, 0, 0, 0}; /**************************************************************************** * UpdatePads * * called by postRetraceCallback in InitGCVideo - scans gcpad and wpad ***************************************************************************/ void UpdatePads() { WPAD_ScanPads(); PAD_ScanPads(); for ( int i = 3; i >= 0; i-- ) { memcpy( &userInput[i].wpad, WPAD_Data( i ), sizeof( WPADData ) ); userInput[i].chan = i; userInput[i].pad.btns_d = PAD_ButtonsDown( i ); userInput[i].pad.btns_u = PAD_ButtonsUp( i ); userInput[i].pad.btns_h = PAD_ButtonsHeld( i ); userInput[i].pad.stickX = PAD_StickX( i ); userInput[i].pad.stickY = PAD_StickY( i ); userInput[i].pad.substickX = PAD_SubStickX( i ); userInput[i].pad.substickY = PAD_SubStickY( i ); userInput[i].pad.triggerL = PAD_TriggerL( i ); userInput[i].pad.triggerR = PAD_TriggerR( i ); if ( Settings.rumble == RumbleOn ) DoRumble( i ); } } /**************************************************************************** * SetupPads * * Sets up userInput triggers for use ***************************************************************************/ void SetupPads() { PAD_Init(); WPAD_Init(); // read wiimote accelerometer and IR data WPAD_SetDataFormat( WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR ); WPAD_SetVRes( WPAD_CHAN_ALL, screenwidth, screenheight ); for ( int i = 0; i < 4; i++ ) { userInput[i].chan = i; } } /**************************************************************************** * ShutoffRumble ***************************************************************************/ void ShutoffRumble() { for ( int i = 0; i < 4; i++ ) { WPAD_Rumble( i, 0 ); rumbleCount[i] = 0; } } /**************************************************************************** * DoRumble ***************************************************************************/ void DoRumble( int i ) { if ( rumbleRequest[i] && rumbleCount[i] < 3 ) { WPAD_Rumble( i, 1 ); // rumble on rumbleCount[i]++; } else if ( rumbleRequest[i] ) { rumbleCount[i] = 20; rumbleRequest[i] = 0; } else { if ( rumbleCount[i] ) rumbleCount[i]--; WPAD_Rumble( i, 0 ); // rumble off } } /**************************************************************************** * WPAD_Stick * * Get X/Y value from Wii Joystick (classic, nunchuk) input ***************************************************************************/ s8 WPAD_Stick( u8 chan, u8 right, int axis ) { float mag = 0.0; float ang = 0.0; WPADData *data = WPAD_Data( chan ); switch ( data->exp.type ) { case WPAD_EXP_NUNCHUK: case WPAD_EXP_GUITARHERO3: if ( right == 0 ) { mag = data->exp.nunchuk.js.mag; ang = data->exp.nunchuk.js.ang; } break; case WPAD_EXP_CLASSIC: if ( right == 0 ) { mag = data->exp.classic.ljs.mag; ang = data->exp.classic.ljs.ang; } else { mag = data->exp.classic.rjs.mag; ang = data->exp.classic.rjs.ang; } break; default: break; } /* calculate x/y value (angle need to be converted into radian) */ if ( mag > 1.0 ) mag = 1.0; else if ( mag < -1.0 ) mag = -1.0; double val; if ( axis == 0 ) // x-axis val = mag * sin( ( PI * ang ) / 180.0f ); else // y-axis val = mag * cos( ( PI * ang ) / 180.0f ); return ( s8 )( val * 128.0f ); }