diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 8f95ac529dd5..e537c2974a6a 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -34,9 +34,8 @@
* - Extra features
*
* Advanced settings can be found in Configuration_adv.h
- *
*/
-#define CONFIGURATION_H_VERSION 020006
+#define CONFIGURATION_H_VERSION 020007
//===========================================================================
//============================= Getting Started =============================
@@ -389,6 +388,7 @@
* 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v excitation (STM32 \ LPC176x....)
* 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB)
* 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB)
+ * 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup)
* 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x
* 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950
* 61 : 100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup
@@ -847,7 +847,6 @@
* - For simple switches connect...
* - normally-closed switches to GND and D32.
* - normally-open switches to 5V and D32.
- *
*/
//#define Z_MIN_PROBE_PIN 32 // Pin 32 is the RAMPS default
@@ -1554,7 +1553,6 @@
*
* Caveats: The ending Z should be the same as starting Z.
* Attention: EXPERIMENTAL. G-code arguments may change.
- *
*/
//#define NOZZLE_CLEAN_FEATURE
@@ -1706,7 +1704,6 @@
*
* SD Card support is disabled by default. If your controller has an SD slot,
* you must uncomment the following option or it won't work.
- *
*/
#define SDSUPPORT
@@ -1943,6 +1940,14 @@
//
//#define FF_INTERFACEBOARD
+//
+// TFT GLCD Panel with Marlin UI
+// Panel connected to main board by SPI or I2C interface.
+// See https://github.com/Serhiy-K/TFTGLCDAdapter
+//
+//#define TFTGLCD_PANEL_SPI
+//#define TFTGLCD_PANEL_I2C
+
//=============================================================================
//======================= LCD / Controller Selection =======================
//========================= (Graphical LCDs) ========================
@@ -2314,7 +2319,6 @@
* *** CAUTION ***
*
* LED Type. Enable only one of the following two options.
- *
*/
//#define RGB_LED
//#define RGBW_LED
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index e2a09df96991..a1ec7ebfb86f 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -29,9 +29,8 @@
* Some of these settings can damage your printer if improperly set!
*
* Basic settings can be found in Configuration.h
- *
*/
-#define CONFIGURATION_ADV_H_VERSION 020006
+#define CONFIGURATION_ADV_H_VERSION 020007
// @section temperature
@@ -1024,18 +1023,18 @@
#define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s)
#endif
-#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && (HAS_GRAPHICAL_LCD || HAS_CHARACTER_LCD)
+#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL)
//#define SHOW_REMAINING_TIME // Display estimated time to completion
#if ENABLED(SHOW_REMAINING_TIME)
//#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation
//#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time
#endif
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
//#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits
#endif
- #if HAS_CHARACTER_LCD
+ #if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL)
//#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing
#if ENABLED(LCD_PROGRESS_BAR)
#define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar
@@ -1086,6 +1085,7 @@
#if ENABLED(POWER_LOSS_RECOVERY)
#define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500)
//#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss
+ //#define POWER_LOSS_RECOVER_ZHOME // Z homing is needed for proper recovery. 99.9% of the time this should be disabled!
//#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS)
//#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module.
//#define POWER_LOSS_STATE HIGH // State of pin indicating power loss
@@ -1246,7 +1246,7 @@
* controller events, as there is a trade-off between reliable
* printing performance versus fast display updates.
*/
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
// Show SD percentage next to the progress bar
//#define DOGM_SD_PERCENT
@@ -1316,7 +1316,7 @@
//#define MARLIN_SNAKE
//#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
//
// Additional options for DGUS / DWIN displays
@@ -1864,7 +1864,6 @@
* Be sure to turn off auto-retract during filament change.
*
* Note that M207 / M208 / M209 settings are saved to EEPROM.
- *
*/
//#define FWRETRACT
#if ENABLED(FWRETRACT)
diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h
index 41f1acd32f68..b606d0c231b4 100644
--- a/Marlin/src/HAL/AVR/HAL.h
+++ b/Marlin/src/HAL/AVR/HAL.h
@@ -15,6 +15,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
+ *
*/
#pragma once
diff --git a/Marlin/src/HAL/AVR/Servo.cpp b/Marlin/src/HAL/AVR/Servo.cpp
index 66ed993c6f18..526352b77339 100644
--- a/Marlin/src/HAL/AVR/Servo.cpp
+++ b/Marlin/src/HAL/AVR/Servo.cpp
@@ -48,7 +48,6 @@
* readMicroseconds() - Get the last-written servo pulse width in microseconds.
* attached() - Return true if a servo is attached.
* detach() - Stop an attached servo from pulsing its i/o pin.
- *
*/
#ifdef __AVR__
diff --git a/Marlin/src/HAL/AVR/pinsDebug.h b/Marlin/src/HAL/AVR/pinsDebug.h
index 2cf740a5597a..dac6b1b150bd 100644
--- a/Marlin/src/HAL/AVR/pinsDebug.h
+++ b/Marlin/src/HAL/AVR/pinsDebug.h
@@ -26,7 +26,7 @@
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
-#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H)
+#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
#define AVR_ATmega2560_FAMILY_PLUS_70 1
#endif
diff --git a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h
index 46c03088d213..db3fdf1f767b 100644
--- a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h
+++ b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h
@@ -22,15 +22,12 @@
* Structures for 2560 family boards that use more than 70 pins
*/
-#undef NUM_DIGITAL_PINS
-#if MB(BQ_ZUM_MEGA_3D)
+#if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14)
+ #undef NUM_DIGITAL_PINS
#define NUM_DIGITAL_PINS 85
#elif MB(MIGHTYBOARD_REVE)
+ #undef NUM_DIGITAL_PINS
#define NUM_DIGITAL_PINS 80
-#elif MB(MINIRAMBO)
- #define NUM_DIGITAL_PINS 85
-#elif MB(SCOOVO_X9H)
- #define NUM_DIGITAL_PINS 85
#endif
#define PA 1
diff --git a/Marlin/src/HAL/AVR/timers.h b/Marlin/src/HAL/AVR/timers.h
index 6c40d3220924..82eb8b14b161 100644
--- a/Marlin/src/HAL/AVR/timers.h
+++ b/Marlin/src/HAL/AVR/timers.h
@@ -15,6 +15,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
+ *
*/
#pragma once
diff --git a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp b/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp
index c29b19557899..cb95a48cccec 100644
--- a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp
+++ b/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include "../shared/Marduino.h"
#include "../shared/Delay.h"
@@ -189,5 +189,5 @@ uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
return 1;
}
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp
index 4b9260c35962..6ce85a4643bb 100644
--- a/Marlin/src/HAL/DUE/HAL.cpp
+++ b/Marlin/src/HAL/DUE/HAL.cpp
@@ -19,9 +19,7 @@
*/
/**
- * Description: HAL for Arduino Due and compatible (SAM3X8E)
- *
- * For ARDUINO_ARCH_SAM
+ * HAL for Arduino Due and compatible (SAM3X8E)
*/
#ifdef ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h
index 7a057fdae4fc..dbb84e2ac717 100644
--- a/Marlin/src/HAL/DUE/HAL.h
+++ b/Marlin/src/HAL/DUE/HAL.h
@@ -22,9 +22,7 @@
#pragma once
/**
- * Description: HAL for Arduino Due and compatible (SAM3X8E)
- *
- * For ARDUINO_ARCH_SAM
+ * HAL for Arduino Due and compatible (SAM3X8E)
*/
#define CPU_32_BIT
diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp
index 97d69f0d726b..0451d8bcc4ff 100644
--- a/Marlin/src/HAL/DUE/HAL_SPI.cpp
+++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp
@@ -30,7 +30,7 @@
*/
/**
- * Description: HAL for Arduino Due and compatible (SAM3X8E)
+ * HAL for Arduino Due and compatible (SAM3X8E)
*
* For ARDUINO_ARCH_SAM
*/
@@ -759,7 +759,6 @@
*
* All of the above can be avoided by defining FORCE_SOFT_SPI to force the
* display to use software SPI.
- *
*/
void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified)
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
index 28e82d70d454..be4b49c0f992 100644
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
+++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp
@@ -52,14 +52,13 @@
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
*/
#ifdef __SAM3X8E__
#include "../../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include
@@ -145,6 +144,6 @@ uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
return 1;
}
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
#endif // __SAM3X8E__
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
index 54c244d4f615..ea7204fa366b 100644
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
+++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD && DISABLED(U8GLIB_ST7920)
+#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
#undef SPI_SPEED
#define SPI_SPEED 2 // About 2 MHz
@@ -144,5 +144,5 @@ uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void
return 1;
}
-#endif // HAS_GRAPHICAL_LCD && !U8GLIB_ST7920
+#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp
index 960df1bd864b..615a386c3542 100644
--- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp
+++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include "../../shared/Delay.h"
@@ -108,5 +108,5 @@ void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz
}
}
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
#endif // ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp
index d98f06039f51..67f1f9e40f46 100644
--- a/Marlin/src/HAL/DUE/eeprom_flash.cpp
+++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp
@@ -53,7 +53,6 @@
* per page. We can't emulate EE endurance with FLASH for all
* bytes, but we can emulate endurance for a given percent of
* bytes.
- *
*/
//#define EE_EMU_DEBUG
diff --git a/Marlin/src/HAL/DUE/pinsDebug.h b/Marlin/src/HAL/DUE/pinsDebug.h
index 28687ff267c4..a99ca8ecce90 100644
--- a/Marlin/src/HAL/DUE/pinsDebug.h
+++ b/Marlin/src/HAL/DUE/pinsDebug.h
@@ -179,5 +179,4 @@ void pwm_details(int32_t pin) {
* ----------------+--------
* ID | PB11
* VBOF | PB10
- *
*/
diff --git a/Marlin/src/HAL/DUE/timers.cpp b/Marlin/src/HAL/DUE/timers.cpp
index 795cdad66a57..9b937d1a7c83 100644
--- a/Marlin/src/HAL/DUE/timers.cpp
+++ b/Marlin/src/HAL/DUE/timers.cpp
@@ -21,9 +21,7 @@
*/
/**
- * Description: HAL for Arduino Due and compatible (SAM3X8E)
- *
- * For ARDUINO_ARCH_SAM
+ * HAL Timers for Arduino Due and compatible (SAM3X8E)
*/
#ifdef ARDUINO_ARCH_SAM
diff --git a/Marlin/src/HAL/DUE/timers.h b/Marlin/src/HAL/DUE/timers.h
index 9defe39a0ae3..0e1ea07cc2e4 100644
--- a/Marlin/src/HAL/DUE/timers.h
+++ b/Marlin/src/HAL/DUE/timers.h
@@ -21,9 +21,7 @@
#pragma once
/**
- * HAL for Arduino Due and compatible (SAM3X8E)
- *
- * For ARDUINO_ARCH_SAM
+ * HAL Timers for Arduino Due and compatible (SAM3X8E)
*/
#include
diff --git a/Marlin/src/HAL/DUE/upload_extra_script.py b/Marlin/src/HAL/DUE/upload_extra_script.py
index 06c2b914f53d..d52a0a3642b4 100644
--- a/Marlin/src/HAL/DUE/upload_extra_script.py
+++ b/Marlin/src/HAL/DUE/upload_extra_script.py
@@ -14,5 +14,5 @@
# Use bossac.exe on Windows
env.Replace(
- UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot"
+ UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE"
)
diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h
index 5eb84fdc3021..aa3bcc775d1f 100644
--- a/Marlin/src/HAL/ESP32/HAL.h
+++ b/Marlin/src/HAL/ESP32/HAL.h
@@ -15,11 +15,12 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
+ *
*/
#pragma once
/**
- * Description: HAL for Espressif ESP32 WiFi
+ * HAL for Espressif ESP32 WiFi
*/
#define CPU_32_BIT
diff --git a/Marlin/src/HAL/ESP32/ota.h b/Marlin/src/HAL/ESP32/ota.h
index 7f9b237aa6e1..546ace82dbb8 100644
--- a/Marlin/src/HAL/ESP32/ota.h
+++ b/Marlin/src/HAL/ESP32/ota.h
@@ -15,6 +15,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
+ *
*/
#pragma once
diff --git a/Marlin/src/HAL/LINUX/include/serial.h b/Marlin/src/HAL/LINUX/include/serial.h
index 94e0c758ee12..e91624938978 100644
--- a/Marlin/src/HAL/LINUX/include/serial.h
+++ b/Marlin/src/HAL/LINUX/include/serial.h
@@ -33,7 +33,6 @@
* Generic RingBuffer
* T type of the buffer array
* S size of the buffer (must be power of 2)
- *
*/
template class RingBuffer {
public:
diff --git a/Marlin/src/HAL/LINUX/servo_private.h b/Marlin/src/HAL/LINUX/servo_private.h
index 122cfef3ea21..bcc8d2037f90 100644
--- a/Marlin/src/HAL/LINUX/servo_private.h
+++ b/Marlin/src/HAL/LINUX/servo_private.h
@@ -45,7 +45,6 @@
* Version 2 Copyright (c) 2009 Michael Margolis. All right reserved.
*
* The only modification was to update/delete macros to match the LPC176x.
- *
*/
#include
diff --git a/Marlin/src/HAL/LINUX/spi_pins.h b/Marlin/src/HAL/LINUX/spi_pins.h
index a444196f04bb..01ba28e5b604 100644
--- a/Marlin/src/HAL/LINUX/spi_pins.h
+++ b/Marlin/src/HAL/LINUX/spi_pins.h
@@ -24,7 +24,7 @@
#include "../../core/macros.h"
#include "../../inc/MarlinConfigPre.h"
-#if BOTH(HAS_GRAPHICAL_LCD, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN)
+#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN)
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently
// needed due to the speed and mode required for communicating with each device being different.
// This requirement can be removed if the SPI access to these devices is updated to use
diff --git a/Marlin/src/HAL/LPC1768/Servo.h b/Marlin/src/HAL/LPC1768/Servo.h
index e953cb920475..eb12fd20f4d8 100644
--- a/Marlin/src/HAL/LPC1768/Servo.h
+++ b/Marlin/src/HAL/LPC1768/Servo.h
@@ -46,7 +46,6 @@
* Version 2 Copyright (c) 2009 Michael Margolis. All right reserved.
*
* The only modification was to update/delete macros to match the LPC176x.
- *
*/
#include
diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
index b6491368cd2a..fd82e2884ae9 100644
--- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
+++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
@@ -113,7 +113,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
#define _IS_RX1_1 IS_RX1
#if IS_TX1(TMC_SW_SCK)
#error "Serial port pins (1) conflict with other pins!"
- #elif HAS_SPI_LCD
+ #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, SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \
diff --git a/Marlin/src/HAL/LPC1768/spi_pins.h b/Marlin/src/HAL/LPC1768/spi_pins.h
index 2e6749bf5752..b4da5d4df234 100644
--- a/Marlin/src/HAL/LPC1768/spi_pins.h
+++ b/Marlin/src/HAL/LPC1768/spi_pins.h
@@ -23,7 +23,7 @@
#include "../../core/macros.h"
-#if BOTH(SDSUPPORT, HAS_GRAPHICAL_LCD) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN)
+#if BOTH(SDSUPPORT, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN)
#define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently
// needed due to the speed and mode required for communicating with each device being different.
// This requirement can be removed if the SPI access to these devices is updated to use
diff --git a/Marlin/src/HAL/LPC1768/timers.h b/Marlin/src/HAL/LPC1768/timers.h
index 23dc20e2eb4e..e6744fb005bf 100644
--- a/Marlin/src/HAL/LPC1768/timers.h
+++ b/Marlin/src/HAL/LPC1768/timers.h
@@ -21,7 +21,6 @@
#pragma once
/**
- *
* HAL For LPC1768
*/
diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp
index befc348fab49..057e10e0f545 100644
--- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp
+++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include
#include "../../shared/HAL_SPI.h"
@@ -124,6 +124,6 @@ uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val,
return 1;
}
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
#endif // TARGET_LPC1768
diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp
index f03be9ab34dc..6f7efba4ae20 100644
--- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp
+++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp
@@ -77,7 +77,7 @@
#include "../../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include
@@ -193,6 +193,6 @@ uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_v
return 1;
}
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
#endif // TARGET_LPC1768
diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp
index 1500c22a0d52..592e27f6c006 100644
--- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp
+++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include
#include "../../shared/HAL_SPI.h"
@@ -133,6 +133,6 @@ uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t ar
return 1;
}
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
#endif // TARGET_LPC1768
diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
index 4f52f7dd0129..ca9d6ecfbe25 100644
--- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
+++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp
@@ -57,7 +57,7 @@
#include "../../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD && DISABLED(U8GLIB_ST7920)
+#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920)
#include
@@ -203,5 +203,5 @@ uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val,
return 1;
}
-#endif // HAS_GRAPHICAL_LCD && !U8GLIB_ST7920
+#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920
#endif // TARGET_LPC1768
diff --git a/Marlin/src/HAL/SAMD51/QSPIFlash.h b/Marlin/src/HAL/SAMD51/QSPIFlash.h
index b6f22769ff60..db4abec91caf 100644
--- a/Marlin/src/HAL/SAMD51/QSPIFlash.h
+++ b/Marlin/src/HAL/SAMD51/QSPIFlash.h
@@ -24,7 +24,6 @@
* THE SOFTWARE.
*
* Derived from Adafruit_SPIFlash class with no SdFat references
- *
*/
#pragma once
diff --git a/Marlin/src/HAL/SAMD51/pinsDebug.h b/Marlin/src/HAL/SAMD51/pinsDebug.h
index c28937d6c6d6..81376db79add 100644
--- a/Marlin/src/HAL/SAMD51/pinsDebug.h
+++ b/Marlin/src/HAL/SAMD51/pinsDebug.h
@@ -150,5 +150,4 @@ void pwm_details(int32_t pin) {
* 93 | PA10 | QSPI: IO2
* 94 | PA11 | QSPI: IO3
* 95 | PB31 | SD: DETECT
- *
*/
diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp
index b1b727ce195b..83604b1104bb 100644
--- a/Marlin/src/HAL/STM32/HAL.cpp
+++ b/Marlin/src/HAL/STM32/HAL.cpp
@@ -63,7 +63,7 @@ uint16_t HAL_adc_result;
void HAL_init() {
FastIO_init();
- #if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT)
+ #if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT) && (defined(SDSS) && SDSS != -1)
OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up
#endif
@@ -122,9 +122,14 @@ extern "C" {
// TODO: Make sure this doesn't cause any delay
void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); }
-
uint16_t HAL_adc_get_result() { return HAL_adc_result; }
+// Reset the system (to initiate a firmware flash)
void flashFirmware(const int16_t) { NVIC_SystemReset(); }
+// Maple Compatibility
+systickCallback_t systick_user_callback;
+void systick_attach_callback(systickCallback_t cb) { systick_user_callback = cb; }
+void HAL_SYSTICK_Callback() { if (systick_user_callback) systick_user_callback(); }
+
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h
index 60ab45374a56..37919102ec1f 100644
--- a/Marlin/src/HAL/STM32/HAL.h
+++ b/Marlin/src/HAL/STM32/HAL.h
@@ -177,3 +177,8 @@ uint16_t HAL_adc_get_result();
#define PLATFORM_M997_SUPPORT
void flashFirmware(const int16_t);
+
+// Maple Compatibility
+typedef void (*systickCallback_t)(void);
+void systick_attach_callback(systickCallback_t cb);
+void HAL_SYSTICK_Callback();
diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp
index 202442a71b00..f947e6ef3272 100644
--- a/Marlin/src/HAL/STM32/HAL_SPI.cpp
+++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp
@@ -132,11 +132,9 @@ static SPISettings spiConfig;
* @details Only configures SS pin since stm32duino creates and initialize the SPI object
*/
void spiBegin() {
- #if !PIN_EXISTS(SS)
- #error "SS_PIN not defined!"
+ #if PIN_EXISTS(SS)
+ OUT_WRITE(SS_PIN, HIGH);
#endif
-
- OUT_WRITE(SS_PIN, HIGH);
}
// Configure SPI for specified SPI speed
@@ -173,9 +171,7 @@ static SPISettings spiConfig;
* @details
*/
uint8_t spiRec() {
- SPI.beginTransaction(spiConfig);
uint8_t returnByte = SPI.transfer(0xFF);
- SPI.endTransaction();
return returnByte;
}
@@ -191,9 +187,7 @@ static SPISettings spiConfig;
void spiRead(uint8_t* buf, uint16_t nbyte) {
if (nbyte == 0) return;
memset(buf, 0xFF, nbyte);
- SPI.beginTransaction(spiConfig);
SPI.transfer(buf, nbyte);
- SPI.endTransaction();
}
/**
@@ -204,9 +198,7 @@ static SPISettings spiConfig;
* @details
*/
void spiSend(uint8_t b) {
- SPI.beginTransaction(spiConfig);
SPI.transfer(b);
- SPI.endTransaction();
}
/**
@@ -219,10 +211,8 @@ static SPISettings spiConfig;
*/
void spiSendBlock(uint8_t token, const uint8_t* buf) {
uint8_t rxBuf[512];
- SPI.beginTransaction(spiConfig);
SPI.transfer(token);
SPI.transfer((uint8_t*)buf, &rxBuf, 512);
- SPI.endTransaction();
}
#endif // SOFTWARE_SPI
diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp
index d7f9264be6c9..5920334bb101 100644
--- a/Marlin/src/HAL/STM32F1/HAL.cpp
+++ b/Marlin/src/HAL/STM32F1/HAL.cpp
@@ -97,6 +97,9 @@ const uint8_t adc_pins[] = {
#if HAS_TEMP_ADC_0
TEMP_0_PIN,
#endif
+ #if HAS_TEMP_ADC_PROBE
+ TEMP_PROBE_PIN,
+ #endif
#if HAS_HEATED_BED
TEMP_BED_PIN,
#endif
@@ -151,6 +154,9 @@ enum TempPinIndex : char {
#if HAS_TEMP_ADC_0
TEMP_0,
#endif
+ #if HAS_TEMP_ADC_PROBE
+ TEMP_PROBE,
+ #endif
#if HAS_HEATED_BED
TEMP_BED,
#endif
@@ -341,6 +347,9 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) {
#if HAS_TEMP_ADC_0
case TEMP_0_PIN: pin_index = TEMP_0; break;
#endif
+ #if HAS_TEMP_ADC_PROBE
+ case TEMP_PROBE_PIN: pin_index = TEMP_PROBE; break;
+ #endif
#if HAS_HEATED_BED
case TEMP_BED_PIN: pin_index = TEMP_BED; break;
#endif
diff --git a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp
index 4d72473e7f8e..550a79deaec5 100644
--- a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp
+++ b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp
@@ -24,9 +24,6 @@
/**
* Software SPI functions originally from Arduino Sd2Card Library
* Copyright (c) 2009 by William Greiman
- */
-
-/**
* Adapted to the STM32F1 HAL
*/
diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp
index 894abb882a64..f88fa8850788 100644
--- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp
+++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp
@@ -20,7 +20,7 @@
#include "../../../inc/MarlinConfig.h"
-#if BOTH(HAS_GRAPHICAL_LCD, FORCE_SOFT_SPI)
+#if BOTH(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI)
#include "../HAL.h"
#include
@@ -161,5 +161,5 @@ uint8_t u8g_com_HAL_STM32F1_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val,
return 1;
}
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
#endif // STM32F1
diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp
index f77306a88a17..658b7cd4a654 100644
--- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp
+++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp
@@ -25,6 +25,8 @@
* with simple implementations supplied by Marlin.
*/
+#ifdef __STM32F1__
+
#include "../../inc/MarlinConfig.h"
#if ENABLED(IIC_BL24CXX_EEPROM)
@@ -79,3 +81,4 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
}
#endif // IIC_BL24CXX_EEPROM
+#endif // __STM32F1__
diff --git a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp
index 33dd277addbe..ccc3fc537f1a 100644
--- a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp
+++ b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp
@@ -25,6 +25,8 @@
* Enable USE_SHARED_EEPROM if not supplied by the framework.
*/
+#ifdef __STM32F1__
+
#include "../../inc/MarlinConfig.h"
#if ENABLED(IIC_BL24CXX_EEPROM)
@@ -49,3 +51,4 @@ uint8_t eeprom_read_byte(uint8_t *pos) {
}
#endif // IIC_BL24CXX_EEPROM
+#endif // __STM32F1__
diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp
index b4699d00dcc0..fffd6ccaf01e 100644
--- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp
+++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp
@@ -17,17 +17,17 @@
* along with this program. If not, see .
*
*/
+
+/**
+ * HAL PersistentStore for STM32F1
+ */
+
#ifdef __STM32F1__
#include "../../inc/MarlinConfig.h"
#if USE_WIRED_EEPROM
-/**
- * PersistentStore for Arduino-style EEPROM interface
- * with simple implementations supplied by Marlin.
- */
-
#include "../shared/eeprom_if.h"
#include "../shared/eeprom_api.h"
diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp
index 6a4652e467fb..4f44f2ee905f 100644
--- a/Marlin/src/HAL/STM32F1/msc_sd.cpp
+++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp
@@ -13,7 +13,7 @@
* along with this program. If not, see .
*
*/
-#ifdef USE_USB_COMPOSITE
+#if defined(__STM32F1__) && defined(USE_USB_COMPOSITE)
#include "msc_sd.h"
#include "SPI.h"
@@ -77,4 +77,4 @@ void MSC_SD_init() {
#endif
}
-#endif // USE_USB_COMPOSITE
+#endif // __STM32F1__ && USE_USB_COMPOSITE
diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.cpp b/Marlin/src/HAL/STM32F1/onboard_sd.cpp
index 0440db9438a4..9c2b128ddc9a 100644
--- a/Marlin/src/HAL/STM32F1/onboard_sd.cpp
+++ b/Marlin/src/HAL/STM32F1/onboard_sd.cpp
@@ -9,9 +9,10 @@
* No restriction on use. You can use, modify and redistribute it for
* personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY.
* Redistributions of source code must retain the above copyright notice.
- *
*/
+#ifdef __STM32F1__
+
#include "../../inc/MarlinConfig.h"
#if SD_CONNECTION_IS(ONBOARD)
@@ -554,3 +555,4 @@ DRESULT disk_read (
#endif // _DISKIO_IOCTL
#endif // SD_CONNECTION_IS(ONBOARD)
+#endif // __STM32F1__
diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp
index 069be7ad54e3..008301d9bc0c 100644
--- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp
+++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp
@@ -89,6 +89,16 @@ void TFT_FSMC::Init() {
uint8_t cs = FSMC_CS_PIN, rs = FSMC_RS_PIN;
uint32_t controllerAddress;
+ #if PIN_EXISTS(TFT_BACKLIGHT)
+ OUT_WRITE(TFT_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT));
+ #endif
+
+ #if ENABLED(LCD_USE_DMA_FSMC)
+ dma_init(FSMC_DMA_DEV);
+ dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+ dma_set_priority(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, DMA_PRIORITY_MEDIUM);
+ #endif
+
#if PIN_EXISTS(TFT_RESET)
OUT_WRITE(TFT_RESET_PIN, HIGH);
delay(100);
diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp
index 4d116f440b8e..df3d40f159a7 100644
--- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp
+++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp
@@ -22,7 +22,6 @@
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
- *
*/
#if defined(STM32GENERIC) && defined(STM32F7)
@@ -662,7 +661,6 @@ boolean TMC26XStepper::isEnabled() { return !!(chopper_config_register & T_OFF_P
/**
* reads a value from the TMC26X status register. The value is not obtained directly but can then
* be read by the various status routines.
- *
*/
void TMC26XStepper::readStatus(char read_value) {
uint32_t old_driver_configuration_register_value = driver_configuration_register_value;
diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h
index f1d0133a3b14..208c3bc7e062 100644
--- a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h
+++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h
@@ -22,7 +22,6 @@
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
- *
*/
#pragma once
diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp
index d276a4c88084..8c3dd8337740 100644
--- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp
+++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp
@@ -20,9 +20,8 @@
*
*/
-
/**
- * Description: HAL for Teensy32 (MK20DX256)
+ * HAL for Teensy 3.2 (MK20DX256)
*/
#ifdef __MK20DX256__
diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h
index 31ceb8b87c9a..b434b9de7643 100644
--- a/Marlin/src/HAL/TEENSY31_32/HAL.h
+++ b/Marlin/src/HAL/TEENSY31_32/HAL.h
@@ -22,7 +22,7 @@
#pragma once
/**
- * Description: HAL for Teensy 3.5 and Teensy 3.6
+ * HAL for Teensy 3.2 (MK20DX256)
*/
#define CPU_32_BIT
@@ -44,8 +44,9 @@
//#undef MOTHERBOARD
//#define MOTHERBOARD BOARD_TEENSY31_32
-#ifdef __MK20DX256__
- #define IS_32BIT_TEENSY 1
+#define IS_32BIT_TEENSY 1
+#define IS_TEENSY_31_32 1
+#ifndef IS_TEENSY31
#define IS_TEENSY32 1
#endif
diff --git a/Marlin/src/HAL/TEENSY31_32/Servo.cpp b/Marlin/src/HAL/TEENSY31_32/Servo.cpp
index 544892cb7de4..19d57cf1b375 100644
--- a/Marlin/src/HAL/TEENSY31_32/Servo.cpp
+++ b/Marlin/src/HAL/TEENSY31_32/Servo.cpp
@@ -51,5 +51,4 @@ void libServo::move(const int value) {
}
#endif // HAS_SERVOS
-
#endif // __MK20DX256__
diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp
index f66313225562..cc5c56f7d550 100644
--- a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp
+++ b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp
@@ -23,8 +23,7 @@
#if USE_WIRED_EEPROM
/**
- * PersistentStore for Arduino-style EEPROM interface
- * with implementations supplied by the framework.
+ * HAL PersistentStore for Teensy 3.2 (MK20DX256)
*/
#include "../shared/eeprom_api.h"
diff --git a/Marlin/src/HAL/TEENSY31_32/timers.cpp b/Marlin/src/HAL/TEENSY31_32/timers.cpp
index bf756af8a128..7e01a38f8946 100644
--- a/Marlin/src/HAL/TEENSY31_32/timers.cpp
+++ b/Marlin/src/HAL/TEENSY31_32/timers.cpp
@@ -21,7 +21,7 @@
*/
/**
- * Teensy3.2 __MK20DX256__
+ * HAL Timers for Teensy 3.2 (MK20DX256)
*/
#ifdef __MK20DX256__
diff --git a/Marlin/src/HAL/TEENSY31_32/timers.h b/Marlin/src/HAL/TEENSY31_32/timers.h
index 4f004ef75191..135b32883084 100644
--- a/Marlin/src/HAL/TEENSY31_32/timers.h
+++ b/Marlin/src/HAL/TEENSY31_32/timers.h
@@ -22,8 +22,7 @@
#pragma once
/**
- * Description: HAL for
- * Teensy3.2 (__MK20DX256__)
+ * HAL Timers for Teensy 3.2 (MK20DX256)
*/
#include
diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp
index bcbee1d4c5ff..92907353b833 100644
--- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp
+++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp
@@ -21,7 +21,7 @@
*/
/**
- * Description: HAL for Teensy35 (MK64FX512)
+ * HAL for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
*/
#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h
index 11f0fb941e93..f454e7af5121 100644
--- a/Marlin/src/HAL/TEENSY35_36/HAL.h
+++ b/Marlin/src/HAL/TEENSY35_36/HAL.h
@@ -22,7 +22,7 @@
#pragma once
/**
- * Description: HAL for Teensy 3.5 and Teensy 3.6
+ * HAL for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
*/
#define CPU_32_BIT
@@ -45,13 +45,12 @@
// Defines
// ------------------------
-#ifdef __MK64FX512__
- #define IS_32BIT_TEENSY 1
- #define IS_TEENSY35 1
-#endif
+#define IS_32BIT_TEENSY 1
+#define IS_TEENSY_35_36 1
#ifdef __MK66FX1M0__
- #define IS_32BIT_TEENSY 1
#define IS_TEENSY36 1
+#else // __MK64FX512__
+ #define IS_TEENSY35 1
#endif
#define _MSERIAL(X) Serial##X
diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp
index 812aa90c83b3..b36900a32195 100644
--- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp
+++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp
@@ -19,6 +19,11 @@
* along with this program. If not, see .
*
*/
+
+/**
+ * HAL SPI for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
+ */
+
#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
#include "HAL.h"
diff --git a/Marlin/src/HAL/TEENSY35_36/Servo.cpp b/Marlin/src/HAL/TEENSY35_36/Servo.cpp
index d1390187a71e..033858594f6c 100644
--- a/Marlin/src/HAL/TEENSY35_36/Servo.cpp
+++ b/Marlin/src/HAL/TEENSY35_36/Servo.cpp
@@ -19,6 +19,11 @@
* along with this program. If not, see .
*
*/
+
+/**
+ * HAL Servo for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
+ */
+
#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
#include "../../inc/MarlinConfig.h"
@@ -51,5 +56,4 @@ void libServo::move(const int value) {
}
#endif // HAS_SERVOS
-
#endif // __MK64FX512__ || __MK66FX1M0__
diff --git a/Marlin/src/HAL/TEENSY35_36/Servo.h b/Marlin/src/HAL/TEENSY35_36/Servo.h
index ae904f0e2e62..719011f102a0 100644
--- a/Marlin/src/HAL/TEENSY35_36/Servo.h
+++ b/Marlin/src/HAL/TEENSY35_36/Servo.h
@@ -21,6 +21,10 @@
*/
#pragma once
+/**
+ * HAL Servo for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
+ */
+
#include
// Inherit and expand on core Servo library
diff --git a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp
index d2d7324cdd97..ccbdc6b11600 100644
--- a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp
+++ b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp
@@ -22,15 +22,14 @@
*/
#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
+/**
+ * HAL PersistentStore for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
+ */
+
#include "../../inc/MarlinConfig.h"
#if USE_WIRED_EEPROM
-/**
- * PersistentStore for Arduino-style EEPROM interface
- * with implementations supplied by the framework.
- */
-
#include "../shared/eeprom_api.h"
#include
diff --git a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h
index 92e22efc0fe6..87e6a7507abc 100644
--- a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h
+++ b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h
@@ -22,7 +22,7 @@
#pragma once
/**
- * Endstop Interrupts
+ * HAL Endstop Interrupts for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
*
* Without endstop interrupts the endstop pins must be polled continually in
* the temperature-ISR via endstops.update(), most of the time finding no change.
diff --git a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h
index e57c73c59558..e529fa93be16 100644
--- a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h
+++ b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h
@@ -18,6 +18,10 @@
*/
#pragma once
+/**
+ * HAL Pins Debugging for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
+ */
+
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin
diff --git a/Marlin/src/HAL/TEENSY35_36/spi_pins.h b/Marlin/src/HAL/TEENSY35_36/spi_pins.h
index 276d4f456a7f..c76344d07546 100644
--- a/Marlin/src/HAL/TEENSY35_36/spi_pins.h
+++ b/Marlin/src/HAL/TEENSY35_36/spi_pins.h
@@ -21,6 +21,10 @@
*/
#pragma once
+/**
+ * HAL SPI Pins for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
+ */
+
#define SCK_PIN 13
#define MISO_PIN 12
#define MOSI_PIN 11
diff --git a/Marlin/src/HAL/TEENSY35_36/timers.cpp b/Marlin/src/HAL/TEENSY35_36/timers.cpp
index 5725e83a85da..8067d091dd01 100644
--- a/Marlin/src/HAL/TEENSY35_36/timers.cpp
+++ b/Marlin/src/HAL/TEENSY35_36/timers.cpp
@@ -21,8 +21,7 @@
*/
/**
- * Teensy3.5 __MK64FX512__
- * Teensy3.6 __MK66FX1M0__
+ * HAL Timers for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
*/
#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
diff --git a/Marlin/src/HAL/TEENSY35_36/timers.h b/Marlin/src/HAL/TEENSY35_36/timers.h
index 68060d0e1c06..5c623cd80192 100644
--- a/Marlin/src/HAL/TEENSY35_36/timers.h
+++ b/Marlin/src/HAL/TEENSY35_36/timers.h
@@ -16,13 +16,12 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
+ *
*/
#pragma once
/**
- * Description: HAL for
- * Teensy3.5 (__MK64FX512__)
- * Teensy3.6 (__MK66FX1M0__)
+ * HAL Timers for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0)
*/
#include
diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp
index f5d37f5fc44d..5b1b4272f5ee 100644
--- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp
+++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp
@@ -21,7 +21,7 @@
*/
/**
- * Description: HAL for Teensy40 (IMXRT1062)
+ * HAL for Teensy 4.0 / 4.1 (IMXRT1062)
*/
#ifdef __IMXRT1062__
diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h
index b3b0144d134b..1aff6eed8e91 100644
--- a/Marlin/src/HAL/TEENSY40_41/HAL.h
+++ b/Marlin/src/HAL/TEENSY40_41/HAL.h
@@ -22,7 +22,7 @@
#pragma once
/**
- * Description: HAL for Teensy 4.0 and Teensy 4.1
+ * HAL for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
*/
#define CPU_32_BIT
@@ -45,8 +45,9 @@
// Defines
// ------------------------
-#ifdef __IMXRT1062__
- #define IS_32BIT_TEENSY 1
+#define IS_32BIT_TEENSY 1
+#define IS_TEENSY_40_41 1
+#ifndef IS_TEENSY40
#define IS_TEENSY41 1
#endif
diff --git a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp
index 9ccbb3a1f45b..20b472aa3515 100644
--- a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp
+++ b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp
@@ -19,6 +19,11 @@
* along with this program. If not, see .
*
*/
+
+/**
+ * HAL SPI for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
+ */
+
#ifdef __IMXRT1062__
#include "HAL.h"
diff --git a/Marlin/src/HAL/TEENSY40_41/Servo.cpp b/Marlin/src/HAL/TEENSY40_41/Servo.cpp
index e3d0d034499d..ffb1102b14f9 100644
--- a/Marlin/src/HAL/TEENSY40_41/Servo.cpp
+++ b/Marlin/src/HAL/TEENSY40_41/Servo.cpp
@@ -19,6 +19,11 @@
* along with this program. If not, see .
*
*/
+
+/**
+ * HAL Servo for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
+ */
+
#ifdef __IMXRT1062__
#include "../../inc/MarlinConfig.h"
@@ -53,5 +58,4 @@ void libServo::detach() {
}
#endif // HAS_SERVOS
-
#endif // __IMXRT1062__
diff --git a/Marlin/src/HAL/TEENSY40_41/Servo.h b/Marlin/src/HAL/TEENSY40_41/Servo.h
index ce910ed8a854..699fd700c943 100644
--- a/Marlin/src/HAL/TEENSY40_41/Servo.h
+++ b/Marlin/src/HAL/TEENSY40_41/Servo.h
@@ -21,6 +21,10 @@
*/
#pragma once
+/**
+ * HAL Servo for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
+ */
+
#include
// Inherit and expand on core Servo library
diff --git a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp
index 5491e04fbcc7..030a8c38af3f 100644
--- a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp
+++ b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp
@@ -27,8 +27,7 @@
#if USE_WIRED_EEPROM
/**
- * PersistentStore for Arduino-style EEPROM interface
- * with implementations supplied by the framework.
+ * HAL PersistentStore for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
*/
#include "../shared/eeprom_api.h"
diff --git a/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h
index 92e22efc0fe6..a05e911668a7 100644
--- a/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h
+++ b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h
@@ -22,7 +22,7 @@
#pragma once
/**
- * Endstop Interrupts
+ * HAL Endstop Interrupts for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
*
* Without endstop interrupts the endstop pins must be polled continually in
* the temperature-ISR via endstops.update(), most of the time finding no change.
diff --git a/Marlin/src/HAL/TEENSY40_41/fastio.h b/Marlin/src/HAL/TEENSY40_41/fastio.h
index 19b8114509b7..52f991dfb85f 100644
--- a/Marlin/src/HAL/TEENSY40_41/fastio.h
+++ b/Marlin/src/HAL/TEENSY40_41/fastio.h
@@ -23,7 +23,7 @@
#pragma once
/**
- * Fast I/O interfaces for Teensy 4
+ * Fast I/O interfaces for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
* These use GPIO functions instead of Direct Port Manipulation, as on AVR.
*/
diff --git a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h
index 890f66865011..4ad62d00fea5 100644
--- a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h
+++ b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h
@@ -18,6 +18,10 @@
*/
#pragma once
+/**
+ * HAL Pins Debugging for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
+ */
+
#warning "PINS_DEBUGGING is not fully supported for Teensy 4.0 / 4.1 so 'M43' may cause hangs."
#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS
diff --git a/Marlin/src/HAL/TEENSY40_41/spi_pins.h b/Marlin/src/HAL/TEENSY40_41/spi_pins.h
index 276d4f456a7f..d6f8d41bf6ce 100644
--- a/Marlin/src/HAL/TEENSY40_41/spi_pins.h
+++ b/Marlin/src/HAL/TEENSY40_41/spi_pins.h
@@ -21,6 +21,10 @@
*/
#pragma once
+/**
+ * HAL SPI Pins for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
+ */
+
#define SCK_PIN 13
#define MISO_PIN 12
#define MOSI_PIN 11
diff --git a/Marlin/src/HAL/TEENSY40_41/timers.cpp b/Marlin/src/HAL/TEENSY40_41/timers.cpp
index 15f5185a6ba0..81c9b08c17a5 100644
--- a/Marlin/src/HAL/TEENSY40_41/timers.cpp
+++ b/Marlin/src/HAL/TEENSY40_41/timers.cpp
@@ -21,7 +21,7 @@
*/
/**
- * Teensy4.0/4.1 (__IMXRT1062__)
+ * HAL Timers for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
*/
#ifdef __IMXRT1062__
diff --git a/Marlin/src/HAL/TEENSY40_41/timers.h b/Marlin/src/HAL/TEENSY40_41/timers.h
index 9c4bf8c274cc..7e4cd080cb88 100644
--- a/Marlin/src/HAL/TEENSY40_41/timers.h
+++ b/Marlin/src/HAL/TEENSY40_41/timers.h
@@ -16,12 +16,12 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
+ *
*/
#pragma once
/**
- * Description: HAL for
- * Teensy4.0/4.1 (__IMXRT1062__)
+ * HAL Timers for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
*/
#include
diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.cpp b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp
index 4253944f2b79..8b05ddb153eb 100644
--- a/Marlin/src/HAL/TEENSY40_41/watchdog.cpp
+++ b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp
@@ -19,6 +19,11 @@
* along with this program. If not, see .
*
*/
+
+/**
+ * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
+ */
+
#ifdef __IMXRT1062__
#include "../../inc/MarlinConfig.h"
@@ -48,5 +53,4 @@ void HAL_watchdog_refresh() {
}
#endif // USE_WATCHDOG
-
#endif // __IMXRT1062__
diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.h b/Marlin/src/HAL/TEENSY40_41/watchdog.h
index f10ecb5aef9c..03ab151b0706 100644
--- a/Marlin/src/HAL/TEENSY40_41/watchdog.h
+++ b/Marlin/src/HAL/TEENSY40_41/watchdog.h
@@ -22,7 +22,7 @@
#pragma once
/**
- * Watchdog for Teensy4.0/4.1 (__IMXRT1062__)
+ * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
*/
void watchdog_init();
diff --git a/Marlin/src/HAL/shared/HAL_ST7920.h b/Marlin/src/HAL/shared/HAL_ST7920.h
index 05e8a1f2c558..4e362f96ba55 100644
--- a/Marlin/src/HAL/shared/HAL_ST7920.h
+++ b/Marlin/src/HAL/shared/HAL_ST7920.h
@@ -27,7 +27,7 @@
* (bypassing U8G), it will allow the LIGHTWEIGHT_UI to operate.
*/
-#if BOTH(HAS_GRAPHICAL_LCD, LIGHTWEIGHT_UI)
+#if BOTH(HAS_MARLINUI_U8GLIB, LIGHTWEIGHT_UI)
void ST7920_cs();
void ST7920_ncs();
void ST7920_set_cmd();
diff --git a/Marlin/src/HAL/shared/servo.cpp b/Marlin/src/HAL/shared/servo.cpp
index d69cf2fe2c8f..cfec6f301737 100644
--- a/Marlin/src/HAL/shared/servo.cpp
+++ b/Marlin/src/HAL/shared/servo.cpp
@@ -48,7 +48,6 @@
* readMicroseconds() - Get the last-written servo pulse width in microseconds.
* attached() - Return true if a servo is attached.
* detach() - Stop an attached servo from pulsing its i/o pin.
- *
*/
#include "../../inc/MarlinConfig.h"
diff --git a/Marlin/src/HAL/shared/servo.h b/Marlin/src/HAL/shared/servo.h
index ccaf1f0255df..6d850da851d2 100644
--- a/Marlin/src/HAL/shared/servo.h
+++ b/Marlin/src/HAL/shared/servo.h
@@ -41,7 +41,6 @@
*/
/**
- *
* A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method.
* The servos are pulsed in the background using the value most recently written using the write() method
*
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index c6c6ef9b0db5..672858d05a35 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -1048,6 +1048,11 @@ void setup() {
SERIAL_ECHO_MSG("Compiled: " __DATE__);
SERIAL_ECHO_MSG(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE));
+ // Init buzzer pin(s)
+ #if USE_BEEPER
+ SETUP_RUN(buzzer.init());
+ #endif
+
// Set up LEDs early
#if HAS_COLOR_LEDS
SETUP_RUN(leds.setup());
@@ -1072,7 +1077,7 @@ void setup() {
DWIN_UpdateLCD(); // Show bootscreen (first image)
#else
SETUP_RUN(ui.init());
- #if HAS_SPI_LCD && ENABLED(SHOW_BOOTSCREEN)
+ #if HAS_WIRED_LCD && ENABLED(SHOW_BOOTSCREEN)
SETUP_RUN(ui.show_bootscreen());
#endif
SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.)
diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h
index 0bcf799ac31d..a644ab2fc8be 100644
--- a/Marlin/src/core/language.h
+++ b/Marlin/src/core/language.h
@@ -303,7 +303,7 @@
#define LCD_STR_C STR_C
#define LCD_STR_E STR_E
-#if HAS_CHARACTER_LCD
+#if HAS_MARLINUI_HD44780
// Custom characters defined in the first 8 characters of the LCD
#define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string!
@@ -348,7 +348,6 @@
* However, internal to Marlin E0/T0 is the first tool, and
* most board silkscreens say "E0." Zero-based labels will
* make these indexes consistent but this defies expectation.
- *
*/
#if ENABLED(NUMBER_TOOLS_FROM_0)
#define LCD_FIRST_TOOL 0
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
index 9fc9ec099e8b..dc91b7d6b185 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
@@ -997,6 +997,10 @@
if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point
+ #if IS_TFTGLCD_PANEL
+ ui.ubl_plot(lpos.x, lpos.y); // update plot screen
+ #endif
+
ui.refresh();
float new_z = z_values[lpos.x][lpos.y];
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
index 63559e0bb88e..010b5951be5f 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp
@@ -236,9 +236,7 @@
}
/**
- *
* Generic case of a line crossing both X and Y Mesh lines.
- *
*/
xy_int8_t cnt = (istart - iend).ABS();
diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp
index f67d50a6e038..8a3e959e0702 100644
--- a/Marlin/src/feature/encoder_i2c.cpp
+++ b/Marlin/src/feature/encoder_i2c.cpp
@@ -816,7 +816,6 @@ int8_t I2CPositionEncodersMgr::parse() {
* Y Report on Y axis encoder, if present.
* Z Report on Z axis encoder, if present.
* E Report on E axis encoder, if present.
- *
*/
void I2CPositionEncodersMgr::M860() {
if (parse()) return;
@@ -846,7 +845,6 @@ void I2CPositionEncodersMgr::M860() {
* Y Report on Y axis encoder, if present.
* Z Report on Z axis encoder, if present.
* E Report on E axis encoder, if present.
- *
*/
void I2CPositionEncodersMgr::M861() {
if (parse()) return;
@@ -875,7 +873,6 @@ void I2CPositionEncodersMgr::M861() {
* Y Report on Y axis encoder, if present.
* Z Report on Z axis encoder, if present.
* E Report on E axis encoder, if present.
- *
*/
void I2CPositionEncodersMgr::M862() {
if (parse()) return;
@@ -905,7 +902,6 @@ void I2CPositionEncodersMgr::M862() {
* Y Report on Y axis encoder, if present.
* Z Report on Z axis encoder, if present.
* E Report on E axis encoder, if present.
- *
*/
void I2CPositionEncodersMgr::M863() {
if (parse()) return;
diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp
index 31fa529d56b1..3d635369e438 100644
--- a/Marlin/src/feature/mmu2/mmu2.cpp
+++ b/Marlin/src/feature/mmu2/mmu2.cpp
@@ -340,17 +340,17 @@ void MMU2::mmu_loop() {
#endif
if (rx_ok()) {
- // response to C0 mmu command in PRUSA_MMU2_S_MODE
+ // Response to C0 mmu command in PRUSA_MMU2_S_MODE
bool can_reset = true;
- if (ENABLED(PRUSA_MMU2_S_MODE) && last_cmd == MMU_CMD_C0) {
- if (!mmu2s_triggered) {
+ #if ENABLED(PRUSA_MMU2_S_MODE)
+ if (!mmu2s_triggered && last_cmd == MMU_CMD_C0) {
can_reset = false;
// MMU ok received but filament sensor not triggered, retrying...
DEBUG_ECHOLNPGM("MMU => 'ok' (filament not present in gears)");
DEBUG_ECHOLNPGM("MMU <= 'C0' (keep trying)");
MMU2_COMMAND("C0");
}
- }
+ #endif
if (can_reset) {
DEBUG_ECHOLNPGM("MMU => 'ok'");
ready = true;
@@ -710,13 +710,11 @@ void MMU2::tool_change(const uint8_t index) {
}
/**
- *
* Handle special T?/Tx/Tc commands
*
* T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically
* Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load.
* Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
- *
*/
void MMU2::tool_change(const char* special) {
if (!enabled) return;
@@ -922,9 +920,7 @@ void MMU2::filament_runout() {
}
/**
- *
* Switch material and load to nozzle
- *
*/
bool MMU2::load_filament_to_nozzle(const uint8_t index) {
diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp
index f8a7d83260e2..a36ff5075683 100644
--- a/Marlin/src/feature/pause.cpp
+++ b/Marlin/src/feature/pause.cpp
@@ -612,11 +612,13 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le
// Retract to prevent oozing
unscaled_e_move(-(PAUSE_PARK_RETRACT_LENGTH), feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE));
- // Move XY to starting position, then Z
- do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE));
+ if (!axes_should_home()) {
+ // Move XY to starting position, then Z
+ do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE));
- // Move Z_AXIS to saved position
- do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
+ // Move Z_AXIS to saved position
+ do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
+ }
// Unretract
unscaled_e_move(PAUSE_PARK_RETRACT_LENGTH, feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE));
diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp
index bf5ac748a86e..af31d156fc84 100644
--- a/Marlin/src/feature/power_monitor.cpp
+++ b/Marlin/src/feature/power_monitor.cpp
@@ -44,7 +44,7 @@ uint8_t PowerMonitor::display_item;
PowerMonitor power_monitor; // Single instance - this calls the constructor
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#if ENABLED(POWER_MONITOR_CURRENT)
void PowerMonitor::draw_current() {
@@ -70,6 +70,6 @@ PowerMonitor power_monitor; // Single instance - this calls the constructor
}
#endif
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
#endif // HAS_POWER_MONITOR
diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h
index a86bd07ec4d1..a0eaf353f4c7 100644
--- a/Marlin/src/feature/power_monitor.h
+++ b/Marlin/src/feature/power_monitor.h
@@ -88,8 +88,8 @@ class PowerMonitor {
FORCE_INLINE static float getPower() { return getAmps() * getVolts(); }
#endif
- #if HAS_SPI_LCD
- #if HAS_GRAPHICAL_LCD && DISABLED(LIGHTWEIGHT_UI)
+ #if HAS_WIRED_LCD
+ #if HAS_MARLINUI_U8GLIB && DISABLED(LIGHTWEIGHT_UI)
FORCE_INLINE static bool display_enabled() { return flags != 0x00; }
#endif
#if ENABLED(POWER_MONITOR_CURRENT)
diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp
index ed3a4b9fadea..e4bc605bb55f 100644
--- a/Marlin/src/feature/powerloss.cpp
+++ b/Marlin/src/feature/powerloss.cpp
@@ -112,8 +112,7 @@ void PrintJobRecovery::check() {
if (card.isMounted()) {
load();
if (!valid()) return cancel();
- queue.inject_P(PSTR("M1000 S"));
- TERN_(DWIN_CREALITY_LCD, dwin_flag = true);
+ queue.inject_P(PSTR("M1000S"));
}
}
@@ -227,6 +226,10 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/
// Elapsed print job time
info.print_job_elapsed = print_job_timer.duration();
+ // Misc. Marlin flags
+ info.flag.dryrun = !!(marlin_debug_flags & MARLIN_DEBUG_DRYRUN);
+ info.flag.allow_cold_extrusion = TERN0(PREVENT_COLD_EXTRUSION, thermalManager.allow_cold_extrude);
+
write();
}
}
@@ -326,6 +329,12 @@ void PrintJobRecovery::resume() {
const uint32_t resume_sdpos = info.sdpos; // Get here before the stepper ISR overwrites it
+ // Apply the dry-run flag if enabled
+ if (info.flag.dryrun) marlin_debug_flags |= MARLIN_DEBUG_DRYRUN;
+
+ // Restore cold extrusion permission
+ TERN_(PREVENT_COLD_EXTRUSION, thermalManager.allow_cold_extrude = info.flag.allow_cold_extrusion);
+
#if HAS_LEVELING
// Make sure leveling is off before any G92 and G28
gcode.process_subcommands_now_P(PSTR("M420 S0 Z0"));
@@ -337,7 +346,7 @@ void PrintJobRecovery::resume() {
// If Z homing goes to max, just reset E and home all
gcode.process_subcommands_now_P(PSTR(
"G92.9 E0\n"
- "G28R0" TERN_(MARLIN_DEV_MODE, "S")
+ "G28R0"
));
#else // "G92.9 E0 ..."
@@ -358,8 +367,9 @@ void PrintJobRecovery::resume() {
gcode.process_subcommands_now_P(PSTR(
"G28R0" // No raise during G28
- TERN_(MARLIN_DEV_MODE, "S") // Simulated Homing
- TERN_(IS_CARTESIAN, "XY") // Don't home Z on Cartesian
+ #if IS_CARTESIAN && DISABLED(POWER_LOSS_RECOVER_ZHOME)
+ "XY" // Don't home Z on Cartesian unless overridden
+ #endif
));
#endif
@@ -367,6 +377,12 @@ void PrintJobRecovery::resume() {
// Pretend that all axes are homed
set_all_homed();
+ #if ENABLED(POWER_LOSS_RECOVER_ZHOME)
+ // Z has been homed so restore Z to ZsavedPos + POWER_LOSS_ZRAISE
+ sprintf_P(cmd, PSTR("G1 F500 Z%s"), dtostrf(info.current_position.z + POWER_LOSS_ZRAISE, 1, 3, str_1));
+ gcode.process_subcommands_now(cmd);
+ #endif
+
// Recover volumetric extrusion state
#if DISABLED(NO_VOLUMETRICS)
#if HAS_MULTI_EXTRUDER
@@ -473,7 +489,7 @@ void PrintJobRecovery::resume() {
// Move back to the saved Z
dtostrf(info.current_position.z, 1, 3, str_1);
- #if Z_HOME_DIR > 0
+ #if Z_HOME_DIR > 0 || ENABLED(POWER_LOSS_RECOVER_ZHOME)
sprintf_P(cmd, PSTR("G1 Z%s F200"), str_1);
#else
gcode.process_subcommands_now_P(PSTR("G1 Z0 F200"));
@@ -498,6 +514,14 @@ void PrintJobRecovery::resume() {
LOOP_XYZ(i) update_workspace_offset((AxisEnum)i);
#endif
+ #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
+ const uint8_t old_flags = marlin_debug_flags;
+ marlin_debug_flags |= MARLIN_DEBUG_ECHO;
+ #endif
+
+ // Continue to apply PLR when a file is resumed!
+ enable(true);
+
// Resume the SD file from the last position
char *fn = info.sd_filename;
extern const char M23_STR[];
@@ -505,6 +529,8 @@ void PrintJobRecovery::resume() {
gcode.process_subcommands_now(cmd);
sprintf_P(cmd, PSTR("M24 S%ld T%ld"), resume_sdpos, info.print_job_elapsed);
gcode.process_subcommands_now(cmd);
+
+ TERN_(DEBUG_POWER_LOSS_RECOVERY, marlin_debug_flags = old_flags);
}
#if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
@@ -584,6 +610,8 @@ void PrintJobRecovery::resume() {
DEBUG_ECHOLNPAIR("sd_filename: ", info.sd_filename);
DEBUG_ECHOLNPAIR("sdpos: ", info.sdpos);
DEBUG_ECHOLNPAIR("print_job_elapsed: ", info.print_job_elapsed);
+ DEBUG_ECHOLNPAIR("dryrun: ", int(info.flag.dryrun));
+ DEBUG_ECHOLNPAIR("allow_cold_extrusion: ", int(info.flag.allow_cold_extrusion));
}
else
DEBUG_ECHOLNPGM("INVALID DATA");
diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h
index 1943175b0564..e31b2ec915c3 100644
--- a/Marlin/src/feature/powerloss.h
+++ b/Marlin/src/feature/powerloss.h
@@ -107,6 +107,12 @@ typedef struct {
// Job elapsed time
millis_t print_job_elapsed;
+ // Misc. Marlin flags
+ struct {
+ bool dryrun:1; // M111 S8
+ bool allow_cold_extrusion:1; // M302 P1
+ } flag;
+
uint8_t valid_foot;
bool valid() { return valid_head && valid_head == valid_foot; }
@@ -173,7 +179,10 @@ class PrintJobRecovery {
}
#endif
- static inline bool valid() { return info.valid(); }
+ // The referenced file exists
+ static inline bool interrupted_file_exists() { return card.fileExists(info.sd_filename); }
+
+ static inline bool valid() { return info.valid() && interrupted_file_exists(); }
#if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
static void debug(PGM_P const prefix);
diff --git a/Marlin/src/feature/twibus.h b/Marlin/src/feature/twibus.h
index 8bc8eb4e74d7..82aa9aa16a2a 100644
--- a/Marlin/src/feature/twibus.h
+++ b/Marlin/src/feature/twibus.h
@@ -48,7 +48,6 @@ typedef void (*twiRequestFunc_t)();
* For more information see
* - https://marlinfw.org/docs/gcode/M260.html
* - https://marlinfw.org/docs/gcode/M261.html
- *
*/
class TWIBus {
private:
diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp
index cd0dbb13cdcb..c66d4a7d4974 100644
--- a/Marlin/src/gcode/bedlevel/G26.cpp
+++ b/Marlin/src/gcode/bedlevel/G26.cpp
@@ -359,7 +359,7 @@ inline bool turn_on_heaters() {
#if HAS_HEATED_BED
if (g26_bed_temp > 25) {
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
ui.set_status_P(GET_TEXT(MSG_G26_HEATING_BED), 99);
ui.quick_feedback();
TERN_(HAS_LCD_MENU, ui.capture());
@@ -378,7 +378,7 @@ inline bool turn_on_heaters() {
#endif // HAS_HEATED_BED
// Start heating the active nozzle
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
ui.set_status_P(GET_TEXT(MSG_G26_HEATING_NOZZLE), 99);
ui.quick_feedback();
#endif
@@ -391,7 +391,7 @@ inline bool turn_on_heaters() {
#endif
)) return G26_ERR;
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
ui.reset_status();
ui.quick_feedback();
#endif
@@ -446,7 +446,7 @@ inline bool prime_nozzle() {
else
#endif
{
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
ui.set_status_P(GET_TEXT(MSG_G26_FIXED_LENGTH), 99);
ui.quick_feedback();
#endif
diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp
index 926e6e82c535..bd7f4f0411e1 100755
--- a/Marlin/src/gcode/bedlevel/G35.cpp
+++ b/Marlin/src/gcode/bedlevel/G35.cpp
@@ -157,7 +157,7 @@ void GcodeSuite::G35() {
const int minutes = trunc(decimal_part * 60.0f);
SERIAL_ECHOPAIR("Turn ", tramming_point_name[i],
- " ", (screw_thread & 1) == (adjust > 0) ? "Counter-Clockwise" : "Clockwise",
+ " ", (screw_thread & 1) == (adjust > 0) ? "CCW" : "CW",
" by ", abs(full_turns), " turns");
if (minutes) SERIAL_ECHOPAIR(" and ", abs(minutes), " minutes");
SERIAL_EOL();
diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp
index 9bb1ebe23819..e9b6e0e3a6db 100644
--- a/Marlin/src/gcode/bedlevel/abl/G29.cpp
+++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp
@@ -160,7 +160,6 @@
* E By default G29 will engage the Z probe, test the bed, then disengage.
* Include "E" to engage/disengage the Z probe for each sample.
* There's no extra effect if you have a fixed Z probe.
- *
*/
G29_TYPE GcodeSuite::G29() {
diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp
index 68ac459ebb43..5da99386adc5 100644
--- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp
+++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp
@@ -57,7 +57,6 @@ inline void echo_not_entered(const char c) { SERIAL_CHAR(c); SERIAL_ECHOLNPGM("
* S3 In Jn Zn.nn Manually modify a single point
* S4 Zn.nn Set z offset. Positive away from bed, negative closer to bed.
* S5 Reset and disable mesh
- *
*/
void GcodeSuite::G29() {
diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp
index be222a7b1724..7bc40b2127c4 100644
--- a/Marlin/src/gcode/calibrate/G28.cpp
+++ b/Marlin/src/gcode/calibrate/G28.cpp
@@ -192,7 +192,6 @@
* X Home to the X endstop
* Y Home to the Y endstop
* Z Home to the Z endstop
- *
*/
void GcodeSuite::G28() {
DEBUG_SECTION(log_G28, "G28", DEBUGGING(LEVELING));
diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp
index 5ec709fb4002..9ac2380e7964 100644
--- a/Marlin/src/gcode/calibrate/M100.cpp
+++ b/Marlin/src/gcode/calibrate/M100.cpp
@@ -60,7 +60,7 @@
#define TEST_BYTE ((char) 0xE5)
-#if defined(__AVR__) || IS_32BIT_TEENSY
+#if EITHER(__AVR__, IS_32BIT_TEENSY)
extern char __bss_end;
char *end_bss = &__bss_end,
diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp
index 88273b46e46e..8640dfa39166 100644
--- a/Marlin/src/gcode/calibrate/M48.cpp
+++ b/Marlin/src/gcode/calibrate/M48.cpp
@@ -144,7 +144,7 @@ void GcodeSuite::M48() {
float sample_sum = 0.0;
LOOP_L_N(n, n_samples) {
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
// Display M48 progress in the status bar
ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples));
#endif
@@ -258,7 +258,7 @@ void GcodeSuite::M48() {
SERIAL_ECHOLNPGM("Finished!");
dev_report(verbose_level > 0, mean, sigma, min, max, true);
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
// Display M48 results in the status bar
char sigma_str[8];
ui.status_printf_P(0, PSTR(S_FMT ": %s"), GET_TEXT(MSG_M48_DEVIATION), dtostrf(sigma, 2, 6, sigma_str));
diff --git a/Marlin/src/gcode/control/M999.cpp b/Marlin/src/gcode/control/M999.cpp
index 53d74322a39a..3bd908cad640 100644
--- a/Marlin/src/gcode/control/M999.cpp
+++ b/Marlin/src/gcode/control/M999.cpp
@@ -34,7 +34,6 @@
*
* Sending "M999 S1" will resume printing without flushing the
* existing command buffer.
- *
*/
void GcodeSuite::M999() {
marlin_state = MF_RUNNING;
diff --git a/Marlin/src/gcode/feature/L6470/M906.cpp b/Marlin/src/gcode/feature/L6470/M906.cpp
index cd7fc3dcb5d1..7bd446a1ab77 100644
--- a/Marlin/src/gcode/feature/L6470/M906.cpp
+++ b/Marlin/src/gcode/feature/L6470/M906.cpp
@@ -33,7 +33,6 @@
#include "../../../core/debug_out.h"
/**
- *
* M906: report or set KVAL_HOLD which sets the maximum effective voltage provided by the
* PWMs to the steppers
*
@@ -56,7 +55,6 @@
*
* L6470 is used in the STEP-CLOCK mode. KVAL_HOLD is the only KVAL_xxx
* that affects the effective voltage seen by the stepper.
- *
*/
/**
diff --git a/Marlin/src/gcode/feature/L6470/M916-918.cpp b/Marlin/src/gcode/feature/L6470/M916-918.cpp
index 29efc06dd9c7..8165b71e4490 100644
--- a/Marlin/src/gcode/feature/L6470/M916-918.cpp
+++ b/Marlin/src/gcode/feature/L6470/M916-918.cpp
@@ -37,7 +37,6 @@
#include "../../../core/debug_out.h"
/**
- *
* M916: increase KVAL_HOLD until get thermal warning
* NOTE - on L6474 it is TVAL that is used
*
@@ -62,7 +61,6 @@
*
* D - time (in seconds) to run each setting of KVAL_HOLD/TVAL
* optional - defaults to zero (runs each setting once)
- *
*/
/**
@@ -187,7 +185,6 @@ void GcodeSuite::M916() {
}
/**
- *
* M917: Find minimum current thresholds
*
* Decrease OCD current until overcurrent error
@@ -214,7 +211,6 @@ void GcodeSuite::M916() {
*
* K - value for KVAL_HOLD (0 - 255) (ignored for L6474)
* optional - will report current value from driver if not specified
- *
*/
void GcodeSuite::M917() {
@@ -522,7 +518,6 @@ void GcodeSuite::M917() {
}
/**
- *
* M918: increase speed until error or max feedrate achieved (as shown in configuration.h))
*
* J - select which driver(s) to monitor on multi-driver axis
@@ -543,7 +538,6 @@ void GcodeSuite::M917() {
*
* M - value for microsteps (1 - 128) (optional)
* optional - will report current value from driver if not specified
- *
*/
void GcodeSuite::M918() {
diff --git a/Marlin/src/gcode/feature/i2c/M260_M261.cpp b/Marlin/src/gcode/feature/i2c/M260_M261.cpp
index 13c2cd1d10ed..526d9101e1c7 100644
--- a/Marlin/src/gcode/feature/i2c/M260_M261.cpp
+++ b/Marlin/src/gcode/feature/i2c/M260_M261.cpp
@@ -42,7 +42,6 @@
*
* M260 S1 ; Send the buffered data and reset the buffer
* M260 R1 ; Reset the buffer without sending data
- *
*/
void GcodeSuite::M260() {
// Set the target address
diff --git a/Marlin/src/gcode/feature/pause/M603.cpp b/Marlin/src/gcode/feature/pause/M603.cpp
index c40f3ae6e136..9c3b774bd2b2 100644
--- a/Marlin/src/gcode/feature/pause/M603.cpp
+++ b/Marlin/src/gcode/feature/pause/M603.cpp
@@ -39,7 +39,6 @@
* T[toolhead] - Select extruder to configure, active extruder if not specified
* U[distance] - Retract distance for removal, for the specified extruder
* L[distance] - Extrude distance for insertion, for the specified extruder
- *
*/
void GcodeSuite::M603() {
diff --git a/Marlin/src/gcode/feature/power_monitor/M430.cpp b/Marlin/src/gcode/feature/power_monitor/M430.cpp
index a669f0a76b42..7639ea962d9b 100644
--- a/Marlin/src/gcode/feature/power_monitor/M430.cpp
+++ b/Marlin/src/gcode/feature/power_monitor/M430.cpp
@@ -38,7 +38,7 @@
*/
void GcodeSuite::M430() {
bool do_report = true;
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
#if ENABLED(POWER_MONITOR_CURRENT)
if (parser.seen('I')) { power_monitor.set_current_display(parser.value_bool()); do_report = false; }
#endif
diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp
index 58e810e5d075..e9477dd2fbf3 100644
--- a/Marlin/src/gcode/feature/powerloss/M1000.cpp
+++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp
@@ -62,6 +62,8 @@ void GcodeSuite::M1000() {
if (parser.seen('S')) {
#if HAS_LCD_MENU
ui.goto_screen(menu_job_recovery);
+ #elif ENABLED(DWIN_CREALITY_LCD)
+ recovery.dwin_flag = true;
#elif ENABLED(EXTENSIBLE_UI)
ExtUI::onPowerLossResume();
#else
diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp
index 5a08053e7c9d..3538ccaa6e07 100644
--- a/Marlin/src/gcode/feature/powerloss/M413.cpp
+++ b/Marlin/src/gcode/feature/powerloss/M413.cpp
@@ -50,6 +50,7 @@ void GcodeSuite::M413() {
if (parser.seen("RL")) recovery.load();
if (parser.seen('W')) recovery.save(true);
if (parser.seen('P')) recovery.purge();
+ if (parser.seen('D')) recovery.debug(PSTR("M413"));
#if PIN_EXISTS(POWER_LOSS)
if (parser.seen('O')) recovery._outage();
#endif
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index 085f6b361895..425a85736932 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -289,7 +289,6 @@
* "T" Codes
*
* T0-T3 - Select an extruder (tool) by index: "T F"
- *
*/
#include "../inc/MarlinConfig.h"
diff --git a/Marlin/src/gcode/sd/M32.cpp b/Marlin/src/gcode/sd/M32.cpp
index a6f9fbcd8db1..55ec6ea49741 100644
--- a/Marlin/src/gcode/sd/M32.cpp
+++ b/Marlin/src/gcode/sd/M32.cpp
@@ -38,7 +38,6 @@
* M32 !PATH/TO/FILE.GCO# ; Start FILE.GCO
* M32 P !PATH/TO/FILE.GCO# ; Start FILE.GCO as a procedure
* M32 S60 !PATH/TO/FILE.GCO# ; Start FILE.GCO at byte 60
- *
*/
void GcodeSuite::M32() {
if (IS_SD_PRINTING()) planner.synchronize();
diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h
index 95c93beb9ec1..d2c939b9b448 100644
--- a/Marlin/src/inc/Conditionals_LCD.h
+++ b/Marlin/src/inc/Conditionals_LCD.h
@@ -217,6 +217,28 @@
#define LCD_WIDTH 16
#define LCD_HEIGHT 2
+#elif EITHER(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C)
+
+ #define IS_TFTGLCD_PANEL 1
+ #define IS_ULTIPANEL // Note that IS_ULTIPANEL leads to HAS_WIRED_LCD
+
+ #if ENABLED(SDSUPPORT) && DISABLED(LCD_PROGRESS_BAR)
+ #define LCD_PROGRESS_BAR
+ #endif
+ #if ENABLED(TFTGLCD_PANEL_I2C)
+ #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD for I2C and SPI buses (LiquidTWI2 not required)
+ #define LCD_I2C_ADDRESS 0x27 // Must be equal to panel's I2C slave addres
+ #endif
+ #define STD_ENCODER_PULSES_PER_STEP 2
+ #define STD_ENCODER_STEPS_PER_MENU_ITEM 1
+ #define LCD_WIDTH 20 // 20 or 24 chars in line
+ #define LCD_HEIGHT 10 // Character lines
+ #define LCD_CONTRAST_MIN 127
+ #define LCD_CONTRAST_MAX 255
+ #define DEFAULT_LCD_CONTRAST 250
+ #define CONVERT_TO_EXT_ASCII // Use extended 128-255 symbols from ASCII table.
+ // At this time present conversion only for cyrillic - bg, ru and uk languages.
+ // First 7 ASCII symbols in panel font must be replaced with Marlin's special symbols.
#endif
#if ENABLED(IS_RRD_FG_SC)
@@ -456,11 +478,13 @@
#endif
#if ENABLED(ULTRA_LCD)
- #define HAS_SPI_LCD 1
+ #define HAS_WIRED_LCD 1
#if ENABLED(DOGLCD)
- #define HAS_GRAPHICAL_LCD 1
+ #define HAS_MARLINUI_U8GLIB 1
+ #elif IS_TFTGLCD_PANEL
+ // Neither DOGM nor HD44780. Fully customized interface.
#elif DISABLED(HAS_GRAPHICAL_TFT)
- #define HAS_CHARACTER_LCD 1
+ #define HAS_MARLINUI_HD44780 1
#endif
#endif
@@ -471,7 +495,7 @@
#define HAS_ADC_BUTTONS 1
#endif
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#ifndef LCD_PIXEL_WIDTH
#define LCD_PIXEL_WIDTH 128
#endif
@@ -488,7 +512,6 @@
* HOTENDS - Number of hotends, whether connected or separate
* E_STEPPERS - Number of actual E stepper motors
* E_MANUAL - Number of E steppers for LCD move options
- *
*/
#if EXTRUDERS == 0
diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h
index c9a29b351cbb..80c42955e92d 100644
--- a/Marlin/src/inc/Conditionals_post.h
+++ b/Marlin/src/inc/Conditionals_post.h
@@ -313,11 +313,15 @@
#elif ENABLED(MAKRPANEL)
#define _LCD_CONTRAST_INIT 17
#elif ENABLED(MINIPANEL)
- #define _LCD_CONTRAST_INIT 150
+ #define _LCD_CONTRAST_INIT 150
#elif ENABLED(ZONESTAR_12864OLED)
#define _LCD_CONTRAST_MIN 64
#define _LCD_CONTRAST_INIT 128
#define _LCD_CONTRAST_MAX 255
+#elif IS_TFTGLCD_PANEL
+ #define _LCD_CONTRAST_MIN 0
+ #define _LCD_CONTRAST_INIT 250
+ #define _LCD_CONTRAST_MAX 255
#endif
#ifdef _LCD_CONTRAST_INIT
@@ -2453,9 +2457,9 @@
/**
* Buzzer/Speaker
*/
-#if PIN_EXISTS(BEEPER) || EITHER(LCD_USE_I2C_BUZZER, PCA9632_BUZZER)
+#if PIN_EXISTS(BEEPER) || ANY(LCD_USE_I2C_BUZZER, PCA9632_BUZZER, IS_TFTGLCD_PANEL)
#define HAS_BUZZER 1
- #if NONE(LCD_USE_I2C_BUZZER, PCA9632_BUZZER)
+ #if PIN_EXISTS(BEEPER)
#define USE_BEEPER 1
#endif
#endif
@@ -2483,7 +2487,7 @@
/**
* Make sure DOGLCD_SCK and DOGLCD_MOSI are defined.
*/
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#ifndef DOGLCD_SCK
#define DOGLCD_SCK SCK_PIN
#endif
@@ -2604,17 +2608,17 @@
#define HAS_FOLDER_SORTING 1
#endif
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
// Get LCD character width/height, which may be overridden by pins, configs, etc.
#ifndef LCD_WIDTH
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#define LCD_WIDTH 21
#else
#define LCD_WIDTH TERN(ULTIPANEL, 20, 16)
#endif
#endif
#ifndef LCD_HEIGHT
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#define LCD_HEIGHT 5
#else
#define LCD_HEIGHT TERN(ULTIPANEL, 4, 2)
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index 1cb8bcd7e902..5bd6ef7c7860 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -680,7 +680,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
* LCD Info Screen Style
*/
#if LCD_INFO_SCREEN_STYLE > 0
- #if HAS_GRAPHICAL_LCD || LCD_WIDTH < 20 || LCD_HEIGHT < 4
+ #if HAS_MARLINUI_U8GLIB || LCD_WIDTH < 20 || LCD_HEIGHT < 4
#error "Alternative LCD_INFO_SCREEN_STYLE requires 20x4 Character LCD."
#elif LCD_INFO_SCREEN_STYLE > 1
#error "LCD_INFO_SCREEN_STYLE only has options 0 and 1 at this time."
@@ -693,16 +693,16 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#if ENABLED(LCD_PROGRESS_BAR)
#if NONE(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY)
#error "LCD_PROGRESS_BAR requires SDSUPPORT or LCD_SET_PROGRESS_MANUALLY."
- #elif !HAS_CHARACTER_LCD
- #error "LCD_PROGRESS_BAR requires a character LCD."
- #elif HAS_GRAPHICAL_LCD
+ #elif NONE(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL)
+ #error "LCD_PROGRESS_BAR only applies to HD44780 character LCD and TFTGLCD_PANEL_(SPI|I2C)."
+ #elif HAS_MARLINUI_U8GLIB
#error "LCD_PROGRESS_BAR does not apply to graphical displays."
#elif ENABLED(FILAMENT_LCD_DISPLAY)
#error "LCD_PROGRESS_BAR and FILAMENT_LCD_DISPLAY are not fully compatible. Comment out this line to use both."
#elif PROGRESS_MSG_EXPIRE < 0
#error "PROGRESS_MSG_EXPIRE must be greater than or equal to 0."
#endif
-#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_GRAPHICAL_LCD, HAS_GRAPHICAL_TFT, HAS_CHARACTER_LCD, EXTENSIBLE_UI)
+#elif ENABLED(LCD_SET_PROGRESS_MANUALLY) && NONE(HAS_MARLINUI_U8GLIB, HAS_GRAPHICAL_TFT, HAS_MARLINUI_HD44780, EXTENSIBLE_UI)
#error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Character LCD, Graphical LCD, TFT, or EXTENSIBLE_UI."
#endif
@@ -713,9 +713,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
/**
* Custom Boot and Status screens
*/
-#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_GRAPHICAL_LCD, TOUCH_UI_FTDI_EVE)
+#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE)
#error "SHOW_CUSTOM_BOOTSCREEN requires Graphical LCD or TOUCH_UI_FTDI_EVE."
-#elif ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && !HAS_GRAPHICAL_LCD
+#elif ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && !HAS_MARLINUI_U8GLIB
#error "CUSTOM_STATUS_SCREEN_IMAGE requires a Graphical LCD."
#endif
@@ -782,7 +782,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#error "MESH_BED_LEVELING and BABYSTEP_ZPROBE_OFFSET is not a valid combination"
#elif ENABLED(BABYSTEP_ZPROBE_OFFSET) && !HAS_BED_PROBE
#error "BABYSTEP_ZPROBE_OFFSET requires a probe."
- #elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && !HAS_GRAPHICAL_LCD
+ #elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && !HAS_MARLINUI_U8GLIB
#error "BABYSTEP_ZPROBE_GFX_OVERLAY requires a Graphical LCD."
#elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && DISABLED(BABYSTEP_ZPROBE_OFFSET)
#error "BABYSTEP_ZPROBE_GFX_OVERLAY requires a BABYSTEP_ZPROBE_OFFSET."
@@ -1143,7 +1143,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
/**
* Required LCD language
*/
-#if HAS_CHARACTER_LCD && !defined(DISPLAY_CHARSET_HD44780)
+#if HAS_MARLINUI_HD44780 && !defined(DISPLAY_CHARSET_HD44780)
#error "You must set DISPLAY_CHARSET_HD44780 to JAPANESE, WESTERN or CYRILLIC for your LCD controller."
#endif
@@ -1465,7 +1465,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#endif
#endif
-#if ENABLED(MESH_EDIT_GFX_OVERLAY) && !BOTH(AUTO_BED_LEVELING_UBL, HAS_GRAPHICAL_LCD)
+#if ENABLED(MESH_EDIT_GFX_OVERLAY) && !BOTH(AUTO_BED_LEVELING_UBL, HAS_MARLINUI_U8GLIB)
#error "MESH_EDIT_GFX_OVERLAY requires AUTO_BED_LEVELING_UBL and a Graphical LCD."
#endif
@@ -2274,7 +2274,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
+ ENABLED(TFT_LVGL_UI_FSMC) \
+ ENABLED(TFT_LVGL_UI_SPI) \
+ ENABLED(ANYCUBIC_LCD_I3MEGA) \
- + ENABLED(ANYCUBIC_LCD_CHIRON)
+ + ENABLED(ANYCUBIC_LCD_CHIRON) \
+ + ENABLED(TFTGLCD_PANEL_SPI) \
+ + ENABLED(TFTGLCD_PANEL_I2C)
#error "Please select only one LCD controller option."
#endif
@@ -3081,7 +3083,7 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
#undef _PIN_CONFLICT
#endif
-#if !HAS_GRAPHICAL_LCD
+#if !HAS_MARLINUI_U8GLIB
#if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS)
#error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD."
#endif
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 4431dadce09c..2bf9c98bfb44 100644
--- a/Marlin/src/inc/Version.h
+++ b/Marlin/src/inc/Version.h
@@ -42,7 +42,7 @@
* version was tagged.
*/
#ifndef STRING_DISTRIBUTION_DATE
- #define STRING_DISTRIBUTION_DATE "2020-09-28"
+ #define STRING_DISTRIBUTION_DATE "2020-10-04"
#endif
/**
@@ -52,7 +52,7 @@
* to alert users to major changes.
*/
-#define MARLIN_HEX_VERSION 020006
+#define MARLIN_HEX_VERSION 020007
#ifndef REQUIRED_CONFIGURATION_H_VERSION
#define REQUIRED_CONFIGURATION_H_VERSION MARLIN_HEX_VERSION
#endif
diff --git a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp
index 9fe69d442832..aa3c3c04a123 100644
--- a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp
+++ b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp
@@ -14,7 +14,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if HAS_CHARACTER_LCD
+#if HAS_MARLINUI_HD44780
#include "../ultralcd.h"
#include "../../MarlinCore.h"
@@ -1119,4 +1119,4 @@ int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) {
#endif // DEBUG_LCDPRINT
-#endif // HAS_CHARACTER_LCD
+#endif // HAS_MARLINUI_HD44780
diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp
index 3dc0925b432f..e6cc22746571 100644
--- a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp
+++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp
@@ -22,7 +22,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if HAS_CHARACTER_LCD
+#if HAS_MARLINUI_HD44780
/**
* ultralcd_HD44780.cpp
@@ -1517,4 +1517,4 @@ void MarlinUI::draw_status_screen() {
#endif // HAS_LCD_MENU
-#endif // HAS_CHARACTER_LCD
+#endif // HAS_MARLINUI_HD44780
diff --git a/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp
new file mode 100644
index 000000000000..6cf660a6a99d
--- /dev/null
+++ b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp
@@ -0,0 +1,1142 @@
+/**
+ * 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 .
+ *
+ */
+
+/**
+ * @file lcdprint_TFTGLCD.cpp
+ * @brief LCD print API for TFT-GLCD interface
+ * @author Yunhui Fu (yhfudev@gmail.com)
+ * @version 1.0
+ * @date 2016-08-19
+ * @copyright GPL/BSD
+ */
+
+/**
+ * The TFTGLCD only supports ??? languages.
+ */
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if IS_TFTGLCD_PANEL
+
+#include "../ultralcd.h"
+#include "../../MarlinCore.h"
+#include "../../libs/numtostr.h"
+
+#include "ultralcd_TFTGLCD.h"
+
+#include
+
+int lcd_glyph_height(void) { return 1; }
+
+typedef struct _TFTGLCD_charmap_t {
+ wchar_t uchar; // the unicode char
+ uint8_t idx; // the glyph of the char in the ROM
+ uint8_t idx2; // the char used to be combined with the idx to simulate a single char
+} TFTGLCD_charmap_t;
+
+#ifdef __AVR__
+ #define IV(a) U##a
+#else
+ #define IV(a) L##a
+#endif
+
+static const TFTGLCD_charmap_t g_TFTGLCD_charmap_device[] PROGMEM = {
+ // sorted by uchar:
+ #if DISPLAY_CHARSET_HD44780 == JAPANESE
+
+ {IV('¢'), 0xEC, 0}, // A2
+ {IV('°'), 0xDF, 0}, // B0, Marlin special: '°' LCD_STR_DEGREE (0x09)
+ {IV('ä'), 0xE1, 0}, // E4
+ {IV('ö'), 0xEF, 0}, // F6
+ {IV('÷'), 0xFD, 0}, // 00F7
+ {IV('ü'), 0xF5, 0}, // 00FC
+ {IV('ˣ'), 0xEB, 0}, // 02E3
+
+ {IV('·'), 0xA5, 0}, // 0387
+ {IV('Ώ'), 0xF4, 0}, // 038F
+ {IV('Θ'), 0xF2, 0}, // 0398, Theta
+ {IV('Ξ'), 0xE3, 0}, // 039E, Xi
+ {IV('Σ'), 0xF6, 0}, // 03A3, Sigma
+ {IV('Ω'), 0xF4, 0}, // 03A9, Omega
+ {IV('ά'), 0xE0, 0}, // 03AC
+ {IV('έ'), 0xE3, 0}, // 03AD
+ {IV('α'), 0xE0, 0}, // 03B1, alpha
+ {IV('β'), 0xE2, 0}, // 03B2, beta
+ {IV('ε'), 0xE3, 0}, // 03B5, epsilon
+ {IV('θ'), 0xF2, 0}, // 03B8, theta
+ {IV('μ'), 0xE4, 0}, // 03BC, mu
+ {IV('ξ'), 0xE3, 0}, // 03BE, xi
+ {IV('π'), 0xF7, 0}, // 03C0, pi
+ {IV('ρ'), 0xE6, 0}, // 03C1, rho
+ {IV('σ'), 0xE5, 0}, // 03C3, sigma
+
+ {IV('←'), 0x7F, 0}, // 2190
+ {IV('→'), 0x7E, 0}, // 2192, Marlin special: '⮈⮉⮊⮋➤→' LCD_STR_ARROW_RIGHT (0x03)
+ {IV('√'), 0xE8, 0}, // 221A
+ {IV('∞'), 0xF3, 0}, // 221E
+ {IV('█'), 0xFF, 0}, // 2588
+
+ //{IV(''), 0xA0, 0},
+ {IV('。'), 0xA1, 0},
+ {IV('「'), 0xA2, 0},
+ {IV('」'), 0xA3, 0},
+ {IV('゛'), 0xDE, 0}, // ‶
+ {IV('゜'), 0xDF, 0}, // '〫'
+ {IV('゠'), '=', 0},
+ {IV('ァ'), 0xA7, 0},
+ {IV('ア'), 0xB1, 0},
+ {IV('ィ'), 0xA8, 0},
+ {IV('イ'), 0xB2, 0},
+ {IV('ゥ'), 0xA9, 0},
+ {IV('ウ'), 0xB3, 0},
+ {IV('ェ'), 0xAA, 0},
+ {IV('エ'), 0xB4, 0},
+ {IV('ォ'), 0xAB, 0},
+
+ {IV('オ'), 0xB5, 0},
+ {IV('カ'), 0xB6, 0},
+ {IV('ガ'), 0xB6, 0xDE},
+ {IV('キ'), 0xB7, 0},
+ {IV('ギ'), 0xB7, 0xDE}, //
+ {IV('ク'), 0xB8, 0},
+ {IV('グ'), 0xB8, 0xDE},
+ {IV('ケ'), 0xB9, 0},
+ {IV('ゲ'), 0xB9, 0xDE},
+ {IV('コ'), 0xBA, 0},
+ {IV('ゴ'), 0xBA, 0xDE},
+ {IV('サ'), 0xBB, 0},
+ {IV('ザ'), 0xBB, 0xDE},
+ {IV('シ'), 0xBC, 0},
+ {IV('ジ'), 0xBC, 0xDE},
+ {IV('ス'), 0xBD, 0},
+ {IV('ズ'), 0xBD, 0xDE},
+ {IV('セ'), 0xBE, 0},
+ {IV('ゼ'), 0xBE, 0xDE},
+ {IV('ソ'), 0xBF, 0},
+ {IV('ゾ'), 0xBF, 0xDE},
+
+ {IV('タ'), 0xC0, 0},
+ {IV('ダ'), 0xC0, 0xDE},
+ {IV('チ'), 0xC1, 0},
+ {IV('ヂ'), 0xC1, 0xDE},
+ {IV('ッ'), 0xAF, 0},
+ {IV('ツ'), 0xC2, 0},
+ {IV('ヅ'), 0xC2, 0xDE},
+ {IV('テ'), 0xC3, 0},
+ {IV('デ'), 0xC3, 0xDE},
+ {IV('ト'), 0xC4, 0},
+ {IV('ド'), 0xC4, 0xDE},
+ {IV('ナ'), 0xC5, 0},
+ {IV('ニ'), 0xC6, 0},
+ {IV('ヌ'), 0xC7, 0},
+ {IV('ネ'), 0xC8, 0},
+ {IV('ノ'), 0xC9, 0},
+ {IV('ハ'), 0xCA, 0},
+ {IV('バ'), 0xCA, 0xDE},
+ {IV('パ'), 0xCA, 0xDF},
+ {IV('ヒ'), 0xCB, 0},
+ {IV('ビ'), 0xCB, 0xDE},
+ {IV('ピ'), 0xCB, 0xDF},
+ {IV('フ'), 0xCC, 0},
+ {IV('ブ'), 0xCC, 0xDE},
+ {IV('プ'), 0xCC, 0xDF},
+ {IV('ヘ'), 0xCD, 0},
+ {IV('ベ'), 0xCD, 0xDE},
+ {IV('ペ'), 0xCD, 0xDF},
+ {IV('ホ'), 0xCE, 0},
+ {IV('ボ'), 0xCE, 0xDE},
+ {IV('ポ'), 0xCE, 0xDF},
+ {IV('マ'), 0xCF, 0},
+
+ {IV('ミ'), 0xD0, 0},
+ {IV('ム'), 0xD1, 0},
+ {IV('メ'), 0xD2, 0},
+ {IV('モ'), 0xD3, 0},
+ {IV('ャ'), 0xAC, 0},
+ {IV('ヤ'), 0xD4, 0},
+ {IV('ュ'), 0xAD, 0},
+ {IV('ユ'), 0xD5, 0},
+ {IV('ョ'), 0xAE, 0},
+ {IV('ヨ'), 0xD6, 0},
+ {IV('ラ'), 0xD7, 0},
+ {IV('リ'), 0xD8, 0},
+ {IV('ル'), 0xD9, 0},
+ {IV('レ'), 0xDA, 0},
+ {IV('ロ'), 0xDB, 0},
+ {IV('ワ'), 0xDC, 0},
+ {IV('ヲ'), 0xA6, 0},
+ {IV('ン'), 0xDD, 0},
+ {IV('ヴ'), 0xB3, 0xDE},
+ {IV('ヷ'), 0xDC, 0xDE},
+ {IV('ヺ'), 0xA6, 0xDE},
+ {IV('・'), 0xA5, 0},
+ {IV('ー'), 0xB0, 0},
+ {IV('ヽ'), 0xA4, 0},
+
+ //{IV('g'), 0xE7, 0}, // error
+ //{IV(''), 0xE9, 0},
+ //{IV('j'), 0xEA, 0}, // error
+ //{IV(''), 0xED, 0},
+ //{IV(''), 0xEE, 0},
+
+ //{IV('p'), 0xF0, 0}, // error
+ //{IV('q'), 0xF1, 0}, // error
+ //{IV(''), 0xF8, 0},
+ //{IV('y'), 0xF9, 0}, // error
+ {IV('万'), 0xFB, 0},
+ {IV('円'), 0xFC, 0},
+ {IV('千'), 0xFA, 0},
+ //{IV(''), 0xFE, 0},
+
+ //、・ヲァィゥェォャュョッー
+ {IV('、'), 0xA4, 0}, //ヽ
+ {IV('・'), 0xA5, 0}, //・
+ {IV('ヲ'), 0xA6, 0}, //ヲ
+ {IV('ァ'), 0xA7, 0}, //ァ
+ {IV('ィ'), 0xA8, 0}, //ィ
+ {IV('ゥ'), 0xA9, 0}, //ゥ
+ {IV('ェ'), 0xAA, 0}, //ェ
+ {IV('ォ'), 0xAB, 0}, //ォ
+ {IV('ャ'), 0xAC, 0}, //ャ
+ {IV('ュ'), 0xAD, 0}, //ュ
+ {IV('ョ'), 0xAE, 0}, //ョ
+ {IV('ッ'), 0xAF, 0}, //ッ
+ {IV('ー'), 0xB0, 0}, //ー
+
+ //アイウエオカキクケコサシスセ
+ {IV('ア'), 0xB1, 0}, //ア
+ {IV('イ'), 0xB2, 0}, //イ
+ {IV('ウ'), 0xB3, 0}, //ウ
+ {IV('エ'), 0xB4, 0}, //エ
+ {IV('オ'), 0xB5, 0}, //オ
+ {IV('カ'), 0xB6, 0}, //カ
+ {IV('キ'), 0xB7, 0}, //キ
+ {IV('ク'), 0xB8, 0}, //ク
+ {IV('ケ'), 0xB9, 0}, //ケ
+ {IV('コ'), 0xBA, 0}, //コ
+ {IV('サ'), 0xBB, 0}, //サ
+ {IV('シ'), 0xBC, 0}, //シ
+ {IV('ス'), 0xBD, 0}, //ス
+ {IV('セ'), 0xBE, 0}, //セ
+
+ //ソタチツテトナニヌネノハヒフ
+ {IV('ソ'), 0xBF, 0}, //ソ
+ {IV('タ'), 0xC0, 0}, //タ
+ {IV('チ'), 0xC1, 0}, //チ
+ {IV('ツ'), 0xC2, 0}, //ツ
+ {IV('テ'), 0xC3, 0}, //テ
+ {IV('ト'), 0xC4, 0}, //ト
+ {IV('ナ'), 0xC5, 0}, //ナ
+ {IV('ニ'), 0xC6, 0}, //ニ
+ {IV('ヌ'), 0xC7, 0}, //ヌ
+ {IV('ネ'), 0xC8, 0}, //ネ
+ {IV('ノ'), 0xC9, 0}, //ノ
+ {IV('ハ'), 0xCA, 0}, //ハ
+ {IV('ヒ'), 0xCB, 0}, //ヒ
+ {IV('フ'), 0xCC, 0}, //フ
+
+ //ヘホマミムメモヤユヨラリルレロワン゙゚
+ {IV('ヘ'), 0xCD, 0}, //ヘ
+ {IV('ホ'), 0xCE, 0}, //ホ
+ {IV('マ'), 0xCF, 0}, //マ
+ {IV('ミ'), 0xD0, 0}, //ミ
+ {IV('ム'), 0xD1, 0}, //ム
+ {IV('メ'), 0xD2, 0}, //メ
+ {IV('モ'), 0xD3, 0}, //モ
+ {IV('ヤ'), 0xD4, 0}, //ヤ
+ {IV('ユ'), 0xD5, 0}, //ユ
+ {IV('ヨ'), 0xD6, 0}, //ヨ
+ {IV('ラ'), 0xD7, 0}, //ラ
+ {IV('リ'), 0xD8, 0}, //リ
+ {IV('ル'), 0xD9, 0}, //ル
+ {IV('レ'), 0xDA, 0}, //レ
+ {IV('ロ'), 0xDB, 0}, //ロ
+ {IV('ワ'), 0xDC, 0}, //ワ
+ {IV('ン'), 0xDD, 0}, //ン
+ {IV('゙'), 0xDE, 0}, // ゛
+ {IV('゚'), 0xDF, 0}, // ゜
+
+ {IV('¥'), 0x5C, 0},
+
+ #elif DISPLAY_CHARSET_HD44780 == WESTERN
+ // 0x10 -- 0x1F (except 0x1C)
+ // 0x80 -- 0xFF (except 0xA7,0xB0,0xB1,0xB3,0xB4,0xBF,0xD1,0xF8,0xFA,0xFC-0xFF)
+
+ {IV('¡'), 0xA9, 0},
+ {IV('¢'), 0xA4, 0},
+ {IV('£'), 0xA5, 0},
+ {IV('¥'), 0xA6, 0},
+ {IV('§'), 0xD2, 0}, // section sign
+ {IV('©'), 0xCF, 0},
+
+ {IV('ª'), 0x9D, 0},
+ {IV('«'), 0xBB, 0},
+ {IV('®'), 0xCE, 0},
+
+ {IV('°'), 0xB2, 0}, // Marlin special: '°' LCD_STR_DEGREE (0x09)
+ //{IV(''), 0xD1, 0},
+ {IV('±'), 0x10, 0}, //∓±
+ //{'='), 0x1C, 0}, // error
+ {IV('²'), 0x1E, 0},
+ {IV('³'), 0x1F, 0},
+ {IV('¶'), 0xD3, 0}, // pilcrow sign
+ {IV('º'), 0x9E, 0},
+ {IV('»'), 0xBC, 0}, // 00BB
+ //{IV(''), 0xB3, 0}, // error
+ //{IV(''), 0xB4, 0}, // error
+ {IV('¼'), 0xB6, 0}, // 00BC
+ {IV('½'), 0xB5, 0}, // 00BD
+ //{IV('¾'), '3', 0}, // 00BE
+ {IV('¿'), 0x9F, 0}, // 00BF
+
+ {IV('Â'), 0x8F, 0},
+ {IV('Ã'), 0xAA, 0},
+ {IV('Ä'), 0x8E, 0},
+ {IV('Æ'), 0x92, 0},
+ {IV('Ç'), 0x80, 0},
+ {IV('É'), 0x90, 0},
+ {IV('Ñ'), 0x9C, 0},
+ {IV('Õ'), 0xAC, 0},
+ {IV('Ö'), 0x99, 0},
+ {IV('×'), 0xB7, 0},
+ {IV('Ø'), 0xAE, 0},
+ {IV('Ü'), 0x9A, 0},
+ {IV('à'), 0x85, 0},
+ {IV('á'), 0xA0, 0},
+ {IV('â'), 0x83, 0},
+ {IV('ã'), 0xAB, 0},
+ {IV('ä'), 0x84, 0},
+ {IV('å'), 0x86, 0},
+ {IV('æ'), 0x91, 0},
+ {IV('ç'), 0x87, 0},
+ {IV('è'), 0x8A, 0},
+ {IV('é'), 0x82, 0},
+ {IV('ê'), 0x88, 0},
+ {IV('ë'), 0x89, 0},
+ {IV('ì'), 0x8D, 0},
+ {IV('í'), 0xA1, 0},
+ {IV('î'), 0x8C, 0},
+ {IV('ï'), 0x8B, 0},
+
+ {IV('ñ'), 0x9B, 0},
+ {IV('ò'), 0x95, 0},
+ {IV('ó'), 0xA2, 0},
+ {IV('ô'), 0x93, 0},
+ {IV('õ'), 0xAD, 0},
+ {IV('ö'), 0x94, 0},
+ {IV('÷'), 0xB8, 0},
+ {IV('ø'), 0xAF, 0},
+ {IV('ù'), 0x97, 0},
+ {IV('ú'), 0xA3, 0},
+ {IV('û'), 0x96, 0},
+ {IV('ü'), 0x81, 0},
+ {IV('ÿ'), 0x98, 0},
+
+ //{IV(''), 0xB0, 0}, // error
+ //{IV(''), 0xB1, 0}, // error
+ {IV('ƒ'), 0xA8, 0}, // 0192
+
+ {IV('Ύ'), 0xDB, 0}, // 038E
+ {IV('Ώ'), 0xDE, 0}, // 038F
+ {IV('ΐ'), 0xE7, 0}, // 0390
+
+ {IV('Γ'), 0xD4, 0}, // 0393, Gamma
+ {IV('Δ'), 0xD5, 0}, // 0394, Delta, ◿
+ {IV('Θ'), 0xD6, 0}, // 0398, Theta
+ {IV('Λ'), 0xD7, 0}, // 039B, Lambda
+ {IV('Ξ'), 0xD8, 0}, // 039E, Xi
+ {IV('Π'), 0xD9, 0}, // Pi
+ {IV('Σ'), 0xDA, 0}, // Sigma
+ {IV('Υ'), 0xDB, 0}, // Upsilon
+ {IV('Φ'), 0xDC, 0}, // Phi
+ {IV('Ψ'), 0xDD, 0}, // Psi
+ {IV('Ω'), 0xDE, 0}, // Omega
+
+ {IV('ά'), 0xDF, 0}, // 03AC
+ {IV('έ'), 0xE3, 0}, // 03AD
+ {IV('ή'), 0xE5, 0}, // 03AE
+ {IV('ί'), 0xE7, 0}, // 03AF
+ {IV('ΰ'), 0xF1, 0}, // 03B0
+
+ {IV('α'), 0xDF, 0}, // alpha
+ {IV('β'), 0xE0, 0}, // beta
+ {IV('γ'), 0xE1, 0}, // gamma
+ {IV('δ'), 0xE2, 0}, // delta
+ {IV('ε'), 0xE3, 0}, // epsilon
+ {IV('ζ'), 0xE4, 0}, // zeta
+ {IV('η'), 0xE5, 0}, // eta
+ {IV('θ'), 0xE6, 0}, // theta
+ {IV('ι'), 0xE7, 0}, // lota
+ {IV('κ'), 0xE8, 0}, // kappa
+ {IV('λ'), 0xE9, 0}, // lambda
+ {IV('μ'), 0xEA, 0}, // mu
+ {IV('ν'), 0xEB, 0}, // nu
+ {IV('ξ'), 0xEC, 0}, // xi
+ {IV('π'), 0xED, 0}, // pi
+ {IV('ρ'), 0xEE, 0}, // rho
+ {IV('σ'), 0xEF, 0}, // sigma
+
+ {IV('τ'), 0xF0, 0}, // tau
+ {IV('υ'), 0xF1, 0}, // upsilon
+ {IV('χ'), 0xF2, 0}, // chi
+ {IV('ψ'), 0xF3, 0}, // psi
+ {IV('ω'), 0xF4, 0}, // 03C9, omega
+ {IV('ϊ'), 0xE7, 0}, // 03CA
+ {IV('ϋ'), 0xF1, 0}, // 03CB
+ {IV('ύ'), 0xF1, 0}, // 03CD
+ {IV('ώ'), 0xF4, 0}, // 03CE
+
+ {IV('•'), 0xCD, 0}, // ·
+ {IV('℞'), 0xA7, 0}, // ℞ Pt ASCII 158
+ {IV('™'), 0xD0, 0},
+ {IV('↤'), 0xF9, 0}, // ⟻
+ {IV('↵'), 0xC4, 0},
+ {IV('↻'), 0x04, 0}, // Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01)
+ {IV('⇥'), 0xFB, 0},
+ {IV('√'), 0xBE, 0}, // √
+ {IV('∞'), 0xC2, 0}, // infinity
+ {IV('∫'), 0x1B, 0},
+ {IV('∼'), 0x1D, 0},
+ {IV('≈'), 0x1A, 0},
+ {IV('≠'), 0xBD, 0},
+ {IV('≡'), 0x11, 0},
+ {IV('≤'), 0xB9, 0},// ≤≥ ⩽⩾
+ {IV('≥'), 0xBA, 0},
+ //{IV(''), 0xBF, 0}, // error
+
+ {IV('⌠'), 0xC0, 0},
+ {IV('⌡'), 0xC1, 0},
+
+ {IV('⎧'), 0x14, 0},
+ {IV('⎩'), 0x15, 0},
+ {IV('⎫'), 0x16, 0},
+ {IV('⎭'), 0x17, 0},
+ {IV('⎰'), 0x18, 0},
+ {IV('⎱'), 0x19, 0},
+ {IV('⎲'), 0x12, 0},
+ {IV('⎳'), 0x13, 0},
+
+ {IV('⏱'), 0x07, 0}, // Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05)
+ {IV('┌'), 0xC9, 0},
+ {IV('┐'), 0xCA, 0},
+ {IV('└'), 0xCB, 0},
+ {IV('┘'), 0xCC, 0},
+ {IV('◸'), 0xC3, 0}, // ◿
+ {IV('⭠'), 0xC8, 0},
+ {IV('⭡'), 0xC5, 0},
+ {IV('⭢'), 0xC7, 0},
+ {IV('⭣'), 0xC6, 0},
+
+
+ {IV('⯆'), 0xF5, 0},
+ {IV('⯇'), 0xF7, 0}, // ⯅
+ {IV('⯈'), 0xF6, 0},
+ //{IV(''), 0xF8, 0}, // error
+ //{IV(''), 0xFA, 0}, // error
+ //{IV(''), 0xFC, 0}, // error
+ //{IV(''), 0xFD, 0}, // error
+ //{IV(''), 0xFE, 0}, // error
+ //{IV(''), 0xFF, 0}, // error
+
+ #elif DISPLAY_CHARSET_HD44780 == CYRILLIC
+
+ #ifdef CONVERT_TO_EXT_ASCII
+ {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09)
+ {IV('²'), 0x0e, 0}, // 0x32 if no special symbol in panel font
+ {IV('³'), 0x0f, 0}, // 0x33 if no special symbol in panel font
+
+ // translate to cp866 codepage
+ //first ASCII symbols in panel font must be replaced with Marlin special symbols
+ {IV('Ё'), 0xF0, 0}, // 0401
+ {IV('Є'), 0xF2, 0}, // 0404
+ {IV('І'), 'I', 0}, // 0406
+ {IV('Ї'), 0xF4, 0}, // 0407
+ {IV('Ў'), 0xF6, 0}, // 040E
+ {IV('А'), 0x80, 0}, // 0410
+ {IV('Б'), 0x81, 0},
+ {IV('В'), 0x82, 0},
+ {IV('Г'), 0x83, 0},
+ {IV('Д'), 0x84, 0},
+ {IV('Е'), 0x85, 0},
+ {IV('Ж'), 0x86, 0},
+ {IV('З'), 0x87, 0},
+ {IV('И'), 0x88, 0},
+ {IV('Й'), 0x89, 0},
+ {IV('К'), 0x8A, 0},
+ {IV('Л'), 0x8B, 0},
+ {IV('М'), 0x8C, 0},
+ {IV('Н'), 0x8D, 0},
+ {IV('О'), 0x8E, 0},
+ {IV('П'), 0x8F, 0},
+ {IV('Р'), 0x90, 0},
+ {IV('С'), 0x91, 0},
+ {IV('Т'), 0x92, 0},
+ {IV('У'), 0x93, 0},
+ {IV('Ф'), 0x94, 0},
+ {IV('Х'), 0x95, 0},
+ {IV('Ц'), 0x96, 0},
+ {IV('Ч'), 0x97, 0},
+ {IV('Ш'), 0x98, 0},
+ {IV('Щ'), 0x99, 0},
+ {IV('Ъ'), 0x9A, 0},
+ {IV('Ы'), 0x9B, 0},
+ {IV('Ь'), 0x9C, 0},
+ {IV('Э'), 0x9D, 0},
+ {IV('Ю'), 0x9E, 0},
+ {IV('Я'), 0x9F, 0},
+
+ {IV('а'), 0xA0, 0},
+ {IV('б'), 0xA1, 0},
+ {IV('в'), 0xA2, 0},
+ {IV('г'), 0xA3, 0},
+ {IV('д'), 0xA4, 0},
+ {IV('е'), 0xA5, 0},
+ {IV('ж'), 0xA6, 0},
+ {IV('з'), 0xA7, 0},
+ {IV('и'), 0xA8, 0},
+ {IV('й'), 0xA9, 0},
+ {IV('к'), 0xAA, 0},
+ {IV('л'), 0xAB, 0},
+ {IV('м'), 0xAC, 0},
+ {IV('н'), 0xAD, 0},
+ {IV('о'), 0xAE, 0},
+ {IV('п'), 0xAF, 0},
+ {IV('р'), 0xE0, 0},
+ {IV('с'), 0xE1, 0},
+ {IV('т'), 0xE2, 0},
+ {IV('у'), 0xE3, 0},
+ {IV('ф'), 0xE4, 0},
+ {IV('х'), 0xE5, 0},
+ {IV('ц'), 0xE6, 0},
+ {IV('ч'), 0xE7, 0},
+ {IV('ш'), 0xE8, 0},
+ {IV('щ'), 0xE9, 0},
+ {IV('ъ'), 0xEA, 0},
+ {IV('ы'), 0xEB, 0},
+ {IV('ь'), 0xEC, 0},
+ {IV('э'), 0xED, 0},
+ {IV('ю'), 0xEE, 0},
+ {IV('я'), 0xEF, 0}, // 044F
+ {IV('ё'), 0xF1, 0}, // 0451
+ {IV('є'), 0xF3, 0}, // 0454
+ {IV('і'), 'i', 0}, // 0456
+ {IV('ї'), 0xF5, 0}, // 0457
+ {IV('ў'), 0xF7, 0}, // 045E
+
+ #else
+
+ {IV('¢'), 0x5C, 0}, // 00A2
+ {IV('£'), 0xCF, 0}, // 00A3
+ {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09)
+
+ //{IV(''), 0x80, 0},
+ //{IV(''), 0x81, 0},
+ //{IV(''), 0x82, 0},
+ //{IV(''), 0x83, 0},
+ //{IV(''), 0x84, 0},
+ //{IV(''), 0x85, 0},
+ //{IV(''), 0x86, 0},
+ //{IV(''), 0x87, 0},
+ //{IV(''), 0x88, 0},
+ //{IV(''), 0x89, 0},
+ //{IV(''), 0x8A, 0},
+ //{IV(''), 0x8B, 0},
+ //{IV(''), 0x8C, 0},
+ //{IV(''), 0x8D, 0},
+ //{IV(''), 0x8E, 0},
+ //{IV(''), 0x8F, 0},
+
+ //{IV(''), 0x90, 0},
+ //{IV(''), 0x91, 0},
+ //{IV(''), 0x92, 0},
+ //{IV(''), 0x93, 0},
+ //{IV(''), 0x94, 0},
+ //{IV(''), 0x95, 0},
+ //{IV(''), 0x96, 0},
+ //{IV(''), 0x97, 0},
+ //{IV(''), 0x98, 0},
+ //{IV(''), 0x99, 0},
+ //{IV(''), 0x9A, 0},
+ //{IV(''), 0x9B, 0},
+ //{IV(''), 0x9C, 0},
+ //{IV(''), 0x9D, 0},
+ //{IV(''), 0x9E, 0},
+ //{IV(''), 0x9F, 0},
+
+ {IV('¼'), 0xF0, 0}, // 00BC
+ {IV('⅓'), 0xF1, 0},
+ {IV('½'), 0xF2, 0}, // 00BD
+ {IV('¾'), 0xF3, 0}, // 00BE
+ {IV('¿'), 0xCD, 0}, // 00BF
+
+ {IV('Ё'), 0xA2, 0}, // 0401
+ {IV('А'), 'A', 0}, // 0410
+ {IV('Б'), 0xA0, 0},
+ {IV('В'), 'B', 0},
+ {IV('Г'), 0xA1, 0},
+ {IV('Д'), 0xE0, 0},
+ {IV('Е'), 'E', 0},
+ {IV('Ж'), 0xA3, 0},
+ {IV('З'), 0xA4, 0},
+ {IV('И'), 0xA5, 0},
+ {IV('Й'), 0xA6, 0},
+ {IV('К'), 'K', 0},
+ {IV('Л'), 0xA7, 0},
+ {IV('М'), 'M', 0},
+ {IV('Н'), 'H', 0},
+ {IV('О'), 'O', 0},
+ {IV('П'), 0xA8, 0},
+ {IV('Р'), 'P', 0},
+ {IV('С'), 'C', 0},
+ {IV('Т'), 'T', 0},
+ {IV('У'), 0xA9, 0},
+ {IV('Ф'), 0xAA, 0},
+ {IV('Х'), 'X', 0},
+ {IV('Ц'), 0xE1, 0},
+ {IV('Ч'), 0xAB, 0},
+ {IV('Ш'), 0xAC, 0},
+ {IV('Щ'), 0xE2, 0},
+ {IV('Ъ'), 0xAD, 0},
+ {IV('Ы'), 0xAE, 0},
+ {IV('Ь'), 'b', 0},
+ {IV('Э'), 0xAF, 0},
+ {IV('Ю'), 0xB0, 0},
+ {IV('Я'), 0xB1, 0},
+ {IV('а'), 'a', 0},
+
+ {IV('б'), 0xB2, 0},
+ {IV('в'), 0xB3, 0},
+ {IV('г'), 0xB4, 0},
+ {IV('д'), 0xE3, 0},
+ {IV('е'), 'e', 0},
+ {IV('ж'), 0xB6, 0},
+ {IV('з'), 0xB7, 0},
+ {IV('и'), 0xB8, 0},
+ {IV('й'), 0xB9, 0},
+ {IV('к'), 0xBA, 0},
+ {IV('л'), 0xBB, 0},
+ {IV('м'), 0xBC, 0},
+ {IV('н'), 0xBD, 0},
+ {IV('о'), 'o', 0},
+ {IV('п'), 0xBE, 0},
+ {IV('р'), 'p', 0},
+ {IV('с'), 'c', 0},
+ {IV('т'), 0xBF, 0},
+
+ {IV('у'), 'y', 0},
+ {IV('ф'), 0xE4, 0},
+ {IV('х'), 'x', 0},
+ {IV('ц'), 0xE5, 0},
+ {IV('ч'), 0xC0, 0},
+ {IV('ш'), 0xC1, 0},
+ {IV('щ'), 0xE6, 0},
+ {IV('ъ'), 0xC2, 0},
+ {IV('ы'), 0xC3, 0},
+ {IV('ь'), 0xC4, 0},
+ {IV('э'), 0xC5, 0},
+ {IV('ю'), 0xC6, 0},
+ {IV('я'), 0xC7, 0}, // 044F
+ {IV('ё'), 0xB5, 0}, // 0451
+ //{IV(''), 0xC8, 0},
+ //{IV(''), 0xC9, 0},
+ //{IV(''), 0xCA, 0},
+ //{IV(''), 0xCB, 0},
+ //{IV(''), 0xCC, 0},
+ //{IV(''), 0xCD, 0},
+ //{IV(''), 0xCE, 0},
+
+ //{IV(''), 0xD0, 0},
+ //{IV(''), 0xD1, 0},
+ //{IV(''), 0xD2, 0},
+ //{IV(''), 0xD3, 0},
+ //{IV(''), 0xD4, 0},
+ //{IV(''), 0xD5, 0},
+ //{IV(''), 0xD6, 0},
+ //{IV(''), 0xD7, 0},
+ //{IV(''), 0xD8, 0},
+ //{IV(''), 0xDB, 0},
+ //{IV(''), 0xDC, 0},
+ //{IV(''), 0xDD, 0},
+ //{IV(''), 0xDE, 0},
+ //{IV(''), 0xDF, 0},
+
+ //{IV(''), 0xE7, 0},
+ //{IV(''), 0xE8, 0},
+ //{IV(''), 0xE9, 0},
+ //{IV(''), 0xEA, 0},
+ //{IV(''), 0xEB, 0},
+ //{IV(''), 0xEC, 0},
+ //{IV(''), 0xED, 0},
+ //{IV(''), 0xEE, 0},
+ //{IV(''), 0xEF, 0},
+
+ //{IV(''), 0xF4, 0},
+ //{IV(''), 0xF5, 0},
+ //{IV(''), 0xF6, 0},
+ //{IV(''), 0xF7, 0},
+ //{IV(''), 0xF8, 0},
+ //{IV(''), 0xF9, 0},
+ //{IV(''), 0xFA, 0},
+ //{IV(''), 0xFB, 0},
+ //{IV(''), 0xFC, 0},
+ //{IV(''), 0xFD, 0},
+ //{IV(''), 0xFE, 0},
+ //{IV(''), 0xFF, 0},
+
+ {IV('↑'), 0xD9, 0}, // 2191 ←↑→↓
+ {IV('↓'), 0xDA, 0}, // 2193
+
+ #endif
+
+ #endif
+};
+
+// the plain ASCII replacement for various char
+static const TFTGLCD_charmap_t g_TFTGLCD_charmap_common[] PROGMEM = {
+ {IV('¡'), 'i', 0}, // A1
+ {IV('¢'), 'c', 0}, // A2
+ {IV('°'), 0x09, 0}, // B0 Marlin special: '°' LCD_STR_DEGREE (0x09)
+
+ #ifndef CONVERT_TO_EXT_ASCII //this time CONVERT_TO_EXT_ASCII works only with en, ru and uk languages
+
+ // map WESTERN code to the plain ASCII
+ {IV('Á'), 'A', 0}, // C1
+ {IV('Â'), 'A', 0}, // C2
+ {IV('Ã'), 'A', 0}, // C3
+ {IV('Ä'), 'A', 0}, // C4
+ {IV('Å'), 'A', 0}, // C5
+ {IV('Æ'), 'A', 'E'}, // C6
+ {IV('Ç'), 'C', 0}, // C7
+ {IV('È'), 'E', 0}, // C8
+ {IV('É'), 'E', 0}, // C9
+ {IV('Í'), 'I', 0}, // CD
+ {IV('Ñ'), 'N', 0}, // D1
+ {IV('Õ'), 'O', 0}, // D5
+ {IV('Ö'), 'O', 0}, // D6
+ {IV('×'), 'x', 0}, // D7
+ {IV('Ü'), 'U', 0}, // DC
+ {IV('Ý'), 'Y', 0}, // DD
+ {IV('à'), 'a', 0}, // E0
+ {IV('á'), 'a', 0},
+ {IV('â'), 'a', 0},
+ {IV('ã'), 'a', 0},
+ {IV('ä'), 'a', 0},
+ {IV('å'), 'a', 0},
+ {IV('æ'), 'a', 'e'},
+ {IV('ç'), 'c', 0},
+ {IV('è'), 'e', 0}, // 00E8
+ {IV('é'), 'e', 0},
+ {IV('ê'), 'e', 0},
+ {IV('ë'), 'e', 0},
+ {IV('ì'), 'i', 0}, // 00EC
+ {IV('í'), 'i', 0},
+ {IV('î'), 'i', 0},
+ {IV('ï'), 'i', 0}, // 00EF
+
+ {IV('ñ'), 'n', 0}, // 00F1
+ {IV('ò'), 'o', 0},
+ {IV('ó'), 'o', 0},
+ {IV('ô'), 'o', 0},
+ {IV('õ'), 'o', 0},
+ {IV('ö'), 'o', 0},
+ //{IV('÷'), 0xB8, 0},
+ {IV('ø'), 'o', 0},
+ {IV('ù'), 'u', 0},
+ {IV('ú'), 'u', 0},
+ {IV('û'), 'u', 0},
+ {IV('ü'), 'u', 0}, // FC
+ {IV('ý'), 'y', 0}, // FD
+ {IV('ÿ'), 'y', 0}, // FF
+
+ {IV('Ą'), 'A', 0}, // 0104
+ {IV('ą'), 'a', 0}, // 0105
+ {IV('Ć'), 'C', 0}, // 0106
+ {IV('ć'), 'c', 0}, // 0107
+ {IV('Č'), 'C', 0}, // 010C
+ {IV('č'), 'c', 0}, // 010D
+ {IV('Ď'), 'D', 0}, // 010E
+ {IV('ď'), 'd', 0}, // 010F
+ {IV('đ'), 'd', 0}, // 0111
+ {IV('ę'), 'e', 0}, // 0119
+ {IV('ğ'), 'g', 0}, // 011F
+ {IV('İ'), 'I', 0}, // 0130
+ {IV('ı'), 'i', 0}, // 0131
+
+ {IV('Ł'), 'L', 0}, // 0141
+ {IV('ł'), 'l', 0}, // 0142
+ {IV('Ń'), 'N', 0}, // 0143
+ {IV('ń'), 'n', 0}, // 0144
+ {IV('ň'), 'n', 0}, // 0148
+
+ {IV('ř'), 'r', 0}, // 0159
+ {IV('Ś'), 'S', 0}, // 015A
+ {IV('ś'), 's', 0}, // 015B
+ {IV('ş'), 's', 0}, // 015F
+ {IV('Š'), 'S', 0}, // 0160
+ {IV('š'), 's', 0}, // 0161
+ {IV('ť'), 't', 0}, // 0165
+ {IV('ů'), 'u', 0}, // 016F
+ {IV('ż'), 'z', 0}, // 017C
+ {IV('Ž'), 'Z', 0}, // 017D
+ {IV('ž'), 'z', 0}, // 017E
+ {IV('ƒ'), 'f', 0}, // 0192
+
+ {IV('ˣ'), 'x', 0}, // 02E3
+
+ {IV('΄'), '\'', 0}, // 0384
+ {IV('΅'), '\'', 0}, // 0385
+ {IV('Ά'), 'A', 0}, // 0386
+ {IV('·'), '.', 0}, // 0387
+ {IV('Έ'), 'E', 0}, // 0388
+ {IV('Ή'), 'H', 0}, // 0389
+ {IV('Ί'), 'I', 0}, // 038A
+ {IV('Ό'), 'O', 0}, // 038C
+ {IV('Ύ'), 'Y', 0}, // 038E
+ {IV('Ώ'), 'O', 0}, // 038F
+ {IV('ΐ'), 'i', 0}, // 0390
+ {IV('Α'), 'A', 0}, // 0391
+ {IV('Β'), 'B', 0}, // 0392
+ {IV('Γ'), 'T', 0}, // 0393, Gamma
+ {IV('Δ'), '4', 0}, // 0394, Delta, ◿
+ {IV('Ε'), 'E', 0}, // 0395
+ {IV('Ζ'), 'Z', 0}, // 0396
+ {IV('Η'), 'H', 0}, // 0397
+ {IV('Θ'), '0', 0}, // 0398, Theta
+ {IV('Ι'), 'I', 0}, // 0399
+ {IV('Κ'), 'K', 0}, // 039A
+ {IV('Λ'), '^', 0}, // 039B, Lambda
+ {IV('Μ'), 'M', 0}, // 039C
+ {IV('Ν'), 'N', 0}, // 039D
+ {IV('Ξ'), '3', 0}, // 039E, Xi
+ {IV('Ο'), 'O', 0}, // 039F
+ {IV('Π'), 'n', 0}, // 03A0, Pi
+ {IV('Ρ'), 'P', 0}, // 03A1
+ {IV('Σ'), 'E', 0}, // 03A3, Sigma
+ {IV('Τ'), 'T', 0}, // 03A4
+ {IV('Υ'), 'Y', 0}, // 03A5, Upsilon
+ {IV('Φ'), 'p', 0}, // 03A6, Phi
+ {IV('Χ'), 'X', 0}, // 03A7
+ {IV('Ψ'), 'P', 0}, // 03A8, Psi
+ {IV('Ω'), 'O', 0}, // 03A9, Omega
+ {IV('Ϊ'), 'I', 0}, // 03AA
+ {IV('Ϋ'), 'Y', 0}, // 03AB
+ {IV('ά'), 'a', 0}, // 03AC
+ {IV('έ'), 'e', 0}, // 03AD
+ {IV('ή'), 'n', 0}, // 03AE
+ {IV('ί'), 'i', 0}, // 03AF
+ {IV('ΰ'), 'v', 0}, // 03B0
+ {IV('α'), 'a', 0}, // 03B1, alpha
+ {IV('β'), 'B', 0}, // 03B2, beta
+ {IV('γ'), 'v', 0}, // 03B3, gamma
+ {IV('δ'), 'd', 0}, // 03B4, delta
+ {IV('ε'), 'e', 0}, // 03B5, epsilon
+ {IV('ζ'), 'Z', 0}, // 03B6, zeta
+ {IV('η'), 'n', 0}, // 03B7, eta
+ {IV('θ'), '0', 0}, // 03B8, theta
+ {IV('ι'), 'i', 0}, // 03B9, lota
+ {IV('κ'), 'k', 0}, // 03BA, kappa
+ {IV('λ'), 'L', 0}, // 03BB, lambda
+ {IV('μ'), 'u', 0}, // 03BC, mu
+ {IV('ν'), 'v', 0}, // 03BD, nu
+ {IV('ξ'), 'e', 0}, // 03BE, xi
+ {IV('ο'), 'o', 0}, // 03BF
+ {IV('π'), 'n', 0}, // 03C0, pi
+ {IV('ρ'), 'p', 0}, // 03C1, rho
+ {IV('ς'), 'c', 0}, // 03C2
+ {IV('σ'), 'o', 0}, // 03C3, sigma
+ {IV('τ'), 't', 0}, // 03C4, tau
+ {IV('υ'), 'v', 0}, // 03C5, upsilon
+ {IV('φ'), 'p', 0}, // 03C6
+ {IV('χ'), 'X', 0}, // 03C7, chi
+ {IV('ψ'), 'W', 0}, // 03C8, psi
+ {IV('ω'), 'w', 0}, // 03C9, omega
+ {IV('ϊ'), 'i', 0}, // 03CA
+ {IV('ϋ'), 'v', 0}, // 03CB
+ {IV('ό'), 'o', 0}, // 03CC
+ {IV('ύ'), 'v', 0}, // 03CD
+ {IV('ώ'), 'w', 0}, // 03CE
+
+ // map CYRILLIC code to the plain ASCII
+ {IV('А'), 'A', 0}, // 0410
+ {IV('Б'), 'b', 0}, // 0411
+ {IV('В'), 'B', 0}, // 0412
+ {IV('Г'), 'T', 0}, // 0413
+ {IV('Д'), 'Q', 0}, // 0414
+ {IV('Е'), 'E', 0}, // 0415
+ {IV('Ж'), '*', 0}, // 0416
+ {IV('З'), 'E', 0}, // 0417
+ {IV('И'), 'N', 0}, // 0418
+ {IV('Й'), 'N', 0}, // 0419
+ {IV('К'), 'K', 0}, // 041A
+ {IV('Л'), 'T', 0}, // 041B
+ {IV('М'), 'M', 0}, // 041C
+ {IV('Н'), 'H', 0}, // 041D
+ {IV('О'), 'O', 0}, // 041E
+ {IV('П'), 'n', 0}, // 041F
+ {IV('Р'), 'P', 0}, // 0420
+ {IV('С'), 'C', 0}, // 0421
+ {IV('Т'), 'T', 0}, // 0422
+ {IV('У'), 'Y', 0},
+ {IV('Ф'), 'o', 0},
+ {IV('Х'), 'X', 0},
+ {IV('Ц'), 'U', 0},
+ {IV('Ч'), 'y', 0},
+ {IV('Ш'), 'W', 0},
+ {IV('Щ'), 'W', 0},
+ {IV('Ъ'), 'b', 0},
+ {IV('Ы'), 'b', '|'},
+ {IV('Ь'), 'b'},
+ {IV('Э'), 'e'},
+ {IV('Ю'), '|', 'O'},
+ {IV('Я'), '9', '|'}, // 042F
+
+ {IV('а'), 'a', 0}, // 0430
+ {IV('б'), '6', 0}, // 0431
+ {IV('в'), 'B', 0}, // 0432,
+ {IV('г'), 'r', 0}, // 0433
+ {IV('д'), 'a', 0}, // 0434,
+ {IV('е'), 'e', 0}, // 0435
+ {IV('ж'), '*', 0}, // 0436
+ {IV('з'), 'e', 0}, // 0437,
+ {IV('и'), 'u', 0}, // 0438
+ {IV('й'), 'u', 0}, // 0439,
+ {IV('к'), 'k', 0}, // 043A
+ {IV('л'), 'n', 0},
+ {IV('м'), 'm', 0},
+ {IV('н'), 'H', 0},
+ {IV('о'), 'o', 0},
+ {IV('п'), 'n', 0},
+ {IV('р'), 'p', 0},
+ {IV('с'), 'c', 0},
+ {IV('т'), 't', 0},
+ {IV('у'), 'y', 0},
+ {IV('ф'), 'q', 'p'},
+ {IV('х'), 'x', 0},
+ {IV('ц'), 'u', 0},
+ {IV('ч'), 'y', 0},
+ {IV('ш'), 'w', 0},
+ {IV('щ'), 'w', 0},
+ {IV('ъ'), 'b', 0},
+ {IV('ы'), 'b', '|'},
+ {IV('ь'), 'b', 0},
+ {IV('э'), 'e', 0},
+ {IV('ю'), '|', 'o'},
+ {IV('я'), 'g', 0}, // 044F
+
+ #endif
+
+ {IV('•'), '.', 0}, // 2022 ·
+ {IV('℞'), 'P', 'x'}, // 211E ℞ Pt ASCII 158
+ {IV('™'), 'T', 'M'}, // 2122
+ {IV('←'), '<', '-'}, // 2190
+ {IV('→'), '-', '>'}, // 2192, Marlin special: '⮈⮉⮊⮋➤→⏵➟➠➡' LCD_STR_ARROW_RIGHT (0x03)
+ //{IV('↰'), '<', 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04)
+ {IV('↰'), 0x03, 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04)
+ {IV('↻'), 0x04, 0}, // 21BB Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01)
+ {IV('∼'), '~', 0}, // 223C
+ {IV('≈'), '~', '='}, // 2248
+ {IV('≠'), '!', '='}, // 2260
+ {IV('≡'), '=', 0}, // 2261
+ {IV('≤'), '<', '='},// 2264, ≤≥ ⩽⩾
+ {IV('≥'), '>', '='}, // 2265
+ {IV('⏱'), 0x07, 0}, // 23F1, Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05)
+
+ {IV('゠'), '=', 0}, // 30A0
+
+ // ⏰⏱⏲⏳◴◵◶◷
+ // ⏻⏼♁♂
+ //{IV(''), 0x00, 0}, // Marlin special: '' LCD_STR_BEDTEMP (0x07)
+ {IV('🌡'), 0x02, 0}, // D83CDF21 Marlin special: '🌡' LCD_STR_THERMOMETER (0x08)
+ {IV('📂'), 0x05, 0}, // D83DDCC2 Marlin special: '📁📂' LCD_STR_FOLDER (0x02)
+ //{IV(''), 0x06, 0}, // Marlin special: '' LCD_STR_FEEDRATE (0x06)
+};
+
+/* return v1 - v2 */
+static int TFTGLCD_charmap_compare(TFTGLCD_charmap_t * v1, TFTGLCD_charmap_t * v2) {
+ return (v1->uchar < v2->uchar) ? -1 : (v1->uchar > v2->uchar) ? 1 : 0;
+}
+
+static int pf_bsearch_cb_comp_hd4map_pgm(void *userdata, size_t idx, void * data_pin) {
+ TFTGLCD_charmap_t localval;
+ TFTGLCD_charmap_t *p_TFTGLCD_charmap = (TFTGLCD_charmap_t *)userdata;
+ memcpy_P(&localval, p_TFTGLCD_charmap + idx, sizeof(localval));
+ return TFTGLCD_charmap_compare(&localval, (TFTGLCD_charmap_t *)data_pin);
+}
+
+void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { lcd.setCursor(col, row); }
+
+void lcd_put_int(const int i) {
+ const char* str = i16tostr3left(i);
+ while (*str) lcd.write(*str++);
+}
+
+// return < 0 on error
+// return the advanced cols
+int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) {
+
+ // find the HD44780 internal ROM first
+ int ret;
+ size_t idx = 0;
+ TFTGLCD_charmap_t pinval;
+ TFTGLCD_charmap_t *copy_address = nullptr;
+ pinval.uchar = c;
+ pinval.idx = -1;
+
+ if (max_length < 1) return 0;
+
+ if (c < 128) {
+ lcd.write((uint8_t)c);
+ return 1;
+ }
+ copy_address = nullptr;
+ ret = pf_bsearch_r((void *)g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx);
+ if (ret >= 0) {
+ copy_address = (TFTGLCD_charmap_t *)(g_TFTGLCD_charmap_device + idx);
+ }
+ else {
+ ret = pf_bsearch_r((void *)g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx);
+ if (ret >= 0) copy_address = (TFTGLCD_charmap_t *)(g_TFTGLCD_charmap_common + idx);
+ }
+
+ if (ret >= 0) {
+ TFTGLCD_charmap_t localval;
+ // found
+ memcpy_P(&localval, copy_address, sizeof(localval));
+ lcd.write(localval.idx);
+ if (max_length >= 2 && localval.idx2 > 0) {
+ lcd.write(localval.idx2);
+ return 2;
+ }
+ return 1;
+ }
+
+ // Not found, print '?' instead
+ lcd.write((uint8_t)'?');
+ return 1;
+}
+
+/**
+ * @brief Draw a UTF-8 string
+ *
+ * @param utf8_str : the UTF-8 string
+ * @param cb_read_byte : the callback function to read one byte from the utf8_str (from RAM or ROM)
+ * @param max_length : the pixel length of the string allowed (or number of slots in HD44780)
+ *
+ * @return the number of pixels advanced
+ *
+ * Draw a UTF-8 string
+ */
+static int lcd_put_u8str_max_cb(const char * utf8_str, uint8_t (*cb_read_byte)(uint8_t * str), pixel_len_t max_length) {
+ pixel_len_t ret = 0;
+ uint8_t *p = (uint8_t *)utf8_str;
+ while (ret < max_length) {
+ wchar_t ch = 0;
+ p = get_utf8_value_cb(p, cb_read_byte, &ch);
+ if (!ch) break;
+ ret += lcd_put_wchar_max(ch, max_length - ret);
+ }
+ return (int)ret;
+}
+
+int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) {
+ return lcd_put_u8str_max_cb(utf8_str, read_byte_ram, max_length);
+}
+
+int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) {
+ return lcd_put_u8str_max_cb(utf8_str_P, read_byte_rom, max_length);
+}
+
+#if ENABLED(DEBUG_LCDPRINT)
+
+ int test_TFTGLCD_charmap(TFTGLCD_charmap_t *data, size_t size, char *name, char flg_show_contents) {
+ int ret;
+ size_t idx = 0;
+ TFTGLCD_charmap_t preval = {0, 0, 0};
+ TFTGLCD_charmap_t pinval = {0, 0, 0};
+ char flg_error = 0;
+
+ int i;
+
+ TRACE("Test %s\n", name);
+
+ for (i = 0; i < size; i ++) {
+ memcpy_P(&pinval, &(data[i]), sizeof(pinval));
+
+ if (flg_show_contents) {
+ #if 1
+ TRACE("[% 4d] % 6" PRIu32 "(0x%04" PRIX32 ") --> 0x%02X,0x%02X%s\n", i, pinval.uchar, pinval.uchar, (unsigned int)(pinval.idx), (unsigned int)(pinval.idx2), (preval.uchar < pinval.uchar?"":" <--- ERROR"));
+ #else
+ TRACE("[% 4d]", i);
+ TRACE("% 6" PRIu32 "(0x%04" PRIX32 "),", pinval.uchar, pinval.uchar);
+ TRACE("0x%02X,", (unsigned int)(pinval.idx));
+ TRACE("0x%02X,", (unsigned int)(pinval.idx2));
+ TRACE("%s", (preval.uchar < pinval.uchar?"":" <--- ERROR"));
+ #endif
+ }
+ if (preval.uchar >= pinval.uchar) {
+ flg_error = 1;
+ //TRACE("Error: out of order in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar);
+ //return -1;
+ }
+ memcpy(&preval, &pinval, sizeof(pinval));
+
+ ret = pf_bsearch_r((void *)data, size, pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx);
+ if (ret < 0) {
+ flg_error = 1;
+ TRACE("Error: not found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar);
+ //return -1;
+ }
+ if (idx != i) {
+ flg_error = 1;
+ TRACE("Error: wrong index found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar);
+ //return -1;
+ }
+ }
+ if (flg_error) {
+ TRACE("\nError: in array %s\n\n", name);
+ return -1;
+ }
+ TRACE("\nPASS array %s\n\n", name);
+ return 0;
+ }
+
+ int test_TFTGLCD_charmap_all(void) {
+ int flg_error = 0;
+ if (test_TFTGLCD_charmap(g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), "g_TFTGLCD_charmap_device", 0) < 0) {
+ flg_error = 1;
+ test_TFTGLCD_charmap(g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), "g_TFTGLCD_charmap_device", 1);
+ }
+ if (test_TFTGLCD_charmap(g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), "g_TFTGLCD_charmap_common", 0) < 0) {
+ flg_error = 1;
+ test_TFTGLCD_charmap(g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), "g_TFTGLCD_charmap_common", 1);
+ }
+ if (flg_error) {
+ TRACE("\nFAILED in hd44780 tests!\n");
+ return -1;
+ }
+ TRACE("\nPASS in hd44780 tests.\n");
+ return 0;
+ }
+
+#endif // DEBUG_LCDPRINT
+
+#endif // IS_TFTGLCD_PANEL
diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp
new file mode 100644
index 000000000000..fd1b6858e8f8
--- /dev/null
+++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp
@@ -0,0 +1,1018 @@
+/**
+ * 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 .
+ *
+ */
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if IS_TFTGLCD_PANEL
+
+/**
+ * ultralcd_TFTGLCD.cpp
+ *
+ * Implementation of the LCD display routines for a TFT GLCD displays with external controller.
+ * This display looks as a REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER but has good text font
+ * and supports color output.
+ */
+
+#if NONE(__AVR__, MCU_LPC1768, __STM32F1__, STM32F4xx)
+ #warning "Selected platform not yet tested. Please contribute your good pin mappings."
+#endif
+
+#if ENABLED(TFTGLCD_PANEL_SPI)
+ #include
+#else
+ #include
+#endif
+
+#include "ultralcd_TFTGLCD.h"
+#include "../ultralcd.h"
+#include "../../libs/numtostr.h"
+
+#include "../../sd/cardreader.h"
+#include "../../module/temperature.h"
+#include "../../module/printcounter.h"
+#include "../../module/planner.h"
+#include "../../module/motion.h"
+
+#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT)
+ #include "../../feature/filwidth.h"
+ #include "../../gcode/parser.h"
+#endif
+
+#if ENABLED(AUTO_BED_LEVELING_UBL)
+ #include "../../feature/bedlevel/bedlevel.h"
+#endif
+
+TFTGLCD lcd;
+
+#define ICON_LOGO B00000001
+#define ICON_TEMP1 B00000010 //hotend 1
+#define ICON_TEMP2 B00000100 //hotend 2
+#define ICON_TEMP3 B00001000 //hotend 3
+#define ICON_BED B00010000
+#define ICON_FAN B00100000
+#define ICON_HOT B01000000 //when any T > 50deg
+#define PIC_MASK 0x7f
+
+//LEDs not used, for compatibility with Smoothieware
+#define LED_HOTEND_ON B00000001
+#define LED_BED_ON B00000010
+#define LED_FAN_ON B00000100
+#define LED_HOT B00001000
+#define LED_MASK 0x0f
+
+#define FBSIZE (LCD_WIDTH * LCD_HEIGHT + 2)
+
+//markers for change line color
+#define COLOR_EDIT '#'
+#define COLOR_ERROR '!'
+
+#ifdef CONVERT_TO_EXT_ASCII //use standart pseudographic symbols in ASCII table
+ #define LR 179 //vertical line
+ #define TRC 191 //top right corner
+ #define BLC 192 //bottom left corner
+ #define GL 196 //horizontal line
+ #define BRC 217 //bottom right corner, should be replaced to 12 for some languages
+ #define TLC 218 //top left corner, should be replaced to 13 for some languages
+#else //next symbols must be present in panel font
+ #define LR 8 //equal to 179
+ #define TRC 9 //equal to 191
+ #define BLC 10 //equal to 192
+ #define GL 11 //equal to 196
+ #define BRC 12 //equal to 217
+ #define TLC 13 //equal to 218
+#endif
+
+#define Marlin 0x01
+
+enum Commands { // based on Smoothieware commands
+ GET_SPI_DATA = 0,
+ READ_BUTTONS, // read buttons
+ READ_ENCODER, // read encoder
+ LCD_WRITE, // write all screen to LCD
+ BUZZER, // beep buzzer
+ CONTRAST, // set contrast (brightnes)
+ // Other commands... 0xE0 thru 0xFF
+ GET_LCD_ROW = 0xE0, // for detect panel
+ GET_LCD_COL, // reserved for compatibility with Smoothieware, not used
+ LCD_PUT, // write one line to LCD
+ INIT_SCREEN = 0xFE, // clear panel buffer
+};
+
+static unsigned char framebuffer[FBSIZE];
+static unsigned char *fb;
+static uint8_t cour_line;
+static uint8_t picBits, ledBits, hotBits;
+static uint8_t PanelDetected = 0;
+
+// Constructor
+TFTGLCD::TFTGLCD() {}
+
+//clearing local buffer
+void TFTGLCD::clear_buffer() {
+ memset(&framebuffer[0], ' ', FBSIZE - 2);
+ framebuffer[FBSIZE - 1] = framebuffer[FBSIZE - 2] = 0;
+ picBits = ledBits = 0;
+}
+
+//set new text cursor position
+void TFTGLCD::setCursor(uint8_t col, uint8_t row) {
+ fb = &framebuffer[0] + col + row * LCD_WIDTH;
+ cour_line = row;
+}
+
+//send char to buffer
+void TFTGLCD::write(char c) {
+ *fb++ = c;
+}
+
+//send text line to buffer
+void TFTGLCD::print(const char *line) {
+ while (*line) *fb++ = *line++;
+}
+
+// For menu
+void TFTGLCD::print_line() {
+ if (!PanelDetected) return;
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ WRITE(TFTGLCD_CS, LOW);
+ #ifdef __AVR__
+ SPI.transfer(LCD_PUT);
+ SPI.transfer(cour_line);
+ SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH);
+ #elif EITHER(MCU_LPC1768, __STM32F1__)
+ SPI.transfer(LCD_PUT);
+ SPI.transfer(cour_line);
+ for (uint16_t i = 0; i < LCD_WIDTH; i++) SPI.transfer(framebuffer[cour_line * LCD_WIDTH + i]);
+ #elif defined(STM32F4xx)
+ SPI.transfer(LCD_PUT, SPI_CONTINUE);
+ SPI.transfer(cour_line, SPI_CONTINUE);
+ SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH, SPI_CONTINUE);
+ #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__)
+ SPI.transfer(LCD_PUT);
+ SPI.transfer(cour_line);
+ SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH);
+ #elif defined(ARDUINO_ARCH_ESP32)
+ SPI.write(LCD_PUT);
+ SPI.write(cour_line);
+ for (uint16_t i = 0; i < LCD_WIDTH; i++) SPI.write(framebuffer[cour_line * LCD_WIDTH + i]);
+ #endif
+ WRITE(TFTGLCD_CS, HIGH);
+ #else
+ Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); //set I2C device address
+ Wire.write(LCD_PUT);
+ Wire.write(cour_line);
+ Wire.write(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH); //transfer 1 line to txBuffer
+ Wire.endTransmission(); //transmit data
+ safe_delay(1);
+ #endif
+}
+
+void TFTGLCD::print_screen(){
+ if (!PanelDetected) return;
+ framebuffer[FBSIZE - 2] = picBits & PIC_MASK;
+ framebuffer[FBSIZE - 1] = ledBits;
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ // Send all framebuffer to panel
+ WRITE(TFTGLCD_CS, LOW);
+ #ifdef __AVR__
+ SPI.transfer(LCD_WRITE);
+ SPI.transfer(&framebuffer[0], FBSIZE);
+ #elif EITHER(MCU_LPC1768, __STM32F1__)
+ SPI.transfer(LCD_WRITE);
+ for (uint16_t i = 0; i < FBSIZE; i++) SPI.transfer(framebuffer[i]);
+ #elif defined(STM32F4xx)
+ SPI.transfer(LCD_WRITE, SPI_CONTINUE);
+ SPI.transfer(&framebuffer[0], FBSIZE, SPI_CONTINUE);
+ #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__)
+ SPI.transfer(LCD_WRITE);
+ SPI.transfer(&framebuffer[0], FBSIZE);
+ #elif defined(ARDUINO_ARCH_ESP32)
+ SPI.write(LCD_WRITE);
+ for (uint16_t i = 0; i < FBSIZE; i++) SPI.write(framebuffer[i]);
+ #endif
+ WRITE(TFTGLCD_CS, HIGH);
+ #else
+ uint8_t r;
+ // Send framebuffer to panel by line
+ Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS);
+ // First line
+ Wire.write(LCD_WRITE);
+ Wire.write(&framebuffer[0], LCD_WIDTH);
+ Wire.endTransmission();
+ for (r = 1; r < (LCD_HEIGHT - 1); r++) {
+ Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS);
+ Wire.write(&framebuffer[r * LCD_WIDTH], LCD_WIDTH);
+ Wire.endTransmission();
+ }
+ // Last line
+ Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS);
+ Wire.write(&framebuffer[r * LCD_WIDTH], LCD_WIDTH);
+ Wire.write(&framebuffer[FBSIZE - 2], 2);
+ Wire.endTransmission();
+ #endif
+}
+
+void TFTGLCD::setContrast(uint16_t contrast) {
+ if (!PanelDetected) return;
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ WRITE(TFTGLCD_CS, LOW);
+ #if ANY(__AVR__, MCU_LPC1768, __STM32F1__)
+ SPI.transfer(CONTRAST);
+ SPI.transfer((uint8_t)contrast);
+ #elif defined(STM32F4xx)
+ SPI.transfer(CONTRAST, SPI_CONTINUE);
+ SPI.transfer((uint8_t)contrast, SPI_CONTINUE);
+ #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__)
+ SPI.transfer(CONTRAST);
+ SPI.transfer((uint8_t)contrast);
+ #elif defined(ARDUINO_ARCH_ESP32)
+ SPI.write(CONTRAST);
+ SPI.write((uint8_t)contrast);
+ #endif
+ WRITE(TFTGLCD_CS, HIGH);
+ #else
+ Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS);
+ Wire.write(CONTRAST);
+ Wire.write((uint8_t)contrast);
+ Wire.endTransmission();
+ #endif
+}
+
+//reading buttons and encoder states
+extern volatile int8_t encoderDiff;
+
+uint8_t MarlinUI::read_slow_buttons(void) {
+ if (!PanelDetected) return 0;
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ uint8_t b = 0;
+ WRITE(TFTGLCD_CS, LOW);
+ #if ANY(__AVR__, MCU_LPC1768, __STM32F1__)
+ SPI.transfer(READ_ENCODER);
+ WRITE(TFTGLCD_CS, LOW); //for delay
+ encoderDiff += SPI.transfer(READ_BUTTONS);
+ WRITE(TFTGLCD_CS, LOW); //for delay
+ b = SPI.transfer(GET_SPI_DATA);
+ #elif defined(STM32F4xx)
+ SPI.transfer(READ_ENCODER, SPI_CONTINUE);
+ encoderDiff += SPI.transfer(READ_BUTTONS, SPI_CONTINUE);
+ b = SPI.transfer(GET_SPI_DATA, SPI_CONTINUE);
+ #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__)
+ SPI.transfer(READ_ENCODER);
+ WRITE(TFTGLCD_CS, LOW); //for delay ????
+ encoderDiff += SPI.transfer(READ_BUTTONS);
+ WRITE(TFTGLCD_CS, LOW); //for delay ????
+ b = SPI.transfer(GET_SPI_DATA);
+ #elif defined(ARDUINO_ARCH_ESP32)
+ SPI.transfer(READ_ENCODER);
+ WRITE(TFTGLCD_CS, LOW); //for delay ????
+ encoderDiff += SPI.transfer(READ_BUTTONS);
+ WRITE(TFTGLCD_CS, LOW); //for delay ????
+ b = SPI.transfer(GET_SPI_DATA);
+ #endif
+ WRITE(TFTGLCD_CS, HIGH);
+ return b;
+ #else
+ Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS);
+ Wire.write(READ_ENCODER);
+ Wire.endTransmission();
+ #ifdef __AVR__
+ Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 2, 0, 0, 1);
+ #elif defined(__STM32F1__)
+ Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, (uint8_t)2);
+ #elif EITHER(STM32F4xx, MCU_LPC1768)
+ Wire.requestFrom(LCD_I2C_ADDRESS, 2);
+ #endif
+ encoderDiff += Wire.read();
+ return Wire.read(); //buttons
+ #endif
+}
+
+// duration in ms, freq in Hz
+void MarlinUI::buzz(const long duration, const uint16_t freq) {
+ if (!PanelDetected) return;
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ WRITE(TFTGLCD_CS, LOW);
+ #if ANY(__AVR__, MCU_LPC1768, __STM32F1__)
+ SPI.transfer(BUZZER);
+ SPI.transfer16((uint16_t)duration);
+ SPI.transfer16(freq);
+ #elif defined(STM32F4xx)
+ SPI.transfer(BUZZER, SPI_CONTINUE);
+ SPI.transfer16((uint16_t)duration, SPI_CONTINUE);
+ SPI.transfer16(freq, SPI_CONTINUE);
+ #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__)
+ SPI.transfer(BUZZER);
+ SPI.transfer16((uint16_t)duration);
+ SPI.transfer16(freq);
+ #elif defined(ARDUINO_ARCH_ESP32)
+ SPI.write(BUZZER);
+ SPI.write16((uint16_t)duration);
+ SPI.write16(freq);
+ #endif
+ WRITE(TFTGLCD_CS, HIGH);
+ #else
+ Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS);
+ Wire.write(BUZZER);
+ Wire.write((uint8_t)(duration >> 8));
+ Wire.write((uint8_t)duration);
+ Wire.write((uint8_t)(freq >> 8));
+ Wire.write((uint8_t)freq);
+ Wire.endTransmission();
+ #endif
+}
+
+void MarlinUI::init_lcd() {
+ uint8_t t;
+ lcd.clear_buffer();
+ t = 0;
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ // SPI speed must be less 10MHz
+ OUT_WRITE(TFTGLCD_CS, HIGH);
+ spiInit(TERN(__STM32F1__, SPI_QUARTER_SPEED, SPI_FULL_SPEED));
+ WRITE(TFTGLCD_CS, LOW);
+ #if ANY(__AVR__, MCU_LPC1768, __STM32F1__)
+ SPI.transfer(GET_LCD_ROW);
+ t = SPI.transfer(GET_SPI_DATA);
+ #elif defined(STM32F4xx)
+ SPI.transfer(GET_LCD_ROW, SPI_CONTINUE);
+ t = SPI.transfer(GET_SPI_DATA, SPI_CONTINUE);
+ #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__)
+ SPI.transfer(GET_LCD_ROW);
+ t = SPI.transfer(GET_SPI_DATA);
+ #elif defined(ARDUINO_ARCH_ESP32)
+ SPI.write(GET_LCD_ROW);
+ t = SPI.transfer(GET_SPI_DATA);
+ #endif
+ #else
+ #ifdef MCU_LPC1768
+ Wire.begin(); //init twi/I2C
+ #else
+ Wire.begin((uint8_t)LCD_I2C_ADDRESS); //init twi/I2C
+ #endif
+ Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS);
+ Wire.write((uint8_t)GET_LCD_ROW); // put command to buffer
+ Wire.endTransmission(); // send buffer
+ #ifdef __AVR__
+ Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 1, 0, 0, 1);
+ #elif ANY(__STM32F1__, STM32F4xx, MCU_LPC1768)
+ Wire.requestFrom(LCD_I2C_ADDRESS, 1);
+ #endif
+ t = (uint8_t)Wire.read();
+ #endif
+
+ if (t == LCD_HEIGHT) {
+ PanelDetected = 1;
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ PanelDetected = 1;
+ #if ANY(__AVR__, MCU_LPC1768, __STM32F1__)
+ SPI.transfer(INIT_SCREEN);
+ SPI.transfer(Marlin);
+ #elif defined(STM32F4xx)
+ SPI.transfer(INIT_SCREEN, SPI_CONTINUE);
+ SPI.transfer(Marlin, SPI_CONTINUE);
+ #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__)
+ SPI.transfer(INIT_SCREEN);
+ SPI.transfer(Marlin);
+ #elif defined(ARDUINO_ARCH_ESP32)
+ SPI.write(INIT_SCREEN);
+ SPI.write(Marlin);
+ #endif
+ WRITE(TFTGLCD_CS, HIGH);
+ #else
+ Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS);
+ Wire.write((uint8_t)INIT_SCREEN);
+ Wire.write(Marlin);
+ Wire.endTransmission();
+ #endif
+ }
+ else
+ PanelDetected = 0;
+ safe_delay(100);
+}
+
+bool MarlinUI::detected() {
+ return PanelDetected;
+}
+
+void MarlinUI::clear_lcd() {
+ if (!PanelDetected) return;
+ lcd.clear_buffer();
+ lcd.print_screen();
+}
+
+int16_t MarlinUI::contrast; // Initialized by settings.load()
+
+void MarlinUI::set_contrast(const int16_t value) {
+ contrast = constrain(value, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX);
+ lcd.setContrast(contrast);
+}
+
+static void center_text_P(PGM_P pstart, uint8_t y) {
+ uint8_t len = utf8_strlen_P(pstart);
+ if (len < LCD_WIDTH)
+ lcd.setCursor((LCD_WIDTH - len) / 2, y);
+ else
+ lcd.setCursor(0, y);
+ lcd_put_u8str_P(pstart);
+}
+
+#if ENABLED(SHOW_BOOTSCREEN)
+
+ void MarlinUI::show_bootscreen() {
+ if (!PanelDetected) return;
+ //
+ // Show the Marlin logo, splash line1, and splash line 2
+ //
+ uint8_t indent = (LCD_WIDTH - 8) / 2;
+ // symbols 217 (bottom right corner) and 218 (top left corner) are using for letters in some languages
+ // and they should be moved to begining ASCII table as spetial symbols
+ lcd.setCursor(indent, 0); lcd.write(TLC); lcd_put_u8str_P(PSTR("------")); lcd.write(TRC);
+ lcd.setCursor(indent, 1); lcd.write(LR); lcd_put_u8str_P(PSTR("Marlin")); lcd.write(LR);
+ lcd.setCursor(indent, 2); lcd.write(BLC); lcd_put_u8str_P(PSTR("------")); lcd.write(BRC);
+ center_text_P(PSTR(SHORT_BUILD_VERSION), 3);
+ center_text_P(PSTR(MARLIN_WEBSITE_URL), 4);
+ picBits = ICON_LOGO;
+ lcd.print_screen();
+ safe_delay(1500);
+ }
+
+#endif // SHOW_BOOTSCREEN
+
+void MarlinUI::draw_kill_screen() {
+ if (!PanelDetected) return;
+ lcd.clear_buffer();
+ lcd.setCursor(0, 3); lcd.write(COLOR_ERROR);
+ lcd.setCursor((LCD_WIDTH - utf8_strlen(status_message)) / 2 + 1, 3);
+ lcd_put_u8str(status_message);
+ center_text_P(GET_TEXT(MSG_HALTED), 5);
+ center_text_P(GET_TEXT(MSG_PLEASE_RESET), 6);
+ lcd.print_screen();
+}
+
+//
+// Before homing, blink '123' <-> '???'.
+// Homed but unknown... '123' <-> ' '.
+// Homed and known, display constantly.
+//
+FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) {
+ lcd.write('X' + uint8_t(axis));
+ if (blink)
+ lcd.print(value);
+ else {
+ if (!TEST(axis_homed, axis))
+ while (const char c = *value++) lcd.write(c <= '.' ? c : '?');
+ else {
+ #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING)
+ if (!TEST(axis_known_position, axis))
+ lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" "));
+ else
+ #endif
+ lcd_put_u8str(value);
+ }
+ }
+}
+
+FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *prefix, const bool blink) {
+ uint8_t pic_hot_bits;
+ #if HAS_HEATED_BED
+ const bool isBed = heater_id < 0;
+ const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id));
+ const float t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id));
+ #else
+ const float t1 = thermalManager.degHotend(heater_id);
+ const float t2 = thermalManager.degTargetHotend(heater_id);
+ #endif
+
+ #if HOTENDS < 2
+ if (heater_id == H_E0) {
+ lcd.setCursor(2, 5); lcd.print(prefix); //HE
+ lcd.setCursor(1, 6); lcd.print(i16tostr3rj(t1 + 0.5));
+ lcd.setCursor(1, 7);
+ }
+ else {
+ lcd.setCursor(6, 5); lcd.print(prefix); //BED
+ lcd.setCursor(6, 6); lcd.print(i16tostr3rj(t1 + 0.5));
+ lcd.setCursor(6, 7);
+ }
+ #else
+ if (heater_id > H_BED) {
+ lcd.setCursor(heater_id * 4, 5); lcd.print(prefix); //HE1 or HE2 or HE3
+ lcd.setCursor(heater_id * 4, 6); lcd.print(i16tostr3rj(t1 + 0.5));
+ lcd.setCursor(heater_id * 4, 7);
+ }
+ else {
+ lcd.setCursor(13, 5); lcd.print(prefix); //BED
+ lcd.setCursor(13, 6); lcd.print(i16tostr3rj(t1 + 0.5));
+ lcd.setCursor(13, 7);
+ }
+ #endif // HOTENDS <= 1
+
+ #if !HEATER_IDLE_HANDLER
+ UNUSED(blink);
+ #else
+ if (!blink && thermalManager.heater_idle[thermalManager.idle_index_for_id(heater_id)].timed_out) {
+ lcd.write(' ');
+ if (t2 >= 10) lcd.write(' ');
+ if (t2 >= 100) lcd.write(' ');
+ }
+ else
+ #endif // !HEATER_IDLE_HANDLER
+ lcd.print(i16tostr3rj(t2 + 0.5));
+
+ switch (heater_id) {
+ case H_BED: pic_hot_bits = ICON_BED; break;
+ case H_E0: pic_hot_bits = ICON_TEMP1; break;
+ case H_E1: pic_hot_bits = ICON_TEMP2; break;
+ case H_E2: pic_hot_bits = ICON_TEMP3;
+ default: break;
+ }
+
+ if (t2) picBits |= pic_hot_bits;
+ else picBits &= ~pic_hot_bits;
+
+ if (t1 > 50) hotBits |= pic_hot_bits;
+ else hotBits &= ~pic_hot_bits;
+
+ if (hotBits) picBits |= ICON_HOT;
+ else picBits &= ~ICON_HOT;
+}
+
+#if HAS_PRINT_PROGRESS
+
+ FORCE_INLINE void _draw_print_progress() {
+ if (!PanelDetected) return;
+ const uint8_t progress = ui._get_progress();
+ #if ENABLED(SDSUPPORT)
+ lcd_put_u8str_P(PSTR("SD"));
+ #elif ENABLED(LCD_SET_PROGRESS_MANUALLY)
+ lcd_put_u8str_P(PSTR("P:"));
+ #endif
+ if (progress)
+ lcd.print(ui8tostr3rj(progress));
+ else
+ lcd_put_u8str_P(PSTR("---"));
+ lcd.write('%');
+ }
+
+#endif // HAS_PRINT_PROGRESS
+
+#if ENABLED(LCD_PROGRESS_BAR)
+
+ void MarlinUI::draw_progress_bar(const uint8_t percent) {
+ if (!PanelDetected) return;
+ if (fb == &framebuffer[0] + LCD_WIDTH * 2) { // For status screen
+ lcd.write('%'); lcd.write(percent);
+ }
+ else { // For progress bar test
+ lcd.setCursor(LCD_WIDTH / 2 - 2, LCD_HEIGHT / 2 - 2);
+ lcd.print(i16tostr3rj(percent)); lcd.write('%');
+ lcd.print_line();
+ lcd.setCursor(0, LCD_HEIGHT / 2 - 1);
+ lcd.write('%'); lcd.write(percent);
+ lcd.print_line();
+ }
+ }
+
+#endif
+
+void MarlinUI::draw_status_message(const bool blink) {
+ if (!PanelDetected) return;
+ lcd.setCursor(0, 3);
+ #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT)
+
+ // Alternate Status message and Filament display
+ if (ELAPSED(millis(), next_filament_display)) {
+ lcd_put_u8str_P(PSTR("Dia "));
+ lcd.print(ftostr12ns(filament_width_meas));
+ lcd_put_u8str_P(PSTR(" V"));
+ lcd.print(i16tostr3rj(100.0 * (
+ parser.volumetric_enabled
+ ? planner.volumetric_area_nominal / planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM]
+ : planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM]
+ )
+ ));
+ lcd.write('%');
+ return;
+ }
+
+ #endif // FILAMENT_LCD_DISPLAY && SDSUPPORT
+
+ // Get the UTF8 character count of the string
+ uint8_t slen = utf8_strlen(status_message);
+
+ #if ENABLED(STATUS_MESSAGE_SCROLLING)
+
+ static bool last_blink = false;
+
+ // If the string fits into the LCD, just print it and do not scroll it
+ if (slen <= LCD_WIDTH) {
+
+ // The string isn't scrolling and may not fill the screen
+ lcd_put_u8str(status_message);
+
+ // Fill the rest with spaces
+ while (slen < LCD_WIDTH) { lcd.write(' '); ++slen; }
+ }
+ else {
+ // String is larger than the available space in screen.
+
+ // Get a pointer to the next valid UTF8 character
+ // and the string remaining length
+ uint8_t rlen;
+ const char *stat = status_and_len(rlen);
+ lcd_put_u8str_max(stat, LCD_WIDTH); // The string leaves space
+
+ // If the remaining string doesn't completely fill the screen
+ if (rlen < LCD_WIDTH) {
+ lcd.write('.'); // Always at 1+ spaces left, draw a dot
+ uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters
+ if (--chars) { // Draw a second dot if there's space
+ lcd.write('.');
+ if (--chars)
+ lcd_put_u8str_max(status_message, chars); // Print a second copy of the message
+ }
+ }
+ if (last_blink != blink) {
+ last_blink = blink;
+ advance_status_scroll();
+ }
+ }
+
+ #else
+
+ UNUSED(blink);
+
+ // Just print the string to the LCD
+ lcd_put_u8str_max(status_message, LCD_WIDTH);
+
+ // Fill the rest with spaces if there are missing spaces
+ while (slen < LCD_WIDTH) {
+ lcd.write(' ');
+ ++slen;
+ }
+
+ #endif
+}
+
+/**
+Possible status screens:
+
+Equal to 20x10 text LCD
+
+|X 000 Y 000 Z 000.00|
+|FR100% SD100% C--:--|
+| Progress bar line |
+|Status message |
+| |
+| HE BED FAN |
+| ttc ttc % | ttc - current temperature
+| tts tts %%% | tts - setted temperature, %%% - percent for FAN
+| ICO ICO ICO ICO | ICO - icon 48x48, placed in 2 text lines
+| ICO ICO ICO ICO | ICO /
+
+or
+
+|X 000 Y 000 Z 000.00|
+|FR100% SD100% C--:--|
+| Progress bar line |
+|Status message |
+| |
+|HE1 HE2 HE3 BED ICO|
+|ttc ttc ttc ttc ICO|
+|tts tts tts tts %%%|
+|ICO ICO ICO ICO ICO|
+|ICO ICO ICO ICO ICO|
+
+or
+
+Equal to 24x10 text LCD
+
+|X 000 Y 000 Z 000.00 |
+|FR100% SD100% C--:--|
+| Progress bar line |
+|Status message |
+| |
+|HE1 HE2 HE3 BED FAN |
+|ttc ttc ttc ttc % |
+|tts tts tts tts %%% |
+|ICO ICO ICO ICO ICO ICO|
+|ICO ICO ICO ICO ICO ICO|
+*/
+
+void MarlinUI::draw_status_screen() {
+ if (!PanelDetected) return;
+
+ const bool blink = get_blink();
+
+ lcd.clear_buffer();
+
+ //
+ // Line 1 - XYZ coordinates
+ //
+
+ lcd.setCursor(0, 0);
+ _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); lcd.write(' ');
+ _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); lcd.write(' ');
+ _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink);
+
+ #if HAS_LEVELING && !HAS_HEATED_BED
+ lcd.write(planner.leveling_active || blink ? '_' : ' ');
+ #endif
+
+ //
+ // Line 2 - feedrate, , time
+ //
+
+ lcd.setCursor(0, 1);
+ lcd_put_u8str_P(PSTR("FR")); lcd.print(i16tostr3rj(feedrate_percentage)); lcd.write('%');
+
+ #if BOTH(SDSUPPORT, HAS_PRINT_PROGRESS)
+ lcd.setCursor(LCD_WIDTH / 2 - 3, 1);
+ _draw_print_progress();
+ #endif
+
+ char buffer[10];
+ duration_t elapsed = print_job_timer.duration();
+ uint8_t len = elapsed.toDigital(buffer);
+
+ lcd.setCursor((LCD_WIDTH - 1) - len, 1);
+ lcd.write(0x07); lcd.print(buffer); // LCD_CLOCK_CHAR
+
+ //
+ // Line 3 - progressbar
+ //
+
+ lcd.setCursor(0, 2);
+ #if ENABLED(LCD_PROGRESS_BAR)
+ draw_progress_bar(_get_progress());
+ #else
+ lcd.write('%'); lcd.write(0);
+ #endif
+
+ //
+ // Line 4 - Status Message (which may be a Filament display)
+ //
+
+ draw_status_message(blink);
+
+ //
+ // Line 5
+ //
+
+ #if HOTENDS <= 1 || (HOTENDS <= 2 && !HAS_HEATED_BED)
+ #if DUAL_MIXING_EXTRUDER
+ lcd.setCursor(0, 4);
+ // Two-component mix / gradient instead of XY
+ char mixer_messages[12];
+ const char *mix_label;
+ #if ENABLED(GRADIENT_MIX)
+ if (mixer.gradient.enabled) {
+ mixer.update_mix_from_gradient();
+ mix_label = "Gr";
+ }
+ else
+ #endif
+ {
+ mixer.update_mix_from_vtool();
+ mix_label = "Mx";
+ }
+ sprintf_P(mixer_messages, PSTR("%s %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1]));
+ lcd_put_u8str(mixer_messages);
+ #endif
+ #endif
+
+ //
+ // Line 6..8 Temperatures, FAN
+ //
+
+ #if HOTENDS < 2
+ _draw_heater_status(H_E0, "HE", blink); // Hotend Temperature
+ #else
+ _draw_heater_status(H_E0, "HE1", blink); // Hotend 1 Temperature
+ _draw_heater_status(H_E1, "HE2", blink); // Hotend 2 Temperature
+ #if HOTENDS > 2
+ _draw_heater_status(H_E2, "HE3", blink); // Hotend 3 Temperature
+ #endif
+ #endif // HOTENDS <= 1
+
+ #if HAS_HEATED_BED
+ #if HAS_LEVELING
+ _draw_heater_status(H_BED, (planner.leveling_active && blink ? "___" : "BED"), blink);
+ #else
+ _draw_heater_status(H_BED, "BED", blink);
+ #endif
+ #endif // HAS_HEATED_BED
+
+ #if FAN_COUNT > 0
+ uint16_t spd = thermalManager.fan_speed[0];
+
+ #if ENABLED(ADAPTIVE_FAN_SLOWING)
+ if (!blink) spd = thermalManager.scaledFanSpeed(0, spd);
+ #endif
+
+ uint16_t per = thermalManager.fanPercent(spd);
+ #if HOTENDS < 2
+ #define FANX 11
+ #else
+ #define FANX 17
+ #endif
+ lcd.setCursor(FANX, 5); lcd_put_u8str_P(PSTR("FAN"));
+ lcd.setCursor(FANX + 1, 6); lcd.write('%');
+ lcd.setCursor(FANX, 7);
+ lcd.print(i16tostr3rj(per));
+
+ if (TERN0(HAS_FAN0, thermalManager.fan_speed[0]) || TERN0(HAS_FAN1, thermalManager.fan_speed[1]) || TERN0(HAS_FAN2, thermalManager.fan_speed[2]))
+ picBits |= ICON_FAN;
+ else
+ picBits &= ~ICON_FAN;
+
+ #endif // FAN_COUNT > 0
+
+ //
+ // Line 9, 10 - icons
+ //
+ lcd.print_screen();
+}
+
+#if HAS_LCD_MENU
+
+ #include "../menu/menu.h"
+
+ #if ENABLED(ADVANCED_PAUSE_FEATURE)
+
+ void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) {
+ if (!PanelDetected) return;
+ lcd.setCursor((LCD_WIDTH - 14) / 2, row + 1);
+ lcd.write(0x02); lcd_put_u8str_P(" E"); lcd.write('1' + extruder); lcd.write(' ');
+ lcd.print(i16tostr3rj(thermalManager.degHotend(extruder))); lcd.write(0x01); lcd.write('/');
+ lcd.print(i16tostr3rj(thermalManager.degTargetHotend(extruder))); lcd.write(0x01);
+ lcd.print_line();
+ }
+
+ #endif // ADVANCED_PAUSE_FEATURE
+
+ // Draw a static item with no left-right margin required. Centered by default.
+ void MenuItem_static::draw(const uint8_t row, PGM_P const pstr, const uint8_t style/*=SS_DEFAULT*/, const char * const valstr/*=nullptr*/) {
+ if (!PanelDetected) return;
+ uint8_t n = LCD_WIDTH;
+ lcd.setCursor(0, row);
+ if ((style & SS_CENTER) && !valstr) {
+ int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2;
+ while (--pad >= 0) { lcd.write(' '); n--; }
+ }
+ n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n);
+ if (valstr) n -= lcd_put_u8str_max(valstr, n);
+ for (; n; --n) lcd.write(' ');
+ lcd.print_line();
+ }
+
+ // Draw a generic menu item with pre_char (if selected) and post_char
+ void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, const char pre_char, const char post_char) {
+ if (!PanelDetected) return;
+ lcd.setCursor(0, row);
+ lcd.write(sel ? pre_char : ' ');
+ uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2);
+ for (; n; --n) lcd.write(' ');
+ lcd.write(post_char);
+ lcd.print_line();
+ }
+
+ // Draw a menu item with a (potentially) editable value
+ void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) {
+ if (!PanelDetected) return;
+ const uint8_t vlen = data ? (pgm ? utf8_strlen_P(data) : utf8_strlen(data)) : 0;
+ lcd.setCursor(0, row);
+ lcd.write(sel ? LCD_STR_ARROW_RIGHT[0] : ' ');
+ uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vlen);
+ if (vlen) {
+ lcd.write(':');
+ for (; n; --n) lcd.write(' ');
+ if (pgm) lcd_put_u8str_P(data); else lcd_put_u8str(data);
+ }
+ lcd.print_line();
+ }
+
+ // Low-level draw_edit_screen can be used to draw an edit screen from anyplace
+ void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) {
+ if (!PanelDetected) return;
+ ui.encoder_direction_normal();
+ lcd.setCursor(0, LCD_HEIGHT - 1); //last line is free most time
+ lcd.write(COLOR_EDIT);
+ lcd_put_u8str_P(pstr);
+ if (value != nullptr) {
+ lcd.write(':');
+ lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), LCD_HEIGHT - 1); // Right-justified, padded by spaces
+ lcd.write(' '); // Overwrite char if value gets shorter
+ lcd.print(value);
+ lcd.write(' ');
+ lcd.print_line();
+ }
+ }
+
+ // The Select Screen presents a prompt and two "buttons"
+ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) {
+ if (!PanelDetected) return;
+ ui.draw_select_screen_prompt(pref, string, suff);
+ lcd.setCursor(0, LCD_HEIGHT - 1);
+ lcd.write(COLOR_EDIT);
+ lcd.write(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd.write(yesno ? ' ' : ']');
+ lcd.setCursor(LCD_WIDTH - utf8_strlen_P(yes) - 3, LCD_HEIGHT - 1);
+ lcd.write(yesno ? '[' : ' '); lcd_put_u8str_P(yes); lcd.write(yesno ? ']' : ' ');
+ lcd.print_line();
+ }
+
+ #if ENABLED(SDSUPPORT)
+
+ void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) {
+ if (!PanelDetected) return;
+ lcd.setCursor(0, row);
+ lcd.write(sel ? LCD_STR_ARROW_RIGHT[0] : ' ');
+ constexpr uint8_t maxlen = LCD_WIDTH - 2;
+ uint8_t n = maxlen - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), maxlen);
+ for (; n; --n) lcd.write(' ');
+ lcd.write(isDir ? LCD_STR_FOLDER[0] : ' ');
+ lcd.print_line();
+ }
+
+ #endif // SDSUPPORT
+
+ #if ENABLED(LCD_HAS_STATUS_INDICATORS)
+
+ void MarlinUI::update_indicators() {}
+
+ #endif // LCD_HAS_STATUS_INDICATORS
+
+ #if ENABLED(AUTO_BED_LEVELING_UBL)
+ /**
+ * Map screen:
+ * |/---------\ (00,00) |
+ * || . . . . | X:000.00|
+ * || . . . . | Y:000.00|
+ * || . . . . | Z:00.000|
+ * || . . . . | |
+ * || . . . . | |
+ * || . . . . | |
+ * |+---------/ |
+ * | |
+ * |____________________|
+ */
+ void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) {
+ if (!PanelDetected) return;
+
+ #define _LCD_W_POS 12
+
+ lcd.clear_buffer();
+
+ //print only top left corner. All frame with grid points will be printed by panel
+ lcd.setCursor(0, 0);
+ *fb++ = TLC; //top left corner - marker for plot parameters
+ *fb = (GRID_MAX_POINTS_X << 4) + GRID_MAX_POINTS_Y; //set mesh size
+
+ // Print plot position
+ lcd.setCursor(_LCD_W_POS, 0);
+ *fb++ = '('; lcd.print(i16tostr3left(x_plot));
+ *fb++ = ','; lcd.print(i16tostr3left(y_plot)); *fb = ')';
+
+ // Show all values
+ lcd.setCursor(_LCD_W_POS, 1); lcd_put_u8str_P(PSTR("X:"));
+ lcd.print(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot]))));
+ lcd.setCursor(_LCD_W_POS, 2); lcd_put_u8str_P(PSTR("Y:"));
+ lcd.print(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot]))));
+
+ // Show the location value
+ lcd.setCursor(_LCD_W_POS, 3); lcd_put_u8str_P(PSTR("Z:"));
+
+ if (!isnan(ubl.z_values[x_plot][y_plot]))
+ lcd.print(ftostr43sign(ubl.z_values[x_plot][y_plot]));
+ else
+ lcd_put_u8str_P(PSTR(" -----"));
+
+ center_text_P(GET_TEXT(MSG_UBL_FINE_TUNE_MESH), 8);
+
+ lcd.print_screen();
+ }
+
+ #endif // AUTO_BED_LEVELING_UBL
+
+#endif // HAS_LCD_MENU
+
+#endif // IS_TFTGLCD_PANEL
diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h
new file mode 100644
index 000000000000..9f54730c3c89
--- /dev/null
+++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h
@@ -0,0 +1,74 @@
+/**
+ * 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
+
+/**
+ * Implementation of the LCD display routines for a TFT GLCD displays with external controller.
+ */
+
+#include "../../inc/MarlinConfig.h"
+
+#if IS_TFTGLCD_PANEL
+
+#include "../../libs/duration_t.h"
+
+////////////////////////////////////
+// Set up button and encode mappings for each panel (into 'buttons' variable)
+//
+// This is just to map common functions (across different panels) onto the same
+// macro name. The mapping is independent of whether the button is directly connected or
+// via a shift/i2c register.
+
+////////////////////////////////////
+// Create LCD class instance and chipset-specific information
+class TFTGLCD {
+ private:
+ public:
+ TFTGLCD();
+ void clear_buffer();
+ void setCursor(uint8_t col, uint8_t row);
+ void write(char c);
+ void print(const char *line);
+ void print_line();
+ void print_screen();
+ void redraw_screen();
+ void setContrast(uint16_t contrast);
+};
+
+extern TFTGLCD lcd;
+
+#include "../fontutils.h"
+#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
+
+#ifndef EN_C
+ #define EN_C 4 //for click
+#endif
+
+#endif // IS_TFTGLCD_PANEL
diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h
index 451383045b01..276cae522ae7 100644
--- a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h
+++ b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h
@@ -25,97 +25,97 @@
Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1
Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1
Capital A Height: 7, '1' Height: 7
- Calculated Max Values w= 5 h=10 x= 5 y= 5 dx= 6 dy= 0 ascent= 8 len=10
+ Calculated Max Values w= 7 h=10 x= 5 y= 5 dx= 7 dy= 0 ascent= 8 len=10
Font Bounding box w=12 h=15 x= 0 y=-2
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent = 7 descent=-2
X Font ascent = 8 descent=-2
Max Font ascent = 8 descent=-2
*/
-const u8g_fntpgm_uint8_t ISO10646_1_5x7[1325] U8G_FONT_SECTION("ISO10646_1_5x7") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x07,0x02,0x26,0x03,0xbc,0x01,0x7f,0xfe,0x08,0xfe,0x08,
+const u8g_fntpgm_uint8_t ISO10646_1_5x7[1324] U8G_FONT_SECTION("ISO10646_1_5x7") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x07,0x02,0x25,0x03,0xbb,0x01,0x7f,0xfe,0x08,0xfe,0x08,
0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05,
0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05,
0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70,
0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8,
- 0xb8,0x88,0x88,0x70,0x20,0x05,0x06,0x06,0x06,0x00,0x01,0xe0,0x8c,0xea,0x8c,0x8a,
- 0x0a,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8,
- 0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70,
- 0x03,0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,
- 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00,
- 0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,
- 0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20,
- 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,
- 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20,
- 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,
- 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70,
- 0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02,
- 0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02,
- 0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,
- 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,
- 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,
- 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00,
- 0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,
- 0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08,
- 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05,
- 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,
- 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,
- 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0,
- 0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05,
- 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00,
- 0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06,
- 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,
- 0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,
- 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0,
- 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,
- 0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,
- 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,
- 0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88,
- 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07,
- 0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,
- 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,
- 0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,
- 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,
- 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,
- 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,
- 0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,
- 0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88,
- 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07,
- 0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,
- 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,
- 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8,
- 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07,
- 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,
- 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80,
- 0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,
- 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20,
- 0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,
- 0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,
- 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,
- 0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,
- 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06,
- 0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,
- 0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08,
- 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07,
- 0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01,
- 0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,
- 0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40,
- 0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05,
- 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,
- 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,
- 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,
- 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,
- 0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,
- 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05,
- 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,
- 0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,
- 0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,
- 0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40,
- 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80,
- 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40,
- 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff};
+ 0xb8,0x88,0x88,0x70,0x20,0x07,0x05,0x05,0x07,0x00,0x01,0xd8,0x6c,0x36,0x6c,0xd8,
+ 0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8,0x05,
+ 0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70,0x03,
+ 0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
+ 0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
+ 0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00,0x00,
+ 0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,
+ 0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20,0x40,
+ 0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,0x01,
+ 0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,
+ 0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,
+ 0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70,0x20,
+ 0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02,0x03,
+ 0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02,0x02,
+ 0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,0x20,
+ 0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,0x70,
+ 0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,
+ 0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,
+ 0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,0x50,
+ 0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08,0x88,
+ 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05,0x07,
+ 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,
+ 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,
+ 0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0,0xc0,
+ 0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05,0x06,
+ 0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00,0xf8,
+ 0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06,0x00,
+ 0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,
+ 0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,
+ 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0,0x05,
+ 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,
+ 0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,
+ 0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,
+ 0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70,
+ 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07,0x07,
+ 0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,
+ 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,
+ 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,
+ 0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,
+ 0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,0x00,
+ 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,
+ 0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0xa8,
+ 0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88,0x05,
+ 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,
+ 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,
+ 0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,
+ 0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8,0x50,
+ 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07,0x07,
+ 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,
+ 0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80,0x80,
+ 0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,0x20,
+ 0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00,
+ 0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,0x00,
+ 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,
+ 0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,0x07,
+ 0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06,0x00,
+ 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xe0,
+ 0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08,0x70,
+ 0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07,0x07,
+ 0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01,0xfe,
+ 0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80,
+ 0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40,0x40,
+ 0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05,0x05,
+ 0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,
+ 0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80,
+ 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,0x05,
+ 0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x78,
+ 0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x20,
+ 0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05,0x06,
+ 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xa8,
+ 0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07,
+ 0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00,
+ 0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40,0x80,
+ 0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80,0x80,
+ 0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40,0x40,
+ 0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff};
#else
// extended (original) font (symbols 1 - 255)
@@ -123,179 +123,179 @@ const u8g_fntpgm_uint8_t ISO10646_1_5x7[1325] U8G_FONT_SECTION("ISO10646_1_5x7")
Fontname: -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1
Copyright: Public domain terminal emulator font. Share and enjoy. original font -Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1
Capital A Height: 7, '1' Height: 7
- Calculated Max Values w= 6 h=10 x= 5 y= 7 dx= 6 dy= 0 ascent=10 len=10
+ Calculated Max Values w= 7 h=10 x= 5 y= 7 dx= 7 dy= 0 ascent=10 len=10
Font Bounding box w=12 h=15 x= 0 y=-2
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent = 7 descent=-2
X Font ascent = 8 descent=-2
Max Font ascent =10 descent=-2
*/
-const u8g_fntpgm_uint8_t ISO10646_1_5x7[2648] U8G_FONT_SECTION("ISO10646_1_5x7") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x07,0x02,0x26,0x03,0xbc,0x01,0xff,0xfe,0x0a,0xfe,0x08,
+const u8g_fntpgm_uint8_t ISO10646_1_5x7[2647] U8G_FONT_SECTION("ISO10646_1_5x7") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x07,0x02,0x25,0x03,0xbb,0x01,0xff,0xfe,0x0a,0xfe,0x08,
0xfe,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0xf0,0xc8,0x88,0x88,0x98,0x78,0x10,0x05,
0x08,0x08,0x06,0x00,0x00,0xc0,0xf8,0x88,0x88,0x88,0x88,0x88,0xf8,0x05,0x05,0x05,
0x06,0x00,0x01,0x20,0x30,0xf8,0x30,0x20,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x70,
0xf8,0x20,0x20,0x20,0x20,0xe0,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa8,
- 0xb8,0x88,0x88,0x70,0x20,0x05,0x06,0x06,0x06,0x00,0x01,0xe0,0x8c,0xea,0x8c,0x8a,
- 0x0a,0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8,
- 0x05,0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70,
- 0x03,0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
- 0x00,0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,
- 0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00,
- 0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,
- 0xa0,0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20,
- 0x40,0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,
- 0x01,0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20,
- 0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,
- 0x40,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70,
- 0x20,0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02,
- 0x03,0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02,
- 0x02,0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,
- 0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,
- 0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,
- 0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00,
- 0x00,0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,
- 0x50,0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08,
- 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05,
- 0x07,0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,
- 0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,
- 0x88,0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0,
- 0xc0,0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05,
- 0x06,0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00,
- 0xf8,0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06,
- 0x00,0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,
- 0x88,0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,
- 0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0,
- 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,
- 0x06,0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,
- 0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,
- 0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88,
- 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07,
- 0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,
- 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,
- 0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,
- 0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,
- 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,
- 0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,
- 0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,
- 0xa8,0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88,
- 0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07,
- 0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,
- 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,
- 0x88,0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8,
- 0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07,
- 0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,
- 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80,
- 0x80,0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,
- 0x20,0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20,
- 0x20,0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,
- 0x00,0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,
- 0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,
- 0x88,0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,
- 0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06,
- 0x00,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,
- 0xe0,0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08,
- 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07,
- 0x07,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01,
- 0xfe,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,
- 0x80,0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40,
- 0x40,0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05,
- 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,
- 0x70,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,
- 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,
- 0x05,0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,
- 0x78,0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,
- 0x20,0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05,
- 0x06,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,
- 0xa8,0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,
- 0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,
- 0x00,0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40,
- 0x80,0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80,
- 0x80,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40,
- 0x40,0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff,0xff,0xff,0xff,
+ 0xb8,0x88,0x88,0x70,0x20,0x07,0x05,0x05,0x07,0x00,0x01,0xd8,0x6c,0x36,0x6c,0xd8,
+ 0x05,0x09,0x09,0x06,0x00,0xff,0xf8,0xa8,0x88,0x88,0x88,0x88,0x88,0xa8,0xf8,0x05,
+ 0x0a,0x0a,0x06,0x00,0xfe,0x20,0x50,0x50,0x50,0x50,0x88,0xa8,0xa8,0x88,0x70,0x03,
+ 0x03,0x03,0x06,0x00,0x03,0x40,0xa0,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
+ 0x00,0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
+ 0x80,0x03,0x03,0x03,0x06,0x01,0x05,0xa0,0xa0,0xa0,0x05,0x06,0x06,0x06,0x00,0x00,
+ 0x50,0xf8,0x50,0x50,0xf8,0x50,0x05,0x09,0x09,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,
+ 0x70,0x28,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0xc8,0xc8,0x10,0x20,0x40,
+ 0x98,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,0x01,
+ 0x03,0x03,0x06,0x02,0x05,0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,
+ 0x40,0x80,0x80,0x80,0x40,0x40,0x20,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,
+ 0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xa8,0x70,0x20,
+ 0x70,0xa8,0x20,0x05,0x05,0x05,0x06,0x00,0x01,0x20,0x20,0xf8,0x20,0x20,0x02,0x03,
+ 0x03,0x06,0x01,0xff,0xc0,0x40,0x80,0x05,0x01,0x01,0x06,0x00,0x03,0xf8,0x02,0x02,
+ 0x02,0x06,0x01,0x00,0xc0,0xc0,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x10,0x20,
+ 0x40,0x40,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,0x70,
+ 0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xc0,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,
+ 0x06,0x00,0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,
+ 0xf8,0x08,0x10,0x30,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x30,0x50,
+ 0x90,0xf8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0xf0,0x08,0x08,0x88,
+ 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x40,0x80,0xf0,0x88,0x88,0x70,0x05,0x07,
+ 0x07,0x06,0x00,0x00,0xf8,0x08,0x10,0x10,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,
+ 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,
+ 0x88,0x78,0x08,0x10,0x60,0x02,0x05,0x05,0x06,0x01,0x00,0xc0,0xc0,0x00,0xc0,0xc0,
+ 0x02,0x06,0x06,0x06,0x01,0xff,0xc0,0xc0,0x00,0xc0,0x40,0x80,0x03,0x05,0x05,0x06,
+ 0x01,0x01,0x20,0x40,0x80,0x40,0x20,0x05,0x03,0x03,0x06,0x00,0x02,0xf8,0x00,0xf8,
+ 0x03,0x05,0x05,0x06,0x01,0x01,0x80,0x40,0x20,0x40,0x80,0x05,0x07,0x07,0x06,0x00,
+ 0x00,0x70,0x88,0x10,0x20,0x20,0x00,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,
+ 0xb8,0xa8,0xb8,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,
+ 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x48,0x48,0x70,0x48,0x48,0xf0,0x05,
+ 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,
+ 0x00,0x00,0xf0,0x48,0x48,0x48,0x48,0x48,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,
+ 0x80,0x80,0xf0,0x80,0x80,0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,
+ 0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70,
+ 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x03,0x07,0x07,
+ 0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,
+ 0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,
+ 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,
+ 0xf8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,
+ 0x07,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,0x07,0x07,0x06,0x00,
+ 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,
+ 0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0xa8,
+ 0x90,0x68,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0xa0,0x90,0x88,0x05,
+ 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,
+ 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,
+ 0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,
+ 0x50,0x50,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,0xa8,0xa8,0x50,
+ 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x07,0x07,
+ 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,
+ 0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x80,0x80,
+ 0x80,0x80,0x80,0x80,0x80,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x40,0x40,0x20,
+ 0x10,0x10,0x08,0x03,0x09,0x09,0x06,0x01,0xff,0xe0,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0xe0,0x05,0x03,0x03,0x06,0x00,0x05,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00,
+ 0xfe,0xf8,0x03,0x03,0x03,0x06,0x01,0x05,0x80,0x40,0x20,0x05,0x05,0x05,0x06,0x00,
+ 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,
+ 0x88,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x80,0x80,0x88,0x70,0x05,0x07,
+ 0x07,0x06,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x05,0x05,0x05,0x06,0x00,
+ 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x30,0x48,0x40,0xe0,
+ 0x40,0x40,0x40,0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x88,0x88,0x78,0x08,0x70,
+ 0x05,0x07,0x07,0x06,0x00,0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x03,0x07,0x07,
+ 0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x04,0x09,0x09,0x06,0x01,0xfe,
+ 0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80,
+ 0x80,0x88,0x90,0xe0,0x90,0x88,0x03,0x07,0x07,0x06,0x01,0x00,0xc0,0x40,0x40,0x40,
+ 0x40,0x40,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x05,0x05,
+ 0x05,0x06,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,
+ 0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80,
+ 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x05,0x05,
+ 0x05,0x06,0x00,0x00,0xb0,0xc8,0x80,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x78,
+ 0x80,0x70,0x08,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x20,
+ 0x18,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x05,0x05,0x05,0x06,
+ 0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xa8,
+ 0xa8,0x50,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07,
+ 0x06,0x00,0xfe,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00,
+ 0xf8,0x10,0x20,0x40,0xf8,0x03,0x09,0x09,0x06,0x01,0xff,0x20,0x40,0x40,0x40,0x80,
+ 0x40,0x40,0x40,0x20,0x01,0x09,0x09,0x06,0x02,0xff,0x80,0x80,0x80,0x80,0x80,0x80,
+ 0x80,0x80,0x80,0x03,0x09,0x09,0x06,0x01,0xff,0x80,0x40,0x40,0x40,0x20,0x40,0x40,
+ 0x40,0x80,0x05,0x03,0x03,0x06,0x00,0x02,0x48,0xa8,0x90,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
- 0x06,0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,
- 0x05,0x07,0x07,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,0xa8,0x70,0x20,0x05,0x07,0x07,
- 0x06,0x00,0x00,0x30,0x48,0x40,0xe0,0x40,0x48,0xb0,0x05,0x05,0x05,0x06,0x00,0x00,
- 0xa8,0x50,0x88,0x50,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xf8,0x20,0xf8,
- 0x20,0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x04,
- 0x08,0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xe0,0x03,0x01,0x01,
- 0x06,0x01,0x07,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4,0xb4,0x84,
- 0x78,0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xa0,0x60,0x00,0xe0,0x05,0x05,0x05,0x06,
- 0x00,0x00,0x28,0x50,0xa0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xf8,0x08,0x08,
- 0x03,0x01,0x01,0x06,0x01,0x03,0xe0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,
- 0xa4,0xa4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xf8,0x04,0x04,0x04,0x06,0x01,
- 0x05,0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,
- 0x00,0xf8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xa0,0x20,0x40,0xe0,0x03,0x05,0x05,
- 0x06,0x01,0x04,0xc0,0x20,0x40,0x20,0xc0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40,
- 0x80,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x08,
- 0x08,0x06,0x00,0x00,0x78,0xe8,0xe8,0xe8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06,
- 0x02,0x03,0xc0,0xc0,0x03,0x02,0x02,0x06,0x01,0xfe,0x20,0xc0,0x03,0x05,0x05,0x06,
- 0x01,0x04,0x40,0xc0,0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xa0,0x40,
- 0x00,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0,0x05,0x0a,0x0a,
- 0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xb0,0x50,0x78,0x10,0x05,0x0a,0x0a,
- 0x06,0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xa8,0x08,0x10,0x38,0x05,0x0a,0x0a,
- 0x06,0x00,0x00,0xc0,0x20,0x48,0x30,0xe0,0x50,0xb0,0x50,0x78,0x10,0x05,0x07,0x07,
- 0x06,0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,
- 0x40,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,
- 0x10,0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,
- 0x20,0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,
- 0x68,0xb0,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,
- 0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,
- 0x50,0x20,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78,
- 0xa0,0xa0,0xf0,0xa0,0xa0,0xb8,0x05,0x09,0x09,0x06,0x00,0xfe,0x70,0x88,0x80,0x80,
- 0x80,0x88,0x70,0x10,0x60,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80,
- 0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80,
- 0x80,0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0xf8,0x80,
- 0x80,0xf0,0x80,0x80,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80,
- 0xf0,0x80,0x80,0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x80,0x40,0x00,0xe0,0x40,0x40,
- 0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xe0,0x40,0x40,
- 0x40,0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x40,0xa0,0x00,0xe0,0x40,0x40,
- 0x40,0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40,0x40,0x40,
- 0x40,0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xe8,0x48,0x48,0x70,
- 0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,
- 0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,
- 0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,
- 0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,
- 0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,
- 0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,
- 0x05,0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xff,
- 0x08,0x70,0x98,0xa8,0xa8,0xa8,0xc8,0x70,0x80,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,
- 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,
- 0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,
- 0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x06,
+ 0x05,0xff,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x05,
+ 0x07,0x07,0x06,0x00,0xff,0x20,0x70,0xa8,0xa0,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,
+ 0x00,0x00,0x30,0x48,0x40,0xe0,0x40,0x48,0xb0,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,
+ 0x50,0x88,0x50,0xa8,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x50,0xf8,0x20,0xf8,0x20,
+ 0x20,0x01,0x07,0x07,0x06,0x02,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x04,0x08,
+ 0x08,0x06,0x01,0x00,0x70,0x80,0x60,0x90,0x90,0x60,0x10,0xe0,0x03,0x01,0x01,0x06,
+ 0x01,0x07,0xa0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4,0xb4,0x84,0x78,
+ 0x03,0x05,0x05,0x06,0x01,0x04,0x60,0xa0,0x60,0x00,0xe0,0x05,0x05,0x05,0x06,0x00,
+ 0x00,0x28,0x50,0xa0,0x50,0x28,0x05,0x03,0x03,0x06,0x00,0x01,0xf8,0x08,0x08,0x03,
+ 0x01,0x01,0x06,0x01,0x03,0xe0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0xb4,0xa4,
+ 0xa4,0x84,0x78,0x05,0x01,0x01,0x06,0x00,0x07,0xf8,0x04,0x04,0x04,0x06,0x01,0x05,
+ 0x60,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,
+ 0xf8,0x03,0x05,0x05,0x06,0x01,0x04,0x40,0xa0,0x20,0x40,0xe0,0x03,0x05,0x05,0x06,
+ 0x01,0x04,0xc0,0x20,0x40,0x20,0xc0,0x03,0x03,0x03,0x06,0x01,0x05,0x20,0x40,0x80,
+ 0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,0x98,0xe8,0x80,0x80,0x05,0x08,0x08,
+ 0x06,0x00,0x00,0x78,0xe8,0xe8,0xe8,0x68,0x28,0x28,0x28,0x02,0x02,0x02,0x06,0x02,
+ 0x03,0xc0,0xc0,0x03,0x02,0x02,0x06,0x01,0xfe,0x20,0xc0,0x03,0x05,0x05,0x06,0x01,
+ 0x04,0x40,0xc0,0x40,0x40,0xe0,0x03,0x05,0x05,0x06,0x01,0x05,0x40,0xa0,0x40,0x00,
+ 0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0xa0,0x50,0x28,0x50,0xa0,0x05,0x0a,0x0a,0x06,
+ 0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xb0,0x50,0x78,0x10,0x05,0x0a,0x0a,0x06,
+ 0x00,0x00,0x40,0xc0,0x48,0x50,0x60,0x50,0xa8,0x08,0x10,0x38,0x05,0x0a,0x0a,0x06,
+ 0x00,0x00,0xc0,0x20,0x48,0x30,0xe0,0x50,0xb0,0x50,0x78,0x10,0x05,0x07,0x07,0x06,
+ 0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,
+ 0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,
+ 0x20,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,
+ 0x50,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x68,
+ 0xb0,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x50,
+ 0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,
+ 0x20,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0xa0,
+ 0xa0,0xf0,0xa0,0xa0,0xb8,0x05,0x09,0x09,0x06,0x00,0xfe,0x70,0x88,0x80,0x80,0x80,
+ 0x88,0x70,0x10,0x60,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0xf8,0x80,0x80,
+ 0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0xf8,0x80,0x80,
+ 0xf0,0x80,0x80,0xf8,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0xf8,0x80,0x80,
+ 0xf0,0x80,0x80,0xf8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xf8,0x80,0x80,0xf0,
+ 0x80,0x80,0xf8,0x03,0x0a,0x0a,0x06,0x01,0x00,0x80,0x40,0x00,0xe0,0x40,0x40,0x40,
+ 0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x20,0x40,0x00,0xe0,0x40,0x40,0x40,
+ 0x40,0x40,0xe0,0x03,0x0a,0x0a,0x06,0x01,0x00,0x40,0xa0,0x00,0xe0,0x40,0x40,0x40,
+ 0x40,0x40,0xe0,0x03,0x09,0x09,0x06,0x01,0x00,0xa0,0x00,0xe0,0x40,0x40,0x40,0x40,
+ 0x40,0xe0,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x48,0x48,0xe8,0x48,0x48,0x70,0x05,
+ 0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x05,
+ 0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,
+ 0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,
+ 0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,
+ 0x0a,0x0a,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,
+ 0x09,0x09,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x05,
+ 0x05,0x06,0x00,0x01,0x88,0x50,0x20,0x50,0x88,0x05,0x09,0x09,0x06,0x00,0xff,0x08,
+ 0x70,0x98,0xa8,0xa8,0xa8,0xc8,0x70,0x80,0x05,0x0a,0x0a,0x06,0x00,0x00,0x40,0x20,
0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,
- 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xe0,
- 0x90,0x90,0x90,0xe0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xa0,0x90,
- 0x88,0xb0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78,
- 0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,
- 0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,
- 0x00,0x00,0x68,0xb0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,
- 0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,
- 0x70,0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xa0,0x78,
- 0x05,0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08,
- 0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,
- 0x00,0x10,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,
- 0x50,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,
- 0x88,0xf0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xc0,0x40,0x40,
- 0x40,0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,
- 0x03,0x08,0x08,0x06,0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03,0x07,
- 0x07,0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x05,0x09,0x09,0x06,0x00,
- 0x00,0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,
- 0x68,0xb0,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,
- 0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,
- 0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,
- 0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x70,
- 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,
- 0x06,0x00,0x01,0x20,0x00,0xf8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98,
- 0xa8,0xc8,0xf0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,
- 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x70,0x05,
- 0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,
- 0x06,0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe,
- 0x10,0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,
- 0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x50,
- 0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80};
+ 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x20,0x50,
+ 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,
+ 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0x00,0x10,0x20,0x00,
+ 0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0xe0,0x90,
+ 0x90,0x90,0xe0,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x90,0xa0,0x90,0x88,
+ 0xb0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,
+ 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,
+ 0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,
+ 0x00,0x68,0xb0,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x50,
+ 0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x70,
+ 0x08,0x78,0x88,0x78,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x28,0x70,0xa0,0x78,0x05,
+ 0x07,0x07,0x06,0x00,0xfe,0x70,0x88,0x80,0x88,0x70,0x10,0x60,0x05,0x08,0x08,0x06,
+ 0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,
+ 0x10,0x20,0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,
+ 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,
+ 0xf0,0x80,0x70,0x03,0x08,0x08,0x06,0x01,0x00,0x80,0x40,0x00,0xc0,0x40,0x40,0x40,
+ 0xe0,0x03,0x08,0x08,0x06,0x01,0x00,0x20,0x40,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03,
+ 0x08,0x08,0x06,0x01,0x00,0x40,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x03,0x07,0x07,
+ 0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0x40,0xe0,0x05,0x09,0x09,0x06,0x00,0x00,
+ 0x50,0x20,0x50,0x08,0x78,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,
+ 0xb0,0x00,0xb0,0xc8,0x88,0x88,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,
+ 0x70,0x88,0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,
+ 0x88,0x88,0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x70,0x88,0x88,0x88,
+ 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x68,0xb0,0x00,0x70,0x88,0x88,0x88,0x70,0x05,
+ 0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,
+ 0x00,0x01,0x20,0x00,0xf8,0x00,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x98,0xa8,
+ 0xc8,0xf0,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x70,
+ 0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x08,
+ 0x08,0x06,0x00,0x00,0x20,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,
+ 0x00,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x05,0x0a,0x0a,0x06,0x00,0xfe,0x10,
+ 0x20,0x00,0x88,0x88,0x88,0x50,0x20,0x40,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x80,
+ 0x80,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x05,0x09,0x09,0x06,0x00,0xfe,0x50,0x00,
+ 0x88,0x88,0x88,0x50,0x20,0x40,0x80};
#endif
diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ru.h b/Marlin/src/lcd/dogm/fontdata/langdata_ru.h
index cd0efda12f6d..87e3d422a578 100644
--- a/Marlin/src/lcd/dogm/fontdata/langdata_ru.h
+++ b/Marlin/src/lcd/dogm/fontdata/langdata_ru.h
@@ -5,8 +5,8 @@
*/
#include
-const u8g_fntpgm_uint8_t fontpage_8_144_152[135] U8G_FONT_SECTION("fontpage_8_144_152") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x98,0x00,0x07,0xff,0x00,
+const u8g_fntpgm_uint8_t fontpage_8_144_168[348] U8G_FONT_SECTION("fontpage_8_144_168") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0xa8,0x00,0x0a,0xfe,0x00,
0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,
0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,
0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,
@@ -14,29 +14,27 @@ const u8g_fntpgm_uint8_t fontpage_8_144_152[135] U8G_FONT_SECTION("fontpage_8_14
0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,
0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x70,0xa8,0xa8,0x05,0x07,0x07,
0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,
- 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88};
-const u8g_fntpgm_uint8_t fontpage_8_154_168[214] U8G_FONT_SECTION("fontpage_8_154_168") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9a,0xa8,0x00,0x07,0xfe,0x00,
- 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x05,0x07,
- 0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00,
- 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,
- 0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,
- 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,
- 0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,
- 0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,
- 0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x88,
- 0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xa8,0xa8,0xa8,0x70,0x20,
- 0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x09,0x09,
- 0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x07,0x07,0x06,
- 0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,
- 0xa8,0xa8,0xa8,0xa8,0xa8,0xf8};
+ 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x88,0x70,0x00,
+ 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,
+ 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,
+ 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,
+ 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,
+ 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88,
+ 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,
+ 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,
+ 0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,
+ 0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,
+ 0x70,0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,
+ 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,
+ 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05,
+ 0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8};
const u8g_fntpgm_uint8_t fontpage_8_171_173[56] U8G_FONT_SECTION("fontpage_8_171_173") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xab,0xad,0x00,0x07,0x00,0x00,
0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xc8,0xa8,0xa8,0xc8,0x04,0x07,
0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0,0x05,0x07,0x07,0x06,0x00,
0x00,0x70,0x88,0x08,0x78,0x08,0x88,0x70};
-const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_175_201") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xc9,0x00,0x08,0xfe,0x00,
+const u8g_fntpgm_uint8_t fontpage_8_175_207[400] U8G_FONT_SECTION("fontpage_8_175_207") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xcf,0x00,0x08,0xfe,0x00,
0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05,
0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70,
0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88,
@@ -56,23 +54,20 @@ const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_17
0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,
0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00,
0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,
- 0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08};
-const u8g_fntpgm_uint8_t fontpage_8_203_207[72] U8G_FONT_SECTION("fontpage_8_203_207") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcb,0xcf,0x00,0x05,0x00,0x00,
- 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xc8,0xa8,0xc8,0x04,0x05,0x05,0x06,
- 0x01,0x00,0x80,0x80,0xe0,0x90,0xe0,0x04,0x05,0x05,0x06,0x01,0x00,0xe0,0x10,0x70,
- 0x10,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,
- 0x06,0x01,0x00,0x70,0x90,0x70,0x50,0x90};
+ 0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08,0x05,0x05,
+ 0x05,0x06,0x00,0x00,0xc0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88,
+ 0x88,0xc8,0xa8,0xc8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0xe0,0x04,
+ 0x05,0x05,0x06,0x01,0x00,0xe0,0x10,0x70,0x10,0xe0,0x05,0x05,0x05,0x06,0x00,0x00,
+ 0x90,0xa8,0xe8,0xa8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70,0x50,0x90
+ };
const u8g_fntpgm_uint8_t fontpage_8_209_209[30] U8G_FONT_SECTION("fontpage_8_209_209") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x07,0x00,0x00,
0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xf0,0x80,0x70};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
- FONTDATA_ITEM(8, 144, 152, fontpage_8_144_152), // 'А' -- 'И'
- FONTDATA_ITEM(8, 154, 168, fontpage_8_154_168), // 'К' -- 'Ш'
+ FONTDATA_ITEM(8, 144, 168, fontpage_8_144_168), // 'А' -- 'Ш'
FONTDATA_ITEM(8, 171, 173, fontpage_8_171_173), // 'Ы' -- 'Э'
- FONTDATA_ITEM(8, 175, 201, fontpage_8_175_201), // 'Я' -- 'щ'
- FONTDATA_ITEM(8, 203, 207, fontpage_8_203_207), // 'ы' -- 'я'
+ FONTDATA_ITEM(8, 175, 207, fontpage_8_175_207), // 'Я' -- 'я'
FONTDATA_ITEM(8, 209, 209, fontpage_8_209_209), // 'ё' -- 'ё'
};
diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_uk.h b/Marlin/src/lcd/dogm/fontdata/langdata_uk.h
index 5d34d1b994ef..e3800eb6bb85 100644
--- a/Marlin/src/lcd/dogm/fontdata/langdata_uk.h
+++ b/Marlin/src/lcd/dogm/fontdata/langdata_uk.h
@@ -8,60 +8,55 @@
const u8g_fntpgm_uint8_t fontpage_8_134_134[30] U8G_FONT_SECTION("fontpage_8_134_134") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x07,0x00,0x00,
0x00,0x03,0x07,0x07,0x06,0x01,0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0xe0};
-const u8g_fntpgm_uint8_t fontpage_8_144_146[56] U8G_FONT_SECTION("fontpage_8_144_146") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0x92,0x00,0x07,0x00,0x00,
+const u8g_fntpgm_uint8_t fontpage_8_144_169[363] U8G_FONT_SECTION("fontpage_8_144_169") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x90,0xa9,0x00,0x0a,0xfe,0x00,
0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,
0x07,0x06,0x00,0x00,0xf0,0x80,0x80,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,
- 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0};
-const u8g_fntpgm_uint8_t fontpage_8_148_149[44] U8G_FONT_SECTION("fontpage_8_148_149") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x94,0x95,0x00,0x07,0xff,0x00,
- 0x00,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50,0x50,0xf8,0x88,0x05,
- 0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8};
-const u8g_fntpgm_uint8_t fontpage_8_151_154[72] U8G_FONT_SECTION("fontpage_8_151_154") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x97,0x9a,0x00,0x0a,0x00,0x00,
- 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,
- 0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,
- 0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,
- 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88};
-const u8g_fntpgm_uint8_t fontpage_8_156_164[134] U8G_FONT_SECTION("fontpage_8_156_164") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9c,0xa4,0x00,0x07,0x00,0x00,
- 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,
+ 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,
+ 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0x50,
+ 0x50,0xf8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,
+ 0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0x70,0x20,0x70,0xa8,0xa8,0x05,0x07,0x07,
+ 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,
+ 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x0a,0x0a,0x06,0x00,0x00,0x88,0x70,0x00,
+ 0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xa0,
+ 0xc0,0xa0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,
+ 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x05,0x07,
0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,
0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xf8,0x88,
0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,
0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x05,
0x07,0x07,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,
0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,
- 0x70,0xa8,0xa8,0xa8,0x70,0x20};
-const u8g_fntpgm_uint8_t fontpage_8_166_166[32] U8G_FONT_SECTION("fontpage_8_166_166") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa6,0xa6,0x00,0x07,0xfe,0x00,
- 0x00,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,0x08,0x08
- };
-const u8g_fntpgm_uint8_t fontpage_8_168_168[30] U8G_FONT_SECTION("fontpage_8_168_168") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xa8,0xa8,0x00,0x07,0x00,0x00,
- 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8};
-const u8g_fntpgm_uint8_t fontpage_8_176_201[321] U8G_FONT_SECTION("fontpage_8_176_201") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb0,0xc9,0x00,0x08,0xfe,0x00,
- 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,
- 0x00,0x00,0x70,0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,
- 0x88,0xf0,0x88,0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,
- 0x06,0x06,0x06,0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,
- 0x00,0x70,0x88,0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,
- 0xa8,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,
- 0x00,0x00,0x88,0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,
- 0x88,0x98,0xa8,0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,
- 0x05,0x05,0x05,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,
- 0x00,0x88,0xd8,0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,
- 0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,
- 0x00,0x00,0xf8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,
- 0x88,0xf0,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,
- 0x05,0x05,0x06,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,
- 0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70,
- 0xa8,0xa8,0xa8,0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,
- 0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,
- 0x05,0x06,0x00,0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,
- 0xa8,0xa8,0xa8,0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,
- 0x08};
+ 0x70,0xa8,0xa8,0xa8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,
+ 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0x90,0x90,0xf8,
+ 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05,
+ 0x07,0x07,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8,0x05,0x09,0x09,0x06,
+ 0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08};
+const u8g_fntpgm_uint8_t fontpage_8_172_172[30] U8G_FONT_SECTION("fontpage_8_172_172") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xac,0xac,0x00,0x07,0x00,0x00,
+ 0x00,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xe0,0x90,0x90,0xe0};
+const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_175_201") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xaf,0xc9,0x00,0x08,0xfe,0x00,
+ 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05,
+ 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70,
+ 0x80,0xf0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf0,0x88,0xf0,0x88,
+ 0xf0,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06,
+ 0x00,0xff,0x30,0x50,0x50,0x50,0xf8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,
+ 0xf0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0x70,0x20,0x70,0xa8,0x05,0x05,
+ 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88,
+ 0x98,0xa8,0xc8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xa8,
+ 0xc8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xa0,0xc0,0xa0,0x90,0x05,0x05,0x05,
+ 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xd8,
+ 0xa8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xf8,0x88,0x88,0x05,0x05,
+ 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xf8,
+ 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xfe,0xf0,0x88,0x88,0x88,0xf0,0x80,
+ 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06,
+ 0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xfe,0x88,0x88,0x88,
+ 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xfe,0x20,0x20,0x70,0xa8,0xa8,0xa8,
+ 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,
+ 0x07,0x06,0x00,0xfe,0x90,0x90,0x90,0x90,0xf8,0x08,0x08,0x05,0x05,0x05,0x06,0x00,
+ 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xa8,0xa8,0xa8,0xa8,
+ 0xf8,0x05,0x07,0x07,0x06,0x00,0xfe,0xa8,0xa8,0xa8,0xa8,0xf8,0x08,0x08};
const u8g_fntpgm_uint8_t fontpage_8_204_204[28] U8G_FONT_SECTION("fontpage_8_204_204") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0x00,0x05,0x00,0x00,
0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xe0,0x90,0xe0};
@@ -72,22 +67,19 @@ const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206
const u8g_fntpgm_uint8_t fontpage_8_212_212[28] U8G_FONT_SECTION("fontpage_8_212_212") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd4,0xd4,0x00,0x05,0x00,0x00,
0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x80,0xe0,0x80,0x70};
-const u8g_fntpgm_uint8_t fontpage_8_214_214[29] U8G_FONT_SECTION("fontpage_8_214_214") = {
- 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd6,0x00,0x06,0x00,0x00,
- 0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0};
+const u8g_fntpgm_uint8_t fontpage_8_214_215[41] U8G_FONT_SECTION("fontpage_8_214_215") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd6,0xd7,0x00,0x06,0x00,0x00,
+ 0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x03,0x06,0x06,
+ 0x06,0x01,0x00,0xa0,0x00,0xc0,0x40,0x40,0xe0};
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(8, 134, 134, fontpage_8_134_134), // 'І' -- 'І'
- FONTDATA_ITEM(8, 144, 146, fontpage_8_144_146), // 'А' -- 'В'
- FONTDATA_ITEM(8, 148, 149, fontpage_8_148_149), // 'Д' -- 'Е'
- FONTDATA_ITEM(8, 151, 154, fontpage_8_151_154), // 'З' -- 'К'
- FONTDATA_ITEM(8, 156, 164, fontpage_8_156_164), // 'М' -- 'Ф'
- FONTDATA_ITEM(8, 166, 166, fontpage_8_166_166), // 'Ц' -- 'Ц'
- FONTDATA_ITEM(8, 168, 168, fontpage_8_168_168), // 'Ш' -- 'Ш'
- FONTDATA_ITEM(8, 176, 201, fontpage_8_176_201), // 'а' -- 'щ'
+ FONTDATA_ITEM(8, 144, 169, fontpage_8_144_169), // 'А' -- 'Щ'
+ FONTDATA_ITEM(8, 172, 172, fontpage_8_172_172), // 'Ь' -- 'Ь'
+ FONTDATA_ITEM(8, 175, 201, fontpage_8_175_201), // 'Я' -- 'щ'
FONTDATA_ITEM(8, 204, 204, fontpage_8_204_204), // 'ь' -- 'ь'
FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я'
FONTDATA_ITEM(8, 212, 212, fontpage_8_212_212), // 'є' -- 'є'
- FONTDATA_ITEM(8, 214, 214, fontpage_8_214_214), // 'і' -- 'і'
+ FONTDATA_ITEM(8, 214, 215, fontpage_8_214_215), // 'і' -- 'ї'
};
diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h
index de697cbef46d..af39ce5c4815 100644
--- a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h
+++ b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h
@@ -5,6 +5,9 @@
*/
#include
+const u8g_fntpgm_uint8_t fontpage_64_157_157[26] U8G_FONT_SECTION("fontpage_64_157_157") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x9d,0x9d,0x00,0x07,0x00,0x00,
+ 0x00,0x05,0x03,0x03,0x06,0x00,0x04,0xd8,0x48,0x90};
const u8g_fntpgm_uint8_t fontpage_69_191_191[28] U8G_FONT_SECTION("fontpage_69_191_191") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xbf,0xbf,0x00,0x05,0x00,0x00,
0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x08,0x18,0x28,0x48,0xf8};
@@ -381,6 +384,10 @@ const u8g_fntpgm_uint8_t fontpage_172_232_232[45] U8G_FONT_SECTION("fontpage_172
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe8,0xe8,0x00,0x0a,0xff,0x00,
0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7b,0xc0,0x4a,0x40,0x4a,0x40,0x7b,0xc0,0x04,
0x80,0xff,0xe0,0x11,0x00,0xfb,0xe0,0x4a,0x40,0x4a,0x40,0x7b,0xc0};
+const u8g_fntpgm_uint8_t fontpage_172_244_244[45] U8G_FONT_SECTION("fontpage_172_244_244") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf4,0xf4,0x00,0x0a,0xff,0x00,
+ 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x01,0x00,0xef,0xe0,0xa5,0x40,0xaf,0xe0,0xa4,
+ 0x40,0xa7,0xc0,0xe4,0x40,0x07,0xc0,0x04,0x40,0x07,0xc0,0x0c,0x60};
const u8g_fntpgm_uint8_t fontpage_173_222_222[45] U8G_FONT_SECTION("fontpage_173_222_222") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xde,0xde,0x00,0x0a,0xff,0x00,
0x00,0x0a,0x0b,0x16,0x0c,0x01,0xff,0xff,0xc0,0x80,0x40,0x80,0x40,0x9e,0x40,0x92,
@@ -941,6 +948,10 @@ const u8g_fntpgm_uint8_t fontpage_221_209_209[45] U8G_FONT_SECTION("fontpage_221
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd1,0xd1,0x00,0x0a,0xff,0x00,
0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x24,0x40,0x07,0x40,0x85,0x40,0x5f,
0xe0,0x34,0x60,0x27,0xc0,0xc4,0x40,0x47,0xc0,0x44,0x40,0x44,0xc0};
+const u8g_fntpgm_uint8_t fontpage_222_143_143[45] U8G_FONT_SECTION("fontpage_222_143_143") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x8f,0x8f,0x00,0x0a,0xff,0x00,
+ 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x4f,0xe0,0x28,0x20,0x0f,0xe0,0x98,0x00,0x5f,
+ 0xe0,0x29,0x00,0x2f,0xe0,0xcd,0xa0,0x4b,0x60,0x5d,0xa0,0x49,0x60};
const u8g_fntpgm_uint8_t fontpage_223_192_192[45] U8G_FONT_SECTION("fontpage_223_192_192") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0x00,0x0a,0xff,0x00,
0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x44,0x80,0x3e,0x80,0x12,0xe0,0x9e,0xa0,0x53,
@@ -1145,6 +1156,10 @@ const u8g_fntpgm_uint8_t fontpage_259_234_234[34] U8G_FONT_SECTION("fontpage_259
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xea,0xea,0x00,0x0a,0xff,0x00,
0x00,0x07,0x0b,0x0b,0x0c,0x02,0xff,0x20,0xfe,0x82,0x82,0xfe,0x82,0xfe,0x82,0x82,
0xfe,0x82};
+const u8g_fntpgm_uint8_t fontpage_259_243_243[45] U8G_FONT_SECTION("fontpage_259_243_243") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xf3,0xf3,0x00,0x0a,0xff,0x00,
+ 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x7f,0xc0,0x08,0x00,0x11,0x00,0x20,0x80,0x7f,
+ 0xc0,0x04,0x00,0x04,0x00,0x3f,0x80,0x04,0x00,0x04,0x00,0xff,0xe0};
const u8g_fntpgm_uint8_t fontpage_263_220_220[45] U8G_FONT_SECTION("fontpage_263_220_220") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xdc,0xdc,0x00,0x0a,0xff,0x00,
0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x11,0x00,0xff,0xe0,0x11,0x00,0x01,0xc0,0x7e,
@@ -1257,6 +1272,10 @@ const u8g_fntpgm_uint8_t fontpage_287_185_185[45] U8G_FONT_SECTION("fontpage_287
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xb9,0xb9,0x00,0x0a,0xff,0x00,
0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x41,0x00,0x21,0x00,0x2f,0xe0,0x01,0x20,0xe1,
0x20,0x21,0x20,0x22,0x20,0x24,0x20,0x28,0xc0,0x50,0x00,0x8f,0xe0};
+const u8g_fntpgm_uint8_t fontpage_287_193_193[45] U8G_FONT_SECTION("fontpage_287_193_193") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xc1,0xc1,0x00,0x0a,0xff,0x00,
+ 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x40,0xc0,0x27,0x00,0x21,0x00,0x01,0x00,0xef,
+ 0xe0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x50,0x00,0x8f,0xe0};
const u8g_fntpgm_uint8_t fontpage_287_208_209[73] U8G_FONT_SECTION("fontpage_287_208_209") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd1,0x00,0x0a,0xff,0x00,
0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0x47,0xc0,0x20,0x00,0x20,0x00,0x0f,0xe0,0xe2,
@@ -1355,6 +1374,10 @@ const u8g_fntpgm_uint8_t fontpage_300_205_205[45] U8G_FONT_SECTION("fontpage_300
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xcd,0xcd,0x00,0x0a,0xff,0x00,
0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf2,0x00,0x93,0xe0,0xa6,0x40,0xc1,0x80,0xa6,
0x60,0x91,0x00,0x97,0xe0,0xd5,0x00,0xaf,0xe0,0x81,0x00,0x81,0x00};
+const u8g_fntpgm_uint8_t fontpage_300_208_208[45] U8G_FONT_SECTION("fontpage_300_208_208") = {
+ 0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xd0,0xd0,0x00,0x0a,0xff,0x00,
+ 0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf7,0xc0,0x94,0x40,0xa7,0xc0,0xc4,0x40,0xa7,
+ 0xc0,0x95,0x00,0x95,0x20,0xd5,0x40,0xa4,0x80,0x85,0x40,0x86,0x20};
const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = {
0x00,0x0c,0x0f,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0xe4,0xe4,0x00,0x0a,0xff,0x00,
0x00,0x0b,0x0b,0x16,0x0c,0x00,0xff,0xf1,0x00,0x92,0x80,0xa4,0x40,0xcb,0xa0,0xa1,
@@ -1445,6 +1468,7 @@ const u8g_fntpgm_uint8_t fontpage_510_154_154[30] U8G_FONT_SECTION("fontpage_510
#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data }
static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
+ FONTDATA_ITEM(64, 157, 157, fontpage_64_157_157), // '”' -- '”'
FONTDATA_ITEM(69, 191, 191, fontpage_69_191_191), // '⊿' -- '⊿'
FONTDATA_ITEM(156, 128, 128, fontpage_156_128_128), // '一' -- '一'
FONTDATA_ITEM(156, 137, 139, fontpage_156_137_139), // '三' -- '下'
@@ -1533,6 +1557,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(171, 183, 183, fontpage_171_183_183), // '喷' -- '喷'
FONTDATA_ITEM(172, 180, 180, fontpage_172_180_180), // '嘴' -- '嘴'
FONTDATA_ITEM(172, 232, 232, fontpage_172_232_232), // '器' -- '器'
+ FONTDATA_ITEM(172, 244, 244, fontpage_172_244_244), // '噴' -- '噴'
FONTDATA_ITEM(173, 222, 222, fontpage_173_222_222), // '回' -- '回'
FONTDATA_ITEM(173, 224, 224, fontpage_173_224_224), // '因' -- '因'
FONTDATA_ITEM(173, 250, 250, fontpage_173_250_250), // '固' -- '固'
@@ -1671,6 +1696,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(221, 144, 144, fontpage_221_144_144), // '源' -- '源'
FONTDATA_ITEM(221, 162, 162, fontpage_221_162_162), // '溢' -- '溢'
FONTDATA_ITEM(221, 209, 209, fontpage_221_209_209), // '滑' -- '滑'
+ FONTDATA_ITEM(222, 143, 143, fontpage_222_143_143), // '漏' -- '漏'
FONTDATA_ITEM(223, 192, 192, fontpage_223_192_192), // '激' -- '激'
FONTDATA_ITEM(224, 239, 239, fontpage_224_239_239), // '灯' -- '灯'
FONTDATA_ITEM(225, 185, 185, fontpage_225_185_185), // '点' -- '点'
@@ -1722,6 +1748,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(256, 234, 234, fontpage_256_234_234), // '聪' -- '聪'
FONTDATA_ITEM(257, 253, 253, fontpage_257_253_253), // '能' -- '能'
FONTDATA_ITEM(259, 234, 234, fontpage_259_234_234), // '自' -- '自'
+ FONTDATA_ITEM(259, 243, 243, fontpage_259_243_243), // '至' -- '至'
FONTDATA_ITEM(263, 220, 220, fontpage_263_220_220), // '菜' -- '菜'
FONTDATA_ITEM(265, 221, 221, fontpage_265_221_221), // '蓝' -- '蓝'
FONTDATA_ITEM(269, 199, 199, fontpage_269_199_199), // '蛇' -- '蛇'
@@ -1750,6 +1777,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(287, 145, 145, fontpage_287_145_145), // '辑' -- '辑'
FONTDATA_ITEM(287, 147, 147, fontpage_287_147_147), // '输' -- '输'
FONTDATA_ITEM(287, 185, 185, fontpage_287_185_185), // '边' -- '边'
+ FONTDATA_ITEM(287, 193, 193, fontpage_287_193_193), // '迁' -- '迁'
FONTDATA_ITEM(287, 208, 209, fontpage_287_208_209), // '运' -- '近'
FONTDATA_ITEM(287, 212, 212, fontpage_287_212_212), // '返' -- '返'
FONTDATA_ITEM(287, 216, 216, fontpage_287_216_216), // '还' -- '还'
@@ -1774,6 +1802,7 @@ static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {
FONTDATA_ITEM(299, 244, 244, fontpage_299_244_244), // '间' -- '间'
FONTDATA_ITEM(300, 136, 136, fontpage_300_136_136), // '阈' -- '阈'
FONTDATA_ITEM(300, 205, 205, fontpage_300_205_205), // '降' -- '降'
+ FONTDATA_ITEM(300, 208, 208, fontpage_300_208_208), // '限' -- '限'
FONTDATA_ITEM(300, 228, 228, fontpage_300_228_228), // '除' -- '除'
FONTDATA_ITEM(300, 233, 233, fontpage_300_233_233), // '险' -- '险'
FONTDATA_ITEM(301, 246, 246, fontpage_301_246_246), // '零' -- '零'
diff --git a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp
index c9a55a16e3b4..a6bdb373dd70 100644
--- a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp
+++ b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp
@@ -9,7 +9,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include "ultralcd_DOGM.h"
@@ -53,4 +53,4 @@ int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) {
return ret;
}
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp
index 4b51c2949b23..82b6e768c6ad 100644
--- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp
+++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp
@@ -27,7 +27,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD && DISABLED(LIGHTWEIGHT_UI)
+#if HAS_MARLINUI_U8GLIB && DISABLED(LIGHTWEIGHT_UI)
#include "dogm_Statusscreen.h"
#include "ultralcd_DOGM.h"
@@ -913,4 +913,4 @@ void MarlinUI::draw_status_message(const bool blink) {
#endif
}
-#endif // HAS_GRAPHICAL_LCD && !LIGHTWEIGHT_UI
+#endif // HAS_MARLINUI_U8GLIB && !LIGHTWEIGHT_UI
diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp
index 211acc86c6d4..806f370db327 100644
--- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp
+++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp
@@ -11,7 +11,6 @@
* any later version. The code is distributed WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
- *
*/
/**
diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h
index 9f0815d099ce..b21724648484 100644
--- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h
+++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h
@@ -11,7 +11,6 @@
* any later version. The code is distributed WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
- *
*/
#pragma once
diff --git a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp
index 70cb7c66d793..f97a323350ee 100644
--- a/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp
+++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp
@@ -67,7 +67,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include "HAL_LCD_com_defines.h"
@@ -300,4 +300,4 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s
return 1;
}
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp
index e70b3671b541..84c10dbb4d2e 100644
--- a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp
+++ b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp
@@ -55,7 +55,7 @@
#include "../../inc/MarlinConfig.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include
#include "HAL_LCD_com_defines.h"
@@ -233,4 +233,4 @@ u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_sw_spi = { u8g_dev_st7565_64128n_HAL_2x_f
U8G_PB_DEV(u8g_dev_st7565_64128n_HAL_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_HAL_fn, U8G_COM_HAL_HW_SPI_FN);
u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_hw_spi = { u8g_dev_st7565_64128n_HAL_2x_fn, &u8g_dev_st7565_64128n_HAL_2x_pb, U8G_COM_HAL_HW_SPI_FN };
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp
index 838bee0ffc4c..740436d93c07 100644
--- a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp
+++ b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp
@@ -55,7 +55,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include "HAL_LCD_com_defines.h"
@@ -205,4 +205,4 @@ u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_f
u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI };
#endif
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp
index 39c294defe5b..0f53e45a27b5 100644
--- a/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp
+++ b/Marlin/src/lcd/dogm/u8g_dev_tft_320x240_upscale_from_128x64.cpp
@@ -51,12 +51,11 @@
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
*/
#include "../../inc/MarlinConfig.h"
-#if HAS_GRAPHICAL_LCD && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT))
+#if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT))
#include "HAL_LCD_com_defines.h"
#include "ultralcd_DOGM.h"
@@ -813,4 +812,4 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p
U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_tft_320x240_upscale_from_128x64_fn, U8G_COM_HAL_TFT_FN);
-#endif // HAS_GRAPHICAL_LCD && FSMC_CS
+#endif // HAS_MARLINUI_U8GLIB && FSMC_CS
diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp
index e4e387c1907f..172afbd76647 100644
--- a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp
+++ b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp
@@ -55,7 +55,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include "HAL_LCD_com_defines.h"
@@ -210,4 +210,4 @@ u8g_pb_t u8g_dev_uc1701_mini12864_HAL_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u
u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi = { u8g_dev_uc1701_mini12864_HAL_2x_fn, &u8g_dev_uc1701_mini12864_HAL_2x_pb, U8G_COM_HAL_SW_SPI_FN };
u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_hw_spi = { u8g_dev_uc1701_mini12864_HAL_2x_fn, &u8g_dev_uc1701_mini12864_HAL_2x_pb, U8G_COM_HAL_HW_SPI_FN };
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp
index 370b177470ec..89bdb09e1be2 100644
--- a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp
+++ b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp
@@ -9,7 +9,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include
#include "../fontutils.h"
@@ -312,4 +312,4 @@ int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, PGM_P utf8_msg) {
return data.adv;
}
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp
index b4f32d3343a1..c48abac81016 100644
--- a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp
+++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp
@@ -37,7 +37,7 @@
#include "../../inc/MarlinConfigPre.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include "ultralcd_DOGM.h"
#include "u8g_fontutf8.h"
@@ -687,4 +687,4 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
#endif // HAS_LCD_MENU
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp
index c0096d379de6..85263a89abf7 100644
--- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp
+++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp
@@ -151,7 +151,7 @@ constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, // Total rows, and other
/* Value Init */
HMI_value_t HMI_ValueStruct;
-HMI_Flag HMI_flag{0};
+HMI_Flag_t HMI_flag{0};
millis_t dwin_heat_time = 0;
@@ -173,7 +173,6 @@ select_t select_page{0}, select_file{0}, select_print{0}, select_prepare{0}
, select_acc{0}
, select_jerk{0}
, select_step{0}
- // , select_leveling{0}
;
uint8_t index_file = MROWS,
@@ -208,22 +207,24 @@ uint16_t remain_time = 0;
#define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1)
// BL24CXX::check() uses 0x00
+inline bool HMI_IsChinese() { return HMI_flag.language == DWIN_CHINESE; }
+
void HMI_SetLanguageCache() {
- DWIN_JPG_CacheTo1(HMI_flag.language_chinese ? Language_Chinese : Language_English);
+ DWIN_JPG_CacheTo1(HMI_IsChinese() ? Language_Chinese : Language_English);
}
void HMI_SetLanguage() {
#if ENABLED(EEPROM_SETTINGS)
- BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese));
+ BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language));
#endif
HMI_SetLanguageCache();
}
void HMI_ToggleLanguage() {
- HMI_flag.language_chinese ^= true;
+ HMI_flag.language = HMI_IsChinese() ? DWIN_ENGLISH : DWIN_CHINESE;
HMI_SetLanguageCache();
#if ENABLED(EEPROM_SETTINGS)
- BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language_chinese, sizeof(HMI_flag.language_chinese));
+ BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language));
#endif
}
@@ -242,14 +243,14 @@ void ICON_Print() {
if (select_page.now == 0) {
DWIN_ICON_Show(ICON, ICON_Print_1, 17, 130);
DWIN_Draw_Rectangle(0, Color_White, 17, 130, 126, 229);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 58, 201);
else
DWIN_Frame_AreaCopy(1, 1, 451, 31, 463, 57, 201);
}
else {
DWIN_ICON_Show(ICON, ICON_Print_0, 17, 130);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 1, 405, 28, 420, 58, 201);
else
DWIN_Frame_AreaCopy(1, 1, 423, 31, 435, 57, 201);
@@ -260,14 +261,14 @@ void ICON_Prepare() {
if (select_page.now == 1) {
DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130);
DWIN_Draw_Rectangle(0, Color_White, 145, 130, 254, 229);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 31, 447, 58, 460, 186, 201);
else
DWIN_Frame_AreaCopy(1, 33, 451, 82, 466, 175, 201);
}
else {
DWIN_ICON_Show(ICON, ICON_Prepare_0, 145, 130);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 31, 405, 58, 420, 186, 201);
else
DWIN_Frame_AreaCopy(1, 33, 423, 82, 438, 175, 201);
@@ -278,14 +279,14 @@ void ICON_Control() {
if (select_page.now == 2) {
DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246);
DWIN_Draw_Rectangle(0, Color_White, 17, 246, 126, 345);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 61, 447, 88, 460, 58, 318);
else
DWIN_Frame_AreaCopy(1, 85, 451, 132, 463, 48, 318);
}
else {
DWIN_ICON_Show(ICON, ICON_Control_0, 17, 246);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 61, 405, 88, 420, 58, 318);
else
DWIN_Frame_AreaCopy(1, 85, 423, 132, 434, 48, 318);
@@ -296,14 +297,14 @@ void ICON_StartInfo(bool show) {
if (show) {
DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246);
DWIN_Draw_Rectangle(0, Color_White, 145, 246, 254, 345);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 91, 447, 118, 460, 186, 318);
else
DWIN_Frame_AreaCopy(1, 132, 451, 159, 466, 186, 318);
}
else {
DWIN_ICON_Show(ICON, ICON_Info_0, 145, 246);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 91, 405, 118, 420, 186, 318);
else
DWIN_Frame_AreaCopy(1, 132, 423, 159, 435, 186, 318);
@@ -314,14 +315,14 @@ void ICON_Leveling(bool show) {
if (show) {
DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246);
DWIN_Draw_Rectangle(0, Color_White, 145, 246, 254, 345);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 211, 447, 238, 460, 186, 318);
else
DWIN_Frame_AreaCopy(1, 84, 437, 120, 449, 182, 318);
}
else {
DWIN_ICON_Show(ICON, ICON_Leveling_0, 145, 246);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 211, 405, 238, 420, 186, 318);
else
DWIN_Frame_AreaCopy(1, 84, 465, 120, 478, 182, 318);
@@ -332,14 +333,14 @@ void ICON_Tune() {
if (select_print.now == 0) {
DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252);
DWIN_Draw_Rectangle(0, Color_White, 8, 252, 87, 351);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 121, 447, 148, 458, 34, 325);
else
DWIN_Frame_AreaCopy(1, 0, 466, 34, 476, 31, 325);
}
else {
DWIN_ICON_Show(ICON, ICON_Setup_0, 8, 252);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 121, 405, 148, 420, 34, 325);
else
DWIN_Frame_AreaCopy(1, 0, 438, 32, 448, 31, 325);
@@ -350,14 +351,14 @@ void ICON_Pause() {
if (select_print.now == 1) {
DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252);
DWIN_Draw_Rectangle(0, Color_White, 96, 252, 175, 351);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 181, 447, 208, 459, 124, 325);
else
DWIN_Frame_AreaCopy(1, 177, 451, 216, 462, 116, 325);
}
else {
DWIN_ICON_Show(ICON, ICON_Pause_0, 96, 252);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 181, 405, 208, 420, 124, 325);
else
DWIN_Frame_AreaCopy(1, 177, 423, 215, 433, 116, 325);
@@ -368,14 +369,14 @@ void ICON_Continue() {
if (select_print.now == 1) {
DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252);
DWIN_Draw_Rectangle(0, Color_White, 96, 252, 175, 351);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 124, 325);
else
DWIN_Frame_AreaCopy(1, 1, 452, 32, 464, 121, 325);
}
else {
DWIN_ICON_Show(ICON, ICON_Continue_0, 96, 252);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 1, 405, 28, 420, 124, 325);
else
DWIN_Frame_AreaCopy(1, 1, 424, 31, 434, 121, 325);
@@ -386,14 +387,14 @@ void ICON_Stop() {
if (select_print.now == 2) {
DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252);
DWIN_Draw_Rectangle(0, Color_White, 184, 252, 263, 351);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 151, 447, 178, 459, 210, 325);
else
DWIN_Frame_AreaCopy(1, 218, 452, 249, 466, 209, 325);
}
else {
DWIN_ICON_Show(ICON, ICON_Stop_0, 184, 252);
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 151, 405, 178, 420, 210, 325);
else
DWIN_Frame_AreaCopy(1, 218, 423, 247, 436, 209, 325);
@@ -481,7 +482,7 @@ inline void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char
// The "Back" label is always on the first line
inline void Draw_Back_Label() {
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 129, 72, 156, 84, LBLX, MBASE(0));
else
DWIN_Frame_AreaCopy(1, 226, 179, 256, 189, LBLX, MBASE(0));
@@ -563,7 +564,7 @@ inline void draw_move_en(const uint16_t line) {
inline void DWIN_Frame_TitleCopy(uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { DWIN_Frame_AreaCopy(id, x1, y1, x2, y2, 14, 8); }
inline void Item_Prepare_Move(const uint8_t row) {
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 159, 70, 200, 84, LBLX, MBASE(row));
else
draw_move_en(MBASE(row)); // "Move >"
@@ -572,7 +573,7 @@ inline void Item_Prepare_Move(const uint8_t row) {
}
inline void Item_Prepare_Disable(const uint8_t row) {
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 204, 70, 259, 82, LBLX, MBASE(row));
else
DWIN_Frame_AreaCopy(1, 103, 59, 200, 74, LBLX, MBASE(row)); // "Disable Stepper"
@@ -580,7 +581,7 @@ inline void Item_Prepare_Disable(const uint8_t row) {
}
inline void Item_Prepare_Home(const uint8_t row) {
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 0, 89, 41, 101, LBLX, MBASE(row));
else
DWIN_Frame_AreaCopy(1, 202, 61, 271, 71, LBLX, MBASE(row)); // "Auto Home"
@@ -590,7 +591,7 @@ inline void Item_Prepare_Home(const uint8_t row) {
#if HAS_ZOFFSET_ITEM
inline void Item_Prepare_Offset(const uint8_t row) {
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
#if HAS_BED_PROBE
DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row));
DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100);
@@ -613,7 +614,7 @@ inline void Item_Prepare_Home(const uint8_t row) {
#if HAS_HOTEND
inline void Item_Prepare_PLA(const uint8_t row) {
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 100, 89, 151, 101, LBLX, MBASE(row));
}
else {
@@ -624,7 +625,7 @@ inline void Item_Prepare_Home(const uint8_t row) {
}
inline void Item_Prepare_ABS(const uint8_t row) {
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 180, 89, 233, 100, LBLX, MBASE(row));
}
else {
@@ -637,7 +638,7 @@ inline void Item_Prepare_Home(const uint8_t row) {
#if HAS_PREHEAT
inline void Item_Prepare_Cool(const uint8_t row) {
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 1, 104, 56, 117, LBLX, MBASE(row));
else
DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown"
@@ -646,7 +647,7 @@ inline void Item_Prepare_Home(const uint8_t row) {
#endif
inline void Item_Prepare_Lang(const uint8_t row) {
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 239, 134, 266, 146, LBLX, MBASE(row));
DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), F("CN"));
}
@@ -664,7 +665,7 @@ inline void Draw_Prepare_Menu() {
#define PSCROL(L) (scroll + (L))
#define PVISI(L) WITHIN(PSCROL(L), 0, MROWS)
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 133, 1, 160, 13); // "Prepare"
}
else {
@@ -708,7 +709,7 @@ inline void Draw_Control_Menu() {
if (CVISI(0)) Draw_Back_First(select_control.now == 0); // < Back
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 103, 1, 130, 14); // "Control"
DWIN_Frame_AreaCopy(1, 57, 104, 84, 116, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature >
@@ -775,7 +776,7 @@ inline void Draw_Control_Menu() {
inline void Draw_Tune_Menu() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 73, 2, 100, 13, 14, 9);
DWIN_Frame_AreaCopy(1, 116, 164, 171, 176, LBLX, MBASE(TUNE_CASE_SPEED));
#if HAS_HOTEND
@@ -881,7 +882,7 @@ inline void say_e(const uint16_t inset, const uint16_t line) {
inline void Draw_Motion_Menu() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Motion"
DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, MBASE(MOTION_CASE_RATE)); // Max speed
DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(MOTION_CASE_ACCEL)); // Max...
@@ -936,7 +937,7 @@ inline void Draw_Motion_Menu() {
Draw_Popup_Bkgd_105();
if (toohigh) {
DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165);
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 103, 371, 237, 386, 52, 285);
DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285);
DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310);
@@ -948,7 +949,7 @@ inline void Draw_Motion_Menu() {
}
else {
DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165);
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 103, 371, 270, 386, 52, 285);
DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310);
}
@@ -971,7 +972,7 @@ inline void Draw_Popup_Bkgd_60() {
Clear_Main_Window();
Draw_Popup_Bkgd_60();
DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105);
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 103, 371, 136, 386, 69, 240);
DWIN_Frame_AreaCopy(1, 170, 371, 270, 386, 102, 240);
DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280);
@@ -987,18 +988,18 @@ inline void Draw_Popup_Bkgd_60() {
void Popup_Window_Resume() {
Clear_Popup_Area();
Draw_Popup_Bkgd_105();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 160, 338, 235, 354, 98, 135);
DWIN_Frame_AreaCopy(1, 103, 321, 271, 335, 52, 192);
- DWIN_ICON_Show(ICON, ICON_Continue_C, 26, 307);
- DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 307);
+ DWIN_ICON_Show(ICON, ICON_Cancel_C, 26, 307);
+ DWIN_ICON_Show(ICON, ICON_Continue_C, 146, 307);
}
else {
DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 14) / 2, 115, F("Continue Print"));
DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 192, F("It looks like the last"));
DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 212, F("file was interrupted."));
- DWIN_ICON_Show(ICON, ICON_Continue_E, 26, 307);
- DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 307);
+ DWIN_ICON_Show(ICON, ICON_Cancel_E, 26, 307);
+ DWIN_ICON_Show(ICON, ICON_Continue_E, 146, 307);
}
}
@@ -1006,7 +1007,7 @@ void Popup_Window_Home(const bool parking/*=false*/) {
Clear_Main_Window();
Draw_Popup_Bkgd_60();
DWIN_ICON_Show(ICON, ICON_BLTouch, 101, 105);
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 0, 371, 33, 386, 85, 240);
DWIN_Frame_AreaCopy(1, 203, 286, 271, 302, 118, 240);
DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280);
@@ -1023,7 +1024,7 @@ void Popup_Window_Home(const bool parking/*=false*/) {
Clear_Main_Window();
Draw_Popup_Bkgd_60();
DWIN_ICON_Show(ICON, ICON_AutoLeveling, 101, 105);
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 0, 371, 100, 386, 84, 240);
DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280);
}
@@ -1048,7 +1049,7 @@ void Draw_Select_Highlight(const bool sel) {
void Popup_window_PauseOrStop() {
Clear_Main_Window();
Draw_Popup_Bkgd_60();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
if (select_print.now == 1) DWIN_Frame_AreaCopy(1, 237, 338, 269, 356, 98, 150);
else if (select_print.now == 2) DWIN_Frame_AreaCopy(1, 221, 320, 253, 336, 98, 150);
DWIN_Frame_AreaCopy(1, 220, 304, 264, 319, 130, 150);
@@ -1065,7 +1066,7 @@ void Popup_window_PauseOrStop() {
}
void Draw_Printing_Screen() {
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 30, 1, 71, 14, 14, 9); // Tune
DWIN_Frame_AreaCopy(1, 0, 72, 63, 86, 41, 188); // Pause
DWIN_Frame_AreaCopy(1, 65, 72, 128, 86, 176, 188); // Stop
@@ -1125,7 +1126,7 @@ void Goto_MainMenu() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_AreaCopy(1, 2, 2, 27, 14, 14, 9); // "Home"
}
else {
@@ -1631,7 +1632,6 @@ void update_variable() {
* TODO: New code can follow the pattern of menu_media.cpp
* and rely on Marlin caching for performance. No need to
* cache files here.
- *
*/
#ifndef strcasecmp_P
@@ -1864,7 +1864,7 @@ inline void Draw_Info_Menu() {
DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, (char*)MACHINE_SIZE);
DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION);
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 30, 17, 57, 29); // "Info"
DWIN_Frame_AreaCopy(1, 197, 149, 252, 161, 108, 102);
@@ -1895,7 +1895,7 @@ inline void Draw_Info_Menu() {
inline void Draw_Print_File_Menu() {
Clear_Title_Bar();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 0, 31, 55, 44); // "Print file"
}
else {
@@ -2226,9 +2226,8 @@ void HMI_PauseOrStop() {
dwin_abort_flag = true;
#endif
}
- else {
+ else
Goto_PrintProcess(); // cancel stop
- }
}
}
DWIN_UpdateLCD();
@@ -2237,7 +2236,7 @@ void HMI_PauseOrStop() {
inline void Draw_Move_Menu() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 192, 1, 233, 14); // "Move"
DWIN_Frame_AreaCopy(1, 58, 118, 106, 132, LBLX, MBASE(1));
DWIN_Frame_AreaCopy(1, 109, 118, 157, 132, LBLX, MBASE(2));
@@ -2409,7 +2408,7 @@ void HMI_Prepare() {
void Draw_Temperature_Menu() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 236, 2, 263, 13); // "Temperature"
#if HAS_HOTEND
DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(TEMP_CASE_TEMP));
@@ -2508,7 +2507,7 @@ void HMI_Control() {
Draw_More_Icon(CONTROL_CASE_MOVE + MROWS - index_control); // Motion >
if (index_control > MROWS) {
Draw_More_Icon(CONTROL_CASE_INFO + MROWS - index_control); // Info >
- if (HMI_flag.language_chinese)
+ if (HMI_IsChinese())
DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, MBASE(CONTROL_CASE_INFO - 1));
else
DWIN_Frame_AreaCopy(1, 0, 104, 24, 114, LBLX, MBASE(CONTROL_CASE_INFO - 1));
@@ -2718,7 +2717,7 @@ void HMI_Temperature() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 59, 16, 139, 29); // "PLA Settings"
DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_TEMP));
DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp
@@ -2792,7 +2791,7 @@ void HMI_Temperature() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 142, 16, 223, 29); // "ABS Settings"
DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_TEMP));
@@ -2872,7 +2871,7 @@ void HMI_Temperature() {
inline void Draw_Max_Speed_Menu() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Max Speed (mm/s)"
auto say_max_speed = [](const uint16_t row) {
@@ -2934,7 +2933,7 @@ inline void Draw_Max_Speed_Menu() {
inline void Draw_Max_Accel_Menu() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Acceleration"
DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(1));
@@ -2985,7 +2984,7 @@ inline void Draw_Max_Accel_Menu() {
inline void Draw_Max_Jerk_Menu() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Jerk"
DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(1));
@@ -3055,7 +3054,7 @@ inline void Draw_Max_Jerk_Menu() {
inline void Draw_Steps_Menu() {
Clear_Main_Window();
- if (HMI_flag.language_chinese) {
+ if (HMI_IsChinese()) {
DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Steps per mm"
DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(1));
@@ -3528,7 +3527,7 @@ void EachMomentUpdate() {
// show print done confirm
DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 250, DWIN_WIDTH - 1, STATUS_Y);
- DWIN_ICON_Show(ICON, HMI_flag.language_chinese ? ICON_Confirm_C : ICON_Confirm_E, 86, 283);
+ DWIN_ICON_Show(ICON, HMI_IsChinese() ? ICON_Confirm_C : ICON_Confirm_E, 86, 283);
}
else if (HMI_flag.pause_flag != printingIsPaused()) {
// print status update
@@ -3598,45 +3597,30 @@ void EachMomentUpdate() {
#if ENABLED(POWER_LOSS_RECOVERY)
else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off
static bool recovery_flag = false;
- recovery.dwin_flag = false;
- recovery.load();
- if (!recovery.valid()) return recovery.purge();
+ recovery.dwin_flag = false;
+ recovery_flag = true;
- auto draw_first_option = [](const bool sel) {
+ auto update_selection = [&](const bool sel) {
+ HMI_flag.select_flag = sel;
const uint16_t c1 = sel ? Color_Bg_Window : Select_Color;
DWIN_Draw_Rectangle(0, c1, 25, 306, 126, 345);
DWIN_Draw_Rectangle(0, c1, 24, 305, 127, 346);
- };
-
- auto update_selection = [&](const bool sel) {
- HMI_flag.select_flag = sel;
- draw_first_option(sel);
const uint16_t c2 = sel ? Select_Color : Color_Bg_Window;
DWIN_Draw_Rectangle(0, c2, 145, 306, 246, 345);
DWIN_Draw_Rectangle(0, c2, 144, 305, 247, 346);
};
- const uint16_t fileCnt = card.get_num_Files();
- for (uint16_t i = 0; i < fileCnt; i++) {
- // TODO: Resume print via M1000 then update the UI
- // with the active filename which can come from CardReader.
- card.getfilename_sorted(SD_ORDER(i, fileCnt));
- if (!strcmp(card.filename, &recovery.info.sd_filename[1])) { // Resume print before power failure while have the same file
- recovery_flag = true;
- HMI_flag.select_flag = true;
- Popup_Window_Resume();
- draw_first_option(false);
- char * const name = card.longest_filename();
- const int8_t npos = _MAX(0, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2;
- DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, npos, 252, name);
- DWIN_UpdateLCD();
- break;
- }
- }
+ Popup_Window_Resume();
+ update_selection(true);
- // if hasn't resumable G-code file
- if (!recovery_flag) return;
+ // TODO: Get the name of the current file from someplace
+ //
+ //(void)recovery.interrupted_file_exists();
+ char * const name = card.longest_filename();
+ const int8_t npos = _MAX(0U, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2;
+ DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, npos, 252, name);
+ DWIN_UpdateLCD();
while (recovery_flag) {
ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze();
@@ -3644,12 +3628,12 @@ void EachMomentUpdate() {
if (encoder_diffState == ENCODER_DIFF_ENTER) {
recovery_flag = false;
if (HMI_flag.select_flag) break;
- TERN_(POWER_LOSS_RECOVERY, recovery.cancel());
+ TERN_(POWER_LOSS_RECOVERY, queue.inject_P(PSTR("M1000C")));
HMI_StartFrame(true);
return;
}
else
- update_selection(encoder_diffState == ENCODER_DIFF_CCW);
+ update_selection(encoder_diffState == ENCODER_DIFF_CW);
DWIN_UpdateLCD();
}
@@ -3657,9 +3641,9 @@ void EachMomentUpdate() {
select_print.set(0);
HMI_ValueStruct.show_mode = 0;
- HMI_StartFrame(false);
- recovery.resume();
- return;
+ queue.inject_P(PSTR("M1000"));
+ Goto_PrintProcess();
+ Draw_Status_Area(true);
}
#endif
DWIN_UpdateLCD();
diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h
index 1b2cb273e3f8..5bff2e9f7890 100644
--- a/Marlin/src/lcd/dwin/e3v2/dwin.h
+++ b/Marlin/src/lcd/dwin/e3v2/dwin.h
@@ -252,8 +252,11 @@ typedef struct {
char show_mode = 0; // -1: Temperature control 0: Printing temperature
} HMI_value_t;
+#define DWIN_CHINESE 123
+#define DWIN_ENGLISH 0
+
typedef struct {
- bool language_chinese; // 0: EN, 1: CN
+ uint8_t language;
bool pause_flag:1;
bool pause_action:1;
bool print_finish:1;
@@ -271,10 +274,10 @@ typedef struct {
AxisEnum feedspeed_axis;
#endif
AxisEnum acc_axis, jerk_axis, step_axis;
-} HMI_Flag;
+} HMI_Flag_t;
extern HMI_value_t HMI_ValueStruct;
-extern HMI_Flag HMI_flag;
+extern HMI_Flag_t HMI_flag;
// Show ICO
void ICON_Print(bool show);
diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp
index 4a8095b6e993..a7f9a7a0c3e3 100644
--- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp
+++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp
@@ -21,7 +21,7 @@
*/
/**
- * anycubic_chiron_lcd.cpp
+ * lcd/extui/anycubic_chiron_lcd.cpp
*
* Anycubic Chiron TFT support for Marlin
*/
@@ -31,508 +31,90 @@
#if ENABLED(ANYCUBIC_LCD_CHIRON)
#include "ui_api.h"
+#include "lib/anycubic_chiron/chiron_tft.h"
-#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
- #if GRID_MAX_POINTS_X != 5 || GRID_MAX_POINTS_Y != 5
- #error ANYCUBIC CHIRON LCD requires a 5x5 bed leveling grid (GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y)
- #endif
-#else
- #error ANYCUBIC CHIRON LCD requires AUTO_BED_LEVELING_BILINEAR enabled
-#endif
-
-#if DISABLED(FILAMENT_RUNOUT_SENSOR)
- #error ANYCUBIC CHIRON LCD requires FILAMENT_RUNOUT_SENSOR enabled
-#endif
-
-#if ENABLED(POWER_LOSS_RECOVERY)
- #error ANYCUBIC CHIRON LCD does not currently support POWER_LOSS_RECOVERY
-#endif
-
-static bool is_auto_leveling = false;
-static bool is_printing_from_sd = false;
-static bool is_out_of_filament = false;
-
-static void sendNewLine(void) {
- LCD_SERIAL.write('\r');
- LCD_SERIAL.write('\n');
-}
-
-static void send(const char *str) {
- LCD_SERIAL.print(str);
-}
-
-static void sendLine(const char *str) {
- send(str);
- sendNewLine();
-}
-
-static void send_P(PGM_P str) {
- while (const char c = pgm_read_byte(str++))
- LCD_SERIAL.write(c);
-}
-
-static void sendLine_P(PGM_P str) {
- send_P(str);
- sendNewLine();
-}
-
-static void sendValue_P(PGM_P prefix, int value) {
- send_P(prefix);
- LCD_SERIAL.print(value);
-}
-
-static void sendValue_P(PGM_P prefix, float value) {
- send_P(prefix);
- LCD_SERIAL.print(value);
-}
-
-static void sendValueLine_P(PGM_P prefix, int value) {
- send_P(prefix);
- LCD_SERIAL.print(value);
- sendNewLine();
-}
-
-static void sendValueLine_P(PGM_P prefix, float value) {
- send_P(prefix);
- LCD_SERIAL.print(value);
- sendNewLine();
-}
-
-static int parseIntArgument(const char *buffer, char letterId) {
- char *p = strchr(buffer, letterId);
- if (!p)
- return -1;
- return atoi(p+1);
-}
-
-static float parseFloatArgument(const char *buffer, char letterId) {
- char *p = strchr(buffer, letterId);
- if (!p)
- return NAN;
- return strtof(p+1, nullptr);
-}
-
-static int mmToHundredths(float x) {
- // Round
- if (x >= 0)
- x += 0.005f;
- else
- x -= 0.005f;
- return (int)(x * 100.0f);
-}
-
-static float hundredthsToMm(int x) {
- return x / 100.0f;
-}
-
-#define SEND_PGM(str) send_P(PSTR(str))
-#define SENDLINE_PGM(str) sendLine_P(PSTR(str))
-#define SENDVALUE_PGM(prefix, value) sendValue_P(PSTR(prefix), value)
-#define SENDVALUELINE_PGM(prefix, value) sendValueLine_P(PSTR(prefix), value)
+using namespace Anycubic;
namespace ExtUI {
- static void moveAxis(float delta, feedRate_t feedrate, axis_t axis) {
- float pos = getAxisPosition_mm(axis);
- pos += delta;
- setAxisPosition_mm(pos, axis, feedrate);
- }
-
- static void handleCmd(const char *rx) {
- static FileList fileList;
- static char selectedFileShortName[8+1+3+1];
+ void onStartup() { Chiron.Startup(); }
- if (rx[0] != 'A') {
- SERIAL_ECHOPGM("Unexpected RX: ");
- SERIAL_ECHOLN(rx);
+ void onIdle() { Chiron.IdleLoop(); }
- return;
- }
-
- const int cmd = atoi(&rx[1]);
-
- // Uncomment for debugging RX
- //if (cmd > 7 && cmd != 20) {
- // SERIAL_ECHOPGM("RX: ");
- // SERIAL_ECHOLN(rx);
- //}
-
- switch (cmd) {
- case 0: // Get Hotend Actual Temperature
- SENDVALUELINE_PGM("A0V ", (int)getActualTemp_celsius(E0));
- break;
- case 1: // Get Hotend Target Temperature
- SENDVALUELINE_PGM("A1V ", (int)getTargetTemp_celsius(E0));
- break;
- case 2: // Get Bed Actual Temperature
- SENDVALUELINE_PGM("A2V ", (int)getActualTemp_celsius(BED));
- break;
- case 3: // Get Bed Target Temperature
- SENDVALUELINE_PGM("A3V ", (int)getTargetTemp_celsius(BED));
- break;
- case 4: // Get Fan Speed
- SENDVALUELINE_PGM("A4V ", (int)getTargetFan_percent(FAN0));
- break;
- case 5: // Get Current Coordinates
- SENDVALUE_PGM("A5V X: ", getAxisPosition_mm(X));
- SENDVALUE_PGM(" Y: ", getAxisPosition_mm(Y));
- SENDVALUE_PGM(" Z: ", getAxisPosition_mm(Z));
- sendNewLine();
- break;
- case 6: // Get SD Card Print Status
- if (isPrintingFromMedia())
- SENDVALUELINE_PGM("A6V ", (int)getProgress_percent());
- else
- SENDLINE_PGM("A6V ---");
- break;
- case 7: // Get Printing Time
- if (isPrinting()) {
- const int totalMinutes = getProgress_seconds_elapsed() / 60;
- SENDVALUE_PGM("A7V ", (int)(totalMinutes/60));
- SENDVALUE_PGM(" H ", (int)(totalMinutes%60));
- SENDLINE_PGM(" M");
- } else {
- SENDLINE_PGM("A7V 999:999");
- }
- break;
- case 8: // Get SD Card File List
- if (isMediaInserted()) {
- const int startIndex = parseIntArgument(rx, 'S');
- SENDLINE_PGM("FN ");
- for (int i = 0, fileIndex = 0, numFiles = 0; i < (int)fileList.count() && numFiles < 4; i++) {
- fileList.seek(i);
- if (!fileList.isDir()) {
- if (fileIndex >= startIndex) {
- sendLine(fileList.shortFilename());
- sendLine(fileList.longFilename());
- numFiles++;
- }
- fileIndex++;
- }
- }
- SENDLINE_PGM("END");
- } else {
- SENDLINE_PGM("J02");
- }
- break;
- case 9: // Pause SD Card Print
- if (isPrintingFromMedia()) {
- pausePrint();
- is_printing_from_sd = false;
- SENDLINE_PGM("J05");
- } else {
- SENDLINE_PGM("J16"); // Print stopped
- }
- break;
- case 10: // Resume SD Card Print
- if (is_out_of_filament) {
- is_out_of_filament = false;
- // Filament change did eject the old filament automatically,
- // now continue and load the new one
- setUserConfirmed();
- SENDLINE_PGM("J04"); // Printing from SD card
- } else if (isPrintingFromMediaPaused()) {
- resumePrint();
- SENDLINE_PGM("J04"); // Printing from SD card
- }
- break;
- case 11: // Stop SD Card Print
- if (isPrintingFromMedia()) {
- stopPrint();
- is_printing_from_sd = false;
- SENDLINE_PGM("J16"); // Print stopped
- }
- break;
- //case 12: // Kill
- // break;
- case 13: // Select File
- if (!isPrinting()) {
- // Store selected file name
- char *p = strchr(rx, ' ');
- if (p != nullptr && strlen(p+1) < sizeof(selectedFileShortName)) {
- strcpy(selectedFileShortName, p+1);
- SENDLINE_PGM("J20"); // Open succeeded
- }
- else
- SENDLINE_PGM("J21"); // Open failed
- }
- break;
- case 14: // Start Print
- if (!isPrinting() && strcmp(selectedFileShortName, "") != 0) {
- printFile(selectedFileShortName);
- is_printing_from_sd = true;
- SENDLINE_PGM("J04"); // Printing from SD card
- }
- break;
- case 15: // Resume from power outage
- // This is not supported, just report print as completed
- SENDLINE_PGM("J16"); // Print stopped
- break;
- case 16: // Set Hotend Target Temperature
- {
- int temp = parseIntArgument(rx, 'S');
- if (temp >= 0)
- setTargetTemp_celsius(temp, E0);
- }
- break;
- case 17: // Set Bed Target Temperature
- {
- int temp = parseIntArgument(rx, 'S');
- if (temp >= 0)
- setTargetTemp_celsius(temp, BED);
- }
- break;
- case 18: // Set Fan Speed
- {
- int temp = parseIntArgument(rx, 'S');
- if (temp >= 0)
- setTargetFan_percent(temp, FAN0);
- }
- break;
- case 19: // Disable Motors
- injectCommands_P(PSTR("M84"));
- break;
- case 20: // Get/Set Printing Speed
- {
- int newPerc = parseIntArgument(rx, 'S');
- if (newPerc >= 0)
- setFeedrate_percent(newPerc);
- else
- SENDVALUELINE_PGM("A20V ", (int)getFeedrate_percent());
- }
- break;
- case 21: // Home axes
- if (!isPrinting()) {
- const bool hasX = strchr(rx, 'X') != nullptr,
- hasY = strchr(rx, 'Y') != nullptr,
- hasZ = strchr(rx, 'Z') != nullptr,
- hasC = strchr(rx, 'C') != nullptr;
- if (hasX || hasY || hasZ) {
- if (hasX) injectCommands_P(PSTR("G28 X"));
- if (hasY) injectCommands_P(PSTR("G28 Y"));
- if (hasZ) injectCommands_P(PSTR("G28 Z"));
- } else if (hasC) {
- injectCommands_P(PSTR("G28"));
- }
- }
- break;
- case 22: // Move axes
- if (!isPrinting()) {
- const int feedrate = parseIntArgument(rx, 'F') / 60;
- float delta;
- if (!isnan(delta = parseFloatArgument(rx, 'X')))
- moveAxis(delta, feedrate, X);
- else if (!isnan(delta = parseFloatArgument(rx, 'Y')))
- moveAxis(delta, feedrate, Y);
- else if (!isnan(delta = parseFloatArgument(rx, 'Z')))
- moveAxis(delta, feedrate, Z);
- }
- break;
- case 23: // Preheat PLA
- setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0);
- setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED);
- SENDLINE_PGM("OK");
- break;
- case 24: // Preheat ABS
- setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0);
- setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED);
- SENDLINE_PGM("OK");
- break;
- case 25: // Cool down
- setTargetTemp_celsius(0, E0);
- setTargetTemp_celsius(0, BED);
- SENDLINE_PGM("J12");
- break;
- case 26: // Refresh SD Card
- fileList.refresh();
- break;
- //case 27: // Adjust Servo Angles
- // break;
- //case 28: // Filament Test
- // break;
- case 29: // Get Bed Autolevel Grid
- {
- int x = parseIntArgument(rx, 'X'),
- y = parseIntArgument(rx, 'Y');
- if (x != -1 && y != -1) {
- xy_uint8_t coord;
- coord.set(x, y);
- const int value = mmToHundredths(getMeshPoint(coord));
- SENDVALUELINE_PGM("A29V ", value);
- }
- }
- break;
- case 30: // Autolevel
- if (strchr(rx, 'S')) { // Autoleveling started by clicking "PROBE" and then "OK"
- // Note:
- // We check for completion by monitoring the command queue.
- // Since it will become empty *while* processing the last injected command,
- // we enqueue an extra 10ms delay so we can the determine when all the others
- // have completed.
- if (isMachineHomed())
- injectCommands_P(PSTR("G29\nG4 P10"));
- else
- injectCommands_P(PSTR("G28\nG29\nG4 P10"));
- is_auto_leveling = true;
- } else { // Entering Autoleveling screen
- if (isPrinting())
- SENDLINE_PGM("J24"); // Disallow autoleveling
- else
- SENDLINE_PGM("J26"); // Allow autoleveling
- }
- break;
- case 31: // Set Bed Autolevel Z offset
- if (strchr(rx, 'G')) { // Get
- SENDVALUELINE_PGM("A31V ", getZOffset_mm());
- } else if (strchr(rx, 'S')) { // Set
- float delta = parseFloatArgument(rx, 'S');
- delta = constrain(delta, -1.0, 1.0);
- setZOffset_mm(getZOffset_mm() + delta);
-
- SENDVALUELINE_PGM("A31V ", getZOffset_mm());
- } else if (strchr(rx, 'D')) { // Save
- injectCommands_P(PSTR("M500"));
- }
- break;
- //case 32: // ?
- // break;
- case 33: // Get Version Info
- SENDLINE_PGM("J33 " SHORT_BUILD_VERSION);
- break;
- case 34: // Set Bed Autolevel Grid
- {
- int x = parseIntArgument(rx, 'X'),
- y = parseIntArgument(rx, 'Y'),
- v = parseIntArgument(rx, 'V');
- if (x != -1 && y != -1 && v != -1) { // Set new value
- float value = hundredthsToMm(v);
- value = constrain(value, -10, 10);
-
- xy_uint8_t coord;
- coord.set(x, y);
- setMeshPoint(coord, value);
- } else if (strchr(rx, 'S')) { // Save (apply new values)
- injectCommands_P(PSTR("M500"));
- } else if (strchr(rx, 'C')) { // Cancel (discard new values)
- injectCommands_P(PSTR("M501"));
- }
- }
- break;
- }
+ void onPrinterKilled(PGM_P const error, PGM_P const component) {
+ Chiron.PrinterKilled(error,component);
}
- #define RX_LEN_MAX 63
- static void parseSerialRx() {
- static char rxBuffer[RX_LEN_MAX+1];
- static uint8_t rxLen = 0;
+ void onMediaInserted() { Chiron.MediaEvent(AC_media_inserted); }
+ void onMediaError() { Chiron.MediaEvent(AC_media_error); }
+ void onMediaRemoved() { Chiron.MediaEvent(AC_media_removed); }
- while (LCD_SERIAL.available()) {
- const char c = LCD_SERIAL.read();
- switch (c) {
- case '\r': case '\n':
- if (rxLen > 0 && rxLen <= RX_LEN_MAX) {
- rxBuffer[rxLen] = '\0'; // Terminate string
- handleCmd(rxBuffer);
- }
- rxLen = 0;
- break;
- default:
- if (rxLen < RX_LEN_MAX)
- rxBuffer[rxLen++] = c;
- else {
- rxLen = 0xFF; // Overrun
- SERIAL_ECHOPGM("Warning: dropping long received line");
- }
- break;
- }
- }
- }
-
- static void detectPrintFromSdCompletion() {
- // Note: printFile() queues some commands that actually start the print, so isPrintingFromMedia()
- // initially returns false
- if (is_printing_from_sd && !commandsInQueue() && !isPrintingFromMedia()) {
- is_printing_from_sd = false;
- SENDLINE_PGM("J14"); // Print done
- }
- }
-
- static void detectAutolevelingCompletion() {
- if (is_auto_leveling && !commandsInQueue()) {
- is_auto_leveling = false;
- injectCommands_P(PSTR("M500"));
- SENDLINE_PGM("J25"); // Autoleveling done
- }
- }
-
- void onStartup() {
- #ifndef LCD_BAUDRATE
- #define LCD_BAUDRATE 115200
+ void onPlayTone(const uint16_t frequency, const uint16_t duration) {
+ #if ENABLED(SPEAKER)
+ ::tone(BEEPER_PIN, frequency, duration);
#endif
- LCD_SERIAL.begin(LCD_BAUDRATE);
- sendNewLine();
- SENDLINE_PGM("J17"); // Reset
- delay_ms(10);
- SENDLINE_PGM("J12"); // Ready
}
- void onIdle() {
- parseSerialRx();
- detectAutolevelingCompletion();
- detectPrintFromSdCompletion();
- }
+ void onPrintTimerStarted() { Chiron.TimerEvent(AC_timer_started); }
+ void onPrintTimerPaused() { Chiron.TimerEvent(AC_timer_paused); }
+ void onPrintTimerStopped() { Chiron.TimerEvent(AC_timer_stopped); }
+ void onFilamentRunout(const extruder_t) { Chiron.FilamentRunout(); }
+ void onUserConfirmRequired(const char * const msg) { Chiron.ConfirmationRequest(msg); }
+ void onStatusChanged(const char * const msg) { Chiron.StatusChange(msg); }
+
+ void onFactoryReset() {}
- void onPrinterKilled(PGM_P const error, PGM_P const component) { }
+ void onStoreSettings(char *buff) {
+ // Called when saving to EEPROM (i.e. M500). If the ExtUI needs
+ // permanent data to be stored, it can write up to eeprom_data_size bytes
+ // into buff.
- void onMediaInserted() {
- SENDLINE_PGM("J00"); // SD Inserted
+ // Example:
+ // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size);
+ // memcpy(buff, &myDataStruct, sizeof(myDataStruct));
}
- void onMediaError() { }
+ void onLoadSettings(const char *buff) {
+ // Called while loading settings from EEPROM. If the ExtUI
+ // needs to retrieve data, it should copy up to eeprom_data_size bytes
+ // from buff
- void onMediaRemoved() {
- SENDLINE_PGM("J01"); // SD Removed
+ // Example:
+ // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size);
+ // memcpy(&myDataStruct, buff, sizeof(myDataStruct));
}
- void onPlayTone(const uint16_t frequency, const uint16_t duration) {
- tone(BEEPER_PIN, frequency, duration);
+ void onConfigurationStoreWritten(bool success) {
+ // Called after the entire EEPROM has been written,
+ // whether successful or not.
}
- void onPrintTimerStarted() { }
-
- void onPrintTimerPaused() { }
-
- void onPrintTimerStopped() { }
-
- void onFilamentRunout(const extruder_t extruder) {
- is_out_of_filament = true;
- SENDLINE_PGM("J23"); // Filament runout
- SENDLINE_PGM("J18"); // Print paused
- // Note: printer will unload filament automatically
+ void onConfigurationStoreRead(bool success) {
+ // Called after the entire EEPROM has been read,
+ // whether successful or not.
}
- void onUserConfirmRequired(const char * const msg) { }
-
- void onStatusChanged(const char * const msg) { }
-
- void onFactoryReset() { }
-
- void onStoreSettings(char *buff) { }
-
- void onLoadSettings(const char *buff) { }
-
- void onConfigurationStoreWritten(bool success) { }
-
- void onConfigurationStoreRead(bool success) { }
+ #if HAS_MESH
+ void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {
+ // Called when any mesh points are updated
+ //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval);
+ }
- void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { }
+ void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) {
+ // Called to indicate a special condition
+ //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " state:", state);
+ }
+ #endif
#if ENABLED(POWER_LOSS_RECOVERY)
- void onPowerLossResume() { }
+ // Called on resume from power-loss
+ void onPowerLossResume() { Chiron.PowerLossRecovery(); }
#endif
#if HAS_PID_HEATING
- void onPidTuning(const result_t rst) { }
+ void onPidTuning(const result_t rst) {
+ // Called for temperature PID tuning result
+ }
#endif
}
diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp
new file mode 100644
index 000000000000..fb4c84abb485
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp
@@ -0,0 +1,162 @@
+/**
+ * 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 .
+ *
+ */
+
+/**
+ * lcd/extui/lib/FileNavigator.cpp
+ *
+ * Extensible_UI implementation for Anycubic Chiron
+ * Written By Nick Wells, 2020 [https://github.com/SwiftNick]
+ * (not affiliated with Anycubic, Ltd.)
+ */
+
+/***************************************************************************
+ * The AC panel wants files in block of 4 and can only display a flat list *
+ * This library allows full folder traversal. *
+ ***************************************************************************/
+
+#include "../../../../inc/MarlinConfigPre.h"
+
+#if ENABLED(ANYCUBIC_LCD_CHIRON)
+
+#include "FileNavigator.h"
+#include "chiron_tft.h"
+
+using namespace ExtUI;
+
+namespace Anycubic {
+
+ FileList FileNavigator::filelist; // Instance of the Marlin file API
+ char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path
+ uint16_t FileNavigator::lastindex;
+ uint8_t FileNavigator::folderdepth;
+ uint16_t FileNavigator::currentindex; // override the panel request
+
+ FileNavigator::FileNavigator() { reset(); }
+
+ void FileNavigator::reset() {
+ currentfoldername[0] = '\0';
+ folderdepth = 0;
+ currentindex = 0;
+ lastindex = 0;
+ // Start at root folder
+ while (!filelist.isAtRootDir()) filelist.upDir();
+ refresh();
+ }
+
+ void FileNavigator::refresh() { filelist.refresh(); }
+
+ void FileNavigator::getFiles(uint16_t index) {
+ uint8_t files = 4;
+ if (index == 0) currentindex = 0;
+
+ // Each time we change folder we reset the file index to 0 and keep track
+ // of the current position as the TFT panel isnt aware of folders trees.
+ if (index > 0) {
+ --currentindex; // go back a file to take account off the .. we added to the root.
+ if (index > lastindex)
+ currentindex += files;
+ else
+ currentindex = currentindex < 4 ? 0 : currentindex - files;
+ }
+ lastindex = index;
+
+ #if ACDEBUG(AC_FILE)
+ SERIAL_ECHOLNPAIR("index=", index, " currentindex=", currentindex);
+ #endif
+
+ if (currentindex == 0 && folderdepth > 0) { // Add a link to go up a folder
+ TFTSer.println("<<");
+ TFTSer.println("..");
+ files--;
+ }
+
+ for (uint16_t seek = currentindex; seek < currentindex + files; seek++) {
+ if (filelist.seek(seek)) {
+ sendFile();
+ #if ACDEBUG(AC_FILE)
+ SERIAL_ECHOLNPAIR("-", seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n");
+ #endif
+ }
+ }
+ }
+
+ void FileNavigator::sendFile() {
+ // send the file and folder info to the panel
+ // this info will be returned when the file is selected
+ // Permitted special characters in file name -_*#~
+ // Panel can display 22 characters per line
+ if (filelist.isDir()) {
+ //TFTSer.print(currentfoldername);
+ TFTSer.println(filelist.shortFilename());
+ TFTSer.print(filelist.shortFilename());
+ TFTSer.println("/");
+ }
+ else {
+ // Logical Name
+ TFTSer.print("/");
+ if (folderdepth > 0) TFTSer.print(currentfoldername);
+
+ TFTSer.println(filelist.shortFilename());
+
+ // Display Name
+ TFTSer.println(filelist.longFilename());
+ }
+ }
+ void FileNavigator::changeDIR(char *folder) {
+ #if ACDEBUG(AC_FILE)
+ SERIAL_ECHOLNPAIR("currentfolder: ", currentfoldername, " New: ", folder);
+ #endif
+ if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth
+ strcat(currentfoldername, folder);
+ strcat(currentfoldername, "/");
+ filelist.changeDir(folder);
+ refresh();
+ folderdepth++;
+ currentindex = 0;
+ }
+
+ void FileNavigator::upDIR() {
+ filelist.upDir();
+ refresh();
+ folderdepth--;
+ currentindex = 0;
+ // Remove the last child folder from the stored path
+ if (folderdepth == 0) {
+ currentfoldername[0] = '\0';
+ reset();
+ }
+ else {
+ char *pos = nullptr;
+ for (uint8_t f = 0; f < folderdepth; f++)
+ pos = strchr(currentfoldername, '/');
+
+ *(pos + 1) = '\0';
+ }
+ #if ACDEBUG(AC_FILE)
+ SERIAL_ECHOLNPAIR("depth: ", folderdepth, " currentfoldername: ", currentfoldername);
+ #endif
+ }
+
+ char* FileNavigator::getCurrentFolderName() { return currentfoldername; }
+}
+
+#endif // ANYCUBIC_LCD_CHIRON
diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h
new file mode 100644
index 000000000000..8e03614a4649
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h
@@ -0,0 +1,56 @@
+/**
+ * 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
+
+/**
+ * lcd/extui/lib/FileNavigator.h
+ *
+ * Extensible_UI implementation for Anycubic Chiron
+ * Written By Nick Wells, 2020 [https://github.com/SwiftNick]
+ * (not affiliated with Anycubic, Ltd.)
+ */
+
+#include "chiron_tft_defs.h"
+#include "../../ui_api.h"
+
+using namespace ExtUI;
+
+namespace Anycubic {
+ class FileNavigator {
+ public:
+ FileNavigator();
+ void reset();
+ void getFiles(uint16_t);
+ void upDIR();
+ void changeDIR(char *);
+ void sendFile();
+ void refresh();
+ char * getCurrentFolderName();
+ private:
+ static FileList filelist;
+ static char currentfoldername[MAX_PATH_LEN];
+ static uint16_t lastindex;
+ static uint8_t folderdepth;
+ static uint16_t currentindex;
+ };
+ extern FileNavigator filenavigator;
+}
diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp
new file mode 100644
index 000000000000..f09c4db3f283
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp
@@ -0,0 +1,62 @@
+/**
+ * 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 .
+ *
+ */
+
+/**
+ * lcd/extui/lib/Tunes.cpp
+ *
+ * Extensible_UI implementation for Anycubic Chiron
+ * Written By Nick Wells, 2020 [https://github.com/SwiftNick]
+ * (not affiliated with Anycubic, Ltd.)
+ */
+
+/***********************************************************************
+ * A Utility to play tunes using the buzzer in the printer controller. *
+ * See Tunes.h for note and tune definitions. *
+ ***********************************************************************/
+
+#include "../../../../inc/MarlinConfigPre.h"
+
+#if ENABLED(ANYCUBIC_LCD_CHIRON)
+
+#include "Tunes.h"
+#include "../../ui_api.h"
+
+namespace Anycubic {
+
+ void PlayTune(uint8_t beeperPin, const uint16_t *tune, uint8_t speed=1) {
+ uint8_t pos = 1;
+ uint16_t wholenotelen = tune[0] / speed;
+ do {
+ uint16_t freq = tune[pos];
+ uint16_t notelen = wholenotelen / tune[pos + 1];
+
+ ::tone(beeperPin, freq, notelen);
+ ExtUI::delay_ms(notelen);
+ pos += 2;
+
+ if (pos >= MAX_TUNE_LENGTH) break;
+ } while (tune[pos] != n_END);
+ }
+
+}
+
+#endif // ANYCUBIC_LCD_CHIRON
diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h
new file mode 100644
index 000000000000..1bafec43adf3
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h
@@ -0,0 +1,224 @@
+/**
+ * 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
+
+/**
+ * lcd/extui/lib/Tunes.h
+ *
+ * Extensible_UI implementation for Anycubic Chiron
+ * Written By Nick Wells, 2020 [https://github.com/SwiftNick]
+ * (not affiliated with Anycubic, Ltd.)
+ */
+
+/**************************************************************************
+ * Notes definition from https://pages.mtu.edu/~suits/NoteFreqCalcs.html *
+ * *
+ * The format of a tune is: *
+ * {,,, ,, ... } *
+ * *
+ * 1) The first value is the length of a whole note in milliseconds *
+ * 2) Then a sequence of pitch and duration pairs *
+ * 3) Finally the END marker so your tunes can be any length up to *
+ * MAX_TUNE_LEN *
+ *************************************************************************/
+
+#include
+
+#define MAX_TUNE_LENGTH 128
+
+// Special notes!
+#define n_P 0 // silence or pause
+#define n_END 10000 // end of tune marker
+
+// Note duration divisors
+#define l_T1 1
+#define l_T2 2
+#define l_T3 3
+#define l_T4 4
+#define l_T8 8
+#define l_T16 16
+
+// Note Frequency
+#define n_C0 16
+#define n_CS0 17
+#define n_D0 18
+#define n_DS0 19
+#define n_E0 21
+#define n_F0 22
+#define n_FS0 23
+#define n_G0 25
+#define n_GS0 26
+#define n_A0 28
+#define n_AS0 29
+#define n_B0 31
+#define n_C1 33
+#define n_CS1 35
+#define n_D1 37
+#define n_DS1 39
+#define n_E1 41
+#define n_F1 44
+#define n_FS1 46
+#define n_G1 49
+#define n_GS1 52
+#define n_A1 55
+#define n_AS1 58
+#define n_B1 62
+#define n_C2 65
+#define n_CS2 69
+#define n_D2 73
+#define n_DS2 78
+#define n_E2 82
+#define n_F2 87
+#define n_FS2 93
+#define n_G2 98
+#define n_GS2 104
+#define n_A2 110
+#define n_AS2 117
+#define n_B2 123
+#define n_C3 131
+#define n_CS3 139
+#define n_D3 147
+#define n_DS3 156
+#define n_E3 165
+#define n_F3 175
+#define n_FS3 185
+#define n_G3 196
+#define n_GS3 208
+#define n_A3 220
+#define n_AS3 233
+#define n_B3 247
+#define n_C4 262
+#define n_CS4 277
+#define n_D4 294
+#define n_DS4 311
+#define n_E4 330
+#define n_F4 349
+#define n_FS4 370
+#define n_G4 392
+#define n_GS4 415
+#define n_A4 440
+#define n_AS4 466
+#define n_B4 494
+#define n_C5 523
+#define n_CS5 554
+#define n_D5 587
+#define n_DS5 622
+#define n_E5 659
+#define n_F5 698
+#define n_FS5 740
+#define n_G5 784
+#define n_GS5 831
+#define n_A5 880
+#define n_AS5 932
+#define n_B5 988
+#define n_C6 1047
+#define n_CS6 1109
+#define n_D6 1175
+#define n_DS6 1245
+#define n_E6 1319
+#define n_F6 1397
+#define n_FS6 1480
+#define n_G6 1568
+#define n_GS6 1661
+#define n_A6 1760
+#define n_AS6 1865
+#define n_B6 1976
+#define n_C7 2093
+#define n_CS7 2217
+#define n_D7 2349
+#define n_DS7 2489
+#define n_E7 2637
+#define n_F7 2794
+#define n_FS7 2960
+#define n_G7 3136
+#define n_GS7 3322
+#define n_A7 3520
+#define n_AS7 3729
+#define n_B7 3951
+#define n_C8 4186
+#define n_CS8 4435
+#define n_D8 4699
+#define n_DS8 4978
+#define n_E8 5274
+#define n_F8 5587
+#define n_FS8 5920
+#define n_G8 6272
+#define n_GS8 6645
+#define n_A8 7040
+#define n_AS8 7459
+#define n_B8 7902
+
+namespace Anycubic {
+
+ void PlayTune(uint8_t beeperPin, const uint16_t *tune, uint8_t speed);
+
+ // Only uncomment the tunes you are using to save memory
+ // This will help you write tunes!
+ // https://www.apronus.com/music/flashpiano.htm
+
+ const uint16_t SOS[] = {
+ 250,
+ n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T1,
+ n_G6,l_T1, n_P,l_T3, n_G6,l_T1, n_P,l_T3, n_G6,l_T1, n_P,l_T1,
+ n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T1,
+ n_END
+ };
+
+ const uint16_t BeepBeep[] = {
+ 500,
+ n_C7,l_T8, n_P,l_T16, n_C7,l_T8, n_P,l_T8,
+ n_END
+ };
+
+ const uint16_t BeepBeepBeeep[] = {
+ 1000,
+ n_G7,l_T4, n_P,l_T16, n_G7,l_T4, n_P,l_T8, n_G7,l_T2,
+ n_END
+ };
+
+ const uint16_t Anycubic_PowerOn[] = {
+ 1000,
+ n_F7,l_T8, n_P,l_T8, n_C7,l_T8, n_P,l_T8, n_D7,l_T8, n_P,l_T8,
+ n_E7,l_T8, n_P,l_T8, n_D7,l_T4, n_P,l_T4, n_G7,l_T4, n_P,l_T4,
+ n_A7,l_T2, n_P,l_T1,
+ n_END
+ };
+
+ const uint16_t GB_PowerOn[] = {
+ 500,
+ n_C6,l_T4, n_P,l_T16, n_C7,l_T2, n_P,l_T8,
+ n_END
+ };
+
+ const uint16_t Heater_Timedout[] = {
+ 1000,
+ n_C6,l_T1,
+ n_END
+ };
+
+ const uint16_t FilamentOut[] = {
+ 1000,
+ n_AS7,l_T4, n_P,l_T16, n_FS7,l_T2,
+ n_END
+ };
+
+}
diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp
new file mode 100644
index 000000000000..5e492573e70a
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp
@@ -0,0 +1,896 @@
+/**
+ * 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 .
+ *
+ */
+
+/**
+ * lcd/extui/lib/chiron_tft.cpp
+ *
+ * Extensible_UI implementation for Anycubic Chiron
+ * Written By Nick Wells, 2020 [https://github.com/SwiftNick]
+ * (not affiliated with Anycubic, Ltd.)
+ */
+
+#include "../../../../inc/MarlinConfigPre.h"
+
+#if ENABLED(ANYCUBIC_LCD_CHIRON)
+
+#include "chiron_tft.h"
+#include "Tunes.h"
+#include "FileNavigator.h"
+
+#include "../../../../gcode/queue.h"
+#include "../../../../sd/cardreader.h"
+#include "../../../../libs/numtostr.h"
+#include "../../../../MarlinCore.h"
+namespace Anycubic {
+
+ printer_state_t ChironTFT::printer_state;
+ paused_state_t ChironTFT::pause_state;
+ heater_state_t ChironTFT::hotend_state;
+ heater_state_t ChironTFT::hotbed_state;
+ xy_uint8_t ChironTFT::selectedmeshpoint;
+ char ChironTFT::selectedfile[MAX_PATH_LEN];
+ char ChironTFT::panel_command[MAX_CMND_LEN];
+ uint8_t ChironTFT::command_len;
+ float ChironTFT::live_Zoffset;
+ file_menu_t ChironTFT::file_menu;
+
+ ChironTFT::ChironTFT(){}
+
+ void ChironTFT::Startup() {
+ selectedfile[0] = '\0';
+ panel_command[0] = '\0';
+ command_len = 0;
+ printer_state = AC_printer_idle;
+ pause_state = AC_paused_idle;
+ hotend_state = AC_heater_off;
+ hotbed_state = AC_heater_off;
+ live_Zoffset = 0.0;
+ file_menu = AC_menu_file;
+
+ // Setup pins for powerloss detection
+ // Two IO pins are connected on the Trigorilla Board
+ // On a power interruption the OUTAGECON_PIN goes low.
+
+ #if ENABLED(POWER_LOSS_RECOVERY)
+ OUT_WRITE(OUTAGECON_PIN, HIGH);
+ #endif
+
+ // Filament runout is handled by Marlin settings in Configuration.h
+ // set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present.
+ // enable FIL_RUNOUT_PULLUP
+
+ TFTSer.begin(115200);
+
+ // Signal Board has reset
+ SendtoTFTLN(AC_msg_main_board_has_reset);
+
+ safe_delay(200);
+
+ // Enable levelling and Disable end stops during print
+ // as Z home places nozzle above the bed so we need to allow it past the end stops
+ injectCommands_P(AC_cmnd_enable_levelling); //M211 S0\n"));
+
+ // Startup tunes are defined in Tunes.h
+ //PlayTune(BEEPER_PIN, Anycubic_PowerOn, 1);
+ PlayTune(BEEPER_PIN, GB_PowerOn, 1);
+ #if ACDEBUGLEVEL
+ SERIAL_ECHOLNPAIR("AC Debug Level ", ACDEBUGLEVEL);
+ #endif
+ SendtoTFTLN(AC_msg_ready);
+ }
+
+ void ChironTFT::IdleLoop() {
+ if (ReadTFTCommand()) {
+ ProcessPanelRequest();
+ command_len = 0;
+ }
+ CheckHeaters();
+ }
+
+ void ChironTFT::PrinterKilled(PGM_P error,PGM_P component) {
+ SendtoTFTLN(AC_msg_kill_lcd);
+ #if ACDEBUG(AC_MARLIN)
+ SERIAL_ECHOLNPAIR("PrinterKilled()\nerror: ", error , "\ncomponent: ", component);
+ #endif
+ }
+
+ void ChironTFT::MediaEvent(media_event_t event) {
+ #if ACDEBUG(AC_MARLIN)
+ SERIAL_ECHOLNPAIR("ProcessMediaStatus() ", event);
+ #endif
+ switch (event) {
+ case AC_media_inserted:
+ SendtoTFTLN(AC_msg_sd_card_inserted);
+ break;
+
+ case AC_media_removed:
+ SendtoTFTLN(AC_msg_sd_card_removed);
+ break;
+
+ case AC_media_error:
+ SendtoTFTLN(AC_msg_no_sd_card);
+ break;
+ }
+ }
+
+ void ChironTFT::TimerEvent(timer_event_t event) {
+ #if ACDEBUG(AC_MARLIN)
+ SERIAL_ECHOLNPAIR("TimerEvent() ", event);
+ SERIAL_ECHOLNPAIR("Printer State: ", printer_state);
+ #endif
+
+ switch (event) {
+ case AC_timer_started: {
+ live_Zoffset = 0.0; // reset print offset
+ setSoftEndstopState(false); // disable endstops to print
+ printer_state = AC_printer_printing;
+ SendtoTFTLN(AC_msg_print_from_sd_card);
+ } break;
+
+ case AC_timer_paused: {
+ printer_state = AC_printer_paused;
+ pause_state = AC_paused_idle;
+ SendtoTFTLN(AC_msg_paused);
+ } break;
+
+ case AC_timer_stopped: {
+ if (printer_state != AC_printer_idle) {
+ printer_state = AC_printer_stopping;
+ SendtoTFTLN(AC_msg_print_complete);
+ }
+ setSoftEndstopState(true); // enable endstops
+ } break;
+ }
+ }
+
+ void ChironTFT::FilamentRunout() {
+ #if ACDEBUG(AC_MARLIN)
+ SERIAL_ECHOLNPAIR("FilamentRunout() printer_state ", printer_state);
+ #endif
+ // 1 Signal filament out
+ SendtoTFTLN(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block);
+ //printer_state = AC_printer_filament_out;
+ PlayTune(BEEPER_PIN, FilamentOut, 1);
+ }
+
+ void ChironTFT::ConfirmationRequest(const char * const msg) {
+ // M108 continue
+ #if ACDEBUG(AC_MARLIN)
+ SERIAL_ECHOLNPAIR("ConfirmationRequest() ", msg, " printer_state:", printer_state);
+ #endif
+ switch (printer_state) {
+ case AC_printer_pausing: {
+ if ( (strcmp_P(msg, MARLIN_msg_print_paused) == 0 ) || (strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0 ) ) {
+ SendtoTFTLN(AC_msg_paused); // enable continue button
+ printer_state = AC_printer_paused;
+ }
+ } break;
+
+ case AC_printer_resuming_from_power_outage:
+ case AC_printer_printing:
+ case AC_printer_paused: {
+ // Heater timout, send acknowledgement
+ if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0 ) {
+ pause_state = AC_paused_heater_timed_out;
+ SendtoTFTLN(AC_msg_paused); // enable continue button
+ PlayTune(BEEPER_PIN,Heater_Timedout,1);
+ }
+ // Reheat finished, send acknowledgement
+ else if (strcmp_P(msg, MARLIN_msg_reheat_done) == 0 ) {
+ pause_state = AC_paused_idle;
+ SendtoTFTLN(AC_msg_paused); // enable continue button
+ }
+ // Filament Purging, send acknowledgement enter run mode
+ else if (strcmp_P(msg, MARLIN_msg_filament_purging) == 0 ) {
+ pause_state = AC_paused_purging_filament;
+ SendtoTFTLN(AC_msg_paused); // enable continue button
+ }
+ } break;
+ default:
+ break;
+ }
+ }
+
+ void ChironTFT::StatusChange(const char * const msg) {
+ #if ACDEBUG(AC_MARLIN)
+ SERIAL_ECHOLNPAIR("StatusChange() ", msg);
+ SERIAL_ECHOLNPAIR("printer_state:", printer_state);
+ #endif
+ bool msg_matched = false;
+ // The only way to get printer status is to parse messages
+ // Use the state to minimise the work we do here.
+ switch (printer_state) {
+ case AC_printer_probing: {
+ // If probing completes ok save the mesh and park
+ if (strcmp_P(msg, MARLIN_msg_ready) == 0 ) {
+ injectCommands_P(PSTR("M500\nG27"));
+ SendtoTFTLN(AC_msg_probing_complete);
+ printer_state = AC_printer_idle;
+ msg_matched = true;
+ }
+ // If probing fails dont save the mesh raise the probe above the bad point
+ if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0 ) {
+ PlayTune(BEEPER_PIN, BeepBeepBeeep, 1);
+ injectCommands_P(PSTR("G1 Z50 F500"));
+ SendtoTFTLN(AC_msg_probing_complete);
+ printer_state = AC_printer_idle;
+ msg_matched = true;
+ }
+ } break;
+
+ case AC_printer_printing: {
+ if (strcmp_P(msg, MARLIN_msg_reheating) == 0 ) {
+ SendtoTFTLN(AC_msg_paused); // enable continue button
+ msg_matched = true;
+ }
+ } break;
+
+ case AC_printer_pausing: {
+ if (strcmp_P(msg, MARLIN_msg_print_paused) == 0 ) {
+ SendtoTFTLN(AC_msg_paused);
+ printer_state = AC_printer_paused;
+ pause_state = AC_paused_idle;
+ msg_matched = true;
+ }
+ } break;
+
+ case AC_printer_stopping: {
+ if (strcmp_P(msg, MARLIN_msg_print_aborted) == 0 ) {
+ SendtoTFTLN(AC_msg_stop);
+ printer_state = AC_printer_idle;
+ msg_matched = true;
+ }
+ } break;
+ default:
+ break;
+ }
+
+ // If not matched earlier see if this was a heater message
+ if (!msg_matched) {
+ if (strcmp_P(msg, MARLIN_msg_extruder_heating) == 0) {
+ SendtoTFTLN(AC_msg_nozzle_heating);
+ hotend_state = AC_heater_temp_set;
+ }
+ else if (strcmp_P(msg, MARLIN_msg_bed_heating) == 0) {
+ SendtoTFTLN(AC_msg_bed_heating);
+ hotbed_state = AC_heater_temp_set;
+ }
+ }
+ }
+
+ void ChironTFT::PowerLossRecovery() {
+ printer_state = AC_printer_resuming_from_power_outage; // Play tune to notify user we can recover.
+ PlayTune(BEEPER_PIN, SOS, 1);
+ SERIAL_ECHOLNPGM("Resuming from power outage...");
+ SERIAL_ECHOLNPGM("Select SD file then press resume");
+ }
+
+ void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEN string to the panel
+ #if ACDEBUG(AC_SOME)
+ serialprintPGM(str);
+ #endif
+ while (const char c = pgm_read_byte(str++)) TFTSer.print(c);
+ }
+
+ void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) {
+ if (str != nullptr) {
+ #if ACDEBUG(AC_SOME)
+ SERIAL_ECHO("> ");
+ #endif
+ SendtoTFT(str);
+ #if ACDEBUG(AC_SOME)
+ SERIAL_EOL();
+ #endif
+ }
+ TFTSer.println("");
+ }
+
+ bool ChironTFT::ReadTFTCommand() {
+ bool command_ready = false;
+ while( (TFTSer.available() > 0) && (command_len < MAX_CMND_LEN) ) {
+ panel_command[command_len] = TFTSer.read();
+ if(panel_command[command_len] == '\n') {
+ command_ready = true;
+ break;
+ }
+ command_len++;
+ }
+
+ if(command_ready) {
+ panel_command[command_len] = 0x00;
+ #if ACDEBUG(AC_ALL)
+ SERIAL_ECHOLNPAIR("< ", panel_command);
+ #endif
+ #if ACDEBUG(AC_SOME)
+ // Ignore status request commands
+ uint8_t req = atoi(&panel_command[1]);
+ if (req > 7 && req != 20) {
+ SERIAL_ECHOLNPAIR("> ", panel_command);
+ SERIAL_ECHOLNPAIR("printer_state:", printer_state);
+ }
+ #endif
+ }
+ return command_ready;
+ }
+
+ int8_t ChironTFT::Findcmndpos(const char * buff, char q) {
+ bool found = false;
+ int8_t pos = 0;
+ do {
+ if (buff[pos] == q) {
+ found = true;
+ break;
+ }
+ pos ++;
+ } while(pos < MAX_CMND_LEN);
+ if (found) return pos;
+ return -1;
+ }
+
+ void ChironTFT::CheckHeaters() {
+ uint8_t faultDuration = 0; float temp = 0;
+
+ // if the hotend temp is abnormal, confirm state before signalling panel
+ temp = getActualTemp_celsius(E0);
+ if ( (temp <= HEATER_0_MINTEMP) || (temp >= HEATER_0_MAXTEMP) ) {
+ do {
+ faultDuration ++;
+ if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) {
+ SendtoTFTLN(AC_msg_nozzle_temp_abnormal);
+ SERIAL_ECHOLNPAIR("Extruder temp abnormal! : ", temp);
+ break;
+ }
+ delay_ms(500);
+ temp = getActualTemp_celsius(E0);
+ } while ((temp <= HEATER_0_MINTEMP) || (temp >= HEATER_0_MAXTEMP) );
+ }
+
+ // if the hotbed temp is abnormal, confirm state before signalling panel
+ faultDuration = 0;
+ temp = getActualTemp_celsius(BED);
+ if ( (temp <= BED_MINTEMP) || (temp >= BED_MAXTEMP) ) {
+ do {
+ faultDuration ++;
+ if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) {
+ SendtoTFTLN(AC_msg_nozzle_temp_abnormal);
+ SERIAL_ECHOLNPAIR_P("Bed temp abnormal! : ", temp);
+ break;
+ }
+ delay_ms(500);
+ temp = getActualTemp_celsius(E0);
+ } while ((temp <= BED_MINTEMP) || (temp >= BED_MAXTEMP) );
+ }
+
+ // Update panel with hotend heater status
+ if (hotend_state != AC_heater_temp_reached) {
+ if ( WITHIN( getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -1, 1 ) ) {
+ SendtoTFTLN(AC_msg_nozzle_heating_done);
+ hotend_state = AC_heater_temp_reached;
+ }
+ }
+
+ // Update panel with bed heater status
+ if (hotbed_state != AC_heater_temp_reached) {
+ if ( WITHIN( getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -0.5, 0.5 ) ) {
+ SendtoTFTLN(AC_msg_bed_heating_done);
+ hotbed_state = AC_heater_temp_reached;
+ }
+ }
+ }
+
+ void ChironTFT::SendFileList(int8_t startindex) {
+ // respond to panel request for 4 files starting at index
+ #if ACDEBUG(AC_INFO)
+ SERIAL_ECHOLNPAIR("## SendFileList ## ", startindex);
+ #endif
+ SendtoTFTLN(PSTR("FN "));
+ filenavigator.getFiles(startindex);
+ SendtoTFTLN(PSTR("END"));
+ }
+
+ void ChironTFT::SelectFile() {
+ strncpy(selectedfile,panel_command+4,command_len-4);
+ selectedfile[command_len-5] = '\0';
+ #if ACDEBUG(AC_FILE)
+ SERIAL_ECHOLNPAIR_F(" Selected File: ",selectedfile);
+ #endif
+ switch (selectedfile[0]) {
+ case '/': // Valid file selected
+ SendtoTFTLN(AC_msg_sd_file_open_success);
+ break;
+
+ case '<': // .. (go up folder level)
+ filenavigator.upDIR();
+ SendtoTFTLN(AC_msg_sd_file_open_failed);
+ SendFileList( 0 );
+ break;
+ default: // enter sub folder
+ filenavigator.changeDIR(selectedfile);
+ SendtoTFTLN(AC_msg_sd_file_open_failed);
+ SendFileList( 0 );
+ break;
+ }
+ }
+
+ void ChironTFT::InjectCommandandWait(PGM_P cmd) {
+ //injectCommands_P(cmnd); queue.enqueue_now_P(cmd);
+ //SERIAL_ECHOLN(PSTR("Inject>"));
+ }
+
+ void ChironTFT::ProcessPanelRequest() {
+ // Break these up into logical blocks // as its easier to navigate than one huge switch case!
+ int8_t req = atoi(&panel_command[1]);
+
+ // Information requests A0 - A8 and A33
+ if (req <= 8 || req == 33) PanelInfo(req);
+
+ // Simple Actions A9 - A28
+ else if ( req <= 28) PanelAction(req);
+
+ // Process Initiation
+ else if (req <= 34) PanelProcess(req);
+
+ else SendtoTFTLN();
+ }
+
+ void ChironTFT::PanelInfo(uint8_t req) {
+ // information requests A0-A8 and A33
+ switch (req) {
+ case 0: // A0 Get HOTEND Temp
+ SendtoTFT(PSTR("A0V "));
+ TFTSer.println(getActualTemp_celsius(E0));
+ break;
+
+ case 1: // A1 Get HOTEND Target Temp
+ SendtoTFT(PSTR("A1V "));
+ TFTSer.println(getTargetTemp_celsius(E0));
+ break;
+
+ case 2: // A2 Get BED Temp
+ SendtoTFT(PSTR("A2V "));
+ TFTSer.println(getActualTemp_celsius(BED));
+ break;
+
+ case 3: // A3 Get BED Target Temp
+ SendtoTFT(PSTR("A3V "));
+ TFTSer.println(getTargetTemp_celsius(BED));
+ break;
+
+ case 4: // A4 Get FAN Speed
+ SendtoTFT(PSTR("A4V "));
+ TFTSer.println(getActualFan_percent(FAN0));
+ break;
+
+ case 5: // A5 Get Current Coordinates
+ SendtoTFT(PSTR("A5V X: "));
+ TFTSer.print(getAxisPosition_mm(X));
+ SendtoTFT(PSTR(" Y: "));
+ TFTSer.print(getAxisPosition_mm(Y));
+ SendtoTFT(PSTR(" Z: "));
+ TFTSer.println(getAxisPosition_mm(Z));
+ break;
+
+ case 6: // A6 Get printing progress
+ if (isPrintingFromMedia()) {
+ SendtoTFT(PSTR("A6V "));
+ TFTSer.println(ui8tostr2(getProgress_percent()));
+
+ }
+ else
+ SendtoTFTLN(PSTR("A6V ---"));
+ break;
+
+ case 7: { // A7 Get Printing Time
+ uint32_t time = getProgress_seconds_elapsed() / 60;
+ SendtoTFT(PSTR("A7V "));
+ TFTSer.print(ui8tostr2(time / 60));
+ SendtoTFT(PSTR(" H "));
+ TFTSer.print(ui8tostr2(time % 60));
+ SendtoTFT(PSTR(" M"));
+ #if ACDEBUG(AC_ALL)
+ SERIAL_ECHOLNPAIR("Print time ", ui8tostr2(time / 60), ":", ui8tostr2(time % 60));
+ #endif
+ } break;
+
+ case 8: // A8 Get SD Card list A8 S0
+ if (!isMediaInserted()) safe_delay(500);
+ if (!isMediaInserted()) // Make sure the card is removed
+ SendtoTFTLN(AC_msg_no_sd_card);
+ else if (panel_command[3] == 'S')
+ SendFileList( atoi( &panel_command[4] ) );
+ break;
+
+ case 33: // A33 Get firmware info
+ SendtoTFT(PSTR("J33 "));
+ SendtoTFTLN(PSTR(SHORT_BUILD_VERSION));
+ break;
+ }
+ }
+
+ void ChironTFT::PanelAction(uint8_t req) {
+ switch (req) {
+ case 9: // A9 Pause SD print
+ if (isPrintingFromMedia()) {
+ SendtoTFTLN(AC_msg_pause);
+ pausePrint();
+ printer_state = AC_printer_pausing;
+ }
+ else
+ SendtoTFTLN(AC_msg_stop);
+ break;
+
+ case 10: // A10 Resume SD Print
+ if (pause_state == AC_paused_idle || printer_state == AC_printer_resuming_from_power_outage)
+ resumePrint();
+ else
+ setUserConfirmed();
+ break;
+
+ case 11: // A11 Stop SD print
+ if (isPrintingFromMedia()) {
+ printer_state = AC_printer_stopping;
+ stopPrint();
+ }
+ else {
+ if (printer_state == AC_printer_resuming_from_power_outage)
+ injectCommands_P(PSTR("M1000 C\n")); // Cancel recovery
+ SendtoTFTLN(AC_msg_stop);
+ printer_state = AC_printer_idle;
+ }
+ break;
+
+ case 12: // A12 Kill printer
+ kill(); // from marlincore.h
+ break;
+
+ case 13: // A13 Select file
+ SelectFile();
+ break;
+
+ case 14: { // A14 Start Printing
+ // Allows printer to restart the job if we dont want to recover
+ if (printer_state == AC_printer_resuming_from_power_outage) {
+ injectCommands_P(PSTR("M1000 C\n")); // Cancel recovery
+ printer_state = AC_printer_idle;
+ }
+ #if ACDebugLevel >= 1
+ SERIAL_ECHOLNPAIR_F("Print: ", selectedfile);
+ #endif
+ // the card library needs a path starting // but the File api doesn't...
+ char file[MAX_PATH_LEN];
+ file[0] = '/';
+ strcpy(file + 1, selectedfile);
+ printFile(file);
+ SendtoTFTLN(AC_msg_print_from_sd_card);
+ } break;
+
+ case 15: // A15 Resuming from outage
+ if (printer_state == AC_printer_resuming_from_power_outage)
+ // Need to home here to restore the Z position
+ injectCommands_P(AC_cmnd_power_loss_recovery);
+
+ injectCommands_P(PSTR("M1000\n")); // home and start recovery
+ break;
+
+ case 16: { // A16 Set HotEnd temp A17 S170
+ const float set_Htemp = atof(&panel_command[5]);
+ hotend_state = set_Htemp ? AC_heater_temp_set : AC_heater_off;
+ switch ((char)panel_command[4]) {
+ // Set Temp
+ case 'S': case 'C': setTargetTemp_celsius(set_Htemp, E0);
+ }
+ } break;
+
+ case 17: { // A17 Set bed temp
+ const float set_Btemp = atof(&panel_command[5]);
+ hotbed_state = set_Btemp ? AC_heater_temp_set : AC_heater_off;
+ if (panel_command[4] == 'S')
+ setTargetTemp_celsius(set_Btemp, BED);
+ } break;
+
+ case 18: // A18 Set Fan Speed
+ if (panel_command[4] == 'S')
+ setTargetFan_percent(atof(&panel_command[5]), FAN0);
+ break;
+
+ case 19: // A19 Motors off
+ if (!isPrinting()) {
+ disable_all_steppers(); // from marlincore.h
+ SendtoTFTLN(AC_msg_ready);
+ }
+ break;
+
+ case 20: // A20 Read/write print speed
+ if (panel_command[4] == 'S')
+ setFeedrate_percent(atoi(&panel_command[5]));
+ else {
+ SendtoTFT(PSTR("A20V "));
+ TFTSer.println(getFeedrate_percent());
+ }
+ break;
+
+ case 21: // A21 Home Axis A21 X
+ if (!isPrinting()) {
+ switch ((char)panel_command[4]) {
+ case 'X': injectCommands_P(PSTR("G28 X\n")); break;
+ case 'Y': injectCommands_P(PSTR("G28 Y\n")); break;
+ case 'Z': injectCommands_P(PSTR("G28 Z\n")); break;
+ case 'C': injectCommands_P(PSTR("G28\n")); break;
+ }
+ }
+ break;
+
+ case 22: // A22 Move Axis A22 Y +10F3000
+ // Ignore request if printing
+ if (!isPrinting()) {
+ // setAxisPosition_mm() uses pre defined manual feedrates so ignore the feedrate from the panel
+ setSoftEndstopState(true); // enable endstops
+ float newposition = atof(&panel_command[6]);
+
+ #if ACDEBUG(AC_ACTION)
+ SERIAL_ECHOLNPAIR("Nudge ", panel_command[4], " axis ", newposition);
+ #endif
+
+ switch (panel_command[4]) {
+ case 'X': setAxisPosition_mm(getAxisPosition_mm(X) + newposition, X); break;
+ case 'Y': setAxisPosition_mm(getAxisPosition_mm(Y) + newposition, Y); break;
+ case 'Z': setAxisPosition_mm(getAxisPosition_mm(Z) + newposition, Z); break;
+ case 'E': // The only time we get this command is from the filament load/unload menu
+ // the standard movement is too slow so we will use the load unlod GCode to speed it up a bit
+ if (canMove(E0) && !commandsInQueue())
+ injectCommands_P(newposition > 0 ? AC_cmnd_manual_load_filament : AC_cmnd_manual_unload_filament);
+ break;
+ }
+ }
+ break;
+
+ case 23: // A23 Preheat PLA
+ // Ignore request if printing
+ if (!isPrinting()) {
+ // Temps defined in configuration.h
+ setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED);
+ setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0);
+ SendtoTFTLN();
+ hotbed_state = AC_heater_temp_set;
+ hotend_state = AC_heater_temp_set;
+ }
+ break;
+
+ case 24: // A24 Preheat ABS
+ // Ignore request if printing
+ if (!isPrinting()) {
+ setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED);
+ setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0);
+ SendtoTFTLN();
+ hotbed_state = AC_heater_temp_set;
+ hotend_state = AC_heater_temp_set;
+ }
+ break;
+
+ case 25: // A25 Cool Down
+ // Ignore request if printing
+ if (!isPrinting()) {
+ setTargetTemp_celsius(0, E0);
+ setTargetTemp_celsius(0, BED);
+ SendtoTFTLN(AC_msg_ready);
+ hotbed_state = AC_heater_off;
+ hotend_state = AC_heater_off;
+ }
+ break;
+
+ case 26: // A26 Refresh SD
+ // M22 M21 maybe needed here to reset sd card
+ filenavigator.reset();
+ break;
+
+ case 27: // A27 Servo Angles adjust
+ break;
+
+ case 28: // A28 Filament set A28 O/C
+ // Ignore request if printing
+ if (isPrinting()) break;
+ SendtoTFTLN();
+ break;
+ }
+ }
+
+ void ChironTFT::PanelProcess(uint8_t req) {
+ switch (req) {
+ case 29: { // A29 Read Mesh Point A29 X1 Y1
+ xy_uint8_t pos;
+ float pos_z;
+ pos.x = atoi(&panel_command[5]);
+ pos.y = atoi(&panel_command[8]);
+ pos_z = getMeshPoint(pos);
+
+ SendtoTFT(PSTR("A29V "));
+ TFTSer.println(pos_z * 100);
+ if (!isPrinting()) {
+ setSoftEndstopState(true); // disable endstops
+ // If the same meshpoint is selected twice in a row, move the head to that ready for adjustment
+ if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) {
+ if (!isPositionKnown())
+ injectCommands_P(PSTR("G28\n")); // home
+
+ if (isPositionKnown()) {
+ #if ACDEBUG(AC_INFO)
+ SERIAL_ECHOLNPAIR("Moving to mesh point at x: ", pos.x, " y: ", pos.y, " z: ", pos_z);
+ #endif
+ // Go up before moving
+ setAxisPosition_mm(3.0,Z);
+
+ setAxisPosition_mm(17 + (93 * pos.x), X);
+ setAxisPosition_mm(20 + (93 * pos.y), Y);
+ setAxisPosition_mm(0.0, Z);
+ #if ACDEBUG(AC_INFO)
+ SERIAL_ECHOLNPAIR("Current Z: ", getAxisPosition_mm(Z));
+ #endif
+ }
+ }
+ selectedmeshpoint.x = pos.x;
+ selectedmeshpoint.y = pos.y;
+ }
+ } break;
+
+ case 30: { // A30 Auto leveling
+ if (panel_command[3] == 'S') { // Start probing
+ // Ignore request if printing
+ if (isPrinting())
+ SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling
+ else {
+ injectCommands_P(isMachineHomed() ? PSTR("G29") : PSTR("G28\nG29"));
+ printer_state = AC_printer_probing;
+ SendtoTFTLN(AC_msg_start_probing);
+ }
+ }
+ else SendtoTFTLN(AC_msg_start_probing);
+ } break;
+
+ case 31: { // A31 Adjust all Probe Points
+ switch (panel_command[3]) {
+ case 'C': // Restore and apply original offsets
+ if (!isPrinting()) {
+ injectCommands_P(PSTR("M501\nM420 S1\n"));
+ selectedmeshpoint.x = 99;
+ selectedmeshpoint.y = 99;
+ }
+ break;
+ case 'D': // Save Z Offset tables and restore levelling state
+ if (!isPrinting()) {
+ setAxisPosition_mm(1.0,Z);
+ injectCommands_P(PSTR("M500\n"));
+ selectedmeshpoint.x = 99;
+ selectedmeshpoint.y = 99;
+ }
+ break;
+ case 'G': // Get current offset
+ SendtoTFT(PSTR("A31V "));
+ // When printing use the live z Offset position
+ // we will use babystepping to move the print head
+ if (isPrinting())
+ TFTSer.println(live_Zoffset);
+ else {
+ TFTSer.println(getZOffset_mm());
+ selectedmeshpoint.x = 99;
+ selectedmeshpoint.y = 99;
+ }
+ break;
+ case 'S': { // Set offset (adjusts all points by value)
+ float Zshift = atof(&panel_command[4]);
+ setSoftEndstopState(false); // disable endstops
+ // Allow temporary Z position nudging during print
+ // From the levelling panel use the all points UI to adjust the print pos.
+ if (isPrinting()) {
+ #if ACDEBUG(AC_INFO)
+ SERIAL_ECHOLNPAIR("Change Zoffset from:", live_Zoffset, " to ", live_Zoffset + Zshift);
+ #endif
+ if (isAxisPositionKnown(Z)) {
+ #if ACDEBUG(AC_INFO)
+ const float currZpos = getAxisPosition_mm(Z);
+ SERIAL_ECHOLNPAIR("Nudge Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05));
+ #endif
+ // Use babystepping to adjust the head position
+ int16_t steps = mmToWholeSteps(constrain(Zshift,-0.05,0.05), Z);
+ #if ACDEBUG(AC_INFO)
+ SERIAL_ECHOLNPAIR("Steps to move Z: ", steps);
+ #endif
+ babystepAxis_steps(steps, Z);
+ live_Zoffset += Zshift;
+ }
+ SendtoTFT(PSTR("A31V "));
+ TFTSer.println(live_Zoffset);
+ }
+ else {
+ GRID_LOOP(x, y) {
+ const xy_uint8_t pos { x, y };
+ const float currval = getMeshPoint(pos);
+ setMeshPoint(pos, constrain(currval + Zshift, AC_LOWEST_MESHPOINT_VAL, 2));
+ }
+ const float currZOffset = getZOffset_mm();
+ #if ACDEBUG(AC_INFO)
+ SERIAL_ECHOLNPAIR("Change probe offset from ", currZOffset, " to ", currZOffset + Zshift);
+ #endif
+
+ setZOffset_mm(currZOffset + Zshift);
+ SendtoTFT(PSTR("A31V "));
+ TFTSer.println(getZOffset_mm());
+
+ if (isAxisPositionKnown(Z)) {
+ // Move Z axis
+ const float currZpos = getAxisPosition_mm(Z);
+ #if ACDEBUG(AC_INFO)
+ SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05));
+ #endif
+ setAxisPosition_mm(currZpos+constrain(Zshift,-0.05,0.05),Z);
+ }
+ }
+ } break;
+ } // end switch
+ } break;
+
+ case 32: { // A32 clean leveling beep flag
+ // Ignore request if printing
+ //if (isPrinting()) break;
+ //injectCommands_P(PSTR("M500\nM420 S1\nG1 Z10 F240\nG1 X0 Y0 F6000"));
+ //TFTSer.println("");
+ } break;
+
+ // A33 firmware info request seet PanelInfo()
+
+ case 34: { // A34 Adjust single mesh point A34 C/S X1 Y1 V123
+ if (panel_command[3] == 'C') { // Restore original offsets
+ injectCommands_P(PSTR("M501\nM420 S1"));
+ selectedmeshpoint.x = 99;
+ selectedmeshpoint.y = 99;
+ //printer_state = AC_printer_idle;
+ }
+ else {
+ xy_uint8_t pos;
+ pos.x = atoi(&panel_command[5]);
+ pos.y = atoi(&panel_command[8]);
+
+ float currmesh = getMeshPoint(pos);
+ float newval = atof(&panel_command[11])/100;
+ #if ACDEBUG(AC_INFO)
+ SERIAL_ECHOLNPAIR("Change mesh point x:", pos.x, " y:", pos.y);
+ SERIAL_ECHOLNPAIR("from ", currmesh, " to ", newval);
+ #endif
+ // Update Meshpoint
+ setMeshPoint(pos,newval);
+ if ( (printer_state == AC_printer_idle) || (printer_state == AC_printer_probing) ) {//!isPrinting()) {
+ // if we are at the current mesh point indicated on the panel Move Z pos +/- 0.05mm ( The panel changes the mesh value by +/- 0.05mm on each button press)
+ if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) {
+ setSoftEndstopState(false);
+ float currZpos = getAxisPosition_mm(Z);
+ #if ACDEBUG(AC_INFO)
+ SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(newval - currmesh, -0.05, 0.05));
+ #endif
+ setAxisPosition_mm(currZpos + constrain(newval - currmesh, -0.05, 0.05), Z);
+ }
+ }
+ }
+ } break;
+ }
+ }
+} // namespace
+
+#endif // ANYCUBIC_LCD_CHIRON
diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h
new file mode 100644
index 000000000000..267f2fe9783f
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h
@@ -0,0 +1,77 @@
+/**
+ * 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
+
+/**
+ * lcd/extui/lib/chiron_tft.h
+ *
+ * Extensible_UI implementation for Anycubic Chiron
+ * Written By Nick Wells, 2020 [https://github.com/SwiftNick]
+ * (not affiliated with Anycubic, Ltd.)
+ */
+
+#include "chiron_tft_defs.h"
+#include "../../../../inc/MarlinConfigPre.h"
+#include "../../ui_api.h"
+namespace Anycubic {
+
+ class ChironTFT {
+ static printer_state_t printer_state;
+ static paused_state_t pause_state;
+ static heater_state_t hotend_state;
+ static heater_state_t hotbed_state;
+ static xy_uint8_t selectedmeshpoint;
+ static char panel_command[MAX_CMND_LEN];
+ static uint8_t command_len;
+ static char selectedfile[MAX_PATH_LEN];
+ static float live_Zoffset;
+ static file_menu_t file_menu;
+ public:
+ ChironTFT();
+ void Startup();
+ void IdleLoop();
+ void PrinterKilled(PGM_P,PGM_P);
+ void MediaEvent(media_event_t);
+ void TimerEvent(timer_event_t);
+ void FilamentRunout();
+ void ConfirmationRequest(const char * const );
+ void StatusChange(const char * const );
+ void PowerLossRecovery();
+
+ private:
+ void SendtoTFT(PGM_P);
+ void SendtoTFTLN(PGM_P);
+ bool ReadTFTCommand();
+ int8_t Findcmndpos(const char *, char);
+ void CheckHeaters();
+ void SendFileList(int8_t);
+ void SelectFile();
+ void InjectCommandandWait(PGM_P);
+ void ProcessPanelRequest();
+ void PanelInfo(uint8_t);
+ void PanelAction(uint8_t);
+ void PanelProcess(uint8_t);
+ };
+
+ extern ChironTFT Chiron;
+
+}
diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h
new file mode 100644
index 000000000000..937bdfde33b3
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h
@@ -0,0 +1,151 @@
+/**
+ * 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 .
+ *
+ */
+
+/**
+ * lcd/extui/lib/chiron_defs.h
+ *
+ * Extensible_UI implementation for Anycubic Chiron
+ * Written By Nick Wells, 2020 [https://github.com/SwiftNick]
+ * (not affiliated with Anycubic, Ltd.)
+ */
+
+#pragma once
+#include "../../../../inc/MarlinConfigPre.h"
+//#define ACDEBUGLEVEL 255
+
+#if ACDEBUGLEVEL
+ // Bit-masks for selective debug:
+ enum ACDebugMask : uint8_t {
+ AC_INFO = 1,
+ AC_ACTION = 2,
+ AC_FILE = 4,
+ AC_PANEL = 8,
+ AC_MARLIN = 16,
+ AC_SOME = 32,
+ AC_ALL = 64
+ };
+ #define ACDEBUG(mask) ( ((mask) & ACDEBUGLEVEL) == mask ) // Debug flag macro
+#else
+ #define ACDEBUG(mask) false
+#endif
+
+#define TFTSer LCD_SERIAL // Serial interface for TFT panel now uses marlinserial
+#define MAX_FOLDER_DEPTH 4 // Limit folder depth TFT has a limit for the file path
+#define MAX_CMND_LEN 16 * MAX_FOLDER_DEPTH // Maximum Length for a Panel command
+#define MAX_PATH_LEN 16 * MAX_FOLDER_DEPTH // Maximum number of characters in a SD file path
+
+#define AC_HEATER_FAULT_VALIDATION_TIME 5 // number of 1/2 second loops before signalling a heater fault
+#define AC_LOWEST_MESHPOINT_VAL -7.00 // The lowest value you can set for a single mesh point offset
+
+ // TFT panel commands
+#define AC_msg_sd_card_inserted PSTR("J00")
+#define AC_msg_sd_card_removed PSTR("J01")
+#define AC_msg_no_sd_card PSTR("J02")
+#define AC_msg_usb_connected PSTR("J03")
+#define AC_msg_print_from_sd_card PSTR("J04")
+#define AC_msg_pause PSTR("J05")
+#define AC_msg_nozzle_heating PSTR("J06")
+#define AC_msg_nozzle_heating_done PSTR("J07")
+#define AC_msg_bed_heating PSTR("J08")
+#define AC_msg_bed_heating_done PSTR("J09")
+#define AC_msg_nozzle_temp_abnormal PSTR("J10")
+#define AC_msg_kill_lcd PSTR("J11")
+#define AC_msg_ready PSTR("J12")
+#define AC_msg_low_nozzle_temp PSTR("J13")
+#define AC_msg_print_complete PSTR("J14")
+#define AC_msg_filament_out_alert PSTR("J15")
+#define AC_msg_stop PSTR("J16")
+#define AC_msg_main_board_has_reset PSTR("J17")
+#define AC_msg_paused PSTR("J18")
+#define AC_msg_j19_unknown PSTR("J19")
+#define AC_msg_sd_file_open_success PSTR("J20")
+#define AC_msg_sd_file_open_failed PSTR("J21")
+#define AC_msg_level_monitor_finished PSTR("J22")
+#define AC_msg_filament_out_block PSTR("J23")
+#define AC_msg_probing_not_allowed PSTR("J24")
+#define AC_msg_probing_complete PSTR("J25")
+#define AC_msg_start_probing PSTR("J26")
+#define AC_msg_version PSTR("J27")
+
+#define MARLIN_msg_start_probing PSTR("Probing Point 1/25")
+#define MARLIN_msg_probing_failed PSTR("Probing Failed")
+#define MARLIN_msg_ready PSTR("3D Printer Ready.")
+#define MARLIN_msg_print_paused PSTR("Print Paused")
+#define MARLIN_msg_print_aborted PSTR("Print Aborted")
+#define MARLIN_msg_extruder_heating PSTR("E Heating...")
+#define MARLIN_msg_bed_heating PSTR("Bed Heating...")
+
+#define MARLIN_msg_nozzle_parked PSTR("Nozzle Parked")
+#define MARLIN_msg_heater_timeout PSTR("Heater Timeout")
+#define MARLIN_msg_reheating PSTR("Reheating...")
+#define MARLIN_msg_reheat_done PSTR("Reheat finished.")
+#define MARLIN_msg_filament_purging PSTR("Filament Purging...")
+#define MARLIN_msg_special_pause PSTR("PB")
+#define AC_cmnd_auto_unload_filament PSTR("M701") // Use Marlin unload routine
+#define AC_cmnd_auto_load_filament PSTR("M702 M0 PB") // Use Marlin load routing then pause for user to clean nozzle
+
+#define AC_cmnd_manual_load_filament PSTR("M83\nG1 E50 F700\nM82") // replace the manual panel commands with something a little faster
+#define AC_cmnd_manual_unload_filament PSTR("M83\nG1 E-50 F1200\nM82")
+#define AC_cmnd_enable_levelling PSTR("M420 S1 V1")
+#define AC_cmnd_power_loss_recovery PSTR("G28 X Y R5\nG28 Z") // Lift, home X and Y then home Z when in 'safe' position
+
+namespace Anycubic {
+ enum heater_state_t : uint8_t {
+ AC_heater_off,
+ AC_heater_temp_set,
+ AC_heater_temp_reached
+ };
+
+ enum paused_state_t : uint8_t {
+ AC_paused_heater_timed_out,
+ AC_paused_purging_filament,
+ AC_paused_idle
+ };
+
+ enum printer_state_t : uint8_t {
+ AC_printer_idle,
+ AC_printer_probing,
+ AC_printer_printing,
+ AC_printer_pausing,
+ AC_printer_paused,
+ AC_printer_stopping,
+ AC_printer_resuming_from_power_outage
+ };
+
+ enum timer_event_t : uint8_t {
+ AC_timer_started,
+ AC_timer_paused,
+ AC_timer_stopped
+ };
+
+ enum media_event_t : uint8_t {
+ AC_media_inserted,
+ AC_media_removed,
+ AC_media_error
+ };
+ enum file_menu_t : uint8_t {
+ AC_menu_file,
+ AC_menu_command,
+ AC_menu_change_to_file,
+ AC_menu_change_to_command
+ };
+}
diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp
index c69fb8351a74..efbc57e68a80 100644
--- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp
+++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp
@@ -24,16 +24,17 @@
#if ENABLED(ANYCUBIC_LCD_I3MEGA)
#include "anycubic_i3mega_lcd.h"
-
-#include "../../../../inc/MarlinConfig.h"
#include "../../ui_api.h"
-#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers
+
+#include "../../../../libs/numtostr.h"
#include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage
+#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers
+#include "../../../../inc/MarlinConfig.h"
// command sending macro's with debugging capability
#define SEND_PGM(x) send_P(PSTR(x))
#define SENDLINE_PGM(x) sendLine_P(PSTR(x))
-#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(itostr3(y)))
+#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(i16tostr3rj(y)))
#define SEND(x) send(x)
#define SENDLINE(x) sendLine(x)
#if ENABLED(ANYCUBIC_LCD_DEBUG)
@@ -44,20 +45,8 @@
#define SENDLINE_DBG_PGM_VAL(x,y,z) sendLine_P(PSTR(x))
#endif
-
AnycubicTFTClass AnycubicTFT;
-char _conv[8];
-
-char *itostr2(const uint8_t &x) {
- // sprintf(conv,"%5.1f",x);
- int xx = x;
- _conv[0] = (xx / 10) % 10 + '0';
- _conv[1] = (xx) % 10 + '0';
- _conv[2] = 0;
- return _conv;
-}
-
static void sendNewLine(void) {
LCD_SERIAL.write('\r');
LCD_SERIAL.write('\n');
@@ -82,34 +71,6 @@ static void sendLine_P(PGM_P str) {
sendNewLine();
}
-#ifndef ULTRA_LCD
- #define DIGIT(n) ('0' + (n))
- #define DIGIMOD(n, f) DIGIT((n) / (f) % 10)
- #define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ')
- #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-'))
-
- char* itostr3(const int x) {
- int xx = x;
- _conv[4] = MINUSOR(xx, RJDIGIT(xx, 100));
- _conv[5] = RJDIGIT(xx, 10);
- _conv[6] = DIGIMOD(xx, 1);
- return &_conv[4];
- }
-
-// Convert signed float to fixed-length string with 023.45 / -23.45 format
- char *ftostr32(const float &x) {
- long xx = x * 100;
- _conv[1] = MINUSOR(xx, DIGIMOD(xx, 10000));
- _conv[2] = DIGIMOD(xx, 1000);
- _conv[3] = DIGIMOD(xx, 100);
- _conv[4] = '.';
- _conv[5] = DIGIMOD(xx, 10);
- _conv[6] = DIGIMOD(xx, 1);
- return &_conv[1];
- }
-
-#endif
-
AnycubicTFTClass::AnycubicTFTClass() {}
void AnycubicTFTClass::OnSetup() {
@@ -181,7 +142,7 @@ void AnycubicTFTClass::OnKillTFT() {
void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) {
#if ENABLED(ANYCUBIC_LCD_DEBUG)
SERIAL_ECHOPGM("TFT Serial Debug: OnSDCardStateChange event triggered...");
- SERIAL_ECHO(itostr2(isInserted));
+ SERIAL_ECHO(ui8tostr2(isInserted));
SERIAL_EOL();
#endif
DoSDCardStateCheck();
@@ -535,12 +496,12 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) {
SEND_PGM("/");
SENDLINE(currentFileList.shortFilename());
SEND_PGM("/");
- SENDLINE(currentFileList.longFilename());
+ SENDLINE(currentFileList.filename());
}
else {
SENDLINE(currentFileList.shortFilename());
- SENDLINE(currentFileList.longFilename());
+ SENDLINE(currentFileList.filename());
}
}
}
@@ -622,19 +583,15 @@ void AnycubicTFTClass::GetCommandFromTFT() {
case 3: { // A3 GET HOTBED TARGET TEMP
float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED);
SEND_PGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5));
- }
- break;
+ } break;
- case 4: // A4 GET FAN SPEED
- {
+ case 4: { // A4 GET FAN SPEED
float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0);
fanPercent = constrain(fanPercent, 0, 100);
SEND_PGM_VAL("A4V ", int(fanPercent));
- }
- break;
+ } break;
- case 5: // A5 GET CURRENT COORDINATE
- {
+ case 5: { // A5 GET CURRENT COORDINATE
float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X);
float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y);
float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z);
@@ -645,39 +602,34 @@ void AnycubicTFTClass::GetCommandFromTFT() {
SEND_PGM(" Z: ");
LCD_SERIAL.print(zPostition);
SENDLINE_PGM("");
- }
- break;
+ } break;
case 6: // A6 GET SD CARD PRINTING STATUS
#if ENABLED(SDSUPPORT)
if (ExtUI::isPrintingFromMedia()) {
SEND_PGM("A6V ");
- if (ExtUI::isMediaInserted()) {
- SENDLINE(itostr3(int(ExtUI::getProgress_percent())));
- }
- else {
+ if (ExtUI::isMediaInserted())
+ SENDLINE(ui8tostr3rj(ExtUI::getProgress_percent()));
+ else
SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02");
- }
}
- else {
+ else
SENDLINE_PGM("A6V ---");
- }
#endif
break;
case 7: { // A7 GET PRINTING TIME
- uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed();
+ const uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed();
SEND_PGM("A7V ");
if (elapsedSeconds != 0) { // print time
- uint32_t elapsedMinutes = elapsedSeconds / 60;
- SEND(itostr2(elapsedMinutes / 60));
+ const uint32_t elapsedMinutes = elapsedSeconds / 60;
+ SEND(ui8tostr2(elapsedMinutes / 60));
SEND_PGM(" H ");
- SEND(itostr2(elapsedMinutes % 60));
+ SEND(ui8tostr2(elapsedMinutes % 60));
SENDLINE_PGM(" M");
}
- else {
+ else
SENDLINE_PGM(" 999:999");
- }
}
break;
@@ -692,7 +644,6 @@ void AnycubicTFTClass::GetCommandFromTFT() {
#if ENABLED(SDSUPPORT)
if (ExtUI::isPrintingFromMedia())
PausePrint();
-
#endif
break;
@@ -700,14 +651,11 @@ void AnycubicTFTClass::GetCommandFromTFT() {
#if ENABLED(SDSUPPORT)
if (ExtUI::isPrintingFromMediaPaused())
ResumePrint();
-
#endif
break;
case 11: // A11 STOP SD PRINT
- #if ENABLED(SDSUPPORT)
- StopPrint();
- #endif
+ TERN_(SDSUPPORT, StopPrint());
break;
case 12: // A12 kill
@@ -748,7 +696,6 @@ void AnycubicTFTClass::GetCommandFromTFT() {
#if ENABLED(SDSUPPORT)
if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0)
StartPrint();
-
#endif
break;
@@ -771,8 +718,7 @@ void AnycubicTFTClass::GetCommandFromTFT() {
}
break;
- case 17:// A17 set heated bed temp
- {
+ case 17: { // A17 set heated bed temp
unsigned int tempbed;
if (CodeSeen('S')) {
tempbed = constrain(CodeValue(), 0, 100);
@@ -781,19 +727,17 @@ void AnycubicTFTClass::GetCommandFromTFT() {
}
break;
- case 18:// A18 set fan speed
- {
+ case 18: { // A18 set fan speed
float fanPercent;
if (CodeSeen('S')) {
fanPercent = CodeValue();
fanPercent = constrain(fanPercent, 0, 100);
ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0);
}
- else {
+ else
fanPercent = 100;
- }
- ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0);
+ ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0);
SENDLINE_PGM("");
}
break;
@@ -807,13 +751,11 @@ void AnycubicTFTClass::GetCommandFromTFT() {
SENDLINE_PGM("");
break;
- case 20: { // A20 read printing speed
-
+ case 20: // A20 read printing speed
if (CodeSeen('S'))
feedrate_percentage = constrain(CodeValue(), 40, 999);
else
SEND_PGM_VAL("A20V ", feedrate_percentage);
- }
break;
case 21: // A21 all home
diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h
index ee011f1dfed6..a4ecf5604f9e 100644
--- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h
+++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h
@@ -23,12 +23,6 @@
#include "../../../../inc/MarlinConfigPre.h"
#include "../../../../sd/SdFatConfig.h" // for the FILENAME_LENGTH macro
-char *itostr2(const uint8_t &x);
-#ifndef ULTRA_LCD
- char *itostr3(const int);
- char *ftostr32(const float &);
-#endif
-
#define TFTBUFSIZE 4
#define TFT_MAX_CMD_SIZE 96
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp
index 6a635b9ddb94..2c466ffd0449 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp
@@ -42,7 +42,6 @@ constexpr uint32_t flash_eeprom_version = 1;
* 0 16 DATA STORAGE AREA
* 16 1 VERSIONING DATA
* 17 inf MEDIA STORAGE AREA
- *
*/
#define DATA_STORAGE_SIZE_64K
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h
index dd4be7a79387..2429e30e79f7 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h
@@ -32,7 +32,6 @@
* Selecting an LCD Display
* Version 2.1
* Issue Date: 2017-11-14
- *
*/
#define COMPUTE_REGS_FROM_DATASHEET \
constexpr uint16_t Hoffset = thfp + thb - 1; \
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp
index 9c5599ebe8ea..3dd2b88b19f7 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp
@@ -109,7 +109,6 @@ namespace FTDI {
* - Handles auto-repetition by sending onTouchHeld to the active screen periodically.
* - Plays touch feedback "click" sounds when appropriate.
* - Performs debouncing to supress spurious touch events.
- *
*/
void EventLoop::process_events() {
// If the LCD is processing commands, don't check
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h
index 450b9c4415e0..a501de20ba87 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h
@@ -49,7 +49,6 @@
* ...
* }
* }
- *
*/
class PolyReader {
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h
index bd64032729fd..cc96c8b9cda7 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h
@@ -57,8 +57,11 @@ namespace Language_en {
PROGMEM Language_Str MSG_AMAX_Y = u8"Amax Y";
PROGMEM Language_Str MSG_AMAX_Z = u8"Amax Z";
PROGMEM Language_Str MSG_AXIS_X = u8"X";
+ PROGMEM Language_Str MSG_AXIS_X2 = u8"X2";
PROGMEM Language_Str MSG_AXIS_Y = u8"Y";
+ PROGMEM Language_Str MSG_AXIS_Y2 = u8"Y2";
PROGMEM Language_Str MSG_AXIS_Z = u8"Z";
+ PROGMEM Language_Str MSG_AXIS_Z2 = u8"Z2";
PROGMEM Language_Str MSG_AXIS_E = u8"E";
PROGMEM Language_Str MSG_AXIS_E1 = u8"E1";
PROGMEM Language_Str MSG_AXIS_E2 = u8"E2";
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp
index 67b077a55323..cfb268f0b44f 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp
@@ -38,7 +38,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) {
}
#ifdef TOUCH_UI_PORTRAIT
- #if EITHER(CASE_LIGHT_ENABLE, SENSORLESS_HOMING)
+ #if EITHER(HAS_MULTI_HOTEND, SENSORLESS_HOMING)
#define GRID_ROWS 9
#else
#define GRID_ROWS 8
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp
index e89bbd20201f..136582f09aa7 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp
@@ -35,20 +35,41 @@ void StepperCurrentScreen::onRedraw(draw_mode_t what) {
w.precision(0);
w.units(GET_TEXT_F(MSG_UNITS_MILLIAMP));
w.heading( GET_TEXT_F(MSG_TMC_CURRENT));
- w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) );
- w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) );
- w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) );
- #if EXTRUDERS == 1
- w.color(e_axis).adjuster( 8, GET_TEXT_F(MSG_AXIS_E), getAxisCurrent_mA(E0) );
- #elif HAS_MULTI_EXTRUDER
- w.color(e_axis).adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), getAxisCurrent_mA(E0) );
- w.color(e_axis).adjuster(10, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1) );
- #if EXTRUDERS > 2
- w.color(e_axis).adjuster(12, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2) );
- #endif
- #if EXTRUDERS > 3
- w.color(e_axis).adjuster(14, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3) );
+ #if AXIS_IS_TMC(X)
+ w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) );
+ #endif
+ #if AXIS_IS_TMC(X2)
+ w.color(x_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_X2), getAxisCurrent_mA(X2) );
+ #endif
+ #if AXIS_IS_TMC(Y)
+ w.color(y_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) );
+ #endif
+ #if AXIS_IS_TMC(Y2)
+ w.color(x_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_Y2), getAxisCurrent_mA(Y2) );
+ #endif
+ #if AXIS_IS_TMC(Z)
+ w.color(z_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) );
+ #endif
+ #if AXIS_IS_TMC(Z2)
+ w.color(z_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_Z2), getAxisCurrent_mA(Z2) );
+ #endif
+ #if AXIS_IS_TMC(E0)
+ w.color(e_axis) .adjuster(14, GET_TEXT_F(
+ #if EXTRUDERS == 1
+ MSG_AXIS_E
+ #else
+ MSG_AXIS_E1
#endif
+ ), getAxisCurrent_mA(E0) );
+ #endif
+ #if AXIS_IS_TMC(E1)
+ w.color(e_axis).adjuster(16, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1) );
+ #endif
+ #if AXIS_IS_TMC(E2)
+ w.color(e_axis).adjuster(18, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2) );
+ #endif
+ #if AXIS_IS_TMC(E3)
+ w.color(e_axis).adjuster(20, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3) );
#endif
w.increments();
}
@@ -56,25 +77,45 @@ void StepperCurrentScreen::onRedraw(draw_mode_t what) {
bool StepperCurrentScreen::onTouchHeld(uint8_t tag) {
const float increment = getIncrement();
switch (tag) {
- case 2: UI_DECREMENT(AxisCurrent_mA, X ); break;
- case 3: UI_INCREMENT(AxisCurrent_mA, X ); break;
- case 4: UI_DECREMENT(AxisCurrent_mA, Y ); break;
- case 5: UI_INCREMENT(AxisCurrent_mA, Y ); break;
- case 6: UI_DECREMENT(AxisCurrent_mA, Z ); break;
- case 7: UI_INCREMENT(AxisCurrent_mA, Z ); break;
- case 8: UI_DECREMENT(AxisCurrent_mA, E0); break;
- case 9: UI_INCREMENT(AxisCurrent_mA, E0); break;
- #if HAS_MULTI_EXTRUDER
- case 10: UI_DECREMENT(AxisCurrent_mA, E1); break;
- case 11: UI_INCREMENT(AxisCurrent_mA, E1); break;
+ #if AXIS_IS_TMC(X)
+ case 2: UI_DECREMENT(AxisCurrent_mA, X ); break;
+ case 3: UI_INCREMENT(AxisCurrent_mA, X ); break;
+ #endif
+ #if AXIS_IS_TMC(X2)
+ case 4: UI_DECREMENT(AxisCurrent_mA, X2 ); break;
+ case 5: UI_INCREMENT(AxisCurrent_mA, X2 ); break;
+ #endif
+ #if AXIS_IS_TMC(Y)
+ case 6: UI_DECREMENT(AxisCurrent_mA, Y ); break;
+ case 7: UI_INCREMENT(AxisCurrent_mA, Y ); break;
+ #endif
+ #if AXIS_IS_TMC(Y2)
+ case 8: UI_DECREMENT(AxisCurrent_mA, Y2 ); break;
+ case 9: UI_INCREMENT(AxisCurrent_mA, Y2 ); break;
+ #endif
+ #if AXIS_IS_TMC(Z)
+ case 10: UI_DECREMENT(AxisCurrent_mA, Z ); break;
+ case 11: UI_INCREMENT(AxisCurrent_mA, Z ); break;
+ #endif
+ #if AXIS_IS_TMC(Z2)
+ case 12: UI_DECREMENT(AxisCurrent_mA, Z2 ); break;
+ case 13: UI_INCREMENT(AxisCurrent_mA, Z2 ); break;
+ #endif
+ #if AXIS_IS_TMC(E0)
+ case 14: UI_DECREMENT(AxisCurrent_mA, E0); break;
+ case 15: UI_INCREMENT(AxisCurrent_mA, E0); break;
+ #endif
+ #if AXIS_IS_TMC(E1)
+ case 16: UI_DECREMENT(AxisCurrent_mA, E1); break;
+ case 17: UI_INCREMENT(AxisCurrent_mA, E1); break;
#endif
- #if EXTRUDERS > 2
- case 12: UI_DECREMENT(AxisCurrent_mA, E2); break;
- case 13: UI_INCREMENT(AxisCurrent_mA, E2); break;
+ #if AXIS_IS_TMC(E2)
+ case 18: UI_DECREMENT(AxisCurrent_mA, E2); break;
+ case 19: UI_INCREMENT(AxisCurrent_mA, E2); break;
#endif
- #if EXTRUDERS > 3
- case 14: UI_DECREMENT(AxisCurrent_mA, E3); break;
- case 15: UI_INCREMENT(AxisCurrent_mA, E3); break;
+ #if AXIS_IS_TMC(E3)
+ case 20: UI_DECREMENT(AxisCurrent_mA, E3); break;
+ case 21: UI_INCREMENT(AxisCurrent_mA, E3); break;
#endif
default:
return false;
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h
index 09e39d8412eb..ddc9ea62714a 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h
@@ -21,10 +21,6 @@
*/
#pragma once
-#ifdef __cplusplus
- extern "C" { /* C-declarations for C++ */
-#endif
-
#include
#include
@@ -168,6 +164,10 @@
#endif // ifdef TFT35
+#ifdef __cplusplus
+ extern "C" { /* C-declarations for C++ */
+#endif
+
extern char public_buf_m[100];
extern char public_buf_l[30];
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h
index b1bd88a60d0c..5d5227c2a480 100644
--- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h
+++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h
@@ -21,7 +21,7 @@
*/
#pragma once
-#include "../../../../inc/MarlinConfigPre.h"
+#include "../../../../inc/MarlinConfig.h"
#include "../../../../libs/W25Qxx.h"
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 af292db7d599..c2ff2c436264 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
@@ -408,7 +408,7 @@ void SysTick_Callback() {
OUT_WRITE(LCD_BACKLIGHT_PIN, LOW);
LCD_Clear(0x0000);
- lcd_draw_logo();
+ TERN_(HAS_LOGO_IN_FLASH, lcd_draw_logo());
OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH);
delay(2000);
@@ -724,6 +724,7 @@ lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_
if (temp) { strcpy(temp,".GCO"); }
sd_read_base_addr = lv_open_gcode_file((char *)name_buf);
sd_read_addr_offset = sd_read_base_addr;
+ if (sd_read_addr_offset == 0) return LV_FS_RES_NOT_EX;
return LV_FS_RES_OK;
}
diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp
index 1270e3d649f7..0acfc9c025c1 100644
--- a/Marlin/src/lcd/extui/ui_api.cpp
+++ b/Marlin/src/lcd/extui/ui_api.cpp
@@ -399,12 +399,21 @@ namespace ExtUI {
#if AXIS_IS_TMC(X)
case X: return stepperX.getMilliamps();
#endif
+ #if AXIS_IS_TMC(X2)
+ case X2: return stepperX2.getMilliamps();
+ #endif
#if AXIS_IS_TMC(Y)
case Y: return stepperY.getMilliamps();
#endif
+ #if AXIS_IS_TMC(Y2)
+ case Y2: return stepperY2.getMilliamps();
+ #endif
#if AXIS_IS_TMC(Z)
case Z: return stepperZ.getMilliamps();
#endif
+ #if AXIS_IS_TMC(Z2)
+ case Z2: return stepperZ2.getMilliamps();
+ #endif
default: return NAN;
};
}
@@ -442,13 +451,22 @@ namespace ExtUI {
void setAxisCurrent_mA(const float mA, const axis_t axis) {
switch (axis) {
#if AXIS_IS_TMC(X)
- case X: stepperX.rms_current(constrain(mA, 500, 1500)); break;
+ case X: stepperX.rms_current(constrain(mA, 400, 1500)); break;
+ #endif
+ #if AXIS_IS_TMC(X2)
+ case X2: stepperX2.rms_current(constrain(mA, 400, 1500)); break;
#endif
#if AXIS_IS_TMC(Y)
- case Y: stepperY.rms_current(constrain(mA, 500, 1500)); break;
+ case Y: stepperY.rms_current(constrain(mA, 400, 1500)); break;
+ #endif
+ #if AXIS_IS_TMC(Y2)
+ case Y2: stepperY2.rms_current(constrain(mA, 400, 1500)); break;
#endif
#if AXIS_IS_TMC(Z)
- case Z: stepperZ.rms_current(constrain(mA, 500, 1500)); break;
+ case Z: stepperZ.rms_current(constrain(mA, 400, 1500)); break;
+ #endif
+ #if AXIS_IS_TMC(Z2)
+ case Z2: stepperZ2.rms_current(constrain(mA, 400, 1500)); break;
#endif
default: break;
};
@@ -457,28 +475,28 @@ namespace ExtUI {
void setAxisCurrent_mA(const float mA, const extruder_t extruder) {
switch (extruder) {
#if AXIS_IS_TMC(E0)
- case E0: stepperE0.rms_current(constrain(mA, 500, 1500)); break;
+ case E0: stepperE0.rms_current(constrain(mA, 400, 1500)); break;
#endif
#if AXIS_IS_TMC(E1)
- case E1: stepperE1.rms_current(constrain(mA, 500, 1500)); break;
+ case E1: stepperE1.rms_current(constrain(mA, 400, 1500)); break;
#endif
#if AXIS_IS_TMC(E2)
- case E2: stepperE2.rms_current(constrain(mA, 500, 1500)); break;
+ case E2: stepperE2.rms_current(constrain(mA, 400, 1500)); break;
#endif
#if AXIS_IS_TMC(E3)
- case E3: stepperE3.rms_current(constrain(mA, 500, 1500)); break;
+ case E3: stepperE3.rms_current(constrain(mA, 400, 1500)); break;
#endif
#if AXIS_IS_TMC(E4)
- case E4: stepperE4.rms_current(constrain(mA, 500, 1500)); break;
+ case E4: stepperE4.rms_current(constrain(mA, 400, 1500)); break;
#endif
#if AXIS_IS_TMC(E5)
- case E5: stepperE5.rms_current(constrain(mA, 500, 1500)); break;
+ case E5: stepperE5.rms_current(constrain(mA, 400, 1500)); break;
#endif
#if AXIS_IS_TMC(E6)
- case E6: stepperE6.rms_current(constrain(mA, 500, 1500)); break;
+ case E6: stepperE6.rms_current(constrain(mA, 400, 1500)); break;
#endif
#if AXIS_IS_TMC(E7)
- case E7: stepperE7.rms_current(constrain(mA, 500, 1500)); break;
+ case E7: stepperE7.rms_current(constrain(mA, 400, 1500)); break;
#endif
default: break;
};
diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h
index 02c4717d77f4..15122ec69e15 100644
--- a/Marlin/src/lcd/extui/ui_api.h
+++ b/Marlin/src/lcd/extui/ui_api.h
@@ -375,7 +375,6 @@ namespace ExtUI {
* constexpr float increment = 10;
*
* UI_INCREMENT(TargetTemp_celsius, E0)
- *
*/
#define UI_INCREMENT_BY(method, inc, ...) ExtUI::set ## method(ExtUI::get ## method (__VA_ARGS__) + inc, ##__VA_ARGS__)
#define UI_DECREMENT_BY(method, inc, ...) ExtUI::set ## method(ExtUI::get ## method (__VA_ARGS__) - inc, ##__VA_ARGS__)
diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/fontutils.cpp
index 8b046af9a7a2..5bf07e1bd458 100644
--- a/Marlin/src/lcd/fontutils.cpp
+++ b/Marlin/src/lcd/fontutils.cpp
@@ -9,7 +9,7 @@
#include "../inc/MarlinConfig.h"
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#include "ultralcd.h"
#include "../MarlinCore.h"
#endif
diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h
index 1cb64f985bcb..a5030fcd5636 100644
--- a/Marlin/src/lcd/language/language_an.h
+++ b/Marlin/src/lcd/language/language_an.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_1
diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h
index 8917d98e681a..dcb06e31e703 100644
--- a/Marlin/src/lcd/language/language_bg.h
+++ b/Marlin/src/lcd/language/language_bg.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_5
diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h
index 1c4a029ff7dd..0657c4a75959 100644
--- a/Marlin/src/lcd/language/language_ca.h
+++ b/Marlin/src/lcd/language/language_ca.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
namespace Language_ca {
using namespace Language_en; // Inherit undefined strings from English
diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h
index b11a3686cb46..716c0a092956 100644
--- a/Marlin/src/lcd/language/language_cz.h
+++ b/Marlin/src/lcd/language/language_cz.h
@@ -31,7 +31,6 @@
* Translated by Petr Zahradnik, Computer Laboratory
* Blog and video blog Zahradnik se bavi
* https://www.zahradniksebavi.cz
- *
*/
#define DISPLAY_CHARSET_ISO10646_CZ
diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h
index da282be0b40f..0e4fa75aa610 100644
--- a/Marlin/src/lcd/language/language_da.h
+++ b/Marlin/src/lcd/language/language_da.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_1
diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h
index 875444c0e7fe..5492cd5d5901 100644
--- a/Marlin/src/lcd/language/language_de.h
+++ b/Marlin/src/lcd/language/language_de.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
namespace Language_de {
diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h
index 8fe888765331..fea2bf58180d 100644
--- a/Marlin/src/lcd/language/language_el.h
+++ b/Marlin/src/lcd/language/language_el.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_GREEK
diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h
index ad170a348721..344618b1375e 100644
--- a/Marlin/src/lcd/language/language_el_gr.h
+++ b/Marlin/src/lcd/language/language_el_gr.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_GREEK
diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h
index 04c58fd22a1d..f377a5184cb6 100644
--- a/Marlin/src/lcd/language/language_en.h
+++ b/Marlin/src/lcd/language/language_en.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define en 1234
diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h
index 15fa35ac75f5..c77b12ee7749 100644
--- a/Marlin/src/lcd/language/language_es.h
+++ b/Marlin/src/lcd/language/language_es.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
namespace Language_es {
diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h
index bee571bbde25..7e35c6ee41ec 100644
--- a/Marlin/src/lcd/language/language_eu.h
+++ b/Marlin/src/lcd/language/language_eu.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_1
diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h
index 77424df35359..af7dd22af9f7 100644
--- a/Marlin/src/lcd/language/language_fi.h
+++ b/Marlin/src/lcd/language/language_fi.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_1
diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h
index 21f7757fa953..714feeee9976 100644
--- a/Marlin/src/lcd/language/language_fr.h
+++ b/Marlin/src/lcd/language/language_fr.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_1
diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h
index 53b0803518e5..2fd4bf69758a 100644
--- a/Marlin/src/lcd/language/language_gl.h
+++ b/Marlin/src/lcd/language/language_gl.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_1
diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h
index 4873f5c25492..1b2ae41fcedb 100644
--- a/Marlin/src/lcd/language/language_hr.h
+++ b/Marlin/src/lcd/language/language_hr.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays.
diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h
index 76aff51d9cc3..f93e5ee4e267 100644
--- a/Marlin/src/lcd/language/language_hu.h
+++ b/Marlin/src/lcd/language/language_hu.h
@@ -29,7 +29,6 @@
* A Magyar fordítást készítette: AntoszHUN
*
*
- *
*/
namespace Language_hu {
diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h
index e22e58708f51..a70463956a73 100644
--- a/Marlin/src/lcd/language/language_it.h
+++ b/Marlin/src/lcd/language/language_it.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_1
diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h
index df6ad9b5d98f..f1289123a4e7 100644
--- a/Marlin/src/lcd/language/language_jp_kana.h
+++ b/Marlin/src/lcd/language/language_jp_kana.h
@@ -27,7 +27,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
//#define DISPLAY_CHARSET_ISO10646_KANA
diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h
index 2ffcdf7b41e0..1ab03dcf57df 100644
--- a/Marlin/src/lcd/language/language_ko_KR.h
+++ b/Marlin/src/lcd/language/language_ko_KR.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
namespace Language_ko_KR {
using namespace Language_en; // Inherit undefined strings from English
diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h
index c1a1a0605b31..7b6c16b3b3ac 100644
--- a/Marlin/src/lcd/language/language_nl.h
+++ b/Marlin/src/lcd/language/language_nl.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_1
diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h
index f6a9e12c8ee5..770c872a4099 100644
--- a/Marlin/src/lcd/language/language_pl.h
+++ b/Marlin/src/lcd/language/language_pl.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_PL
diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h
index 8bd94d06e154..56426c032104 100644
--- a/Marlin/src/lcd/language/language_pt.h
+++ b/Marlin/src/lcd/language/language_pt.h
@@ -27,7 +27,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_1
diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h
index eb1e2f9bf32e..cf2f7a0ccef1 100644
--- a/Marlin/src/lcd/language/language_pt_br.h
+++ b/Marlin/src/lcd/language/language_pt_br.h
@@ -27,7 +27,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
namespace Language_pt_br {
using namespace Language_en; // Inherit undefined strings from English
diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h
index b8c146e515e8..0953bb8a71f8 100644
--- a/Marlin/src/lcd/language/language_ru.h
+++ b/Marlin/src/lcd/language/language_ru.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_5
diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h
index e936110d0768..c9dc6b1a1624 100644
--- a/Marlin/src/lcd/language/language_sk.h
+++ b/Marlin/src/lcd/language/language_sk.h
@@ -30,7 +30,6 @@
*
* Translated by Michal Holeš, Farma MaM
* https://www.facebook.com/farmamam
- *
*/
#define DISPLAY_CHARSET_ISO10646_SK
@@ -48,6 +47,7 @@ namespace Language_sk {
PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Karta vložená");
PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Karta vybraná");
PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Čakám na kartu");
+ PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Inicial. SD zlyhala");
PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Chyba čítania karty");
PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB zaria. odstrán.");
PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Chyba spúšťania USB");
@@ -123,6 +123,7 @@ namespace Language_sk {
PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastné príkazy");
PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy");
PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Bod");
+ PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda mimo hraníc");
PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchýlka");
PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX režim");
PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ofset nástrojov");
@@ -210,7 +211,7 @@ namespace Language_sk {
PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Nastavenie LED");
PROGMEM Language_Str MSG_LEDS = _UxGT("Svetlo");
- PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Prednastavené farby");
+ PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Predvolby svetla");
PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Červená");
PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Oranžová");
PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Žltá");
@@ -220,6 +221,10 @@ namespace Language_sk {
PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fialová");
PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Biela");
PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Obnoviť nastavenie");
+ PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Kanál =");
+ PROGMEM Language_Str MSG_LEDS2 = _UxGT("Svetlo #2");
+ PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Predvolby svetla #2");
+ PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Jas");
PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Vlastná farba");
PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Inten. červenej");
PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Inten. zelenej");
@@ -350,6 +355,7 @@ namespace Language_sk {
PROGMEM Language_Str MSG_PAUSING = _UxGT("Pozastavujem...");
PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pozastaviť tlač");
PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Obnoviť tlač");
+ PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Spustiť z hosta");
PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zastaviť tlač");
PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Tlačím objekt");
PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Zrušiť objekt");
@@ -450,6 +456,8 @@ namespace Language_sk {
PROGMEM Language_Str MSG_COOLING = _UxGT("Ochladzovanie...");
PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ohrev podložky...");
PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Ochladz. podložky...");
+ PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Ohrev sondy...");
+ PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Ochladz. sondy...");
PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ohrev komory...");
PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Ochladz. komory...");
PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibrácia");
@@ -544,7 +552,7 @@ namespace Language_sk {
PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Odstráňte, kliknite");
PROGMEM Language_Str MSG_MIX = _UxGT("Mix");
- PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Zložka =");
+ PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Zložka ~");
PROGMEM Language_Str MSG_MIXER = _UxGT("Mixér");
PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient");
PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Plný gradient");
@@ -571,6 +579,17 @@ namespace Language_sk {
PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Chyb. index stránky");
PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Chyb. rých. stránky");
+ PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Zmeniť heslo");
+ PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Vyžad. sa prihl.");
+ PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Nastavenie hesla");
+ PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Zvoľte číslo");
+ PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Zmeniť heslo");
+ PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Odstrániť heslo");
+ PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Heslo je ");
+ PROGMEM Language_Str MSG_START_OVER = _UxGT("Začať odznova");
+ PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Nezabudnite uložiť!");
+ PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Heslo odstránene");
+
//
// Filament Change screens show up to 3 lines on a 4-line display
// ...or up to 2 lines on a 3-line display
@@ -617,7 +636,11 @@ namespace Language_sk {
PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Vyrovnať os X");
PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto-kalibrovať");
- PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Vypršal čas ohrevu");
+ #if ENABLED(TOUCH_UI_FTDI_EVE)
+ PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Vypršal čas ohrevu, znížená teplota. Stlačte OK pre ohrev a ešte raz pre obnovu.");
+ #else
+ PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Vypršal čas ohrevu");
+ #endif
PROGMEM Language_Str MSG_REHEAT = _UxGT("Zohriať");
PROGMEM Language_Str MSG_REHEATING = _UxGT("Zohrievanie...");
}
diff --git a/Marlin/src/lcd/language/language_test.h b/Marlin/src/lcd/language/language_test.h
index b15f20619e7d..16cafbebbe2e 100644
--- a/Marlin/src/lcd/language/language_test.h
+++ b/Marlin/src/lcd/language/language_test.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
// Select ONE of the following Mappers.
diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h
index 95e4fb2a8bad..90208befe709 100644
--- a/Marlin/src/lcd/language/language_tr.h
+++ b/Marlin/src/lcd/language/language_tr.h
@@ -30,7 +30,6 @@
* Bu çeviri dosyasındaki sorunlar ve düzeltmeler için iletişim;
* Contact for issues and corrections in this translation file;
* Yücel Temel - (info@elektromanyetix.com) - https://elektromanyetix.com/
- *
*/
#define DISPLAY_CHARSET_ISO10646_TR
diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h
index 9041decbb251..54171e1ebc06 100644
--- a/Marlin/src/lcd/language/language_uk.h
+++ b/Marlin/src/lcd/language/language_uk.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
#define DISPLAY_CHARSET_ISO10646_5
diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h
index afd87d379838..fb60a5d82194 100644
--- a/Marlin/src/lcd/language/language_vi.h
+++ b/Marlin/src/lcd/language/language_vi.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
namespace Language_vi {
using namespace Language_en; // Inherit undefined strings from English
diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h
index d30ee789dd85..53dac64c0b87 100644
--- a/Marlin/src/lcd/language/language_zh_CN.h
+++ b/Marlin/src/lcd/language/language_zh_CN.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
namespace Language_zh_CN {
using namespace Language_en; // Inherit undefined strings from English
diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h
index 6764af6d73ce..7f1fce649ea9 100644
--- a/Marlin/src/lcd/language/language_zh_TW.h
+++ b/Marlin/src/lcd/language/language_zh_TW.h
@@ -26,7 +26,6 @@
*
* LCD Menu Messages
* See also https://marlinfw.org/docs/development/lcd_language.html
- *
*/
namespace Language_zh_TW {
using namespace Language_en; // Inherit undefined strings from English
diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp
index 1355dbbf2ddb..e381c590f578 100644
--- a/Marlin/src/lcd/lcdprint.cpp
+++ b/Marlin/src/lcd/lcdprint.cpp
@@ -26,7 +26,7 @@
#include "../inc/MarlinConfigPre.h"
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#include "lcdprint.h"
@@ -73,4 +73,4 @@ lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const i
return n;
}
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h
index 031d467bf947..14df5309d7d0 100644
--- a/Marlin/src/lcd/lcdprint.h
+++ b/Marlin/src/lcd/lcdprint.h
@@ -34,7 +34,7 @@
#include "../inc/MarlinConfig.h"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include "dogm/u8g_fontutf8.h"
typedef u8g_uint_t lcd_uint_t;
diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp
index 64923547e8ad..5d67410351f6 100644
--- a/Marlin/src/lcd/menu/menu.cpp
+++ b/Marlin/src/lcd/menu/menu.cpp
@@ -213,14 +213,14 @@ void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, co
clear_lcd();
// Re-initialize custom characters that may be re-used
- #if HAS_CHARACTER_LCD
+ #if HAS_MARLINUI_HD44780
if (TERN1(AUTO_BED_LEVELING_UBL, !ubl.lcd_map_control))
set_custom_characters(on_status_screen() ? CHARSET_INFO : CHARSET_MENU);
#endif
refresh(LCDVIEW_CALL_REDRAW_NEXT);
screen_changed = true;
- TERN_(HAS_GRAPHICAL_LCD, drawing_screen = false);
+ TERN_(HAS_MARLINUI_U8GLIB, drawing_screen = false);
TERN_(HAS_LCD_MENU, encoder_direction_normal());
@@ -343,8 +343,10 @@ void scroll_screen(const uint8_t limit, const bool is_menu) {
#endif // BABYSTEP_ZPROBE_OFFSET
void _lcd_draw_homing() {
- constexpr uint8_t line = (LCD_HEIGHT - 1) / 2;
- if (ui.should_draw()) MenuItem_static::draw(line, GET_TEXT(MSG_LEVEL_BED_HOMING));
+ if (ui.should_draw()) {
+ constexpr uint8_t line = (LCD_HEIGHT - 1) / 2;
+ MenuItem_static::draw(line, GET_TEXT(MSG_LEVEL_BED_HOMING));
+ }
}
#if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS))
diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h
index d69214446481..5248662823a7 100644
--- a/Marlin/src/lcd/menu/menu.h
+++ b/Marlin/src/lcd/menu/menu.h
@@ -39,7 +39,7 @@ typedef void (*selectFunc_t)();
#define SS_INVERT 0x02
#define SS_DEFAULT SS_CENTER
-#if HAS_GRAPHICAL_LCD && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY)
+#if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY)
void _lcd_zoffset_overlay_gfx(const float zvalue);
#endif
@@ -215,7 +215,7 @@ void _lcd_draw_homing();
void line_to_z(const float &z);
#endif
-#if HAS_GRAPHICAL_LCD && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY)
+#if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY)
void _lcd_zoffset_overlay_gfx(const float zvalue);
#endif
diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp
index 2953b3b46454..22947ee5149a 100644
--- a/Marlin/src/lcd/menu/menu_configuration.cpp
+++ b/Marlin/src/lcd/menu/menu_configuration.cpp
@@ -60,7 +60,9 @@ void menu_advanced_settings();
static int8_t bar_percent = 0;
if (ui.use_click()) {
ui.goto_previous_screen();
- ui.set_custom_characters(CHARSET_MENU);
+ #if HAS_MARLINUI_HD44780
+ ui.set_custom_characters(CHARSET_MENU);
+ #endif
return;
}
bar_percent += (int8_t)ui.encoderPosition;
@@ -73,7 +75,9 @@ void menu_advanced_settings();
void _progress_bar_test() {
ui.goto_screen(progress_bar_test);
- ui.set_custom_characters(CHARSET_INFO);
+ #if HAS_MARLINUI_HD44780
+ ui.set_custom_characters(CHARSET_INFO);
+ #endif
}
#endif // LCD_PROGRESS_BAR_TEST
diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp
index 5d02d674aa84..d116a6a398c0 100644
--- a/Marlin/src/lcd/menu/menu_filament.cpp
+++ b/Marlin/src/lcd/menu/menu_filament.cpp
@@ -101,9 +101,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) {
}
/**
- *
* "Change Filament" submenu
- *
*/
#if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp
index 3c0c6532f034..93ecc49d9859 100644
--- a/Marlin/src/lcd/menu/menu_media.cpp
+++ b/Marlin/src/lcd/menu/menu_media.cpp
@@ -99,7 +99,7 @@ class MenuItem_sdfolder : public MenuItem_sdbase {
encoderTopLine = 0;
ui.encoderPosition = 2 * (ENCODER_STEPS_PER_MENU_ITEM);
ui.screen_changed = true;
- TERN_(HAS_GRAPHICAL_LCD, ui.drawing_screen = false);
+ TERN_(HAS_MARLINUI_U8GLIB, ui.drawing_screen = false);
ui.refresh();
}
};
@@ -107,7 +107,7 @@ class MenuItem_sdfolder : public MenuItem_sdbase {
void menu_media() {
ui.encoder_direction_menus();
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
static uint16_t fileCnt;
if (ui.first_page) fileCnt = card.get_num_Files();
#else
diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp
index 9fea0597db5c..4e356b3e0c56 100644
--- a/Marlin/src/lcd/menu/menu_motion.cpp
+++ b/Marlin/src/lcd/menu/menu_motion.cpp
@@ -205,7 +205,7 @@ void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int
#if DISABLED(HAS_GRAPHICAL_TFT)
extern const char NUL_STR[];
SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); });
- MENU_ITEM_ADDON_START(0 + ENABLED(HAS_CHARACTER_LCD));
+ MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780));
lcd_put_u8str(tmp);
MENU_ITEM_ADDON_END();
#else
diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp
index 758d75c8e915..b84cb8cbd777 100644
--- a/Marlin/src/lcd/menu/menu_tune.cpp
+++ b/Marlin/src/lcd/menu/menu_tune.cpp
@@ -46,7 +46,7 @@
#include "../../feature/babystep.h"
#include "../lcdprint.h"
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#include "../dogm/ultralcd_DOGM.h"
#endif
@@ -68,10 +68,10 @@
const float spm = planner.steps_to_mm[axis];
MenuEditItemBase::draw_edit_screen(msg, BABYSTEP_TO_STR(spm * babystep.accum));
#if ENABLED(BABYSTEP_DISPLAY_TOTAL)
- const bool in_view = TERN1(HAS_GRAPHICAL_LCD, PAGE_CONTAINS(LCD_PIXEL_HEIGHT - MENU_FONT_HEIGHT, LCD_PIXEL_HEIGHT - 1));
+ const bool in_view = TERN1(HAS_MARLINUI_U8GLIB, PAGE_CONTAINS(LCD_PIXEL_HEIGHT - MENU_FONT_HEIGHT, LCD_PIXEL_HEIGHT - 1));
if (in_view) {
- TERN_(HAS_GRAPHICAL_LCD, ui.set_font(FONT_MENU));
- lcd_moveto(0, TERN(HAS_GRAPHICAL_LCD, LCD_PIXEL_HEIGHT - MENU_FONT_DESCENT, LCD_HEIGHT - 1));
+ TERN_(HAS_MARLINUI_U8GLIB, ui.set_font(FONT_MENU));
+ lcd_moveto(0, TERN(HAS_MARLINUI_U8GLIB, LCD_PIXEL_HEIGHT - MENU_FONT_DESCENT, LCD_HEIGHT - 1));
lcd_put_u8str_P(GET_TEXT(MSG_BABYSTEP_TOTAL));
lcd_put_wchar(':');
lcd_put_u8str(BABYSTEP_TO_STR(spm * babystep.axis_total[BS_TOTAL_IND(axis)]));
diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp
index d034de095215..2cd300958f8b 100644
--- a/Marlin/src/lcd/menu/menu_ubl.cpp
+++ b/Marlin/src/lcd/menu/menu_ubl.cpp
@@ -59,10 +59,14 @@ inline float rounded_mesh_value() {
static void _lcd_mesh_fine_tune(PGM_P const msg) {
ui.defer_status_screen();
if (ubl.encoder_diff) {
- mesh_edit_accumulator += ubl.encoder_diff > 0 ? 0.005f : -0.005f;
+ mesh_edit_accumulator += TERN(IS_TFTGLCD_PANEL,
+ ubl.encoder_diff * 0.005f / ENCODER_PULSES_PER_STEP,
+ ubl.encoder_diff > 0 ? 0.005f : -0.005f
+ );
ubl.encoder_diff = 0;
- ui.refresh(LCDVIEW_CALL_REDRAW_NEXT);
+ TERN(IS_TFTGLCD_PANEL,,ui.refresh(LCDVIEW_CALL_REDRAW_NEXT));
}
+ TERN_(IS_TFTGLCD_PANEL, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT));
if (ui.should_draw()) {
const float rounded_f = rounded_mesh_value();
diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h
index 8e380b366b97..a72a079f6ee4 100644
--- a/Marlin/src/lcd/tft/tft_color.h
+++ b/Marlin/src/lcd/tft/tft_color.h
@@ -73,104 +73,104 @@
#define COLOR_BACKGROUND 0x20AC // #1E156E
#endif
#ifndef COLOR_SELECTION_BG
- #define COLOR_SELECTION_BG 0x9930 // #992380
+ #define COLOR_SELECTION_BG 0x9930 // #992380
#endif
#ifndef COLOR_WEBSITE_URL
- #define COLOR_WEBSITE_URL 0x03B7
+ #define COLOR_WEBSITE_URL 0x03B7
#endif
#ifndef COLOR_INACTIVE
- #define COLOR_INACTIVE COLOR_GREY
+ #define COLOR_INACTIVE COLOR_GREY
#endif
#ifndef COLOR_COLD
- #define COLOR_COLD COLOR_AQUA
+ #define COLOR_COLD COLOR_AQUA
#endif
#ifndef COLOR_HOTEND
- #define COLOR_HOTEND COLOR_SCARLET
+ #define COLOR_HOTEND COLOR_SCARLET
#endif
#ifndef COLOR_HEATED_BED
- #define COLOR_HEATED_BED COLOR_DARK_ORANGE
+ #define COLOR_HEATED_BED COLOR_DARK_ORANGE
#endif
#ifndef COLOR_CHAMBER
- #define COLOR_CHAMBER COLOR_DARK_ORANGE
+ #define COLOR_CHAMBER COLOR_DARK_ORANGE
#endif
#ifndef COLOR_FAN
- #define COLOR_FAN COLOR_AQUA
+ #define COLOR_FAN COLOR_AQUA
#endif
#ifndef COLOR_AXIS_HOMED
- #define COLOR_AXIS_HOMED COLOR_WHITE
+ #define COLOR_AXIS_HOMED COLOR_WHITE
#endif
#ifndef COLOR_AXIS_NOT_HOMED
- #define COLOR_AXIS_NOT_HOMED COLOR_YELLOW
+ #define COLOR_AXIS_NOT_HOMED COLOR_YELLOW
#endif
#ifndef COLOR_RATE_100
- #define COLOR_RATE_100 COLOR_VIVID_GREEN
+ #define COLOR_RATE_100 COLOR_VIVID_GREEN
#endif
#ifndef COLOR_RATE_ALTERED
- #define COLOR_RATE_ALTERED COLOR_YELLOW
+ #define COLOR_RATE_ALTERED COLOR_YELLOW
#endif
#ifndef COLOR_PRINT_TIME
- #define COLOR_PRINT_TIME COLOR_AQUA
+ #define COLOR_PRINT_TIME COLOR_AQUA
#endif
#ifndef COLOR_PROGRESS_FRAME
- #define COLOR_PROGRESS_FRAME COLOR_WHITE
+ #define COLOR_PROGRESS_FRAME COLOR_WHITE
#endif
#ifndef COLOR_PROGRESS_BAR
- #define COLOR_PROGRESS_BAR COLOR_BLUE
+ #define COLOR_PROGRESS_BAR COLOR_BLUE
#endif
#ifndef COLOR_PROGRESS_BG
- #define COLOR_PROGRESS_BG COLOR_BLACK
+ #define COLOR_PROGRESS_BG COLOR_BLACK
#endif
#ifndef COLOR_STATUS_MESSAGE
- #define COLOR_STATUS_MESSAGE COLOR_YELLOW
+ #define COLOR_STATUS_MESSAGE COLOR_YELLOW
#endif
#ifndef COLOR_CONTROL_ENABLED
- #define COLOR_CONTROL_ENABLED COLOR_WHITE
+ #define COLOR_CONTROL_ENABLED COLOR_WHITE
#endif
#ifndef COLOR_CONTROL_DISABLED
- #define COLOR_CONTROL_DISABLED COLOR_GREY
+ #define COLOR_CONTROL_DISABLED COLOR_GREY
#endif
#ifndef COLOR_CONTROL_CANCEL
- #define COLOR_CONTROL_CANCEL COLOR_SCARLET
+ #define COLOR_CONTROL_CANCEL COLOR_SCARLET
#endif
#ifndef COLOR_CONTROL_CONFIRM
- #define COLOR_CONTROL_CONFIRM COLOR_VIVID_GREEN
+ #define COLOR_CONTROL_CONFIRM COLOR_VIVID_GREEN
#endif
#ifndef COLOR_BUSY
- #define COLOR_BUSY COLOR_SILVER
+ #define COLOR_BUSY COLOR_SILVER
#endif
#ifndef COLOR_MENU_TEXT
- #define COLOR_MENU_TEXT COLOR_YELLOW
+ #define COLOR_MENU_TEXT COLOR_YELLOW
#endif
#ifndef COLOR_MENU_VALUE
- #define COLOR_MENU_VALUE COLOR_WHITE
+ #define COLOR_MENU_VALUE COLOR_WHITE
#endif
#ifndef COLOR_SLIDER
- #define COLOR_SLIDER COLOR_WHITE
+ #define COLOR_SLIDER COLOR_WHITE
#endif
#ifndef COLOR_SLIDER_INACTIVE
- #define COLOR_SLIDER_INACTIVE COLOR_GREY
+ #define COLOR_SLIDER_INACTIVE COLOR_GREY
#endif
#ifndef COLOR_UBL
- #define COLOR_UBL COLOR_WHITE
+ #define COLOR_UBL COLOR_WHITE
#endif
#ifndef COLOR_TOUCH_CALIBRATION
- #define COLOR_TOUCH_CALIBRATION COLOR_WHITE
+ #define COLOR_TOUCH_CALIBRATION COLOR_WHITE
#endif
#ifndef COLOR_KILL_SCREEN_BG
- #define COLOR_KILL_SCREEN_BG COLOR_MAROON
+ #define COLOR_KILL_SCREEN_BG COLOR_MAROON
#endif
#ifndef COLOR_KILL_SCREEN_TEXT
- #define COLOR_KILL_SCREEN_TEXT COLOR_WHITE
+ #define COLOR_KILL_SCREEN_TEXT COLOR_WHITE
#endif
diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp
index ffc619e8dcaf..549cbc4d9ba5 100644
--- a/Marlin/src/lcd/tft/ui_480x320.cpp
+++ b/Marlin/src/lcd/tft/ui_480x320.cpp
@@ -924,7 +924,7 @@ static void do_home() {
drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING));
queue.inject_P(G28_STR);
// Disable touch until home is done
- touch.disable();
+ TERN_(HAS_TFT_XPT2046, touch.disable());
drawAxisValue(E_AXIS);
drawAxisValue(X_AXIS);
drawAxisValue(Y_AXIS);
@@ -972,14 +972,14 @@ static void drawBtn(int x, int y, const char* label, int32_t data, MarlinImage i
tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY);
}
- if (enabled) touch.add_control(BUTTON, x, y, width, height, data);
+ TERN_(HAS_TFT_XPT2046, if (enabled) touch.add_control(BUTTON, x, y, width, height, data));
}
void MarlinUI::move_axis_screen() {
// Reset
defer_status_screen(true);
motionAxisState.blocked = false;
- touch.enable();
+ TERN_(HAS_TFT_XPT2046, touch.enable());
ui.clear_lcd();
@@ -1016,13 +1016,13 @@ void MarlinUI::move_axis_screen() {
motionAxisState.eNamePos.x = x;
motionAxisState.eNamePos.y = y;
drawCurESelection();
- if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (int32_t)e_select);
+ TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (int32_t)e_select));
x += BTN_WIDTH + spacing;
drawBtn(x, y, "X-", (int32_t)x_minus, imgLeft, X_BTN_COLOR, !busy);
x += BTN_WIDTH + spacing; //imgHome is 64x64
- add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (int32_t)do_home, imgHome, !busy);
+ TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (int32_t)do_home, imgHome, !busy));
x += BTN_WIDTH + spacing;
uint16_t xplus_x = x;
@@ -1071,13 +1071,13 @@ void MarlinUI::move_axis_screen() {
motionAxisState.stepValuePos.y = y;
if (!busy) {
drawCurStepValue();
- touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (int32_t)step_size);
+ TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (int32_t)step_size));
}
// alinged with x+
drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (int32_t)disable_steppers, imgCancel, COLOR_WHITE, !busy);
- add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack);
+ TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack));
}
#undef BTN_WIDTH
diff --git a/Marlin/src/lcd/thermistornames.h b/Marlin/src/lcd/thermistornames.h
index bd0ca0e554e5..37f285d483cd 100644
--- a/Marlin/src/lcd/thermistornames.h
+++ b/Marlin/src/lcd/thermistornames.h
@@ -108,6 +108,8 @@
#define THERMISTOR_NAME "100k with 10k pull-up"
// Modified thermistors
+#elif THERMISTOR_ID == 30
+ #define THERMISTOR_NAME "Kis3d EN AW NTC100K/3950"
#elif THERMISTOR_ID == 51
#define THERMISTOR_NAME "EPCOS 1K"
#elif THERMISTOR_ID == 52
diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp
index 8eae73df1194..c97018c379c0 100644
--- a/Marlin/src/lcd/touch/touch_buttons.cpp
+++ b/Marlin/src/lcd/touch/touch_buttons.cpp
@@ -74,7 +74,7 @@ TouchButtons touch;
void TouchButtons::init() { touchIO.Init(); }
uint8_t TouchButtons::read_buttons() {
- #ifdef HAS_SPI_LCD
+ #ifdef HAS_WIRED_LCD
int16_t x, y;
if (!touchIO.getRawPoint(&x, &y)) return 0;
diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp
index fc55c3c2f6c9..de534e40236b 100644
--- a/Marlin/src/lcd/ultralcd.cpp
+++ b/Marlin/src/lcd/ultralcd.cpp
@@ -51,7 +51,7 @@ MarlinUI ui;
constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(STATUS_MESSAGE_SCROLLING)
uint8_t MarlinUI::status_scroll_offset; // = 0
constexpr uint8_t MAX_MESSAGE_LENGTH = _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH));
@@ -62,7 +62,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
constexpr uint8_t MAX_MESSAGE_LENGTH = 63;
#endif
-#if EITHER(HAS_SPI_LCD, EXTENSIBLE_UI)
+#if EITHER(HAS_WIRED_LCD, EXTENSIBLE_UI)
uint8_t MarlinUI::alert_level; // = 0
char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1];
#endif
@@ -114,9 +114,9 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
}
#endif
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#include "dogm/ultralcd_DOGM.h"
#endif
@@ -167,7 +167,7 @@ uint8_t MarlinUI::lcd_status_update_delay = 1; // First update one loop delayed
millis_t MarlinUI::next_button_update_ms; // = 0
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
bool MarlinUI::drawing_screen, MarlinUI::first_page; // = false
#endif
@@ -372,7 +372,7 @@ void MarlinUI::init() {
#endif // HAS_SHIFT_ENCODER
- #if HAS_ENCODER_ACTION && HAS_SLOW_BUTTONS
+ #if BOTH(HAS_ENCODER_ACTION, HAS_SLOW_BUTTONS)
slow_buttons = 0;
#endif
@@ -506,7 +506,7 @@ bool MarlinUI::get_blink() {
* This is very display-dependent, so the lcd implementation draws this.
*/
-#if ENABLED(LCD_PROGRESS_BAR)
+#if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL
millis_t MarlinUI::progress_bar_ms; // = 0
#if PROGRESS_MSG_EXPIRE > 0
millis_t MarlinUI::expire_status_ms; // = 0
@@ -517,7 +517,7 @@ void MarlinUI::status_screen() {
TERN_(HAS_LCD_MENU, ENCODER_RATE_MULTIPLY(false));
- #if ENABLED(LCD_PROGRESS_BAR)
+ #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL
//
// HD44780 implements the following message blinking and
@@ -873,7 +873,7 @@ void MarlinUI::update() {
#endif // HAS_LCD_MENU
- if (ELAPSED(ms, next_lcd_update_ms) || TERN0(HAS_GRAPHICAL_LCD, drawing_screen)) {
+ if (ELAPSED(ms, next_lcd_update_ms) || TERN0(HAS_MARLINUI_U8GLIB, drawing_screen)) {
next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL;
@@ -915,7 +915,7 @@ void MarlinUI::update() {
const bool encoderPastThreshold = (abs_diff >= epps);
if (encoderPastThreshold || lcd_clicked) {
- if (encoderPastThreshold) {
+ if (encoderPastThreshold && TERN1(IS_TFTGLCD_PANEL, !external_control)) {
#if BOTH(HAS_LCD_MENU, ENCODER_RATE_MULTIPLIER)
@@ -971,7 +971,7 @@ void MarlinUI::update() {
// This runs every ~100ms when idling often enough.
// Instead of tracking changes just redraw the Status Screen once per second.
if (on_status_screen() && !lcd_status_update_delay--) {
- lcd_status_update_delay = TERN(HAS_GRAPHICAL_LCD, 12, 9);
+ lcd_status_update_delay = TERN(HAS_MARLINUI_U8GLIB, 12, 9);
if (max_display_update_time) max_display_update_time--; // Be sure never go to a very big number
refresh(LCDVIEW_REDRAW_NOW);
}
@@ -1010,7 +1010,7 @@ void MarlinUI::update() {
TERN_(HAS_ADC_BUTTONS, keypad_buttons = 0);
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#if ENABLED(LIGHTWEIGHT_UI)
const bool in_status = on_status_screen(),
@@ -1260,6 +1260,12 @@ void MarlinUI::update() {
TERN(REPRAPWORLD_KEYPAD, keypad_buttons, buttons) = ~val;
#endif
+ #if IS_TFTGLCD_PANEL
+ next_button_update_ms = now + (LCD_UPDATE_INTERVAL / 2);
+ buttons = slow_buttons;
+ TERN_(AUTO_BED_LEVELING_UBL, external_encoder());
+ #endif
+
} // next_button_update_ms
#if HAS_ENCODER_WHEEL
@@ -1294,7 +1300,7 @@ void MarlinUI::update() {
#endif // HAS_ENCODER_ACTION
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#if HAS_DISPLAY
@@ -1331,7 +1337,7 @@ void MarlinUI::update() {
const millis_t ms = millis();
#endif
- #if ENABLED(LCD_PROGRESS_BAR)
+ #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL
progress_bar_ms = ms;
#if PROGRESS_MSG_EXPIRE > 0
expire_status_ms = persist ? 0 : ms + PROGRESS_MSG_EXPIRE;
@@ -1342,7 +1348,7 @@ void MarlinUI::update() {
next_filament_display = ms + 5000UL; // Show status message for 5s
#endif
- #if BOTH(HAS_SPI_LCD, STATUS_MESSAGE_SCROLLING)
+ #if BOTH(HAS_WIRED_LCD, STATUS_MESSAGE_SCROLLING)
status_scroll_offset = 0;
#endif
@@ -1501,7 +1507,7 @@ void MarlinUI::update() {
set_status_P(print_paused);
#if ENABLED(PARK_HEAD_ON_PAUSE)
- TERN_(HAS_SPI_LCD, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); // Show message immediately to let user know about pause in progress
+ TERN_(HAS_WIRED_LCD, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); // Show message immediately to let user know about pause in progress
queue.inject_P(PSTR("M25 P\nM24"));
#elif ENABLED(SDSUPPORT)
queue.inject_P(PSTR("M25"));
@@ -1610,11 +1616,11 @@ void MarlinUI::update() {
refresh();
- #if HAS_SPI_LCD || defined(LED_BACKLIGHT_TIMEOUT)
+ #if HAS_WIRED_LCD || defined(LED_BACKLIGHT_TIMEOUT)
const millis_t ms = millis();
#endif
- TERN_(HAS_SPI_LCD, next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL); // Delay LCD update for SD activity
+ TERN_(HAS_WIRED_LCD, next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL); // Delay LCD update for SD activity
#ifdef LED_BACKLIGHT_TIMEOUT
leds.reset_timeout(ms);
diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h
index 59e7cbe7d1ce..c7ef41596df5 100644
--- a/Marlin/src/lcd/ultralcd.h
+++ b/Marlin/src/lcd/ultralcd.h
@@ -34,18 +34,18 @@
#if EITHER(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY)
#define HAS_ENCODER_ACTION 1
#endif
-#if (!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || BUTTONS_EXIST(EN1, EN2)
+#if ((!HAS_ADC_BUTTONS && ENABLED(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 && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_SPI_LCD && DISABLED(NEWPANEL)))
+#if !HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_WIRED_LCD && DISABLED(NEWPANEL)))
#define HAS_SHIFT_ENCODER 1
#endif
// I2C buttons must be read in the main thread
-#if EITHER(LCD_I2C_VIKI, LCD_I2C_PANELOLU2)
+#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL)
#define HAS_SLOW_BUTTONS 1
#endif
@@ -53,7 +53,7 @@
#define MULTI_MANUAL 1
#endif
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#include "../MarlinCore.h"
@@ -104,7 +104,7 @@
#endif // HAS_LCD_MENU
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
// REPRAPWORLD_KEYPAD (and ADC_KEYPAD)
#if ENABLED(REPRAPWORLD_KEYPAD)
@@ -215,7 +215,7 @@
#endif
-#if BUTTON_EXISTS(BACK) || HAS_TOUCH_XPT2046
+#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_XPT2046, IS_TFTGLCD_PANEL)
#define BLEN_D 3
#define EN_D _BV(BLEN_D)
#define LCD_BACK_CLICKED() (buttons & EN_D)
@@ -231,7 +231,7 @@
#endif
#endif
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
enum MarlinFont : uint8_t {
FONT_STATUSMENU = 1,
FONT_EDIT,
@@ -316,11 +316,11 @@ class MarlinUI {
static void refresh();
#else
FORCE_INLINE static void refresh() {
- TERN_(HAS_SPI_LCD, refresh(LCDVIEW_CLEAR_CALL_REDRAW));
+ TERN_(HAS_WIRED_LCD, refresh(LCDVIEW_CLEAR_CALL_REDRAW));
}
#endif
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
static bool detected();
static void init_lcd();
#else
@@ -381,7 +381,7 @@ class MarlinUI {
static void pause_print();
static void resume_print();
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
static millis_t next_button_update_ms;
@@ -403,7 +403,7 @@ class MarlinUI {
static void show_bootscreen();
#endif
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
static void set_font(const MarlinFont font_nr);
@@ -458,7 +458,7 @@ class MarlinUI {
#endif
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
static bool drawing_screen, first_page;
#else
static constexpr bool drawing_screen = false, first_page = true;
@@ -577,7 +577,7 @@ class MarlinUI {
static void draw_select_screen_prompt(PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr);
- #elif HAS_SPI_LCD
+ #elif HAS_WIRED_LCD
static constexpr bool lcd_clicked = false;
static constexpr bool on_status_screen() { return true; }
@@ -692,7 +692,7 @@ class MarlinUI {
static void finish_status(const bool persist);
#endif
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0
static bool defer_return_to_status;
#else
diff --git a/Marlin/src/libs/buzzer.h b/Marlin/src/libs/buzzer.h
index 022d94deafea..e901660c87d1 100644
--- a/Marlin/src/libs/buzzer.h
+++ b/Marlin/src/libs/buzzer.h
@@ -84,9 +84,9 @@
public:
/**
- * @brief Class constructor
+ * @brief Init Buzzer
*/
- Buzzer() {
+ static inline void init() {
SET_OUTPUT(BEEPER_PIN);
reset();
}
diff --git a/Marlin/src/libs/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp
index ef6ef9e90d80..c7593c049fc4 100644
--- a/Marlin/src/libs/least_squares_fit.cpp
+++ b/Marlin/src/libs/least_squares_fit.cpp
@@ -29,7 +29,6 @@
* it saves roughly 10K of program memory. It also does not require all of
* coordinates to be present during the calculations. Each point can be
* probed and then discarded.
- *
*/
#include "../inc/MarlinConfig.h"
diff --git a/Marlin/src/libs/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h
index 5cd6a02514c5..44ca8afc76d8 100644
--- a/Marlin/src/libs/least_squares_fit.h
+++ b/Marlin/src/libs/least_squares_fit.h
@@ -30,7 +30,6 @@
* it saves roughly 10K of program memory. And even better... the data
* fed into the algorithm does not need to all be present at the same time.
* A point can be probed and its values fed into the algorithm and then discarded.
- *
*/
#include "../inc/MarlinConfig.h"
diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp
index 3b36c180e838..c3efb2b25a84 100644
--- a/Marlin/src/libs/numtostr.cpp
+++ b/Marlin/src/libs/numtostr.cpp
@@ -52,6 +52,13 @@ const char* ui8tostr3rj(const uint8_t i) {
return &conv[4];
}
+// Convert uint8_t to string with 12 format
+const char* ui8tostr2(const uint8_t i) {
+ conv[5] = DIGIMOD(i, 10);
+ conv[6] = DIGIMOD(i, 1);
+ return &conv[5];
+}
+
// Convert signed 8bit int to rj string with 123 or -12 format
const char* i8tostr3rj(const int8_t x) {
int xx = x;
diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h
index e52a7d9889ce..e7c1e67e12d5 100644
--- a/Marlin/src/libs/numtostr.h
+++ b/Marlin/src/libs/numtostr.h
@@ -26,6 +26,9 @@
// Convert a full-range unsigned 8bit int to a percentage
const char* ui8tostr4pctrj(const uint8_t i);
+// Convert uint8_t to string with 12 format
+const char* ui8tostr2(const uint8_t x);
+
// Convert uint8_t to string with 123 format
const char* ui8tostr3rj(const uint8_t i);
diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp
index a3a89736e5aa..712182a0ea40 100644
--- a/Marlin/src/module/endstops.cpp
+++ b/Marlin/src/module/endstops.cpp
@@ -351,7 +351,7 @@ void Endstops::event_handler() {
if (hit_state == prev_hit_state) return;
prev_hit_state = hit_state;
if (hit_state) {
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
char chrX = ' ', chrY = ' ', chrZ = ' ', chrP = ' ';
#define _SET_STOP_CHAR(A,C) (chr## A = C)
#else
@@ -382,7 +382,7 @@ void Endstops::event_handler() {
#endif
SERIAL_EOL();
- TERN_(HAS_SPI_LCD, ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP));
+ TERN_(HAS_WIRED_LCD, ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP));
#if BOTH(SD_ABORT_ON_ENDSTOP_HIT, SDSUPPORT)
if (planner.abort_on_endstop_hit) {
diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp
index 30e1ffb0cafb..4ad7c4ccf044 100644
--- a/Marlin/src/module/planner.cpp
+++ b/Marlin/src/module/planner.cpp
@@ -234,7 +234,7 @@ float Planner::previous_nominal_speed_sqr;
xyze_pos_t Planner::position_cart;
#endif
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
volatile uint32_t Planner::block_buffer_runtime_us = 0;
#endif
@@ -339,7 +339,6 @@ void Planner::init() {
* const uint32_t r = _BV(24) - x * d; // Estimate remainder
* if (r >= d) x++; // Check whether to adjust result
* return uint32_t(x); // x holds the proper estimation
- *
*/
static uint32_t get_period_inverse(uint32_t d) {
@@ -747,7 +746,7 @@ block_t* Planner::get_current_block() {
if (TEST(block->flag, BLOCK_BIT_RECALCULATE)) return nullptr;
// We can't be sure how long an active block will take, so don't count it.
- TERN_(HAS_SPI_LCD, block_buffer_runtime_us -= block->segment_time_us);
+ TERN_(HAS_WIRED_LCD, block_buffer_runtime_us -= block->segment_time_us);
// As this block is busy, advance the nonbusy block pointer
block_buffer_nonbusy = next_block_index(block_buffer_tail);
@@ -761,7 +760,7 @@ block_t* Planner::get_current_block() {
}
// The queue became empty
- TERN_(HAS_SPI_LCD, clear_block_buffer_runtime()); // paranoia. Buffer is empty now - so reset accumulated time to zero.
+ TERN_(HAS_WIRED_LCD, clear_block_buffer_runtime()); // paranoia. Buffer is empty now - so reset accumulated time to zero.
return nullptr;
}
@@ -1578,7 +1577,7 @@ void Planner::quick_stop() {
// forced to empty, there's no risk the ISR will touch this.
delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE;
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
// Clear the accumulated runtime
clear_block_buffer_runtime();
#endif
@@ -2081,7 +2080,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
const uint8_t moves_queued = nonbusy_movesplanned();
// Slow down when the buffer starts to empty, rather than wait at the corner for a buffer refill
- #if EITHER(SLOWDOWN, HAS_SPI_LCD) || defined(XY_FREQUENCY_LIMIT)
+ #if EITHER(SLOWDOWN, HAS_WIRED_LCD) || defined(XY_FREQUENCY_LIMIT)
// Segment time im micro seconds
int32_t segment_time_us = LROUND(1000000.0f / inverse_secs);
#endif
@@ -2096,14 +2095,14 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
// Buffer is draining so add extra time. The amount of time added increases if the buffer is still emptied more.
const int32_t nst = segment_time_us + LROUND(2 * time_diff / moves_queued);
inverse_secs = 1000000.0f / nst;
- #if defined(XY_FREQUENCY_LIMIT) || HAS_SPI_LCD
+ #if defined(XY_FREQUENCY_LIMIT) || HAS_WIRED_LCD
segment_time_us = nst;
#endif
}
}
#endif
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
// Protect the access to the position.
const bool was_enabled = stepper.suspend();
@@ -2243,7 +2242,6 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
#define MAX_E_JERK(N) TERN(HAS_LINEAR_E_JERK, max_e_jerk[E_INDEX_N(N)], max_jerk.e)
/**
- *
* Use LIN_ADVANCE for blocks if all these are true:
*
* esteps : This is a print move, because we checked for A, B, C steps before.
@@ -3029,7 +3027,7 @@ void Planner::set_max_jerk(const AxisEnum axis, float targetValue) {
#endif
}
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
uint16_t Planner::block_buffer_runtime() {
#ifdef __AVR__
diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h
index 660d9ad5aa1e..c4e11490b161 100644
--- a/Marlin/src/module/planner.h
+++ b/Marlin/src/module/planner.h
@@ -218,7 +218,7 @@ typedef struct block_t {
uint8_t valve_pressure, e_to_p_pressure;
#endif
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
uint32_t segment_time_us;
#endif
@@ -438,7 +438,7 @@ class Planner {
static uint8_t g_uc_extruder_last_move[EXTRUDERS];
#endif
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
volatile static uint32_t block_buffer_runtime_us; // Theoretical block buffer runtime in µs
#endif
@@ -871,7 +871,7 @@ class Planner {
block_buffer_tail = next_block_index(block_buffer_tail);
}
- #if HAS_SPI_LCD
+ #if HAS_WIRED_LCD
static uint16_t block_buffer_runtime();
static void clear_block_buffer_runtime();
#endif
diff --git a/Marlin/src/module/planner_bezier.cpp b/Marlin/src/module/planner_bezier.cpp
index 4025b773ed5c..02d878d5f51a 100644
--- a/Marlin/src/module/planner_bezier.cpp
+++ b/Marlin/src/module/planner_bezier.cpp
@@ -24,7 +24,6 @@
* planner_bezier.cpp
*
* Compute and buffer movement commands for bezier curves
- *
*/
#include "../inc/MarlinConfig.h"
diff --git a/Marlin/src/module/planner_bezier.h b/Marlin/src/module/planner_bezier.h
index 41a88b4058fd..72048c42739a 100644
--- a/Marlin/src/module/planner_bezier.h
+++ b/Marlin/src/module/planner_bezier.h
@@ -25,7 +25,6 @@
* planner_bezier.h
*
* Compute and buffer movement commands for Bézier curves
- *
*/
#include "../core/types.h"
diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp
index 12b617ec439e..defc22b1fe8e 100644
--- a/Marlin/src/module/probe.cpp
+++ b/Marlin/src/module/probe.cpp
@@ -270,7 +270,13 @@ FORCE_INLINE void probe_specific_action(const bool deploy) {
#if ENABLED(PAUSE_BEFORE_DEPLOY_STOW)
do {
#if ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED)
- if (deploy == (READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_INVERTING)) break;
+ if (deploy == (
+ #if HAS_CUSTOM_PROBE_PIN
+ READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_INVERTING
+ #else
+ READ(Z_MIN_PIN) == Z_MIN_ENDSTOP_INVERTING
+ #endif
+ )) break;
#endif
BUZZ(100, 659);
@@ -723,7 +729,6 @@ float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise
* when starting up the machine or rebooting the board.
* There's no way to know where the nozzle is positioned until
* homing has been done - no homing with z-probe without init!
- *
*/
STOW_Z_SERVO();
}
diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp
index 0fc23099ccb8..3ccd8ffd9185 100644
--- a/Marlin/src/module/settings.cpp
+++ b/Marlin/src/module/settings.cpp
@@ -33,7 +33,6 @@
* ALSO: Variables in the Store and Retrieve sections must be in the same order.
* If a feature is disabled, some data must still be written that, when read,
* either sets a Sane Default, or results in No Change to the existing value.
- *
*/
// Change EEPROM version if the structure changes
diff --git a/Marlin/src/module/thermistor/thermistor_30.h b/Marlin/src/module/thermistor/thermistor_30.h
new file mode 100644
index 000000000000..bc1781b1351c
--- /dev/null
+++ b/Marlin/src/module/thermistor/thermistor_30.h
@@ -0,0 +1,66 @@
+/**
+ * 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
+
+// R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up
+// Resistance 100k Ohms at 25deg. C
+// Resistance Tolerance + / -1%
+// B Value 3950K at 25/50 deg. C
+// B Value Tolerance + / - 1%
+// Kis3d Silicone Heater 24V 200W/300W with 6mm Precision cast plate (EN AW 5083)
+// Temperature setting time 10 min to determine the 12Bit ADC value on the surface. (le3tspeak)
+const temp_entry_t temptable_30[] PROGMEM = {
+ { OV( 1), 938 },
+ { OV( 298), 125 }, // 1193 - 125°
+ { OV( 321), 121 }, // 1285 - 121°
+ { OV( 348), 117 }, // 1392 - 117°
+ { OV( 387), 113 }, // 1550 - 113°
+ { OV( 411), 110 }, // 1644 - 110°
+ { OV( 445), 106 }, // 1780 - 106°
+ { OV( 480), 101 }, // 1920 - 101°
+ { OV( 516), 97 }, // 2064 - 97°
+ { OV( 553), 92 }, // 2212 - 92°
+ { OV( 591), 88 }, // 2364 - 88°
+ { OV( 628), 84 }, // 2512 - 84°
+ { OV( 665), 79 }, // 2660 - 79°
+ { OV( 702), 75 }, // 2808 - 75°
+ { OV( 736), 71 }, // 2945 - 71°
+ { OV( 770), 67 }, // 3080 - 67°
+ { OV( 801), 63 }, // 3204 - 63°
+ { OV( 830), 59 }, // 3320 - 59°
+ { OV( 857), 55 }, // 3428 - 55°
+ { OV( 881), 51 }, // 3524 - 51°
+ { OV( 902), 47 }, // 3611 - 47°
+ { OV( 922), 42 }, // 3688 - 42°
+ { OV( 938), 38 }, // 3754 - 38°
+ { OV( 952), 34 }, // 3811 - 34°
+ { OV( 964), 29 }, // 3857 - 29°
+ { OV( 975), 25 }, // 3900 - 25°
+ { OV( 980), 23 }, // 3920 - 23°
+ { OV( 991), 17 }, // 3964 - 17°
+ { OV(1001), 9 }, // Calculated
+ { OV(1004), 5 }, // Calculated
+ { OV(1008), 0 }, // Calculated
+ { OV(1012), -5 }, // Calculated
+ { OV(1016), -10 }, // Calculated
+ { OV(1020), -15 } // Calculated
+};
diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h
index 56921c6d186e..0b0419c52034 100644
--- a/Marlin/src/module/thermistor/thermistors.h
+++ b/Marlin/src/module/thermistor/thermistors.h
@@ -120,6 +120,9 @@ typedef struct { int16_t value, celsius; } temp_entry_t;
#if ANY_THERMISTOR_IS(23) // By AluOne #12622. Formerly 22 above. May need calibration/checking.
#include "thermistor_23.h"
#endif
+#if ANY_THERMISTOR_IS(30) // Kis3d Silicone mat 24V 200W/300W with 6mm Precision cast plate (EN AW 5083)
+ #include "thermistor_30.h"
+#endif
#if ANY_THERMISTOR_IS(51) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 1 kOhm, "EPCOS"
#include "thermistor_51.h"
#endif
diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h
index 459d00e3e7e2..95f761f26ad9 100644
--- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h
+++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h
@@ -124,7 +124,7 @@
// LCDs and Controllers //
//////////////////////////
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#define LCD_PINS_RS 13
#define LCD_PINS_ENABLE 17
@@ -152,7 +152,7 @@
#define BTN_EN2 12
#define BTN_ENC 14
-#endif // HAS_GRAPHICAL_LCD
+#endif // HAS_MARLINUI_U8GLIB
// Hardware serial pins
// Add the following to Configuration.h or Configuration_adv.h to assign
diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h
index 2b7909221ec9..002d2ebd9c62 100644
--- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h
+++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h
@@ -389,7 +389,7 @@
// LCDs and Controllers //
//////////////////////////
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
//
// LCD Display output pins
@@ -632,4 +632,4 @@
#endif
#endif // NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h
index 13e30b961c1e..df182049f994 100644
--- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h
+++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h
@@ -27,7 +27,6 @@
* Applies to the following boards:
*
* BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed)
- *
*/
#if NOT_TARGET(MCU_LPC1768)
@@ -126,7 +125,7 @@
* for the onboard SD card, and a chip select signal is not provided for the remote
* SD card.
*/
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN P1_31 // EXP1-1
@@ -139,7 +138,7 @@
#define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3
#define LCD_PINS_D4 P0_15 // (SCK) EXP1-5
- #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) && HAS_CHARACTER_LCD
+ #if BOTH(HAS_MARLINUI_HD44780, REPRAP_DISCOUNT_SMART_CONTROLLER)
#error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU B300 v1.0"
#endif
@@ -147,7 +146,7 @@
#error "SDSUPPORT is not supported by the BIQU B300 v1.0 when an LCD controller is used"
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
/**
* SD Card Reader
diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h
index ed5fd530e04a..bcff04eb85e8 100644
--- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h
+++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h
@@ -27,7 +27,6 @@
* Applies to the following boards:
*
* BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed)
- *
*/
#if NOT_TARGET(MCU_LPC1768)
@@ -97,7 +96,7 @@
* for the onboard SD card, and a chip select signal is not provided for the remote
* SD card.
*/
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN P1_31 // EXP1-1
@@ -110,7 +109,7 @@
#define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3
#define LCD_PINS_D4 P0_15 // (SCK) EXP1-5
- #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) && HAS_CHARACTER_LCD
+ #if BOTH(HAS_MARLINUI_HD44780, REPRAP_DISCOUNT_SMART_CONTROLLER)
#error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU BQ111-A4"
#endif
@@ -118,7 +117,7 @@
#error "SDSUPPORT is not supported by the BIQU BQ111-A4 when an LCD controller is used"
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
/**
* SD Card Reader
diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h
index d5e256066259..0701e45992eb 100644
--- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h
+++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h
@@ -65,7 +65,16 @@
* by redrawing the screen after SD card accesses.
*/
-#if HAS_SPI_LCD
+#if IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS P3_26
+ #endif
+
+ #define SD_DETECT_PIN P1_31
+
+#elif HAS_WIRED_LCD
+
#define BTN_EN1 P3_26
#define BTN_EN2 P3_25
#define BTN_ENC P2_11
@@ -80,7 +89,8 @@
#define DOGLCD_CS P2_06
#define DOGLCD_A0 P0_16
#endif
-#endif
+
+#endif // HAS_WIRED_LCD
//
// SD Support
@@ -89,7 +99,7 @@
// requires jumpers on the SKR V1.1 board as documented here:
// https://www.facebook.com/groups/505736576548648/permalink/630639874058317/
#ifndef SDCARD_CONNECTION
- #if EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY)
+ #if ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY, IS_TFTGLCD_PANEL)
#define SDCARD_CONNECTION LCD
#else
#define SDCARD_CONNECTION ONBOARD
diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h
index a38be0bef765..31373fedff66 100644
--- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h
+++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h
@@ -214,7 +214,7 @@
#define EXPA2_09_PIN P0_15
#define EXPA2_10_PIN P0_17
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(ANET_FULL_GRAPHICS_LCD)
@@ -265,6 +265,14 @@
#error "ADC BUTTONS do not work unmodifed on SKR 1.3, The ADC ports cannot take more than 3.3v."
+ #elif IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS EXPA2_08_PIN
+ #endif
+
+ #define SD_DETECT_PIN EXPA2_04_PIN
+
#else // !CR10_STOCKDISPLAY
#define LCD_PINS_RS EXPA1_07_PIN
@@ -350,7 +358,7 @@
#endif // !CR10_STOCKDISPLAY
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// SD Support
diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h
index fb383ff5fff5..6f9f4bcf6363 100644
--- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h
+++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h
@@ -232,7 +232,7 @@
* ----- -----
* EXP2 EXP1
*/
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(ANET_FULL_GRAPHICS_LCD)
#define LCD_PINS_RS P1_23
@@ -309,6 +309,14 @@
#define XPT2046_Y_OFFSET -285
#endif
+ #elif IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS P3_26
+ #endif
+
+ #define SD_DETECT_PIN P1_31
+
#else
#define BTN_ENC P0_28 // (58) open-drain
@@ -371,9 +379,9 @@
#endif // !FYSETC_MINI_12864
- #endif // HAS_GRAPHICAL_LCD
+ #endif // HAS_MARLINUI_U8GLIB
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#if HAS_ADC_BUTTONS
#error "ADC BUTTONS do not work unmodifed on SKR 1.4, The ADC ports cannot take more than 3.3v."
diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h
index 9fade582e978..fd902afda42f 100644
--- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h
+++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h
@@ -92,7 +92,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN P1_30 // (37) not 5V tolerant
#endif
diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h
index 7d0745aa2d1a..196503c822c5 100644
--- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h
+++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h
@@ -217,7 +217,18 @@
* that the garbage/lines are erased immediately after the SD card accesses are completed.
*/
-#if HAS_SPI_LCD
+#if IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS P3_25 // EXP2.3
+ #endif
+
+ #if SD_CONNECTION_IS(LCD)
+ #define SD_DETECT_PIN P0_28 // EXP2.4
+ #endif
+
+#elif HAS_WIRED_LCD
+
#define BEEPER_PIN P1_31 // EXP1.1
#define BTN_ENC P1_30 // EXP1.2
#define BTN_EN1 P3_26 // EXP2.5
@@ -273,7 +284,7 @@
//#define LCD_SCREEN_ROT_270
#endif
-#endif
+#endif // HAS_WIRED_LCD
/**
* Example for trinamic drivers using the J8 connector on MKs Sbase.
@@ -361,7 +372,6 @@
* P1_31 - not 5V tolerant - EXP1
* P0_27 - open collector - EXP2
* P0_28 - open collector - EXP2
- *
*/
/**
@@ -376,5 +386,4 @@
* P0_03 - AUX1
* P0_29 - Port -1
* P0_30 - USB
- *
*/
diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h
index c57c987a7560..d269ecbdc90d 100644
--- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h
+++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h
@@ -235,7 +235,8 @@
* ----- -----
* EXP1 EXP2
*/
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
+
#define BEEPER_PIN P1_31
#define BTN_ENC P1_30
@@ -248,6 +249,15 @@
#define LCD_PINS_ENABLE P1_22
#define LCD_PINS_D4 P0_17
+ #elif IS_TFTGLCD_PANEL
+
+ #undef BEEPER_PIN
+ #undef BTN_ENC
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS P3_25
+ #endif
+
#else
#define BTN_EN1 P3_25
@@ -321,7 +331,7 @@
#endif // !CR10_STOCKDISPLAY
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#ifndef SDCARD_CONNECTION
#define SDCARD_CONNECTION ONBOARD
diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h
index 7b87c95f84a8..c602af1c3028 100644
--- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h
+++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h
@@ -31,7 +31,6 @@
* RAMPS_14_EFF (Hotend, Fan0, Fan1)
* RAMPS_14_EEF (Hotend0, Hotend1, Fan)
* RAMPS_14_SF (Spindle, Controller Fan)
- *
*/
// Numbers in parentheses () are the corresponding mega2560 pin numbers
@@ -326,7 +325,16 @@
#define LCD_PINS_ENABLE P0_18 // J3-10 & AUX-3 (SID, MOSI)
#define LCD_PINS_D4 P2_06 // J3-8 & AUX-3 (SCK, CLK)
-#elif HAS_SPI_LCD
+#elif IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS P3_26 // (31) J3-2 & AUX-4
+ #endif
+
+ #define SD_DETECT_PIN P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant)
+ #define KILL_PIN P1_22 // (41) J5-4 & AUX-4
+
+#elif HAS_WIRED_LCD
//#define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3
//#define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3
@@ -370,8 +378,9 @@
#define DOGLCD_SCK SCK_PIN
#define DOGLCD_MOSI MOSI_PIN
- #define STAT_LED_BLUE_PIN P0_26 //(63) may change if cable changes
+ #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes
#define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes
+
#else
#if ENABLED(FYSETC_MINI_12864)
@@ -420,9 +429,9 @@
//#define LCD_SCREEN_ROT_90
//#define LCD_SCREEN_ROT_180
//#define LCD_SCREEN_ROT_270
- #endif
+ #endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// Ethernet pins
diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h
index d798e3873584..6331d6aa7c0a 100644
--- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h
+++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h
@@ -109,7 +109,7 @@
//
// Display
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(CR10_STOCKDISPLAY)
@@ -185,7 +185,7 @@
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// SD Support
diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h
index de987f95d2e4..76c54c3bba21 100644
--- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h
+++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h
@@ -16,7 +16,7 @@
* 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 .
+ * along with this program. If not, see .
*
*/
#pragma once
@@ -193,7 +193,7 @@
#define EXPA1_09_PIN P0_16
#define EXPA1_10_PIN P2_08
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(CR10_STOCKDISPLAY)
@@ -238,7 +238,7 @@
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// SD Support
diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h
index 0314c5049f82..d66ffbe4e5d3 100644
--- a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h
+++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h
@@ -141,7 +141,7 @@
// connector are shared with the onboard SD card, and Marlin does not support reading
// G-code files from the onboard SD card.
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN P0_27 // EXP2-7 - open drain
@@ -160,7 +160,7 @@
#error "SDSUPPORT is not currently supported by the Cohesion3D boards"
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// Ethernet pins
diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h
index 9dc870a35396..66604ef6359f 100644
--- a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h
+++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h
@@ -206,7 +206,7 @@
#define NEOPIXEL_PIN P1_16 // EXP1-6 => Ethernet pin 6 (top row, 3 from left)
#endif
-#elif HAS_SPI_LCD
+#elif HAS_WIRED_LCD
#define BEEPER_PIN P1_31 // EXP1-1
//#define SD_DETECT_PIN P0_27 // EXP2-7
@@ -222,7 +222,7 @@
#define KILL_PIN P2_11 // EXP2-10
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// SD Support
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h
index 19c2d5032050..d67549997be5 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h
@@ -26,7 +26,6 @@
*
* The pins diagram can be found and the following URL:
* https://github.com/makerbase-mks/MKS-SGen/blob/master/Hardware/MKS%20SGEN%20V1.0_001/MKS%20SGEN%20V1.0_001%20PIN.pdf
- *
*/
#if NOT_TARGET(MCU_LPC1769)
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
index 3df10a41d769..cbbe8a9416d4 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -241,11 +241,21 @@
* ----- -----
* EXP1 EXP2
*/
-#if HAS_SPI_LCD
+#if IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS P3_25
+ #endif
+
+ #define SD_DETECT_PIN P0_27
+
+#elif HAS_WIRED_LCD
+
#define BEEPER_PIN P1_31
#define BTN_ENC P1_30
#if ENABLED(CR10_STOCKDISPLAY)
+
#define LCD_PINS_RS P1_00
#define BTN_EN1 P0_18
@@ -327,7 +337,7 @@
#endif // !CR10_STOCKDISPLAY
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#ifndef SDCARD_CONNECTION
#define SDCARD_CONNECTION ONBOARD
diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h
index 696270b417ae..f2811b14abdc 100644
--- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h
+++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h
@@ -109,18 +109,35 @@
#define STAT_LED_RED_PIN P1_19
#define STAT_LED_BLUE_PIN P1_20
-#elif HAS_SPI_LCD
-
- /*
- The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either
- a custom cable with breakouts to the pins indicated below or the RRD GLCD Adapter board
- found at http://smoothieware.org/rrdglcdadapter
-
- Other links to information about setting up a display panel with Smoothieboard
- http://chibidibidiwah.wdfiles.com/local--files/panel/smoothieboard2sd.jpg
- http://smoothieware.org/panel
- */
-
+#elif HAS_WIRED_LCD
+
+ /**
+ * SD Support
+ *
+ * For the RRD GLCD it CANNOT share the same SPI as the LCD so it must be
+ * hooked up to the onboard SDCard SPI and use a spare pin for the SDCS.
+ * Also note that an external SDCard sharing the SPI port with the
+ * onboard/internal SDCard must be ejected before rebooting as the bootloader
+ * does not like the external card. NOTE Smoothie will not boot if the external
+ * sdcard is inserted in the RRD LCD sdcard slot at boot time, it must be
+ * inserted after it has booted.
+ */
+ #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET)
+
+ #define MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO)
+ #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK)
+ #define SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS)
+ #define MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI)
+
+ /**
+ * The Smoothieboard supports the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER with either
+ * a custom cable with breakouts to the pins indicated below or the RRD GLCD Adapter board
+ * found at http://smoothieware.org/rrdglcdadapter
+ *
+ * Other links to information about setting up a display panel with Smoothieboard
+ * http://chibidibidiwah.wdfiles.com/local--files/panel/smoothieboard2sd.jpg
+ * http://smoothieware.org/panel
+ */
#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
// EXP1 Pins
#define BEEPER_PIN P1_31 // EXP1 Pin 1
@@ -132,24 +149,14 @@
#define BTN_EN2 P3_26 // EXP2 Pin 3
#define BTN_EN1 P3_25 // EXP2 Pin 5
- /*
- SD Support
-
- For the RRD GLCD it CANNOT share the same SPI as the LCD so it must be
- hooked up to the onboard SDCard SPI and use a spare pin for the SDCS.
- Also note that an external SDCard sharing the SPI port with the
- onboard/internal SDCard must be ejected before rebooting as the bootloader
- does not like the external card. NOTE Smoothie will not boot if the external
- sdcard is inserted in the RRD LCD sdcard slot at boot time, it must be
- inserted after it has booted.
- */
-
- #define MISO_PIN P0_08 // EXP2 Pin 1 (PB3, SD_MISO)
- #define SCK_PIN P0_07 // EXP2 Pin 2 (SD_SCK)
- #define SS_PIN P0_28 // EXP2 Pin 4 (SD_CSEL, SD_CS)
- #define MOSI_PIN P0_09 // EXP2 Pin 6 (PB2, SD_MOSI)
+ #elif IS_TFTGLCD_PANEL
+
#define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET)
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS P3_26 // EXP2 Pin 3
+ #endif
+
#else
#error "Marlin's Smoothieboard support cannot drive your LCD."
#endif
diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h
index 75c899fe01d1..a0174f260298 100644
--- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h
+++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h
@@ -166,7 +166,6 @@
*
* A remote SD card is currently not supported because the pins routed to the EXP2
* connector are shared with the onboard SD card.
- *
*/
#if ENABLED(CR10_STOCKDISPLAY)
@@ -178,6 +177,6 @@
#define LCD_PINS_ENABLE P0_18
#define LCD_PINS_D4 P0_15
#define KILL_PIN P2_11
-#elif HAS_SPI_LCD
+#elif HAS_WIRED_LCD
#error "Only the CR10_STOCKDISPLAY is supported with TH3D EZBoard."
#endif
diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h
index 2fb112f5afca..2fe9a43ba136 100644
--- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h
+++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h
@@ -105,7 +105,7 @@
#define SUICIDE_PIN 54 // Must be enabled at startup to keep power flowing
#define KILL_PIN -1
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN 18
@@ -148,4 +148,4 @@
#endif // !NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
index d21cd22e53bd..e30a65b90e1b 100644
--- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
+++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
@@ -123,7 +123,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN 18
@@ -170,4 +170,4 @@
#endif // !NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h
index 3dc9c9a6bed3..be5f461dda38 100644
--- a/Marlin/src/pins/mega/pins_INTAMSYS40.h
+++ b/Marlin/src/pins/mega/pins_INTAMSYS40.h
@@ -122,7 +122,7 @@
#define BEEPER_PIN 18
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define LCD_PINS_RS 20
#define LCD_PINS_ENABLE 30
#define LCD_PINS_D4 14
@@ -137,7 +137,6 @@
///////////////////// SPARE HEADERS //////////////
/**
- *
* J25
* 1 D54
* 2 D55
diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h
index 9005ac2acfa1..ff7cf1571465 100644
--- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h
+++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h
@@ -130,7 +130,7 @@
//
#define BEEPER_PIN 64
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define LCD_PINS_RS 14
#define LCD_PINS_ENABLE 15
@@ -152,4 +152,4 @@
#define SHIFT_EN 17
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h
index 74a45eac017f..963911ec5d70 100644
--- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h
+++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h
@@ -212,7 +212,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
@@ -260,7 +260,7 @@
#define BTN_CENTER 15 // J0
#define BTN_ENC BTN_CENTER
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// SD Card
diff --git a/Marlin/src/pins/mega/pins_MINITRONICS.h b/Marlin/src/pins/mega/pins_MINITRONICS.h
index 9cb4401da90c..bbe746461eca 100644
--- a/Marlin/src/pins/mega/pins_MINITRONICS.h
+++ b/Marlin/src/pins/mega/pins_MINITRONICS.h
@@ -29,7 +29,6 @@
* Rev B 2 JAN 2017
*
* Added pin definitions for M3, M4 & M5 spindle control commands
- *
*/
#if NOT_TARGET(__AVR_ATmega1281__)
diff --git a/Marlin/src/pins/mega/pins_OVERLORD.h b/Marlin/src/pins/mega/pins_OVERLORD.h
index 9589fa585189..045c1bc0fa6c 100644
--- a/Marlin/src/pins/mega/pins_OVERLORD.h
+++ b/Marlin/src/pins/mega/pins_OVERLORD.h
@@ -119,7 +119,7 @@
//
// LCD / Controller
//
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
// OVERLORD OLED pins
#define LCD_PINS_RS 20
#define LCD_PINS_D5 21
diff --git a/Marlin/src/pins/mega/pins_PICA.h b/Marlin/src/pins/mega/pins_PICA.h
index acaeefe17861..ff4d3e834d05 100644
--- a/Marlin/src/pins/mega/pins_PICA.h
+++ b/Marlin/src/pins/mega/pins_PICA.h
@@ -137,7 +137,7 @@
//
#define BEEPER_PIN 29
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define LCD_PINS_RS 33
#define LCD_PINS_ENABLE 30
#define LCD_PINS_D4 35
diff --git a/Marlin/src/pins/mega/pins_SILVER_GATE.h b/Marlin/src/pins/mega/pins_SILVER_GATE.h
index e339b0472ac4..41cbe5e0e078 100644
--- a/Marlin/src/pins/mega/pins_SILVER_GATE.h
+++ b/Marlin/src/pins/mega/pins_SILVER_GATE.h
@@ -72,7 +72,7 @@
#define HEATER_BED_PIN 8
#define TEMP_BED_PIN 6
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#if ENABLED(U8GLIB_ST7920) // SPI GLCD 12864 ST7920
#define LCD_PINS_RS 30
#define LCD_PINS_ENABLE 20
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index 0ccdadadde4c..3ec4e1a34b9b 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -1227,7 +1227,7 @@
#define LCD_PINS_D4 -1
#endif
-#if HAS_CHARACTER_LCD || TOUCH_UI_ULTIPANEL
+#if HAS_MARLINUI_HD44780 || TOUCH_UI_ULTIPANEL
#ifndef LCD_PINS_D5
#define LCD_PINS_D5 -1
#endif
@@ -1597,7 +1597,7 @@
#define Z4_MS3_PIN -1
#endif
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#if !defined(ST7920_DELAY_1) && defined(BOARD_ST7920_DELAY_1)
#define ST7920_DELAY_1 BOARD_ST7920_DELAY_1
#endif
diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h
index 06a8144291ca..5f153cfa2b0f 100644
--- a/Marlin/src/pins/pinsDebug.h
+++ b/Marlin/src/pins/pinsDebug.h
@@ -31,7 +31,6 @@
*
* Both passes use the same pin list. The list contains two macro names. The
* actual macro definitions are changed depending on which pass is being done.
- *
*/
// first pass - put the name strings into FLASH
diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h
index ac15a3c9bae2..704f2a487fb1 100644
--- a/Marlin/src/pins/pinsDebug_list.h
+++ b/Marlin/src/pins/pinsDebug_list.h
@@ -261,6 +261,9 @@
#if defined(TMC_SW_SCK) && TMC_SW_SCK >= 0
REPORT_NAME_DIGITAL(__LINE__, TMC_SW_SCK)
#endif
+#if defined(TFTGLCD_CS) && TFTGLCD_CS >= 0
+ REPORT_NAME_DIGITAL(__LINE__, TFTGLCD_CS)
+#endif
#if PIN_EXISTS(E_MUX0)
REPORT_NAME_DIGITAL(__LINE__, E_MUX0_PIN)
#endif
diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h
index 21e43bb3618b..2ea15c97d332 100644
--- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h
+++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h
@@ -160,7 +160,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD || TOUCH_UI_ULTIPANEL
+#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL
#define KILL_PIN 32
@@ -188,4 +188,4 @@
#define SD_DETECT_PIN 15
#endif // ULTIPANEL || TOUCH_UI_ULTIPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h
index 39ba3ddf04c5..4a1bf70b6eaa 100644
--- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h
+++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h
@@ -166,7 +166,7 @@
//
// LCD / Controller
//
-#if ANY(HAS_SPI_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE)
+#if ANY(HAS_WIRED_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE)
#define KILL_PIN 32
@@ -196,4 +196,4 @@
#endif // ULTIPANEL || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE
-#endif // HAS_SPI_LCD || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE
+#endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE
diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h
index c41a6ac17966..6314bc07b8c0 100644
--- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h
+++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h
@@ -141,7 +141,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD || TOUCH_UI_ULTIPANEL
+#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL
#if !MB(MINIRAMBO_10A)
#define KILL_PIN 32
@@ -189,4 +189,4 @@
#endif // ULTIPANEL || TOUCH_UI_ULTIPANEL
-#endif // HAS_SPI_LCD || TOUCH_UI_ULTIPANEL
+#endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL
diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h
index 2109eb615b2e..735852b2ff79 100644
--- a/Marlin/src/pins/rambo/pins_RAMBO.h
+++ b/Marlin/src/pins/rambo/pins_RAMBO.h
@@ -183,7 +183,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD || TOUCH_UI_ULTIPANEL
+#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL
#define KILL_PIN 80
@@ -249,4 +249,4 @@
#endif // !NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/ramps/pins_3DRAG.h b/Marlin/src/pins/ramps/pins_3DRAG.h
index 1989a1657fdb..f0057e1fc980 100644
--- a/Marlin/src/pins/ramps/pins_3DRAG.h
+++ b/Marlin/src/pins/ramps/pins_3DRAG.h
@@ -106,7 +106,7 @@
#define BEEPER_PIN 33
-#endif // HAS_SPI_LCD && NEWPANEL
+#endif // ULTRA_LCD && NEWPANEL
/**
* M3/M4/M5 - Spindle/Laser Control
diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h
index 3fa738e32215..87d24890c99c 100644
--- a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h
+++ b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h
@@ -87,7 +87,7 @@
//
// LCDs and Controllers
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(ZONESTAR_LCD)
#define LCD_PINS_RS 2
#define LCD_PINS_ENABLE 36
diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h
index 362ff7ae438a..75a219c177de 100644
--- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h
+++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h
@@ -197,7 +197,7 @@
#define LCD_PINS_D7 29
#endif
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(200)
#endif
diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h
index 3f7575497cb3..3fa3cc9e8c9c 100644
--- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h
+++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h
@@ -261,7 +261,7 @@
#define NEOPIXEL_PIN 25
#endif
- #elif HAS_GRAPHICAL_LCD
+ #elif HAS_MARLINUI_U8GLIB
#define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 17
diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h
index f526b9b2269f..7e8c245a4158 100644
--- a/Marlin/src/pins/ramps/pins_K8800.h
+++ b/Marlin/src/pins/ramps/pins_K8800.h
@@ -95,7 +95,7 @@
//
#define BEEPER_PIN 6
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define LCD_SDSS 53
@@ -119,4 +119,4 @@
#define BTN_ENC 23
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h
index b2d394e61d2c..de56d2b59d9b 100644
--- a/Marlin/src/pins/ramps/pins_RAMPS.h
+++ b/Marlin/src/pins/ramps/pins_RAMPS.h
@@ -430,7 +430,7 @@
// LCDs and Controllers //
//////////////////////////
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
//
// LCD Display output pins
@@ -450,6 +450,10 @@
#define LCD_PINS_D6 44
#define LCD_PINS_D7 64
+ #elif ENABLED(TFTGLCD_PANEL_SPI)
+
+ #define TFTGLCD_CS 33
+
#else
#if ENABLED(CR10_STOCKDISPLAY)
@@ -682,6 +686,10 @@
// Pins only defined for RAMPS_SMART currently
+ #elif IS_TFTGLCD_PANEL
+
+ #define SD_DETECT_PIN 49
+
#else
// Beeper on AUX-4
@@ -706,7 +714,7 @@
#endif
#endif // NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#if ENABLED(REPRAPWORLD_KEYPAD) && DISABLED(ADC_KEYPAD)
#define SHIFT_OUT 40
diff --git a/Marlin/src/pins/ramps/pins_RAMPS_13.h b/Marlin/src/pins/ramps/pins_RAMPS_13.h
index 032dd79c234d..6e7c8cbab592 100644
--- a/Marlin/src/pins/ramps/pins_RAMPS_13.h
+++ b/Marlin/src/pins/ramps/pins_RAMPS_13.h
@@ -31,7 +31,6 @@
* RAMPS_13_EFF (Extruder, Fan, Fan)
* RAMPS_13_EEF (Extruder, Extruder, Fan)
* RAMPS_13_SF (Spindle, Controller Fan)
- *
*/
#ifndef BOARD_INFO_NAME
diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h
index 19209f1e2363..9908d9494f34 100644
--- a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h
+++ b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h
@@ -35,7 +35,6 @@
* RAMPS_PLUS_EFF (Extruder, Fan, Fan)
* RAMPS_PLUS_EEF (Extruder, Extruder, Fan)
* RAMPS_PLUS_SF (Spindle, Controller Fan)
- *
*/
#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__)
diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h
index 412aa2290223..1c2cb609579e 100644
--- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h
+++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h
@@ -128,7 +128,7 @@
// AnyCubic made the following changes to 1.1.0-RC8
// If these are appropriate for your LCD let us know.
//
-#if 0 && HAS_SPI_LCD
+#if 0 && HAS_WIRED_LCD
// LCD Display output pins
#if BOTH(NEWPANEL, PANEL_ONE)
@@ -154,4 +154,4 @@
#define DOGLCD_A0 42
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h
index 33b2a60d641e..1568288e69bc 100644
--- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h
+++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h
@@ -271,7 +271,7 @@
// LCDs and Controllers //
//////////////////////////
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
//
// LCD Display output pins
diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h
index 2dfde42bac69..597a37bdbc8b 100644
--- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h
+++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h
@@ -119,7 +119,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN 18
@@ -158,7 +158,7 @@
#endif // !NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// M3/M4/M5 - Spindle/Laser Control
diff --git a/Marlin/src/pins/sam/pins_ADSK.h b/Marlin/src/pins/sam/pins_ADSK.h
index c4d7c079407c..b0e171cf1716 100644
--- a/Marlin/src/pins/sam/pins_ADSK.h
+++ b/Marlin/src/pins/sam/pins_ADSK.h
@@ -204,5 +204,4 @@ A stepper for E0 extruder
*
* Standard ethernet pairs: 1&2, 3&6, 4&5, 7&8
* Use CAT7 cable to have all pairs shielded
- *
*/
diff --git a/Marlin/src/pins/sam/pins_ARCHIM1.h b/Marlin/src/pins/sam/pins_ARCHIM1.h
index 8c54cad3b6b8..6e3768c663bc 100644
--- a/Marlin/src/pins/sam/pins_ARCHIM1.h
+++ b/Marlin/src/pins/sam/pins_ARCHIM1.h
@@ -181,7 +181,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN 23 // D24 PA15_CTS1
#define LCD_PINS_RS 17 // D17 PA12_RXD1
#define LCD_PINS_ENABLE 24 // D23 PA14_RTS1
@@ -198,4 +198,4 @@
#define BTN_EN2 13 // D13 PB27_TIOB0
#define BTN_ENC 16 // D16 PA13_TXD1
#endif // NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h
index 3223ac7a0ef4..5a3fe0e4d5c7 100644
--- a/Marlin/src/pins/sam/pins_ARCHIM2.h
+++ b/Marlin/src/pins/sam/pins_ARCHIM2.h
@@ -237,7 +237,7 @@
//
// LCD / Controller
//
-#if ANY(HAS_SPI_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE)
+#if ANY(HAS_WIRED_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE)
#define BEEPER_PIN 23 // D24 PA15_CTS1
#define LCD_PINS_RS 17 // D17 PA12_RXD1
#define LCD_PINS_ENABLE 24 // D23 PA14_RTS1
diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h
index b7c01f843ae3..cd4033aa6f1f 100644
--- a/Marlin/src/pins/sam/pins_DUE3DOM.h
+++ b/Marlin/src/pins/sam/pins_DUE3DOM.h
@@ -113,7 +113,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define LCD_PINS_RS 42
#define LCD_PINS_ENABLE 43
@@ -168,4 +168,4 @@
#define BEEPER_PIN -1
#endif // SPARK_FULL_GRAPHICS
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h
index 7f559f11903f..5f9ad48a08c4 100644
--- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h
+++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h
@@ -105,7 +105,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define LCD_PINS_RS 42
#define LCD_PINS_ENABLE 43
@@ -171,4 +171,4 @@
#define DOGLCD_CS 45
#endif // SPARK_FULL_GRAPHICS
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h
index 2cfbecc08646..22edb7021302 100644
--- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h
+++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h
@@ -170,5 +170,4 @@
* None of these are in the arduino_due_x variant so digitalWrite and digitalRead can't be used on them.
*
* They can be accessed via FASTIO functions WRITE, READ, OUT_WRITE, OUTPUT, ...
- *
*/
diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h
index c82c7e9c5399..60fe3512378e 100644
--- a/Marlin/src/pins/sam/pins_RADDS.h
+++ b/Marlin/src/pins/sam/pins_RADDS.h
@@ -226,7 +226,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(RADDS_DISPLAY)
@@ -287,7 +287,7 @@
#endif // SPARK_FULL_GRAPHICS
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#ifndef SDSS
#define SDSS 4
diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h
index 94f1b50776a9..bfc3968ffac2 100644
--- a/Marlin/src/pins/sam/pins_RAMPS_DUO.h
+++ b/Marlin/src/pins/sam/pins_RAMPS_DUO.h
@@ -76,7 +76,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if BOTH(NEWPANEL, PANEL_ONE)
#undef LCD_PINS_D4
@@ -129,4 +129,4 @@
#endif // NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h
index 5662590e269f..ee525eefaa56 100644
--- a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h
+++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h
@@ -139,7 +139,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
// ramps-fd lcd adaptor
#define BEEPER_PIN 37
@@ -203,7 +203,7 @@
#define DOGLCD_MISO 74 // MISO_PIN
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#if HAS_TMC_UART
/**
diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h
index 524c14d198f8..b9e61fb27c53 100644
--- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h
+++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h
@@ -200,7 +200,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
#define BEEPER_PIN 62
@@ -271,4 +271,4 @@
#define BTN_ENC 40
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h
index 187473b3dd43..dc0c1279954b 100644
--- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h
+++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h
@@ -186,7 +186,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER)
#define BEEPER_PIN 62
@@ -253,4 +253,4 @@
#define BTN_ENC 40
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h
index 388ac1a3312e..6076be07e9d4 100644
--- a/Marlin/src/pins/samd/pins_RAMPS_144.h
+++ b/Marlin/src/pins/samd/pins_RAMPS_144.h
@@ -287,7 +287,7 @@
// LCDs and Controllers //
//////////////////////////
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
//
// LCD Display output pins
@@ -594,7 +594,7 @@
#endif
#endif // NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// SD Support
diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h
index 3978198eef86..74692a21a390 100644
--- a/Marlin/src/pins/sanguino/pins_ANET_10.h
+++ b/Marlin/src/pins/sanguino/pins_ANET_10.h
@@ -30,7 +30,6 @@
*
* 1) no longer uses Sanguino files to define some of the pins
* 2) added pointers to useable Arduino IDE extensions
- *
*/
/**
@@ -48,7 +47,6 @@
* "Anet V1.0 (Optiboot)" frees up another 3K of FLASH. You'll need to burn
* a new bootloader to the board to be able to automatically download a
* compiled image.
- *
*/
/**
@@ -66,7 +64,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
/**
@@ -152,7 +149,7 @@
* REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
*/
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define LCD_SDSS 28
#if ENABLED(ADC_KEYPAD)
#define SERVO0_PIN 27 // free for BLTouch/3D-Touch
diff --git a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h
index e927aac124db..29905c108954 100644
--- a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h
+++ b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h
@@ -29,7 +29,6 @@
* Rev B 26 DEC 2016
*
* added pointer to a current Arduino IDE extension
- *
*/
/**
@@ -47,7 +46,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
#if NOT_TARGET(__AVR_ATmega644P__)
diff --git a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h
index 1961446e2274..33fc233f7ab1 100644
--- a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h
+++ b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h
@@ -29,7 +29,6 @@
* Rev B 26 DEC 2016
*
* added pointer to a current Arduino IDE extension
- *
*/
/**
@@ -47,7 +46,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the SANGUINO board and then select the CPU.
- *
*/
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__)
diff --git a/Marlin/src/pins/sanguino/pins_GEN6.h b/Marlin/src/pins/sanguino/pins_GEN6.h
index 98eb616892e6..bfca8e90d9cc 100644
--- a/Marlin/src/pins/sanguino/pins_GEN6.h
+++ b/Marlin/src/pins/sanguino/pins_GEN6.h
@@ -31,7 +31,6 @@
* 1) added pointer to a current Arduino IDE extension
* 2) added support for M3, M4 & M5 spindle control commands
* 3) added case light pin definition
- *
*/
/**
@@ -49,7 +48,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__)
diff --git a/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h b/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h
index a40c2ec15fde..9c635706202c 100644
--- a/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h
+++ b/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h
@@ -29,7 +29,6 @@
* Rev B 26 DEC 2016
*
* added pointer to a current Arduino IDE extension
- *
*/
/**
@@ -47,7 +46,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the SANGUINO board and then select the CPU.
- *
*/
diff --git a/Marlin/src/pins/sanguino/pins_GEN7_12.h b/Marlin/src/pins/sanguino/pins_GEN7_12.h
index ed550624f789..9db7d7214a5b 100644
--- a/Marlin/src/pins/sanguino/pins_GEN7_12.h
+++ b/Marlin/src/pins/sanguino/pins_GEN7_12.h
@@ -31,7 +31,6 @@
* 1) added pointer to a current Arduino IDE extension
* 2) added support for M3, M4 & M5 spindle control commands
* 3) added case light pin definition
- *
*/
/**
@@ -49,7 +48,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__)
diff --git a/Marlin/src/pins/sanguino/pins_GEN7_13.h b/Marlin/src/pins/sanguino/pins_GEN7_13.h
index 6743c8cf75fc..55881aaff58e 100644
--- a/Marlin/src/pins/sanguino/pins_GEN7_13.h
+++ b/Marlin/src/pins/sanguino/pins_GEN7_13.h
@@ -29,7 +29,6 @@
* Rev B 26 DEC 2016
*
* added pointer to a current Arduino IDE extension
- *
*/
/**
@@ -47,7 +46,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
#define BOARD_INFO_NAME "Gen7 v1.3"
diff --git a/Marlin/src/pins/sanguino/pins_GEN7_14.h b/Marlin/src/pins/sanguino/pins_GEN7_14.h
index 752fe3074f07..66dba533e988 100644
--- a/Marlin/src/pins/sanguino/pins_GEN7_14.h
+++ b/Marlin/src/pins/sanguino/pins_GEN7_14.h
@@ -31,7 +31,6 @@
* 1) added pointer to a current Arduino IDE extension
* 2) added support for M3, M4 & M5 spindle control commands
* 3) added case light pin definition
- *
*/
/**
@@ -49,7 +48,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__)
diff --git a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h
index 1a19c33deac4..0c4871fb27d5 100644
--- a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h
+++ b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h
@@ -34,7 +34,6 @@
* 1) added pointer to a current Arduino IDE extension
* 2) added support for M3, M4 & M5 spindle control commands
* 3) added case light pin definition
- *
*/
/**
@@ -52,7 +51,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__)
diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h
index 4817ce804349..9f406c1f7856 100644
--- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h
+++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h
@@ -36,7 +36,7 @@
#define BOARD_INFO_NAME "Melzi (Creality)"
// Alter timing for graphical display
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(125)
#endif
diff --git a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h
index 8128fb86e664..5014620c6b81 100644
--- a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h
+++ b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h
@@ -28,7 +28,7 @@
#define BOARD_INFO_NAME "Melzi (Malyan)"
// Alter timing for graphical display
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(125)
#endif
diff --git a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h
index 9e433f19c424..f87894103771 100644
--- a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h
+++ b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h
@@ -27,7 +27,7 @@
#define BOARD_INFO_NAME "Melzi (Tronxy)"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(0)
#endif
diff --git a/Marlin/src/pins/sanguino/pins_MELZI_V2.h b/Marlin/src/pins/sanguino/pins_MELZI_V2.h
index 1cdf51117fed..275498d55813 100644
--- a/Marlin/src/pins/sanguino/pins_MELZI_V2.h
+++ b/Marlin/src/pins/sanguino/pins_MELZI_V2.h
@@ -24,7 +24,7 @@
#define BOARD_INFO_NAME "Melzi V2"
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(0)
#endif
diff --git a/Marlin/src/pins/sanguino/pins_OMCA.h b/Marlin/src/pins/sanguino/pins_OMCA.h
index d9f43995d481..7f18283d1c54 100644
--- a/Marlin/src/pins/sanguino/pins_OMCA.h
+++ b/Marlin/src/pins/sanguino/pins_OMCA.h
@@ -56,7 +56,6 @@
* Rev B 26 DEC 2016
*
* added pointer to a current Arduino IDE extension
- *
*/
/**
@@ -74,7 +73,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__)
diff --git a/Marlin/src/pins/sanguino/pins_OMCA_A.h b/Marlin/src/pins/sanguino/pins_OMCA_A.h
index 1b4c9b68b215..770732051900 100644
--- a/Marlin/src/pins/sanguino/pins_OMCA_A.h
+++ b/Marlin/src/pins/sanguino/pins_OMCA_A.h
@@ -48,14 +48,12 @@
* PWM (D 13) PD5 19| |22 PC0 (D 16) SCL
* PWM (D 14) PD6 20| |21 PD7 (D 15) PWM
* +--------+
- *
*/
/**
* Rev B 26 DEC 2016
*
* added pointer to a current Arduino IDE extension
- *
*/
/**
@@ -73,7 +71,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
#if NOT_TARGET(__AVR_ATmega644__)
diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h
index 4b4fb1d70ed7..438d49d615c8 100644
--- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h
+++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h
@@ -31,7 +31,6 @@
* 1) added pointer to a current Arduino IDE extension
* 2) added support for M3, M4 & M5 spindle control commands
* 3) added case light pin definition
- *
*/
/**
@@ -49,7 +48,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__)
@@ -154,11 +152,11 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define SD_DETECT_PIN -1
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#if ENABLED(LCD_FOR_MELZI)
@@ -290,7 +288,7 @@
#define BTN_EN2 10
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// M3/M4/M5 - Spindle/Laser Control
diff --git a/Marlin/src/pins/sanguino/pins_SETHI.h b/Marlin/src/pins/sanguino/pins_SETHI.h
index e0a0604619ce..dc2133e441dc 100644
--- a/Marlin/src/pins/sanguino/pins_SETHI.h
+++ b/Marlin/src/pins/sanguino/pins_SETHI.h
@@ -47,7 +47,6 @@
* Just use the above JSON URL instead of Sparkfun's JSON.
*
* Once installed select the Sanguino board and then select the CPU.
- *
*/
#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__)
diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h
index a3cb987fff0b..63b97b666faf 100644
--- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h
+++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h
@@ -171,7 +171,7 @@
* EXP1
*/
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(CR10_STOCKDISPLAY)
@@ -225,7 +225,7 @@
#error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and MKS_LCD12864 are currently supported on the BIGTREE_SKR_E3_DIP."
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050)
@@ -257,7 +257,6 @@
* EXP1-8 ----------- EXP1-3
* SPI1-1 ----------- EXP1-1
* EXP1-10 ----------- EXP1-7
- *
*/
#define CLCD_SPI_BUS 1 // SPI1 connector
@@ -279,9 +278,7 @@
#if SD_CONNECTION_IS(ONBOARD)
#define SD_DETECT_PIN PC4
-#endif
-
-#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) && SD_CONNECTION_IS(LCD)
+#elif SD_CONNECTION_IS(LCD) && BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050)
#define SD_DETECT_PIN PA15
#define SS_PIN PA10
#elif SD_CONNECTION_IS(CUSTOM_CABLE)
diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h
index 4f03d3bbd717..50257f4f4608 100644
--- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h
+++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h
@@ -129,7 +129,7 @@
#define EXP1_3 PB7
#endif
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(CR10_STOCKDISPLAY)
@@ -169,11 +169,50 @@
#define FORCE_SOFT_SPI
#define LCD_BACKLIGHT_PIN -1
+ #elif IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+
+ #error "CAUTION! TFTGLCD_PANEL_SPI requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. Comment out this line to continue."
+
+ /**
+ * TFTGLCD_PANEL_SPI display pinout
+ *
+ * Board Display
+ * _____ _____
+ * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK)
+ * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) GLCD_CS | 3 4 | SD_CS (PA10)
+ * (FREE) PB9 | 5 6 | PA10 (SD_CS) (FREE) | 5 6 | MOSI (SPI1-MOSI)
+ * RESET | 7 8 | PA9 (MOD_RESET) (PB5) SD_DET | 7 8 | (FREE)
+ * (BEEPER) PB6 | 9 10| PB5 (SD_DET) GND | 9 10| 5V
+ * ----- -----
+ * EXP1 EXP1
+ *
+ * Needs custom cable:
+ *
+ * Board Adapter Display
+ * _________
+ * EXP1-1 ----------- EXP1-10
+ * EXP1-2 ----------- EXP1-9
+ * SPI1-4 ----------- EXP1-6
+ * EXP1-4 ----------- FREE
+ * SPI1-3 ----------- EXP1-2
+ * EXP1-6 ----------- EXP1-4
+ * EXP1-7 ----------- FREE
+ * EXP1-8 ----------- EXP1-3
+ * SPI1-1 ----------- EXP1-1
+ * EXP1-10 ----------- EXP1-7
+ */
+
+ #define TFTGLCD_CS PA9
+
+ #endif
+
#else
- #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, and MKS_MINI_12864 are currently supported on the BIGTREE_SKR_MINI_E3."
+ #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and TFTGLCD_PANEL_(SPI|I2C) are currently supported on the BIGTREE_SKR_MINI_E3."
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050)
@@ -185,7 +224,7 @@
* _____ _____
* 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK)
* (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) MOD_RESET | 3 4 | SD_CS (PA10)
- * (FREE) PB9 | 5 6 PA10 (SD_CS) (PB8) LCD_CS | 5 6 MOSI (SPI1-MOSI)
+ * (FREE) PB9 | 5 6 | PA10 (SD_CS) (PB8) LCD_CS | 5 6 | MOSI (SPI1-MOSI)
* RESET | 7 8 | PA9 (MOD_RESET) (PB5) SD_DET | 7 8 | RESET
* (BEEPER) PB6 | 9 10| PB5 (SD_DET) GND | 9 10| 5V
* ----- -----
@@ -205,7 +244,6 @@
* EXP1-8 ----------- EXP1-3
* SPI1-1 ----------- EXP1-1
* EXP1-10 ----------- EXP1-7
- *
*/
#define CLCD_SPI_BUS 1 // SPI1 connector
@@ -227,9 +265,7 @@
#if SD_CONNECTION_IS(ONBOARD)
#define SD_DETECT_PIN PC4
-#endif
-
-#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) && SD_CONNECTION_IS(LCD)
+#elif SD_CONNECTION_IS(LCD) && (BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL)
#define SD_DETECT_PIN PB5
#define SS_PIN PA10
#elif SD_CONNECTION_IS(CUSTOM_CABLE)
diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h
index aaecc054421a..47fff4467c72 100644
--- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h
+++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h
@@ -110,7 +110,7 @@
* EXP2 EXP1
*/
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN PC10
#define BTN_ENC PC11
@@ -123,6 +123,17 @@
#define LCD_PINS_ENABLE PC14
#define LCD_PINS_D4 PB7
+ #elif IS_TFTGLCD_PANEL
+
+ #undef BEEPER_PIN
+ #undef BTN_ENC
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS PD2
+ #endif
+
+ #define SD_DETECT_PIN PB9
+
#else
#define LCD_PINS_RS PC12
@@ -172,7 +183,7 @@
#endif // !FYSETC_MINI_12864
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(125)
#endif
@@ -186,7 +197,7 @@
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// SD Card
diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h
index e67a6d3b1bc5..66930a2ea5a6 100644
--- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h
+++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h
@@ -142,7 +142,7 @@
#endif
// Alter timing for graphical display
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(125)
#endif
diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h
index 2521359e53dd..3a872db0253e 100644
--- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h
+++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h
@@ -120,7 +120,7 @@
//
// LCD Pins
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD)
#define LCD_PINS_RS PD1 // 49 // CS chip select /SS chip slave select
@@ -281,4 +281,4 @@
#endif
#endif // NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h
index a04d6d261f8c..ebe5964d0588 100644
--- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h
+++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h
@@ -139,11 +139,11 @@
//
// LCD Pins
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN PC9
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#define DOGLCD_A0 PA15
#ifdef pins_v2_20190128
diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h
index 24aa83d9482f..de5ea45d44e8 100644
--- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h
+++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h
@@ -130,10 +130,10 @@
* Note: Pin 4 on the Cheetah board is assigned to an I/O, it is assigned to RESET on the Ender-3 board.
*/
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN PC9
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#define DOGLCD_A0 PB14
#define DOGLCD_CS PB12
#define DOGLCD_SCK PB13
diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h
index b6520d563c38..ca25c45a7bba 100644
--- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h
+++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h
@@ -135,7 +135,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
//
@@ -158,7 +158,7 @@
//#define LCD_UART_RX PD9
#endif
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(96)
#endif
@@ -170,7 +170,7 @@
#endif
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
//
diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h
index 7dbee215a0d6..02fd3bcae721 100644
--- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h
+++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h
@@ -135,7 +135,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
//
@@ -166,7 +166,7 @@
//#define LCD_UART_RX PD9
#endif
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(96)
#endif
@@ -178,7 +178,7 @@
#endif
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// Beeper
diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h
index b6520d563c38..ca25c45a7bba 100644
--- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h
+++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h
@@ -135,7 +135,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
//
@@ -158,7 +158,7 @@
//#define LCD_UART_RX PD9
#endif
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(96)
#endif
@@ -170,7 +170,7 @@
#endif
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
//
diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h
index 7731ffb5e734..fc18263fddf6 100644
--- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h
+++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h
@@ -135,7 +135,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER)
@@ -168,7 +168,7 @@
//#define LCD_UART_RX PD9
#endif
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(96)
#endif
@@ -180,7 +180,7 @@
#endif
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// Beeper
diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h
index 799477ac1023..47d7118b53d1 100644
--- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h
+++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h
@@ -124,7 +124,7 @@
#define FSMC_CS_PIN PD7 // pin 88 = FSMC_NE1
#define FSMC_RS_PIN PD11 // pin 58 A16 Register. Only one address needed
-//#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT (broken)
+#define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT
#define FSMC_DMA_DEV DMA2
#define FSMC_DMA_CHANNEL DMA_CH5
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h
index 19f3c3efdac8..a530c89d2cbc 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h
@@ -320,7 +320,7 @@
#endif
-#if HAS_SPI_LCD && !HAS_SPI_TFT
+#if HAS_WIRED_LCD && !HAS_SPI_TFT
// NON TFT Displays
@@ -361,7 +361,7 @@
#endif // !MKS_MINI_12864
-#endif // HAS_SPI_LCD && !HAS_SPI_TFT
+#endif // HAS_WIRED_LCD && !HAS_SPI_TFT
#define HAS_SPI_FLASH 1
#define SPI_FLASH_SIZE 0x1000000 // 16MB
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h
index bbacbf5585d3..015e29bdbe60 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h
@@ -132,7 +132,7 @@
* ----- ----- -----
* EXP1 EXP2 EXP3
*/
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN PC1
#define BTN_ENC PC3
@@ -162,7 +162,7 @@
#endif // !MKS_MINI_12864
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// SD Card
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h
index 2bd417951f0a..aa1ccedb3550 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h
@@ -81,7 +81,7 @@
//
// LCD Pins
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN PD2
#define BTN_ENC PB3
#define LCD_PINS_RS PC3
@@ -111,7 +111,7 @@
#endif // !MKS_MINI_12864
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(125)
#endif
@@ -123,7 +123,7 @@
#endif
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
// Motor current PWM pins
#define MOTOR_CURRENT_PWM_XY_PIN PB0
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h
index bcb731df71a6..d5318b8e8787 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h
@@ -96,7 +96,7 @@
//
// LCD Pins
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN PC1
#define BTN_ENC PC3
@@ -115,6 +115,12 @@
#define DOGLCD_SCK PB13
#define DOGLCD_MOSI PB15
+ #elif IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS PB11
+ #endif
+
#else // !MKS_MINI_12864
#define LCD_PINS_D4 PA6
@@ -126,7 +132,7 @@
#endif // !MKS_MINI_12864
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// SD Card
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h
index be3b130c858f..4e782649d3f0 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h
@@ -233,9 +233,6 @@
//
// LCD / Controller
//
-#ifndef BEEPER_PIN
- #define BEEPER_PIN PC5
-#endif
/**
* Note: MKS Robin TFT screens use various TFT controllers.
@@ -343,7 +340,7 @@
#endif
-#if HAS_SPI_LCD && !HAS_SPI_TFT
+#if HAS_WIRED_LCD && !HAS_SPI_TFT
// NON TFT Displays
@@ -359,6 +356,19 @@
#define DOGLCD_SCK PA5
#define DOGLCD_MOSI PA7
+ #elif IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define PIN_SPI_SCK PA5
+ #define PIN_TFT_MISO PA6
+ #define PIN_TFT_MOSI PA7
+ #define TFTGLCD_CS PE8
+ #endif
+
+ #ifndef BEEPER_PIN
+ #define BEEPER_PIN -1
+ #endif
+
#else // !MKS_MINI_12864
#define LCD_PINS_D4 PE14
@@ -380,7 +390,7 @@
#endif // !MKS_MINI_12864
-#endif // HAS_SPI_LCD && !HAS_SPI_TFT
+#endif // HAS_WIRED_LCD && !HAS_SPI_TFT
#define HAS_SPI_FLASH 1
#define SPI_FLASH_SIZE 0x1000000 // 16MB
@@ -391,6 +401,10 @@
#define W25QXX_SCK_PIN PB13
#endif
+#ifndef BEEPER_PIN
+ #define BEEPER_PIN PC5
+#endif
+
#if ENABLED(SPEAKER) && BEEPER_PIN == PC5
#error "MKS Robin nano default BEEPER_PIN is not a SPEAKER."
#endif
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h
index e445b8169bb5..12c40b31b374 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h
@@ -225,7 +225,13 @@
#define BTN_EN2 PG4
#endif
-#elif HAS_SPI_LCD
+#elif IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS PG5
+ #endif
+
+#elif HAS_WIRED_LCD
#define BEEPER_PIN PC5
#define BTN_ENC PG2
@@ -254,6 +260,7 @@
#endif
#endif // !MKS_MINI_12864 && !ENDER2_STOCKDISPLAY
+
#endif
#ifndef BOARD_ST7920_DELAY_1
diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h
index 79f53f02c2f8..cf2ba2c5fa74 100644
--- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h
+++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h
@@ -97,7 +97,7 @@
//
// LCD Pins
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD)
#define LCD_PINS_RS 49 // CS chip select /SS chip slave select
@@ -258,4 +258,4 @@
#endif
#endif // NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h
index 468ee5394aae..e74698f89eff 100644
--- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h
+++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h
@@ -112,7 +112,7 @@
//
// LCD Pins
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD)
#define LCD_PINS_RS 49 // CS chip select /SS chip slave select
@@ -282,4 +282,4 @@
#endif
#endif // NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/stm32f4/pins_BEAST.h b/Marlin/src/pins/stm32f4/pins_BEAST.h
index d23442ccedbf..268b7b59cd45 100644
--- a/Marlin/src/pins/stm32f4/pins_BEAST.h
+++ b/Marlin/src/pins/stm32f4/pins_BEAST.h
@@ -120,7 +120,7 @@
//
// LCD Pins
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD)
#define LCD_PINS_RS 49 // CS chip select /SS chip slave select
@@ -282,4 +282,4 @@
#endif
#endif // NEWPANEL
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h
index 7843572e13a2..c37f6cce0445 100644
--- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h
+++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h
@@ -187,21 +187,22 @@
#define SDSS PA4
/**
- * -------------------------------------BTT002 V1.0-----------------------------------------------
- * _____ _____ |
+ * -------------------------------------BTT002 V1.0--------------------------------------------
+ * ----- ----- |
* PA3 | · · | GND 5V | · · | GND |
* NRESET | · · | PC4(SD_DET) (LCD_D7) PE13 | · · | PE12 (LCD_D6) |
* (MOSI)PA7 | · · | PB0(BTN_EN2) (LCD_D5) PE11 | · · | PE10 (LCD_D4) |
* (SD_SS)PA4 | · · | PC5(BTN_EN1) (LCD_RS) PE8 | · · | PE9 (LCD_EN) |
* (SCK)PA5 | · · | PA6(MISO) (BTN_ENC) PB1 | · · | PE7 (BEEPER) |
- *  ̄ ̄  ̄ ̄ |
+ * ----- ----- |
* EXP2 EXP1 |
- * ---------------------------------------------------------------------------------------------
+ * --------------------------------------------------------------------------------------------
*/
+
//
// LCDs and Controllers
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN PE7
#define BTN_ENC PB1
@@ -236,7 +237,7 @@
#endif
// Alter timing for graphical display
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(96)
#endif
@@ -248,7 +249,7 @@
#endif
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
//
// RGB LEDs
diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h
index ddca719e5322..dc8ce9f2d1b2 100644
--- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h
+++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h
@@ -290,9 +290,12 @@
// overriding pins to access.
//
#if SD_CONNECTION_IS(LCD)
+
#define SD_DETECT_PIN PB10
#define SDSS PB12
+
#elif SD_CONNECTION_IS(ONBOARD)
+
// Instruct the STM32 HAL to override the default SPI pins from the variant.h file
#define CUSTOM_SPI_PINS
#define SDSS PA4
@@ -301,25 +304,26 @@
#define MISO_PIN PA6
#define MOSI_PIN PA7
#define SD_DETECT_PIN PC4
+
#elif SD_CONNECTION_IS(CUSTOM_CABLE)
- #define "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board"
+ #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board"
#endif
/**
- * _____ _____
+ * ----- -----
* NC | · · | GND 5V | · · | GND
* RESET | · · | PB10(SD_DETECT) (LCD_D7) PG5 | · · | PG6 (LCD_D6)
* (MOSI)PB15 | · · | PH10(BTN_EN2) (LCD_D5) PG7 | · · | PG8 (LCD_D4)
* (SD_SS)PB12 | · · | PD10(BTN_EN1) (LCD_RS) PA8 | · · | PC10 (LCD_EN)
* (SCK)PB13 | · · | PB14(MISO) (BTN_ENC) PA15 | · · | PC11 (BEEPER)
- *  ̄ ̄  ̄ ̄
+ * ----- -----
* EXP2 EXP1
*/
//
// LCDs and Controllers
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN PC11
#define BTN_ENC PA15
@@ -390,7 +394,7 @@
#endif
// Alter timing for graphical display
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(96)
#endif
@@ -402,6 +406,6 @@
#endif
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#undef TP
diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h
index e9abd66795c0..1cd7e9dd89a2 100644
--- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h
+++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h
@@ -251,9 +251,12 @@
// Must use soft SPI because Marlin's default hardware SPI is tied to LCD's EXP2
//
#if SD_CONNECTION_IS(LCD)
+
#define SD_DETECT_PIN PF12
#define SDSS PB12
+
#elif SD_CONNECTION_IS(ONBOARD)
+
// The SKR Pro's ONBOARD SD interface is on SPI1.
// Due to a pull resistor on the clock line, it needs to use SPI Data Mode 3 to
// function with Hardware SPI. This is not currently configurable in the HAL,
@@ -264,29 +267,38 @@
#define MISO_PIN PA6
#define MOSI_PIN PB5
#define SD_DETECT_PIN PB11
+
#elif SD_CONNECTION_IS(CUSTOM_CABLE)
- #define "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board"
+ #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board"
#endif
/**
- * _____ _____
+ * ----- -----
* NC | · · | GND 5V | · · | GND
* RESET | · · | PF12(SD_DETECT) (LCD_D7) PG7 | · · | PG6 (LCD_D6)
* (MOSI)PB15 | · · | PF11(BTN_EN2) (LCD_D5) PG3 | · · | PG2 (LCD_D4)
* (SD_SS)PB12 | · · | PG10(BTN_EN1) (LCD_RS) PD10 | · · | PD11 (LCD_EN)
* (SCK)PB13 | · · | PB14(MISO) (BTN_ENC) PA8 | · · | PG4 (BEEPER)
- *  ̄ ̄  ̄ ̄
+ * ----- -----
* EXP2 EXP1
*/
//
// LCDs and Controllers
//
-#if HAS_SPI_LCD
+#if IS_TFTGLCD_PANEL
+
+ #if ENABLED(TFTGLCD_PANEL_SPI)
+ #define TFTGLCD_CS PG10
+ #endif
+
+#elif HAS_WIRED_LCD
+
#define BEEPER_PIN PG4
#define BTN_ENC PA8
#if ENABLED(CR10_STOCKDISPLAY)
+
#define LCD_PINS_RS PG6
#define BTN_EN1 PD11
@@ -301,10 +313,12 @@
#undef BOARD_ST7920_DELAY_3
#elif ENABLED(MKS_MINI_12864)
+
#define DOGLCD_A0 PG6
#define DOGLCD_CS PG3
#define BTN_EN1 PG10
#define BTN_EN2 PF11
+
#else
#define LCD_PINS_RS PD10
@@ -343,32 +357,32 @@
#endif
- // Alter timing for graphical display
- #if HAS_GRAPHICAL_LCD
- #ifndef BOARD_ST7920_DELAY_1
- #define BOARD_ST7920_DELAY_1 DELAY_NS(96)
- #endif
- #ifndef BOARD_ST7920_DELAY_2
- #define BOARD_ST7920_DELAY_2 DELAY_NS(48)
- #endif
- #ifndef BOARD_ST7920_DELAY_3
- #define BOARD_ST7920_DELAY_3 DELAY_NS(600)
- #endif
- #endif
+#endif // HAS_WIRED_LCD
-#endif // HAS_SPI_LCD
+// Alter timing for graphical display
+#if HAS_MARLINUI_U8GLIB
+ #ifndef BOARD_ST7920_DELAY_1
+ #define BOARD_ST7920_DELAY_1 DELAY_NS(96)
+ #endif
+ #ifndef BOARD_ST7920_DELAY_2
+ #define BOARD_ST7920_DELAY_2 DELAY_NS(48)
+ #endif
+ #ifndef BOARD_ST7920_DELAY_3
+ #define BOARD_ST7920_DELAY_3 DELAY_NS(600)
+ #endif
+#endif
//
// WIFI
//
/**
- * _____
+ * -----
* TX | 1 2 | GND Enable PG1 // Must be high for module to run
* Enable | 3 4 | GPIO2 Reset PG0 // active low, probably OK to leave floating
* Reset | 5 6 | GPIO0 GPIO2 PF15 // must be high (ESP3D software configures this with a pullup so OK to leave as floating)
- * 3.3V| 7 8 | RX GPIO0 PF14 // Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating)
- *  ̄ ̄
+ * 3.3V | 7 8 | RX GPIO0 PF14 // Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating)
+ * -----
* W1
*/
#define ESP_WIFI_MODULE_COM 6 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this
diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h
index a6d7f8a495ad..151f6c3bc06e 100644
--- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h
+++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h
@@ -199,7 +199,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BEEPER_PIN PC9
#define BTN_ENC PA8
@@ -261,7 +261,7 @@
#endif
// Alter timing for graphical display
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(96)
#endif
@@ -273,7 +273,7 @@
#endif
#endif
-#endif // HAS_SPI_LCD
+#endif // HAS_WIRED_LCD
#ifndef RGB_LED_R_PIN
#define RGB_LED_R_PIN PB6
diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h
index 6cd970501fde..021ef1d5f6b8 100644
--- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h
+++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6_V2_0.h
@@ -16,7 +16,7 @@
* 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 .
+ * along with this program. If not, see .
*
*/
#pragma once
diff --git a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h
index ae469365a996..4acfd743b756 100644
--- a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h
+++ b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h
@@ -184,7 +184,7 @@
//
// ST7920 Delays
//
-#if HAS_GRAPHICAL_LCD
+#if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(96)
#endif
diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h
index 338fda1e53a1..d52bb11d1206 100644
--- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h
+++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h
@@ -23,7 +23,6 @@
/**
* Common pin assignments for all RUMBA32 boards
- *
*/
#if NOT_TARGET(STM32F4)
@@ -147,7 +146,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define BTN_EN1 PB2
#define BTN_EN2 PB1
@@ -169,7 +168,7 @@
#endif
// Alter timing for graphical display
- #if HAS_GRAPHICAL_LCD
+ #if HAS_MARLINUI_U8GLIB
#ifndef BOARD_ST7920_DELAY_1
#define BOARD_ST7920_DELAY_1 DELAY_NS(96)
#endif
diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h
index 6c826b068d24..e2463fd47e6f 100644
--- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h
+++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h
@@ -165,7 +165,7 @@
//
// LCD / Controller
//
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#if ENABLED(SDSUPPORT)
#define SDSS PB6 // CS for SD card in LCD
#endif
diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h
index 3fb8c7f2593b..6ffd35dff273 100644
--- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h
+++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h
@@ -201,7 +201,7 @@
//
//#define USE_INTERNAL_SD
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define LCD_PINS_RS 9 // E1 JP11-11
#define LCD_PINS_ENABLE 8 // E0 JP11-10
#define LCD_PINS_D4 7 // D7 JP11-8
diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h
index 09bbeebdd8c3..9de119b62b4a 100644
--- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h
+++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h
@@ -17,7 +17,6 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
- *
*/
/**
diff --git a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h
index b98c78fde1d3..0edb5cb19dbd 100644
--- a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h
+++ b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h
@@ -27,7 +27,7 @@
* https://www.pjrc.com/teensy/teensyduino.html
*/
-#if NOT_TARGET(IS_32BIT_TEENSY)
+#if NOT_TARGET(IS_TEENSY_31_32)
#error "Oops! Select 'Teensy 3.1' or 'Teensy 3.2' in 'Tools > Board.'"
#endif
@@ -98,7 +98,7 @@
//
/*
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define LCD_PINS_RS 40
#define LCD_PINS_ENABLE 41
#define LCD_PINS_D4 42
diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h
index 961dc0cff03f..2e09c8a425ca 100644
--- a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h
+++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h
@@ -27,7 +27,7 @@
* https://www.pjrc.com/teensy/teensyduino.html
****************************************************************************************/
-#if NOT_TARGET(IS_32BIT_TEENSY)
+#if NOT_TARGET(IS_TEENSY_35_36)
#error "Oops! Select 'Teensy 3.5' or 'Teensy 3.6' in 'Tools > Board.'"
#endif
@@ -130,7 +130,7 @@
//
#define SDSS 39 // 8
-#if HAS_SPI_LCD
+#if HAS_WIRED_LCD
#define LCD_PINS_RS 40
#define LCD_PINS_ENABLE 41
#define LCD_PINS_D4 42
diff --git a/Marlin/src/pins/teensy4/pins_T41U5XBB.h b/Marlin/src/pins/teensy4/pins_T41U5XBB.h
index cb4c0ea879bf..830637bebd93 100644
--- a/Marlin/src/pins/teensy4/pins_T41U5XBB.h
+++ b/Marlin/src/pins/teensy4/pins_T41U5XBB.h
@@ -27,12 +27,12 @@
* https://www.pjrc.com/teensy/teensyduino.html
****************************************************************************************/
-#if NOT_TARGET(IS_32BIT_TEENSY) || NOT_TARGET(IS_TEENSY41)
+#if NOT_TARGET(IS_TEENSY41)
#error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'"
-#else
- #define BOARD_INFO_NAME "Teensy4.1"
#endif
+#define BOARD_INFO_NAME "Teensy4.1"
+
/**
* Plan for Teensy 4.0 and Teensy 4.1:
* USB
diff --git a/Marlin/src/pins/teensy4/pins_TEENSY41.h b/Marlin/src/pins/teensy4/pins_TEENSY41.h
index cc7341bc2326..31c6fda5c900 100644
--- a/Marlin/src/pins/teensy4/pins_TEENSY41.h
+++ b/Marlin/src/pins/teensy4/pins_TEENSY41.h
@@ -27,12 +27,12 @@
* https://www.pjrc.com/teensy/teensyduino.html
****************************************************************************************/
-#if NOT_TARGET(IS_32BIT_TEENSY) || NOT_TARGET(IS_TEENSY41)
+#if NOT_TARGET(IS_TEENSY41)
#error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'"
-#else
- #define BOARD_INFO_NAME "Teensy4.1"
#endif
+#define BOARD_INFO_NAME "Teensy4.1"
+
/**
* Plan for Teensy 4.0 and Teensy 4.1:
* USB
diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp
index 6ff2793e93df..491c0692c72f 100644
--- a/Marlin/src/sd/Sd2Card.cpp
+++ b/Marlin/src/sd/Sd2Card.cpp
@@ -231,6 +231,13 @@ bool Sd2Card::eraseSingleBlockEnable() {
* The reason for failure can be determined by calling errorCode() and errorData().
*/
bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) {
+ #if IS_TEENSY_35_36 || IS_TEENSY_40_41
+ chipSelectPin_ = BUILTIN_SDCARD;
+ const uint8_t ret = SDHC_CardInit();
+ type_ = SDHC_CardGetType();
+ return (ret == 0);
+ #endif
+
errorCode_ = type_ = 0;
chipSelectPin_ = chipSelectPin;
// 16-bit init start time allows over a minute
@@ -332,6 +339,10 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) {
* \return true for success, false for failure.
*/
bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) {
+ #if IS_TEENSY_35_36 || IS_TEENSY_40_41
+ return 0 == SDHC_CardReadBlock(dst, blockNumber);
+ #endif
+
if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; // Use address if not SDHC card
#if ENABLED(SD_CHECK_AND_RETRY)
@@ -547,6 +558,10 @@ bool Sd2Card::waitNotBusy(const millis_t timeout_ms) {
bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) {
if (ENABLED(SDCARD_READONLY)) return false;
+ #if IS_TEENSY_35_36 || IS_TEENSY_40_41
+ return 0 == SDHC_CardWriteBlock(src, blockNumber);
+ #endif
+
bool success = false;
if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; // Use address if not SDHC card
if (!cardCommand(CMD24, blockNumber)) {
diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h
index da19283ef1ec..6900502e03e9 100644
--- a/Marlin/src/sd/Sd2Card.h
+++ b/Marlin/src/sd/Sd2Card.h
@@ -78,13 +78,16 @@ uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1
SD_CARD_TYPE_SDHC = 3; // High Capacity SD card
/**
- * define SOFTWARE_SPI to use bit-bang SPI
+ * Define SOFTWARE_SPI to use bit-bang SPI
*/
-#if MEGA_SOFT_SPI
+#if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI)
#define SOFTWARE_SPI
-#elif USE_SOFTWARE_SPI
- #define SOFTWARE_SPI
-#endif // MEGA_SOFT_SPI
+#endif
+
+#if IS_TEENSY_35_36 || IS_TEENSY_40_41
+ #include "NXP_SDHC.h"
+ #define BUILTIN_SDCARD 254
+#endif
/**
* \class Sd2Card
diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp
index 98d762f10b6a..2bc9f96e8c92 100644
--- a/Marlin/src/sd/SdBaseFile.cpp
+++ b/Marlin/src/sd/SdBaseFile.cpp
@@ -154,7 +154,6 @@ bool SdBaseFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) {
* an invalid DOS 8.3 file name, the FAT volume has not been initialized,
* a file is already open, the file already exists, the root
* directory is full or an I/O error.
- *
*/
bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char* path, uint32_t size) {
if (ENABLED(SDCARD_READONLY)) return false;
@@ -1663,7 +1662,6 @@ bool SdBaseFile::truncate(uint32_t length) {
* \a nbyte. If an error occurs, write() returns -1. Possible errors
* include write() is called before a file has been opened, write is called
* for a read-only file, device is full, a corrupt file system or an I/O error.
- *
*/
int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) {
#if ENABLED(SDCARD_READONLY)
diff --git a/Marlin/src/sd/SdFatStructs.h b/Marlin/src/sd/SdFatStructs.h
index e06e05981ad2..484d4e50c6c9 100644
--- a/Marlin/src/sd/SdFatStructs.h
+++ b/Marlin/src/sd/SdFatStructs.h
@@ -128,7 +128,6 @@ typedef struct masterBootRecord mbr_t;
* \struct fat_boot
*
* \brief Boot sector for a FAT12/FAT16 volume.
- *
*/
struct fat_boot {
/**
@@ -409,7 +408,6 @@ uint32_t const FSINFO_LEAD_SIG = 0x41615252, // 'AaRR' Lead signature for a F
* \struct fat32_fsinfo
*
* \brief FSINFO sector for a FAT32 volume.
- *
*/
struct fat32_fsinfo {
uint32_t leadSignature; // must be 0x52, 0x52, 0x61, 0x41 'RRaA'
diff --git a/Marlin/src/sd/SdFile.cpp b/Marlin/src/sd/SdFile.cpp
index a4f048d9502c..c82fe2c5ed77 100644
--- a/Marlin/src/sd/SdFile.cpp
+++ b/Marlin/src/sd/SdFile.cpp
@@ -57,7 +57,6 @@ SdFile::SdFile(const char* path, uint8_t oflag) : SdBaseFile(path, oflag) { }
* \a nbyte. If an error occurs, write() returns -1. Possible errors
* include write() is called before a file has been opened, write is called
* for a read-only file, device is full, a corrupt file system or an I/O error.
- *
*/
int16_t SdFile::write(const void* buf, uint16_t nbyte) { return SdBaseFile::write(buf, nbyte); }
diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp
index 37af4a368846..e154ea9f314b 100644
--- a/Marlin/src/sd/cardreader.cpp
+++ b/Marlin/src/sd/cardreader.cpp
@@ -55,6 +55,7 @@
#define DEBUG_OUT EITHER(DEBUG_CARDREADER, MARLIN_DEV_MODE)
#include "../core/debug_out.h"
+#include "../libs/hex_print.h"
// public:
@@ -571,11 +572,11 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0*
endFilePrint();
- SdFile *curDir;
- const char * const fname = diveToFile(true, curDir, path);
+ SdFile *diveDir;
+ const char * const fname = diveToFile(true, diveDir, path);
if (!fname) return;
- if (file.open(curDir, fname, O_READ)) {
+ if (file.open(diveDir, fname, O_READ)) {
filesize = file.fileSize();
sdpos = 0;
@@ -606,14 +607,14 @@ void CardReader::openFileWrite(char * const path) {
endFilePrint();
- SdFile *curDir;
- const char * const fname = diveToFile(false, curDir, path);
+ SdFile *diveDir;
+ const char * const fname = diveToFile(false, diveDir, path);
if (!fname) return;
#if ENABLED(SDCARD_READONLY)
openFailed(fname);
#else
- if (file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) {
+ if (file.open(diveDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) {
flag.saving = true;
selectFileByName(fname);
TERN_(EMERGENCY_PARSER, emergency_parser.disable());
@@ -625,6 +626,22 @@ void CardReader::openFileWrite(char * const path) {
#endif
}
+//
+// Check if a file exists by absolute or workDir-relative path
+// If the file exists, the long name can also be fetched.
+//
+bool CardReader::fileExists(const char * const path) {
+ if (!isMounted()) return false;
+ SdFile *diveDir = nullptr;
+ const char * const fname = diveToFile(false, diveDir, path);
+ if (fname) {
+ diveDir->rewind();
+ selectByName(*diveDir, fname);
+ diveDir->close();
+ }
+ return fname != nullptr;
+}
+
//
// Delete a file by name in the working directory
//
@@ -770,13 +787,15 @@ uint16_t CardReader::countFilesInWorkDir() {
/**
* Dive to the given DOS 8.3 file path, with optional echo of the dive paths.
*
- * On exit, curDir contains an SdFile reference to the file's directory.
+ * On exit:
+ * - Your curDir pointer contains an SdFile reference to the file's directory.
+ * - If update_cwd was 'true' the workDir now points to the file's directory.
*
* Returns a pointer to the last segment (filename) of the given DOS 8.3 path.
*
* A nullptr result indicates an unrecoverable error.
*/
-const char* CardReader::diveToFile(const bool update_cwd, SdFile*& curDir, const char * const path, const bool echo/*=false*/) {
+const char* CardReader::diveToFile(const bool update_cwd, SdFile*& diveDir, const char * const path, const bool echo/*=false*/) {
// Track both parent and subfolder
static SdFile newDir1, newDir2;
SdFile *sub = &newDir1, *startDir;
@@ -784,15 +803,21 @@ const char* CardReader::diveToFile(const bool update_cwd, SdFile*& curDir, const
// Parsing the path string
const char *item_name_adr = path;
+ DEBUG_ECHOLNPAIR("diveToFile: path = '", path, "'");
+
if (path[0] == '/') { // Starting at the root directory?
- curDir = &root;
- if (update_cwd) workDirDepth = 0; // The cwd can be updated for the benefit of sub-programs
+ diveDir = &root;
item_name_adr++;
+ DEBUG_ECHOLNPAIR("diveToFile: CWD to root: ", hex_address((void*)diveDir));
+ if (update_cwd) workDirDepth = 0; // The cwd can be updated for the benefit of sub-programs
}
else
- curDir = &workDir; // Dive from workDir (as set by the UI)
+ diveDir = &workDir; // Dive from workDir (as set by the UI)
+
+ startDir = diveDir;
+
+ DEBUG_ECHOLNPAIR("diveToFile: startDir = ", hex_address((void*)startDir));
- startDir = curDir;
while (item_name_adr) {
// Find next subdirectory delimiter
char * const name_end = strchr(item_name_adr, '/');
@@ -808,30 +833,48 @@ const char* CardReader::diveToFile(const bool update_cwd, SdFile*& curDir, const
if (echo) SERIAL_ECHOLN(dosSubdirname);
- // Open curDir
- if (!sub->open(curDir, dosSubdirname, O_READ)) {
+ DEBUG_ECHOLNPAIR("diveToFile: sub = ", hex_address((void*)sub));
+
+ // Open diveDir (closing first)
+ sub->close();
+ if (!sub->open(diveDir, dosSubdirname, O_READ)) {
openFailed(dosSubdirname);
- return nullptr;
+ item_name_adr = nullptr;
+ break;
}
- // Close curDir if not at starting-point
- if (curDir != startDir) curDir->close();
+ // Close diveDir if not at starting-point
+ if (diveDir != startDir) {
+ DEBUG_ECHOLNPAIR("diveToFile: closing diveDir: ", hex_address((void*)diveDir));
+ diveDir->close();
+ }
- // curDir now subDir
- curDir = sub;
+ // diveDir now subDir
+ diveDir = sub;
+ DEBUG_ECHOLNPAIR("diveToFile: diveDir = sub: ", hex_address((void*)diveDir));
- // Update workDirParents, workDirDepth, and workDir
+ // Update workDirParents and workDirDepth
if (update_cwd) {
- if (workDirDepth < MAX_DIR_DEPTH) workDirParents[workDirDepth++] = *curDir;
- workDir = *curDir;
+ DEBUG_ECHOLNPAIR("diveToFile: update_cwd");
+ if (workDirDepth < MAX_DIR_DEPTH)
+ workDirParents[workDirDepth++] = *diveDir;
}
// Point sub at the other scratch object
- sub = (curDir != &newDir1) ? &newDir1 : &newDir2;
+ sub = (diveDir != &newDir1) ? &newDir1 : &newDir2;
+ DEBUG_ECHOLNPAIR("diveToFile: swapping sub = ", hex_address((void*)sub));
// Next path atom address
item_name_adr = name_end + 1;
}
+
+ if (update_cwd) {
+ workDir = *diveDir;
+ DEBUG_ECHOLNPAIR("diveToFile: final workDir = ", hex_address((void*)diveDir));
+ flag.workDirIsRoot = (workDirDepth == 0);
+ TERN_(SDCARD_SORT_ALPHA, presort());
+ }
+
return item_name_adr;
}
diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h
index 62a6d87acf69..33645b6531eb 100644
--- a/Marlin/src/sd/cardreader.h
+++ b/Marlin/src/sd/cardreader.h
@@ -99,6 +99,7 @@ class CardReader {
static void openFileRead(char * const path, const uint8_t subcall=0);
static void openFileWrite(char * const path);
static void closefile(const bool store_location=false);
+ static bool fileExists(const char * const name);
static void removeFile(const char * const name);
static inline char* longest_filename() { return longFilename[0] ? longFilename : filename; }
diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h
index 55a1099a3a25..8ca95ba7061c 100644
--- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h
+++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h
@@ -30,19 +30,20 @@
#include "../SdInfo.h"
/**
- * define SOFTWARE_SPI to use bit-bang SPI
+ * Define SOFTWARE_SPI to use bit-bang SPI
*/
-#if MEGA_SOFT_SPI || USE_SOFTWARE_SPI
+#if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI)
#define SOFTWARE_SPI
#endif
// SPI pin definitions - do not edit here - change in SdFatConfig.h
-#if DISABLED(SOFTWARE_SPI)
+#if ENABLED(SOFTWARE_SPI)
+ #warning "Auto-assigning '10' as the SD_CHIP_SELECT_PIN."
+ #define SD_CHIP_SELECT_PIN 10 // Software SPI chip select pin for the SD
+#else
// hardware pin defs
#define SD_CHIP_SELECT_PIN SS_PIN // The default chip select pin for the SD card is SS.
-#else // SOFTWARE_SPI
- #define SD_CHIP_SELECT_PIN 10 // Software SPI chip select pin for the SD
-#endif // SOFTWARE_SPI
+#endif
class Sd2Card {
private:
diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp
index 8f0dbf42e957..8a989157b40a 100644
--- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp
+++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp
@@ -640,7 +640,6 @@ uint8_t USB::AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lo
* 7: for (each driver) {
* 7a: Ask device if it knows this VID/PID. Acts exactly like 6a, but using VID/PID
* 8: if we get here, no driver likes the device plugged in, so exit failure.
- *
*/
uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) {
//uint8_t bAddress = 0;
diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp
index 8ead0b0093b6..d707a41a2702 100644
--- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp
+++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp
@@ -828,7 +828,6 @@ uint8_t BulkOnly::ClearEpHalt(uint8_t index) {
/**
* For driver use only.
- *
*/
void BulkOnly::Reset() {
while (pUsb->ctrlReq(bAddress, 0, bmREQ_MASSOUT, MASS_REQ_BOMSR, 0, 0, bIface, 0, 0, nullptr, nullptr) == 0x01) delay(6);
@@ -1163,7 +1162,6 @@ uint8_t BulkOnly::HandleSCSIError(uint8_t status) {
////////////////////////////////////////////////////////////////////////////////
/**
- *
* @param ep_ptr
*/
void BulkOnly::PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR * ep_ptr) {
diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h
index 45830de9a162..15ed427697b6 100644
--- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h
+++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h
@@ -318,7 +318,6 @@ UHS_NI UHS_Bulk_Storage::UHS_Bulk_Storage(UHS_USB_HOST_BASE *p) {
}
/**
- *
* @param ei Enumeration information
* @return true if this interface driver can handle this interface description
*/
@@ -375,7 +374,6 @@ uint8_t UHS_NI UHS_Bulk_Storage::SetInterface(ENUMERATION_INFO *ei) {
};
/**
- *
* @return 0 for success
*/
uint8_t UHS_NI UHS_Bulk_Storage::Start() {
@@ -628,7 +626,6 @@ void UHS_NI UHS_Bulk_Storage::CheckMedia() {
/**
* For driver use only.
- *
*/
void UHS_NI UHS_Bulk_Storage::Poll() {
if((long)(millis() - qNextPollTime) >= 0L) {
@@ -839,7 +836,6 @@ uint8_t UHS_NI UHS_Bulk_Storage::ClearEpHalt(uint8_t index) {
/**
* For driver use only.
- *
*/
void UHS_NI UHS_Bulk_Storage::Reset() {
if(!bAddress) return;
@@ -1185,7 +1181,6 @@ uint8_t UHS_NI UHS_Bulk_Storage::HandleSCSIError(uint8_t status) {
////////////////////////////////////////////////////////////////////////////////
/**
- *
* @param ep_ptr
*/
void UHS_NI UHS_Bulk_Storage::PrintEndpointDescriptor(const USB_FD_ENDPOINT_DESCRIPTOR * ep_ptr) {
diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h
index dec083390e3c..7843013b0442 100644
--- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h
+++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h
@@ -101,7 +101,6 @@ uint8_t UHS_USB_HOST_BASE::setEpInfoEntry(uint8_t addr, uint8_t iface, uint8_t e
*
* @param maxep How many endpoints to initialize
* @param device pointer to the device driver instance (this)
- *
*/
void UHS_USB_HOST_BASE::DeviceDefaults(uint8_t maxep, UHS_USBInterface *interface) {
@@ -208,7 +207,6 @@ uint8_t UHS_USB_HOST_BASE::doSoftReset(uint8_t parent, uint8_t port, uint8_t add
* example of one of these documents, see page Five:
* https://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_113_Simplified%20Description%20of%20USB%20Device%20Enumeration.pdf
*
- *
*/
/**
diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h
index 625666170bca..b289a896efea 100644
--- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h
+++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h
@@ -350,7 +350,6 @@ class UHS_USBInterface {
/**
* Executed before anything else in Release().
- *
*/
virtual void OnRelease() {
return;
@@ -403,7 +402,6 @@ class UHS_USBInterface {
#if 0
/**
- *
* @return true if this interface is Vendor Specific.
*/
virtual bool IsVSI() {
@@ -414,7 +412,6 @@ class UHS_USBInterface {
#if 0
/**
- *
* Vendor Specific interface class.
* This is used by a partner interface.
* It can also be used to force-enumerate an interface that
diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h
index 114064044d17..0ac90f0df3a6 100644
--- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h
+++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h
@@ -6,7 +6,6 @@
*
* To test:
* gcc -DAJK_TEST_MACRO_LOGIC -E macro_logic.h
- *
*/
#ifndef MACRO_LOGIC_H
diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h
index 5408a94ade70..f86054cad8a4 100644
--- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h
+++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h
@@ -165,7 +165,6 @@ static void Init_dyn_SWI() {
}
/**
- *
* @param klass class that extends dyn_SWI
* @return 0 on queue full, else returns queue position (ones based)
*/
@@ -219,7 +218,6 @@ static void Init_dyn_SWI() {
}
/**
- *
* @param klass class that extends dyn_SWI
* @return 0 on queue full, else returns queue position (ones based)
*/
diff --git a/README.md b/README.md
index 839b9f3f6578..27becb9db6cb 100644
--- a/README.md
+++ b/README.md
@@ -100,8 +100,8 @@ Marlin 2.0 introduces a layer of abstraction so that all the existing high-level
boards|processor|speed|flash|sram|logic|fpu
----|---------|-----|-----|----|-----|---
- [Teensy 4.0](https://www.pjrc.com/store/teensy40.html)|[IMXRT1062](https://www.mouser.com/new/nxp-semiconductors/nxp-imx-rt1060-crossover-processor/) ARM-Cortex M7|600MHz|1M|2M|3.3V|yes
- [Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|[IMXRT1062](https://www.mouser.com/new/nxp-semiconductors/nxp-imx-rt1060-crossover-processor/) ARM-Cortex M7|600MHz|1M|2M|3.3V|yes
+ [Teensy 4.0](https://www.pjrc.com/store/teensy40.html)|[IMXRT1062DVL6A](https://www.mouser.com/new/nxp-semiconductors/nxp-imx-rt1060-crossover-processor/) ARM-Cortex M7|600MHz|1M|2M|3.3V|yes
+ [Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|[IMXRT1062DVJ6A](https://www.mouser.com/new/nxp-semiconductors/nxp-imx-rt1060-crossover-processor/) ARM-Cortex M7|600MHz|1M|2M|3.3V|yes
## Submitting Patches
diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h
index 344dce9f13ab..02a4502e3fae 100644
--- a/buildroot/share/PlatformIO/scripts/common-dependencies.h
+++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h
@@ -73,14 +73,10 @@
// Feature checks for SR_LCD_3W_NL
#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008)
#define USES_LIQUIDTWI2
-#elif ANY(HAS_CHARACTER_LCD, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602)
+#elif ANY(HAS_MARLINUI_HD44780, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602)
#define USES_LIQUIDCRYSTAL
#endif
-#if BOTH(ANYCUBIC_LCD_I3MEGA, EXTENSIBLE_UI)
- #define HAS_ANYCUBIC_TFT_EXTUI
-#endif
-
#if SAVED_POSITIONS
#define HAS_SAVED_POSITIONS
#endif
diff --git a/buildroot/share/fonts/marlin-6x12-3.bdf b/buildroot/share/fonts/marlin-6x12-3.bdf
index ef90656eba1b..bc7a8827c037 100644
--- a/buildroot/share/fonts/marlin-6x12-3.bdf
+++ b/buildroot/share/fonts/marlin-6x12-3.bdf
@@ -106,16 +106,15 @@ B8
ENDCHAR
STARTCHAR uni0006
ENCODING 6
-SWIDTH 545 0
-DWIDTH 6 0
-BBX 5 6 0 1
+SWIDTH 504 0
+DWIDTH 7 0
+BBX 8 5 0 1
BITMAP
-E0
-8C
-EA
-8C
-8A
-0A
+D8
+6C
+36
+6C
+D8
ENDCHAR
STARTCHAR uni0007
ENCODING 7
diff --git a/buildroot/share/git/mfinfo b/buildroot/share/git/mfinfo
index c7bf04fb1471..e17138e45626 100755
--- a/buildroot/share/git/mfinfo
+++ b/buildroot/share/git/mfinfo
@@ -49,7 +49,8 @@ while [[ $# -gt 0 ]]; do
done
case "$REPO" in
- Marlin ) TARG=bugfix-1.1.x ; [[ $INDEX == 2 ]] && TARG=bugfix-2.0.x ; [[ $INDEX == 3 ]] && TARG=dev-2.1.x ;;
+ Marlin ) TARG=bugfix-2.0.x ; [[ $INDEX == 1 ]] && TARG=bugfix-1.1.x ; [[ $INDEX == 3 ]] && TARG=dev-2.1.x ;;
+ Configurations ) TARG=import-2.0.x ;;
MarlinDocumentation ) TARG=master ;;
esac
diff --git a/buildroot/share/git/mfrb b/buildroot/share/git/mfrb
index 1edc99bbe928..071b0b3d5989 100755
--- a/buildroot/share/git/mfrb
+++ b/buildroot/share/git/mfrb
@@ -23,8 +23,5 @@ done
[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3]" 1>&2 ; exit 1 ; }
-# If the branch isn't currently the PR target
-if [[ $TARG != $CURR ]]; then
- [[ $QUICK ]] || git fetch upstream
- git rebase upstream/$TARG && git rebase -i upstream/$TARG
-fi
+[[ $QUICK ]] || git fetch upstream
+git rebase upstream/$TARG && git rebase -i upstream/$TARG
diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests
index 9c7a1ba10e83..a7a6456d026d 100755
--- a/buildroot/tests/LPC1769-tests
+++ b/buildroot/tests/LPC1769-tests
@@ -26,6 +26,20 @@ opt_enable VIKI2 SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \
opt_set GRID_MAX_POINTS_X 16
exec_test $1 $2 "Smoothieboard with many features"
+restore_configs
+opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD
+opt_set EXTRUDERS 2
+opt_set TEMP_SENSOR_1 -1
+opt_set TEMP_SENSOR_BED 5
+opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \
+ FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \
+ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET \
+ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \
+ Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \
+ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER
+opt_set GRID_MAX_POINTS_X 16
+exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI"
+
#restore_configs
#opt_set MOTHERBOARD BOARD_AZTEEG_X5_MINI_WIFI
#opt_enable COREYX USE_XMAX_PLUG DAC_MOTOR_CURRENT_DEFAULT \
diff --git a/config/README.md b/config/README.md
index be986b7058a6..b5013627eace 100644
--- a/config/README.md
+++ b/config/README.md
@@ -1,3 +1,9 @@
# Where have all the configurations gone?
+Marlin configurations for specific machines are now maintained in their own repository at:
+
+## https://github.com/MarlinFirmware/Configurations
+
+Configuration files for use with the nightly `bugfix-2.0.x` branch can be downloaded from:
+
## https://github.com/MarlinFirmware/Configurations/archive/bugfix-2.0.x.zip
diff --git a/platformio.ini b/platformio.ini
index 5fd10866b6c9..15d801397179 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -26,7 +26,7 @@ include_dir = Marlin
#
[common]
default_src_filter = + - - +
- - - - -
+ - - - - -
-
- - -
- -
@@ -53,8 +53,8 @@ default_src_filter = + - - +
-
-
-
- -
- -
+ -
+ - -
-
-
-
@@ -208,13 +208,15 @@ HAS_L64XX = Arduino-L6470@0.8.0
NEOPIXEL_LED = Adafruit NeoPixel@1.5.0
src_filter=+
MAX6675_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0
-HAS_GRAPHICAL_LCD = U8glib-HAL@~0.4.1
- src_filter=+
USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0
USES_LIQUIDTWI2 = LiquidTWI2@1.2.7
-DWIN_CREALITY_LCD = src_filter=+
-HAS_CHARACTER_LCD = src_filter=+
+HAS_WIRED_LCD = src_filter=+
+HAS_MARLINUI_HD44780 = src_filter=+
+HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1
+ src_filter=+
HAS_GRAPHICAL_TFT = src_filter=+
+DWIN_CREALITY_LCD = src_filter=+
+IS_TFTGLCD_PANEL = src_filter=+
HAS_LCD_MENU = src_filter=+
HAS_GAMES = src_filter=+
MARLIN_BRICKOUT = src_filter=+
@@ -240,13 +242,12 @@ HAS_MENU_TEMPERATURE = src_filter=+
HAS_MENU_TMC = src_filter=+
HAS_MENU_TOUCH_SCREEN = src_filter=+
HAS_MENU_UBL = src_filter=+
-ANYCUBIC_LCD_I3MEGA = src_filter=+
+ANYCUBIC_LCD_CHIRON = src_filter=+
+ANYCUBIC_LCD_I3MEGA = src_filter=+ +
HAS_DGUS_LCD = src_filter=+ +
TOUCH_UI_FTDI_EVE = src_filter=+
-HAS_ANYCUBIC_TFT_EXTUI = src_filter=+
EXTUI_EXAMPLE = src_filter=+
MALYAN_LCD = src_filter=+
-HAS_SPI_LCD = src_filter=+
USB_FLASH_DRIVE_SUPPORT = src_filter=+
AUTO_BED_LEVELING_BILINEAR = src_filter=+
AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+