Skip to content

Commit

Permalink
Initial commit of standalone directional inputs in addition to mode-s…
Browse files Browse the repository at this point in the history
…pecific and DDI.
  • Loading branch information
mikepparks committed Nov 10, 2024
1 parent 8de2b00 commit d80e1ad
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 44 deletions.
4 changes: 4 additions & 0 deletions headers/gamepad.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,10 @@ class Gamepad {
GamepadButtonMapping *mapButtonDP;
GamepadButtonMapping *mapButtonLS;
GamepadButtonMapping *mapButtonRS;
GamepadButtonMapping *mapDigitalUp;
GamepadButtonMapping *mapDigitalDown;
GamepadButtonMapping *mapDigitalLeft;
GamepadButtonMapping *mapDigitalRight;

// gamepad specific proxy of debounced buttons --- 1 = active (inverse of the raw GPIO)
// see GP2040::debounceGpioGetAll for details
Expand Down
15 changes: 15 additions & 0 deletions proto/enums.proto
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,21 @@ enum GpioAction
BUTTON_PRESS_E10 = 52;
BUTTON_PRESS_E11 = 53;
BUTTON_PRESS_E12 = 54;

DIGITAL_DIRECTION_UP = 55;
DIGITAL_DIRECTION_DOWN = 56;
DIGITAL_DIRECTION_LEFT = 57;
DIGITAL_DIRECTION_RIGHT = 58;
ANALOG_DIRECTION_LS_X_NEG = 59;
ANALOG_DIRECTION_LS_X_POS = 60;
ANALOG_DIRECTION_LS_Y_NEG = 61;
ANALOG_DIRECTION_LS_Y_POS = 62;
ANALOG_DIRECTION_RS_X_NEG = 63;
ANALOG_DIRECTION_RS_X_POS = 64;
ANALOG_DIRECTION_RS_Y_NEG = 65;
ANALOG_DIRECTION_RS_Y_POS = 66;
ANALOG_DIRECTION_MOD_LOW = 67;
ANALOG_DIRECTION_MOD_HIGH = 68;
}

enum GpioDirection
Expand Down
114 changes: 70 additions & 44 deletions src/gamepad.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,42 +35,46 @@ void Gamepad::setup()
// Configure pin mapping
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();

