From d7f4bd54f51733050ca62c37fc1aca1fedb6a296 Mon Sep 17 00:00:00 2001 From: Yona Date: Mon, 29 Dec 2025 11:17:10 +0100 Subject: [PATCH] Add side button layout configuration while on reader (#147) ## Summary Allow swapping the side button layout between *next page - prev page* and *prev page - next page* while reading --- src/CrossPointSettings.cpp | 5 +++- src/CrossPointSettings.h | 7 +++++ src/MappedInputManager.cpp | 27 +++++++++++++++----- src/activities/settings/SettingsActivity.cpp | 6 ++++- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index a0a002f..41c3322 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -11,7 +11,7 @@ CrossPointSettings CrossPointSettings::instance; namespace { constexpr uint8_t SETTINGS_FILE_VERSION = 1; // Increment this when adding new persisted settings fields -constexpr uint8_t SETTINGS_COUNT = 6; +constexpr uint8_t SETTINGS_COUNT = 7; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; } // namespace @@ -32,6 +32,7 @@ bool CrossPointSettings::saveToFile() const { serialization::writePod(outputFile, statusBar); serialization::writePod(outputFile, orientation); serialization::writePod(outputFile, frontButtonLayout); + serialization::writePod(outputFile, sideButtonLayout); outputFile.close(); Serial.printf("[%lu] [CPS] Settings saved to file\n", millis()); @@ -70,6 +71,8 @@ bool CrossPointSettings::loadFromFile() { if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, frontButtonLayout); if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, sideButtonLayout); + if (++settingsRead >= fileSettingsCount) break; } while (false); inputFile.close(); diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index 78356ff..5ad879b 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -33,6 +33,11 @@ class CrossPointSettings { // Swapped: Left, Right, Back, Confirm enum FRONT_BUTTON_LAYOUT { BACK_CONFIRM_LEFT_RIGHT = 0, LEFT_RIGHT_BACK_CONFIRM = 1 }; + // Side button layout options + // Default: Previous, Next + // Swapped: Next, Previous + enum SIDE_BUTTON_LAYOUT { PREV_NEXT = 0, NEXT_PREV = 1 }; + // Sleep screen settings uint8_t sleepScreen = DARK; // Status bar settings @@ -46,6 +51,8 @@ class CrossPointSettings { uint8_t orientation = PORTRAIT; // Front button layout uint8_t frontButtonLayout = BACK_CONFIRM_LEFT_RIGHT; + // Side button layout + uint8_t sideButtonLayout = PREV_NEXT; ~CrossPointSettings() = default; diff --git a/src/MappedInputManager.cpp b/src/MappedInputManager.cpp index eeda106..7ee2295 100644 --- a/src/MappedInputManager.cpp +++ b/src/MappedInputManager.cpp @@ -1,11 +1,12 @@ #include "MappedInputManager.h" decltype(InputManager::BTN_BACK) MappedInputManager::mapButton(const Button button) const { - const auto layout = static_cast(SETTINGS.frontButtonLayout); + const auto frontLayout = static_cast(SETTINGS.frontButtonLayout); + const auto sideLayout = static_cast(SETTINGS.sideButtonLayout); switch (button) { case Button::Back: - switch (layout) { + switch (frontLayout) { case CrossPointSettings::LEFT_RIGHT_BACK_CONFIRM: return InputManager::BTN_LEFT; case CrossPointSettings::BACK_CONFIRM_LEFT_RIGHT: @@ -13,7 +14,7 @@ decltype(InputManager::BTN_BACK) MappedInputManager::mapButton(const Button butt return InputManager::BTN_BACK; } case Button::Confirm: - switch (layout) { + switch (frontLayout) { case CrossPointSettings::LEFT_RIGHT_BACK_CONFIRM: return InputManager::BTN_RIGHT; case CrossPointSettings::BACK_CONFIRM_LEFT_RIGHT: @@ -21,7 +22,7 @@ decltype(InputManager::BTN_BACK) MappedInputManager::mapButton(const Button butt return InputManager::BTN_CONFIRM; } case Button::Left: - switch (layout) { + switch (frontLayout) { case CrossPointSettings::LEFT_RIGHT_BACK_CONFIRM: return InputManager::BTN_BACK; case CrossPointSettings::BACK_CONFIRM_LEFT_RIGHT: @@ -29,7 +30,7 @@ decltype(InputManager::BTN_BACK) MappedInputManager::mapButton(const Button butt return InputManager::BTN_LEFT; } case Button::Right: - switch (layout) { + switch (frontLayout) { case CrossPointSettings::LEFT_RIGHT_BACK_CONFIRM: return InputManager::BTN_CONFIRM; case CrossPointSettings::BACK_CONFIRM_LEFT_RIGHT: @@ -43,9 +44,21 @@ decltype(InputManager::BTN_BACK) MappedInputManager::mapButton(const Button butt case Button::Power: return InputManager::BTN_POWER; case Button::PageBack: - return InputManager::BTN_UP; + switch (sideLayout) { + case CrossPointSettings::NEXT_PREV: + return InputManager::BTN_DOWN; + case CrossPointSettings::PREV_NEXT: + default: + return InputManager::BTN_UP; + } case Button::PageForward: - return InputManager::BTN_DOWN; + switch (sideLayout) { + case CrossPointSettings::NEXT_PREV: + return InputManager::BTN_UP; + case CrossPointSettings::PREV_NEXT: + default: + return InputManager::BTN_DOWN; + } } return InputManager::BTN_BACK; diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index 0ddf409..409ee39 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -9,7 +9,7 @@ // Define the static settings list namespace { -constexpr int settingsCount = 7; +constexpr int settingsCount = 8; const SettingInfo settingsList[settingsCount] = { // Should match with SLEEP_SCREEN_MODE {"Sleep Screen", SettingType::ENUM, &CrossPointSettings::sleepScreen, {"Dark", "Light", "Custom", "Cover"}}, @@ -24,6 +24,10 @@ const SettingInfo settingsList[settingsCount] = { SettingType::ENUM, &CrossPointSettings::frontButtonLayout, {"Bck, Cnfrm, Lft, Rght", "Lft, Rght, Bck, Cnfrm"}}, + {"Side Button Layout (reader)", + SettingType::ENUM, + &CrossPointSettings::sideButtonLayout, + {"Prev, Next", "Next, Prev"}}, {"Check for updates", SettingType::ACTION, nullptr, {}}, }; } // namespace