Check direct enum comparisons by index

To not break support for users who used the "wrong" control enumeration for that controller, but had their program work because the "wrong" enum used the same ID.
This commit is contained in:
David Madison 2021-03-27 06:07:42 -04:00
parent f9a408204d
commit 57afaefd2c
6 changed files with 39 additions and 37 deletions

View file

@ -70,9 +70,10 @@ bool PS4Parser::getButtonClick(ButtonEnum b) {
} }
uint8_t PS4Parser::getAnalogButton(ButtonEnum b) { uint8_t PS4Parser::getAnalogButton(ButtonEnum b) {
if (b == L2) // These are the only analog buttons on the controller const int8_t index = getButtonIndex(b); if (index < 0) return 0;
if (index == legacyButtonValues(L2)) // These are the only analog buttons on the controller
return ps4Data.trigger[0]; return ps4Data.trigger[0];
else if (b == R2) else if (index == legacyButtonValues(R2))
return ps4Data.trigger[1]; return ps4Data.trigger[1];
return 0; return 0;
} }

View file

@ -74,9 +74,10 @@ bool PS5Parser::getButtonClick(ButtonEnum b) {
} }
uint8_t PS5Parser::getAnalogButton(ButtonEnum b) { uint8_t PS5Parser::getAnalogButton(ButtonEnum b) {
if (b == L2) // These are the only analog buttons on the controller const int8_t index = getButtonIndex(b); if (index < 0) return 0;
if (index == legacyButtonValues(L2)) // These are the only analog buttons on the controller
return ps5Data.trigger[0]; return ps5Data.trigger[0];
else if (b == R2) else if (index == legacyButtonValues(R2))
return ps5Data.trigger[1]; return ps5Data.trigger[1];
return 0; return 0;
} }

View file