mapDpadUp = new GamepadButtonMapping(GAMEPAD_MASK_UP);
mapDpadDown = new GamepadButtonMapping(GAMEPAD_MASK_DOWN);
mapDpadLeft = new GamepadButtonMapping(GAMEPAD_MASK_LEFT);
mapDpadRight = new GamepadButtonMapping(GAMEPAD_MASK_RIGHT);
mapButtonB1 = new GamepadButtonMapping(GAMEPAD_MASK_B1);
mapButtonB2 = new GamepadButtonMapping(GAMEPAD_MASK_B2);
mapButtonB3 = new GamepadButtonMapping(GAMEPAD_MASK_B3);
mapButtonB4 = new GamepadButtonMapping(GAMEPAD_MASK_B4);
mapButtonL1 = new GamepadButtonMapping(GAMEPAD_MASK_L1);
mapButtonR1 = new GamepadButtonMapping(GAMEPAD_MASK_R1);
mapButtonL2 = new GamepadButtonMapping(GAMEPAD_MASK_L2);
mapButtonR2 = new GamepadButtonMapping(GAMEPAD_MASK_R2);
mapButtonS1 = new GamepadButtonMapping(GAMEPAD_MASK_S1);
mapButtonS2 = new GamepadButtonMapping(GAMEPAD_MASK_S2);
mapButtonL3 = new GamepadButtonMapping(GAMEPAD_MASK_L3);
mapButtonR3 = new GamepadButtonMapping(GAMEPAD_MASK_R3);
mapButtonA1 = new GamepadButtonMapping(GAMEPAD_MASK_A1);
mapButtonA2 = new GamepadButtonMapping(GAMEPAD_MASK_A2);
mapButtonA3 = new GamepadButtonMapping(GAMEPAD_MASK_A3);
mapButtonA4 = new GamepadButtonMapping(GAMEPAD_MASK_A4);
mapButtonE1 = new GamepadButtonMapping(GAMEPAD_MASK_E1);
mapButtonE2 = new GamepadButtonMapping(GAMEPAD_MASK_E2);
mapButtonE3 = new GamepadButtonMapping(GAMEPAD_MASK_E3);
mapButtonE4 = new GamepadButtonMapping(GAMEPAD_MASK_E4);
mapButtonE5 = new GamepadButtonMapping(GAMEPAD_MASK_E5);
mapButtonE6 = new GamepadButtonMapping(GAMEPAD_MASK_E6);
mapButtonE7 = new GamepadButtonMapping(GAMEPAD_MASK_E7);
mapButtonE8 = new GamepadButtonMapping(GAMEPAD_MASK_E8);
mapButtonE9 = new GamepadButtonMapping(GAMEPAD_MASK_E9);
mapButtonE10 = new GamepadButtonMapping(GAMEPAD_MASK_E10);
mapButtonE11 = new GamepadButtonMapping(GAMEPAD_MASK_E11);
mapButtonE12 = new GamepadButtonMapping(GAMEPAD_MASK_E12);
mapButtonFn = new GamepadButtonMapping(AUX_MASK_FUNCTION);
mapButtonDP = new GamepadButtonMapping(SUSTAIN_DP_MODE_DP);
mapButtonLS = new GamepadButtonMapping(SUSTAIN_DP_MODE_LS);
mapButtonRS = new GamepadButtonMapping(SUSTAIN_DP_MODE_RS);
mapDpadUp = new GamepadButtonMapping(GAMEPAD_MASK_UP);
mapDpadDown = new GamepadButtonMapping(GAMEPAD_MASK_DOWN);
mapDpadLeft = new GamepadButtonMapping(GAMEPAD_MASK_LEFT);
mapDpadRight = new GamepadButtonMapping(GAMEPAD_MASK_RIGHT);
mapButtonB1 = new GamepadButtonMapping(GAMEPAD_MASK_B1);
mapButtonB2 = new GamepadButtonMapping(GAMEPAD_MASK_B2);
mapButtonB3 = new GamepadButtonMapping(GAMEPAD_MASK_B3);
mapButtonB4 = new GamepadButtonMapping(GAMEPAD_MASK_B4);
mapButtonL1 = new GamepadButtonMapping(GAMEPAD_MASK_L1);
mapButtonR1 = new GamepadButtonMapping(GAMEPAD_MASK_R1);
mapButtonL2 = new GamepadButtonMapping(GAMEPAD_MASK_L2);
mapButtonR2 = new GamepadButtonMapping(GAMEPAD_MASK_R2);
mapButtonS1 = new GamepadButtonMapping(GAMEPAD_MASK_S1);
mapButtonS2 = new GamepadButtonMapping(GAMEPAD_MASK_S2);
mapButtonL3 = new GamepadButtonMapping(GAMEPAD_MASK_L3);
mapButtonR3 = new GamepadButtonMapping(GAMEPAD_MASK_R3);
mapButtonA1 = new GamepadButtonMapping(GAMEPAD_MASK_A1);
mapButtonA2 = new GamepadButtonMapping(GAMEPAD_MASK_A2);
mapButtonA3 = new GamepadButtonMapping(GAMEPAD_MASK_A3);
mapButtonA4 = new GamepadButtonMapping(GAMEPAD_MASK_A4);
mapButtonE1 = new GamepadButtonMapping(GAMEPAD_MASK_E1);
mapButtonE2 = new GamepadButtonMapping(GAMEPAD_MASK_E2);
mapButtonE3 = new GamepadButtonMapping(GAMEPAD_MASK_E3);
mapButtonE4 = new GamepadButtonMapping(GAMEPAD_MASK_E4);
mapButtonE5 = new GamepadButtonMapping(GAMEPAD_MASK_E5);
mapButtonE6 = new GamepadButtonMapping(GAMEPAD_MASK_E6);
mapButtonE7 = new GamepadButtonMapping(GAMEPAD_MASK_E7);
mapButtonE8 = new GamepadButtonMapping(GAMEPAD_MASK_E8);
mapButtonE9 = new GamepadButtonMapping(GAMEPAD_MASK_E9);
mapButtonE10 = new GamepadButtonMapping(GAMEPAD_MASK_E10);
mapButtonE11 = new GamepadButtonMapping(GAMEPAD_MASK_E11);
mapButtonE12 = new GamepadButtonMapping(GAMEPAD_MASK_E12);
mapButtonFn = new GamepadButtonMapping(AUX_MASK_FUNCTION);
mapButtonDP = new GamepadButtonMapping(SUSTAIN_DP_MODE_DP);
mapButtonLS = new GamepadButtonMapping(SUSTAIN_DP_MODE_LS);
mapButtonRS = new GamepadButtonMapping(SUSTAIN_DP_MODE_RS);
mapDigitalUp = new GamepadButtonMapping(GAMEPAD_MASK_UP);
mapDigitalDown = new GamepadButtonMapping(GAMEPAD_MASK_DOWN);
mapDigitalLeft = new GamepadButtonMapping(GAMEPAD_MASK_LEFT);
mapDigitalRight = new GamepadButtonMapping(GAMEPAD_MASK_RIGHT);

