diff --git a/headers/gamepad.h b/headers/gamepad.h index 0e100387c..d1c8760a1 100644 --- a/headers/gamepad.h +++ b/headers/gamepad.h @@ -188,6 +188,7 @@ class Gamepad { GamepadButtonMapping *mapAnalogRSXPos; GamepadButtonMapping *mapAnalogRSYNeg; GamepadButtonMapping *mapAnalogRSYPos; + GamepadButtonMapping *map48WayMode; // gamepad specific proxy of debounced buttons --- 1 = active (inverse of the raw GPIO) // see GP2040::debounceGpioGetAll for details @@ -213,6 +214,7 @@ class Gamepad { GamepadOptions & options; DpadMode activeDpadMode; + bool map48WayModeToggle; const HotkeyOptions & hotkeyOptions; GamepadHotkey lastAction = HOTKEY_NONE; diff --git a/proto/enums.proto b/proto/enums.proto index 968e751ec..1efb399c2 100644 --- a/proto/enums.proto +++ b/proto/enums.proto @@ -261,6 +261,8 @@ enum GpioAction BUTTON_PRESS_INPUT_REVERSE = 69; SUSTAIN_FOCUS_MODE = 70; + + SUSTAIN_4_8_WAY_MODE = 71; } enum GpioDirection diff --git a/src/gamepad.cpp b/src/gamepad.cpp index df699f5b6..b94902184 100644 --- a/src/gamepad.cpp +++ b/src/gamepad.cpp @@ -83,6 +83,7 @@ void Gamepad::setup() mapAnalogRSXPos = new GamepadButtonMapping(ANALOG_DIRECTION_RS_X_POS); mapAnalogRSYNeg = new GamepadButtonMapping(ANALOG_DIRECTION_RS_Y_NEG); mapAnalogRSYPos = new GamepadButtonMapping(ANALOG_DIRECTION_RS_Y_POS); + map48WayMode = new GamepadButtonMapping(SUSTAIN_4_8_WAY_MODE); const auto assignCustomMappingToMaps = [&](GpioMappingInfo mapInfo, Pin_t pin) -> void { if (mapDpadUp->buttonMask & mapInfo.customDpadMask) mapDpadUp->pinMask |= 1 << pin; @@ -161,6 +162,7 @@ void Gamepad::setup() case GpioAction::ANALOG_DIRECTION_RS_X_POS: mapAnalogRSXPos->pinMask |= 1 << pin; break; case GpioAction::ANALOG_DIRECTION_RS_Y_NEG: mapAnalogRSYNeg->pinMask |= 1 << pin; break; case GpioAction::ANALOG_DIRECTION_RS_Y_POS: mapAnalogRSYPos->pinMask |= 1 << pin; break; + case GpioAction::SUSTAIN_4_8_WAY_MODE: map48WayMode->pinMask |= 1 << pin; break; default: break; } } @@ -220,6 +222,7 @@ void Gamepad::reinit() delete mapAnalogRSXPos; delete mapAnalogRSYNeg; delete mapAnalogRSYPos; + delete map48WayMode; // reinitialize pin mappings this->setup(); @@ -257,7 +260,7 @@ void Gamepad::process() } // 4-way before SOCD, might have better history without losing any coherent functionality - if (options.fourWayMode) { + if (options.fourWayMode ^ map48WayModeToggle) { state.dpad = filterToFourWayMode(state.dpad); } @@ -279,7 +282,7 @@ void Gamepad::process() state.dpad &= ~dpadOnlyMask; state.dpad = dpadOnlyMask; break; - + case DpadMode::DPAD_MODE_RIGHT_ANALOG: if (!hasLeftAnalogStick) { state.lx = joystickMid; @@ -290,7 +293,7 @@ void Gamepad::process() state.dpad &= ~dpadOnlyMask; state.dpad = dpadOnlyMask; break; - + default: //if (!hasLeftAnalogStick) { // state.lx = joystickMid; @@ -365,6 +368,8 @@ void Gamepad::read() else if (values & mapButtonRS->pinMask) activeDpadMode = DpadMode::DPAD_MODE_RIGHT_ANALOG; else activeDpadMode = options.dpadMode; + map48WayModeToggle = (values & map48WayMode->pinMask); + if (values & mapAnalogLSXNeg->pinMask) { state.lx = GAMEPAD_JOYSTICK_MIN; } else if (values & mapAnalogLSXPos->pinMask) { diff --git a/www/src/Data/Pins.ts b/www/src/Data/Pins.ts index f8ce88a22..fc15ac324 100644 --- a/www/src/Data/Pins.ts +++ b/www/src/Data/Pins.ts @@ -73,6 +73,7 @@ export const BUTTON_ACTIONS = { ANALOG_DIRECTION_MOD_HIGH: 68, BUTTON_PRESS_INPUT_REVERSE: 69, SUSTAIN_FOCUS_MODE: 70, + SUSTAIN_4_8_WAY_MODE: 71, } as const; export const PIN_DIRECTIONS = { diff --git a/www/src/Locales/en/PinMapping.jsx b/www/src/Locales/en/PinMapping.jsx index edeb8430e..2c2fe2029 100644 --- a/www/src/Locales/en/PinMapping.jsx +++ b/www/src/Locales/en/PinMapping.jsx @@ -98,5 +98,6 @@ export default { ANALOG_DIRECTION_MOD_HIGH: 'Analog Stick Modifier High', BUTTON_PRESS_INPUT_REVERSE: 'Reverse Input', SUSTAIN_FOCUS_MODE: 'Focus Mode Enable', + SUSTAIN_4_8_WAY_MODE: 'Toggle 4-Way Mode', }, };