summaryrefslogtreecommitdiff
path: root/src/JSystem/JUtility/JUTGamePad.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/JSystem/JUtility/JUTGamePad.cpp')
-rw-r--r--src/JSystem/JUtility/JUTGamePad.cpp73
1 files changed, 44 insertions, 29 deletions
diff --git a/src/JSystem/JUtility/JUTGamePad.cpp b/src/JSystem/JUtility/JUTGamePad.cpp
index 6faf755bae..2330d538f2 100644
--- a/src/JSystem/JUtility/JUTGamePad.cpp
+++ b/src/JSystem/JUtility/JUTGamePad.cpp
@@ -80,7 +80,7 @@ u32 JUTGamePad::sRumbleSupported;
u32 JUTGamePad::read() {
sRumbleSupported = PADRead(mPadStatus);
- switch (sClampMode) {
+ switch (getClampMode()) {
case EClampStick:
PADClamp(mPadStatus);
break;
@@ -115,7 +115,7 @@ u32 JUTGamePad::read() {
}
}
- for (JSUListIterator<JUTGamePad> pad(mPadList.getFirst()); pad != mPadList.getEnd(); pad++) {
+ for (JSUListIterator<JUTGamePad> pad(mPadList.getFirst()); pad != mPadList.getEnd(); ++pad) {
if (pad->getPadReplay() != NULL && pad->getPadReplay()->isActive()) {
PADStatus status;
pad->getPadReplay()->getStatus(&status);
@@ -162,7 +162,7 @@ void JUTGamePad::assign() {
}
}
-bool JUTGamePad::CRumble::mStatus[4];
+u8 JUTGamePad::CRumble::mStatus[4];
u32 JUTGamePad::CRumble::mEnabled;
@@ -246,6 +246,7 @@ JSUList<JUTGamePadLongPress> JUTGamePadLongPress::sPatternList(false);
void JUTGamePad::checkResetSwitch() {
if (!JUTGamePad::C3ButtonReset::sResetOccurred) {
+ int unused;
if (OSGetResetSwitchState()) {
C3ButtonReset::sResetSwitchPushing = true;
} else {
@@ -284,14 +285,7 @@ void JUTGamePad::CButton::clear() {
}
void JUTGamePad::CButton::update(const PADStatus* padStatus, u32 stickStatus) {
- u32 buttons;
- if (padStatus != NULL) {
- buttons = padStatus->button;
- } else {
- buttons = 0;
- }
-
- buttons = stickStatus | buttons;
+ u32 buttons = stickStatus | (padStatus != NULL ? padStatus->button : 0);
mRepeat = 0;
if (mRepeatDelay != 0 && mRepeatMask != 0) {
@@ -347,7 +341,7 @@ void JUTGamePad::CStick::clear() {
u32 JUTGamePad::CStick::update(s8 x, s8 y, JUTGamePad::EStickMode mode,
JUTGamePad::EWhichStick stick, u32 buttons) {
s32 clamp;
- switch (sClampMode) {
+ switch (getClampMode()) {
case EClampStick:
clamp = stick == EMainStick ? 54 : 42;
break;
@@ -385,8 +379,7 @@ u32 JUTGamePad::CStick::update(s8 x, s8 y, JUTGamePad::EStickMode mode,
}
}
- u32 button_shift = stick == EMainStick ? 0x18 : 0x10;
- return getButton(buttons >> button_shift);
+ return getButton(buttons >> (stick == EMainStick ? 0x18 : 0x10));
}
u32 JUTGamePad::CStick::getButton(u32 buttons) {
@@ -436,8 +429,13 @@ void JUTGamePad::CRumble::startMotor(int port) {
}
void JUTGamePad::CRumble::stopMotor(int port, bool hard_stop) {
+ u8 command;
if (isEnabledPort(port)) {
- u8 command = hard_stop ? PAD_MOTOR_STOP_HARD : PAD_MOTOR_STOP;
+ if (hard_stop) {
+ command = PAD_MOTOR_STOP_HARD;
+ } else {
+ command = PAD_MOTOR_STOP;
+ }
PADControlMotor(port, command);
mStatus[port] = false;
}
@@ -484,7 +482,7 @@ void JUTGamePad::CRumble::update(s16 port) {
if (status) {
stopMotor(port, hard_stop);
} else if (hard_stop) {
- stopMotorHard(port);
+ stopMotor(port, true);
}
}
}
@@ -518,18 +516,18 @@ void JUTGamePad::CRumble::startPatternedRumble(void* data, JUTGamePad::CRumble::
}
void JUTGamePad::CRumble::stopPatternedRumble(s16 port) {
+ JUT_ASSERT(1341, 0 <= port && port < 4);
mLength = 0;
stopMotorHard(port);
}
void JUTGamePad::CRumble::stopPatternedRumbleAtThePeriod() {
+ u32 r31 = mFrame % mFrameCount;
mLength = (mFrame + mFrameCount - 1) % mFrameCount;
}
JUTGamePad* JUTGamePad::getGamePad(int port) {
- JSUListIterator<JUTGamePad> pad(mPadList.getFirst());
-
- for (; pad != mPadList.getEnd(); pad++) {
+ for (JSUListIterator<JUTGamePad> pad(mPadList.getFirst()); pad != mPadList.getEnd(); ++pad) {
if (port == pad->mPortNum) {
return pad.getObject();
}
@@ -539,20 +537,21 @@ JUTGamePad* JUTGamePad::getGamePad(int port) {
}
void JUTGamePad::CRumble::setEnabled(u32 mask) {
+ mask = (mask & (PAD_CHAN3_BIT | PAD_CHAN2_BIT | PAD_CHAN1_BIT | PAD_CHAN0_BIT));
for (int i = 0; i < 4; i++) {
if ((mEnabled & channel_mask[i]) == 0) {
if (mStatus[i]) {
- stopMotor(i, false);
+ stopMotor(i);
}
JUTGamePad* pad = getGamePad(i);
if (pad != NULL) {
- pad->mRumble.stopPatternedRumble(pad->mPortNum);
+ pad->stopMotorWaveHard();
}
}
}
- mEnabled = (mask & (PAD_CHAN3_BIT | PAD_CHAN2_BIT | PAD_CHAN1_BIT | PAD_CHAN0_BIT));
+ mEnabled = mask;
}
void JUTGamePad::CButton::setRepeat(u32 mask, u32 delay, u32 rate) {
@@ -563,6 +562,13 @@ void JUTGamePad::CButton::setRepeat(u32 mask, u32 delay, u32 rate) {
mRepeatRate = rate;
}
+void JUTGamePad::setButtonRepeat(u32 mask, u32 delay, u32 rate) {
+ mButton.setRepeat(mask, delay, rate);
+ if (mPortNum >= 0) {
+ mPadButton[mPortNum].setRepeat(mask, delay, rate);
+ }
+}
+
bool JUTGamePad::recalibrate(u32 mask) {
for (int i = 0; i < 4; i++) {
if (sSuppressPadReset & channel_mask[i]) {
@@ -570,16 +576,25 @@ bool JUTGamePad::recalibrate(u32 mask) {
}
}
- return PADRecalibrate(mask);
+ BOOL result = PADRecalibrate(mask);
+ return result;
}
void JUTGamePadLongPress::checkCallback(int port, u32 hold_time) {
- if (port >= 0 && hold_time >= mThreshold) {
- field_0x11 = true;
- field_0x48[port] = true;
+ if (port < 0) {
+ return;
+ }
- if (mCallback != NULL) {
- mCallback(port, this, field_0x50);
- }
+ JUT_ASSERT(1673, 0 <= port && port < 4);
+
+ if (hold_time < mThreshold) {
+ return;
+ }
+
+ field_0x11 = true;
+ field_0x48[port] = true;
+
+ if (mCallback != NULL) {
+ mCallback(port, this, field_0x50);
}
}