const auto assignCustomMappingToMaps = [&](GpioMappingInfo mapInfo, Pin_t pin) -> void {
if (mapDpadUp->buttonMask & mapInfo.customDpadMask) mapDpadUp->pinMask |= 1 << pin;
Expand All @@ -91,6 +95,10 @@ void Gamepad::setup()
if (mapButtonR3->buttonMask & mapInfo.customButtonMask) mapButtonR3->pinMask |= 1 << pin;
if (mapButtonA1->buttonMask & mapInfo.customButtonMask) mapButtonA1->pinMask |= 1 << pin;
if (mapButtonA2->buttonMask & mapInfo.customButtonMask) mapButtonA2->pinMask |= 1 << pin;
if (mapDigitalUp->buttonMask & mapInfo.customDpadMask) mapDigitalUp->pinMask |= 1 << pin;
if (mapDigitalDown->buttonMask & mapInfo.customDpadMask) mapDigitalDown->pinMask |= 1 << pin;
if (mapDigitalLeft->buttonMask & mapInfo.customDpadMask) mapDigitalLeft->pinMask |= 1 << pin;
if (mapDigitalRight->buttonMask & mapInfo.customDpadMask) mapDigitalRight->pinMask |= 1 << pin;
};

for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
Expand Down Expand Up @@ -133,6 +141,10 @@ void Gamepad::setup()
case GpioAction::SUSTAIN_DP_MODE_LS: mapButtonLS->pinMask |= 1 << pin; break;
case GpioAction::SUSTAIN_DP_MODE_RS: mapButtonRS->pinMask |= 1 << pin; break;
case GpioAction::CUSTOM_BUTTON_COMBO: assignCustomMappingToMaps(pinMappings[pin], pin); break;
case GpioAction::DIGITAL_DIRECTION_UP: mapDigitalUp->pinMask |= 1 << pin; break;
case GpioAction::DIGITAL_DIRECTION_DOWN: mapDigitalDown->pinMask |= 1 << pin; break;
case GpioAction::DIGITAL_DIRECTION_LEFT: mapDigitalLeft->pinMask |= 1 << pin; break;
case GpioAction::DIGITAL_DIRECTION_RIGHT: mapDigitalRight->pinMask |= 1 << pin; break;
default: break;
}
}
Expand Down Expand Up @@ -180,6 +192,10 @@ void Gamepad::reinit()
delete mapButtonDP;
delete mapButtonLS;
delete mapButtonRS;
delete mapDigitalUp;
delete mapDigitalDown;
delete mapDigitalLeft;
delete mapDigitalRight;

// reinitialize pin mappings
this->setup();
Expand Down Expand Up @@ -221,7 +237,11 @@ void Gamepad::process()
state.dpad = filterToFourWayMode(state.dpad);
}

uint8_t dpadCheck = state.dpad;
uint8_t dpadOnlyMask = 0;
uint8_t dpadModeMask = 0;
state.dpad = runSOCDCleaner(resolveSOCDMode(options), state.dpad);
dpadOnlyMask = ((dpadCheck & 0xF0) >> 4);

switch (activeDpadMode)
{
Expand All @@ -232,19 +252,21 @@ void Gamepad::process()
}
state.lx = dpadToAnalogX(state.dpad);
state.ly = dpadToAnalogY(state.dpad);
state.dpad = 0;
state.dpad &= ~dpadOnlyMask;
state.dpad = dpadOnlyMask;
break;

case DpadMode::DPAD_MODE_RIGHT_ANALOG:
if (!hasLeftAnalogStick) {
state.lx = joystickMid;
state.ly = joystickMid;
}
state.rx = dpadToAnalogX(state.dpad);
state.ry = dpadToAnalogY(state.dpad);
state.dpad = 0;
state.dpad &= ~dpadOnlyMask;
state.dpad = dpadOnlyMask;
break;

