diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index efdc5249..320ce217 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -24,6 +24,7 @@ constexpr uint8_t SETTINGS_FILE_VERSION = 1; // Increment this when adding new persisted settings fields constexpr uint8_t SETTINGS_COUNT = 27; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; + // Validate front button mapping to ensure each hardware button is unique. // If duplicates are detected, reset to the default physical order to prevent invalid mappings. void validateFrontButtonMapping(CrossPointSettings& settings) { @@ -43,6 +44,37 @@ void validateFrontButtonMapping(CrossPointSettings& settings) { } } } + +// Convert legacy front button layout into explicit logical->hardware mapping. +void applyLegacyFrontButtonLayout(CrossPointSettings& settings) { + switch (static_cast(settings.frontButtonLayout)) { + case CrossPointSettings::LEFT_RIGHT_BACK_CONFIRM: + settings.frontButtonBack = CrossPointSettings::FRONT_HW_LEFT; + settings.frontButtonConfirm = CrossPointSettings::FRONT_HW_RIGHT; + settings.frontButtonLeft = CrossPointSettings::FRONT_HW_BACK; + settings.frontButtonRight = CrossPointSettings::FRONT_HW_CONFIRM; + break; + case CrossPointSettings::LEFT_BACK_CONFIRM_RIGHT: + settings.frontButtonBack = CrossPointSettings::FRONT_HW_CONFIRM; + settings.frontButtonConfirm = CrossPointSettings::FRONT_HW_LEFT; + settings.frontButtonLeft = CrossPointSettings::FRONT_HW_BACK; + settings.frontButtonRight = CrossPointSettings::FRONT_HW_RIGHT; + break; + case CrossPointSettings::BACK_CONFIRM_RIGHT_LEFT: + settings.frontButtonBack = CrossPointSettings::FRONT_HW_BACK; + settings.frontButtonConfirm = CrossPointSettings::FRONT_HW_CONFIRM; + settings.frontButtonLeft = CrossPointSettings::FRONT_HW_RIGHT; + settings.frontButtonRight = CrossPointSettings::FRONT_HW_LEFT; + break; + case CrossPointSettings::BACK_CONFIRM_LEFT_RIGHT: + default: + settings.frontButtonBack = CrossPointSettings::FRONT_HW_BACK; + settings.frontButtonConfirm = CrossPointSettings::FRONT_HW_CONFIRM; + settings.frontButtonLeft = CrossPointSettings::FRONT_HW_LEFT; + settings.frontButtonRight = CrossPointSettings::FRONT_HW_RIGHT; + break; + } +} } // namespace bool CrossPointSettings::saveToFile() const { @@ -186,6 +218,8 @@ bool CrossPointSettings::loadFromFile() { if (frontButtonMappingRead) { validateFrontButtonMapping(*this); + } else { + applyLegacyFrontButtonLayout(*this); } inputFile.close(); diff --git a/src/activities/settings/ButtonRemapActivity.cpp b/src/activities/settings/ButtonRemapActivity.cpp index a286bc42..e0ee5bfa 100644 --- a/src/activities/settings/ButtonRemapActivity.cpp +++ b/src/activities/settings/ButtonRemapActivity.cpp @@ -164,8 +164,8 @@ void ButtonRemapActivity::render() { } // Provide side button actions at the bottom of the screen (split across two lines). - renderer.drawCenteredText(SMALL_FONT_ID, 250, "Side button Up: Reset", true); - renderer.drawCenteredText(SMALL_FONT_ID, 270, "Side button Down: Cancel", true); + renderer.drawCenteredText(SMALL_FONT_ID, 250, "Side button Up: Reset to default layout", true); + renderer.drawCenteredText(SMALL_FONT_ID, 280, "Side button Down: Cancel remapping", true); // Live preview of logical labels under front buttons. // This mirrors the on-device front button order: Back, Confirm, Left, Right.