From c037e6dfba6351cc5cae7e01259d6fa93d8c0acb Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 23 Apr 2023 09:58:56 +0200 Subject: [PATCH] Use atomic block for accessing lcd_encoder_diff There was still the possibility of lcd_encoder_diff being updated from the ISR while the new enc_diff was being computed. Flash: +8B SRAM: 0B --- Firmware/lcd.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Firmware/lcd.cpp b/Firmware/lcd.cpp index 0e042e322..d02e09bbc 100644 --- a/Firmware/lcd.cpp +++ b/Firmware/lcd.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "Timer.h" @@ -684,15 +685,15 @@ void lcd_knob_update() { if (lcd_backlight_wake_trigger) { lcd_backlight_wake_trigger = false; backlight_wake(); - int8_t enc_diff = lcd_encoder_diff; - if (abs(enc_diff) >= ENCODER_PULSES_PER_STEP) { - lcd_encoder += enc_diff / ENCODER_PULSES_PER_STEP; - enc_diff %= ENCODER_PULSES_PER_STEP; - lcd_encoder_diff = enc_diff; - 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; + } } + Sound_MakeSound(did_rotate ? e_SOUND_TYPE_EncoderMove : e_SOUND_TYPE_ButtonEcho); if (lcd_draw_update == 0) { // Update LCD rendering at minimum