default:
if (!hasLeftAnalogStick) {
state.lx = joystickMid;
Expand Down Expand Up @@ -272,10 +294,14 @@ void Gamepad::read()
| (values & mapButtonFn->pinMask) ? mapButtonFn->buttonMask : 0;

state.dpad = 0
| ((values & mapDpadUp->pinMask) ? mapDpadUp->buttonMask : 0)
| ((values & mapDpadDown->pinMask) ? mapDpadDown->buttonMask : 0)
| ((values & mapDpadLeft->pinMask) ? mapDpadLeft->buttonMask : 0)
| ((values & mapDpadRight->pinMask) ? mapDpadRight->buttonMask : 0)
| ((values & mapDpadUp->pinMask) ? mapDpadUp->buttonMask : 0)
| ((values & mapDpadDown->pinMask) ? mapDpadDown->buttonMask : 0)
| ((values & mapDpadLeft->pinMask) ? mapDpadLeft->buttonMask : 0)
| ((values & mapDpadRight->pinMask) ? mapDpadRight->buttonMask : 0)
| ((values & mapDigitalUp->pinMask) ? (mapDigitalUp->buttonMask) | (mapDigitalUp->buttonMask << 4) : 0)
| ((values & mapDigitalDown->pinMask) ? (mapDigitalDown->buttonMask) | (mapDigitalDown->buttonMask << 4) : 0)
| ((values & mapDigitalLeft->pinMask) ? (mapDigitalLeft->buttonMask) | (mapDigitalLeft->buttonMask << 4) : 0)
| ((values & mapDigitalRight->pinMask) ? (mapDigitalRight->buttonMask) | (mapDigitalRight->buttonMask << 4) : 0)
;

state.buttons = 0
Expand Down
14 changes: 14 additions & 0 deletions www/src/Data/Pins.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,20 @@ export const BUTTON_ACTIONS = {
BUTTON_PRESS_E10: 52,
BUTTON_PRESS_E11: 53,
BUTTON_PRESS_E12: 54,
DIGITAL_DIRECTION_UP: 55,
DIGITAL_DIRECTION_DOWN: 56,
DIGITAL_DIRECTION_LEFT: 57,
DIGITAL_DIRECTION_RIGHT: 58,
ANALOG_DIRECTION_LS_X_NEG: 59,
ANALOG_DIRECTION_LS_X_POS: 60,
ANALOG_DIRECTION_LS_Y_NEG: 61,
ANALOG_DIRECTION_LS_Y_POS: 62,
ANALOG_DIRECTION_RS_X_NEG: 63,
ANALOG_DIRECTION_RS_X_POS: 64,
ANALOG_DIRECTION_RS_Y_NEG: 65,
ANALOG_DIRECTION_RS_Y_POS: 66,
ANALOG_DIRECTION_MOD_LOW: 67,
ANALOG_DIRECTION_MOD_HIGH: 68,
} as const;

export const PIN_DIRECTIONS = {
Expand Down
14 changes: 14 additions & 0 deletions www/src/Locales/en/PinMapping.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,5 +82,19 @@ export default {
BUTTON_PRESS_E10: 'Extra 10',
BUTTON_PRESS_E11: 'Extra 11',
BUTTON_PRESS_E12: 'Extra 12',
DIGITAL_DIRECTION_UP: 'Digital/D-Pad Up',
DIGITAL_DIRECTION_DOWN: 'Digital/D-Pad Down',
DIGITAL_DIRECTION_LEFT: 'Digital/D-Pad Left',
DIGITAL_DIRECTION_RIGHT: 'Digital/D-Pad Right',
ANALOG_DIRECTION_LS_X_NEG: 'Left Analog Stick X-',
ANALOG_DIRECTION_LS_X_POS: 'Left Analog Stick X+',
ANALOG_DIRECTION_LS_Y_NEG: 'Left Analog Stick Y-',
ANALOG_DIRECTION_LS_Y_POS: 'Left Analog Stick Y+',
ANALOG_DIRECTION_RS_X_NEG: 'Right Analog Stick X-',
ANALOG_DIRECTION_RS_X_POS: 'Right Analog Stick X+',
ANALOG_DIRECTION_RS_Y_NEG: 'Right Analog Stick Y-',
ANALOG_DIRECTION_RS_Y_POS: 'Right Analog Stick Y+',
ANALOG_DIRECTION_MOD_LOW: 'Analog Stick Modifier Low',
ANALOG_DIRECTION_MOD_HIGH: 'Analog Stick Modifier High',
},
};

0 comments on commit d80e1ad

Please sign in to comment.