lcd encoder: use lookup table

Also handle the scenario where the encoder moves two steps in a single lcd_buttons_update cycle.

Flash: -46B
SRAM: 0B
This commit is contained in:
Alex Voinea 2023-04-23 23:21:24 +02:00
parent ea101f49d4
commit 32e68c33b4
No known key found for this signature in database
GPG Key ID: 37EDFD565CB33BAD
2 changed files with 16 additions and 22 deletions

View File

@ -751,7 +751,6 @@ void lcd_buttons_update(void)
{ {
static uint8_t lcd_long_press_active = 0; static uint8_t lcd_long_press_active = 0;
static uint8_t lcd_button_pressed = 0; static uint8_t lcd_button_pressed = 0;
static uint8_t lcd_encoder_bits = 0;
if (READ(BTN_ENC) == 0) if (READ(BTN_ENC) == 0)
{ //button is pressed { //button is pressed
if (buttonBlanking.expired_cont(BUTTON_BLANKING_TIME)) { if (buttonBlanking.expired_cont(BUTTON_BLANKING_TIME)) {
@ -784,24 +783,27 @@ void lcd_buttons_update(void)
} }
//manage encoder rotation //manage encoder rotation
#define ENCODER_SPIN(_E1, _E2) switch (lcd_encoder_bits) { case _E1: lcd_encoder_diff++; break; case _E2: lcd_encoder_diff--; } static const int8_t encrot_table[] PROGMEM = {
uint8_t enc = 0; 0, -1, 1, 2,
if (READ(BTN_EN1) == 0) enc |= B01; 1, 0, 2, -1,
if (READ(BTN_EN2) == 0) enc |= B10; -1, 2, 0, 1,
if (enc != lcd_encoder_bits) 2, 1, -1, 0,
};
static uint8_t enc_bits_old = 0;
uint8_t enc_bits = 0;
if (!READ(BTN_EN1)) enc_bits |= _BV(0);
if (!READ(BTN_EN2)) enc_bits |= _BV(1);
if (enc_bits != enc_bits_old)
{ {
switch (enc) int8_t newDiff = pgm_read_byte(&encrot_table[(enc_bits_old << 2) | enc_bits]);
{ lcd_encoder_diff += newDiff;
case encrot0: ENCODER_SPIN(encrot3, encrot1); break;
case encrot1: ENCODER_SPIN(encrot0, encrot2); break;
case encrot2: ENCODER_SPIN(encrot1, encrot3); break;
case encrot3: ENCODER_SPIN(encrot2, encrot0); break;
}
if (abs(lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) { if (abs(lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) {
lcd_backlight_wake_trigger = true; // flag event, knob rotated lcd_backlight_wake_trigger = true; // flag event, knob rotated
} }
lcd_encoder_bits = enc; enc_bits_old = enc_bits;
} }
} }

View File

@ -168,14 +168,6 @@ private:
//! @retval 1 button was clicked //! @retval 1 button was clicked
#define LCD_CLICKED (lcd_click_trigger) #define LCD_CLICKED (lcd_click_trigger)
// Setup Rotary Encoder Bit Values (for two pin encoders to indicate movement)
// These values are independent of which pins are used for EN_A and EN_B indications
// The rotary encoder part is also independent to the chipset used for the LCD
#define encrot0 0
#define encrot1 2
#define encrot2 3
#define encrot3 1
//////////////////////////////////// ////////////////////////////////////
//Custom characters defined in the first 8 characters of the LCD //Custom characters defined in the first 8 characters of the LCD