Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
3.9 kB · 109 lines
C++
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109#include "MappedInputManager.h"
#include "CrossPointSettings.h"
namespace {using ButtonIndex = uint8_t;
struct SideLayoutMap { ButtonIndex pageBack; ButtonIndex pageForward;};
// Order matches CrossPointSettings::SIDE_BUTTON_LAYOUT.constexpr SideLayoutMap kSideLayouts[] = { {HalGPIO::BTN_UP, HalGPIO::BTN_DOWN}, {HalGPIO::BTN_DOWN, HalGPIO::BTN_UP},};} // namespace
bool MappedInputManager::mapButton(const Button button, bool (HalGPIO::*fn)(uint8_t) const) const { const auto sideLayout = static_cast<CrossPointSettings::SIDE_BUTTON_LAYOUT>(SETTINGS.sideButtonLayout); const auto& side = kSideLayouts[sideLayout];
switch (button) { case Button::Back: // Logical Back maps to user-configured front button. return (gpio.*fn)(SETTINGS.frontButtonBack); case Button::Confirm: // Logical Confirm maps to user-configured front button. return (gpio.*fn)(SETTINGS.frontButtonConfirm); case Button::Left: // Logical Left maps to user-configured front button. return (gpio.*fn)(SETTINGS.frontButtonLeft); case Button::Right: // Logical Right maps to user-configured front button. return (gpio.*fn)(SETTINGS.frontButtonRight); case Button::Up: // Side buttons remain fixed for Up/Down. return (gpio.*fn)(HalGPIO::BTN_UP); case Button::Down: // Side buttons remain fixed for Up/Down. return (gpio.*fn)(HalGPIO::BTN_DOWN); case Button::Power: // Power button bypasses remapping. return (gpio.*fn)(HalGPIO::BTN_POWER); case Button::PageBack: // Reader page navigation uses side buttons and can be swapped via settings. return (gpio.*fn)(side.pageBack); case Button::PageForward: // Reader page navigation uses side buttons and can be swapped via settings. return (gpio.*fn)(side.pageForward); }
return false;}
bool MappedInputManager::wasPressed(const Button button) const { return mapButton(button, &HalGPIO::wasPressed); }
bool MappedInputManager::wasReleased(const Button button) const { return mapButton(button, &HalGPIO::wasReleased); }
bool MappedInputManager::isPressed(const Button button) const { return mapButton(button, &HalGPIO::isPressed); }
bool MappedInputManager::wasAnyPressed() const { return gpio.wasAnyPressed(); }
bool MappedInputManager::wasAnyReleased() const { return gpio.wasAnyReleased(); }
unsigned long MappedInputManager::getHeldTime() const { return gpio.getHeldTime(); }
MappedInputManager::Labels MappedInputManager::mapLabels(const char* back, const char* confirm, const char* previous, const char* next) const { // Build the label order based on the configured hardware mapping. auto labelForHardware = [&](uint8_t hw) -> const char* { // Compare against configured logical roles and return the matching label. if (hw == SETTINGS.frontButtonBack) { return back; } if (hw == SETTINGS.frontButtonConfirm) { return confirm; } if (hw == SETTINGS.frontButtonLeft) { return previous; } if (hw == SETTINGS.frontButtonRight) { return next; } return ""; };
return {labelForHardware(HalGPIO::BTN_BACK), labelForHardware(HalGPIO::BTN_CONFIRM), labelForHardware(HalGPIO::BTN_LEFT), labelForHardware(HalGPIO::BTN_RIGHT)};}
int MappedInputManager::getPressedFrontButton() const { // Scan the raw front buttons in hardware order. // This bypasses remapping so the remap activity can capture physical presses. if (gpio.wasPressed(HalGPIO::BTN_BACK)) { return HalGPIO::BTN_BACK; } if (gpio.wasPressed(HalGPIO::BTN_CONFIRM)) { return HalGPIO::BTN_CONFIRM; } if (gpio.wasPressed(HalGPIO::BTN_LEFT)) { return HalGPIO::BTN_LEFT; } if (gpio.wasPressed(HalGPIO::BTN_RIGHT)) { return HalGPIO::BTN_RIGHT; } return -1;}