diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
index 11b8761550d7b..14890bcd6ece0 100644
--- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
+++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
@@ -116,7 +116,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
#elif HAS_WIRED_LCD
#if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1)
#error "Serial port pins (1) conflict with Encoder Buttons!"
- #elif ANY_TX(1, SD_SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \
+ #elif ANY_TX(1, SD_SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK_PIN) \
|| ANY_RX(1, LCD_SDSS, LCD_PINS_RS, SD_MISO_PIN, DOGLCD_A0, SD_SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN)
#error "Serial port pins (1) conflict with LCD pins!"
#endif
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index 7ebb9168f6d15..2547425885f7f 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -1595,7 +1595,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
/**
* ULTIPANEL encoder
*/
-#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !defined(SHIFT_CLK)
+#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !PIN_EXISTS(SHIFT_CLK)
#error "ULTIPANEL controllers require some kind of encoder."
#endif
diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h
index eedcc4afa0739..c399b907e460c 100644
--- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h
+++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h
@@ -61,15 +61,12 @@ extern TFTGLCD lcd;
#include "../lcdprint.h"
// Use panel encoder - free old encoder pins
-#undef BTN_EN1
-#undef BTN_EN2
-#undef BTN_ENC
-#define BTN_EN1 -1
-#define BTN_EN2 -1
-#define BTN_ENC -1
+#undef BTN_EN1
+#undef BTN_EN2
+#undef BTN_ENC
#ifndef EN_C
- #define EN_C 4 //for click
+ #define EN_C 4 // for click
#endif
#endif // IS_TFTGLCD_PANEL
diff --git a/Marlin/src/lcd/buttons.h b/Marlin/src/lcd/buttons.h
new file mode 100644
index 0000000000000..07a4524def18d
--- /dev/null
+++ b/Marlin/src/lcd/buttons.h
@@ -0,0 +1,234 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "../inc/MarlinConfig.h"
+
+#if ((!HAS_ADC_BUTTONS && IS_NEWPANEL) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL
+ #define HAS_ENCODER_WHEEL 1
+#endif
+#if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT)
+ #define HAS_DIGITAL_BUTTONS 1
+#endif
+#if !HAS_ADC_BUTTONS && (IS_RRW_KEYPAD || (HAS_WIRED_LCD && !IS_NEWPANEL))
+ #define HAS_SHIFT_ENCODER 1
+#endif
+
+// I2C buttons must be read in the main thread
+#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL)
+ #define HAS_SLOW_BUTTONS 1
+#endif
+
+#if HAS_ENCODER_WHEEL
+ #define ENCODER_PHASE_0 0
+ #define ENCODER_PHASE_1 2
+ #define ENCODER_PHASE_2 3
+ #define ENCODER_PHASE_3 1
+#endif
+
+#if EITHER(HAS_DIGITAL_BUTTONS, DWIN_CREALITY_LCD)
+
+ // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes)
+ #define BLEN_A 0
+ #define BLEN_B 1
+
+ #define EN_A _BV(BLEN_A)
+ #define EN_B _BV(BLEN_B)
+
+ #define _BUTTON_PRESSED(BN) !READ(BTN_##BN)
+
+ #if BUTTON_EXISTS(ENC) || HAS_TOUCH_BUTTONS
+ #define BLEN_C 2
+ #define EN_C _BV(BLEN_C)
+ #endif
+
+ #if ENABLED(LCD_I2C_VIKI)
+
+ #include
+
+ #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
+
+ // button and encoder bit positions within 'buttons'
+ #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C
+ #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET)
+ #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET)
+ #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET)
+ #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET)
+
+ #if BUTTON_EXISTS(ENC) // The pause/stop/restart button is connected to BTN_ENC when used
+ #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name
+ #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented.
+ #else
+ #define BUTTON_CLICK() (buttons & (B_MI|B_RI))
+ #endif
+
+ // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update
+
+ #elif ENABLED(LCD_I2C_PANELOLU2)
+
+ #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin
+
+ #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
+
+ #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later
+
+ #define BUTTON_CLICK() (buttons & B_MI)
+
+ #endif
+
+ #endif
+
+#else
+
+ #undef BUTTON_EXISTS
+ #define BUTTON_EXISTS(...) false
+
+ // Dummy button, never pressed
+ #define _BUTTON_PRESSED(BN) false
+
+ // Shift register bits correspond to buttons:
+ #define BL_LE 7 // Left
+ #define BL_UP 6 // Up
+ #define BL_MI 5 // Middle
+ #define BL_DW 4 // Down
+ #define BL_RI 3 // Right
+ #define BL_ST 2 // Red Button
+ #define B_LE _BV(BL_LE)
+ #define B_UP _BV(BL_UP)
+ #define B_MI _BV(BL_MI)
+ #define B_DW _BV(BL_DW)
+ #define B_RI _BV(BL_RI)
+ #define B_ST _BV(BL_ST)
+
+ #ifndef BUTTON_CLICK
+ #define BUTTON_CLICK() (buttons & (B_MI|B_ST))
+ #endif
+
+#endif
+
+#if IS_RRW_KEYPAD
+ #define BTN_OFFSET 0 // Bit offset into buttons for shift register values
+
+ #define BLEN_KEYPAD_F3 0
+ #define BLEN_KEYPAD_F2 1
+ #define BLEN_KEYPAD_F1 2
+ #define BLEN_KEYPAD_DOWN 3
+ #define BLEN_KEYPAD_RIGHT 4
+ #define BLEN_KEYPAD_MIDDLE 5
+ #define BLEN_KEYPAD_UP 6
+ #define BLEN_KEYPAD_LEFT 7
+
+ #define EN_KEYPAD_F1 _BV(BTN_OFFSET + BLEN_KEYPAD_F1)
+ #define EN_KEYPAD_F2 _BV(BTN_OFFSET + BLEN_KEYPAD_F2)
+ #define EN_KEYPAD_F3 _BV(BTN_OFFSET + BLEN_KEYPAD_F3)
+ #define EN_KEYPAD_DOWN _BV(BTN_OFFSET + BLEN_KEYPAD_DOWN)
+ #define EN_KEYPAD_RIGHT _BV(BTN_OFFSET + BLEN_KEYPAD_RIGHT)
+ #define EN_KEYPAD_MIDDLE _BV(BTN_OFFSET + BLEN_KEYPAD_MIDDLE)
+ #define EN_KEYPAD_UP _BV(BTN_OFFSET + BLEN_KEYPAD_UP)
+ #define EN_KEYPAD_LEFT _BV(BTN_OFFSET + BLEN_KEYPAD_LEFT)
+
+ #define RRK(B) (keypad_buttons & (B))
+
+ #ifdef EN_C
+ #define BUTTON_CLICK() ((buttons & EN_C) || RRK(EN_KEYPAD_MIDDLE))
+ #else
+ #define BUTTON_CLICK() RRK(EN_KEYPAD_MIDDLE)
+ #endif
+#endif
+
+#ifndef EN_A
+ #define EN_A 0
+#endif
+#ifndef EN_B
+ #define EN_B 0
+#endif
+#ifndef EN_C
+ #define EN_C 0
+#endif
+#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_BUTTONS, IS_TFTGLCD_PANEL)
+ #define BLEN_D 3
+ #define EN_D _BV(BLEN_D)
+#else
+ #define EN_D 0
+#endif
+
+#define BUTTON_PRESSED(BN) (_BUTTON_PRESSED_##BN)
+
+#if BUTTON_EXISTS(EN1)
+ #define _BUTTON_PRESSED_EN1 _BUTTON_PRESSED(EN1)
+#else
+ #define _BUTTON_PRESSED_EN1 false
+#endif
+#if BUTTON_EXISTS(EN2)
+ #define _BUTTON_PRESSED_EN2 _BUTTON_PRESSED(EN2)
+#else
+ #define _BUTTON_PRESSED_EN2 false
+#endif
+#if BUTTON_EXISTS(ENC_EN)
+ #define _BUTTON_PRESSED_ENC_EN _BUTTON_PRESSED(ENC_EN)
+#else
+ #define _BUTTON_PRESSED_ENC_EN false
+#endif
+#if BUTTON_EXISTS(ENC)
+ #define _BUTTON_PRESSED_ENC _BUTTON_PRESSED(ENC)
+#else
+ #define _BUTTON_PRESSED_ENC false
+#endif
+#if BUTTON_EXISTS(UP)
+ #define _BUTTON_PRESSED_UP _BUTTON_PRESSED(UP)
+#else
+ #define _BUTTON_PRESSED_UP false
+#endif
+#if BUTTON_EXISTS(DWN)
+ #define _BUTTON_PRESSED_DWN _BUTTON_PRESSED(DWN)
+#else
+ #define _BUTTON_PRESSED_DWN false
+#endif
+#if BUTTON_EXISTS(LFT)
+ #define _BUTTON_PRESSED_LFT _BUTTON_PRESSED(LFT)
+#else
+ #define _BUTTON_PRESSED_LFT false
+#endif
+#if BUTTON_EXISTS(RT)
+ #define _BUTTON_PRESSED_RT _BUTTON_PRESSED(RT)
+#else
+ #define _BUTTON_PRESSED_RT false
+#endif
+#if BUTTON_EXISTS(BACK)
+ #define _BUTTON_PRESSED_BACK _BUTTON_PRESSED(BACK)
+#else
+ #define _BUTTON_PRESSED_BACK false
+#endif
+
+#ifndef BUTTON_CLICK
+ #if EN_C > 0
+ #define BUTTON_CLICK() (buttons & EN_C)
+ #else
+ #define BUTTON_CLICK() false
+ #endif
+#endif
+
+#if EN_D > 0
+ #define LCD_BACK_CLICKED() (buttons & EN_D)
+#else
+ #define LCD_BACK_CLICKED() false
+#endif
diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp
index d39c6cfbd5e89..6c229b7aca223 100644
--- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp
+++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp
@@ -33,6 +33,7 @@
#if ENABLED(DWIN_CREALITY_LCD)
#include "rotary_encoder.h"
+#include "../../buttons.h"
#include "../../../MarlinCore.h"
#include "../../../HAL/shared/Delay.h"
@@ -43,17 +44,23 @@
#include
+#ifndef ENCODER_PULSES_PER_STEP
+ #define ENCODER_PULSES_PER_STEP 4
+#endif
+
ENCODER_Rate EncoderRate;
// Buzzer
-void Encoder_tick(void) {
- WRITE(BEEPER_PIN, 1);
- delay(10);
- WRITE(BEEPER_PIN, 0);
+void Encoder_tick() {
+ #if PIN_EXISTS(BEEPER)
+ WRITE(BEEPER_PIN, HIGH);
+ delay(10);
+ WRITE(BEEPER_PIN, LOW);
+ #endif
}
// Encoder initialization
-void Encoder_Configuration(void) {
+void Encoder_Configuration() {
#if BUTTON_EXISTS(EN1)
SET_INPUT_PULLUP(BTN_EN1);
#endif
@@ -63,21 +70,21 @@ void Encoder_Configuration(void) {
#if BUTTON_EXISTS(ENC)
SET_INPUT_PULLUP(BTN_ENC);
#endif
- #ifdef BEEPER_PIN
+ #if PIN_EXISTS(BEEPER)
SET_OUTPUT(BEEPER_PIN);
#endif
}
// Analyze encoder value and return state
-ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
+ENCODER_DiffState Encoder_ReceiveAnalyze() {
const millis_t now = millis();
- static unsigned char lastEncoderBits;
- unsigned char newbutton = 0;
+ static uint8_t lastEncoderBits;
+ uint8_t newbutton = 0;
static signed char temp_diff = 0;
ENCODER_DiffState temp_diffState = ENCODER_DIFF_NO;
- if (BUTTON_PRESSED(EN1)) newbutton |= 0x01;
- if (BUTTON_PRESSED(EN2)) newbutton |= 0x02;
+ if (BUTTON_PRESSED(EN1)) newbutton |= EN_A;
+ if (BUTTON_PRESSED(EN2)) newbutton |= EN_B;
if (BUTTON_PRESSED(ENC)) {
static millis_t next_click_update_ms;
if (ELAPSED(now, next_click_update_ms)) {
@@ -94,22 +101,22 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
}
if (newbutton != lastEncoderBits) {
switch (newbutton) {
- case ENCODER_PHASE_0: {
- if (lastEncoderBits == ENCODER_PHASE_3) temp_diff++;
+ case ENCODER_PHASE_0:
+ if (lastEncoderBits == ENCODER_PHASE_3) temp_diff++;
else if (lastEncoderBits == ENCODER_PHASE_1) temp_diff--;
- }break;
- case ENCODER_PHASE_1: {
- if (lastEncoderBits == ENCODER_PHASE_0) temp_diff++;
+ break;
+ case ENCODER_PHASE_1:
+ if (lastEncoderBits == ENCODER_PHASE_0) temp_diff++;
else if (lastEncoderBits == ENCODER_PHASE_2) temp_diff--;
- }break;
- case ENCODER_PHASE_2: {
- if (lastEncoderBits == ENCODER_PHASE_1) temp_diff++;
+ break;
+ case ENCODER_PHASE_2:
+ if (lastEncoderBits == ENCODER_PHASE_1) temp_diff++;
else if (lastEncoderBits == ENCODER_PHASE_3) temp_diff--;
- }break;
- case ENCODER_PHASE_3: {
- if (lastEncoderBits == ENCODER_PHASE_2) temp_diff++;
+ break;
+ case ENCODER_PHASE_3:
+ if (lastEncoderBits == ENCODER_PHASE_2) temp_diff++;
else if (lastEncoderBits == ENCODER_PHASE_0) temp_diff--;
- }break;
+ break;
}
lastEncoderBits = newbutton;
}
@@ -137,9 +144,12 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
}
EncoderRate.lastEncoderTime = ms;
}
+
#else
+
constexpr int32_t encoderMultiplier = 1;
- #endif // ENCODER_RATE_MULTIPLIER
+
+ #endif
// EncoderRate.encoderMoveValue += (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP);
EncoderRate.encoderMoveValue = (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP);
@@ -153,23 +163,23 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
#if PIN_EXISTS(LCD_LED)
// Take the low 24 valid bits 24Bit: G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0
- unsigned int LED_DataArray[LED_NUM];
+ uint16_t LED_DataArray[LED_NUM];
// LED light operation
- void LED_Action(void) {
+ void LED_Action() {
LED_Control(RGB_SCALE_WARM_WHITE,0x0F);
delay(30);
LED_Control(RGB_SCALE_WARM_WHITE,0x00);
}
// LED initialization
- void LED_Configuration(void) {
+ void LED_Configuration() {
SET_OUTPUT(LCD_LED_PIN);
}
// LED write data
- void LED_WriteData(void) {
- unsigned char tempCounter_LED, tempCounter_Bit;
+ void LED_WriteData() {
+ uint8_t tempCounter_LED, tempCounter_Bit;
for (tempCounter_LED = 0; tempCounter_LED < LED_NUM; tempCounter_LED++) {
for (tempCounter_Bit = 0; tempCounter_Bit < 24; tempCounter_Bit++) {
if (LED_DataArray[tempCounter_LED] & (0x800000 >> tempCounter_Bit)) {
@@ -190,14 +200,13 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
// LED control
// RGB_Scale: RGB color ratio
// luminance: brightness (0~0xFF)
- void LED_Control(unsigned char RGB_Scale, unsigned char luminance) {
- unsigned char temp_Counter;
- for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) {
- LED_DataArray[temp_Counter] = 0;
+ void LED_Control(const uint8_t RGB_Scale, const uint8_t luminance) {
+ for (uint8_t i = 0; i < LED_NUM; i++) {
+ LED_DataArray[i] = 0;
switch (RGB_Scale) {
- case RGB_SCALE_R10_G7_B5: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*5/10; break;
- case RGB_SCALE_R10_G7_B4: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*4/10; break;
- case RGB_SCALE_R10_G8_B7: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*8/10) << 16 | luminance*7/10; break;
+ case RGB_SCALE_R10_G7_B5: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 7/10) << 16 | luminance * 5/10; break;
+ case RGB_SCALE_R10_G7_B4: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 7/10) << 16 | luminance * 4/10; break;
+ case RGB_SCALE_R10_G8_B7: LED_DataArray[i] = (luminance * 10/10) << 8 | (luminance * 8/10) << 16 | luminance * 7/10; break;
}
}
LED_WriteData();
@@ -207,45 +216,38 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void) {
// RGB_Scale: RGB color ratio
// luminance: brightness (0~0xFF)
// change_Time: gradient time (ms)
- void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval) {
- unsigned char temp_Counter;
- unsigned char LED_R_Data[LED_NUM], LED_G_Data[LED_NUM], LED_B_Data[LED_NUM];
- bool LED_R_Flag = 0, LED_G_Flag = 0, LED_B_Flag = 0;
-
- for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) {
+ void LED_GraduallyControl(const uint8_t RGB_Scale, const uint8_t luminance, const uint16_t change_Interval) {
+ struct { uint8_t g, r, b; } led_data[LED_NUM];
+ for (uint8_t i = 0; i < LED_NUM; i++) {
switch (RGB_Scale) {
- case RGB_SCALE_R10_G7_B5: {
- LED_R_Data[temp_Counter] = luminance*10/10;
- LED_G_Data[temp_Counter] = luminance*7/10;
- LED_B_Data[temp_Counter] = luminance*5/10;
- }break;
- case RGB_SCALE_R10_G7_B4: {
- LED_R_Data[temp_Counter] = luminance*10/10;
- LED_G_Data[temp_Counter] = luminance*7/10;
- LED_B_Data[temp_Counter] = luminance*4/10;
- }break;
- case RGB_SCALE_R10_G8_B7: {
- LED_R_Data[temp_Counter] = luminance*10/10;
- LED_G_Data[temp_Counter] = luminance*8/10;
- LED_B_Data[temp_Counter] = luminance*7/10;
- }break;
+ case RGB_SCALE_R10_G7_B5:
+ led_data[i] = { luminance * 7/10, luminance * 10/10, luminance * 5/10 };
+ break;
+ case RGB_SCALE_R10_G7_B4:
+ led_data[i] = { luminance * 7/10, luminance * 10/10, luminance * 4/10 };
+ break;
+ case RGB_SCALE_R10_G8_B7:
+ led_data[i] = { luminance * 8/10, luminance * 10/10, luminance * 7/10 };
+ break;
}
}
- for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) {
- if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) > LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000100;
- else if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) < LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000100;
- while (1) {
- else LED_R_Flag = 1;
- if ((unsigned char)(LED_DataArray[temp_Counter]>>16) > LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x010000;
- else if ((unsigned char)(LED_DataArray[temp_Counter]>>16) < LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x010000;
- else LED_G_Flag = 1;
- if ((unsigned char)LED_DataArray[temp_Counter] > LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000001;
- else if ((unsigned char)LED_DataArray[temp_Counter] < LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000001;
- else LED_B_Flag = 1;
+
+ struct { bool g, r, b; } led_flag = { false, false, false };
+ for (uint8_t i = 0; i < LED_NUM; i++) {
+ while (1) {
+ const uint8_t g = uint8_t(LED_DataArray[i] >> 16),
+ r = uint8_t(LED_DataArray[i] >> 8),
+ b = uint8_t(LED_DataArray[i]);
+ if (g == led_data[i].g) led_flag.g = true;
+ else LED_DataArray[i] += (g > led_data[i].g) ? -0x010000 : 0x010000;
+ if (r == led_data[i].r) led_flag.r = true;
+ else LED_DataArray[i] += (r > led_data[i].r) ? -0x000100 : 0x000100;
+ if (b == led_data[i].b) led_flag.b = true;
+ else LED_DataArray[i] += (b > led_data[i].b) ? -0x000001 : 0x000001;
+ LED_WriteData();
+ if (led_flag.r && led_flag.g && led_flag.b) break;
+ delay(change_Interval);
}
- LED_WriteData();
- if (LED_R_Flag && LED_G_Flag && LED_B_Flag) break;
- else delay(change_Interval);
}
}
diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h
index 93e54839d625d..bbba753a0baca 100644
--- a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h
+++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h
@@ -34,15 +34,6 @@
/*********************** Encoder Set ***********************/
-#define ENCODER_PHASE_0 0
-#define ENCODER_PHASE_1 2
-#define ENCODER_PHASE_2 3
-#define ENCODER_PHASE_3 1
-
-#define ENCODER_PULSES_PER_STEP 4
-
-#define BUTTON_PRESSED(BN) !READ(BTN_## BN)
-
typedef struct {
bool enabled = false;
int encoderMoveValue = 0;
@@ -59,10 +50,10 @@ typedef enum {
} ENCODER_DiffState;
// Encoder initialization
-void Encoder_Configuration(void);
+void Encoder_Configuration();
// Analyze encoder value and return state
-ENCODER_DiffState Encoder_ReceiveAnalyze(void);
+ENCODER_DiffState Encoder_ReceiveAnalyze();
/*********************** Encoder LED ***********************/
@@ -82,23 +73,23 @@ ENCODER_DiffState Encoder_ReceiveAnalyze(void);
extern unsigned int LED_DataArray[LED_NUM];
// LED light operation
- void LED_Action(void);
+ void LED_Action();
// LED initialization
- void LED_Configuration(void);
+ void LED_Configuration();
// LED write data
- void LED_WriteData(void);
+ void LED_WriteData();
// LED control
// RGB_Scale: RGB color ratio
// luminance: brightness (0~0xFF)
- void LED_Control(unsigned char RGB_Scale, unsigned char luminance);
+ void LED_Control(const uint8_t RGB_Scale, const uint8_t luminance);
// LED gradient control
// RGB_Scale: RGB color ratio
// luminance: brightness (0~0xFF)
// change_Time: gradient time (ms)
- void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval);
+ void LED_GraduallyControl(const uint8_t RGB_Scale, const uint8_t luminance, const uint16_t change_Interval);
#endif // LCD_LED
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp
index f13a4b36cfb53..097c1aeadc088 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp
@@ -468,19 +468,10 @@ void lv_encoder_pin_init() {
#if ANY_BUTTON(EN1, EN2, ENC, BACK)
uint8_t newbutton = 0;
-
- #if BUTTON_EXISTS(EN1)
- if (BUTTON_PRESSED(EN1)) newbutton |= EN_A;
- #endif
- #if BUTTON_EXISTS(EN2)
- if (BUTTON_PRESSED(EN2)) newbutton |= EN_B;
- #endif
- #if BUTTON_EXISTS(ENC)
- if (BUTTON_PRESSED(ENC)) newbutton |= EN_C;
- #endif
- #if BUTTON_EXISTS(BACK)
- if (BUTTON_PRESSED(BACK)) newbutton |= EN_D;
- #endif
+ if (BUTTON_PRESSED(EN1)) newbutton |= EN_A;
+ if (BUTTON_PRESSED(EN2)) newbutton |= EN_B;
+ if (BUTTON_PRESSED(ENC)) newbutton |= EN_C;
+ if (BUTTON_PRESSED(BACK)) newbutton |= EN_D;
#else
@@ -488,7 +479,6 @@ void lv_encoder_pin_init() {
#endif
-
static uint8_t buttons = 0;
buttons = newbutton;
static uint8_t lastEncoderBits;
diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h
index cf34a7ade92eb..b7732d3198896 100644
--- a/Marlin/src/lcd/lcdprint.h
+++ b/Marlin/src/lcd/lcdprint.h
@@ -76,8 +76,8 @@
#define INFO_FONT_HEIGHT (INFO_FONT_ASCENT + INFO_FONT_DESCENT)
#define INFO_FONT_WIDTH 6
- #define SETCURSOR(col, row) lcd_moveto((col) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT))
- #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH), ((row) + 1) * (MENU_FONT_HEIGHT))
+ #define LCD_COL_X(col) (( (col)) * (MENU_FONT_WIDTH))
+ #define LCD_ROW_Y(row) ((1 + (row)) * (MENU_FONT_HEIGHT))
#else
@@ -94,14 +94,18 @@
#define LCD_PIXEL_WIDTH LCD_WIDTH
#define LCD_PIXEL_HEIGHT LCD_HEIGHT
- #define SETCURSOR(col, row) lcd_moveto(col, row)
- #define SETCURSOR_RJ(len, row) SETCURSOR(LCD_WIDTH - (len), row)
+ #define LCD_COL_X(col) (col)
+ #define LCD_ROW_Y(row) (row)
#endif
-#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr)
-#define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr)
-#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U)
+#define LCD_COL_X_RJ(len) (LCD_PIXEL_WIDTH - LCD_COL_X(len))
+#define LCD_BOTTOM_ROW (LCD_PIXEL_HEIGHT - 1)
+#define SETCURSOR(col, row) lcd_moveto(LCD_COL_X(col), LCD_ROW_Y(row))
+#define SETCURSOR_RJ(len, row) lcd_moveto(LCD_COL_X_RJ(len), LCD_ROW_Y(row))
+#define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr)
+#define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr)
+#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U)
int lcd_glyph_height();
diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp
index e59b72f47d8a9..430bfcf48e927 100644
--- a/Marlin/src/lcd/marlinui.cpp
+++ b/Marlin/src/lcd/marlinui.cpp
@@ -342,7 +342,6 @@ void MarlinUI::init() {
init_lcd();
#if HAS_DIGITAL_BUTTONS
-
#if BUTTON_EXISTS(EN1)
SET_INPUT_PULLUP(BTN_EN1);
#endif
@@ -352,15 +351,12 @@ void MarlinUI::init() {
#if BUTTON_EXISTS(ENC)
SET_INPUT_PULLUP(BTN_ENC);
#endif
-
#if BUTTON_EXISTS(ENC_EN)
SET_INPUT_PULLUP(BTN_ENC_EN);
#endif
-
#if BUTTON_EXISTS(BACK)
SET_INPUT_PULLUP(BTN_BACK);
#endif
-
#if BUTTON_EXISTS(UP)
SET_INPUT(BTN_UP);
#endif
@@ -373,8 +369,7 @@ void MarlinUI::init() {
#if BUTTON_EXISTS(RT)
SET_INPUT(BTN_RT);
#endif
-
- #endif // !HAS_DIGITAL_BUTTONS
+ #endif
#if HAS_SHIFT_ENCODER
@@ -383,14 +378,14 @@ void MarlinUI::init() {
SET_OUTPUT(SR_DATA_PIN);
SET_OUTPUT(SR_CLK_PIN);
- #elif defined(SHIFT_CLK)
+ #elif PIN_EXISTS(SHIFT_CLK)
- SET_OUTPUT(SHIFT_CLK);
- OUT_WRITE(SHIFT_LD, HIGH);
- #if defined(SHIFT_EN) && SHIFT_EN >= 0
- OUT_WRITE(SHIFT_EN, LOW);
+ SET_OUTPUT(SHIFT_CLK_PIN);
+ OUT_WRITE(SHIFT_LD_PIN, HIGH);
+ #if PIN_EXISTS(SHIFT_EN)
+ OUT_WRITE(SHIFT_EN_PIN, LOW);
#endif
- SET_INPUT_PULLUP(SHIFT_OUT);
+ SET_INPUT_PULLUP(SHIFT_OUT_PIN);
#endif
@@ -830,11 +825,7 @@ millis_t next_lcd_update_ms;
#endif
inline bool can_encode() {
- #if BUTTON_EXISTS(ENC_EN)
- return !BUTTON_PRESSED(ENC_EN); // Update position only when ENC_EN is HIGH
- #else
- return true;
- #endif
+ return !BUTTON_PRESSED(ENC_EN); // Update encoder only when ENC_EN is not LOW (pressed)
}
void MarlinUI::update() {
@@ -890,18 +881,17 @@ void MarlinUI::update() {
else if (!wait_for_unclick && (buttons & EN_C)) // OK button, if not waiting for a debounce release:
do_click();
}
- else // keep wait_for_unclick value
-
- #endif // HAS_TOUCH_BUTTONS
+ // keep wait_for_unclick value
+ #endif
- {
- // Integrated LCD click handling via button_pressed
- if (!external_control && button_pressed()) {
- if (!wait_for_unclick) do_click(); // Handle the click
- }
- else
- wait_for_unclick = false;
+ if (!touch_buttons) {
+ // Integrated LCD click handling via button_pressed
+ if (!external_control && button_pressed()) {
+ if (!wait_for_unclick) do_click(); // Handle the click
}
+ else
+ wait_for_unclick = false;
+ }
if (LCD_BACK_CLICKED()) {
quick_feedback();
@@ -1198,19 +1188,10 @@ void MarlinUI::update() {
#if ANY_BUTTON(EN1, EN2, ENC, BACK)
uint8_t newbutton = 0;
-
- #if BUTTON_EXISTS(EN1)
- if (BUTTON_PRESSED(EN1)) newbutton |= EN_A;
- #endif
- #if BUTTON_EXISTS(EN2)
- if (BUTTON_PRESSED(EN2)) newbutton |= EN_B;
- #endif
- #if BUTTON_EXISTS(ENC)
- if (can_encode() && BUTTON_PRESSED(ENC)) newbutton |= EN_C;
- #endif
- #if BUTTON_EXISTS(BACK)
- if (BUTTON_PRESSED(BACK)) newbutton |= EN_D;
- #endif
+ if (BUTTON_PRESSED(EN1)) newbutton |= EN_A;
+ if (BUTTON_PRESSED(EN2)) newbutton |= EN_B;
+ if (can_encode() && BUTTON_PRESSED(ENC)) newbutton |= EN_C;
+ if (BUTTON_PRESSED(BACK)) newbutton |= EN_D;
#else
@@ -1225,40 +1206,26 @@ void MarlinUI::update() {
const int8_t pulses = epps * encoderDirection;
- if (false) {
- // for the else-ifs below
+ if (BUTTON_PRESSED(UP)) {
+ encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses;
+ next_button_update_ms = now + 300;
+ }
+ else if (BUTTON_PRESSED(DWN)) {
+ encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses;
+ next_button_update_ms = now + 300;
+ }
+ else if (BUTTON_PRESSED(LFT)) {
+ encoderDiff = -pulses;
+ next_button_update_ms = now + 300;
+ }
+ else if (BUTTON_PRESSED(RT)) {
+ encoderDiff = pulses;
+ next_button_update_ms = now + 300;
}
- #if BUTTON_EXISTS(UP)
- else if (BUTTON_PRESSED(UP)) {
- encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses;
- next_button_update_ms = now + 300;
- }
- #endif
- #if BUTTON_EXISTS(DWN)
- else if (BUTTON_PRESSED(DWN)) {
- encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses;
- next_button_update_ms = now + 300;
- }
- #endif
- #if BUTTON_EXISTS(LFT)
- else if (BUTTON_PRESSED(LFT)) {
- encoderDiff = -pulses;
- next_button_update_ms = now + 300;
- }
- #endif
- #if BUTTON_EXISTS(RT)
- else if (BUTTON_PRESSED(RT)) {
- encoderDiff = pulses;
- next_button_update_ms = now + 300;
- }
- #endif
#endif // UP || DWN || LFT || RT
- buttons = (newbutton
- #if HAS_SLOW_BUTTONS
- | slow_buttons
- #endif
+ buttons = (newbutton | TERN0(HAS_SLOW_BUTTONS, slow_buttons)
#if BOTH(HAS_TOUCH_BUTTONS, HAS_ENCODER_ACTION)
| (touch_buttons & TERN(HAS_ENCODER_WHEEL, ~(EN_A | EN_B), 0xFF))
#endif
@@ -1284,13 +1251,13 @@ void MarlinUI::update() {
* The rotary encoder part is also independent of the LCD chipset.
*/
uint8_t val = 0;
- WRITE(SHIFT_LD, LOW);
- WRITE(SHIFT_LD, HIGH);
+ WRITE(SHIFT_LD_PIN, LOW);
+ WRITE(SHIFT_LD_PIN, HIGH);
LOOP_L_N(i, 8) {
val >>= 1;
- if (READ(SHIFT_OUT)) SBI(val, 7);
- WRITE(SHIFT_CLK, HIGH);
- WRITE(SHIFT_CLK, LOW);
+ if (READ(SHIFT_OUT_PIN)) SBI(val, 7);
+ WRITE(SHIFT_CLK_PIN, HIGH);
+ WRITE(SHIFT_CLK_PIN, LOW);
}
TERN(REPRAPWORLD_KEYPAD, keypad_buttons, buttons) = ~val;
#endif
@@ -1306,11 +1273,6 @@ void MarlinUI::update() {
#if HAS_ENCODER_WHEEL
static uint8_t lastEncoderBits;
- #define encrot0 0
- #define encrot1 2
- #define encrot2 3
- #define encrot3 1
-
// Manage encoder rotation
#define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: encoderDiff += encoderDirection; break; case _E2: encoderDiff -= encoderDirection; }
@@ -1319,10 +1281,10 @@ void MarlinUI::update() {
if (buttons & EN_B) enc |= B10;
if (enc != lastEncoderBits) {
switch (enc) {
- 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;
+ case ENCODER_PHASE_0: ENCODER_SPIN(ENCODER_PHASE_3, ENCODER_PHASE_1); break;
+ case ENCODER_PHASE_1: ENCODER_SPIN(ENCODER_PHASE_0, ENCODER_PHASE_2); break;
+ case ENCODER_PHASE_2: ENCODER_SPIN(ENCODER_PHASE_1, ENCODER_PHASE_3); break;
+ case ENCODER_PHASE_3: ENCODER_SPIN(ENCODER_PHASE_2, ENCODER_PHASE_0); break;
}
#if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL)
external_encoder();
diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h
index a926dd58f45d4..a64483fcb00bd 100644
--- a/Marlin/src/lcd/marlinui.h
+++ b/Marlin/src/lcd/marlinui.h
@@ -25,6 +25,8 @@
#include "../module/motion.h"
+#include "buttons.h"
+
#if HAS_BUZZER
#include "../libs/buzzer.h"
#endif
@@ -40,20 +42,6 @@
#if EITHER(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY)
#define HAS_ENCODER_ACTION 1
#endif
-#if ((!HAS_ADC_BUTTONS && IS_NEWPANEL) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL
- #define HAS_ENCODER_WHEEL 1
-#endif
-#if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT)
- #define HAS_DIGITAL_BUTTONS 1
-#endif
-#if !HAS_ADC_BUTTONS && (IS_RRW_KEYPAD || (HAS_WIRED_LCD && !IS_NEWPANEL))
- #define HAS_SHIFT_ENCODER 1
-#endif
-
-// I2C buttons must be read in the main thread
-#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL)
- #define HAS_SLOW_BUTTONS 1
-#endif
#if E_MANUAL > 1
#define MULTI_MANUAL 1
@@ -114,130 +102,6 @@
#endif // HAS_WIRED_LCD
-#if IS_RRW_KEYPAD
- #define BTN_OFFSET 0 // Bit offset into buttons for shift register values
-
- #define BLEN_KEYPAD_F3 0
- #define BLEN_KEYPAD_F2 1
- #define BLEN_KEYPAD_F1 2
- #define BLEN_KEYPAD_DOWN 3
- #define BLEN_KEYPAD_RIGHT 4
- #define BLEN_KEYPAD_MIDDLE 5
- #define BLEN_KEYPAD_UP 6
- #define BLEN_KEYPAD_LEFT 7
-
- #define EN_KEYPAD_F1 _BV(BTN_OFFSET + BLEN_KEYPAD_F1)
- #define EN_KEYPAD_F2 _BV(BTN_OFFSET + BLEN_KEYPAD_F2)
- #define EN_KEYPAD_F3 _BV(BTN_OFFSET + BLEN_KEYPAD_F3)
- #define EN_KEYPAD_DOWN _BV(BTN_OFFSET + BLEN_KEYPAD_DOWN)
- #define EN_KEYPAD_RIGHT _BV(BTN_OFFSET + BLEN_KEYPAD_RIGHT)
- #define EN_KEYPAD_MIDDLE _BV(BTN_OFFSET + BLEN_KEYPAD_MIDDLE)
- #define EN_KEYPAD_UP _BV(BTN_OFFSET + BLEN_KEYPAD_UP)
- #define EN_KEYPAD_LEFT _BV(BTN_OFFSET + BLEN_KEYPAD_LEFT)
-
- #define RRK(B) (keypad_buttons & (B))
-
- #ifdef EN_C
- #define BUTTON_CLICK() ((buttons & EN_C) || RRK(EN_KEYPAD_MIDDLE))
- #else
- #define BUTTON_CLICK() RRK(EN_KEYPAD_MIDDLE)
- #endif
-
-#endif // IS_RRW_KEYPAD
-
-#if HAS_DIGITAL_BUTTONS
-
- // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes)
- #define BLEN_A 0
- #define BLEN_B 1
-
- #define EN_A _BV(BLEN_A)
- #define EN_B _BV(BLEN_B)
-
- #define BUTTON_PRESSED(BN) !READ(BTN_## BN)
-
- #if BUTTON_EXISTS(ENC) || HAS_TOUCH_BUTTONS
- #define BLEN_C 2
- #define EN_C _BV(BLEN_C)
- #endif
-
- #if ENABLED(LCD_I2C_VIKI)
-
- #include
-
- #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
-
- // button and encoder bit positions within 'buttons'
- #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C
- #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET)
- #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET)
- #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET)
- #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET)
-
- #if BUTTON_EXISTS(ENC) // The pause/stop/restart button is connected to BTN_ENC when used
- #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name
- #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented.
- #else
- #define BUTTON_CLICK() (buttons & (B_MI|B_RI))
- #endif
-
- // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update
-
- #elif ENABLED(LCD_I2C_PANELOLU2)
-
- #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin
-
- #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C)
-
- #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later
-
- #define BUTTON_CLICK() (buttons & B_MI)
-
- #endif
-
- #endif
-
-#else
-
- #undef BUTTON_EXISTS
- #define BUTTON_EXISTS(...) false
-
- // Shift register bits correspond to buttons:
- #define BL_LE 7 // Left
- #define BL_UP 6 // Up
- #define BL_MI 5 // Middle
- #define BL_DW 4 // Down
- #define BL_RI 3 // Right
- #define BL_ST 2 // Red Button
- #define B_LE _BV(BL_LE)
- #define B_UP _BV(BL_UP)
- #define B_MI _BV(BL_MI)
- #define B_DW _BV(BL_DW)
- #define B_RI _BV(BL_RI)
- #define B_ST _BV(BL_ST)
-
- #ifndef BUTTON_CLICK
- #define BUTTON_CLICK() (buttons & (B_MI|B_ST))
- #endif
-
-#endif
-
-#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_BUTTONS, IS_TFTGLCD_PANEL)
- #define BLEN_D 3
- #define EN_D _BV(BLEN_D)
- #define LCD_BACK_CLICKED() (buttons & EN_D)
-#else
- #define LCD_BACK_CLICKED() false
-#endif
-
-#ifndef BUTTON_CLICK
- #ifdef EN_C
- #define BUTTON_CLICK() (buttons & EN_C)
- #else
- #define BUTTON_CLICK() false
- #endif
-#endif
-
#if HAS_MARLINUI_U8GLIB
enum MarlinFont : uint8_t {
FONT_STATUSMENU = 1,
@@ -556,6 +420,8 @@ class MarlinUI {
#if HAS_TOUCH_BUTTONS
static uint8_t touch_buttons;
static uint8_t repeat_delay;
+ #else
+ static constexpr uint8_t touch_buttons = 0;
#endif
#if ENABLED(ENCODER_RATE_MULTIPLIER)
diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp
index 3d1cc26cd6cf5..975de58211f85 100644
--- a/Marlin/src/lcd/touch/touch_buttons.cpp
+++ b/Marlin/src/lcd/touch/touch_buttons.cpp
@@ -31,7 +31,8 @@ XPT2046 touchIO;
#include "../tft_io/touch_calibration.h"
#endif
-#include "../marlinui.h" // For EN_C bit mask
+#include "../buttons.h" // For EN_C bit mask
+#include "../marlinui.h" // For ui.refresh
#include "../tft_io/tft_io.h"
#define DOGM_AREA_LEFT TFT_PIXEL_OFFSET_X
@@ -66,7 +67,6 @@ uint8_t TouchButtons::read_buttons() {
y = uint16_t((uint32_t(y) * TOUCH_CALIBRATION_Y) >> 16) + TOUCH_OFFSET_Y;
#endif
-
// Touch within the button area simulates an encoder button
if (y > BUTTON_AREA_TOP && y < BUTTON_AREA_BOT)
return WITHIN(x, BUTTOND_X_LO, BUTTOND_X_HI) ? EN_D
diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h
index ce2ee2579abb1..ab1446f07c9fa 100644
--- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h
+++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h
@@ -459,10 +459,10 @@
#if !IS_NEWPANEL
// Buttons attached to a shift register
// Not wired yet
- //#define SHIFT_CLK 38
- //#define SHIFT_LD 42
- //#define SHIFT_OUT 40
- //#define SHIFT_EN 17
+ //#define SHIFT_CLK_PIN 38
+ //#define SHIFT_LD_PIN 42
+ //#define SHIFT_OUT_PIN 40
+ //#define SHIFT_EN_PIN 17
#endif
#endif
@@ -608,9 +608,9 @@
// Buttons are directly attached to AUX-2
#if IS_RRW_KEYPAD
- #define SHIFT_OUT 40
- #define SHIFT_CLK 44
- #define SHIFT_LD 42
+ #define SHIFT_OUT_PIN 40
+ #define SHIFT_CLK_PIN 44
+ #define SHIFT_LD_PIN 42
#define BTN_EN1 64
#define BTN_EN2 59
#define BTN_ENC 63
diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h
index e0452451882ca..7d0f494c34fcc 100644
--- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h
+++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h
@@ -354,15 +354,15 @@
#if IS_NEWPANEL
#if IS_RRW_KEYPAD
- #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3
- #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3
- #define SHIFT_LD P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant)
+ #define SHIFT_OUT_PIN P0_18 // (51) (MOSI) J3-10 & AUX-3
+ #define SHIFT_CLK_PIN P0_15 // (52) (SCK) J3-9 & AUX-3
+ #define SHIFT_LD_PIN P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant)
#endif
#else
- //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4
- //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4
- //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4
- //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4
+ //#define SHIFT_CLK_PIN P3_26 // (31) J3-2 & AUX-4
+ //#define SHIFT_LD_PIN P3_25 // (33) J3-4 & AUX-4
+ //#define SHIFT_OUT_PIN P2_11 // (35) J3-3 & AUX-4
+ //#define SHIFT_EN_PIN P1_22 // (41) J5-4 & AUX-4
#endif
#if ANY(VIKI2, miniVIKI)
diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h
index 596efdbb97b1e..fdd64878fbc6d 100644
--- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h
+++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h
@@ -147,14 +147,14 @@
#define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2
#if IS_RRW_KEYPAD
- #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3
- #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3
- #define SHIFT_LD P1_31 // (49) not 5V tolerant J3-1 & AUX-3
+ #define SHIFT_OUT_PIN P0_18 // (51) (MOSI) J3-10 & AUX-3
+ #define SHIFT_CLK_PIN P0_15 // (52) (SCK) J3-9 & AUX-3
+ #define SHIFT_LD_PIN P1_31 // (49) not 5V tolerant J3-1 & AUX-3
#elif !IS_NEWPANEL
- //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4
- //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4
- //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4
- //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4
+ //#define SHIFT_OUT_PIN P2_11 // (35) J3-3 & AUX-4
+ //#define SHIFT_CLK_PIN P3_26 // (31) J3-2 & AUX-4
+ //#define SHIFT_LD_PIN P3_25 // (33) J3-4 & AUX-4
+ //#define SHIFT_EN_PIN P1_22 // (41) J5-4 & AUX-4
#endif
#if ANY(VIKI2, miniVIKI)
diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h
index 0e75aa4a37342..f80e6144ce180 100644
--- a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h
+++ b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h
@@ -149,9 +149,9 @@
#define BTN_ENC 27
// Hardware buttons for manual movement of XYZ
-#define SHIFT_OUT 19
-#define SHIFT_LD 18
-#define SHIFT_CLK 17
+#define SHIFT_OUT_PIN 19
+#define SHIFT_LD_PIN 18
+#define SHIFT_CLK_PIN 17
//#define UI1 31
//#define UI2 22
diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h
index 35426a453139c..540f5c29f5177 100644
--- a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h
+++ b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h
@@ -156,9 +156,9 @@
#define BTN_ENC 38
// Hardware buttons for manual movement of XYZ
-#define SHIFT_OUT 42
-#define SHIFT_LD 41
-#define SHIFT_CLK 40
+#define SHIFT_OUT_PIN 42
+#define SHIFT_LD_PIN 41
+#define SHIFT_CLK_PIN 40
//#define UI1 43
//#define UI2 37
diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h
index e1752c1f85643..dcd829f7a7ae4 100644
--- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h
+++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h
@@ -146,10 +146,10 @@
#else // !IS_NEWPANEL
- #define SHIFT_CLK 38
- #define SHIFT_LD 42
- #define SHIFT_OUT 40
- #define SHIFT_EN 17
+ #define SHIFT_CLK_PIN 38
+ #define SHIFT_LD_PIN 42
+ #define SHIFT_OUT_PIN 40
+ #define SHIFT_EN_PIN 17
#define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 5
diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
index fa2027fb78258..d507d20ca7ab0 100644
--- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
+++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
@@ -156,10 +156,10 @@
#else
// Buttons attached to a shift register
- #define SHIFT_CLK 38
- #define SHIFT_LD 42
- #define SHIFT_OUT 40
- #define SHIFT_EN 17
+ #define SHIFT_CLK_PIN 38
+ #define SHIFT_LD_PIN 42
+ #define SHIFT_OUT_PIN 40
+ #define SHIFT_EN_PIN 17
#define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 5
diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h
index 67ec24ed6f791..ef4605edd4374 100644
--- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h
+++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h
@@ -146,10 +146,10 @@
#define BTN_ENC 43
#else
// Buttons attached to shift register of reprapworld keypad v1.1
- #define SHIFT_CLK 63
- #define SHIFT_LD 42
- #define SHIFT_OUT 17
- #define SHIFT_EN 17
+ #define SHIFT_CLK_PIN 63
+ #define SHIFT_LD_PIN 42
+ #define SHIFT_OUT_PIN 17
+ #define SHIFT_EN_PIN 17
#endif
#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h
index 45ebd163a79f1..9f85d46a544b0 100644
--- a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h
+++ b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h
@@ -162,10 +162,10 @@
#define LCD_PINS_D6 39
#define LCD_PINS_D7 15
- #define SHIFT_CLK 43
- #define SHIFT_LD 35
- #define SHIFT_OUT 34
- #define SHIFT_EN 44
+ #define SHIFT_CLK_PIN 43
+ #define SHIFT_LD_PIN 35
+ #define SHIFT_OUT_PIN 34
+ #define SHIFT_EN_PIN 44
#if MB(MEGATRONICS_31, MEGATRONICS_32)
#define SD_DETECT_PIN 56
diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h
index 0e1b1b09e56e2..79a67c34f8702 100644
--- a/Marlin/src/pins/pinsDebug_list.h
+++ b/Marlin/src/pins/pinsDebug_list.h
@@ -833,17 +833,17 @@
#if PIN_EXISTS(SERVO3)
REPORT_NAME_DIGITAL(__LINE__, SERVO3_PIN)
#endif
-#if defined(SHIFT_CLK) && SHIFT_CLK >= 0
- REPORT_NAME_DIGITAL(__LINE__, SHIFT_CLK)
+#if PIN_EXISTS(SHIFT_CLK)
+ REPORT_NAME_DIGITAL(__LINE__, SHIFT_CLK_PIN)
#endif
-#if defined(SHIFT_EN) && SHIFT_EN >= 0
- REPORT_NAME_DIGITAL(__LINE__, SHIFT_EN)
+#if PIN_EXISTS(SHIFT_EN)
+ REPORT_NAME_DIGITAL(__LINE__, SHIFT_EN_PIN)
#endif
-#if defined(SHIFT_LD) && SHIFT_LD >= 0
- REPORT_NAME_DIGITAL(__LINE__, SHIFT_LD)
+#if PIN_EXISTS(SHIFT_LD)
+ REPORT_NAME_DIGITAL(__LINE__, SHIFT_LD_PIN)
#endif
-#if defined(SHIFT_OUT) && SHIFT_OUT >= 0
- REPORT_NAME_DIGITAL(__LINE__, SHIFT_OUT)
+#if PIN_EXISTS(SHIFT_OUT)
+ REPORT_NAME_DIGITAL(__LINE__, SHIFT_OUT_PIN)
#endif
#if PIN_EXISTS(SLED)
REPORT_NAME_DIGITAL(__LINE__, SLED_PIN)
diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h
index 7dcaeb8e57e41..be2317b146bd3 100644
--- a/Marlin/src/pins/rambo/pins_RAMBO.h
+++ b/Marlin/src/pins/rambo/pins_RAMBO.h
@@ -239,10 +239,10 @@
// Buttons attached to a shift register
// Not wired yet
- //#define SHIFT_CLK 38
- //#define SHIFT_LD 42
- //#define SHIFT_OUT 40
- //#define SHIFT_EN 17
+ //#define SHIFT_CLK_PIN 38
+ //#define SHIFT_LD_PIN 42
+ //#define SHIFT_OUT_PIN 40
+ //#define SHIFT_EN_PIN 17
#define LCD_PINS_RS 75
#define LCD_PINS_ENABLE 17
diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h
index 57d4c047e2e27..ab5711bd5c532 100644
--- a/Marlin/src/pins/ramps/pins_RAMPS.h
+++ b/Marlin/src/pins/ramps/pins_RAMPS.h
@@ -504,10 +504,10 @@
#if !IS_NEWPANEL
// Buttons attached to a shift register
// Not wired yet
- //#define SHIFT_CLK 38
- //#define SHIFT_LD 42
- //#define SHIFT_OUT 40
- //#define SHIFT_EN 17
+ //#define SHIFT_CLK_PIN 38
+ //#define SHIFT_LD_PIN 42
+ //#define SHIFT_OUT_PIN 40
+ //#define SHIFT_EN_PIN 17
#endif
#endif
@@ -722,9 +722,9 @@
#endif // HAS_WIRED_LCD
#if IS_RRW_KEYPAD && !HAS_ADC_BUTTONS
- #define SHIFT_OUT 40
- #define SHIFT_CLK 44
- #define SHIFT_LD 42
+ #define SHIFT_OUT_PIN 40
+ #define SHIFT_CLK_PIN 44
+ #define SHIFT_LD_PIN 42
#ifndef BTN_EN1
#define BTN_EN1 64
#endif
diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h
index e6a95fdab9eec..ca402553e112c 100644
--- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h
+++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h
@@ -342,10 +342,10 @@
#if !IS_NEWPANEL
// Buttons attached to a shift register
// Not wired yet
- //#define SHIFT_CLK 38
- //#define SHIFT_LD 42
- //#define SHIFT_OUT 40
- //#define SHIFT_EN 17
+ //#define SHIFT_CLK_PIN 38
+ //#define SHIFT_LD_PIN 42
+ //#define SHIFT_OUT_PIN 40
+ //#define SHIFT_EN_PIN 17
#endif
#endif
@@ -491,9 +491,9 @@
// Buttons are directly attached to AUX-2
#if IS_RRW_KEYPAD
- #define SHIFT_OUT 40
- #define SHIFT_CLK 44
- #define SHIFT_LD 42
+ #define SHIFT_OUT_PIN 40
+ #define SHIFT_CLK_PIN 44
+ #define SHIFT_LD_PIN 42
#define BTN_EN1 64
#define BTN_EN2 59
#define BTN_ENC 63
diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h
index 447138f53e268..22c7fd95b47ee 100644
--- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h
+++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h
@@ -142,10 +142,10 @@
#else // !IS_NEWPANEL - Old style panel with shift register
// Buttons attached to a shift register
- #define SHIFT_CLK 38
- #define SHIFT_LD 42
- #define SHIFT_OUT 40
- #define SHIFT_EN 17
+ #define SHIFT_CLK_PIN 38
+ #define SHIFT_LD_PIN 42
+ #define SHIFT_OUT_PIN 40
+ #define SHIFT_EN_PIN 17
#define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 5
diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h
index a59a000dff868..37c28ece4ce44 100644
--- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h
+++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h
@@ -197,10 +197,10 @@
#else // !IS_NEWPANEL - Old style panel with shift register
// Buttons attached to a shift register
- #define SHIFT_CLK 38
- #define SHIFT_LD 42
- #define SHIFT_OUT 40
- #define SHIFT_EN 17
+ #define SHIFT_CLK_PIN 38
+ #define SHIFT_LD_PIN 42
+ #define SHIFT_OUT_PIN 40
+ #define SHIFT_EN_PIN 17
#define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 5
diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V20.h b/Marlin/src/pins/ramps/pins_ZRIB_V20.h
index 90433c62d751b..6c4b28d0b8740 100644
--- a/Marlin/src/pins/ramps/pins_ZRIB_V20.h
+++ b/Marlin/src/pins/ramps/pins_ZRIB_V20.h
@@ -69,9 +69,9 @@
#undef ADC_KEYPAD_PIN
#undef BEEPER_PIN
- #undef SHIFT_OUT
- #undef SHIFT_CLK
- #undef SHIFT_LD
+ #undef SHIFT_OUT_PIN
+ #undef SHIFT_CLK_PIN
+ #undef SHIFT_LD_PIN
#undef BTN_EN1
#undef BTN_EN2
#undef BTN_ENC
diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h
index d72b55d3afe02..7a72ef651f1dd 100644
--- a/Marlin/src/pins/samd/pins_RAMPS_144.h
+++ b/Marlin/src/pins/samd/pins_RAMPS_144.h
@@ -363,10 +363,10 @@
#if !IS_NEWPANEL
// Buttons attached to a shift register
// Not wired yet
- //#define SHIFT_CLK 38
- //#define SHIFT_LD 42
- //#define SHIFT_OUT 40
- //#define SHIFT_EN 17
+ //#define SHIFT_CLK_PIN 38
+ //#define SHIFT_LD_PIN 42
+ //#define SHIFT_OUT_PIN 40
+ //#define SHIFT_EN_PIN 17
#endif
#endif
@@ -567,9 +567,9 @@
// Buttons are directly attached to AUX-2
#if IS_RRW_KEYPAD
// TO TEST
- //#define SHIFT_OUT 40
- //#define SHIFT_CLK 44
- //#define SHIFT_LD 42
+ //#define SHIFT_OUT_PIN 40
+ //#define SHIFT_CLK_PIN 44
+ //#define SHIFT_LD_PIN 42
//#define BTN_EN1 56 // Mega/Due:64 - AGCM4:56
//#define BTN_EN2 72 // Mega/Due:59 - AGCM4:72
//#define BTN_ENC 55 // Mega/Due:63 - AGCM4:55
diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h
index b18c9dd91406e..bb6f5719246ec 100644
--- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h
+++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h
@@ -146,10 +146,10 @@
#define BEEPER_PIN PC1 // 33
// Buttons attached to a shift register
// Not wired yet
- //#define SHIFT_CLK PC6 // 38
- //#define SHIFT_LD PC10 // 42
- //#define SHIFT_OUT PC8 // 40
- //#define SHIFT_EN PA1 // 17
+ //#define SHIFT_CLK_PIN PC6 // 38
+ //#define SHIFT_LD_PIN PC10 // 42
+ //#define SHIFT_OUT_PIN PC8 // 40
+ //#define SHIFT_EN_PIN PA1 // 17
#endif
#endif
@@ -260,9 +260,9 @@
#define BTN_EN1 PE0 // 64
#define BTN_EN2 PD11 // 59
#define BTN_ENC PD15 // 63
- #define SHIFT_OUT PC8 // 40
- #define SHIFT_CLK PC12 // 44
- #define SHIFT_LD PC10 // 42
+ #define SHIFT_OUT_PIN PC8 // 40
+ #define SHIFT_CLK_PIN PC12 // 44
+ #define SHIFT_LD_PIN PC10 // 42
#elif ENABLED(PANEL_ONE)
#define BTN_EN1 PD11 // 59 // AUX2 PIN 3
#define BTN_EN2 PD15 // 63 // AUX2 PIN 4
diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h
index b8a0ffe2c80b2..71c348536a7f9 100644
--- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h
+++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h
@@ -146,7 +146,7 @@
#endif
#if IS_RRW_KEYPAD
- #define SHIFT_OUT 40
- #define SHIFT_CLK 44
- #define SHIFT_LD 42
+ #define SHIFT_OUT_PIN 40
+ #define SHIFT_CLK_PIN 44
+ #define SHIFT_LD_PIN 42
#endif