From f8969605e8a025d1c907b0f2bdbd9b04869a4a49 Mon Sep 17 00:00:00 2001 From: Maurice Makaay Date: Tue, 7 Jun 2022 01:36:54 +0200 Subject: [PATCH] Suppress first rotary encoder event (#3532) Co-authored-by: Maurice Makaay --- esphome/components/rotary_encoder/rotary_encoder.cpp | 3 ++- esphome/components/rotary_encoder/rotary_encoder.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/esphome/components/rotary_encoder/rotary_encoder.cpp b/esphome/components/rotary_encoder/rotary_encoder.cpp index c5e9cec596..7440214b1c 100644 --- a/esphome/components/rotary_encoder/rotary_encoder.cpp +++ b/esphome/components/rotary_encoder/rotary_encoder.cpp @@ -103,7 +103,7 @@ void IRAM_ATTR HOT RotaryEncoderSensorStore::gpio_intr(RotaryEncoderSensorStore rotation_dir = -1; } - if (rotation_dir != 0) { + if (rotation_dir != 0 && !arg->first_read) { auto *first_zero = std::find(arg->rotation_events.begin(), arg->rotation_events.end(), 0); // find first zero if (first_zero == arg->rotation_events.begin() // are we at the start (first event this loop iteration) || std::signbit(*std::prev(first_zero)) != @@ -119,6 +119,7 @@ void IRAM_ATTR HOT RotaryEncoderSensorStore::gpio_intr(RotaryEncoderSensorStore *std::prev(first_zero) += rotation_dir; // store the rotation into the previous slot } } + arg->first_read = false; arg->state = new_state; } diff --git a/esphome/components/rotary_encoder/rotary_encoder.h b/esphome/components/rotary_encoder/rotary_encoder.h index a69d738fa8..deba3d952d 100644 --- a/esphome/components/rotary_encoder/rotary_encoder.h +++ b/esphome/components/rotary_encoder/rotary_encoder.h @@ -34,6 +34,7 @@ struct RotaryEncoderSensorStore { int32_t max_value{INT32_MAX}; int32_t last_read{0}; uint8_t state{0}; + bool first_read{true}; std::array rotation_events{}; bool rotation_events_overflow{false};