JUTGamePad work

This commit is contained in:
Jasper St. Pierre
2023-12-02 00:07:38 -08:00
parent fb2cb74ad9
commit befd757e75
2 changed files with 36 additions and 40 deletions
+6 -6
View File
@@ -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) {
+30 -34
View File
@@ -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 */