️ Revert encoder changes

Reverts #26501
This commit is contained in:
Scott Lahteine 2024-01-10 18:25:17 -06:00
parent ef92b6c369
commit 0f43ac79f6

View file

@ -67,8 +67,6 @@ MarlinUI ui;
constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
#define BLOCK_CLICK_AFTER_MOVEMENT_MS 100
#if HAS_STATUS_MESSAGE #if HAS_STATUS_MESSAGE
#if ENABLED(STATUS_MESSAGE_SCROLLING) && ANY(HAS_WIRED_LCD, DWIN_LCD_PROUI) #if ENABLED(STATUS_MESSAGE_SCROLLING) && ANY(HAS_WIRED_LCD, DWIN_LCD_PROUI)
uint8_t MarlinUI::status_scroll_offset; // = 0 uint8_t MarlinUI::status_scroll_offset; // = 0
@ -942,7 +940,6 @@ void MarlinUI::init() {
void MarlinUI::update() { void MarlinUI::update() {
static uint16_t max_display_update_time = 0; static uint16_t max_display_update_time = 0;
static millis_t next_encoder_enable_ms = 0;
const millis_t ms = millis(); const millis_t ms = millis();
#if LED_POWEROFF_TIMEOUT > 0 #if LED_POWEROFF_TIMEOUT > 0
@ -993,12 +990,7 @@ void MarlinUI::init() {
if (!touch_buttons) { if (!touch_buttons) {
// Integrated LCD click handling via button_pressed // Integrated LCD click handling via button_pressed
if (!external_control && button_pressed()) { if (!external_control && button_pressed()) {
if (!wait_for_unclick) { if (!wait_for_unclick) do_click(); // Handle the click
if (ELAPSED(ms, next_encoder_enable_ms))
do_click(); // Handle the click
else
wait_for_unclick = true;
}
} }
else else
wait_for_unclick = false; wait_for_unclick = false;
@ -1035,16 +1027,25 @@ void MarlinUI::init() {
uint8_t abs_diff = ABS(encoderDiff); uint8_t abs_diff = ABS(encoderDiff);
#if ENCODER_PULSES_PER_STEP > 1 #if ENCODER_PULSES_PER_STEP > 1
#if HAS_TOUCH_SLEEP // When reversing the encoder direction, a movement step can be missed because
// encoderDiff has a non-zero residual value, making the controller unresponsive.
// The fix clears the residual value when the encoder is idle.
// Also check if past half the threshold to compensate for missed single steps.
static int8_t lastEncoderDiff; static int8_t lastEncoderDiff;
if (lastEncoderDiff != encoderDiff) {
wakeup_screen(); // Timeout? No decoder change since last check. 10 or 20 times per second.
lastEncoderDiff = encoderDiff; if (encoderDiff == lastEncoderDiff && abs_diff <= epps / 2) // Same direction & size but not over a half-step?
encoderDiff = 0; // Clear residual pulses.
else if (WITHIN(abs_diff, epps / 2 + 1, epps - 1)) { // Past half of threshold?
abs_diff = epps; // Treat as a full step size
encoderDiff = (encoderDiff < 0 ? -1 : 1) * abs_diff; // ...in the spin direction.
} }
#endif TERN_(HAS_TOUCH_SLEEP, if (lastEncoderDiff != encoderDiff) wakeup_screen());
lastEncoderDiff = encoderDiff;
#endif #endif
const bool encoderPastThreshold = (abs_diff >= epps); const bool encoderPastThreshold = (abs_diff >= epps);
if (encoderPastThreshold || lcd_clicked) {
if (encoderPastThreshold && TERN1(IS_TFTGLCD_PANEL, !external_control)) { if (encoderPastThreshold && TERN1(IS_TFTGLCD_PANEL, !external_control)) {
#if ALL(HAS_MARLINUI_MENU, ENCODER_RATE_MULTIPLIER) #if ALL(HAS_MARLINUI_MENU, ENCODER_RATE_MULTIPLIER)
@ -1052,8 +1053,9 @@ void MarlinUI::init() {
int32_t encoderMultiplier = 1; int32_t encoderMultiplier = 1;
if (encoderRateMultiplierEnabled) { if (encoderRateMultiplierEnabled) {
if (lastEncoderMovementMillis) {
const float encoderMovementSteps = float(abs_diff) / epps; const float encoderMovementSteps = float(abs_diff) / epps;
if (lastEncoderMovementMillis) {
// Note that the rate is always calculated between two passes through the // Note that the rate is always calculated between two passes through the
// loop and that the abs of the encoderDiff value is tracked. // loop and that the abs of the encoderDiff value is tracked.
const float encoderStepRate = encoderMovementSteps / float(ms - lastEncoderMovementMillis) * 1000; const float encoderStepRate = encoderMovementSteps / float(ms - lastEncoderMovementMillis) * 1000;
@ -1082,26 +1084,11 @@ void MarlinUI::init() {
#endif // ENCODER_RATE_MULTIPLIER #endif // ENCODER_RATE_MULTIPLIER
int8_t fullSteps = encoderDiff / epps; if (can_encode()) encoderPosition += (encoderDiff * encoderMultiplier) / epps;
if (fullSteps != 0) {
#if ENABLED(ENCODER_RATE_MULTIPLIER) encoderDiff = 0;
static bool lastFwd;
const bool fwd = fullSteps > 0;
if (encoderMultiplier != 1 && fwd != lastFwd)
fullSteps *= -1; // Fast move and direction changed? Assume glitch.
else
lastFwd = fwd; // Slow move or lastFwd==fwd already. Remember dir.
#endif
next_encoder_enable_ms = ms + BLOCK_CLICK_AFTER_MOVEMENT_MS;
encoderDiff -= fullSteps * epps;
if (can_encode() && !lcd_clicked)
encoderPosition += (fullSteps * encoderMultiplier);
}
} }
if (encoderPastThreshold || lcd_clicked) {
reset_status_timeout(ms); reset_status_timeout(ms);
#if HAS_BACKLIGHT_TIMEOUT #if HAS_BACKLIGHT_TIMEOUT
@ -1115,7 +1102,7 @@ void MarlinUI::init() {
#if LED_POWEROFF_TIMEOUT > 0 #if LED_POWEROFF_TIMEOUT > 0
if (!powerManager.psu_on) leds.reset_timeout(ms); if (!powerManager.psu_on) leds.reset_timeout(ms);
#endif #endif
} } // encoder activity
#endif // HAS_ENCODER_ACTION #endif // HAS_ENCODER_ACTION
@ -1413,10 +1400,9 @@ void MarlinUI::init() {
#if HAS_ENCODER_WHEEL #if HAS_ENCODER_WHEEL
static uint8_t lastEncoderBits; static uint8_t lastEncoderBits;
bool ignore = false;
// Manage encoder rotation // Manage encoder rotation
#define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: encoderDiff += encoderDirection; break; case _E2: encoderDiff -= encoderDirection; break; default: ignore = true; } #define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: encoderDiff += encoderDirection; break; case _E2: encoderDiff -= encoderDirection; }
uint8_t enc = 0; uint8_t enc = 0;
if (buttons & EN_A) enc |= B01; if (buttons & EN_A) enc |= B01;
@ -1431,7 +1417,7 @@ void MarlinUI::init() {
#if ALL(HAS_MARLINUI_MENU, AUTO_BED_LEVELING_UBL) #if ALL(HAS_MARLINUI_MENU, AUTO_BED_LEVELING_UBL)
external_encoder(); external_encoder();
#endif #endif
if (!ignore) lastEncoderBits = enc; lastEncoderBits = enc;
} }
#endif // HAS_ENCODER_WHEEL #endif // HAS_ENCODER_WHEEL