Peripherals: Better button logic
Some checks failed
continuous-integration/drone/push Build is passing
gitea/skullc-peripherals/pipeline/head There was a failure building this commit

Long press is now registered while the button is still held down
This commit is contained in:
Erki 2022-11-04 00:17:25 +02:00
parent d3b85b7f6c
commit a0639ec3f1

View File

@ -42,19 +42,24 @@ public:
const bool is_pressed = sw.read(); const bool is_pressed = sw.read();
ButtonPress new_state = ButtonPress::NOT_PRESSED; ButtonPress new_state = ButtonPress::NOT_PRESSED;
const std::uint32_t time_held = hal::getMillis() - time_pressed_down_;
if (is_pressed && !was_pressed_) if (is_pressed && !was_pressed_)
{ {
time_pressed_down_ = hal::getMillis(); time_pressed_down_ = hal::getMillis();
} else if (!is_pressed && was_pressed_) }
else if (!is_pressed && was_pressed_)
{ {
const std::uint32_t time_held = hal::getMillis() - time_pressed_down_; if (time_held > TIMEOUT_SHORT_PRESS)
if (time_held > TIMEOUT_LONG_PRESS)
new_state = ButtonPress::LONG_PRESS;
else if (time_held > TIMEOUT_SHORT_PRESS)
new_state = ButtonPress::SHORT_PRESS; new_state = ButtonPress::SHORT_PRESS;
time_pressed_down_ = 0; time_pressed_down_ = 0;
} }
else if (is_pressed && was_pressed_)
{
if (current_state_ == ButtonPress::NOT_PRESSED && time_held > TIMEOUT_LONG_PRESS)
new_state = ButtonPress::LONG_PRESS;
}
was_pressed_ = is_pressed; was_pressed_ = is_pressed;
current_state_ = new_state; current_state_ = new_state;