Skip to content

Commit

Permalink
allow one GPIO pin to trigger 2+ buttons (#724)
Browse files Browse the repository at this point in the history
* have getProfilePinMappings return whole GpioMappingInfos

before it returned just the actions, which was fine, but now we're
adding more stuff to the infos, so return the whole struct rather than
just the GpioAction within it

* define a custom button combo to a GPIO pin

this expands GpioMappingInfo to include dpad and button masks and uses
those masks when setting up the button maps in Gamepad. this allows for
a GPIO pin to trigger any arbitrary set of buttons

* implement get/setPinMappingsV2 which includes the new masks

* fix issue where setPinMappingsV2 was actually ignoring input

* Squashed commit of Pelsin/one-pin-multiple-buttons-ui-revamp:

commit 16c34b6
Merge: 3b21858 8b915e0
Author: ian <ian@vidales.se>
Date:   Sat Jun 8 18:14:42 2024 +0200

    Merge branch 'main' into one-pin-multiple-buttons-ui-revamp

    # Conflicts:
    #	proto/config.proto
    #	www/package-lock.json
    #	www/package.json
    #	www/src/Addons/Wii.tsx
    #	www/src/Pages/InputMacroAddonPage.tsx

commit 3b21858
Author: ian <ian@vidales.se>
Date:   Sat May 4 20:59:19 2024 +0200

    Simplify type juggling by making separate components for base pin and profiles mappings

commit 77c30d6
Author: ian <ian@vidales.se>
Date:   Sat May 4 18:59:17 2024 +0200

    Remove old multi mapping path

commit 2f0892f
Author: ian <ian@vidales.se>
Date:   Sat May 4 18:48:01 2024 +0200

    Fix merge issue

commit 12ed309
Merge: be460f9 22ed9a7
Author: ian <ian@vidales.se>
Date:   Sat May 4 18:37:50 2024 +0200

    Merge branch 'main' into one-pin-multiple-buttons-ui-revamp

    # Conflicts:
    #	www/package-lock.json
    #	www/src/Locales/en/Index.jsx
    #	www/src/Pages/InputMacroAddonPage.tsx

commit be460f9
Author: ian <ian@vidales.se>
Date:   Sat May 4 18:19:54 2024 +0200

    Implement UX for multi selection for base profile and single selection for profiles

commit 7dd59ce
Author: ian <ian@vidales.se>
Date:   Fri Apr 26 13:34:20 2024 +0200

    Evaluate if css grids is suitable for the pin mapping page, add nav pills for profiles

commit 0e120b3
Author: ian <ian@vidales.se>
Date:   Mon Apr 22 22:38:24 2024 +0200

    WIP make pin mappping page handle masks

commit 5712845
Author: ian <ian@vidales.se>
Date:   Mon Apr 22 22:25:40 2024 +0200

    Add lodash types

commit 9d10afb
Author: ian <ian@vidales.se>
Date:   Thu Apr 18 10:09:36 2024 +0200

    Remove multmapping page and start merging it with pinMapping page

commit 5f3fa47
Merge: 2e040a4 d384d8e
Author: ian <ian@vidales.se>
Date:   Wed Apr 17 18:08:56 2024 +0200

    Merge branch 'main' into one-pin-multiple-buttons-ui-revamp

commit 2e040a4
Merge: c4a3c78 7fb30b9
Author: ian <ian@vidales.se>
Date:   Sun Apr 14 23:43:49 2024 +0200

    Merge branch 'main' into one-pin-multiple-buttons-ui-revamp

    # Conflicts:
    #	proto/enums.proto
    #	www/src/Data/Pins.ts
    #	www/src/Locales/en/PinMapping.jsx
    #	www/src/Pages/InputMacroAddonPage.jsx
    #	www/src/Pages/PinMapping.tsx
    #	www/src/Pages/SettingsPage.jsx

commit c4a3c78
Author: Brian S. Stephan <bss@incorporeal.org>
Date:   Fri Mar 22 16:53:27 2024 -0500

    fix usage of button masks for hotkeys

    I probably introduced this in a bad rebase

commit 580eb5e
Author: Brian S. Stephan <bss@incorporeal.org>
Date:   Sat Mar 9 15:20:06 2024 -0600

    add a disclaimer about multi mapping only working on Profile 1

commit 7aef83e
Author: Pelsin <ian@vidales.se>
Date:   Sat Mar 9 21:16:55 2024 +0100

    multi mapping page (#7)

    * remove double initialization of gamepad GPIOs

    * have getProfilePinMappings return whole GpioMappingInfos

    before it returned just the actions, which was fine, but now we're
    adding more stuff to the infos, so return the whole struct rather than
    just the GpioAction within it

    * define a custom button combo to a GPIO pin

    this expands GpioMappingInfo to include dpad and button masks and uses
    those masks when setting up the button maps in Gamepad. this allows for
    a GPIO pin to trigger any arbitrary set of buttons

    * Add a WIP multi mapping page

    * have getProfilePinMappings return whole GpioMappingInfos

    before it returned just the actions, which was fine, but now we're
    adding more stuff to the infos, so return the whole struct rather than
    just the GpioAction within it

    * define a custom button combo to a GPIO pin

    this expands GpioMappingInfo to include dpad and button masks and uses
    those masks when setting up the button maps in Gamepad. this allows for
    a GPIO pin to trigger any arbitrary set of buttons

    * implement get/setPinMappingsV2 which includes the new masks

    * Start moving to new payload structure, new endpoint, translation keys

    * Set action if mask is set

    * Multi-mapping route added to webconfig, start adding customDpadMask

    * Revert endpoint test for v2

    * fix issue where setPinMappingsV2 was actually ignoring input

    * Rename BUTTON_MASK -> BUTTON_MASK_OPTIONS to prepare for multi mapping data

    * Removed some unused imports

    * Add support for dpad mask

    * Add text for assigned to multi mapping on pin mapping page

    * Add support for swapping button labels

    * Update pins after setting multi pin

    * Set correct default in multi mapping, disables selection on non selectable actions

commit f842e25
Author: Brian S. Stephan <bss@incorporeal.org>
Date:   Wed Feb 28 18:28:27 2024 -0600

    fix issue where setPinMappingsV2 was actually ignoring input

commit a2853d8
Author: Brian S. Stephan <bss@incorporeal.org>
Date:   Thu Feb 22 16:28:06 2024 -0600

    implement get/setPinMappingsV2 which includes the new masks

commit 26bbcbe
Author: Brian S. Stephan <bss@incorporeal.org>
Date:   Wed Dec 27 00:44:22 2023 -0600

    define a custom button combo to a GPIO pin

    this expands GpioMappingInfo to include dpad and button masks and uses
    those masks when setting up the button maps in Gamepad. this allows for
    a GPIO pin to trigger any arbitrary set of buttons

commit 55fb9e5
Author: Brian S. Stephan <bss@incorporeal.org>
Date:   Wed Dec 27 00:25:10 2023 -0600

    have getProfilePinMappings return whole GpioMappingInfos

    before it returned just the actions, which was fine, but now we're
    adding more stuff to the infos, so return the whole struct rather than
    just the GpioAction within it

Co-authored-by: ian <ian@vidales.se>
Co-authored-by: Pelsin <ian@vidales.se>

* fix thinko in saving custom button/dpad masks

* move get/setPinMappingsV2 into the original method

upon conversations with Pelsin, we don't need this distinction anymore
(if we ever did), and the React side will be updated to accommodate. the
same treatment will be done to get/setProfileOptions, which need to be
updated to accept the masks in order to allow the multiselect to work on
profiles 2-4

* add the button and dpad masks to get/setProfileOptions

this will allow the webconfig to do multiselect buttons on all the
profiles, not just profile 1

* Convert profile pin structure to handle masks

* yet again, don't cast the button/dpad masks as GpioActions

---------

Co-authored-by: ian <ian@vidales.se>
  • Loading branch information
bsstephan and Pelsin committed Jun 17, 2024
1 parent 0684d8c commit 865ffff
Show file tree
Hide file tree
Showing 35 changed files with 646 additions and 430 deletions.
4 changes: 2 additions & 2 deletions headers/storagemanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class Storage {
AddonOptions& getAddonOptions() { return config.addonOptions; }
AnimationOptions_Proto& getAnimationOptions() { return config.animationOptions; }
ProfileOptions& getProfileOptions() { return config.profileOptions; }
GpioAction* getProfilePinMappings() { return functionalPinMappings; }
GpioMappingInfo* getProfilePinMappings() { return functionalPinMappings; }
PeripheralOptions& getPeripheralOptions() { return config.peripheralOptions; }

void init();
Expand Down Expand Up @@ -86,7 +86,7 @@ class Storage {
critical_section_t animationOptionsCs;
uint32_t animationOptionsCrc = 0;
AnimationOptions animationOptionsToSave = {};
GpioAction functionalPinMappings[NUM_BANK0_GPIOS];
GpioMappingInfo functionalPinMappings[NUM_BANK0_GPIOS];
};

#endif
2 changes: 2 additions & 0 deletions proto/config.proto
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ message GpioMappingInfo
{
optional GpioAction action = 1;
optional GpioDirection direction = 2;
optional uint32 customDpadMask = 3;
optional uint32 customButtonMask = 4;
}

message GpioMappings
Expand Down
1 change: 1 addition & 0 deletions proto/enums.proto
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ enum GpioAction
BUTTON_PRESS_MACRO_4 = 37;
BUTTON_PRESS_MACRO_5 = 38;
BUTTON_PRESS_MACRO_6 = 39;
CUSTOM_BUTTON_COMBO = 40;
}

enum GpioDirection
Expand Down
4 changes: 2 additions & 2 deletions src/addons/dualdirectional.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ void DualDirectionalInput::setup() {
mapDpadLeft = new GamepadButtonMapping(GAMEPAD_MASK_LEFT);
mapDpadRight = new GamepadButtonMapping(GAMEPAD_MASK_RIGHT);

GpioAction* pinMappings = Storage::getInstance().getProfilePinMappings();
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();
for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
{
switch (pinMappings[pin]) {
switch (pinMappings[pin].action) {
case GpioAction::BUTTON_PRESS_DDI_UP: mapDpadUp->pinMask |= 1 << pin; break;
case GpioAction::BUTTON_PRESS_DDI_DOWN: mapDpadDown->pinMask |= 1 << pin; break;
case GpioAction::BUTTON_PRESS_DDI_LEFT: mapDpadLeft->pinMask |= 1 << pin; break;
Expand Down
12 changes: 6 additions & 6 deletions src/addons/input_macro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@

bool InputMacro::available() {
// Macro Button initialized by void Gamepad::setup()
GpioAction* pinMappings = Storage::getInstance().getProfilePinMappings();
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();
for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
{
switch( pinMappings[pin] ) {
switch( pinMappings[pin].action ) {
case GpioAction::BUTTON_PRESS_MACRO:
case GpioAction::BUTTON_PRESS_MACRO_1:
case GpioAction::BUTTON_PRESS_MACRO_2:
Expand All @@ -26,12 +26,12 @@ bool InputMacro::available() {
}

void InputMacro::setup() {
GpioAction* pinMappings = Storage::getInstance().getProfilePinMappings();
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();
macroButtonMask = 0;
memset(macroPinMasks, 0, sizeof(macroPinMasks));
for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
{
switch( pinMappings[pin] ) {
switch( pinMappings[pin].action ) {
case GpioAction::BUTTON_PRESS_MACRO:
macroButtonMask = 1 << pin;
break;
Expand Down Expand Up @@ -253,12 +253,12 @@ void InputMacro::preprocess()
}

void InputMacro::reinit() {
GpioAction* pinMappings = Storage::getInstance().getProfilePinMappings();
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();
macroButtonMask = 0;
memset(macroPinMasks, 0, sizeof(macroPinMasks));
for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
{
switch( pinMappings[pin] ) {
switch( pinMappings[pin].action ) {
case GpioAction::BUTTON_PRESS_MACRO:
macroButtonMask = 1 << pin;
break;
Expand Down
4 changes: 2 additions & 2 deletions src/addons/jslider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ bool JSliderInput::available() {

void JSliderInput::setup()
{
GpioAction* pinMappings = Storage::getInstance().getProfilePinMappings();
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();
for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
{
switch (pinMappings[pin]) {
switch (pinMappings[pin].action) {
case SUSTAIN_DP_MODE_DP: dpModeMask |= 1 << pin; break;
case SUSTAIN_DP_MODE_LS: lsModeMask |= 1 << pin; break;
case SUSTAIN_DP_MODE_RS: rsModeMask |= 1 << pin; break;
Expand Down
4 changes: 2 additions & 2 deletions src/addons/slider_socd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ bool SliderSOCDInput::available() {

void SliderSOCDInput::setup()
{
GpioAction* pinMappings = Storage::getInstance().getProfilePinMappings();
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();
for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
{
switch (pinMappings[pin]) {
switch (pinMappings[pin].action) {
case SUSTAIN_SOCD_MODE_UP_PRIO: upPrioModeMask |= 1 << pin; break;
case SUSTAIN_SOCD_MODE_NEUTRAL: neutralModeMask |= 1 << pin; break;
case SUSTAIN_SOCD_MODE_SECOND_WIN: secondInputModeMask |= 1 << pin; break;
Expand Down
8 changes: 4 additions & 4 deletions src/addons/turbo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@
bool TurboInput::available() {
// Turbo Button initialized by void Gamepad::setup()
bool hasTurboAssigned = false;
GpioAction* pinMappings = Storage::getInstance().getProfilePinMappings();
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();
for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
{
if ( pinMappings[pin] == GpioAction::BUTTON_PRESS_TURBO ) {
if ( pinMappings[pin].action == GpioAction::BUTTON_PRESS_TURBO ) {
hasTurboAssigned = true;
turboPinMask = 1 << pin;
break;
Expand Down Expand Up @@ -111,10 +111,10 @@ void TurboInput::setup()
void TurboInput::reinit()
{
turboPinMask = 0;
GpioAction* pinMappings = Storage::getInstance().getProfilePinMappings();
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();
for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
{
if ( pinMappings[pin] == GpioAction::BUTTON_PRESS_TURBO ) {
if ( pinMappings[pin].action == GpioAction::BUTTON_PRESS_TURBO ) {
turboPinMask = 1 << pin;
break;
}
Expand Down
154 changes: 85 additions & 69 deletions src/configs/webconfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

#define PATH_CGI_ACTION "/cgi/action"

#define LWIP_HTTPD_POST_MAX_PAYLOAD_LEN (1024 * 8)
#define LWIP_HTTPD_POST_MAX_PAYLOAD_LEN (1024 * 16)

using namespace std;

Expand Down Expand Up @@ -552,9 +552,11 @@ std::string setProfileOptions()
// setting a pin shouldn't change a new existing addon/reserved pin
if (profileOptions.gpioMappingsSets[altsIndex].pins[pin].action != GpioAction::ASSIGNED_TO_ADDON &&
profileOptions.gpioMappingsSets[altsIndex].pins[pin].action != GpioAction::RESERVED &&
(GpioAction)alt[pinName] != GpioAction::RESERVED &&
(GpioAction)alt[pinName] != GpioAction::ASSIGNED_TO_ADDON) {
profileOptions.gpioMappingsSets[altsIndex].pins[pin].action = (GpioAction)alt[pinName];
(GpioAction)alt[pinName]["action"] != GpioAction::RESERVED &&
(GpioAction)alt[pinName]["action"] != GpioAction::ASSIGNED_TO_ADDON) {
profileOptions.gpioMappingsSets[altsIndex].pins[pin].action = (GpioAction)alt[pinName]["action"];
profileOptions.gpioMappingsSets[altsIndex].pins[pin].customButtonMask = (uint32_t)alt[pinName]["customButtonMask"];
profileOptions.gpioMappingsSets[altsIndex].pins[pin].customDpadMask = (uint32_t)alt[pinName]["customDpadMask"];
}
}
profileOptions.gpioMappingsSets_count = ++altsIndex;
Expand All @@ -569,43 +571,48 @@ std::string getProfileOptions()
{
DynamicJsonDocument doc(LWIP_HTTPD_POST_MAX_PAYLOAD_LEN);

const auto writePinDoc = [&](const int item, const char* key, const GpioMappingInfo& value) -> void
{
writeDoc(doc, "alternativePinMappings", item, key, "action", value.action);
writeDoc(doc, "alternativePinMappings", item, key, "customButtonMask", value.customButtonMask);
writeDoc(doc, "alternativePinMappings", item, key, "customDpadMask", value.customDpadMask);
};

ProfileOptions& profileOptions = Storage::getInstance().getProfileOptions();
JsonArray alts = doc.createNestedArray("alternativePinMappings");
for (int i = 0; i < profileOptions.gpioMappingsSets_count; i++) {
JsonObject altMappings = alts.createNestedObject();
// this looks duplicative, but something in arduinojson treats the doc
// field string by reference so you can't be "clever" and do an snprintf
// thing or else you only send the last field in the JSON
altMappings["pin00"] = profileOptions.gpioMappingsSets[i].pins[0].action;
altMappings["pin01"] = profileOptions.gpioMappingsSets[i].pins[1].action;
altMappings["pin02"] = profileOptions.gpioMappingsSets[i].pins[2].action;
altMappings["pin03"] = profileOptions.gpioMappingsSets[i].pins[3].action;
altMappings["pin04"] = profileOptions.gpioMappingsSets[i].pins[4].action;
altMappings["pin05"] = profileOptions.gpioMappingsSets[i].pins[5].action;
altMappings["pin06"] = profileOptions.gpioMappingsSets[i].pins[6].action;
altMappings["pin07"] = profileOptions.gpioMappingsSets[i].pins[7].action;
altMappings["pin08"] = profileOptions.gpioMappingsSets[i].pins[8].action;
altMappings["pin09"] = profileOptions.gpioMappingsSets[i].pins[9].action;
altMappings["pin10"] = profileOptions.gpioMappingsSets[i].pins[10].action;
altMappings["pin11"] = profileOptions.gpioMappingsSets[i].pins[11].action;
altMappings["pin12"] = profileOptions.gpioMappingsSets[i].pins[12].action;
altMappings["pin13"] = profileOptions.gpioMappingsSets[i].pins[13].action;
altMappings["pin14"] = profileOptions.gpioMappingsSets[i].pins[14].action;
altMappings["pin15"] = profileOptions.gpioMappingsSets[i].pins[15].action;
altMappings["pin16"] = profileOptions.gpioMappingsSets[i].pins[16].action;
altMappings["pin17"] = profileOptions.gpioMappingsSets[i].pins[17].action;
altMappings["pin18"] = profileOptions.gpioMappingsSets[i].pins[18].action;
altMappings["pin19"] = profileOptions.gpioMappingsSets[i].pins[19].action;
altMappings["pin20"] = profileOptions.gpioMappingsSets[i].pins[20].action;
altMappings["pin21"] = profileOptions.gpioMappingsSets[i].pins[21].action;
altMappings["pin22"] = profileOptions.gpioMappingsSets[i].pins[22].action;
altMappings["pin23"] = profileOptions.gpioMappingsSets[i].pins[23].action;
altMappings["pin24"] = profileOptions.gpioMappingsSets[i].pins[24].action;
altMappings["pin25"] = profileOptions.gpioMappingsSets[i].pins[25].action;
altMappings["pin26"] = profileOptions.gpioMappingsSets[i].pins[26].action;
altMappings["pin27"] = profileOptions.gpioMappingsSets[i].pins[27].action;
altMappings["pin28"] = profileOptions.gpioMappingsSets[i].pins[28].action;
altMappings["pin29"] = profileOptions.gpioMappingsSets[i].pins[29].action;
writePinDoc(i, "pin00", profileOptions.gpioMappingsSets[i].pins[0]);
writePinDoc(i, "pin01", profileOptions.gpioMappingsSets[i].pins[1]);
writePinDoc(i, "pin02", profileOptions.gpioMappingsSets[i].pins[2]);
writePinDoc(i, "pin03", profileOptions.gpioMappingsSets[i].pins[3]);
writePinDoc(i, "pin04", profileOptions.gpioMappingsSets[i].pins[4]);
writePinDoc(i, "pin05", profileOptions.gpioMappingsSets[i].pins[5]);
writePinDoc(i, "pin06", profileOptions.gpioMappingsSets[i].pins[6]);
writePinDoc(i, "pin07", profileOptions.gpioMappingsSets[i].pins[7]);
writePinDoc(i, "pin08", profileOptions.gpioMappingsSets[i].pins[8]);
writePinDoc(i, "pin09", profileOptions.gpioMappingsSets[i].pins[9]);
writePinDoc(i, "pin10", profileOptions.gpioMappingsSets[i].pins[10]);
writePinDoc(i, "pin11", profileOptions.gpioMappingsSets[i].pins[11]);
writePinDoc(i, "pin12", profileOptions.gpioMappingsSets[i].pins[12]);
writePinDoc(i, "pin13", profileOptions.gpioMappingsSets[i].pins[13]);
writePinDoc(i, "pin14", profileOptions.gpioMappingsSets[i].pins[14]);
writePinDoc(i, "pin15", profileOptions.gpioMappingsSets[i].pins[15]);
writePinDoc(i, "pin16", profileOptions.gpioMappingsSets[i].pins[16]);
writePinDoc(i, "pin17", profileOptions.gpioMappingsSets[i].pins[17]);
writePinDoc(i, "pin18", profileOptions.gpioMappingsSets[i].pins[18]);
writePinDoc(i, "pin19", profileOptions.gpioMappingsSets[i].pins[19]);
writePinDoc(i, "pin20", profileOptions.gpioMappingsSets[i].pins[20]);
writePinDoc(i, "pin21", profileOptions.gpioMappingsSets[i].pins[21]);
writePinDoc(i, "pin22", profileOptions.gpioMappingsSets[i].pins[22]);
writePinDoc(i, "pin23", profileOptions.gpioMappingsSets[i].pins[23]);
writePinDoc(i, "pin24", profileOptions.gpioMappingsSets[i].pins[24]);
writePinDoc(i, "pin25", profileOptions.gpioMappingsSets[i].pins[25]);
writePinDoc(i, "pin26", profileOptions.gpioMappingsSets[i].pins[26]);
writePinDoc(i, "pin27", profileOptions.gpioMappingsSets[i].pins[27]);
writePinDoc(i, "pin28", profileOptions.gpioMappingsSets[i].pins[28]);
writePinDoc(i, "pin29", profileOptions.gpioMappingsSets[i].pins[29]);
}

return serialize_json(doc);
Expand Down Expand Up @@ -1037,9 +1044,11 @@ std::string setPinMappings()
// setting a pin shouldn't change a new existing addon/reserved pin
if (gpioMappings[pin].action != GpioAction::RESERVED &&
gpioMappings[pin].action != GpioAction::ASSIGNED_TO_ADDON &&
(GpioAction)doc[pinName] != GpioAction::RESERVED &&
(GpioAction)doc[pinName] != GpioAction::ASSIGNED_TO_ADDON) {
gpioMappings[pin].action = (GpioAction)doc[pinName];
(GpioAction)doc[pinName]["action"] != GpioAction::RESERVED &&
(GpioAction)doc[pinName]["action"] != GpioAction::ASSIGNED_TO_ADDON) {
gpioMappings[pin].action = (GpioAction)doc[pinName]["action"];
gpioMappings[pin].customButtonMask = (uint32_t)doc[pinName]["customButtonMask"];
gpioMappings[pin].customDpadMask = (uint32_t)doc[pinName]["customDpadMask"];
}
}

Expand All @@ -1054,36 +1063,43 @@ std::string getPinMappings()

GpioMappingInfo* gpioMappings = Storage::getInstance().getGpioMappings().pins;

writeDoc(doc, "pin00", gpioMappings[0].action);
writeDoc(doc, "pin01", gpioMappings[1].action);
writeDoc(doc, "pin02", gpioMappings[2].action);
writeDoc(doc, "pin03", gpioMappings[3].action);
writeDoc(doc, "pin04", gpioMappings[4].action);
writeDoc(doc, "pin05", gpioMappings[5].action);
writeDoc(doc, "pin06", gpioMappings[6].action);
writeDoc(doc, "pin07", gpioMappings[7].action);
writeDoc(doc, "pin08", gpioMappings[8].action);
writeDoc(doc, "pin09", gpioMappings[9].action);
writeDoc(doc, "pin10", gpioMappings[10].action);
writeDoc(doc, "pin11", gpioMappings[11].action);
writeDoc(doc, "pin12", gpioMappings[12].action);
writeDoc(doc, "pin13", gpioMappings[13].action);
writeDoc(doc, "pin14", gpioMappings[14].action);
writeDoc(doc, "pin15", gpioMappings[15].action);
writeDoc(doc, "pin16", gpioMappings[16].action);
writeDoc(doc, "pin17", gpioMappings[17].action);
writeDoc(doc, "pin18", gpioMappings[18].action);
writeDoc(doc, "pin19", gpioMappings[19].action);
writeDoc(doc, "pin20", gpioMappings[20].action);
writeDoc(doc, "pin21", gpioMappings[21].action);
writeDoc(doc, "pin22", gpioMappings[22].action);
writeDoc(doc, "pin23", gpioMappings[23].action);
writeDoc(doc, "pin24", gpioMappings[24].action);
writeDoc(doc, "pin25", gpioMappings[25].action);
writeDoc(doc, "pin26", gpioMappings[26].action);
writeDoc(doc, "pin27", gpioMappings[27].action);
writeDoc(doc, "pin28", gpioMappings[28].action);
writeDoc(doc, "pin29", gpioMappings[29].action);
const auto writePinDoc = [&](const char* key, const GpioMappingInfo& value) -> void
{
writeDoc(doc, key, "action", value.action);
writeDoc(doc, key, "customButtonMask", value.customButtonMask);
writeDoc(doc, key, "customDpadMask", value.customDpadMask);
};

writePinDoc("pin00", gpioMappings[0]);
writePinDoc("pin01", gpioMappings[1]);
writePinDoc("pin02", gpioMappings[2]);
writePinDoc("pin03", gpioMappings[3]);
writePinDoc("pin04", gpioMappings[4]);
writePinDoc("pin05", gpioMappings[5]);
writePinDoc("pin06", gpioMappings[6]);
writePinDoc("pin07", gpioMappings[7]);
writePinDoc("pin08", gpioMappings[8]);
writePinDoc("pin09", gpioMappings[9]);
writePinDoc("pin10", gpioMappings[10]);
writePinDoc("pin11", gpioMappings[11]);
writePinDoc("pin12", gpioMappings[12]);
writePinDoc("pin13", gpioMappings[13]);
writePinDoc("pin14", gpioMappings[14]);
writePinDoc("pin15", gpioMappings[15]);
writePinDoc("pin16", gpioMappings[16]);
writePinDoc("pin17", gpioMappings[17]);
writePinDoc("pin18", gpioMappings[18]);
writePinDoc("pin19", gpioMappings[19]);
writePinDoc("pin20", gpioMappings[20]);
writePinDoc("pin21", gpioMappings[21]);
writePinDoc("pin22", gpioMappings[22]);
writePinDoc("pin23", gpioMappings[23]);
writePinDoc("pin24", gpioMappings[24]);
writePinDoc("pin25", gpioMappings[25]);
writePinDoc("pin26", gpioMappings[26]);
writePinDoc("pin27", gpioMappings[27]);
writePinDoc("pin28", gpioMappings[28]);
writePinDoc("pin29", gpioMappings[29]);

return serialize_json(doc);
}
Expand Down
6 changes: 3 additions & 3 deletions src/display/ui/screens/ButtonLayoutScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ void ButtonLayoutScreen::init() {
// macro display now uses our pin functions, so we need to check if pins are enabled...
macroEnabled = false;
// Macro Button initialized by void Gamepad::setup()
GpioAction* pinMappings = Storage::getInstance().getProfilePinMappings();
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();
for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
{
switch( pinMappings[pin] ) {
switch( pinMappings[pin].action ) {
case GpioAction::BUTTON_PRESS_MACRO:
case GpioAction::BUTTON_PRESS_MACRO_1:
case GpioAction::BUTTON_PRESS_MACRO_2:
Expand Down Expand Up @@ -469,4 +469,4 @@ bool ButtonLayoutScreen::pressedDownRight()
}

return false;
}
}
Loading

0 comments on commit 865ffff

Please sign in to comment.