menu overflow implemented and other improvements

This commit is contained in:
2021-08-11 19:58:48 +02:00
parent 4a562d4e48
commit 518c4d075d
7 changed files with 65 additions and 20 deletions

View File

@@ -1,8 +1,9 @@
#pragma once #pragma once
// Arduino includes // system includes
#include <Arduino.h> #include <optional>
// 3rdparty lib includes
#include <espchrono.h> #include <espchrono.h>
// local includes // local includes
@@ -18,14 +19,64 @@ bool confirmButtonLongPressed{};
bool backButtonPressed{}; bool backButtonPressed{};
bool backButtonLongPressed{}; bool backButtonLongPressed{};
std::optional<espchrono::millis_clock::time_point> upPressedSince;
int upPressRepeat{};
std::optional<espchrono::millis_clock::time_point> downPressedSince;
int downPressRepeat{};
class InputDispatcher class InputDispatcher
{ {
public: public:
static void update()
{
if (upPressedSince && espchrono::ago(*upPressedSince) > (upPressRepeat > 3 ? 100ms : 500ms))
{
upPressedSince = espchrono::millis_clock::now();
upPressRepeat++;
rotated -= 1;
}
if (downPressedSince && espchrono::ago(*downPressedSince) > (downPressRepeat > 3 ? 100ms : 500ms))
{
downPressedSince = espchrono::millis_clock::now();
downPressRepeat++;
rotated += 1;
}
}
static void rotate(int offset) static void rotate(int offset)
{ {
rotated += offset; rotated += offset;
} }
static void upButton(bool pressed)
{
if (pressed)
{
upPressedSince = espchrono::millis_clock::now();
upPressRepeat = 0;
rotated -= 1;
}
else
{
upPressedSince = std::nullopt;
}
}
static void downButton(bool pressed)
{
if (pressed)
{
downPressedSince = espchrono::millis_clock::now();
downPressRepeat = 0;
rotated += 1;
}
else
{
downPressedSince = std::nullopt;
}
}
static void confirmButton(bool pressed) static void confirmButton(bool pressed)
{ {
static espchrono::millis_clock::time_point pressBegin{}; static espchrono::millis_clock::time_point pressBegin{};

View File

@@ -177,12 +177,10 @@ bool parseBoardcomputerCanMessage(const twai_message_t &message)
}; };
if (lastButtonsState.up != newState.up) if (lastButtonsState.up != newState.up)
if (newState.up) InputDispatcher::upButton(newState.up);
InputDispatcher::rotate(-1);
if (lastButtonsState.down != newState.down) if (lastButtonsState.down != newState.down)
if (newState.down) InputDispatcher::downButton(newState.down);
InputDispatcher::rotate(1);
if (lastButtonsState.confirm != newState.confirm) if (lastButtonsState.confirm != newState.confirm)
InputDispatcher::confirmButton(newState.confirm); InputDispatcher::confirmButton(newState.confirm);

View File

@@ -67,15 +67,13 @@ void update()
if (std::get<ButtonUp>(lastState) != std::get<ButtonUp>(state) && now-debounceUp > settings.boardcomputerHardware.dpadDebounce) if (std::get<ButtonUp>(lastState) != std::get<ButtonUp>(state) && now-debounceUp > settings.boardcomputerHardware.dpadDebounce)
{ {
if (std::get<ButtonUp>(state)) InputDispatcher::upButton(std::get<ButtonUp>(state));
InputDispatcher::rotate(-1);
std::get<ButtonUp>(lastState) = std::get<ButtonUp>(state); std::get<ButtonUp>(lastState) = std::get<ButtonUp>(state);
debounceUp = now; debounceUp = now;
} }
if (std::get<ButtonDown>(lastState) != std::get<ButtonDown>(state) && now-debounceDown > settings.boardcomputerHardware.dpadDebounce) if (std::get<ButtonDown>(lastState) != std::get<ButtonDown>(state) && now-debounceDown > settings.boardcomputerHardware.dpadDebounce)
{ {
if (std::get<ButtonDown>(state)) InputDispatcher::downButton(std::get<ButtonDown>(state));
InputDispatcher::rotate(1);
std::get<ButtonDown>(lastState) = std::get<ButtonDown>(state); std::get<ButtonDown>(lastState) = std::get<ButtonDown>(state);
debounceDown = now; debounceDown = now;
} }

View File

@@ -81,15 +81,13 @@ void update()
if (std::get<ButtonUp>(lastState) != std::get<ButtonUp>(state) && now-debounceUp > settings.boardcomputerHardware.dpadDebounce) if (std::get<ButtonUp>(lastState) != std::get<ButtonUp>(state) && now-debounceUp > settings.boardcomputerHardware.dpadDebounce)
{ {
if (std::get<ButtonUp>(state)) InputDispatcher::upButton(std::get<ButtonUp>(state));
InputDispatcher::rotate(-1);
std::get<ButtonUp>(lastState) = std::get<ButtonUp>(state); std::get<ButtonUp>(lastState) = std::get<ButtonUp>(state);
debounceUp = now; debounceUp = now;
} }
if (std::get<ButtonDown>(lastState) != std::get<ButtonDown>(state) && now-debounceDown > settings.boardcomputerHardware.dpadDebounce) if (std::get<ButtonDown>(lastState) != std::get<ButtonDown>(state) && now-debounceDown > settings.boardcomputerHardware.dpadDebounce)
{ {
if (std::get<ButtonDown>(state)) InputDispatcher::downButton(std::get<ButtonDown>(state));
InputDispatcher::rotate(1);
std::get<ButtonDown>(lastState) = std::get<ButtonDown>(state); std::get<ButtonDown>(lastState) = std::get<ButtonDown>(state);
debounceDown = now; debounceDown = now;
} }

View File

@@ -122,15 +122,13 @@ void update()
if (lastState.up != newState.up && now - debounceUp > dpadDebounce) if (lastState.up != newState.up && now - debounceUp > dpadDebounce)
{ {
if (newState.up) InputDispatcher::upButton(newState.up);
InputDispatcher::rotate(-1);
debounceUp = now; debounceUp = now;
} }
if (lastState.down != newState.down && now - debounceDown > dpadDebounce) if (lastState.down != newState.down && now - debounceDown > dpadDebounce)
{ {
if (newState.down) InputDispatcher::downButton(newState.down);
InputDispatcher::rotate(1);
debounceDown = now; debounceDown = now;
} }

View File

@@ -318,6 +318,8 @@ extern "C" void app_main()
lastWifiUpdate = now; lastWifiUpdate = now;
} }
InputDispatcher::update();
#ifdef FEATURE_DPAD #ifdef FEATURE_DPAD
dpad::update(); dpad::update();
#endif #endif

View File

@@ -168,9 +168,9 @@ void MenuDisplay::update()
m_selectedIndex = m_selectedIndex + offset; m_selectedIndex = m_selectedIndex + offset;
if (m_selectedIndex < 0) if (m_selectedIndex < 0)
m_selectedIndex = 0; m_selectedIndex += itemCount;
if (m_selectedIndex >= itemCount) if (m_selectedIndex >= itemCount)
m_selectedIndex = itemCount - 1; m_selectedIndex -= itemCount;
if (m_selectedIndex < m_scrollOffset) if (m_selectedIndex < m_scrollOffset)
m_scrollOffset = m_selectedIndex; m_scrollOffset = m_selectedIndex;