From 06a90d4b045b7566dc7d622997f8d5f23b847c15 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Wed, 15 Jun 2022 19:28:02 +0200 Subject: [PATCH] MultiPurposeButton now uses a timer to time the long and short press --- software/main/include/helper.h | 10 +++++----- software/main/src/helper.cpp | 35 ++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/software/main/include/helper.h b/software/main/include/helper.h index 2d07709..4ec3608 100644 --- a/software/main/include/helper.h +++ b/software/main/include/helper.h @@ -8,15 +8,15 @@ const char* connection_state_to_str(esp_a2d_connection_state_t state); class MultiPurposeButton { public: - MultiPurposeButton(void(*short_press)(), void(*long_press)(), uint8_t threshold = 5); + MultiPurposeButton(void(*short_press)(), void(*long_press)(), uint16_t threshold = 500); void tick(bool current); private: - void(*short_press)(); - void(*long_press)(); - uint8_t threshold = 5; + void(* const short_press)(); + void(* const long_press)(); + const int16_t threshold = 500; + uint64_t start = 0; bool previous = false; - uint8_t counter = 0; bool acted = false; }; diff --git a/software/main/src/helper.cpp b/software/main/src/helper.cpp index 66b6e3b..dc12329 100644 --- a/software/main/src/helper.cpp +++ b/software/main/src/helper.cpp @@ -1,4 +1,5 @@ #include "esp_log.h" +#include "esp_timer.h" #include "helper.h" @@ -13,34 +14,36 @@ const char* connection_state_to_str(esp_a2d_connection_state_t state) { return states[state]; } -MultiPurposeButton::MultiPurposeButton(void(*short_press)(), void(*long_press)(), uint8_t threshold) : short_press(short_press), long_press(long_press), threshold(threshold) {} +MultiPurposeButton::MultiPurposeButton(void(*short_press)(), void(*long_press)(), uint16_t threshold) : short_press(short_press), long_press(long_press), threshold(threshold) {} // @TOOD Use a timer instead of amount of updates as this can be inconsistent (e.g. when in eco mode) void MultiPurposeButton::tick(bool current) { - if (current && !acted) { - if (counter >= threshold) { - // Long press - if (long_press) { - ESP_LOGI("MPB", "Long press!"); - long_press(); - } - acted = true; - } - - counter++; + if (current != previous && current) { + // Button just got presset + start = esp_timer_get_time(); } else if (previous != current && !current) { // The button just got released - - // Short press - if (counter < threshold) { + // Check for short press + if (esp_timer_get_time() - start < threshold) { if (short_press) { ESP_LOGI("MPB", "Short press!"); short_press(); } } - counter = 0; acted = false; + } else if (current && !acted) { + // Button is still being pressed + // Check if we exceed the timer for a long press + if (esp_timer_get_time() >= threshold) { + if (long_press) { + ESP_LOGI("MPB", "Long press!"); + long_press(); + } + + // Make sure we only execute the long press once + acted = true; + } } previous = current;