Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions source/ButtonComboInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ uint32_t ButtonComboInfoIF::getCombo() const {
void ButtonComboInfoIF::setCombo(const ButtonComboModule_Buttons combo) {
mCombo = combo;
DEBUG_FUNCTION_LINE("Updated combo to: %08X, for %s %08X", mCombo, mLabel.c_str(), getHandle().handle);
resetPrevInput();
}

ButtonComboModule_ComboStatus ButtonComboInfoIF::getStatus() const {
Expand All @@ -79,6 +80,7 @@ ButtonComboModule_ControllerTypes ButtonComboInfoIF::getControllerMask() const {
void ButtonComboInfoIF::setControllerMask(const ButtonComboModule_ControllerTypes mask) {
mControllerMask = mask;
DEBUG_FUNCTION_LINE("Updated controllerMask to: %08X, for %s %08X", mControllerMask, mLabel.c_str(), getHandle().handle);
resetPrevInput();
}

bool ButtonComboInfoIF::conflictsWith(const ButtonComboModule_ButtonComboOptions &other) const {
Expand Down
2 changes: 2 additions & 0 deletions source/ButtonComboInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ class ButtonComboInfoIF {

[[nodiscard]] virtual ButtonComboModule_ButtonComboInfoEx getComboInfoEx() const = 0;

virtual void resetPrevInput() = 0;

protected:
static int32_t ControllerTypeToChanIndex(ButtonComboModule_ControllerTypes type);

Expand Down
7 changes: 7 additions & 0 deletions source/ButtonComboInfoDown.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,10 @@ ButtonComboModule_ButtonComboInfoEx ButtonComboInfoDown::getComboInfoEx() const
.basicCombo = {.controllerMask = mControllerMask, .combo = mCombo},
.optionalHoldForXMs = 0};
}

void ButtonComboInfoDown::resetPrevInput() {
for (uint32_t i = 0; i < std::size(mHoldInformation); ++i) {
mHoldInformation[i] = {};
mHoldInformation[i].prevButtonCombo = 0xFFFFFFFF;
}
}
3 changes: 3 additions & 0 deletions source/ButtonComboInfoDown.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,8 @@ class ButtonComboInfoDown final : public ButtonComboInfoIF {

[[nodiscard]] ButtonComboModule_ButtonComboInfoEx getComboInfoEx() const override;

void resetPrevInput() override;

private:
HoldInformation mHoldInformation[9] = {}; // one for each controller
};
7 changes: 7 additions & 0 deletions source/ButtonComboInfoHold.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,10 @@ ButtonComboModule_ButtonComboInfoEx ButtonComboInfoHold::getComboInfoEx() const
.basicCombo = {.controllerMask = mControllerMask, .combo = mCombo},
.optionalHoldForXMs = mTargetDurationInMs};
}

void ButtonComboInfoHold::resetPrevInput() {
for (uint32_t i = 0; i < std::size(mHoldInformation); ++i) {
mHoldInformation[i] = {};
mHoldInformation[i].prevButtonCombo = 0xFFFFFFFF;
}
}
2 changes: 2 additions & 0 deletions source/ButtonComboInfoHold.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class ButtonComboInfoHold final : public ButtonComboInfoIF {

[[nodiscard]] ButtonComboModule_ButtonComboInfoEx getComboInfoEx() const override;

void resetPrevInput() override;

private:
typedef struct {
OSTime holdStartedAt;
Expand Down
19 changes: 15 additions & 4 deletions source/ButtonComboManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,11 @@ void ButtonComboManager::UpdateInputVPAD(const VPADChan chan, const VPADStatus *
return;
}

// Do not check for combos while the combo detection is active
if (mInButtonComboDetection) {
return;
}

{
std::lock_guard lock(mMutex);
const auto controller = convert(chan);
Expand Down Expand Up @@ -440,6 +445,12 @@ void ButtonComboManager::UpdateInputWPAD(const WPADChan chan, WPADStatus *data)
DEBUG_FUNCTION_LINE_VERBOSE("Invalid data or state");
return;
}

// Do not check for combos while the combo detection is active
if (mInButtonComboDetection) {
return;
}

const auto controller = convert(chan);
uint32_t pressedButtons = {};
switch (data->extensionType) {
Expand Down Expand Up @@ -608,8 +619,7 @@ ButtonComboModule_ComboStatus ButtonComboManager::CheckComboAvailable(const Butt

ButtonComboModule_Error ButtonComboManager::DetectButtonCombo_Blocking(const ButtonComboModule_DetectButtonComboOptions &options,
ButtonComboModule_Buttons &outButtonCombo) {
std::lock_guard lock(mMutex);

std::lock_guard lock(mDetectButtonsMutex);
if (options.controllerMask == BUTTON_COMBO_MODULE_CONTROLLER_NONE) {
DEBUG_FUNCTION_LINE_WARN("Failed to detect button combo: Controller Mask was empty.");
return BUTTON_COMBO_MODULE_ERROR_INVALID_ARGUMENT;
Expand All @@ -620,6 +630,8 @@ ButtonComboModule_Error ButtonComboManager::DetectButtonCombo_Blocking(const But
return BUTTON_COMBO_MODULE_ERROR_INVALID_ARGUMENT;
}

mInButtonComboDetection = true;

bool doShutdownKPAD = false;
bool doDisableProController = false;
KPADStatus status;
Expand Down Expand Up @@ -670,7 +682,6 @@ ButtonComboModule_Error ButtonComboManager::DetectButtonCombo_Blocking(const But
uint32_t convertedButtons = 0;
kpad_data = {};
if (KPADReadEx(static_cast<KPADChan>(i), &kpad_data, 1, &kpad_error) > 0) {
DEBUG_FUNCTION_LINE_ERR("KPAD chan %d success %d %d", i, kpad_error, kpad_data.extensionType);
if (kpad_error == KPAD_ERROR_OK && kpad_data.extensionType != 0xFF) {
if (kpad_data.extensionType == WPAD_EXT_CORE || kpad_data.extensionType == WPAD_EXT_NUNCHUK) {
convertedButtons = remapWiiMoteButtons(kpad_data.hold);
Expand Down Expand Up @@ -726,7 +737,7 @@ ButtonComboModule_Error ButtonComboManager::DetectButtonCombo_Blocking(const But
if (doShutdownKPAD) {
KPADShutdown();
}

mInButtonComboDetection = true;

return result;
}
2 changes: 2 additions & 0 deletions source/ButtonComboManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,6 @@ class ButtonComboManager {
std::forward_list<std::shared_ptr<ButtonComboInfoIF>> mCombos;
std::vector<uint32_t> mVPADButtonBuffer;
std::mutex mMutex;
std::mutex mDetectButtonsMutex;
bool mInButtonComboDetection = false;
};