tp/src/m_Do/m_Do_controller_pad.cpp

134 lines
4.0 KiB
C++

/**
* m_Do_controller_pad.cpp
* JUTGamePad Wrapper and Conversion
*/
#include "m_Do/m_Do_controller_pad.h"
#include "SSystem/SComponent/c_lib.h"
#include "f_ap/f_ap_game.h"
#include "m_Do/m_Do_Reset.h"
#include "m_Do/m_Do_main.h"
JUTGamePad* mDoCPd_c::m_gamePad[4];
interface_of_controller_pad mDoCPd_c::m_cpadInfo[4];
void mDoCPd_c::create() {
#if PLATFORM_GCN || PLATFORM_SHIELD
JUTGamePad* pad = new JUTGamePad(JUTGamePad::EPort1);
m_gamePad[0] = pad;
#endif
if (mDoMain::developmentMode != 0) {
#if PLATFORM_WII
m_gamePad[0] = new JUTGamePad(JUTGamePad::EPort1);
#endif
m_gamePad[1] = new JUTGamePad(JUTGamePad::EPort2);
m_gamePad[2] = new JUTGamePad(JUTGamePad::EPort3);
m_gamePad[3] = new JUTGamePad(JUTGamePad::EPort4);
} else {
#if PLATFORM_WII
m_gamePad[0] = NULL;
#endif
m_gamePad[1] = NULL;
m_gamePad[2] = NULL;
m_gamePad[3] = NULL;
}
#if PLATFORM_GCN || PLATFORM_SHIELD
if (!mDoRst::isReset()) {
JUTGamePad::clearResetOccurred();
JUTGamePad::setResetCallback(mDoRst_resetCallBack, NULL);
}
#endif
JUTGamePad::setAnalogMode(3);
interface_of_controller_pad* cpad = &m_cpadInfo[0];
for (int i = 0; i < 4; i++) {
cpad->mTrigLockL = false;
cpad->mHoldLockL = false;
cpad->mTrigLockR = false;
cpad->mHoldLockR = false;
cpad++;
}
}
void mDoCPd_c::read() {
JUTGamePad::read();
if (!mDoRst::isReset() && mDoRst::is3ButtonReset()) {
JUTGamePad* pad = JUTGamePad::getGamePad(mDoRst::get3ButtonResetPort());
if (!pad->isPushing3ButtonReset()) {
mDoRst::off3ButtonReset();
}
}
JUTGamePad** pad = m_gamePad;
interface_of_controller_pad* interface = m_cpadInfo;
for (u32 i = 0; i < 4; i++) {
if (*pad == NULL) {
cLib_memSet(interface, 0, sizeof(interface_of_controller_pad));
} else {
convert(interface, *pad);
LRlockCheck(interface);
}
pad++;
interface++;
}
}
void mDoCPd_c::convert(interface_of_controller_pad* pInterface, JUTGamePad* pPad) {
pInterface->mButtonFlags = pPad->getButton();
pInterface->mPressedButtonFlags = pPad->getTrigger();
pInterface->mMainStickPosX = pPad->getMainStickX();
pInterface->mMainStickPosY = pPad->getMainStickY();
pInterface->mMainStickValue = pPad->getMainStickValue();
pInterface->mMainStickAngle = pPad->getMainStickAngle();
pInterface->mCStickPosX = pPad->getSubStickX();
pInterface->mCStickPosY = pPad->getSubStickY();
pInterface->mCStickValue = pPad->getSubStickValue();
pInterface->mCStickAngle = pPad->getSubStickAngle();
mDoCPd_ANALOG_CONV(pPad->getAnalogA(), pInterface->mAnalogA);
mDoCPd_ANALOG_CONV(pPad->getAnalogB(), pInterface->mAnalogB);
mDoCPd_TRIGGER_CONV(pPad->getAnalogL(), pInterface->mTriggerLeft);
mDoCPd_TRIGGER_CONV(pPad->getAnalogR(), pInterface->mTriggerRight);
pInterface->mGamepadErrorFlags = pPad->getErrorStatus();
}
void mDoCPd_c::LRlockCheck(interface_of_controller_pad* interface) {
f32 trig_left = interface->mTriggerLeft;
interface->mTrigLockL = false;
interface->mTrigLockR = false;
if (trig_left > fapGmHIO_getLROnValue()) {
if (interface->mHoldLockL != true) {
interface->mTrigLockL = true;
}
interface->mHoldLockL = true;
} else if (trig_left < fapGmHIO_getLROffValue()) {
interface->mHoldLockL = false;
}
f32 trig_right = interface->mTriggerRight;
if (trig_right > fapGmHIO_getLROnValue()) {
if (interface->mHoldLockR != true) {
interface->mTrigLockR = true;
}
interface->mHoldLockR = true;
} else if (trig_right < fapGmHIO_getLROffValue()) {
interface->mHoldLockR = false;
}
}
void mDoCPd_c::recalibrate(void) {
JUTGamePad::clearForReset();
JUTGamePad::CRumble::setEnabled(PAD_CHAN3_BIT | PAD_CHAN2_BIT | PAD_CHAN1_BIT | PAD_CHAN0_BIT);
}