mirror of
https://github.com/daveallie/crosspoint-reader.git
synced 2026-02-04 14:47:37 +03:00
feat: ButtonNavigator class
This commit is contained in:
parent
da4d3b5ea5
commit
727186f208
@ -25,6 +25,7 @@
|
|||||||
#include "activities/settings/SettingsActivity.h"
|
#include "activities/settings/SettingsActivity.h"
|
||||||
#include "activities/util/FullScreenMessageActivity.h"
|
#include "activities/util/FullScreenMessageActivity.h"
|
||||||
#include "fontIds.h"
|
#include "fontIds.h"
|
||||||
|
#include "util/ButtonNavigator.h"
|
||||||
|
|
||||||
HalDisplay display;
|
HalDisplay display;
|
||||||
HalGPIO gpio;
|
HalGPIO gpio;
|
||||||
@ -293,6 +294,7 @@ void setup() {
|
|||||||
|
|
||||||
SETTINGS.loadFromFile();
|
SETTINGS.loadFromFile();
|
||||||
KOREADER_STORE.loadFromFile();
|
KOREADER_STORE.loadFromFile();
|
||||||
|
ButtonNavigator::setMappedInputManager(mappedInputManager);
|
||||||
|
|
||||||
if (gpio.isWakeupByPowerButton()) {
|
if (gpio.isWakeupByPowerButton()) {
|
||||||
// For normal wakeups, verify power button press duration
|
// For normal wakeups, verify power button press duration
|
||||||
|
|||||||
85
src/util/ButtonNavigator.cpp
Normal file
85
src/util/ButtonNavigator.cpp
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#include "ButtonNavigator.h"
|
||||||
|
|
||||||
|
const MappedInputManager* ButtonNavigator::mappedInput = nullptr;
|
||||||
|
|
||||||
|
void ButtonNavigator::onNext(const Callback& callback) {
|
||||||
|
onNextPress(callback);
|
||||||
|
onNextContinuous(callback);
|
||||||
|
}
|
||||||
|
void ButtonNavigator::onPrevious(const Callback& callback) {
|
||||||
|
onPreviousPress(callback);
|
||||||
|
onPreviousContinuous(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ButtonNavigator::onNextPress(const Callback& callback) { onPress(getNextButtons(), callback); }
|
||||||
|
|
||||||
|
void ButtonNavigator::onPreviousPress(const Callback& callback) { onPress(getPreviousButtons(), callback); }
|
||||||
|
|
||||||
|
void ButtonNavigator::onNextContinuous(const Callback& callback) { onContinuous(getNextButtons(), callback); }
|
||||||
|
|
||||||
|
void ButtonNavigator::onPreviousContinuous(const Callback& callback) { onContinuous(getPreviousButtons(), callback); }
|
||||||
|
|
||||||
|
void ButtonNavigator::onPress(const Buttons& buttons, const Callback& callback) {
|
||||||
|
if (!mappedInput) return;
|
||||||
|
|
||||||
|
bool buttonPressed = false;
|
||||||
|
for (const MappedInputManager::Button button : buttons) {
|
||||||
|
if (mappedInput->wasPressed(button)) {
|
||||||
|
buttonPressed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buttonPressed && !recentlyNavigatedContinuously()) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ButtonNavigator::onContinuous(const Buttons& buttons, const Callback& callback) {
|
||||||
|
if (!mappedInput) return;
|
||||||
|
|
||||||
|
bool buttonPressed = false;
|
||||||
|
for (const MappedInputManager::Button button : buttons) {
|
||||||
|
if (mappedInput->isPressed(button)) {
|
||||||
|
buttonPressed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buttonPressed && shouldNavigateContinuously()) {
|
||||||
|
callback();
|
||||||
|
lastContinuousNavTime = millis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ButtonNavigator::shouldNavigateContinuously() const {
|
||||||
|
if (!mappedInput) return false;
|
||||||
|
|
||||||
|
const bool buttonHeldLongEnough = mappedInput->getHeldTime() > continuousStartMs;
|
||||||
|
const bool navigationIntervalElapsed = (millis() - lastContinuousNavTime) > continuousIntervalMs;
|
||||||
|
|
||||||
|
return buttonHeldLongEnough && navigationIntervalElapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ButtonNavigator::recentlyNavigatedContinuously() const {
|
||||||
|
const int elapsedTime = millis() - lastContinuousNavTime;
|
||||||
|
if (elapsedTime < 50) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ButtonNavigator::nextIndex(const int currentIndex, const int totalItems) {
|
||||||
|
if (totalItems <= 0) return 0;
|
||||||
|
|
||||||
|
// Calculate the next index with wrap-around
|
||||||
|
return (currentIndex + 1) % totalItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ButtonNavigator::previousIndex(const int currentIndex, const int totalItems) {
|
||||||
|
if (totalItems <= 0) return 0;
|
||||||
|
|
||||||
|
// Calculate the previous index with wrap-around
|
||||||
|
return (currentIndex + totalItems - 1) % totalItems;
|
||||||
|
}
|
||||||
47
src/util/ButtonNavigator.h
Normal file
47
src/util/ButtonNavigator.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "MappedInputManager.h"
|
||||||
|
|
||||||
|
class ButtonNavigator final {
|
||||||
|
using Callback = std::function<void()>;
|
||||||
|
using Buttons = std::vector<MappedInputManager::Button>;
|
||||||
|
|
||||||
|
const uint16_t continuousStartMs;
|
||||||
|
const uint16_t continuousIntervalMs;
|
||||||
|
uint32_t lastContinuousNavTime = 0;
|
||||||
|
|
||||||
|
static const MappedInputManager* mappedInput;
|
||||||
|
|
||||||
|
[[nodiscard]] bool shouldNavigateContinuously() const;
|
||||||
|
[[nodiscard]] bool recentlyNavigatedContinuously() const;
|
||||||
|
|
||||||
|
[[nodiscard]] static Buttons getNextButtons() {
|
||||||
|
return {MappedInputManager::Button::Down, MappedInputManager::Button::Right};
|
||||||
|
}
|
||||||
|
[[nodiscard]] static Buttons getPreviousButtons() {
|
||||||
|
return {MappedInputManager::Button::Up, MappedInputManager::Button::Left};
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ButtonNavigator(const uint16_t continuousIntervalMs = 500, const uint16_t continuousStartMs = 500)
|
||||||
|
: continuousStartMs(continuousStartMs), continuousIntervalMs(continuousIntervalMs) {}
|
||||||
|
|
||||||
|
static void setMappedInputManager(const MappedInputManager& mappedInputManager) { mappedInput = &mappedInputManager; }
|
||||||
|
|
||||||
|
void onNext(const Callback& callback);
|
||||||
|
void onPrevious(const Callback& callback);
|
||||||
|
|
||||||
|
void onNextPress(const Callback& callback);
|
||||||
|
void onPreviousPress(const Callback& callback);
|
||||||
|
void onPress(const Buttons& buttons, const Callback& callback);
|
||||||
|
|
||||||
|
void onNextContinuous(const Callback& callback);
|
||||||
|
void onPreviousContinuous(const Callback& callback);
|
||||||
|
void onContinuous(const Buttons& buttons, const Callback& callback);
|
||||||
|
|
||||||
|
[[nodiscard]] static int nextIndex(int currentIndex, int totalItems);
|
||||||
|
[[nodiscard]] static int previousIndex(int currentIndex, int totalItems);
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue
Block a user