@ -378,29 +378,29 @@ void XBOXONE::readReport() {
} }
uint16_t XBOXONE::getButtonPress(ButtonEnum b) { uint16_t XBOXONE::getButtonPress(ButtonEnum b) {
if(b == L2) // These are analog buttons
return triggerValue[0];
else if(b == R2)
return triggerValue[1];
const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0; const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0;
if(index == legacyButtonValues(L2)) // These are analog buttons
return triggerValue[0];
else if(index == legacyButtonValues(R2))
return triggerValue[1];
return (bool)(ButtonState & ((uint16_t)pgm_read_word(&XBOX_BUTTONS[index]))); return (bool)(ButtonState & ((uint16_t)pgm_read_word(&XBOX_BUTTONS[index])));
} }
bool XBOXONE::getButtonClick(ButtonEnum b) { bool XBOXONE::getButtonClick(ButtonEnum b) {
if(b == L2) { const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0;
if(index == legacyButtonValues(L2)) {
if(L2Clicked) { if(L2Clicked) {
L2Clicked = false; L2Clicked = false;
return true; return true;
} }
return false; return false;
} else if(b == R2) { } else if(index == legacyButtonValues(R2)) {
if(R2Clicked) { if(R2Clicked) {
R2Clicked = false; R2Clicked = false;
return true; return true;
} }
return false; return false;
} }
const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0;
uint16_t button = pgm_read_word(&XBOX_BUTTONS[index]); uint16_t button = pgm_read_word(&XBOX_BUTTONS[index]);
bool click = (ButtonClickState & button); bool click = (ButtonClickState & button);
ButtonClickState &= ~button; // Clear "click" event ButtonClickState &= ~button; // Clear "click" event

View file

@ -76,37 +76,37 @@ bool XBOXONESParser::checkDpad(ButtonEnum b) {
} }
uint16_t XBOXONESParser::getButtonPress(ButtonEnum b) { uint16_t XBOXONESParser::getButtonPress(ButtonEnum b) {
if (b == L2)
return xboxOneSData.trigger[0];
else if (b == R2)
return xboxOneSData.trigger[1];
else if (b <= LEFT) // Dpad
return checkDpad(b);
else if (b == XBOX)
return xboxButtonState;
const int8_t index = getButtonIndex(b); if (index < 0) return 0; const int8_t index = getButtonIndex(b); if (index < 0) return 0;
if (index == legacyButtonValues(L2))
return xboxOneSData.trigger[0];
else if (index == legacyButtonValues(R2))
return xboxOneSData.trigger[1];
else if (index <= LEFT) // Dpad
return checkDpad(b);
else if (index == legacyButtonValues(XBOX))
return xboxButtonState;
return xboxOneSData.btn.val & (1UL << pgm_read_byte(&XBOX_ONE_S_BUTTONS[index])); return xboxOneSData.btn.val & (1UL << pgm_read_byte(&XBOX_ONE_S_BUTTONS[index]));
} }
bool XBOXONESParser::getButtonClick(ButtonEnum b) { bool XBOXONESParser::getButtonClick(ButtonEnum b) {
if(b == L2) { const int8_t index = getButtonIndex(b); if (index < 0) return 0;
if(index == legacyButtonValues(L2)) {
if(L2Clicked) { if(L2Clicked) {
L2Clicked = false; L2Clicked = false;
return true; return true;
} }
return false; return false;
} else if(b == R2) { } else if(index == legacyButtonValues(R2)) {
if(R2Clicked) { if(R2Clicked) {
R2Clicked = false; R2Clicked = false;
return true; return true;
} }
return false; return false;
} else if (b == XBOX) { } else if (index == legacyButtonValues(XBOX)) {
bool click = xboxbuttonClickState; bool click = xboxbuttonClickState;
xboxbuttonClickState = 0; // Clear "click" event xboxbuttonClickState = 0; // Clear "click" event
return click; return click;
} }
const int8_t index = getButtonIndex(b); if (index < 0) return 0;
uint32_t mask = 1UL << pgm_read_byte(&XBOX_ONE_S_BUTTONS[index]); uint32_t mask = 1UL << pgm_read_byte(&XBOX_ONE_S_BUTTONS[index]);
bool click = buttonClickState.val & mask; bool click = buttonClickState.val & mask;
buttonClickState.val &= ~mask; // Clear "click" event buttonClickState.val &= ~mask; // Clear "click" event

View file

@ -408,29 +408,29 @@ void XBOXRECV::printReport(uint8_t controller __attribute__((unused)), uint8_t n
} }
uint8_t XBOXRECV::getButtonPress(ButtonEnum b, uint8_t controller) { uint8_t XBOXRECV::getButtonPress(ButtonEnum b, uint8_t controller) {
if(b == L2) // These are analog buttons
return (uint8_t)(ButtonState[controller] >> 8);
else if(b == R2)
return (uint8_t)ButtonState[controller];
const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0; const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0;
if(index == legacyButtonValues(L2)) // These are analog buttons
return (uint8_t)(ButtonState[controller] >> 8);
else if(index == legacyButtonValues(R2))
return (uint8_t)ButtonState[controller];
return (bool)(ButtonState[controller] & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[index]) << 16)); return (bool)(ButtonState[controller] & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[index]) << 16));
} }
bool XBOXRECV::getButtonClick(ButtonEnum b, uint8_t controller) { bool XBOXRECV::getButtonClick(ButtonEnum b, uint8_t controller) {
if(b == L2) { const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0;
if(index == legacyButtonValues(L2)) {
if(L2Clicked[controller]) { if(L2Clicked[controller]) {
L2Clicked[controller] = false; L2Clicked[controller] = false;
return true; return true;
} }
return false; return false;
} else if(b == R2) { } else if(index == legacyButtonValues(R2)) {
if(R2Clicked[controller]) { if(R2Clicked[controller]) {
R2Clicked[controller] = false; R2Clicked[controller] = false;
return true; return true;
} }
return false; return false;
} }
const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0;
uint16_t button = pgm_read_word(&XBOX_BUTTONS[index]); uint16_t button = pgm_read_word(&XBOX_BUTTONS[index]);
bool click = (ButtonClickState[controller] & button); bool click = (ButtonClickState[controller] & button);
ButtonClickState[controller] &= ~button; // clear "click" event ButtonClickState[controller] &= ~button; // clear "click" event

View file

@ -281,29 +281,29 @@ void XBOXUSB::printReport() { //Uncomment "#define PRINTREPORT" to print the rep
} }
uint8_t XBOXUSB::getButtonPress(ButtonEnum b) { uint8_t XBOXUSB::getButtonPress(ButtonEnum b) {
if(b == L2) // These are analog buttons
return (uint8_t)(ButtonState >> 8);
else if(b == R2)
return (uint8_t)ButtonState;
const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0; const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0;
if(index == legacyButtonValues(L2)) // These are analog buttons
return (uint8_t)(ButtonState >> 8);
else if(index == legacyButtonValues(R2))
return (uint8_t)ButtonState;
return (bool)(ButtonState & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[index]) << 16)); return (bool)(ButtonState & ((uint32_t)pgm_read_word(&XBOX_BUTTONS[index]) << 16));
} }
bool XBOXUSB::getButtonClick(ButtonEnum b) { bool XBOXUSB::getButtonClick(ButtonEnum b) {
if(b == L2) { const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0;
if(index == legacyButtonValues(L2)) {
if(L2Clicked) { if(L2Clicked) {
L2Clicked = false; L2Clicked = false;
return true; return true;
} }
return false; return false;
} else if(b == R2) { } else if(index == legacyButtonValues(R2)) {
if(R2Clicked) { if(R2Clicked) {
R2Clicked = false; R2Clicked = false;
return true; return true;
} }
return false; return false;
} }
const int8_t index = getXboxButtonIndex(b); if (index < 0) return 0;
uint16_t button = pgm_read_word(&XBOX_BUTTONS[index]); uint16_t button = pgm_read_word(&XBOX_BUTTONS[index]);
bool click = (ButtonClickState & button); bool click = (ButtonClickState & button);
ButtonClickState &= ~button; // clear "click" event ButtonClickState &= ~button; // clear "click" event