diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index 2fe042588..b1b15176d 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "Timer.h" @@ -684,13 +685,20 @@ void lcd_knob_update() { if (lcd_backlight_wake_trigger) { lcd_backlight_wake_trigger = false; backlight_wake(); - if (abs(lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) { - lcd_encoder += lcd_encoder_diff / ENCODER_PULSES_PER_STEP; - lcd_encoder_diff = 0; - Sound_MakeSound(e_SOUND_TYPE_EncoderMove); - } else { - Sound_MakeSound(e_SOUND_TYPE_ButtonEcho); + bool did_rotate = false; + ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { + if (abs(lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) { + lcd_encoder += lcd_encoder_diff / ENCODER_PULSES_PER_STEP; + lcd_encoder_diff %= ENCODER_PULSES_PER_STEP; + did_rotate = true; + } + else { + // Get lcd_encoder_diff in sync with the encoder hard steps. + // We assume that a click happens only when the knob is rotated into a stable position + lcd_encoder_diff = 0; + } } + Sound_MakeSound(did_rotate ? e_SOUND_TYPE_EncoderMove : e_SOUND_TYPE_ButtonEcho); if (lcd_draw_update == 0) { // Update LCD rendering at minimum