diff --git a/include/JSystem/JUtility/JUTGamePad.h b/include/JSystem/JUtility/JUTGamePad.h index a5eb1c657..f3ba6c390 100644 --- a/include/JSystem/JUtility/JUTGamePad.h +++ b/include/JSystem/JUtility/JUTGamePad.h @@ -30,7 +30,7 @@ enum { struct JUTGamePadRecordBase { virtual void unk0() {} virtual void unk1(PADStatus* pad) {} - virtual void unk2() {} + virtual void write(PADStatus* pad) {} /* 0x4 */ bool mActive; }; @@ -189,7 +189,7 @@ public: struct CRumble { CRumble(JUTGamePad* pad) { clear(pad); } - static bool mStatus[4]; + static u8 mStatus[4]; static PADMask mEnabled; enum ERumble { @@ -213,10 +213,10 @@ public: static bool isEnabled(u32 mask) { return mEnabled & mask; } static bool isEnabledPort(int port) { return isEnabled(channel_mask[port]); } - /* 0x00 */ u32 field_0x0; - /* 0x04 */ u32 field_0x4; - /* 0x08 */ u8* field_0x8; - /* 0x0C */ u32 field_0xc; + /* 0x00 */ u32 mFrame; + /* 0x04 */ u32 mLength; + /* 0x08 */ u8* mData; + /* 0x0C */ u32 mFrameCount; }; // Size: 0x10 void startMotorWave(u8* param_2, CRumble::ERumble rumble, u32 param_4) { diff --git a/src/JSystem/JUtility/JUTGamePad.cpp b/src/JSystem/JUtility/JUTGamePad.cpp index 4bc10649d..ec8b7f849 100644 --- a/src/JSystem/JUtility/JUTGamePad.cpp +++ b/src/JSystem/JUtility/JUTGamePad.cpp @@ -111,10 +111,10 @@ u32 JUTGamePad::read() { pad->update(); } - if (pad->getPadRecord()) { - s32 portNum = pad->mPortNum; - if (portNum != -1 && mPadStatus[portNum].error == 0) { - pad->getPadRecord()->unk2(); + if (pad->getPadRecord() && pad->mPortNum != -1) { + s32 port = pad->mPortNum; + if (mPadStatus[port].error == 0) { + pad->getPadRecord()->write(&mPadStatus[port]); } } } @@ -140,7 +140,7 @@ void JUTGamePad::assign() { } } -bool JUTGamePad::CRumble::mStatus[4]; +u8 JUTGamePad::CRumble::mStatus[4]; PADMask JUTGamePad::CRumble::mEnabled; callbackFn JUTGamePad::C3ButtonReset::sCallback; void* JUTGamePad::C3ButtonReset::sCallbackArg; @@ -357,10 +357,10 @@ u32 JUTGamePad::CStick::getButton() { /* 802C4424-802C4444 .text clear__Q210JUTGamePad7CRumbleFv */ void JUTGamePad::CRumble::clear() { - field_0x0 = 0; - field_0x4 = 0; - field_0x8 = 0; - field_0xc = 0; + mFrame = 0; + mLength = 0; + mData = 0; + mFrameCount = 0; mEnabled = (PADMask)(PAD_CHAN3_BIT | PAD_CHAN2_BIT | PAD_CHAN1_BIT | PAD_CHAN0_BIT); } @@ -404,56 +404,52 @@ inline u8 getNumBit(u8* arr, u32 bitNo) { /* 802C45A4-802C46CC .text update__Q210JUTGamePad7CRumbleFs */ void JUTGamePad::CRumble::update(s16 portNo) { - /* Nonmatching */ if (!isEnabledPort(portNo)) { - field_0x0 = 0; - field_0x4 = 0; - field_0x8 = NULL; - field_0xc = 0; + mFrame = 0; + mLength = 0; + mData = NULL; + mFrameCount = 0; } - if (field_0x4 == 0) { + if (mLength == 0) { return; } - if (field_0x0 >= field_0x4) { + if (mFrame >= mLength) { stopMotorHard(portNo); - field_0x4 = 0; - } else if (field_0xc == 0) { + mLength = 0; + } else if (mFrameCount == 0) { if (mStatus[portNo] == 0) { startMotor(portNo); } return; } else { - u32 temp = (field_0x0 / field_0xc); - u8 numBit = getNumBit(field_0x8, field_0x0 - temp * field_0xc); - if (numBit && !mStatus[portNo]) { + u8 numBit = getNumBit(mData, mFrame % mFrameCount); + if (numBit != 0 && mStatus[portNo] == 0) { startMotor(portNo); - } else if (!numBit) { - if (mStatus[portNo]) { - stopMotorHard(portNo); - } + } else if (numBit == 0 && mStatus[portNo] != 0) { + stopMotorHard(portNo); } } - field_0x0++; + mFrame++; } /* 802C46CC-802C46F4 .text triggerPatternedRumble__Q210JUTGamePad7CRumbleFUl */ void JUTGamePad::CRumble::triggerPatternedRumble(u32 param_0) { - if (field_0x8 != NULL && field_0xc != 0) { - field_0x4 = param_0; - field_0x0 = 0; + if (mData != NULL && mFrameCount != 0) { + mLength = param_0; + mFrame = 0; } } /* 802C46F4-802C4770 .text startPatternedRumble__Q210JUTGamePad7CRumbleFPUcQ310JUTGamePad7CRumble7ERumbleUl */ void JUTGamePad::CRumble::startPatternedRumble(u8* param_0, JUTGamePad::CRumble::ERumble param_1, u32 param_2) { - field_0xc = ((*param_0) << 8) + *(param_0 + 1); - field_0x8 = param_0 + 2; + mFrameCount = ((*param_0) << 8) + *(param_0 + 1); + mData = param_0 + 2; switch (param_1) { case JUTGamePad::CRumble::VAL_0: - triggerPatternedRumble(field_0xc); + triggerPatternedRumble(mFrameCount); break; case JUTGamePad::CRumble::VAL_1: triggerPatternedRumble(-1); @@ -466,13 +462,13 @@ void JUTGamePad::CRumble::startPatternedRumble(u8* param_0, JUTGamePad::CRumble: /* 802C4770-802C479C .text stopPatternedRumble__Q210JUTGamePad7CRumbleFs */ void JUTGamePad::CRumble::stopPatternedRumble(s16 port) { - field_0x4 = 0; + mLength = 0; stopMotorHard(port); } /* 802C479C-802C47C0 .text stopPatternedRumbleAtThePeriod__Q210JUTGamePad7CRumbleFv */ void JUTGamePad::CRumble::stopPatternedRumbleAtThePeriod() { - field_0x4 = (field_0x0 + field_0xc - 1) % field_0xc; + mLength = (mFrame + mFrameCount - 1) % mFrameCount; } /* 802C47C0-802C47FC .text getGamePad__10JUTGamePadFi */