diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 2a4e958d9b..c907cc0a52 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -2116,10 +2116,20 @@
//
//#define FSMC_GRAPHICAL_TFT
+//
+// TFT Little VGL UI
+//
+//#define TFT_LITTLE_VGL_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
+//
+// Robin nano v2.0 SPI touch screen
+//
+//#define SPI_GRAPHICAL_TFT
+
//
// ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8
//
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index 3b0ba07c16..df04ba2d7f 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -59,6 +59,12 @@
#include "gcode/parser.h"
#include "gcode/queue.h"
+#if ENABLED(TFT_LITTLE_VGL_UI)
+ #include "lvgl.h"
+ #include "lcd/extui/lib/mks_ui/inc/tft_lvgl_configuration.h"
+ #include "lcd/extui/lib/mks_ui/inc/draw_ui.h"
+#endif
+
#if ENABLED(DIRECT_STEPPING)
#include "feature/direct_stepping.h"
#endif
@@ -726,6 +732,10 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
// Direct Stepping
TERN_(DIRECT_STEPPING, page_manager.write_responses());
+
+ #if ENABLED(TFT_LITTLE_VGL_UI)
+ LV_TASK_HANDLER();
+ #endif
}
/**
@@ -1141,6 +1151,10 @@ void setup() {
SETUP_RUN(page_manager.init());
#endif
+ #if ENABLED(TFT_LITTLE_VGL_UI)
+ SETUP_RUN(tft_lvgl_init());
+ #endif
+
marlin_state = MF_RUNNING;
SETUP_LOG("setup() completed.");
@@ -1173,5 +1187,7 @@ void loop() {
endstops.event_handler();
+ TERN_(TFT_LITTLE_VGL_UI, printer_state_polling());
+
} while (ENABLED(__AVR__)); // Loop forever on slower (AVR) boards
}
diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h
index 11cf582637..b2addd6561 100644
--- a/Marlin/src/inc/Conditionals_LCD.h
+++ b/Marlin/src/inc/Conditionals_LCD.h
@@ -241,6 +241,8 @@
#define DOGLCD
#define IS_ULTIPANEL
#define DELAYED_BACKLIGHT_INIT
+#elif ENABLED(SPI_GRAPHICAL_TFT)
+ #define DELAYED_BACKLIGHT_INIT
#endif
/**
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp
new file mode 100644
index 0000000000..804bc6548c
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp
@@ -0,0 +1,271 @@
+/**
+ * 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 ENABLED(SPI_GRAPHICAL_TFT)
+
+ #include
+ #include "../../../../inc/MarlinConfig.h"
+ #include "SPI_TFT.h"
+
+ TFT SPI_TFT;
+
+ #ifndef SPI_TFT_MISO_PIN
+ #define SPI_TFT_MISO_PIN PA6
+ #endif
+ #ifndef SPI_TFT_MOSI_PIN
+ #define SPI_TFT_MOSI_PIN PA7
+ #endif
+ #ifndef SPI_TFT_SCK_PIN
+ #define SPI_TFT_SCK_PIN PA5
+ #endif
+ #ifndef SPI_TFT_CS_PIN
+ #define SPI_TFT_CS_PIN PD11
+ #endif
+ #ifndef SPI_TFT_DC_PIN
+ #define SPI_TFT_DC_PIN PD10
+ #endif
+ #ifndef SPI_TFT_RST_PIN
+ #define SPI_TFT_RST_PIN PC6
+ #endif
+
+// use SPI1 for the spi tft.
+ void TFT::spi_init(uint8_t spiRate) {
+
+ SPI_TFT_CS_H;
+
+ /**
+ * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz
+ * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1
+ * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2
+ */
+ uint8_t clock;
+ switch (spiRate) {
+ case SPI_FULL_SPEED: clock = SPI_CLOCK_DIV4; break;
+ case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break;
+ case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break;
+ case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break;
+ case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break;
+ case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break;
+ default: clock = SPI_CLOCK_DIV2; // Default from the SPI library
+ }
+ SPI.setModule(1);
+ SPI.begin();
+ SPI.setClockDivider(clock);
+ SPI.setBitOrder(MSBFIRST);
+ SPI.setDataMode(SPI_MODE0);
+ }
+
+ uint8_t TFT::spi_Rec() {
+ uint8_t returnByte = SPI.transfer(ff);
+ return returnByte;
+ }
+
+ uint8_t TFT::spi_read_write_byte(uint8_t data) {
+ uint8_t returnByte = SPI.transfer(data);
+ return returnByte;
+ }
+
+/**
+ * @brief Receive a number of bytes from the SPI port to a buffer
+ *
+ * @param buf Pointer to starting address of buffer to write to.
+ * @param nbyte Number of bytes to receive.
+ * @return Nothing
+ *
+ * @details Uses DMA
+ */
+ void TFT::spi_Read(uint8_t* buf, uint16_t nbyte) {SPI.dmaTransfer(0, const_cast(buf), nbyte);}
+
+/**
+ * @brief Send a single byte on SPI port
+ *
+ * @param b Byte to send
+ *
+ * @details
+ */
+ void TFT::spi_Send(uint8_t b) {SPI.send(b);}
+
+/**
+ * @brief Write token and then write from 512 byte buffer to SPI (for SD card)
+ *
+ * @param buf Pointer with buffer start address
+ * @return Nothing
+ *
+ * @details Use DMA
+ */
+ void TFT::spi_SendBlock(uint8_t token, const uint8_t* buf) {
+ SPI.send(token);
+ SPI.dmaSend(const_cast(buf), 512);
+ }
+
+ void TFT::LCD_WR_REG(uint8_t cmd) {
+ SPI_TFT_CS_L;
+ SPI_TFT_DC_L;
+ spi_Send(cmd);
+ SPI_TFT_CS_H;
+ }
+ void TFT::LCD_WR_DATA(uint8_t data) {
+ SPI_TFT_CS_L;
+ SPI_TFT_DC_H;
+ spi_Send(data);
+ SPI_TFT_CS_H;
+ }
+ void TFT::LCD_WriteRAM_Prepare() {LCD_WR_REG(0X2C);}
+ void TFT::SetCursor(uint16_t x, uint16_t y) {
+ LCD_WR_REG(0x2a);
+ LCD_WR_DATA(x >> 8);
+ LCD_WR_DATA(x);
+ LCD_WR_DATA(x >> 8);
+ LCD_WR_DATA(x);
+
+ LCD_WR_REG(0x2b);
+ LCD_WR_DATA(y >> 8);
+ LCD_WR_DATA(y);
+ LCD_WR_DATA(y >> 8);
+ LCD_WR_DATA(y);
+ }
+ void TFT::SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height) {
+ LCD_WR_REG(0x2a);
+ LCD_WR_DATA(x >> 8);
+ LCD_WR_DATA(x);
+ LCD_WR_DATA((x + with) >> 8);
+ LCD_WR_DATA((x + with));
+
+ LCD_WR_REG(0x2b);
+ LCD_WR_DATA(y >> 8);
+ LCD_WR_DATA(y);
+ LCD_WR_DATA((y + height) >> 8);
+ LCD_WR_DATA(y + height);
+ }
+ void TFT::LCD_init() {
+ SPI_TFT_RST_H;
+ delay(150);
+ SPI_TFT_RST_L;
+ delay(150);
+ SPI_TFT_RST_H;
+
+ delay(120);
+ LCD_WR_REG(0x11);
+ delay(120);
+
+ LCD_WR_REG(0xf0);
+ LCD_WR_DATA(0xc3);
+ LCD_WR_REG(0xf0);
+ LCD_WR_DATA(0x96);
+
+ LCD_WR_REG(0x36);
+ LCD_WR_DATA(0x28);
+
+ LCD_WR_REG(0x3A);
+ LCD_WR_DATA(0x55);
+
+ LCD_WR_REG(0xB4);
+ LCD_WR_DATA(0x01);
+ LCD_WR_REG(0xB7);
+ LCD_WR_DATA(0xC6);
+ LCD_WR_REG(0xe8);
+ LCD_WR_DATA(0x40);
+ LCD_WR_DATA(0x8a);
+ LCD_WR_DATA(0x00);
+ LCD_WR_DATA(0x00);
+ LCD_WR_DATA(0x29);
+ LCD_WR_DATA(0x19);
+ LCD_WR_DATA(0xa5);
+ LCD_WR_DATA(0x33);
+ LCD_WR_REG(0xc1);
+ LCD_WR_DATA(0x06);
+ LCD_WR_REG(0xc2);
+ LCD_WR_DATA(0xa7);
+ LCD_WR_REG(0xc5);
+ LCD_WR_DATA(0x18);
+ LCD_WR_REG(0xe0); // Positive Voltage Gamma Control
+ LCD_WR_DATA(0xf0);
+ LCD_WR_DATA(0x09);
+ LCD_WR_DATA(0x0b);
+ LCD_WR_DATA(0x06);
+ LCD_WR_DATA(0x04);
+ LCD_WR_DATA(0x15);
+ LCD_WR_DATA(0x2f);
+ LCD_WR_DATA(0x54);
+ LCD_WR_DATA(0x42);
+ LCD_WR_DATA(0x3c);
+ LCD_WR_DATA(0x17);
+ LCD_WR_DATA(0x14);
+ LCD_WR_DATA(0x18);
+ LCD_WR_DATA(0x1b);
+ LCD_WR_REG(0xe1); // Negative Voltage Gamma Control
+ LCD_WR_DATA(0xf0);
+ LCD_WR_DATA(0x09);
+ LCD_WR_DATA(0x0b);
+ LCD_WR_DATA(0x06);
+ LCD_WR_DATA(0x04);
+ LCD_WR_DATA(0x03);
+ LCD_WR_DATA(0x2d);
+ LCD_WR_DATA(0x43);
+ LCD_WR_DATA(0x42);
+ LCD_WR_DATA(0x3b);
+ LCD_WR_DATA(0x16);
+ LCD_WR_DATA(0x14);
+ LCD_WR_DATA(0x17);
+ LCD_WR_DATA(0x1b);
+ LCD_WR_REG(0xf0);
+ LCD_WR_DATA(0x3c);
+ LCD_WR_REG(0xf0);
+ LCD_WR_DATA(0x69);
+ delay(120); // Delay 120ms
+ LCD_WR_REG(0x29); // Display ON
+
+ LCD_clear(0x0000); //
+ SPI_TFT_BLK_H;
+
+ }
+ void TFT::LCD_clear(uint16_t color) {
+ unsigned int i, m;
+ uint32_t count;
+ uint8_t tbuf[960];
+
+ SetCursor(0, 0);
+ SetWindows(0, 0, 480 - 1, 320 - 1);
+ LCD_WriteRAM_Prepare();
+ SPI_TFT_CS_L;
+ SPI_TFT_DC_H;
+ for (i = 0; i < 960;) {
+ tbuf[i] = color >> 8;
+ tbuf[i + 1] = color;
+ i += 2;
+ }
+ for (i = 0; i < 320; i++) {
+ // for(m=0;m<480;m++)
+ // {
+ // LCD_WR_DATA(color>>8);
+ // LCD_WR_DATA(color);
+
+ SPI.dmaSend(tbuf, 960, true);
+ // SPI_TFT_CS_H;
+ // }
+ }
+ SPI_TFT_CS_H;
+ }
+
+#endif // SPI_GRAPHICAL_TFT
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h
new file mode 100644
index 0000000000..7d01d7ac37
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h
@@ -0,0 +1,55 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+#define SPI_TFT_CS_H OUT_WRITE(SPI_TFT_CS_PIN, HIGH)
+#define SPI_TFT_CS_L OUT_WRITE(SPI_TFT_CS_PIN, LOW)
+
+#define SPI_TFT_DC_H OUT_WRITE(SPI_TFT_DC_PIN, HIGH)
+#define SPI_TFT_DC_L OUT_WRITE(SPI_TFT_DC_PIN, LOW)
+
+#define SPI_TFT_RST_H OUT_WRITE(SPI_TFT_RST_PIN, HIGH)
+#define SPI_TFT_RST_L OUT_WRITE(SPI_TFT_RST_PIN, LOW)
+
+#define SPI_TFT_BLK_H OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH)
+#define SPI_TFT_BLK_L OUT_WRITE(LCD_BACKLIGHT_PIN, LOW)
+
+class TFT {
+public:
+ void spi_init(uint8_t spiRate);
+ uint8_t spi_Rec();
+ uint8_t spi_read_write_byte(uint8_t data);
+ void spi_Read(uint8_t* buf, uint16_t nbyte);
+ void spi_Send(uint8_t b);
+ void spi_SendBlock(uint8_t token, const uint8_t* buf);
+ void LCD_WR_REG(uint8_t cmd);
+ void LCD_WR_DATA(uint8_t data);
+ void SetCursor(uint16_t x, uint16_t y);
+ void SetWindows(uint16_t x, uint16_t y, uint16_t with, uint16_t height);
+ void LCD_init();
+ void LCD_clear(uint16_t color);
+ void LCD_WriteRAM_Prepare();
+};
+
+extern TFT SPI_TFT;
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp
new file mode 100644
index 0000000000..21ed3f999c
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.cpp
@@ -0,0 +1,395 @@
+/**
+ * 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 1 // ENABLED(SPI_FLASH)
+#if ENABLED(TFT_LITTLE_VGL_UI)
+
+#include
+#include "../../../../inc/MarlinConfig.h"
+
+#include "W25Qxx.h"
+
+#ifndef SPI_FLASH_MISO_PIN
+ #define SPI_FLASH_MISO_PIN W25QXX_MISO_PIN
+#endif
+#ifndef SPI_FLASH_MOSI_PIN
+ #define SPI_FLASH_MOSI_PIN W25QXX_MOSI_PIN
+#endif
+#ifndef SPI_FLASH_SCK_PIN
+ #define SPI_FLASH_SCK_PIN W25QXX_SCK_PIN
+#endif
+#ifndef SPI_FLASH_CS_PIN
+ #define SPI_FLASH_CS_PIN W25QXX_CS_PIN
+#endif
+
+#define W25QXX_CS_H OUT_WRITE(SPI_FLASH_CS_PIN, HIGH)
+#define W25QXX_CS_L OUT_WRITE(SPI_FLASH_CS_PIN, LOW)
+
+ext_FLASH W25QXX;
+
+void ext_FLASH::init(uint8_t spiRate) {
+
+ OUT_WRITE(SPI_FLASH_CS_PIN, HIGH);
+
+ /**
+ * STM32F1 APB2 = 72MHz, APB1 = 36MHz, max SPI speed of this MCU if 18Mhz
+ * STM32F1 has 3 SPI ports, SPI1 in APB2, SPI2/SPI3 in APB1
+ * so the minimum prescale of SPI1 is DIV4, SPI2/SPI3 is DIV2
+ */
+ #if SPI_DEVICE == 1
+ #define SPI_CLOCK_MAX SPI_CLOCK_DIV4
+ #else
+ #define SPI_CLOCK_MAX SPI_CLOCK_DIV2
+ #endif
+ uint8_t clock;
+ switch (spiRate) {
+ case SPI_FULL_SPEED: clock = SPI_CLOCK_MAX; break;
+ case SPI_HALF_SPEED: clock = SPI_CLOCK_DIV4; break;
+ case SPI_QUARTER_SPEED: clock = SPI_CLOCK_DIV8; break;
+ case SPI_EIGHTH_SPEED: clock = SPI_CLOCK_DIV16; break;
+ case SPI_SPEED_5: clock = SPI_CLOCK_DIV32; break;
+ case SPI_SPEED_6: clock = SPI_CLOCK_DIV64; break;
+ default: clock = SPI_CLOCK_DIV2;// Default from the SPI library
+ }
+ SPI.setModule(SPI_DEVICE);
+ SPI.begin();
+ SPI.setClockDivider(clock);
+ SPI.setBitOrder(MSBFIRST);
+ SPI.setDataMode(SPI_MODE0);
+}
+
+/**
+ * @brief Receive a single byte from the SPI port.
+ *
+ * @return Byte received
+ *
+ * @details
+ */
+uint8_t ext_FLASH::spi_flash_Rec() {
+ uint8_t returnByte = SPI.transfer(ff);
+ return returnByte;
+}
+
+uint8_t ext_FLASH::spi_flash_read_write_byte(uint8_t data) {
+ uint8_t returnByte = SPI.transfer(data);
+ return returnByte;
+}
+
+/**
+ * @brief Receive a number of bytes from the SPI port to a buffer
+ *
+ * @param buf Pointer to starting address of buffer to write to.
+ * @param nbyte Number of bytes to receive.
+ * @return Nothing
+ *
+ * @details Uses DMA
+ */
+void ext_FLASH::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { SPI.dmaTransfer(0, const_cast(buf), nbyte); }
+
+/**
+ * @brief Send a single byte on SPI port
+ *
+ * @param b Byte to send
+ *
+ * @details
+ */
+void ext_FLASH::spi_flash_Send(uint8_t b) { SPI.send(b); }
+
+/**
+ * @brief Write token and then write from 512 byte buffer to SPI (for SD card)
+ *
+ * @param buf Pointer with buffer start address
+ * @return Nothing
+ *
+ * @details Use DMA
+ */
+void ext_FLASH::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) {
+ SPI.send(token);
+ SPI.dmaSend(const_cast(buf), 512);
+}
+
+uint16_t ext_FLASH::W25QXX_ReadID(void) {
+ uint16_t Temp = 0;
+ W25QXX_CS_L;
+ spi_flash_Send(0x90);//���Ͷ�ȡID����
+ spi_flash_Send(0x00);
+ spi_flash_Send(0x00);
+ spi_flash_Send(0x00);
+ Temp |= spi_flash_Rec() << 8;
+ Temp |= spi_flash_Rec();
+ W25QXX_CS_H;
+ return Temp;
+}
+
+void ext_FLASH::SPI_FLASH_WriteEnable(void) {
+ /* Select the FLASH: Chip Select low */
+ W25QXX_CS_L;
+ /* Send "Write Enable" instruction */
+ spi_flash_Send(W25X_WriteEnable);
+ /* Deselect the FLASH: Chip Select high */
+ W25QXX_CS_H;
+}
+
+/*******************************************************************************
+* Function Name : SPI_FLASH_WaitForWriteEnd
+* Description : Polls the status of the Write In Progress (WIP) flag in the
+* FLASH's status register and loop until write opertaion
+* has completed.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void ext_FLASH::SPI_FLASH_WaitForWriteEnd(void) {
+ uint8_t FLASH_Status = 0;
+
+ /* Select the FLASH: Chip Select low */
+ W25QXX_CS_L;
+ /* Send "Read Status Register" instruction */
+ spi_flash_Send(W25X_ReadStatusReg);
+
+ /* Loop as long as the memory is busy with a write cycle */
+ do
+ /* Send a dummy byte to generate the clock needed by the FLASH
+ and put the value of the status register in FLASH_Status variable */
+ FLASH_Status = spi_flash_Rec();
+ while ((FLASH_Status & WIP_Flag) == 0x01); /* Write in progress */
+
+ /* Deselect the FLASH: Chip Select high */
+ W25QXX_CS_H;
+}
+
+void ext_FLASH::SPI_FLASH_SectorErase(uint32_t SectorAddr) {
+ /* Send write enable instruction */
+ SPI_FLASH_WriteEnable();
+
+ /* Sector Erase */
+ /* Select the FLASH: Chip Select low */
+ W25QXX_CS_L;
+ /* Send Sector Erase instruction */
+ spi_flash_Send(W25X_SectorErase);
+ /* Send SectorAddr high nibble address byte */
+ spi_flash_Send((SectorAddr & 0xFF0000) >> 16);
+ /* Send SectorAddr medium nibble address byte */
+ spi_flash_Send((SectorAddr & 0xFF00) >> 8);
+ /* Send SectorAddr low nibble address byte */
+ spi_flash_Send(SectorAddr & 0xFF);
+ /* Deselect the FLASH: Chip Select high */
+
+ W25QXX_CS_H;
+ /* Wait the end of Flash writing */
+ SPI_FLASH_WaitForWriteEnd();
+}
+
+void ext_FLASH::SPI_FLASH_BlockErase(uint32_t BlockAddr) {
+ SPI_FLASH_WriteEnable();
+ W25QXX_CS_L;
+ /* Send Sector Erase instruction */
+ spi_flash_Send(W25X_BlockErase);
+ /* Send SectorAddr high nibble address byte */
+ spi_flash_Send((BlockAddr & 0xFF0000) >> 16);
+ /* Send SectorAddr medium nibble address byte */
+ spi_flash_Send((BlockAddr & 0xFF00) >> 8);
+ /* Send SectorAddr low nibble address byte */
+ spi_flash_Send(BlockAddr & 0xFF);
+
+ W25QXX_CS_H;
+
+ SPI_FLASH_WaitForWriteEnd();
+}
+
+/*******************************************************************************
+* Function Name : SPI_FLASH_BulkErase
+* Description : Erases the entire FLASH.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void ext_FLASH::SPI_FLASH_BulkErase(void) {
+ /* Send write enable instruction */
+ SPI_FLASH_WriteEnable();
+
+ /* Bulk Erase */
+ /* Select the FLASH: Chip Select low */
+ W25QXX_CS_L;
+
+ /* Send Bulk Erase instruction */
+ spi_flash_Send(W25X_ChipErase);
+ /* Deselect the FLASH: Chip Select high */
+ W25QXX_CS_H;
+ /* Wait the end of Flash writing */
+ SPI_FLASH_WaitForWriteEnd();
+}
+
+/*******************************************************************************
+* Function Name : SPI_FLASH_PageWrite
+* Description : Writes more than one byte to the FLASH with a single WRITE
+* cycle(Page WRITE sequence). The number of byte can't exceed
+* the FLASH page size.
+* Input : - pBuffer : pointer to the buffer containing the data to be
+* written to the FLASH.
+* - WriteAddr : FLASH's internal address to write to.
+* - NumByteToWrite : number of bytes to write to the FLASH,
+* must be equal or less than "SPI_FLASH_PageSize" value.
+* Output : None
+* Return : None
+*******************************************************************************/
+void ext_FLASH::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) {
+ /* Enable the write access to the FLASH */
+ SPI_FLASH_WriteEnable();
+
+ /* Select the FLASH: Chip Select low */
+ W25QXX_CS_L;
+ /* Send "Write to Memory " instruction */
+ spi_flash_Send(W25X_PageProgram);
+ /* Send WriteAddr high nibble address byte to write to */
+ spi_flash_Send((WriteAddr & 0xFF0000) >> 16);
+ /* Send WriteAddr medium nibble address byte to write to */
+ spi_flash_Send((WriteAddr & 0xFF00) >> 8);
+ /* Send WriteAddr low nibble address byte to write to */
+ spi_flash_Send(WriteAddr & 0xFF);
+
+ NOMORE(NumByteToWrite, SPI_FLASH_PerWritePageSize);
+
+ /* while there is data to be written on the FLASH */
+ while (NumByteToWrite--) {
+ /* Send the current byte */
+ spi_flash_Send(*pBuffer);
+ /* Point on the next byte to be written */
+ pBuffer++;
+ }
+
+ /* Deselect the FLASH: Chip Select high */
+ W25QXX_CS_H;
+
+ /* Wait the end of Flash writing */
+ SPI_FLASH_WaitForWriteEnd();
+}
+
+/*******************************************************************************
+* Function Name : SPI_FLASH_BufferWrite
+* Description : Writes block of data to the FLASH. In this function, the
+* number of WRITE cycles are reduced, using Page WRITE sequence.
+* Input : - pBuffer : pointer to the buffer containing the data to be
+* written to the FLASH.
+* - WriteAddr : FLASH's internal address to write to.
+* - NumByteToWrite : number of bytes to write to the FLASH.
+* Output : None
+* Return : None
+*******************************************************************************/
+void ext_FLASH::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) {
+ uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0;
+
+ Addr = WriteAddr % SPI_FLASH_PageSize;
+ count = SPI_FLASH_PageSize - Addr;
+ NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;
+ NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;
+
+ if (Addr == 0) { /* WriteAddr is SPI_FLASH_PageSize aligned */
+ if (NumOfPage == 0) { /* NumByteToWrite < SPI_FLASH_PageSize */
+ SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
+ }
+ else { /* NumByteToWrite > SPI_FLASH_PageSize */
+ while (NumOfPage--) {
+ SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
+ WriteAddr += SPI_FLASH_PageSize;
+ pBuffer += SPI_FLASH_PageSize;
+ }
+ SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
+ }
+ }
+ else { /* WriteAddr is not SPI_FLASH_PageSize aligned */
+ if (NumOfPage == 0) { /* NumByteToWrite < SPI_FLASH_PageSize */
+ if (NumOfSingle > count) { /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */
+ temp = NumOfSingle - count;
+ SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
+ WriteAddr += count;
+ pBuffer += count;
+ SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);
+ }
+ else {
+ SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
+ }
+ }
+ else { /* NumByteToWrite > SPI_FLASH_PageSize */
+ NumByteToWrite -= count;
+ NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;
+ NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;
+
+ SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
+ WriteAddr += count;
+ pBuffer += count;
+
+ while (NumOfPage--) {
+ SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
+ WriteAddr += SPI_FLASH_PageSize;
+ pBuffer += SPI_FLASH_PageSize;
+ }
+
+ if (NumOfSingle != 0)
+ SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
+ }
+ }
+}
+
+/*******************************************************************************
+* Function Name : SPI_FLASH_BufferRead
+* Description : Reads a block of data from the FLASH.
+* Input : - pBuffer : pointer to the buffer that receives the data read
+* from the FLASH.
+* - ReadAddr : FLASH's internal address to read from.
+* - NumByteToRead : number of bytes to read from the FLASH.
+* Output : None
+* Return : None
+*******************************************************************************/
+void ext_FLASH::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) {
+ /* Select the FLASH: Chip Select low */
+ W25QXX_CS_L;
+
+ /* Send "Read from Memory " instruction */
+ spi_flash_Send(W25X_ReadData);
+
+ /* Send ReadAddr high nibble address byte to read from */
+ spi_flash_Send((ReadAddr & 0xFF0000) >> 16);
+ /* Send ReadAddr medium nibble address byte to read from */
+ spi_flash_Send((ReadAddr & 0xFF00) >> 8);
+ /* Send ReadAddr low nibble address byte to read from */
+ spi_flash_Send(ReadAddr & 0xFF);
+
+ if (NumByteToRead < 33) {
+ while (NumByteToRead--) { /* while there is data to be read */
+ /* Read a byte from the FLASH */
+ *pBuffer = spi_flash_Rec();
+ /* Point to the next location where the byte read will be saved */
+ pBuffer++;
+ }
+ }
+ else {
+ spi_flash_Read(pBuffer, NumByteToRead);
+ }
+ W25QXX_CS_H;
+}
+
+void ext_FLASH::lv_pic_read(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) {SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size);}
+
+#endif // TFT_LITTLE_VGL_UI
+#endif // 1 ... SPI_FLASH
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h
new file mode 100644
index 0000000000..89b22c30fc
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/W25Qxx.h
@@ -0,0 +1,127 @@
+/**
+ * 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
+
+//#ifdef __cplusplus
+//extern "C" { /* C-declarations for C++ */
+//#endif
+
+#include
+
+#define W25X_WriteEnable 0x06
+#define W25X_WriteDisable 0x04
+#define W25X_ReadStatusReg 0x05
+#define W25X_WriteStatusReg 0x01
+#define W25X_ReadData 0x03
+#define W25X_FastReadData 0x0B
+#define W25X_FastReadDual 0x3B
+#define W25X_PageProgram 0x02
+#define W25X_BlockErase 0xD8
+#define W25X_SectorErase 0x20
+#define W25X_ChipErase 0xC7
+#define W25X_PowerDown 0xB9
+#define W25X_ReleasePowerDown 0xAB
+#define W25X_DeviceID 0xAB
+#define W25X_ManufactDeviceID 0x90
+#define W25X_JedecDeviceID 0x9F
+
+#define WIP_Flag 0x01 /* Write In Progress (WIP) flag */
+
+#define Dummy_Byte 0xA5
+
+#define SPI_FLASH_SectorSize 4096
+#define SPI_FLASH_PageSize 256
+#define SPI_FLASH_PerWritePageSize 256
+
+#if 0
+
+ #define PIC_NAME_MAX_LEN 50
+
+ #define LOGO_MAX_SIZE (300*1024)//logo���ֵ
+ #define TITLELOGO_MAX_SIZE (150*1024)//logo���ֵ
+ #define DEFAULT_VIEW_MAX_SIZE (200*200*2)
+ #define FLASH_VIEW_MAX_SIZE (200*200*2)
+
+ //ͼƬ
+ //Robin2�洢��ַ
+ #define PIC_NAME_ADDR 0x003000 //ͼƬ��Ϣ�洢��ַ��ͼƬ����
+ #define PIC_SIZE_ADDR 0x007000 //ͼƬ��Ϣ�洢��ַ��ͼƬ��Сֵ
+ #define PIC_COUNTER_ADDR 0x008000 //ͼƬ������ֵ�洢��ַ
+ #define PIC_LOGO_ADDR 0x009000 //ͼƬlogo�洢��ַ
+ //#define PIC_DATA_ADDR 0x02f000 //ͼƬ���ݴ洢��ַ
+
+ #define DEFAULT_VIEW_ADDR 0XC5800
+ #define BAK_VIEW_ADDR (DEFAULT_VIEW_ADDR+90*1024)
+ #define PIC_ICON_LOGO_ADDR (BAK_VIEW_ADDR+80*1024)
+
+ #define PIC_DATA_ADDR (PIC_ICON_LOGO_ADDR+350*1024) //ͼƬ���ݴ洢��ַ//(800*240)
+
+ // �ֿ�
+ #define FONTINFOADDR 0x600000 // 6M�Ժ��ַΪ�ֿ�
+ #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024
+ #define GBK_FLASH_ADDR (UNIGBK_FLASH_ADDR+180224) // 176*1024
+
+ #define PER_PIC_MAX_SPACE (32*1024) // Ϊ�˷�ֹ����Խ������⣬ÿ��СͼƬ�����仮��Ӧ��ȡ�ܹ�����4K��ֵ
+
+ //
+ union union32 {
+ uint8_t bytes[4];
+ uint32_t dwords;
+ };
+ // ͼƬ��Ϣ�ṹ��
+ struct pic_msg {
+ uint8_t name[PIC_NAME_MAX_LEN];
+ union union32 size;
+ };
+
+ typedef struct pic_msg PIC_MSG;
+
+#endif // if 0
+
+class ext_FLASH {
+public:
+ void init(uint8_t spiRate);
+ static uint8_t spi_flash_Rec();
+ static uint8_t spi_flash_read_write_byte(uint8_t data);
+ static void spi_flash_Read(uint8_t* buf, uint16_t nbyte);
+ static void spi_flash_Send(uint8_t b);
+ static void spi_flash_SendBlock(uint8_t token, const uint8_t* buf);
+ static uint16_t W25QXX_ReadID(void);
+ static void SPI_FLASH_WriteEnable(void);
+ static void SPI_FLASH_WaitForWriteEnd(void);
+ static void SPI_FLASH_SectorErase(uint32_t SectorAddr);
+ static void SPI_FLASH_BlockErase(uint32_t BlockAddr);
+ static void SPI_FLASH_BulkErase(void);
+ static void SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
+ static void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
+ static void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead);
+ //uint32_t lv_get_pic_addr(uint8_t *Pname);
+ void lv_pic_read(uint8_t *P_Rbuff, uint32_t addr, uint32_t size);
+};
+
+extern ext_FLASH W25QXX;
+
+//extern uint32_t lv_get_pic_addr(uint8_t *Pname);
+
+//#ifdef __cplusplus
+//} /* C-declarations for C++ */
+//#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp
new file mode 100644
index 0000000000..8193563e41
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp
@@ -0,0 +1,127 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "lv_conf.h"
+#include "draw_ui.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+#include "../../../../module/temperature.h"
+
+static lv_obj_t * scr;
+static lv_obj_t * fw_type, *board, *fw_version;
+
+#define ID_A_RETURN 1
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_A_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+ // do nothing
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ clear_cur_ui();
+ draw_return_ui();
+ }
+ break;
+ }
+}
+
+void lv_draw_about(void) {
+ lv_obj_t *buttonBack, *label_Back;
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ABOUT_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = ABOUT_UI;
+ }
+ disp_state = ABOUT_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+ #if 1
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_A_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+ /*Create a label on the Image button*/
+
+ label_Back = lv_label_create(buttonBack, NULL);
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+
+ fw_version = lv_label_create(scr, NULL);
+ lv_obj_set_style(fw_version, &tft_style_lable_rel);
+ lv_label_set_text(fw_version, "Version: V_2.0.5.3");
+ lv_obj_align(fw_version, NULL, LV_ALIGN_CENTER, 0, -60);
+
+ fw_type = lv_label_create(scr, NULL);
+ lv_obj_set_style(fw_type, &tft_style_lable_rel);
+ #if (MOTHERBOARD == BOARD_MKS_ROBIN_PRO)
+ lv_label_set_text(fw_type, "Firmware: Robin_Pro35");
+ #elif (MOTHERBOARD == BOARD_MKS_ROBIN_NANO)
+ lv_label_set_text(fw_type, "Firmware: Robin_Nano35");
+ #endif
+ lv_obj_align(fw_type, NULL, LV_ALIGN_CENTER, 0, -20);
+
+ board = lv_label_create(scr, NULL);
+ lv_obj_set_style(board, &tft_style_lable_rel);
+ #if (MOTHERBOARD == BOARD_MKS_ROBIN_PRO)
+ lv_label_set_text(board, "Board: MKS Robin pro");
+ #elif (MOTHERBOARD == BOARD_MKS_ROBIN_NANO)
+ lv_label_set_text(board, "Board: MKS Robin nano");
+ #endif
+
+ lv_obj_align(board, NULL, LV_ALIGN_CENTER, 0, 20);
+}
+
+void lv_clear_about() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h
new file mode 100644
index 0000000000..5904a8a2e9
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h
@@ -0,0 +1,34 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_about(void);
+extern void lv_clear_about();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp
new file mode 100644
index 0000000000..6d44ecb71c
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp
@@ -0,0 +1,336 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "lv_conf.h"
+#include "draw_ui.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+#include "../../../../module/temperature.h"
+#include "../../../../module/planner.h"
+
+static lv_obj_t * scr;
+static lv_obj_t * labelStep, *buttonStep, *buttonMov, *buttonExt;
+static lv_obj_t * labelMov, *labelExt;
+static lv_obj_t * printSpeedText;
+
+#define ID_C_ADD 1
+#define ID_C_DEC 2
+#define ID_C_MOVE 3
+#define ID_C_EXT 4
+#define ID_C_STEP 5
+#define ID_C_RETURN 6
+
+static uint8_t speedType;
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_C_ADD:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (speedType == 0) {
+ if (feedrate_percentage < MAX_EXT_SPEED_PERCENT - uiCfg.stepPrintSpeed)
+ feedrate_percentage += uiCfg.stepPrintSpeed;
+ else
+ feedrate_percentage = MAX_EXT_SPEED_PERCENT;
+ }
+ else if (speedType == 1) {
+ if (planner.flow_percentage[0] < MAX_EXT_SPEED_PERCENT - uiCfg.stepPrintSpeed)
+ planner.flow_percentage[0] += uiCfg.stepPrintSpeed;
+ else
+ planner.flow_percentage[0] = MAX_EXT_SPEED_PERCENT;
+ //planner.e_factor[0]= planner.flow_percentage[0]*0.01;
+ //planner.flow_percentage[1] = planner.flow_percentage[0];
+ //planner.e_factor[1]= planner.flow_percentage[1]*0.01;
+ planner.refresh_e_factor(0);
+ if (EXTRUDERS == 2) {
+ planner.flow_percentage[1] = planner.flow_percentage[0];
+ planner.refresh_e_factor(1);
+ }
+ }
+ disp_print_speed();
+ }
+ break;
+ case ID_C_DEC:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (speedType == 0) {
+ if (feedrate_percentage > MIN_EXT_SPEED_PERCENT + uiCfg.stepPrintSpeed)
+ feedrate_percentage -= uiCfg.stepPrintSpeed;
+ else
+ feedrate_percentage = MIN_EXT_SPEED_PERCENT;
+ }
+ else if (speedType == 1) {
+ if (planner.flow_percentage[0] > MIN_EXT_SPEED_PERCENT + uiCfg.stepPrintSpeed)
+ planner.flow_percentage[0] -= uiCfg.stepPrintSpeed;
+ else
+ planner.flow_percentage[0] = MIN_EXT_SPEED_PERCENT;
+ //planner.e_factor[0]= planner.flow_percentage[0] * 0.01;
+ //planner.flow_percentage[1] = planner.flow_percentage[0];
+ //planner.e_factor[1]= planner.flow_percentage[1] * 0.01;
+ planner.refresh_e_factor(0);
+ if (EXTRUDERS == 2) {
+ planner.flow_percentage[1] = planner.flow_percentage[0];
+ planner.refresh_e_factor(1);
+ }
+ }
+ disp_print_speed();
+ }
+ break;
+ case ID_C_MOVE:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ speedType = 0;
+ disp_speed_type();
+ disp_print_speed();
+ }
+ break;
+ case ID_C_EXT:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ speedType = 1;
+ disp_speed_type();
+ disp_print_speed();
+ }
+ break;
+ case ID_C_STEP:
+ if (event == LV_EVENT_CLICKED) {
+
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (uiCfg.stepPrintSpeed == 1)
+ uiCfg.stepPrintSpeed = 5;
+ else if (uiCfg.stepPrintSpeed == 5)
+ uiCfg.stepPrintSpeed = 10;
+ else
+ uiCfg.stepPrintSpeed = 1;
+ disp_speed_step();
+ }
+ break;
+ case ID_C_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ clear_cur_ui();
+ draw_return_ui();
+ }
+ break;
+ }
+}
+
+void lv_draw_change_speed(void) {
+ lv_obj_t *buttonAdd, *buttonDec;
+ lv_obj_t *buttonBack;
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != CHANGE_SPEED_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = CHANGE_SPEED_UI;
+ }
+ disp_state = CHANGE_SPEED_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ buttonAdd = lv_imgbtn_create(scr, NULL);
+ buttonDec = lv_imgbtn_create(scr, NULL);
+ buttonMov = lv_imgbtn_create(scr, NULL);
+ buttonExt = lv_imgbtn_create(scr, NULL);
+ buttonStep = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_C_ADD, "bmp_Add.bin", 0);
+ lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW);
+
+ #if 1
+ lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_C_DEC, "bmp_Dec.bin", 0);
+ lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+
+ lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonMov, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonExt, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_C_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttonMov, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonExt, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonStep, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonMov, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonExt, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ lv_obj_t * labelAdd = lv_label_create(buttonAdd, NULL);
+ lv_obj_t * labelDec = lv_label_create(buttonDec, NULL);
+ labelMov = lv_label_create(buttonMov, NULL);
+ labelExt = lv_label_create(buttonExt, NULL);
+ labelStep = lv_label_create(buttonStep, NULL);
+ lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelAdd, speed_menu.add);
+ lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelDec, speed_menu.dec);
+ lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ disp_speed_type();
+ disp_speed_step();
+
+ printSpeedText = lv_label_create(scr, NULL);
+ lv_obj_set_style(printSpeedText, &tft_style_lable_rel);
+ disp_print_speed();
+}
+
+void disp_speed_step() {
+ if (uiCfg.stepPrintSpeed == 1)
+ lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_Step1_percent.bin", 0);
+ else if (uiCfg.stepPrintSpeed == 5)
+ lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_Step5_percent.bin", 0);
+ else if (uiCfg.stepPrintSpeed == 10)
+ lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, "bmp_Step10_percent.bin", 0);
+
+ if (gCfgItems.multiple_language != 0) {
+ if (uiCfg.stepPrintSpeed == 1) {
+ lv_label_set_text(labelStep, speed_menu.step_1percent);
+ lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else if (uiCfg.stepPrintSpeed == 5) {
+ lv_label_set_text(labelStep, speed_menu.step_5percent);
+ lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else if (uiCfg.stepPrintSpeed == 10) {
+ lv_label_set_text(labelStep, speed_menu.step_10percent);
+ lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ }
+}
+
+void disp_print_speed() {
+ char buf[30] = {0};
+
+ public_buf_l[0] = '\0';
+
+ if (speedType == 0) { //move
+ strcat(public_buf_l, speed_menu.move_speed);
+ strcat(public_buf_l, ": ");
+ sprintf(buf, "%d%%", feedrate_percentage);
+ strcat(public_buf_l, buf);
+ }
+ else if (speedType == 1) { // e1
+ strcat(public_buf_l, speed_menu.extrude_speed);
+ strcat(public_buf_l, ": ");
+ sprintf(buf, "%d%%", planner.flow_percentage[0]);
+ strcat(public_buf_l, buf);
+ }
+ lv_label_set_text(printSpeedText, public_buf_l);
+ lv_obj_align(printSpeedText, NULL, LV_ALIGN_CENTER, 0, -65);
+}
+
+void disp_speed_type() {
+ switch (speedType) {
+ case 1:
+ lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_Extruct_speed_sel.bin", 0);
+ lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_Mov_speed.bin", 0);
+ break;
+
+ default:
+ lv_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, "bmp_Extruct_speed.bin", 0);
+ lv_obj_set_event_cb_mks(buttonMov, event_handler, ID_C_MOVE, "bmp_Mov_speed_sel.bin", 0);
+ break;
+ }
+ lv_obj_refresh_ext_draw_pad(buttonExt);
+ lv_obj_refresh_ext_draw_pad(buttonMov);
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelMov, speed_menu.move);
+ lv_obj_align(labelMov, buttonMov, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelExt, speed_menu.extrude);
+ lv_obj_align(labelExt, buttonExt, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+}
+
+void lv_clear_change_speed() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h
new file mode 100644
index 0000000000..14d2b7cdf4
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h
@@ -0,0 +1,40 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+#define MIN_EXT_SPEED_PERCENT 10
+#define MAX_EXT_SPEED_PERCENT 999
+
+extern void lv_draw_change_speed(void);
+extern void lv_clear_change_speed();
+extern void disp_speed_step();
+extern void disp_print_speed();
+extern void disp_speed_type();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp
new file mode 100644
index 0000000000..5620af8c99
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp
@@ -0,0 +1,343 @@
+/**
+ * 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 .
+ *
+ */
+
+/**
+ * draw_dialog.cpp
+ */
+
+#include "../../../../inc/MarlinConfigPre.h"
+
+#if ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "lv_conf.h"
+#include "draw_ui.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+#include "../../../../sd/cardreader.h"
+#include "../../../../gcode/queue.h"
+#include "../../../../module/temperature.h"
+#include "../../../../module/planner.h"
+
+#if ENABLED(POWER_LOSS_RECOVERY)
+ #include "../../../../feature/powerloss.h"
+#endif
+
+#if ENABLED(PARK_HEAD_ON_PAUSE)
+ #include "../../../../feature/pause.h"
+#endif
+
+static lv_obj_t * scr;
+extern uint8_t sel_id;
+extern uint8_t once_flag;
+extern uint8_t gcode_preview_over;
+uint8_t DialogType;
+
+static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) {
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (DialogType == DIALOG_TYPE_PRINT_FILE) {
+ preview_gcode_prehandle(list_file.file_name[sel_id]);
+ reset_print_time();
+ start_print_time();
+
+ uiCfg.print_state = WORKING;
+ lv_clear_dialog();
+ lv_draw_printing();
+
+ #if ENABLED(SDSUPPORT)
+ if (gcode_preview_over != 1) {
+ char *cur_name;
+ cur_name = strrchr(list_file.file_name[sel_id], '/');
+
+ SdFile file, *curDir;
+ card.endFilePrint();
+ const char * const fname = card.diveToFile(true, curDir, cur_name);
+ if (!fname) return;
+ if (file.open(curDir, fname, O_READ)) {
+ gCfgItems.curFilesize = file.fileSize();
+ file.close();
+ update_spi_flash();
+ }
+ card.openFileRead(cur_name);
+ if (card.isFileOpen()) {
+ feedrate_percentage = 100;
+ //saved_feedrate_percentage = feedrate_percentage;
+ planner.flow_percentage[0] = 100;
+ planner.e_factor[0] = planner.flow_percentage[0] * 0.01f;
+ #if EXTRUDERS == 2
+ planner.flow_percentage[1] = 100;
+ planner.e_factor[1] = planner.flow_percentage[1] * 0.01f;
+ #endif
+ card.startFileprint();
+ #if ENABLED(POWER_LOSS_RECOVERY)
+ recovery.prepare();
+ #endif
+ once_flag = 0;
+ }
+ }
+ #endif
+ }
+ else if (DialogType == DIALOG_TYPE_STOP) {
+ stop_print_time();
+ lv_clear_dialog();
+ lv_draw_ready_print();
+
+ #if ENABLED(SDSUPPORT)
+ //card.endFilePrint();
+ //wait_for_heatup = false;
+ uiCfg.print_state = IDLE;
+ card.flag.abort_sd_printing = true;
+ //queue.clear();
+ //quickstop_stepper();
+ //print_job_timer.stop();
+ //thermalManager.disable_all_heaters();
+
+ //#if ENABLED(POWER_LOSS_RECOVERY)
+ //recovery.purge();
+ //#endif
+ //queue.enqueue_one_now(PSTR("G91"));
+ //queue.enqueue_one_now(PSTR("G1 Z10"));
+ //queue.enqueue_one_now(PSTR("G90"));
+ //queue.enqueue_one_now(PSTR("G28 X0 Y0"));
+ //queue.inject_P(PSTR("G91\nG1 Z10\nG90\nG28 X0 Y0\nM84\nM107"));
+ #endif
+ }
+ else if (DialogType == DIALOG_TYPE_FINISH_PRINT) {
+ clear_cur_ui();
+ lv_draw_ready_print();
+ }
+ #if ENABLED(ADVANCED_PAUSE_FEATURE)
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_WAITING
+ || DialogType == DIALOG_PAUSE_MESSAGE_INSERT
+ || DialogType == DIALOG_PAUSE_MESSAGE_HEAT
+ ) {
+ wait_for_user = false;
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_OPTION) {
+ pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE;
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_RESUME) {
+ clear_cur_ui();
+ draw_return_ui();
+ }
+ #endif
+ }
+}
+
+static void btn_cancel_event_cb(lv_obj_t * btn, lv_event_t event) {
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (DialogType == DIALOG_PAUSE_MESSAGE_OPTION) {
+ #if ENABLED(ADVANCED_PAUSE_FEATURE)
+ pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT;
+ #endif
+ }
+ else {
+ clear_cur_ui();
+ draw_return_ui();
+ }
+ }
+}
+
+void lv_draw_dialog(uint8_t type) {
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != DIALOG_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = DIALOG_UI;
+ }
+ disp_state = DIALOG_UI;
+
+ DialogType = type;
+
+ scr = lv_obj_create(NULL, NULL);
+
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ //LV_IMG_DECLARE(bmp_pic);
+
+ static lv_style_t style_btn_rel; // A variable to store the released style
+ lv_style_copy(&style_btn_rel, &lv_style_plain); // Initialize from a built-in style
+ style_btn_rel.body.border.color = lv_color_hex3(0x269);
+ style_btn_rel.body.border.width = 1;
+ style_btn_rel.body.main_color = lv_color_hex3(0xADF);
+ style_btn_rel.body.grad_color = lv_color_hex3(0x46B);
+ style_btn_rel.body.shadow.width = 4;
+ style_btn_rel.body.shadow.type = LV_SHADOW_BOTTOM;
+ style_btn_rel.body.radius = LV_RADIUS_CIRCLE;
+ style_btn_rel.text.color = lv_color_hex3(0xDEF);
+ style_btn_rel.text.font = &gb2312_puhui32;
+
+ static lv_style_t style_btn_pr; // A variable to store the pressed style
+ lv_style_copy(&style_btn_pr, &style_btn_rel); // Initialize from the released style
+ style_btn_pr.body.border.color = lv_color_hex3(0x46B);
+ style_btn_pr.body.main_color = lv_color_hex3(0x8BD);
+ style_btn_pr.body.grad_color = lv_color_hex3(0x24A);
+ style_btn_pr.body.shadow.width = 2;
+ style_btn_pr.text.color = lv_color_hex3(0xBCD);
+ style_btn_pr.text.font = &gb2312_puhui32;
+
+ lv_obj_t * labelDialog = lv_label_create(scr, NULL);
+ lv_obj_set_style(labelDialog, &tft_style_lable_rel);
+
+ if (DialogType == DIALOG_TYPE_FINISH_PRINT || DialogType == DIALOG_PAUSE_MESSAGE_RESUME) {
+ lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen
+ lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position
+ lv_obj_set_size(btnOk, 100, 50); // Set its size
+ lv_obj_set_event_cb(btnOk, btn_ok_event_cb);
+ lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style
+ lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style
+ lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button
+ lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_WAITING
+ || DialogType == DIALOG_PAUSE_MESSAGE_INSERT
+ || DialogType == DIALOG_PAUSE_MESSAGE_HEAT) {
+ lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen
+ lv_obj_set_pos(btnOk, BTN_OK_X + 90, BTN_OK_Y); // Set its position
+ lv_obj_set_size(btnOk, 100, 50); // Set its size
+ lv_obj_set_event_cb(btnOk, btn_ok_event_cb);
+ lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style
+ lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style
+ lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button
+ lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_PAUSING
+ || DialogType == DIALOG_PAUSE_MESSAGE_CHANGING
+ || DialogType == DIALOG_PAUSE_MESSAGE_UNLOAD
+ || DialogType == DIALOG_PAUSE_MESSAGE_LOAD
+ || DialogType == DIALOG_PAUSE_MESSAGE_PURGE
+ || DialogType == DIALOG_PAUSE_MESSAGE_RESUME
+ || DialogType == DIALOG_PAUSE_MESSAGE_HEATING
+ ) {
+ // nothing to do
+ }
+ else {
+ lv_obj_t * btnOk = lv_btn_create(scr, NULL); // Add a button the current screen
+ lv_obj_set_pos(btnOk, BTN_OK_X, BTN_OK_Y); // Set its position
+ lv_obj_set_size(btnOk, 100, 50); // Set its size
+ lv_obj_set_event_cb(btnOk, btn_ok_event_cb);
+ lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style
+ lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style
+ lv_obj_t * labelOk = lv_label_create(btnOk, NULL); // Add a label to the button
+
+ lv_obj_t * btnCancel = lv_btn_create(scr, NULL); // Add a button the current screen
+ lv_obj_set_pos(btnCancel, BTN_CANCEL_X, BTN_CANCEL_Y); // Set its position
+ lv_obj_set_size(btnCancel, 100, 50); // Set its size
+ lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb);
+ lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); // Set the button's released style
+ lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); // Set the button's pressed style
+ lv_obj_t * labelCancel = lv_label_create(btnCancel, NULL); // Add a label to the button
+
+ if (DialogType == DIALOG_PAUSE_MESSAGE_OPTION) {
+ lv_label_set_text(labelOk, pause_msg_menu.purgeMore); // Set the labels text
+ lv_label_set_text(labelCancel, pause_msg_menu.continuePrint);
+ }
+ else {
+ lv_label_set_text(labelOk, print_file_dialog_menu.confirm); // Set the labels text
+ lv_label_set_text(labelCancel, print_file_dialog_menu.cancle);
+ }
+ }
+ if (DialogType == DIALOG_TYPE_PRINT_FILE) {
+ lv_label_set_text(labelDialog, print_file_dialog_menu.print_file);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+
+ lv_obj_t * labelFile = lv_label_create(scr, NULL);
+ lv_obj_set_style(labelFile, &tft_style_lable_rel);
+
+ lv_label_set_text(labelFile, list_file.long_name[sel_id]);
+ lv_obj_align(labelFile, NULL, LV_ALIGN_CENTER, 0, -60);
+ }
+ else if (DialogType == DIALOG_TYPE_STOP) {
+ lv_label_set_text(labelDialog, print_file_dialog_menu.cancle_print);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_TYPE_FINISH_PRINT) {
+ lv_label_set_text(labelDialog, print_file_dialog_menu.print_finish);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_PAUSING) {
+ lv_label_set_text(labelDialog, pause_msg_menu.pausing);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_CHANGING) {
+ lv_label_set_text(labelDialog, pause_msg_menu.changing);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_UNLOAD) {
+ lv_label_set_text(labelDialog, pause_msg_menu.unload);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_WAITING) {
+ lv_label_set_text(labelDialog, pause_msg_menu.waiting);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_INSERT) {
+ lv_label_set_text(labelDialog, pause_msg_menu.insert);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_LOAD) {
+ lv_label_set_text(labelDialog, pause_msg_menu.load);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_PURGE) {
+ lv_label_set_text(labelDialog, pause_msg_menu.purge);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_RESUME) {
+ lv_label_set_text(labelDialog, pause_msg_menu.resume);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_HEAT) {
+ lv_label_set_text(labelDialog, pause_msg_menu.heat);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_HEATING) {
+ lv_label_set_text(labelDialog, pause_msg_menu.heating);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+ else if (DialogType == DIALOG_PAUSE_MESSAGE_OPTION) {
+ lv_label_set_text(labelDialog, pause_msg_menu.option);
+ lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20);
+ }
+}
+
+void lv_clear_dialog() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h
new file mode 100644
index 0000000000..894675b9c0
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h
@@ -0,0 +1,79 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+#define DIALOG_TYPE_STOP 0
+#define DIALOG_TYPE_PRINT_FILE 1
+#define DIALOG_TYPE_REPRINT_NO_FILE 2
+
+#define DIALOG_TYPE_M80_FAIL 3 //**
+#define DIALOG_TYPE_MESSEGE_ERR1 4 //**
+
+#define DIALOG_TYPE_UPDATE_ESP_FIRMARE 5
+#define DIALOG_TYPE_UPDATE_ESP_DATA 6
+#define DIALOG_TYPE_UPLOAD_FILE 7
+#define DIALOG_TYPE_UNBIND 8
+
+#define DIALOG_TYPE_FILAMENT_LOAD_HEAT 9
+#define DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED 10
+#define DIALOG_TYPE_FILAMENT_LOADING 11
+#define DIALOG_TYPE_FILAMENT_LOAD_COMPLETED 12
+#define DIALOG_TYPE_FILAMENT_UNLOAD_HEAT 13
+#define DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED 14
+#define DIALOG_TYPE_FILAMENT_UNLOADING 15
+#define DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED 16
+
+#define DIALOG_TYPE_FILE_LOADING 17 //**
+
+#define DIALOG_TYPE_FILAMENT_NO_PRESS 18
+#define DIALOG_TYPE_FINISH_PRINT 19
+
+#define WIFI_ENABLE_TIPS 20
+
+#define DIALOG_PAUSE_MESSAGE_PAUSING 21
+#define DIALOG_PAUSE_MESSAGE_CHANGING 22
+#define DIALOG_PAUSE_MESSAGE_UNLOAD 23
+#define DIALOG_PAUSE_MESSAGE_WAITING 24
+#define DIALOG_PAUSE_MESSAGE_INSERT 25
+#define DIALOG_PAUSE_MESSAGE_LOAD 26
+#define DIALOG_PAUSE_MESSAGE_PURGE 27
+#define DIALOG_PAUSE_MESSAGE_RESUME 28
+#define DIALOG_PAUSE_MESSAGE_HEAT 29
+#define DIALOG_PAUSE_MESSAGE_HEATING 30
+#define DIALOG_PAUSE_MESSAGE_OPTION 31
+
+#define BTN_OK_X 100
+#define BTN_OK_Y 180
+#define BTN_CANCEL_X 280
+#define BTN_CANCEL_Y 180
+
+extern void lv_draw_dialog(uint8_t type);
+extern void lv_clear_dialog();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp
new file mode 100644
index 0000000000..de57804c2d
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp
@@ -0,0 +1,84 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "lv_conf.h"
+#include "draw_ui.h"
+#include "tft_lvgl_configuration.h"
+#include "mks_hardware_test.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+
+static lv_obj_t * scr;
+
+void lv_draw_error_message(PGM_P const msg) {
+ #if 0
+ static lv_obj_t * message = NULL, *kill_message = NULL, *reset_tips = NULL;
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ERROR_MESSAGE_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = ERROR_MESSAGE_UI;
+ }
+ disp_state = ERROR_MESSAGE_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ if (msg) {
+ message = lv_label_create(scr, NULL);
+ lv_obj_set_style(message, &tft_style_lable_rel);
+ lv_label_set_text(message, msg);
+ lv_obj_align(message, NULL, LV_ALIGN_CENTER, 0, -50);
+ }
+
+ kill_message = lv_label_create(scr, NULL);
+ lv_obj_set_style(kill_message, &tft_style_lable_rel);
+ lv_label_set_text(kill_message, "PRINTER HALTED");
+ lv_obj_align(kill_message, NULL, LV_ALIGN_CENTER, 0, -10);
+
+ reset_tips = lv_label_create(scr, NULL);
+ lv_obj_set_style(reset_tips, &tft_style_lable_rel);
+ lv_label_set_text(reset_tips, "Please Reset");
+ lv_obj_align(reset_tips, NULL, LV_ALIGN_CENTER, 0, 30);
+
+ lv_task_handler();
+ #endif
+ LCD_Clear(0x0000);
+ if (msg) disp_string((TFT_WIDTH - strlen(msg) * 16) / 2, 100, msg, 0xFFFF, 0x0000);
+ disp_string((TFT_WIDTH - strlen("PRINTER HALTED") * 16) / 2, 140, "PRINTER HALTED", 0xFFFF, 0x0000);
+ disp_string((TFT_WIDTH - strlen("Please Reset") * 16) / 2, 180, "Please Reset", 0xFFFF, 0x0000);
+
+}
+
+void lv_clear_error_message() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h
new file mode 100644
index 0000000000..53071f9048
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h
@@ -0,0 +1,34 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_error_message(PGM_P const msg);
+extern void lv_clear_error_message();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp
new file mode 100644
index 0000000000..14d7ed0410
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp
@@ -0,0 +1,378 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "lv_conf.h"
+#include "draw_ui.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+#include "../../../../module/temperature.h"
+#include "../../../../gcode/queue.h"
+
+static lv_obj_t * scr;
+static lv_obj_t * buttoType, *buttonStep, *buttonSpeed;
+static lv_obj_t * labelType;
+static lv_obj_t * labelStep;
+static lv_obj_t * labelSpeed;
+static lv_obj_t * tempText;
+static lv_obj_t * ExtruText;
+
+#define ID_E_ADD 1
+#define ID_E_DEC 2
+#define ID_E_TYPE 3
+#define ID_E_STEP 4
+#define ID_E_SPEED 5
+#define ID_E_RETURN 6
+
+static int32_t extructAmount;
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_E_ADD:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) {
+ queue.enqueue_one_now(PSTR("G91"));
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf((char *)public_buf_l, "G1 E%d F%d", uiCfg.extruStep, 60 * uiCfg.extruSpeed);
+ queue.enqueue_one_now(PSTR(public_buf_l));
+ queue.enqueue_one_now(PSTR("G90"));
+ extructAmount += uiCfg.extruStep;
+ disp_extru_amount();
+ }
+ }
+ break;
+ case ID_E_DEC:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) {
+ queue.enqueue_one_now(PSTR("G91"));
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf((char *)public_buf_l, "G1 E%d F%d", 0 - uiCfg.extruStep, 60 * uiCfg.extruSpeed);
+ queue.enqueue_one_now(PSTR(public_buf_l));
+ queue.enqueue_one_now(PSTR("G90"));
+ extructAmount -= uiCfg.extruStep;
+ disp_extru_amount();
+ }
+ }
+ break;
+ case ID_E_TYPE:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (EXTRUDERS == 2) {
+ if (uiCfg.curSprayerChoose == 0) {
+ uiCfg.curSprayerChoose = 1;
+ queue.inject_P(PSTR("T1"));
+ }
+ else {
+ uiCfg.curSprayerChoose = 0;
+ queue.inject_P(PSTR("T0"));
+ }
+ }
+ else {
+ uiCfg.curSprayerChoose = 0;
+ }
+ extructAmount = 0;
+ disp_hotend_temp();
+ disp_ext_type();
+ disp_extru_amount();
+ }
+ break;
+ case ID_E_STEP:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ switch (abs(uiCfg.extruStep)) {
+ case 1: uiCfg.extruStep = 5; break;
+ case 5: uiCfg.extruStep = 10; break;
+ case 10: uiCfg.extruStep = 1; break;
+ default: break;
+ }
+ disp_ext_step();
+ }
+ break;
+ case ID_E_SPEED:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ switch (uiCfg.extruSpeed) {
+ case 1: uiCfg.extruSpeed = 10; break;
+ case 10: uiCfg.extruSpeed = 20; break;
+ case 20: uiCfg.extruSpeed = 1; break;
+ default: break;
+ }
+ disp_ext_speed();
+ }
+ break;
+ case ID_E_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ clear_cur_ui();
+ draw_return_ui();
+ }
+ break;
+ }
+}
+
+
+void lv_draw_extrusion(void) {
+ lv_obj_t *buttonAdd, *buttonDec, *buttonBack;
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EXTRUSION_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = EXTRUSION_UI;
+ }
+ disp_state = EXTRUSION_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ buttonAdd = lv_imgbtn_create(scr, NULL);
+ buttonDec = lv_imgbtn_create(scr, NULL);
+ buttoType = lv_imgbtn_create(scr, NULL);
+ buttonStep = lv_imgbtn_create(scr, NULL);
+ buttonSpeed = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_E_ADD, "bmp_In.bin", 0);
+ lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW);
+
+ #if 1
+ lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_E_DEC, "bmp_Out.bin", 0);
+ lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_E_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonSpeed, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttoType, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ lv_obj_t * labelAdd = lv_label_create(buttonAdd, NULL);
+ lv_obj_t * labelDec = lv_label_create(buttonDec, NULL);
+ labelType = lv_label_create(buttoType, NULL);
+ labelStep = lv_label_create(buttonStep, NULL);
+ labelSpeed = lv_label_create(buttonSpeed, NULL);
+ lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelAdd, extrude_menu.in);
+ lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelDec, extrude_menu.out);
+ lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+
+ disp_ext_type();
+ disp_ext_step();
+ disp_ext_speed();
+
+ tempText = lv_label_create(scr, NULL);
+ lv_obj_set_style(tempText, &tft_style_lable_rel);
+ disp_hotend_temp();
+
+ ExtruText = lv_label_create(scr, NULL);
+ lv_obj_set_style(ExtruText, &tft_style_lable_rel);
+ disp_extru_amount();
+}
+
+void disp_ext_type() {
+ if (uiCfg.curSprayerChoose == 1) {
+ lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, "bmp_Extru2.bin", 0);
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelType, extrude_menu.ext2);
+ lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ }
+ else {
+ lv_obj_set_event_cb_mks(buttoType, event_handler, ID_E_TYPE, "bmp_Extru1.bin", 0);
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelType, extrude_menu.ext1);
+ lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ }
+}
+
+void disp_ext_speed() {
+ if (uiCfg.extruSpeed == 20)
+ lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_Speed_high.bin", 0);
+ else if (uiCfg.extruSpeed == 1)
+ lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_Speed_slow.bin", 0);
+ else
+ lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_E_SPEED, "bmp_Speed_normal.bin", 0);
+
+ if (gCfgItems.multiple_language != 0) {
+ if (uiCfg.extruSpeed == 20) {
+ lv_label_set_text(labelSpeed, extrude_menu.high);
+ lv_obj_align(labelSpeed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else if (uiCfg.extruSpeed == 1) {
+ lv_label_set_text(labelSpeed, extrude_menu.low);
+ lv_obj_align(labelSpeed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else {
+ lv_label_set_text(labelSpeed, extrude_menu.normal);
+ lv_obj_align(labelSpeed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ }
+}
+
+void disp_hotend_temp() {
+ char buf[20] = {0};
+ public_buf_l[0] = '\0';
+ strcat(public_buf_l, extrude_menu.temper_text);
+ sprintf(buf, extrude_menu.temp_value, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target);
+ strcat(public_buf_l, buf);
+ lv_label_set_text(tempText, public_buf_l);
+ lv_obj_align(tempText, NULL, LV_ALIGN_CENTER, 0, -50);
+}
+
+void disp_extru_amount() {
+ char buf1[10] = {0};
+
+ public_buf_l[0] = '\0';
+
+ if (extructAmount < 999 && extructAmount > -99) {
+ sprintf(buf1, extrude_menu.count_value_mm, extructAmount);
+ if (uiCfg.curSprayerChoose < 1)
+ strcat(public_buf_l, extrude_menu.ext1);
+ else
+ strcat(public_buf_l, extrude_menu.ext2);
+ strcat(public_buf_l, buf1);
+ }
+ else if (extructAmount < 9999 && extructAmount > -999) {
+ sprintf(buf1, extrude_menu.count_value_cm, extructAmount / 10);
+ if (uiCfg.curSprayerChoose < 1)
+ strcat(public_buf_l, extrude_menu.ext1);
+ else
+ strcat(public_buf_l, extrude_menu.ext2);
+ strcat(public_buf_l, buf1);
+ }
+ else {
+ sprintf(buf1, extrude_menu.count_value_m, extructAmount / 1000);
+ if (uiCfg.curSprayerChoose < 1)
+ strcat(public_buf_l, extrude_menu.ext1);
+ else
+ strcat(public_buf_l, extrude_menu.ext2);
+ strcat(public_buf_l, buf1);
+ }
+
+ lv_label_set_text(ExtruText, public_buf_l);
+ lv_obj_align(ExtruText, NULL, LV_ALIGN_CENTER, 0, -75);
+}
+
+void disp_ext_step() {
+ if (uiCfg.extruStep == 1)
+ lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_Step1_mm.bin", 0);
+ else if (uiCfg.extruStep == 5)
+ lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_Step5_mm.bin", 0);
+ else if (uiCfg.extruStep == 10)
+ lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, "bmp_Step10_mm.bin", 0);
+
+ if (gCfgItems.multiple_language != 0) {
+ if (uiCfg.extruStep == 1) {
+ lv_label_set_text(labelStep, extrude_menu.step_1mm);
+ lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else if (uiCfg.extruStep == 5) {
+ lv_label_set_text(labelStep, extrude_menu.step_5mm);
+ lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else if (uiCfg.extruStep == 10) {
+ lv_label_set_text(labelStep, extrude_menu.step_10mm);
+ lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ }
+}
+
+void lv_clear_extrusion() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h
new file mode 100644
index 0000000000..7ebf32b66c
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h
@@ -0,0 +1,39 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_extrusion(void);
+extern void lv_clear_extrusion();
+extern void disp_ext_type();
+extern void disp_ext_step();
+extern void disp_ext_speed();
+extern void disp_hotend_temp();
+extern void disp_extru_amount();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp
new file mode 100644
index 0000000000..d5bf62ab3e
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp
@@ -0,0 +1,247 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "../../../../MarlinCore.h"
+#include "lv_conf.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+#include "../../../../../Configuration.h"
+#include "draw_ui.h"
+#include "../../../../module/temperature.h"
+#include "../../../../gcode/queue.h"
+
+static lv_obj_t * scr;
+static lv_obj_t * fanText;
+
+#define ID_F_ADD 1
+#define ID_F_DEC 2
+#define ID_F_HIGH 3
+#define ID_F_MID 4
+#define ID_F_OFF 5
+#define ID_F_RETURN 6
+
+static uint8_t fanSpeed;
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_F_ADD:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (fanSpeed + 1 <= 255) {
+ fanSpeed++;
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, "M106 S%d", fanSpeed);
+ queue.enqueue_one_now(PSTR(public_buf_l));
+ }
+ }
+ break;
+ case ID_F_DEC:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (fanSpeed > 0) {
+ fanSpeed--;
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, "M106 S%d", fanSpeed);
+ queue.enqueue_one_now(PSTR(public_buf_l));
+ }
+ }
+
+ break;
+ case ID_F_HIGH:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ queue.enqueue_one_now(PSTR("M106 S255"));
+ }
+ break;
+ case ID_F_MID:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ queue.enqueue_one_now(PSTR("M106 S127"));
+ }
+ break;
+ case ID_F_OFF:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ queue.enqueue_one_now(PSTR("M107"));
+ }
+ break;
+ case ID_F_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ clear_cur_ui();
+ draw_return_ui();
+ }
+ break;
+ }
+}
+
+
+void lv_draw_fan(void) {
+ lv_obj_t *buttonAdd, *buttonDec, *buttonHigh, *buttonMid;
+ lv_obj_t *buttonOff, *buttonBack;
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FAN_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = FAN_UI;
+ }
+ disp_state = FAN_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ buttonAdd = lv_imgbtn_create(scr, NULL);
+ buttonDec = lv_imgbtn_create(scr, NULL);
+ buttonHigh = lv_imgbtn_create(scr, NULL);
+ buttonMid = lv_imgbtn_create(scr, NULL);
+ buttonOff = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_F_ADD, "bmp_Add.bin", 0);
+ lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW);
+ #if 1
+ lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_F_DEC, "bmp_Dec.bin", 0);
+ lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonHigh, event_handler, ID_F_HIGH, "bmp_Speed255.bin", 0);
+ lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonHigh, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonMid, event_handler, ID_F_MID, "bmp_Speed127.bin", 0);
+ lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonMid, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonOff, event_handler, ID_F_OFF, "bmp_Speed0.bin", 0);
+ lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_F_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttonHigh, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonMid, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonOff, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonHigh, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonMid, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonOff, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ lv_obj_t * labelAdd = lv_label_create(buttonAdd, NULL);
+ lv_obj_t * labelDec = lv_label_create(buttonDec, NULL);
+ lv_obj_t * labelHigh = lv_label_create(buttonHigh, NULL);
+ lv_obj_t * labelMid = lv_label_create(buttonMid, NULL);
+ lv_obj_t * labelOff = lv_label_create(buttonOff, NULL);
+ lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelAdd, fan_menu.add);
+ lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelDec, fan_menu.dec);
+ lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelHigh, fan_menu.full);
+ lv_obj_align(labelHigh, buttonHigh, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelMid, fan_menu.half);
+ lv_obj_align(labelMid, buttonMid, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelOff, fan_menu.off);
+ lv_obj_align(labelOff, buttonOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+
+ fanText = lv_label_create(scr, NULL);
+ lv_obj_set_style(fanText, &tft_style_lable_rel);
+ disp_fan_value();
+}
+
+void disp_fan_value() {
+ char buf1[10] = {0};
+ public_buf_l[0] = '\0';
+ strcat(public_buf_l, fan_menu.state);
+ strcat(public_buf_l, ": ");
+ sprintf(buf1, "%3d", thermalManager.fan_speed[0]);
+ strcat(public_buf_l, buf1);
+ lv_label_set_text(fanText, public_buf_l);
+ lv_obj_align(fanText, NULL, LV_ALIGN_CENTER, 0, -65);
+}
+
+void lv_clear_fan() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h
new file mode 100644
index 0000000000..6ad2024e9f
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h
@@ -0,0 +1,35 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_fan(void);
+extern void lv_clear_fan();
+extern void disp_fan_value();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp
new file mode 100644
index 0000000000..79f550afef
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp
@@ -0,0 +1,283 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "../../../../MarlinCore.h"
+#include "draw_ready_print.h"
+#include "draw_set.h"
+#include "lv_conf.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+#include "draw_ui.h"
+#include "../../../../gcode/queue.h"
+
+static lv_obj_t * scr;
+
+#define ID_H_ALL 1
+#define ID_H_X 2
+#define ID_H_Y 3
+#define ID_H_Z 4
+#define ID_H_RETURN 5
+#define ID_H_OFF_ALL 6
+#define ID_H_OFF_XY 7
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_H_ALL:
+ if (event == LV_EVENT_CLICKED) {
+
+
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ queue.inject_P(PSTR("G28"));
+ }
+ break;
+ case ID_H_X:
+ if (event == LV_EVENT_CLICKED) {
+
+
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ queue.inject_P(PSTR("G28 X0"));
+ }
+ break;
+ case ID_H_Y:
+ if (event == LV_EVENT_CLICKED) {
+
+
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ queue.inject_P(PSTR("G28 Y0"));
+ }
+ break;
+ case ID_H_Z:
+ if (event == LV_EVENT_CLICKED) {
+
+
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ queue.inject_P(PSTR("G28 Z0"));
+ }
+ break;
+ case ID_H_OFF_ALL:
+ if (event == LV_EVENT_CLICKED) {
+
+
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ queue.inject_P(PSTR("M84"));
+ }
+ break;
+ case ID_H_OFF_XY:
+ if (event == LV_EVENT_CLICKED) {
+
+
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ queue.inject_P(PSTR("M84 X Y"));
+ }
+ break;
+ case ID_H_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_obj_del(scr);
+ lv_draw_tool();
+ }
+ break;
+
+ }
+}
+
+
+void lv_draw_home(void) {
+ lv_obj_t *buttonHomeAll, *buttonHomeX, *buttonHomeY, *buttonHomeZ;
+ lv_obj_t *buttonBack;
+ lv_obj_t *buttonOffAll, *buttonOffXY;
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ZERO_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = ZERO_UI;
+ }
+ disp_state = ZERO_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ //static lv_style_t tool_style;
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ //buttonWifi = lv_imgbtn_create(scr, NULL);
+ buttonHomeAll = lv_imgbtn_create(scr, NULL);
+ buttonHomeX = lv_imgbtn_create(scr, NULL);
+ //buttonContinue = lv_imgbtn_create(scr, NULL);
+ buttonHomeY = lv_imgbtn_create(scr, NULL);
+ buttonHomeZ = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+ buttonOffAll = lv_imgbtn_create(scr, NULL);
+ buttonOffXY = lv_imgbtn_create(scr, NULL);
+
+ //lv_obj_set_event_cb_mks(buttonWifi, event_handler,ID_S_WIFI,"bmp_Wifi.bin",0);
+ //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_REL, &bmp_pic);
+ //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_PR, &bmp_pic);
+ //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ //lv_obj_clear_protect(buttonWifi, LV_PROTECT_FOLLOW);
+ #if 1
+ lv_obj_set_event_cb_mks(buttonHomeAll, event_handler, ID_H_ALL, "bmp_Zero.bin", 0);
+ lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonHomeAll, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonHomeX, event_handler, ID_H_X, "bmp_zeroX.bin", 0);
+ lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonHomeX, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ //lv_obj_set_event_cb_mks(buttonContinue, event_handler,ID_S_CONTINUE,"bmp_Breakpoint.bin",0);
+ //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_REL, &bmp_pic);
+ //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_PR, &bmp_pic);
+ //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonHomeY, event_handler, ID_H_Y, "bmp_zeroY.bin", 0);
+ lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonHomeY, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonHomeZ, event_handler, ID_H_Z, "bmp_zeroZ.bin", 0);
+ lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonHomeZ, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonOffAll, event_handler, ID_H_OFF_ALL, "bmp_Motor_off.bin", 0);
+ lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonOffAll, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonOffXY, event_handler, ID_H_OFF_XY, "bmp_Motor_off.bin", 0);
+ lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonOffXY, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_H_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+ /*lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight);
+ lv_obj_set_pos(buttonFan,BTN_X_PIXEL+INTERVAL_V*2,titleHeight);
+ lv_obj_set_pos(buttonAbout,BTN_X_PIXEL*2+INTERVAL_V*3,titleHeight);
+ lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight);
+ lv_obj_set_pos(buMotorOff,INTERVAL_V, BTN_Y_PIXEL+INTERVAL_H+titleHeight);
+ lv_obj_set_pos(buttonLanguage,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight);
+ lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/
+
+ //lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight);
+ lv_obj_set_pos(buttonHomeX, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight);
+ lv_obj_set_pos(buttonHomeY, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight);
+ //lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight);
+ lv_obj_set_pos(buttonHomeZ, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttonHomeAll, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonOffAll, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonOffXY, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ //lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonHomeAll, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonHomeX, LV_LAYOUT_OFF);
+ //lv_btn_set_layout(buttonContinue, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonHomeY, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonHomeZ, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonOffAll, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonOffXY, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ //lv_obj_t * labelWifi= lv_label_create(buttonWifi, NULL);
+ lv_obj_t * labelHomeAll = lv_label_create(buttonHomeAll, NULL);
+ lv_obj_t * labelHomeX = lv_label_create(buttonHomeX, NULL);
+ //lv_obj_t * label_Continue = lv_label_create(buttonContinue, NULL);
+ lv_obj_t * labelHomeY = lv_label_create(buttonHomeY, NULL);
+ lv_obj_t * labelHomeZ = lv_label_create(buttonHomeZ, NULL);
+ lv_obj_t * labelOffAll = lv_label_create(buttonOffAll, NULL);
+ lv_obj_t * labelOffXY = lv_label_create(buttonOffXY, NULL);
+ lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+
+ if (gCfgItems.multiple_language != 0) {
+ //lv_label_set_text(labelWifi, set_menu.wifi);
+ //lv_obj_align(labelWifi, buttonWifi, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelHomeAll, home_menu.home_all);
+ lv_obj_align(labelHomeAll, buttonHomeAll, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelHomeX, home_menu.home_x);
+ lv_obj_align(labelHomeX, buttonHomeX, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ //lv_label_set_text(label_Continue, set_menu.breakpoint);
+ //lv_obj_align(label_Continue, buttonContinue, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelHomeY, home_menu.home_y);
+ lv_obj_align(labelHomeY, buttonHomeY, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelHomeZ, home_menu.home_z);
+ lv_obj_align(labelHomeZ, buttonHomeZ, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelOffAll, set_menu.motoroff);
+ lv_obj_align(labelOffAll, buttonOffAll, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelOffXY, set_menu.motoroffXY);
+ lv_obj_align(labelOffXY, buttonOffXY, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+}
+
+void lv_clear_home() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h
new file mode 100644
index 0000000000..9fd373b8bd
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h
@@ -0,0 +1,34 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_home(void);
+extern void lv_clear_home();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp
new file mode 100644
index 0000000000..c5c77e8985
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp
@@ -0,0 +1,370 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "lv_conf.h"
+#include "draw_ui.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+#include
+
+//static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn;
+
+#define ID_CN 1
+#define ID_T_CN 2
+#define ID_EN 3
+#define ID_RU 4
+#define ID_ES 5
+#define ID_FR 6
+#define ID_IT 7
+#define ID_L_RETURN 8
+
+#define SELECTED 1
+#define UNSELECTED 0
+
+static void disp_language(uint8_t language, uint8_t state);
+
+static lv_obj_t * scr;
+static lv_obj_t *buttonCN, *buttonT_CN, *buttonEN, *buttonRU;
+static lv_obj_t *buttonES, *buttonFR, *buttonIT, *buttonBack;
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_CN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ disp_language(gCfgItems.language, UNSELECTED);
+ lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_Simple_cn_sel.bin", 0);
+ gCfgItems.language = LANG_SIMPLE_CHINESE;
+ gCfg_to_spiFlah();
+ disp_language_init();
+ }
+ break;
+ case ID_T_CN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ disp_language(gCfgItems.language, UNSELECTED);
+ lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_Tradition_cn_sel.bin", 0);
+ gCfgItems.language = LANG_COMPLEX_CHINESE;
+ gCfg_to_spiFlah();
+ disp_language_init();
+ }
+ break;
+ case ID_EN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ disp_language(gCfgItems.language, UNSELECTED);
+ lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, "bmp_English_sel.bin", 0);
+ gCfgItems.language = LANG_ENGLISH;
+ gCfg_to_spiFlah();
+ disp_language_init();
+ }
+ break;
+ case ID_RU:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ disp_language(gCfgItems.language, UNSELECTED);
+ lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, "bmp_Russian_sel.bin", 0);
+ gCfgItems.language = LANG_RUSSIAN;
+ gCfg_to_spiFlah();
+ disp_language_init();
+ }
+ break;
+ case ID_ES:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ disp_language(gCfgItems.language, UNSELECTED);
+ lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, "bmp_Spanish_sel.bin", 0);
+ gCfgItems.language = LANG_SPANISH;
+ gCfg_to_spiFlah();
+ disp_language_init();
+ }
+ break;
+ case ID_FR:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ disp_language(gCfgItems.language, UNSELECTED);
+ lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, "bmp_French_sel.bin", 0);
+ gCfgItems.language = LANG_FRENCH;
+ gCfg_to_spiFlah();
+ disp_language_init();
+ }
+ break;
+ case ID_IT:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ disp_language(gCfgItems.language, UNSELECTED);
+ lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_FR, "bmp_Italy_sel.bin", 0);
+ gCfgItems.language = LANG_ITALY;
+ gCfg_to_spiFlah();
+ disp_language_init();
+ }
+ break;
+ case ID_L_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+
+ }
+ else if (event == LV_EVENT_RELEASED) {
+
+ buttonCN = NULL;
+ buttonT_CN = NULL;
+ buttonEN = NULL;
+ buttonRU = NULL;
+ buttonES = NULL;
+ buttonFR = NULL;
+ buttonFR = NULL;
+ buttonIT = NULL;
+ buttonBack = NULL;
+
+ lv_obj_del(scr);
+ lv_draw_set();
+ }
+ break;
+
+ }
+}
+
+static void disp_language(uint8_t language, uint8_t state) {
+ uint16_t id;
+ lv_obj_t *obj;
+
+ public_buf_l[0] = '\0';
+
+ switch (language) {
+
+ case LANG_SIMPLE_CHINESE:
+ id = ID_CN;
+ strcat(public_buf_l, "bmp_Simple_cn");
+ obj = buttonCN;
+
+ break;
+ case LANG_COMPLEX_CHINESE:
+ id = ID_T_CN;
+ strcat(public_buf_l, "bmp_Tradition_cn");
+ obj = buttonT_CN;
+ break;
+ case LANG_ENGLISH:
+ id = ID_EN;
+ strcat(public_buf_l, "bmp_English");
+ obj = buttonEN;
+ break;
+ case LANG_RUSSIAN:
+ id = ID_RU;
+ strcat(public_buf_l, "bmp_Russian");
+ obj = buttonRU;
+ break;
+ case LANG_SPANISH:
+ id = ID_ES;
+ strcat(public_buf_l, "bmp_Spanish");
+ obj = buttonES;
+ break;
+ case LANG_FRENCH:
+ id = ID_FR;
+ strcat(public_buf_l, "bmp_French");
+ obj = buttonFR;
+ break;
+ case LANG_ITALY:
+ id = ID_IT;
+ strcat(public_buf_l, "bmp_Italy");
+ obj = buttonIT;
+ break;
+ default:
+ id = ID_CN;
+ strcat(public_buf_l, "bmp_Simple_cn");
+ obj = buttonCN;
+ break;
+ }
+
+ if (state == SELECTED) strcat(public_buf_l, "_sel.bin");
+ else strcat(public_buf_l, ".bin");
+
+ lv_obj_set_event_cb_mks(obj, event_handler, id, public_buf_l, 0);
+
+ if (state == UNSELECTED) lv_obj_refresh_ext_draw_pad(obj);
+}
+
+void lv_draw_language(void) {
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LANGUAGE_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = LANGUAGE_UI;
+ }
+ disp_state = LANGUAGE_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ //static lv_style_t tool_style;
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ buttonCN = lv_imgbtn_create(scr, NULL);
+ buttonT_CN = lv_imgbtn_create(scr, NULL);
+ buttonEN = lv_imgbtn_create(scr, NULL);
+ buttonRU = lv_imgbtn_create(scr, NULL);
+ buttonES = lv_imgbtn_create(scr, NULL);
+ buttonFR = lv_imgbtn_create(scr, NULL);
+ buttonIT = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+
+ lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, "bmp_Simple_cn.bin", 0);
+ lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonCN, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonCN, LV_PROTECT_FOLLOW);
+ #if 1
+ lv_obj_set_event_cb_mks(buttonT_CN, event_handler, ID_T_CN, "bmp_Tradition_cn.bin", 0);
+ lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonT_CN, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonEN, event_handler, ID_EN, "bmp_English.bin", 0);
+ lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonEN, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonRU, event_handler, ID_RU, "bmp_Russian.bin", 0);
+ lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonRU, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonES, event_handler, ID_ES, "bmp_Spanish.bin", 0);
+ lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonES, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonES, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonFR, event_handler, ID_FR, "bmp_French.bin", 0);
+ lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonFR, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonIT, event_handler, ID_IT, "bmp_Italy.bin", 0);
+ lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonIT, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_L_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonCN, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonT_CN, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight);
+ lv_obj_set_pos(buttonEN, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight);
+ lv_obj_set_pos(buttonRU, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttonES, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonFR, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonIT, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonCN, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonT_CN, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonEN, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonRU, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonES, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonFR, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonIT, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ lv_obj_t * label_CN = lv_label_create(buttonCN, NULL);
+ lv_obj_t * label_T_CN = lv_label_create(buttonT_CN, NULL);
+ lv_obj_t * label_EN = lv_label_create(buttonEN, NULL);
+ lv_obj_t * label_RU = lv_label_create(buttonRU, NULL);
+ lv_obj_t * label_ES = lv_label_create(buttonES, NULL);
+ lv_obj_t * label_FR = lv_label_create(buttonFR, NULL);
+ lv_obj_t * label_IT = lv_label_create(buttonIT, NULL);
+ lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+ disp_language(gCfgItems.language, SELECTED);
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(label_CN, language_menu.chinese_s);
+ lv_obj_align(label_CN, buttonCN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_T_CN, language_menu.chinese_t);
+ lv_obj_align(label_T_CN, buttonT_CN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_EN, language_menu.english);
+ lv_obj_align(label_EN, buttonEN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_RU, language_menu.russian);
+ lv_obj_align(label_RU, buttonRU, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_ES, language_menu.spanish);
+ lv_obj_align(label_ES, buttonES, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_FR, language_menu.french);
+ lv_obj_align(label_FR, buttonFR, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_IT, language_menu.italy);
+ lv_obj_align(label_IT, buttonIT, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+}
+
+void lv_clear_language() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h
new file mode 100644
index 0000000000..4d967b4f06
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h
@@ -0,0 +1,34 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_language(void);
+extern void lv_clear_language();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp
new file mode 100644
index 0000000000..b97483ec9d
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp
@@ -0,0 +1,284 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "../../../../MarlinCore.h"
+#include "lv_conf.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+#include "draw_ui.h"
+#include "../../../../gcode/queue.h"
+
+//static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn;
+static lv_obj_t * scr;
+
+#define ID_M_POINT1 1
+#define ID_M_POINT2 2
+#define ID_M_POINT3 3
+#define ID_M_POINT4 4
+#define ID_M_POINT5 5
+
+#define ID_MANUAL_RETURN 6
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_M_POINT1:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+
+ if (queue.length == 0) {
+ if (uiCfg.leveling_first_time) {
+ queue.enqueue_one_P(PSTR("G28"));
+ uiCfg.leveling_first_time = 0;
+ }
+
+ queue.enqueue_one_P(PSTR("G1 Z10"));
+
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, "G1 X%d Y%d", X_MIN_POS + 30, Y_MIN_POS + 30);
+ queue.enqueue_one_P(PSTR(public_buf_l));
+ queue.enqueue_one_P(PSTR("G1 Z0"));
+ }
+ }
+ break;
+ case ID_M_POINT2:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (queue.length == 0) {
+ if (uiCfg.leveling_first_time) {
+ queue.enqueue_one_P(PSTR("G28"));
+ uiCfg.leveling_first_time = 0;
+ }
+
+ queue.enqueue_one_P(PSTR("G1 Z10"));
+
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, "G1 X%d Y%d", X_MAX_POS - 30, Y_MIN_POS + 30);
+ queue.enqueue_one_P(PSTR(public_buf_l));
+ queue.enqueue_one_P(PSTR("G1 Z0"));
+ }
+ }
+ break;
+ case ID_M_POINT3:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (queue.length == 0) {
+ if (uiCfg.leveling_first_time) {
+ queue.enqueue_one_P(PSTR("G28"));
+ uiCfg.leveling_first_time = 0;
+ }
+
+ queue.enqueue_one_P(PSTR("G1 Z10"));
+
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, "G1 X%d Y%d", X_MAX_POS - 30, Y_MAX_POS - 30);
+ queue.enqueue_one_P(PSTR(public_buf_l));
+ queue.enqueue_one_P(PSTR("G1 Z0"));
+ }
+ }
+
+ break;
+ case ID_M_POINT4:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (queue.length == 0) {
+ if (uiCfg.leveling_first_time) {
+ queue.enqueue_one_P(PSTR("G28"));
+ uiCfg.leveling_first_time = 0;
+ }
+
+ queue.enqueue_one_P(PSTR("G1 Z10"));
+
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, "G1 X%d Y%d", X_MIN_POS + 30, Y_MAX_POS - 30);
+ queue.enqueue_one_P(PSTR(public_buf_l));
+ queue.enqueue_one_P(PSTR("G1 Z0"));
+ }
+ }
+ break;
+ case ID_M_POINT5:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (queue.length == 0) {
+ if (uiCfg.leveling_first_time) {
+ queue.enqueue_one_P(PSTR("G28"));
+ uiCfg.leveling_first_time = 0;
+ }
+
+ queue.enqueue_one_P(PSTR("G1 Z10"));
+
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, "G1 X%d Y%d", X_BED_SIZE / 2, Y_BED_SIZE / 2);
+ queue.enqueue_one_P(PSTR(public_buf_l));
+ queue.enqueue_one_P(PSTR("G1 Z0"));
+ }
+ }
+
+ break;
+ case ID_MANUAL_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_clear_manualLevel();
+ lv_draw_tool();
+ }
+ break;
+
+ }
+}
+
+
+void lv_draw_manualLevel(void) {
+ lv_obj_t *buttonPoint1, *buttonPoint2, *buttonPoint3, *buttonPoint4, *buttonPoint5;
+ lv_obj_t *buttonBack;
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LEVELING_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = LEVELING_UI;
+ }
+ disp_state = LEVELING_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ //static lv_style_t tool_style;
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ buttonPoint1 = lv_imgbtn_create(scr, NULL);
+ buttonPoint2 = lv_imgbtn_create(scr, NULL);
+ buttonPoint3 = lv_imgbtn_create(scr, NULL);
+ buttonPoint4 = lv_imgbtn_create(scr, NULL);
+ buttonPoint5 = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonPoint1, event_handler, ID_M_POINT1, "bmp_Leveling1.bin", 0);
+ lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPoint1, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonPoint1, LV_PROTECT_FOLLOW);
+ #if 1
+ lv_obj_set_event_cb_mks(buttonPoint2, event_handler, ID_M_POINT2, "bmp_Leveling2.bin", 0);
+ lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPoint2, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonPoint3, event_handler, ID_M_POINT3, "bmp_Leveling3.bin", 0);
+ lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPoint3, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonPoint4, event_handler, ID_M_POINT4, "bmp_Leveling4.bin", 0);
+ lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPoint4, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonPoint5, event_handler, ID_M_POINT5, "bmp_Leveling5.bin", 0);
+ lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPoint5, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonPoint1, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonPoint2, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight);
+ lv_obj_set_pos(buttonPoint3, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight);
+ lv_obj_set_pos(buttonPoint4, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttonPoint5, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonPoint1, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonPoint2, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonPoint3, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonPoint4, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonPoint5, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ lv_obj_t * label_Point1 = lv_label_create(buttonPoint1, NULL);
+ lv_obj_t * label_Point2 = lv_label_create(buttonPoint2, NULL);
+ lv_obj_t * label_Point3 = lv_label_create(buttonPoint3, NULL);
+ lv_obj_t * label_Point4 = lv_label_create(buttonPoint4, NULL);
+ lv_obj_t * label_Point5 = lv_label_create(buttonPoint5, NULL);
+ lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(label_Point1, leveling_menu.position1);
+ lv_obj_align(label_Point1, buttonPoint1, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Point2, leveling_menu.position2);
+ lv_obj_align(label_Point2, buttonPoint2, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Point3, leveling_menu.position3);
+ lv_obj_align(label_Point3, buttonPoint3, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Point4, leveling_menu.position4);
+ lv_obj_align(label_Point4, buttonPoint4, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Point5, leveling_menu.position5);
+ lv_obj_align(label_Point5, buttonPoint5, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+}
+
+void lv_clear_manualLevel() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h
new file mode 100644
index 0000000000..346e0bb3f7
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h
@@ -0,0 +1,34 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_manualLevel(void);
+extern void lv_clear_manualLevel();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp
new file mode 100644
index 0000000000..71d5d7427a
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp
@@ -0,0 +1,329 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "../../../../MarlinCore.h"
+#include "lv_conf.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+#include "draw_ui.h"
+#include "../../../../gcode/queue.h"
+
+static lv_obj_t * scr;
+
+static lv_obj_t * labelV, *buttonV;
+
+#define ID_M_X_P 1
+#define ID_M_X_N 2
+#define ID_M_Y_P 3
+#define ID_M_Y_N 4
+#define ID_M_Z_P 5
+#define ID_M_Z_N 6
+#define ID_M_STEP 7
+#define ID_M_RETURN 8
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_M_X_P:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (queue.length <= (BUFSIZE - 3)) {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ queue.enqueue_one_P(PSTR("G91"));
+ sprintf(public_buf_l, "G1 X%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed);
+ queue.enqueue_one_P(PSTR(public_buf_l));
+ queue.enqueue_one_P(PSTR("G90"));
+ }
+ }
+ break;
+ case ID_M_X_N:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (queue.length <= (BUFSIZE - 3)) {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ queue.enqueue_one_now(PSTR("G91"));
+ sprintf(public_buf_l, "G1 X-%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed);
+ queue.enqueue_one_now(PSTR(public_buf_l));
+ queue.enqueue_one_now(PSTR("G90"));
+ }
+ }
+ break;
+ case ID_M_Y_P:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (queue.length <= (BUFSIZE - 3)) {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ queue.enqueue_one_now(PSTR("G91"));
+ sprintf(public_buf_l, "G1 Y%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed);
+ queue.enqueue_one_now(PSTR(public_buf_l));
+ queue.enqueue_one_now(PSTR("G90"));
+ }
+ }
+ break;
+ case ID_M_Y_N:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (queue.length <= (BUFSIZE - 3)) {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ queue.enqueue_one_now(PSTR("G91"));
+ sprintf(public_buf_l, "G1 Y-%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed);
+ queue.enqueue_one_now(PSTR(public_buf_l));
+ queue.enqueue_one_now(PSTR("G90"));
+ }
+ }
+ break;
+ case ID_M_Z_P:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (queue.length <= (BUFSIZE - 3)) {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ queue.enqueue_one_now(PSTR("G91"));
+ sprintf(public_buf_l, "G1 Z%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed);
+ queue.enqueue_one_now(PSTR(public_buf_l));
+ queue.enqueue_one_now(PSTR("G90"));
+ }
+ }
+ break;
+ case ID_M_Z_N:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (queue.length <= (BUFSIZE - 3)) {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ queue.enqueue_one_now(PSTR("G91"));
+ sprintf(public_buf_l, "G1 Z-%3.1f F%d", uiCfg.move_dist, uiCfg.moveSpeed);
+ queue.enqueue_one_now(PSTR(public_buf_l));
+ queue.enqueue_one_now(PSTR("G90"));
+ }
+ }
+ break;
+ case ID_M_STEP:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (abs(10 * (int)uiCfg.move_dist) == 100)
+ uiCfg.move_dist = 0.1;
+ else
+ uiCfg.move_dist *= (float)10;
+
+ disp_move_dist();
+ }
+
+ break;
+ case ID_M_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ clear_cur_ui();
+ draw_return_ui();
+ }
+ break;
+
+ }
+}
+
+
+void lv_draw_move_motor(void) {
+ lv_obj_t *buttonXI, *buttonXD, *buttonYI, *buttonYD;
+ lv_obj_t *buttonZI, *buttonZD, *buttonBack;
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MOVE_MOTOR_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = MOVE_MOTOR_UI;
+ }
+ disp_state = MOVE_MOTOR_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+
+ /*Create an Image button*/
+ buttonXI = lv_imgbtn_create(scr, NULL);
+ buttonXD = lv_imgbtn_create(scr, NULL);
+ buttonYI = lv_imgbtn_create(scr, NULL);
+ buttonYD = lv_imgbtn_create(scr, NULL);
+ buttonZI = lv_imgbtn_create(scr, NULL);
+ buttonZD = lv_imgbtn_create(scr, NULL);
+ buttonV = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_M_X_P, "bmp_xAdd.bin", 0);
+ lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonXI, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonXI, LV_PROTECT_FOLLOW);
+ #if 1
+ lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_M_X_N, "bmp_xDec.bin", 0);
+ lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonXD, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonYI, event_handler, ID_M_Y_P, "bmp_yAdd.bin", 0);
+ lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonYI, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonYD, event_handler, ID_M_Y_N, "bmp_yDec.bin", 0);
+ lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonYD, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonZI, event_handler, ID_M_Z_P, "bmp_zAdd.bin", 0);
+ lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonZI, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonZD, event_handler, ID_M_Z_N, "bmp_zDec.bin", 0);
+ lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonZD, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ //lv_obj_set_event_cb_mks(buttonV, event_handler,ID_T_MORE,"bmp_More.bin",0);
+ lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonV, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonV, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_M_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+ lv_obj_set_pos(buttonXI, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonYI, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight);
+ lv_obj_set_pos(buttonZI, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight);
+ lv_obj_set_pos(buttonV, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttonXD, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonYD, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonZD, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonXD, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonYI, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonYD, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonZI, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonZD, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonV, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ lv_obj_t * labelXI = lv_label_create(buttonXI, NULL);
+ lv_obj_t * labelXD = lv_label_create(buttonXD, NULL);
+ lv_obj_t * labelYI = lv_label_create(buttonYI, NULL);
+ lv_obj_t * labelYD = lv_label_create(buttonYD, NULL);
+ lv_obj_t * labelZI = lv_label_create(buttonZI, NULL);
+ lv_obj_t * labelZD = lv_label_create(buttonZD, NULL);
+ labelV = lv_label_create(buttonV, NULL);
+ lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelXI, move_menu.x_add);
+ lv_obj_align(labelXI, buttonXI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelXD, move_menu.x_dec);
+ lv_obj_align(labelXD, buttonXD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelYI, move_menu.y_add);
+ lv_obj_align(labelYI, buttonYI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelYD, move_menu.y_dec);
+ lv_obj_align(labelYD, buttonYD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelZI, move_menu.z_add);
+ lv_obj_align(labelZI, buttonZI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelZD, move_menu.z_dec);
+ lv_obj_align(labelZD, buttonZD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+
+ disp_move_dist();
+}
+
+void disp_move_dist() {
+ //char buf[30] = {0};
+
+ if ((int)(10 * uiCfg.move_dist) == 1)
+ lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_Step_move0_1.bin", 0);
+ else if ((int)(10 * uiCfg.move_dist) == 10)
+ lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_Step_move1.bin", 0);
+ else if ((int)(10 * uiCfg.move_dist) == 100)
+ lv_obj_set_event_cb_mks(buttonV, event_handler, ID_M_STEP, "bmp_Step_move10.bin", 0);
+ if (gCfgItems.multiple_language != 0) {
+ if ((int)(10 * uiCfg.move_dist) == 1) {
+ lv_label_set_text(labelV, move_menu.step_01mm);
+ lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else if ((int)(10 * uiCfg.move_dist) == 10) {
+ lv_label_set_text(labelV, move_menu.step_1mm);
+ lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else if ((int)(10 * uiCfg.move_dist) == 100) {
+ lv_label_set_text(labelV, move_menu.step_10mm);
+ lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ }
+}
+
+void lv_clear_move_motor() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h
new file mode 100644
index 0000000000..407ff311e9
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h
@@ -0,0 +1,35 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_move_motor(void);
+extern void lv_clear_move_motor();
+extern void disp_move_dist();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp
new file mode 100644
index 0000000000..483de3fcc8
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.cpp
@@ -0,0 +1,322 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "lv_conf.h"
+#include "draw_ui.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+
+static lv_obj_t * scr;
+
+#define ID_O_PRE_HEAT 1
+#define ID_O_EXTRUCT 2
+#define ID_O_MOV 3
+#define ID_O_FILAMENT 4
+#define ID_O_SPEED 5
+#define ID_O_RETURN 6
+#define ID_O_FAN 7
+#define ID_O_POWER_OFF 8
+
+static lv_obj_t *label_PowerOff;
+static lv_obj_t *buttonPowerOff;
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_O_PRE_HEAT:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_clear_opration();
+ lv_draw_preHeat();
+ }
+ break;
+ case ID_O_EXTRUCT:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_clear_opration();
+ lv_draw_extrusion();
+ }
+ break;
+ case ID_O_MOV:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_clear_opration();
+ lv_draw_move_motor();
+ }
+ break;
+ case ID_O_FILAMENT:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ }
+ break;
+ case ID_O_FAN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_clear_opration();
+ lv_draw_fan();
+ }
+ break;
+ case ID_O_SPEED:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_clear_opration();
+ lv_draw_change_speed();
+ }
+ break;
+ case ID_O_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ clear_cur_ui();
+ draw_return_ui();
+ }
+ break;
+ case ID_O_POWER_OFF:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (gCfgItems.finish_power_off == 1) {
+ gCfgItems.finish_power_off = 0;
+ lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_Mamual.bin", 0);
+ lv_label_set_text(label_PowerOff, printing_more_menu.manual);
+ lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ lv_obj_refresh_ext_draw_pad(label_PowerOff);
+ update_spi_flash();
+ }
+ else {
+ gCfgItems.finish_power_off = 1;
+ lv_obj_set_event_cb_mks(obj, event_handler, ID_O_POWER_OFF, "bmp_Auto.bin", 0);
+ lv_label_set_text(label_PowerOff, printing_more_menu.auto_close);
+ lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ lv_obj_refresh_ext_draw_pad(label_PowerOff);
+ update_spi_flash();
+ }
+ }
+ break;
+
+ }
+}
+
+void lv_draw_opration(void) {
+ lv_obj_t *buttonPreHeat, *buttonExtrusion, *buttonSpeed;
+ lv_obj_t *buttonBack, *buttonFan;
+ lv_obj_t *labelPreHeat, *labelExtrusion;
+ lv_obj_t *label_Back, *label_Speed, *label_Fan;
+ lv_obj_t *buttonMove = NULL, *label_Move = NULL;
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != OPERATE_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = OPERATE_UI;
+ }
+ disp_state = OPERATE_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ buttonPreHeat = lv_imgbtn_create(scr, NULL);
+ buttonExtrusion = lv_imgbtn_create(scr, NULL);
+ buttonFan = lv_imgbtn_create(scr, NULL);
+ buttonSpeed = lv_imgbtn_create(scr, NULL);
+
+ if (uiCfg.print_state != WORKING)
+ //buttonFilament = lv_imgbtn_create(scr, NULL);
+ //else
+ buttonMove = lv_imgbtn_create(scr, NULL);
+ buttonPowerOff = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_O_PRE_HEAT, "bmp_PreHeat.bin", 0);
+ lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonPreHeat, LV_PROTECT_FOLLOW);
+ #if 1
+ lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_O_EXTRUCT, "bmp_Extruct.bin", 0);
+ lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_O_FAN, "bmp_Fan.bin", 0);
+ lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_O_SPEED, "bmp_Speed.bin", 0);
+ lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonSpeed, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ if (uiCfg.print_state != WORKING) {
+ /*{
+ lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_O_FILAMENT,"bmp_Filamentchange.bin",0);
+ lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ }
+ else*/
+ lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_O_MOV, "bmp_Mov.bin", 0);
+ lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ }
+ if (gCfgItems.finish_power_off == 1)
+ lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_Auto.bin", 0);
+ else
+ lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, "bmp_Mamual.bin", 0);
+ lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPowerOff, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_O_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonExtrusion, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight);
+
+ lv_obj_set_pos(buttonFan, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight);
+ lv_obj_set_pos(buttonSpeed, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+
+ if (uiCfg.print_state != WORKING) {
+ /*{
+ lv_obj_set_pos(buttonFilament,INTERVAL_V,BTN_Y_PIXEL+INTERVAL_H+titleHeight);
+ }
+ else*/
+ lv_obj_set_pos(buttonMove, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonPowerOff, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ }
+ else {
+ lv_obj_set_pos(buttonPowerOff, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ }
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF);
+
+ if (uiCfg.print_state != WORKING)
+ /*{
+ lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF);
+ }
+ else*/
+ lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonPowerOff, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ labelPreHeat = lv_label_create(buttonPreHeat, NULL);
+ labelExtrusion = lv_label_create(buttonExtrusion, NULL);
+
+ label_Fan = lv_label_create(buttonFan, NULL);
+ label_Speed = lv_label_create(buttonSpeed, NULL);
+
+ if (uiCfg.print_state != WORKING)
+ /*{
+ label_Filament = lv_label_create(buttonFilament, NULL);
+ }
+ else*/
+ label_Move = lv_label_create(buttonMove, NULL);
+ label_PowerOff = lv_label_create(buttonPowerOff, NULL);
+
+ label_Back = lv_label_create(buttonBack, NULL);
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelPreHeat, operation_menu.temp);
+ lv_obj_align(labelPreHeat, buttonPreHeat, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelExtrusion, operation_menu.extr);
+ lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Fan, operation_menu.fan);
+ lv_obj_align(label_Fan, buttonFan, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Speed, operation_menu.speed);
+ lv_obj_align(label_Speed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ if (uiCfg.print_state != WORKING) {
+ /*{
+ lv_label_set_text(label_Filament, operation_menu.filament);
+ lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else*/
+ lv_label_set_text(label_Move, operation_menu.move);
+ lv_obj_align(label_Move, buttonMove, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+
+ if (gCfgItems.finish_power_off == 1)
+ lv_label_set_text(label_PowerOff, printing_more_menu.auto_close);
+ else
+ lv_label_set_text(label_PowerOff, printing_more_menu.manual);
+ lv_obj_align(label_PowerOff, buttonPowerOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+}
+
+void lv_clear_opration() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.h
new file mode 100644
index 0000000000..27f21d4b4c
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_opration.h
@@ -0,0 +1,34 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_opration(void);
+extern void lv_clear_opration();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp
new file mode 100644
index 0000000000..cf477ec104
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp
@@ -0,0 +1,55 @@
+/**
+ * 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 BOTH(TFT_LITTLE_VGL_UI, ADVANCED_PAUSE_FEATURE)
+
+#include "draw_ui.h"
+#include "lv_conf.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+#include "../../../../feature/pause.h"
+
+void lv_draw_pause_message(const PauseMessage msg) {
+ switch (msg) {
+ case PAUSE_MESSAGE_PAUSING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_PAUSING); break;
+ case PAUSE_MESSAGE_CHANGING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_CHANGING); break;
+ case PAUSE_MESSAGE_UNLOAD: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_UNLOAD); break;
+ case PAUSE_MESSAGE_WAITING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_WAITING); break;
+ case PAUSE_MESSAGE_INSERT: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_INSERT); break;
+ case PAUSE_MESSAGE_LOAD: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_LOAD); break;
+ case PAUSE_MESSAGE_PURGE: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_PURGE); break;
+ case PAUSE_MESSAGE_RESUME: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_RESUME); break;
+ case PAUSE_MESSAGE_HEAT: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_HEAT); break;
+ case PAUSE_MESSAGE_HEATING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_HEATING); break;
+ case PAUSE_MESSAGE_OPTION: pause_menu_response = PAUSE_RESPONSE_WAIT_FOR;
+ clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_OPTION); break;
+ case PAUSE_MESSAGE_STATUS:
+ default: break;
+ }
+}
+
+#endif // TFT_LITTLE_VGL_UI && ADVANCED_PAUSE_FEATURE
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h
new file mode 100644
index 0000000000..5b0d4aba6e
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h
@@ -0,0 +1,33 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_pause_message(const PauseMessage msg);
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp
new file mode 100644
index 0000000000..beea30018c
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp
@@ -0,0 +1,392 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "lv_conf.h"
+#include "draw_ui.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+#include "../../../../module/temperature.h"
+
+static lv_obj_t * scr;
+static lv_obj_t *buttoType, *buttonStep;
+static lv_obj_t * labelType;
+static lv_obj_t * labelStep;
+static lv_obj_t * tempText1;
+
+#define ID_P_ADD 1
+#define ID_P_DEC 2
+#define ID_P_TYPE 3
+#define ID_P_STEP 4
+#define ID_P_OFF 5
+#define ID_P_RETURN 6
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_P_ADD:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (uiCfg.curTempType == 0) {
+ thermalManager.temp_hotend[uiCfg.curSprayerChoose].target += uiCfg.stepHeat;
+ if (uiCfg.curSprayerChoose == 0) {
+ if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) {
+ thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1);
+
+ thermalManager.start_watching_hotend(uiCfg.curSprayerChoose);
+ }
+ }
+ #if !defined(SINGLENOZZLE) && EXTRUDERS >= 2
+ else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) {
+ thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1);
+
+ thermalManager.start_watching_hotend(uiCfg.curSprayerChoose);
+ }
+ #endif
+ }
+ #if HAS_HEATED_BED
+ else {
+
+ thermalManager.temp_bed.target += uiCfg.stepHeat;
+
+ if ((int)thermalManager.temp_bed.target > BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) {
+ thermalManager.temp_bed.target = (float)BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1);
+ thermalManager.start_watching_bed();
+ }
+
+ }
+ #endif
+ disp_desire_temp();
+ }
+ break;
+ case ID_P_DEC:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (uiCfg.curTempType == 0) {
+ if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > uiCfg.stepHeat) {
+ thermalManager.temp_hotend[uiCfg.curSprayerChoose].target -= uiCfg.stepHeat;
+ thermalManager.start_watching_hotend(uiCfg.curSprayerChoose);
+ }
+ else {
+ thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)0;
+ thermalManager.start_watching_hotend(uiCfg.curSprayerChoose);
+ }
+ }
+ #if HAS_HEATED_BED
+ else {
+ if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) {
+ thermalManager.temp_bed.target -= uiCfg.stepHeat;
+ thermalManager.start_watching_bed();
+ }
+ else {
+ thermalManager.temp_bed.target = (float)0;
+ thermalManager.start_watching_bed();
+ }
+ }
+ #endif
+ disp_desire_temp();
+ }
+
+ break;
+ case ID_P_TYPE:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (uiCfg.curTempType == 0) {
+ if (EXTRUDERS == 2) {
+ if (uiCfg.curSprayerChoose == 0) {
+ uiCfg.curSprayerChoose = 1;
+ }
+ else if (uiCfg.curSprayerChoose == 1) {
+ if (TEMP_SENSOR_BED != 0) {
+ uiCfg.curTempType = 1;
+ }
+ else {
+ uiCfg.curTempType = 0;
+ uiCfg.curSprayerChoose = 0;
+ }
+ }
+ }
+ else if (uiCfg.curSprayerChoose == 0) {
+ if (TEMP_SENSOR_BED != 0)
+ uiCfg.curTempType = 1;
+ else
+ uiCfg.curTempType = 0;
+ }
+ }
+ else if (uiCfg.curTempType == 1) {
+ uiCfg.curSprayerChoose = 0;
+ uiCfg.curTempType = 0;
+ }
+ disp_temp_type();
+ }
+ break;
+ case ID_P_STEP:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ switch (uiCfg.stepHeat) {
+ case 1: uiCfg.stepHeat = 5; break;
+ case 5: uiCfg.stepHeat = 10; break;
+ case 10: uiCfg.stepHeat = 1; break;
+ default: break;
+ }
+ disp_step_heat();
+ }
+ break;
+ case ID_P_OFF:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (uiCfg.curTempType == 0) {
+ thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)0;
+ thermalManager.start_watching_hotend(uiCfg.curSprayerChoose);
+ }
+ #if HAS_HEATED_BED
+ else {
+ thermalManager.temp_bed.target = (float)0;
+ thermalManager.start_watching_bed();
+ }
+ #endif
+ disp_desire_temp();
+ }
+ break;
+ case ID_P_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ clear_cur_ui();
+ draw_return_ui();
+ }
+ break;
+ }
+}
+
+void lv_draw_preHeat(void) {
+ lv_obj_t *buttonAdd, *buttonDec;
+ lv_obj_t *buttonOff, *buttonBack;
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PRE_HEAT_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = PRE_HEAT_UI;
+ }
+ disp_state = PRE_HEAT_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ buttonAdd = lv_imgbtn_create(scr, NULL);
+ buttonDec = lv_imgbtn_create(scr, NULL);
+ buttoType = lv_imgbtn_create(scr, NULL);
+ buttonStep = lv_imgbtn_create(scr, NULL);
+ buttonOff = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_P_ADD, "bmp_Add.bin", 0);
+ lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonAdd, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW);
+ #if 1
+ lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_P_DEC, "bmp_Dec.bin", 0);
+ lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonDec, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+
+ lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttoType, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttoType, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+
+ lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonStep, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonOff, event_handler, ID_P_OFF, "bmp_Speed0.bin", 0);
+ lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonOff, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonAdd, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonDec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttoType, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonStep, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonOff, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttoType, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonOff, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ lv_obj_t * labelAdd = lv_label_create(buttonAdd, NULL);
+ lv_obj_t * labelDec = lv_label_create(buttonDec, NULL);
+ labelType = lv_label_create(buttoType, NULL);
+ labelStep = lv_label_create(buttonStep, NULL);
+ lv_obj_t * labelOff = lv_label_create(buttonOff, NULL);
+ lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelAdd, preheat_menu.add);
+ lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelDec, preheat_menu.dec);
+ lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelOff, preheat_menu.off);
+ lv_obj_align(labelOff, buttonOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+
+ disp_temp_type();
+ disp_step_heat();
+
+ tempText1 = lv_label_create(scr, NULL);
+ lv_obj_set_style(tempText1, &tft_style_lable_rel);
+ disp_desire_temp();
+}
+
+void disp_temp_type() {
+
+ if (uiCfg.curTempType == 0) {
+ if (uiCfg.curSprayerChoose == 1) {
+ lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_Extru2.bin", 0);
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelType, preheat_menu.ext2);
+ lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ }
+ else {
+ lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_Extru1.bin", 0);
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelType, preheat_menu.ext1);
+ lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ }
+
+ }
+ else {
+ lv_obj_set_event_cb_mks(buttoType, event_handler, ID_P_TYPE, "bmp_Bed.bin", 0);
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelType, preheat_menu.hotbed);
+ lv_obj_align(labelType, buttoType, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ }
+
+}
+
+void disp_desire_temp() {
+ char buf[20] = {0};
+
+ public_buf_l[0] = '\0';
+
+ if (uiCfg.curTempType == 0) {
+ if (uiCfg.curSprayerChoose < 1)
+ strcat(public_buf_l, preheat_menu.ext1);
+ else
+ strcat(public_buf_l, preheat_menu.ext2);
+ sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target);
+ }
+ #if HAS_HEATED_BED
+ else {
+ strcat(public_buf_l, preheat_menu.hotbed);
+ sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target);
+ }
+ #endif
+ strcat(public_buf_l, ": ");
+ strcat(public_buf_l, buf);
+ lv_label_set_text(tempText1, public_buf_l);
+ lv_obj_align(tempText1, NULL, LV_ALIGN_CENTER, 0, -50);
+}
+
+void disp_step_heat() {
+ if (uiCfg.stepHeat == 1)
+ lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_Step1_degree.bin", 0);
+ else if (uiCfg.stepHeat == 5)
+ lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_Step5_degree.bin", 0);
+ else if (uiCfg.stepHeat == 10)
+ lv_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, "bmp_Step10_degree.bin", 0);
+
+ if (gCfgItems.multiple_language != 0) {
+ if (uiCfg.stepHeat == 1) {
+ lv_label_set_text(labelStep, preheat_menu.step_1c);
+ lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else if (uiCfg.stepHeat == 5) {
+ lv_label_set_text(labelStep, preheat_menu.step_5c);
+ lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ else if (uiCfg.stepHeat == 10) {
+ lv_label_set_text(labelStep, preheat_menu.step_10c);
+ lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ }
+}
+
+void lv_clear_preHeat() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h
new file mode 100644
index 0000000000..c042b70cf9
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h
@@ -0,0 +1,37 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_preHeat(void);
+extern void lv_clear_preHeat();
+extern void disp_temp_type();
+extern void disp_step_heat();
+extern void disp_desire_temp();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp
new file mode 100644
index 0000000000..cc9fa0e04d
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp
@@ -0,0 +1,595 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "../../../../MarlinCore.h"
+#include "lv_conf.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+#include "draw_ui.h"
+#include "../../../../sd/cardreader.h"
+
+static lv_obj_t * scr;
+
+static lv_obj_t *buttonPageUp, *buttonPageDown, *buttonBack, *buttonGcode[FILE_BTN_CNT];
+static lv_obj_t * labelPageUp[FILE_BTN_CNT];
+static lv_obj_t *buttonText[FILE_BTN_CNT];
+
+#define ID_P_UP 7
+#define ID_P_DOWN 8
+#define ID_P_RETURN 9
+
+int8_t curDirLever = 0;
+LIST_FILE list_file;
+DIR_OFFSET dir_offset[10];
+
+extern uint8_t public_buf[512];
+extern char public_buf_m[100];
+
+uint8_t sel_id = 0;
+
+#if ENABLED(SDSUPPORT)
+
+static uint8_t search_file() {
+ int valid_name_cnt = 0;
+ //char tmp[SHORT_NEME_LEN*MAX_DIR_LEVEL+1];
+
+ list_file.Sd_file_cnt = 0;
+ //list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset;
+
+ //root2.rewind();
+ //SERIAL_ECHOLN(list_file.curDirPath);
+
+ if (curDirLever != 0) card.cd(list_file.curDirPath);
+ else card.cdroot(); //while(card.cdup());
+
+ const uint16_t fileCnt = card.get_num_Files();
+
+ for (uint16_t i = 0; i < fileCnt; i++) {
+ if (list_file.Sd_file_cnt == list_file.Sd_file_offset) {
+ const uint16_t nr = SD_ORDER(i, fileCnt);
+ card.getfilename_sorted(nr);
+
+ if (card.flag.filenameIsDir)
+ /*
+ SERIAL_ECHOLN(card.longest_filename);
+ */
+ list_file.IsFolder[valid_name_cnt] = 1;
+ else
+ //SERIAL_ECHOLN(card.longFilename);
+ list_file.IsFolder[valid_name_cnt] = 0;
+
+ #if 1
+ //
+ memset(list_file.file_name[valid_name_cnt], 0, strlen(list_file.file_name[valid_name_cnt]));
+ strcpy(list_file.file_name[valid_name_cnt], list_file.curDirPath);
+ strcat(list_file.file_name[valid_name_cnt], "/");
+ strcat(list_file.file_name[valid_name_cnt], card.filename);
+ //
+ memset(list_file.long_name[valid_name_cnt], 0, strlen(list_file.long_name[valid_name_cnt]));
+ if (card.longFilename[0] == 0)
+ strncpy(list_file.long_name[valid_name_cnt], card.filename, strlen(card.filename));
+ else
+ strncpy(list_file.long_name[valid_name_cnt], card.longFilename, strlen(card.longFilename));
+
+ valid_name_cnt++;
+ if (valid_name_cnt == 1)
+ dir_offset[curDirLever].cur_page_first_offset = list_file.Sd_file_offset;
+ if (valid_name_cnt >= FILE_NUM) {
+ dir_offset[curDirLever].cur_page_last_offset = list_file.Sd_file_offset;
+ list_file.Sd_file_offset++;
+ break;
+ }
+ list_file.Sd_file_offset++;
+ #endif
+ }
+ list_file.Sd_file_cnt++;
+ }
+ //card.closefile(false);
+ return valid_name_cnt;
+}
+
+#endif // SDSUPPORT
+
+uint8_t have_pre_pic(char *path) {
+ #if ENABLED(SDSUPPORT)
+ char *ps1, *ps2, *cur_name = strrchr(path, '/');
+
+ card.openFileRead(cur_name);
+ card.read(public_buf, 512);
+ ps1 = strstr((char *)public_buf, ";simage:");
+ card.read(public_buf, 512);
+ ps2 = strstr((char *)public_buf, ";simage:");
+ if (ps1 || ps2) {
+ card.closefile();
+ return 1;
+ }
+ card.closefile();
+ #endif
+
+ return 0;
+}
+
+LV_IMG_DECLARE(bmp_pic_117x92);
+LV_IMG_DECLARE(bmp_pic_100x100);
+LV_IMG_DECLARE(bmp_pic);
+LV_IMG_DECLARE(bmp_pic_100x40);
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ uint8_t i, file_count = 0;
+ //switch (obj->mks_obj_id)
+ //{
+ if (obj->mks_obj_id == ID_P_UP) {
+ if (event == LV_EVENT_CLICKED) {
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (dir_offset[curDirLever].curPage > 0) {
+ //2015.05.19
+ list_file.Sd_file_cnt = 0;
+
+ if (dir_offset[curDirLever].cur_page_first_offset >= FILE_NUM)
+ list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset - FILE_NUM;
+
+ #if ENABLED(SDSUPPORT)
+ file_count = search_file();
+ #endif
+ if (file_count != 0) {
+ dir_offset[curDirLever].curPage--;
+ lv_obj_del(scr);
+ disp_gcode_icon(file_count);
+ }
+ }
+ }
+ }
+ else if (obj->mks_obj_id == ID_P_DOWN) {
+ if (event == LV_EVENT_CLICKED) {
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (dir_offset[curDirLever].cur_page_last_offset > 0) {
+ list_file.Sd_file_cnt = 0;
+ list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_last_offset + 1;
+ #if ENABLED(SDSUPPORT)
+ file_count = search_file();
+ #endif
+ if (file_count != 0) {
+ dir_offset[curDirLever].curPage++;
+ lv_obj_del(scr);
+ disp_gcode_icon(file_count);
+ }
+ if (file_count < FILE_NUM)
+ dir_offset[curDirLever].cur_page_last_offset = 0;
+ }
+ }
+ }
+ else if (obj->mks_obj_id == ID_P_RETURN) {
+ if (event == LV_EVENT_CLICKED) {
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (curDirLever > 0) {
+ int8_t *ch = (int8_t *)strrchr(list_file.curDirPath, '/');
+ if (ch) {
+ *ch = 0;
+ #if ENABLED(SDSUPPORT)
+ card.cdup();
+ #endif
+ dir_offset[curDirLever].curPage = 0;
+ dir_offset[curDirLever].cur_page_first_offset = 0;
+ dir_offset[curDirLever].cur_page_last_offset = 0;
+ curDirLever--;
+ list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset;
+ #if ENABLED(SDSUPPORT)
+ file_count = search_file();
+ #endif
+ lv_obj_del(scr);
+ disp_gcode_icon(file_count);
+ }
+ }
+ else {
+ lv_obj_del(scr);
+ lv_draw_ready_print();
+ }
+ }
+ }
+ else {
+ for (i = 0; i < FILE_BTN_CNT; i++) {
+ if (obj->mks_obj_id == (i + 1)) {
+ if (event == LV_EVENT_CLICKED) {
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (list_file.file_name[i][0] != 0) {
+ if (list_file.IsFolder[i] == 1) {
+ memset(list_file.curDirPath, 0, sizeof(list_file.curDirPath));
+ strcpy(list_file.curDirPath, list_file.file_name[i]);
+ curDirLever++;
+ list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset;
+ #if ENABLED(SDSUPPORT)
+ file_count = search_file();
+ #endif
+ lv_obj_del(scr);
+ disp_gcode_icon(file_count);
+ }
+ else {
+ sel_id = i;
+ lv_obj_del(scr);
+ lv_draw_dialog(DIALOG_TYPE_PRINT_FILE);
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+}
+
+void lv_draw_print_file(void) {
+ //uint8_t i;
+ uint8_t file_count;
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PRINT_FILE_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINT_FILE_UI;
+ }
+ disp_state = PRINT_FILE_UI;
+
+ curDirLever = 0;
+ dir_offset[curDirLever].curPage = 0;
+
+ list_file.Sd_file_offset = 0;
+ list_file.Sd_file_cnt = 0;
+
+ ZERO(dir_offset);
+ ZERO(list_file.IsFolder);
+ ZERO(list_file.curDirPath);
+
+ list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset;
+ #if ENABLED(SDSUPPORT)
+ card.mount();
+ file_count = search_file();
+ #endif
+ disp_gcode_icon(file_count);
+
+ //lv_obj_t * labelPageUp = lv_label_create(buttonPageUp, NULL);
+ //lv_obj_t * labelPageDown = lv_label_create(buttonPageDown, NULL);
+ //lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+ /*
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelPageUp, tool_menu.preheat);
+ lv_obj_align(labelPageUp, buttonPageUp, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelPageDown, tool_menu.extrude);
+ lv_obj_align(labelPageDown, buttonPageDown, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET);
+ }
+ */
+}
+
+void disp_gcode_icon(uint8_t file_num) {
+ uint8_t i;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ //static lv_style_t tool_style;
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ buttonPageUp = lv_imgbtn_create(scr, NULL);
+ buttonPageDown = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonPageUp, event_handler, ID_P_UP, "bmp_pageUp.bin", 0);
+ lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_REL, &bmp_pic_117x92);
+ lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_PR, &bmp_pic_117x92);
+ lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPageUp, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonPageUp, LV_PROTECT_FOLLOW);
+
+ #if 1
+ lv_obj_set_event_cb_mks(buttonPageDown, event_handler, ID_P_DOWN, "bmp_pageDown.bin", 0);
+ lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_REL, &bmp_pic_117x92);
+ lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_PR, &bmp_pic_117x92);
+ lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPageDown, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_P_RETURN, "bmp_Back.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic_117x92);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic_117x92);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonPageUp, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttonPageDown, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H);
+ lv_obj_set_pos(buttonBack, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL * 2 + INTERVAL_H * 2);
+
+ /*Create a label on the Image button*/
+
+ lv_btn_set_layout(buttonPageUp, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonPageDown, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ for (i = 0; i < FILE_BTN_CNT; i++) {
+ /*
+ if(seq) {
+ j = (FILE_BTN_CNT-1) - i;
+ back_flg = 1;
+ }
+ else {
+ j = i;
+ back_flg = 0;
+ }
+ */
+ if (i >= file_num) break;
+
+ #ifdef TFT35
+ buttonGcode[i] = lv_imgbtn_create(scr, NULL);
+
+ lv_imgbtn_set_style(buttonGcode[i], LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonGcode[i], LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonGcode[i], LV_PROTECT_FOLLOW);
+ lv_btn_set_layout(buttonGcode[i], LV_LAYOUT_OFF);
+
+ ZERO(public_buf_m);
+ cutFileName((char *)list_file.long_name[i], 16, 8, (char *)public_buf_m);
+
+ if (list_file.IsFolder[i] == 1) {
+ lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "bmp_Dir.bin", 0);
+ lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, &bmp_pic);
+ if (i < 3)
+ lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight);
+ else
+ lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1), BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ labelPageUp[i] = lv_label_create(buttonGcode[i], NULL);
+ lv_obj_set_style(labelPageUp[i], &tft_style_lable_rel);
+ lv_label_set_text(labelPageUp[i], public_buf_m);
+ lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5);
+ }
+ else {
+ if (have_pre_pic((char *)list_file.file_name[i])) {
+ lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), list_file.file_name[i], 1);
+ lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, &bmp_pic_100x100);
+ lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, &bmp_pic_100x100);
+ if (i < 3) {
+ lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET);
+ buttonText[i] = lv_btn_create(scr, NULL);
+ //lv_obj_set_event_cb(buttonText[i], event_handler);
+
+ lv_btn_set_style(buttonText[i], LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_btn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_lable_rel);
+ //lv_obj_set_style(buttonText[i], &tft_style_lable_pre);
+ //lv_obj_set_style(buttonText[i], &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW);
+ lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF);
+ //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL,0);
+ //lv_imgbtn_set_src(buttonText[i], LV_BTN_STATE_REL, &bmp_pic_100x40);
+ //lv_imgbtn_set_src(buttonText[i], LV_BTN_STATE_PR, &bmp_pic_100x40);
+ lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET + 100);
+ lv_obj_set_size(buttonText[i], 100, 40);
+ }
+ else {
+ lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET);
+ buttonText[i] = lv_btn_create(scr, NULL);
+ //lv_obj_set_event_cb(buttonText[i], event_handler);
+
+ lv_btn_set_style(buttonText[i], LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_btn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ //lv_imgbtn_set_style(buttonText[i], LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW);
+ lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF);
+ //lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),NULL,0);
+ //lv_imgbtn_set_src(buttonText[i], LV_BTN_STATE_REL, &bmp_pic_100x40);
+ //lv_imgbtn_set_src(buttonText[i], LV_BTN_STATE_PR, &bmp_pic_100x40);
+ lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET + 100);
+ lv_obj_set_size(buttonText[i], 100, 40);
+ }
+ labelPageUp[i] = lv_label_create(buttonText[i], NULL);
+ lv_obj_set_style(labelPageUp[i], &tft_style_lable_rel);
+ lv_label_set_text(labelPageUp[i], public_buf_m);
+ lv_obj_align(labelPageUp[i], buttonText[i], LV_ALIGN_IN_BOTTOM_MID, 0, 0);
+ }
+ else {
+ lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "bmp_File.bin", 0);
+ lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, &bmp_pic);
+ if (i < 3)
+ lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight);
+ else
+ lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1), BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ labelPageUp[i] = lv_label_create(buttonGcode[i], NULL);
+ lv_obj_set_style(labelPageUp[i], &tft_style_lable_rel);
+ lv_label_set_text(labelPageUp[i], public_buf_m);
+ lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5);
+ }
+ }
+ #else // ifdef TFT35
+ #endif // ifdef TFT35
+ }
+}
+
+void lv_open_gcode_file(char *path) {
+ #if ENABLED(SDSUPPORT)
+ //uint32_t read;
+ uint32_t *ps4;
+ int pre_sread_cnt;
+ char *cur_name;
+
+ cur_name = strrchr(path, '/');
+
+ card.openFileRead(cur_name);
+ card.read(public_buf, 512);
+ ps4 = (uint32_t *)strstr((char *)public_buf, ";simage:");
+
+ if (ps4) {
+ pre_sread_cnt = (uint32_t)ps4 - (uint32_t)((uint32_t *)(&public_buf[0]));
+ card.setIndex(pre_sread_cnt + 8);
+ }
+ #endif
+}
+
+int ascii2dec_test(char *ascii) {
+ int result = 0;
+
+ if (ascii == 0) return 0;
+
+ if (*(ascii) >= '0' && *(ascii) <= '9')
+ result = *(ascii) - '0';
+ else if (*(ascii) >= 'a' && *(ascii) <= 'f')
+ result = *(ascii) - 'a' + 0x0a;
+ else if (*(ascii) >= 'A' && *(ascii) <= 'F')
+ result = *(ascii) - 'A' + 0x0a;
+ else
+ return 0;
+
+ return result;
+}
+
+void lv_gcode_file_read(uint8_t *data_buf) {
+ #if ENABLED(SDSUPPORT)
+ uint16_t i = 0, j = 0, k = 0;
+ //uint32_t read;
+ uint16_t row_1 = 0;
+ char temp_test[200];
+
+ while (1) {
+ card.read(temp_test, 200);
+ for (i = 0; i < 200;) {
+ public_buf[row_1 * 200 + 100 * k + j] = (char)(ascii2dec_test(&temp_test[i]) << 4 | ascii2dec_test(&temp_test[i + 1]));
+ j++;
+ i += 2;
+ }
+ k++;
+ j = 0;
+ if (k >= 2) {
+ k = 0;
+ card.read(temp_test, 9);
+ break;
+ }
+ }
+ memcpy(data_buf, public_buf, 200);
+ #endif
+}
+
+void lv_close_gcode_file() {TERN_(SDSUPPORT, card.closefile());}
+
+void cutFileName(char *path, int len, int bytePerLine, char *outStr) {
+ #if _LFN_UNICODE
+ TCHAR *tmpFile;
+ TCHAR *strIndex1 = 0, *strIndex2 = 0, *beginIndex;
+ TCHAR secSeg[10] = {0};
+ TCHAR gFileTail[4] = {'~', '.', 'g', '\0'};
+ #else
+ char *tmpFile;
+ char *strIndex1 = 0, *strIndex2 = 0, *beginIndex;
+ char secSeg[10] = {0};
+ #endif
+
+ if (path == 0 || len <= 3 || outStr == 0) return;
+
+ tmpFile = path;
+ #if _LFN_UNICODE
+ strIndex1 = (WCHAR *)wcsstr((const WCHAR *)tmpFile, (const WCHAR *)'/');
+ strIndex2 = (WCHAR *)wcsstr((const WCHAR *)tmpFile, (const WCHAR *)'.');
+ #else
+ strIndex1 = (char *)strrchr(tmpFile, '/');
+ strIndex2 = (char *)strrchr(tmpFile, '.');
+ #endif
+
+ beginIndex = (strIndex1 != 0
+ // && (strIndex2 != 0) && (strIndex1 < strIndex2)
+ ) ? strIndex1 + 1 : tmpFile;
+
+ if (strIndex2 == 0 || (strIndex1 > strIndex2)) { // not gcode file
+ #if _LFN_UNICODE
+ if (wcslen(beginIndex) > len)
+ wcsncpy(outStr, beginIndex, len);
+ else
+ wcscpy(outStr, beginIndex);
+ #else
+ if ((int)strlen(beginIndex) > len)
+ strncpy(outStr, beginIndex, len);
+ else
+ strcpy(outStr, beginIndex);
+ #endif
+ }
+ else { //gcode file
+ if (strIndex2 - beginIndex > (len - 2)) {
+ #if _LFN_UNICODE
+ wcsncpy(outStr, (const WCHAR *)beginIndex, len - 3);
+ wcscat(outStr, (const WCHAR *)gFileTail);
+ #else
+ //strncpy(outStr, beginIndex, len - 3);
+ strncpy(outStr, beginIndex, len - 4);
+ strcat(outStr, "~.g");
+ #endif
+ }
+ else {
+ #if _LFN_UNICODE
+ wcsncpy(outStr, (const WCHAR *)beginIndex, strIndex2 - beginIndex + 1);
+ wcscat(outStr, (const WCHAR *)&gFileTail[3]);
+ #else
+ strncpy(outStr, beginIndex, strIndex2 - beginIndex + 1);
+ strcat(outStr, "g");
+ #endif
+ }
+ }
+
+ #if _LFN_UNICODE
+ if (wcslen(outStr) > bytePerLine) {
+ wcscpy(secSeg, (const WCHAR *)&outStr[bytePerLine]);
+ outStr[bytePerLine] = '\n';
+ outStr[bytePerLine + 1] = '\0';
+ wcscat(outStr, (const WCHAR *)secSeg);
+ }
+ #else
+ if ((int)strlen(outStr) > bytePerLine) {
+ strcpy(secSeg, &outStr[bytePerLine]);
+ outStr[bytePerLine] = '\n';
+ outStr[bytePerLine + 1] = '\0';
+ strcat(outStr, secSeg);
+ }
+ else {
+ strcat(outStr, "\n");
+ }
+ #endif
+}
+
+void lv_clear_print_file() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h
new file mode 100644
index 0000000000..1b060d44ba
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h
@@ -0,0 +1,65 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+typedef struct {
+ int cur_page_first_offset;
+ int cur_page_last_offset;
+ int curPage;
+} DIR_OFFSET;
+extern DIR_OFFSET dir_offset[10];
+
+#define FILE_NUM 6
+#define SHORT_NEME_LEN 13
+#define NAME_CUT_LEN 23
+
+#define MAX_DIR_LEVEL 10
+
+typedef struct {
+ //char longName[FILE_NUM][LONG_FILENAME_LENGTH];
+ char file_name[FILE_NUM][SHORT_NEME_LEN * MAX_DIR_LEVEL + 1];
+ char curDirPath[SHORT_NEME_LEN * MAX_DIR_LEVEL + 1];
+ char long_name[FILE_NUM][SHORT_NEME_LEN * 2 + 1];
+ char IsFolder[FILE_NUM];
+ char Sd_file_cnt;
+ char sd_file_index;
+ char Sd_file_offset;
+} LIST_FILE;
+extern LIST_FILE list_file;
+
+extern void disp_gcode_icon(uint8_t file_num);
+extern void lv_draw_print_file(void);
+extern void lv_open_gcode_file(char *path);
+extern void lv_gcode_file_read(uint8_t *data_buf);
+extern void lv_close_gcode_file();
+extern void cutFileName(char *path, int len, int bytePerLine, char *outStr);
+extern int ascii2dec_test(char *ascii);
+extern void lv_clear_print_file();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp
new file mode 100644
index 0000000000..16c2f3374d
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp
@@ -0,0 +1,435 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "lv_conf.h"
+#include "draw_ui.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+#include "../../../../module/temperature.h"
+#include "../../../../module/motion.h"
+#include "../../../../sd/cardreader.h"
+#include "../../../../gcode/queue.h"
+
+#if ENABLED(POWER_LOSS_RECOVERY)
+ #include "../../../../feature/powerloss.h"
+#endif
+
+static lv_obj_t * scr;
+static lv_obj_t * labelExt1, * labelExt2, * labelFan, * labelZpos, * labelTime;
+static lv_obj_t * labelPause, * labelStop, * labelOperat;
+static lv_obj_t * bar1;
+static lv_obj_t * buttonPause, *buttonOperat, *buttonStop;
+
+#if HAS_HEATED_BED
+ static lv_obj_t* labelBed;
+#endif
+
+#define ID_PAUSE 1
+#define ID_STOP 2
+#define ID_OPTION 3
+
+lv_style_t lv_bar_style_indic;
+
+uint8_t once_flag = 0;
+extern uint32_t To_pre_view;
+extern uint8_t flash_preview_begin;
+extern uint8_t default_preview_flg;
+extern uint8_t gcode_preview_over;
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_PAUSE:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (gcode_preview_over != 1) {
+ if (uiCfg.print_state == WORKING) {
+ //#if ENABLED(PARK_HEAD_ON_PAUSE)
+ //queue.inject_P(PSTR("M25 P\nM24"));
+ #if ENABLED(SDSUPPORT)
+ //queue.inject_P(PSTR("M25\nG91\nG1 Z10\nG90"));
+ card.pauseSDPrint();
+ stop_print_time();
+ uiCfg.print_state = PAUSING;
+ #endif
+ lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_Pause.bin", 0);
+ lv_label_set_text(labelPause, printing_menu.resume);
+ lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0);
+ }
+ else if (uiCfg.print_state == PAUSED) {
+ uiCfg.print_state = RESUMING;
+ //if (IS_SD_PAUSED())queue.inject_P(PSTR("M24"));// queue.inject_P(M24_STR);
+ lv_obj_set_event_cb_mks(obj, event_handler, ID_PAUSE, "bmp_Resume.bin", 0);
+ lv_label_set_text(labelPause, printing_menu.pause);
+ lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0);
+ }
+ #if ENABLED(POWER_LOSS_RECOVERY)
+ else if (uiCfg.print_state == REPRINTING) {
+ uiCfg.print_state = REPRINTED;
+ lv_obj_set_event_cb_mks(obj, event_handler, ID_PAUSE, "bmp_Resume.bin", 0);
+ lv_label_set_text(labelPause, printing_menu.pause);
+ lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0);
+ //recovery.resume();
+ print_time.minutes = recovery.info.print_job_elapsed / 60;
+ print_time.seconds = recovery.info.print_job_elapsed % 60;
+ print_time.hours = print_time.minutes / 60;
+ }
+ #endif
+ }
+ }
+ break;
+
+ case ID_STOP:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (gcode_preview_over != 1) {
+ lv_obj_del(scr);
+ lv_draw_dialog(DIALOG_TYPE_STOP);
+ }
+ }
+ break;
+ case ID_OPTION:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ if (gcode_preview_over != 1) {
+ lv_obj_del(scr);
+ lv_draw_opration();
+ }
+ }
+ break;
+ }
+}
+
+void lv_draw_printing(void) {
+ lv_obj_t *buttonExt1, *buttonExt2, *buttonFanstate, *buttonZpos, *buttonTime;
+ TERN_(HAS_HEATED_BED, lv_obj_t * buttonBedstate);
+
+ disp_state_stack._disp_index = 0;
+ ZERO(disp_state_stack._disp_state);
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINTING_UI;
+
+ disp_state = PRINTING_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ //static lv_style_t tool_style;
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic_150x80);
+ LV_IMG_DECLARE(bmp_pic_45x45);
+
+ /*Create an Image button*/
+ buttonExt1 = lv_imgbtn_create(scr, NULL);
+ if (EXTRUDERS == 2)
+ buttonExt2 = lv_imgbtn_create(scr, NULL);
+
+ #if HAS_HEATED_BED
+ buttonBedstate = lv_imgbtn_create(scr, NULL);
+ #endif
+
+ buttonFanstate = lv_imgbtn_create(scr, NULL);
+ buttonZpos = lv_imgbtn_create(scr, NULL);
+ buttonPause = lv_imgbtn_create(scr, NULL);
+ buttonStop = lv_imgbtn_create(scr, NULL);
+ buttonOperat = lv_imgbtn_create(scr, NULL);
+ buttonTime = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonExt1, event_handler, 0, "bmp_Ext1_state.bin", 0);
+ lv_imgbtn_set_src(buttonExt1, LV_BTN_STATE_REL, &bmp_pic_45x45);
+ lv_imgbtn_set_src(buttonExt1, LV_BTN_STATE_PR, &bmp_pic_45x45);
+ lv_imgbtn_set_style(buttonExt1, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonExt1, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonExt1, LV_PROTECT_FOLLOW);
+ #if 1
+ if (EXTRUDERS == 2) {
+ lv_obj_set_event_cb_mks(buttonExt2, event_handler, 0, "bmp_Ext2_state.bin", 0);
+ lv_imgbtn_set_src(buttonExt2, LV_BTN_STATE_REL, &bmp_pic_45x45);
+ lv_imgbtn_set_src(buttonExt2, LV_BTN_STATE_PR, &bmp_pic_45x45);
+ lv_imgbtn_set_style(buttonExt2, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonExt2, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ }
+ #if HAS_HEATED_BED
+ lv_obj_set_event_cb_mks(buttonBedstate, event_handler, 0, "bmp_Bed_state.bin", 0);
+ lv_imgbtn_set_src(buttonBedstate, LV_BTN_STATE_REL, &bmp_pic_45x45);
+ lv_imgbtn_set_src(buttonBedstate, LV_BTN_STATE_PR, &bmp_pic_45x45);
+ lv_imgbtn_set_style(buttonBedstate, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBedstate, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_event_cb_mks(buttonFanstate, event_handler, 0, "bmp_Fan_state.bin", 0);
+ lv_imgbtn_set_src(buttonFanstate, LV_BTN_STATE_REL, &bmp_pic_45x45);
+ lv_imgbtn_set_src(buttonFanstate, LV_BTN_STATE_PR, &bmp_pic_45x45);
+ lv_imgbtn_set_style(buttonFanstate, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonFanstate, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonTime, event_handler, 0, "bmp_Time_state.bin", 0);
+ lv_imgbtn_set_src(buttonTime, LV_BTN_STATE_REL, &bmp_pic_45x45);
+ lv_imgbtn_set_src(buttonTime, LV_BTN_STATE_PR, &bmp_pic_45x45);
+ lv_imgbtn_set_style(buttonTime, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonTime, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonZpos, event_handler, 0, "bmp_Zpos_state.bin", 0);
+ lv_imgbtn_set_src(buttonZpos, LV_BTN_STATE_REL, &bmp_pic_45x45);
+ lv_imgbtn_set_src(buttonZpos, LV_BTN_STATE_PR, &bmp_pic_45x45);
+ lv_imgbtn_set_style(buttonZpos, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonZpos, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ if (uiCfg.print_state == WORKING)
+ lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_Resume.bin", 0);
+ else
+ lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, "bmp_Pause.bin", 0);
+
+ lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, &bmp_pic_150x80);
+ lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, &bmp_pic_150x80);
+ lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPause, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonStop, event_handler, ID_STOP, "bmp_Stop.bin", 0);
+ lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_REL, &bmp_pic_150x80);
+ lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_PR, &bmp_pic_150x80);
+ lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonStop, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonOperat, event_handler, ID_OPTION, "bmp_Operate.bin", 0);
+ lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_REL, &bmp_pic_150x80);
+ lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_PR, &bmp_pic_150x80);
+ lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonOperat, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonExt1, 205, 136);
+ if (EXTRUDERS == 2)
+ lv_obj_set_pos(buttonExt2, 350, 136);
+
+ #if HAS_HEATED_BED
+ lv_obj_set_pos(buttonBedstate, 205, 186);
+ #endif
+
+ lv_obj_set_pos(buttonFanstate, 350, 186);
+ lv_obj_set_pos(buttonTime, 205, 86);
+ lv_obj_set_pos(buttonZpos, 350, 86);
+ lv_obj_set_pos(buttonPause, 5, 240);
+ lv_obj_set_pos(buttonStop, 165, 240);
+ lv_obj_set_pos(buttonOperat, 325, 240);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonExt1, LV_LAYOUT_OFF);
+ if (EXTRUDERS == 2)
+ lv_btn_set_layout(buttonExt2, LV_LAYOUT_OFF);
+
+ #if HAS_HEATED_BED
+ lv_btn_set_layout(buttonBedstate, LV_LAYOUT_OFF);
+ #endif
+
+ lv_btn_set_layout(buttonFanstate, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonZpos, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonPause, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonStop, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonOperat, LV_LAYOUT_OFF);
+
+ labelExt1 = lv_label_create(scr, NULL);
+ lv_obj_set_style(labelExt1, &tft_style_lable_rel);
+ lv_obj_set_pos(labelExt1, 250, 146);
+
+ if (EXTRUDERS == 2) {
+ labelExt2 = lv_label_create(scr, NULL);
+ lv_obj_set_style(labelExt2, &tft_style_lable_rel);
+ lv_obj_set_pos(labelExt2, 395, 146);
+ }
+
+ #if HAS_HEATED_BED
+ labelBed = lv_label_create(scr, NULL);
+ lv_obj_set_style(labelBed, &tft_style_lable_rel);
+ lv_obj_set_pos(labelBed, 250, 196);
+ #endif
+
+ labelFan = lv_label_create(scr, NULL);
+ lv_obj_set_style(labelFan, &tft_style_lable_rel);
+ lv_obj_set_pos(labelFan, 395, 196);
+
+ labelZpos = lv_label_create(scr, NULL);
+ lv_obj_set_style(labelZpos, &tft_style_lable_rel);
+ lv_obj_set_pos(labelZpos, 395, 96);
+
+ labelTime = lv_label_create(scr, NULL);
+ lv_obj_set_style(labelTime, &tft_style_lable_rel);
+ lv_obj_set_pos(labelTime, 250, 96);
+
+ labelPause = lv_label_create(buttonPause, NULL);
+ labelStop = lv_label_create(buttonStop, NULL);
+ labelOperat = lv_label_create(buttonOperat, NULL);
+
+ if (gCfgItems.multiple_language != 0) {
+ if (uiCfg.print_state == WORKING)
+ lv_label_set_text(labelPause, printing_menu.pause);
+ else
+ lv_label_set_text(labelPause, printing_menu.resume);
+ lv_obj_align(labelPause, buttonPause, LV_ALIGN_CENTER, 30, 0);
+
+ lv_label_set_text(labelStop, printing_menu.stop);
+ lv_obj_align(labelStop, buttonStop, LV_ALIGN_CENTER, 30, 0);
+
+ lv_label_set_text(labelOperat, printing_menu.option);
+ lv_obj_align(labelOperat, buttonOperat, LV_ALIGN_CENTER, 30, 0);
+ }
+
+ lv_style_copy(&lv_bar_style_indic, &lv_style_pretty_color);
+ lv_bar_style_indic.text.color = lv_color_hex3(0xADF);
+ lv_bar_style_indic.image.color = lv_color_hex3(0xADF);
+ lv_bar_style_indic.line.color = lv_color_hex3(0xADF);
+ lv_bar_style_indic.body.main_color = lv_color_hex3(0xADF);
+ lv_bar_style_indic.body.grad_color = lv_color_hex3(0xADF);
+ lv_bar_style_indic.body.border.color = lv_color_hex3(0xADF);
+
+ bar1 = lv_bar_create(scr, NULL);
+ lv_obj_set_pos(bar1, 205, 36);
+ lv_obj_set_size(bar1, 270, 40);
+ lv_bar_set_style(bar1, LV_BAR_STYLE_INDIC, &lv_bar_style_indic);
+ lv_bar_set_anim_time(bar1, 1000);
+ lv_bar_set_value(bar1, 0, LV_ANIM_ON);
+
+ disp_ext_temp();
+ disp_bed_temp();
+ disp_fan_speed();
+ disp_print_time();
+ disp_fan_Zpos();
+}
+
+void disp_ext_temp() {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target);
+ lv_label_set_text(labelExt1, public_buf_l);
+
+ if (EXTRUDERS == 2) {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target);
+ lv_label_set_text(labelExt2, public_buf_l);
+ }
+}
+
+void disp_bed_temp() {
+ #if HAS_HEATED_BED
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, printing_menu.bed_temp, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target);
+ lv_label_set_text(labelBed, public_buf_l);
+ #endif
+}
+
+void disp_fan_speed() {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, "%3d", thermalManager.fan_speed[0]);
+ lv_label_set_text(labelFan, public_buf_l);
+}
+
+void disp_print_time() {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, "%d%d:%d%d:%d%d", print_time.hours / 10, print_time.hours % 10, print_time.minutes / 10, print_time.minutes % 10, print_time.seconds / 10, print_time.seconds % 10);
+ lv_label_set_text(labelTime, public_buf_l);
+}
+
+void disp_fan_Zpos() {
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+ sprintf(public_buf_l, "%.3f", current_position[Z_AXIS]);
+ lv_label_set_text(labelZpos, public_buf_l);
+}
+
+void reset_print_time() {
+ //print_time.days = 0;
+ print_time.hours = 0;
+ print_time.minutes = 0;
+ print_time.seconds = 0;
+ print_time.ms_10 = 0;
+ //print_time.start = 1;
+}
+
+void start_print_time() { print_time.start = 1; }
+
+void stop_print_time() { print_time.start = 0; }
+
+void setProBarRate() {
+ int rate;
+ volatile long long rate_tmp_r;
+
+ if (gCfgItems.from_flash_pic != 1) {
+ #if ENABLED(SDSUPPORT)
+ rate_tmp_r = (long long)card.getIndex() * 100;
+ #endif
+ rate = rate_tmp_r / gCfgItems.curFilesize;
+ }
+ else {
+ #if ENABLED(SDSUPPORT)
+ rate_tmp_r = (long long)card.getIndex();
+ #endif
+ rate = (rate_tmp_r - (PREVIEW_SIZE + To_pre_view)) * 100 / (gCfgItems.curFilesize - (PREVIEW_SIZE + To_pre_view));
+ }
+ //gCurFileState.totalSend = rate;
+
+ if (rate <= 0) return;
+
+ if (disp_state == PRINTING_UI) {
+ lv_bar_set_value(bar1, rate, LV_ANIM_ON);
+
+ if (marlin_state == MF_SD_COMPLETE) {
+ if (once_flag == 0) {
+ stop_print_time();
+
+ flash_preview_begin = 0;
+ default_preview_flg = 0;
+ lv_clear_printing();
+ lv_draw_dialog(DIALOG_TYPE_FINISH_PRINT);
+
+ once_flag = 1;
+
+ #if HAS_SUICIDE
+ if (gCfgItems.finish_power_off == 1)
+ suicide();
+ #endif
+ }
+ }
+ }
+}
+
+void lv_clear_printing() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h
new file mode 100644
index 0000000000..1e0cc86eec
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h
@@ -0,0 +1,52 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+#define IDLE 0
+#define WORKING 1
+#define PAUSING 2
+#define PAUSED 3
+#define REPRINTING 4
+#define REPRINTED 5
+#define RESUMING 6
+#define STOP 7
+
+extern void lv_draw_printing(void);
+extern void lv_clear_printing();
+extern void disp_ext_temp();
+extern void disp_bed_temp();
+extern void disp_fan_speed();
+extern void disp_print_time();
+extern void disp_fan_Zpos();
+extern void reset_print_time();
+extern void start_print_time();
+extern void stop_print_time();
+extern void setProBarRate();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp
new file mode 100644
index 0000000000..a3708ef3cc
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp
@@ -0,0 +1,319 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "draw_ready_print.h"
+#include "draw_tool.h"
+#include "lv_conf.h"
+#include "lvgl.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+#include "tft_lvgl_configuration.h"
+#include "mks_hardware_test.h"
+#include "draw_ui.h"
+
+#include
+
+#include "../../../../MarlinCore.h"
+#include "../../../../module/temperature.h"
+
+//static lv_obj_t *buttonPrint,*buttonTool,*buttonSet;
+static lv_obj_t * scr;
+#if ENABLED(MKS_TEST)
+ uint8_t curent_disp_ui = 0;
+#endif
+
+#define ID_TOOL 1
+#define ID_SET 2
+#define ID_PRINT 3
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_TOOL:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ #if ENABLED(MKS_TEST)
+ curent_disp_ui = 2;
+ #endif
+ lv_obj_del(scr);
+ lv_draw_tool();
+ }
+ break;
+ case ID_SET:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_obj_del(scr);
+ lv_draw_set();
+ }
+ break;
+ case ID_PRINT:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_obj_del(scr);
+ lv_draw_print_file();
+ }
+ break;
+ }
+}
+
+
+#if ENABLED(MKS_TEST)
+
+ lv_obj_t *limit_info, *det_info;
+ lv_style_t limit_style, det_style;
+ void disp_Limit_ok() {
+ limit_style.text.color.full = 0xFFFF;
+ lv_obj_set_style(limit_info, &limit_style);
+ lv_label_set_text(limit_info, "Limit:ok");
+ }
+ void disp_Limit_error() {
+ limit_style.text.color.full = 0xF800;
+ lv_obj_set_style(limit_info, &limit_style);
+ lv_label_set_text(limit_info, "Limit:error");
+ }
+
+ void disp_det_ok() {
+ det_style.text.color.full = 0xFFFF;
+ lv_obj_set_style(det_info, &det_style);
+ lv_label_set_text(det_info, "det:ok");
+ }
+ void disp_det_error() {
+ det_style.text.color.full = 0xF800;
+ lv_obj_set_style(det_info, &det_style);
+ lv_label_set_text(det_info, "det:error");
+ }
+
+ lv_obj_t *e1, *e2, *e3, *bed;
+ void disp_test() {
+ char buf[30] = {0};
+ //lv_obj_t * label_tool2 = lv_label_create(scr, NULL);
+ //lv_obj_set_pos(label_tool,20,50);
+ memset(buf, 0, sizeof(buf));
+ sprintf(buf, "e1:%d", (int)thermalManager.temp_hotend[0].celsius);
+ lv_label_set_text(e1, buf);
+
+ memset(buf, 0, sizeof(buf));
+ sprintf(buf, "e2:%d", (int)thermalManager.temp_hotend[1].celsius);
+ lv_label_set_text(e2, buf);
+
+ memset(buf, 0, sizeof(buf));
+ sprintf(buf, "e3:%d", (int)thermalManager.temp_hotend[2].celsius);
+ lv_label_set_text(e3, buf);
+
+ memset(buf, 0, sizeof(buf));
+ sprintf(buf, "bed:%d", (int)thermalManager.temp_bed.celsius);
+ lv_label_set_text(bed, buf);
+ }
+
+#endif // MKS_TEST
+
+void lv_draw_ready_print(void) {
+ #if ENABLED(MKS_TEST)
+ char buf[30] = {0};
+ lv_obj_t *buttonTool;
+
+ static lv_style_t style_pr, style_rel;
+
+ curent_disp_ui = 1;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ static lv_style_t ready_style;
+
+ lv_style_copy(&ready_style, &lv_style_scr);
+ //ready_style.body.main_color.full = 0X18C3;
+ //ready_style.body.grad_color.full = 0X18C3;
+ ready_style.body.main_color.full = 0X0000;
+ ready_style.body.grad_color.full = 0X0000;
+ ready_style.text.color.full = 0Xffff;
+ lv_obj_set_style(scr, &ready_style);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+ //lv_obj_set_hidden(scr,true);
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+ //LV_IMG_DECLARE(bmp_pic2);
+ //LV_IMG_DECLARE(bmp_pic3);
+
+ //scr = lv_obj_create(NULL, NULL);
+ //lv_scr_load(scr);
+
+ /*Create an Image button*/
+ buttonTool = lv_imgbtn_create(scr, NULL);
+
+ //lv_btn_setting(&style_pr,0x5d8f16,0x5d8f16);
+ //lv_btn_setting(&style_rel,0x5d8f16,0x5d8f16);
+
+ lv_obj_set_event_cb_mks(buttonTool, event_handler, 3, "bmp_Tool.bin", 0);
+ //lv_imgbtn_set_src_mks(buttonTool, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_tool.bin");
+ lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &style_pr);
+ lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &style_rel);
+
+ lv_obj_set_pos(buttonTool, 360, 180);
+
+ lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF);
+
+ lv_obj_t * label_tool = lv_label_create(buttonTool, NULL);
+
+ lv_obj_set_pos(label_tool, 30, 100);
+ lv_label_set_text(label_tool, "Back");
+
+ e1 = lv_label_create(scr, NULL);
+ lv_obj_set_pos(e1, 20, 20);
+ sprintf(buf, "e1: %d", (int)thermalManager.temp_hotend[0].celsius);
+ lv_label_set_text(e1, buf);
+
+ e2 = lv_label_create(scr, NULL);
+ lv_obj_set_pos(e2, 20, 45);
+ sprintf(buf, "e1: %d", (int)thermalManager.temp_hotend[1].celsius);
+ lv_label_set_text(e2, buf);
+
+ e3 = lv_label_create(scr, NULL);
+ lv_obj_set_pos(e3, 20, 70);
+ sprintf(buf, "e1: %d", (int)thermalManager.temp_hotend[2].celsius);
+ lv_label_set_text(e3, buf);
+
+ bed = lv_label_create(scr, NULL);
+ lv_obj_set_pos(bed, 20, 95);
+ sprintf(buf, "bed: %d", (int)thermalManager.temp_bed.celsius);
+ lv_label_set_text(bed, buf);
+
+ limit_info = lv_label_create(scr, NULL);
+
+ lv_style_copy(&limit_style, &lv_style_scr);
+ limit_style.body.main_color.full = 0X0000;
+ limit_style.body.grad_color.full = 0X0000;
+ limit_style.text.color.full = 0Xffff;
+ lv_obj_set_style(limit_info, &limit_style);
+
+ lv_obj_set_pos(limit_info, 20, 120);
+ lv_label_set_text(limit_info, " ");
+
+ det_info = lv_label_create(scr, NULL);
+
+ lv_style_copy(&det_style, &lv_style_scr);
+ det_style.body.main_color.full = 0X0000;
+ det_style.body.grad_color.full = 0X0000;
+ det_style.text.color.full = 0Xffff;
+ lv_obj_set_style(det_info, &det_style);
+
+ lv_obj_set_pos(det_info, 20, 145);
+ lv_label_set_text(det_info, " ");
+ #else // !MKS_TEST
+ lv_obj_t *buttonPrint, *buttonTool, *buttonSet;
+
+ disp_state_stack._disp_index = 0;
+ memset(disp_state_stack._disp_state, 0, sizeof(disp_state_stack._disp_state));
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINT_READY_UI;
+
+ disp_state = PRINT_READY_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+ //lv_obj_set_hidden(scr,true);
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ //lv_obj_t * title = lv_label_create(scr, NULL);
+ //lv_obj_set_style(title, &tft_style_lable_rel);
+ //lv_obj_set_pos(title,TITLE_XPOS,TITLE_YPOS);
+ //lv_label_set_text(title, creat_title_text());
+
+ /*Create an Image button*/
+ buttonPrint = lv_imgbtn_create(scr, NULL);
+ buttonTool = lv_imgbtn_create(scr, NULL);
+ buttonSet = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, "bmp_Print.bin", 0);
+ //lv_imgbtn_set_src_mks(buttonPrint, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_printing.bin");
+ lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPrint, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonPrint, LV_PROTECT_FOLLOW);
+ #if 1
+ lv_obj_set_event_cb_mks(buttonSet, event_handler, ID_SET, "bmp_Set.bin", 0);
+ //lv_imgbtn_set_src_mks(buttonSet, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_set.bin");
+ lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonSet, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, "bmp_Tool.bin", 0);
+ //lv_imgbtn_set_src_mks(buttonTool, LV_BTN_STATE_REL, &bmp_pic,(uint8_t *)"bmp_tool.bin");
+ lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonTool, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+ lv_obj_set_pos(buttonTool, 20, 90);
+ lv_obj_set_pos(buttonSet, 180, 90);
+ lv_obj_set_pos(buttonPrint, 340, 90);
+
+ //lv_obj_set_pos(buttonTool,SIMPLE_FIRST_PAGE_GRAP+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2);
+ //lv_obj_set_pos(buttonSet,BTN_X_PIXEL+SIMPLE_FIRST_PAGE_GRAP*2+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2);
+ //lv_obj_set_pos(buttonPrint,BTN_X_PIXEL*2+SIMPLE_FIRST_PAGE_GRAP*3+1,(TFT_HEIGHT-BTN_Y_PIXEL)/2+2);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF);
+
+ lv_obj_t * label_print = lv_label_create(buttonPrint, NULL);
+ lv_obj_t * label_set = lv_label_create(buttonSet, NULL);
+ lv_obj_t * label_tool = lv_label_create(buttonTool, NULL);
+ if (gCfgItems.multiple_language != 0) {
+
+ lv_label_set_text(label_print, main_menu.print);
+ lv_obj_align(label_print, buttonPrint, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_set, main_menu.set);
+ lv_obj_align(label_set, buttonSet, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ //lv_label_set_style(label_tool,LV_BTN_STATE_PR,&tft_style_lable_pre);
+ //lv_label_set_style(label_tool,LV_BTN_STATE_REL,&tft_style_lable_rel);
+ lv_label_set_text(label_tool, main_menu.tool);
+ lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ #endif // !MKS_TEST
+}
+
+void lv_clear_ready_print() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h
new file mode 100644
index 0000000000..fbb3a00d78
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h
@@ -0,0 +1,39 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_ready_print(void);
+extern void disp_test();
+extern void disp_Limit_ok();
+extern void disp_Limit_error();
+extern void disp_det_error();
+extern void disp_det_ok();
+extern void lv_clear_ready_print();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp
new file mode 100644
index 0000000000..e41e943e8c
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp
@@ -0,0 +1,258 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "../../../../MarlinCore.h"
+#include "draw_ready_print.h"
+#include "draw_set.h"
+#include "lv_conf.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+#include "draw_ui.h"
+#include "../../../../gcode/queue.h"
+
+static lv_obj_t * scr;
+
+#define ID_S_WIFI 1
+#define ID_S_FAN 2
+#define ID_S_ABOUT 3
+#define ID_S_CONTINUE 4
+#define ID_S_MOTOR_OFF 5
+#define ID_S_LANGUAGE 6
+#define ID_S_RETURN 7
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_S_WIFI:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ }
+ break;
+ case ID_S_FAN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_obj_del(scr);
+ lv_draw_fan();
+ }
+ break;
+ case ID_S_ABOUT:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_obj_del(scr);
+ lv_draw_about();
+ }
+ break;
+ case ID_S_CONTINUE:
+
+ break;
+ case ID_S_MOTOR_OFF:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ #if HAS_SUICIDE
+ suicide();
+ #else
+ queue.enqueue_one_now(PSTR("M84"));
+ #endif
+ }
+ break;
+ case ID_S_LANGUAGE:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_obj_del(scr);
+ lv_draw_language();
+ }
+ break;
+ case ID_S_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_obj_del(scr);
+ lv_draw_ready_print();
+ }
+ break;
+
+ }
+}
+
+void lv_draw_set(void) {
+ lv_obj_t *buttonFan, *buttonAbout;
+ lv_obj_t *buMotorOff, *buttonLanguage, *buttonBack;
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != SET_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = SET_UI;
+ }
+ disp_state = SET_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ //static lv_style_t tool_style;
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ //buttonWifi = lv_imgbtn_create(scr, NULL);
+ buttonFan = lv_imgbtn_create(scr, NULL);
+ buttonAbout = lv_imgbtn_create(scr, NULL);
+ //buttonContinue = lv_imgbtn_create(scr, NULL);
+ buMotorOff = lv_imgbtn_create(scr, NULL);
+ buttonLanguage = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+
+ //lv_obj_set_event_cb_mks(buttonWifi, event_handler,ID_S_WIFI,"bmp_Wifi.bin",0);
+ //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_REL, &bmp_pic);
+ //lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_PR, &bmp_pic);
+ //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ //lv_imgbtn_set_style(buttonWifi, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ //lv_obj_clear_protect(buttonWifi, LV_PROTECT_FOLLOW);
+ #if 1
+ lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_S_FAN, "bmp_Fan.bin", 0);
+ lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonFan, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonAbout, event_handler, ID_S_ABOUT, "bmp_About.bin", 0);
+ lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonAbout, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ //lv_obj_set_event_cb_mks(buttonContinue, event_handler,ID_S_CONTINUE,"bmp_Breakpoint.bin",0);
+ //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_REL, &bmp_pic);
+ //lv_imgbtn_set_src(buttonContinue, LV_BTN_STATE_PR, &bmp_pic);
+ //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ //lv_imgbtn_set_style(buttonContinue, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #if HAS_SUICIDE
+ lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_Mamual.bin", 0);
+ #else
+ lv_obj_set_event_cb_mks(buMotorOff, event_handler, ID_S_MOTOR_OFF, "bmp_Motor_off.bin", 0);
+ #endif
+ lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buMotorOff, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, "bmp_Language.bin", 0);
+ lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonLanguage, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_S_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ /*lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight);
+ lv_obj_set_pos(buttonFan,BTN_X_PIXEL+INTERVAL_V*2,titleHeight);
+ lv_obj_set_pos(buttonAbout,BTN_X_PIXEL*2+INTERVAL_V*3,titleHeight);
+ lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight);
+ lv_obj_set_pos(buMotorOff,INTERVAL_V, BTN_Y_PIXEL+INTERVAL_H+titleHeight);
+ lv_obj_set_pos(buttonLanguage,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight);
+ lv_obj_set_pos(buttonBack,BTN_X_PIXEL*3+INTERVAL_V*4, BTN_Y_PIXEL+INTERVAL_H+titleHeight);*/
+
+ //lv_obj_set_pos(buttonWifi,INTERVAL_V,titleHeight);
+ lv_obj_set_pos(buttonFan, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight);
+ lv_obj_set_pos(buttonAbout, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight);
+ //lv_obj_set_pos(buttonContinue,BTN_X_PIXEL*3+INTERVAL_V*4,titleHeight);
+ lv_obj_set_pos(buMotorOff, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttonLanguage, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ //lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonAbout, LV_LAYOUT_OFF);
+ //lv_btn_set_layout(buttonContinue, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buMotorOff, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonLanguage, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ //lv_obj_t * labelWifi= lv_label_create(buttonWifi, NULL);
+ lv_obj_t * labelFan = lv_label_create(buttonFan, NULL);
+ lv_obj_t * label_About = lv_label_create(buttonAbout, NULL);
+ //lv_obj_t * label_Continue = lv_label_create(buttonContinue, NULL);
+ lv_obj_t * label_MotorOff = lv_label_create(buMotorOff, NULL);
+ lv_obj_t * label_Language = lv_label_create(buttonLanguage, NULL);
+ lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+
+ if (gCfgItems.multiple_language != 0) {
+ //lv_label_set_text(labelWifi, set_menu.wifi);
+ //lv_obj_align(labelWifi, buttonWifi, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelFan, set_menu.fan);
+ lv_obj_align(labelFan, buttonFan, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_About, set_menu.about);
+ lv_obj_align(label_About, buttonAbout, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ //lv_label_set_text(label_Continue, set_menu.breakpoint);
+ //lv_obj_align(label_Continue, buttonContinue, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET);
+ #if HAS_SUICIDE
+ lv_label_set_text(label_MotorOff, set_menu.shutdown);
+ #else
+ lv_label_set_text(label_MotorOff, set_menu.motoroff);
+ #endif
+ lv_obj_align(label_MotorOff, buMotorOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Language, set_menu.language);
+ lv_obj_align(label_Language, buttonLanguage, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+}
+
+void lv_clear_set() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h
new file mode 100644
index 0000000000..e2300e4192
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h
@@ -0,0 +1,34 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_set(void);
+extern void lv_clear_set();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp
new file mode 100644
index 0000000000..dc87ec5717
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp
@@ -0,0 +1,270 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "lv_conf.h"
+#include "draw_ui.h"
+//#include "../lvgl/src/lv_objx/lv_imgbtn.h"
+//#include "../lvgl/src/lv_objx/lv_img.h"
+//#include "../lvgl/src/lv_core/lv_disp.h"
+//#include "../lvgl/src/lv_core/lv_refr.h"
+
+#include "../../../../MarlinCore.h"
+#include "../../../../gcode/queue.h"
+
+//static lv_obj_t *buttonMoveZ,*buttonTest,*buttonZ0,*buttonStop,*buttonReturn;
+static lv_obj_t * scr;
+#if ENABLED(MKS_TEST)
+ extern uint8_t curent_disp_ui;
+#endif
+
+#define ID_T_PRE_HEAT 1
+#define ID_T_EXTRUCT 2
+#define ID_T_MOV 3
+#define ID_T_HOME 4
+#define ID_T_LEVELING 5
+#define ID_T_FILAMENT 6
+#define ID_T_MORE 7
+#define ID_T_RETURN 8
+
+static void event_handler(lv_obj_t * obj, lv_event_t event) {
+ switch (obj->mks_obj_id) {
+ case ID_T_PRE_HEAT:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_clear_tool();
+ lv_draw_preHeat();
+ }
+ break;
+ case ID_T_EXTRUCT:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_clear_tool();
+ lv_draw_extrusion();
+ }
+ break;
+ case ID_T_MOV:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_clear_tool();
+ lv_draw_move_motor();
+ }
+ break;
+ case ID_T_HOME:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ lv_clear_tool();
+ lv_draw_home();
+ }
+ break;
+ case ID_T_LEVELING:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
+ queue.enqueue_one_P(PSTR("G28"));
+ queue.enqueue_one_P(PSTR("G29"));
+ #else
+ uiCfg.leveling_first_time = 1;
+ lv_clear_tool();
+ lv_draw_manualLevel();
+ #endif
+ }
+ break;
+ case ID_T_FILAMENT: break;
+ case ID_T_MORE: break;
+ case ID_T_RETURN:
+ if (event == LV_EVENT_CLICKED) {
+ // nothing to do
+ }
+ else if (event == LV_EVENT_RELEASED) {
+ TERN_(MKS_TEST, curent_disp_ui = 1);
+ lv_obj_del(scr);
+ lv_draw_ready_print();
+ }
+ break;
+ }
+}
+
+void lv_draw_tool(void) {
+ lv_obj_t *buttonPreHeat, *buttonExtrusion, *buttonMove, *buttonHome, *buttonLevel;
+ lv_obj_t *buttonBack;
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TOOL_UI) {
+ disp_state_stack._disp_index++;
+ disp_state_stack._disp_state[disp_state_stack._disp_index] = TOOL_UI;
+ }
+ disp_state = TOOL_UI;
+
+ scr = lv_obj_create(NULL, NULL);
+
+ //static lv_style_t tool_style;
+
+ lv_obj_set_style(scr, &tft_style_scr);
+ lv_scr_load(scr);
+ lv_obj_clean(scr);
+
+ lv_obj_t * title = lv_label_create(scr, NULL);
+ lv_obj_set_style(title, &tft_style_lable_rel);
+ lv_obj_set_pos(title, TITLE_XPOS, TITLE_YPOS);
+ lv_label_set_text(title, creat_title_text());
+
+ lv_refr_now(lv_refr_get_disp_refreshing());
+
+ LV_IMG_DECLARE(bmp_pic);
+
+ /*Create an Image button*/
+ buttonPreHeat = lv_imgbtn_create(scr, NULL);
+ buttonExtrusion = lv_imgbtn_create(scr, NULL);
+ buttonMove = lv_imgbtn_create(scr, NULL);
+ buttonHome = lv_imgbtn_create(scr, NULL);
+ buttonLevel = lv_imgbtn_create(scr, NULL);
+ //buttonFilament = lv_imgbtn_create(scr, NULL);
+ //buttonMore = lv_imgbtn_create(scr, NULL);
+ buttonBack = lv_imgbtn_create(scr, NULL);
+
+ lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_T_PRE_HEAT, "bmp_PreHeat.bin", 0);
+ lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonPreHeat, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ lv_obj_clear_protect(buttonPreHeat, LV_PROTECT_FOLLOW);
+
+ #if 1
+ lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_T_EXTRUCT, "bmp_Extruct.bin", 0);
+ lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonExtrusion, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonMove, event_handler, ID_T_MOV, "bmp_Mov.bin", 0);
+ lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonMove, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonHome, event_handler, ID_T_HOME, "bmp_Zero.bin", 0);
+ lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonHome, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonLevel, event_handler, ID_T_LEVELING, "bmp_Leveling.bin", 0);
+ lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonLevel, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ //lv_obj_set_event_cb_mks(buttonFilament, event_handler,ID_T_FILAMENT,"bmp_Filamentchange.bin",0);
+ //lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, &bmp_pic);
+ //lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, &bmp_pic);
+ //lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ //lv_imgbtn_set_style(buttonFilament, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ //lv_obj_set_event_cb_mks(buttonMore, event_handler,ID_T_MORE,"bmp_More.bin",0);
+ //lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_REL, &bmp_pic);
+ //lv_imgbtn_set_src(buttonMore, LV_BTN_STATE_PR, &bmp_pic);
+ //lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ //lv_imgbtn_set_style(buttonMore, LV_BTN_STATE_REL, &tft_style_lable_rel);
+
+ lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_T_RETURN, "bmp_Return.bin", 0);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, &bmp_pic);
+ lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, &bmp_pic);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_PR, &tft_style_lable_pre);
+ lv_imgbtn_set_style(buttonBack, LV_BTN_STATE_REL, &tft_style_lable_rel);
+ #endif
+
+ lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight);
+ lv_obj_set_pos(buttonExtrusion, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight);
+ lv_obj_set_pos(buttonMove, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight);
+ lv_obj_set_pos(buttonHome, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight);
+ lv_obj_set_pos(buttonLevel, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ //lv_obj_set_pos(buttonFilament,BTN_X_PIXEL+INTERVAL_V*2,BTN_Y_PIXEL+INTERVAL_H+titleHeight);
+ //lv_obj_set_pos(buttonMore,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight);
+ lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+
+ /*Create a label on the Image button*/
+ lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonHome, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF);
+ //lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF);
+ //lv_btn_set_layout(buttonMore, LV_LAYOUT_OFF);
+ lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF);
+
+ lv_obj_t * labelPreHeat = lv_label_create(buttonPreHeat, NULL);
+ lv_obj_t * labelExtrusion = lv_label_create(buttonExtrusion, NULL);
+ lv_obj_t * label_Move = lv_label_create(buttonMove, NULL);
+ lv_obj_t * label_Home = lv_label_create(buttonHome, NULL);
+ lv_obj_t * label_Level = lv_label_create(buttonLevel, NULL);
+ //lv_obj_t * label_Filament = lv_label_create(buttonFilament, NULL);
+ //lv_obj_t * label_More = lv_label_create(buttonMore, NULL);
+ lv_obj_t * label_Back = lv_label_create(buttonBack, NULL);
+
+ if (gCfgItems.multiple_language != 0) {
+ lv_label_set_text(labelPreHeat, tool_menu.preheat);
+ lv_obj_align(labelPreHeat, buttonPreHeat, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(labelExtrusion, tool_menu.extrude);
+ lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Move, tool_menu.move);
+ lv_obj_align(label_Move, buttonMove, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Home, tool_menu.home);
+ lv_obj_align(label_Home, buttonHome, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ /*
+ if (gCfgItems.leveling_mode != 2) {
+ lv_label_set_text(label_Level, gCfgItems.leveling_mode == 1 ? tool_menu.autoleveling : tool_menu.leveling);
+ lv_obj_align(label_Level, buttonLevel, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+ */
+ lv_label_set_text(label_Level, tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling));
+ lv_obj_align(label_Level, buttonLevel, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ //lv_label_set_text(label_Filament, tool_menu.filament);
+ //lv_obj_align(label_Filament, buttonFilament, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ //lv_label_set_text(label_More, tool_menu.more);
+ //lv_obj_align(label_More, buttonMore, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+
+ lv_label_set_text(label_Back, common_menu.text_back);
+ lv_obj_align(label_Back, buttonBack, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET);
+ }
+}
+
+void lv_clear_tool() { lv_obj_del(scr); }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h
new file mode 100644
index 0000000000..b05b6fed19
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h
@@ -0,0 +1,34 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+extern void lv_draw_tool(void);
+extern void lv_clear_tool();
+
+//extern void disp_temp_ready_print();
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp
new file mode 100644
index 0000000000..01fa6bc37a
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp
@@ -0,0 +1,1181 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "W25Qxx.h"
+#include "tft_lvgl_configuration.h"
+#include "pic_manager.h"
+
+#include
+
+#if ENABLED(SPI_GRAPHICAL_TFT)
+ #include "SPI_TFT.h"
+#endif
+
+#include "../../../../MarlinCore.h"
+#include "../../../../sd/cardreader.h"
+#include "../../../../module/motion.h"
+#include "../../../../module/planner.h"
+
+#if ENABLED(POWER_LOSS_RECOVERY)
+ #include "../../../../feature/powerloss.h"
+#endif
+
+#if ENABLED(PARK_HEAD_ON_PAUSE)
+ #include "../../../../feature/pause.h"
+#endif
+
+CFG_ITMES gCfgItems;
+UI_CFG uiCfg;
+DISP_STATE_STACK disp_state_stack;
+DISP_STATE disp_state = MAIN_UI;
+DISP_STATE last_disp_state;
+PRINT_TIME print_time;
+
+uint32_t To_pre_view;
+uint8_t gcode_preview_over;
+uint8_t flash_preview_begin;
+uint8_t default_preview_flg;
+uint32_t size = 809;
+uint16_t row;
+uint8_t temperature_change_frequency;
+uint8_t printing_rate_update_flag;
+
+extern uint8_t once_flag;
+extern uint8_t sel_id;
+extern uint8_t public_buf[512];
+extern uint8_t bmp_public_buf[17 * 1024];
+
+extern void LCD_IO_WriteData(uint16_t RegValue);
+
+void gCfgItems_init() {
+ gCfgItems.multiple_language = MULTI_LANGUAGE_ENABLE;
+ gCfgItems.language = LANG_ENGLISH;
+ gCfgItems.leveling_mode = 0;
+ gCfgItems.from_flash_pic = 0;
+ gCfgItems.curFilesize = 0;
+ gCfgItems.finish_power_off = 0;
+ gCfgItems.pause_reprint = 0;
+
+ W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems.spi_flash_flag, VAR_INF_ADDR, sizeof(gCfgItems.spi_flash_flag));
+ if (gCfgItems.spi_flash_flag == GCFG_FLAG_VALUE) {
+ W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems));
+ }
+ else {
+ gCfgItems.spi_flash_flag = GCFG_FLAG_VALUE;
+ W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR);
+ W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems));
+ }
+
+}
+
+void gCfg_to_spiFlah() {
+ W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR);
+ W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems));
+}
+
+void ui_cfg_init() {
+ uiCfg.curTempType = 0;
+ uiCfg.curSprayerChoose = 0;
+ uiCfg.stepHeat = 10;
+ uiCfg.leveling_first_time = 0;
+ uiCfg.extruStep = 5;
+ uiCfg.extruSpeed = 10;
+ uiCfg.move_dist = 1;
+ uiCfg.moveSpeed = 3000;
+ uiCfg.stepPrintSpeed = 10;
+}
+
+void update_spi_flash() {
+ W25QXX.init(SPI_QUARTER_SPEED);
+ W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR);
+ W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems));
+}
+
+lv_style_t tft_style_scr;
+lv_style_t tft_style_lable_pre;
+lv_style_t tft_style_lable_rel;
+
+void tft_style_init() {
+ lv_style_copy(&tft_style_scr, &lv_style_scr);
+ tft_style_scr.body.main_color = LV_COLOR_BACKGROUND;
+ tft_style_scr.body.grad_color = LV_COLOR_BACKGROUND;
+ tft_style_scr.text.color = LV_COLOR_TEXT;
+ tft_style_scr.text.sel_color = LV_COLOR_TEXT;
+ tft_style_scr.line.width = 0;
+ tft_style_scr.text.letter_space = 0;
+ tft_style_scr.text.line_space = 0;
+
+ lv_style_copy(&tft_style_lable_pre, &lv_style_scr);
+ lv_style_copy(&tft_style_lable_rel, &lv_style_scr);
+ tft_style_lable_pre.body.main_color = LV_COLOR_BACKGROUND;
+ tft_style_lable_pre.body.grad_color = LV_COLOR_BACKGROUND;
+ tft_style_lable_pre.text.color = LV_COLOR_TEXT;
+ tft_style_lable_pre.text.sel_color = LV_COLOR_TEXT;
+ tft_style_lable_rel.body.main_color = LV_COLOR_BACKGROUND;
+ tft_style_lable_rel.body.grad_color = LV_COLOR_BACKGROUND;
+ tft_style_lable_rel.text.color = LV_COLOR_TEXT;
+ tft_style_lable_rel.text.sel_color = LV_COLOR_TEXT;
+ tft_style_lable_pre.text.font = &gb2312_puhui32;
+ tft_style_lable_rel.text.font = &gb2312_puhui32;
+ tft_style_lable_pre.line.width = 0;
+ tft_style_lable_rel.line.width = 0;
+ tft_style_lable_pre.text.letter_space = 0;
+ tft_style_lable_rel.text.letter_space = 0;
+ tft_style_lable_pre.text.line_space = -5;
+ tft_style_lable_rel.text.line_space = -5;
+}
+
+#define MAX_TITLE_LEN 28
+
+char public_buf_m[100] = {0};
+
+char public_buf_l[30];
+
+void titleText_cat(char *str, int strSize, char *addPart) {
+ if (str == 0 || addPart == 0) return;
+ if ((int)(strlen(str) + strlen(addPart)) >= strSize) return;
+ strcat(str, addPart);
+}
+
+char *getDispText(int index) {
+
+ memset(public_buf_l, 0, sizeof(public_buf_l));
+
+ switch (disp_state_stack._disp_state[index]) {
+ case PRINT_READY_UI:
+ strcpy(public_buf_l, main_menu.title);
+ break;
+ case PRINT_FILE_UI:
+ strcpy(public_buf_l, file_menu.title);
+ break;
+ case PRINTING_UI:
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
+ #ifndef TFT35
+ || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
+ || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
+ #endif
+ ) strcpy(public_buf_l, common_menu.print_special_title);
+ else strcpy(public_buf_l, printing_menu.title);
+ break;
+ case MOVE_MOTOR_UI:
+ strcpy(public_buf_l, move_menu.title);
+ break;
+ case OPERATE_UI:
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
+ #ifndef TFT35
+ || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
+ || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
+ #endif
+ ) strcpy(public_buf_l, common_menu.operate_special_title);
+ else strcpy(public_buf_l, operation_menu.title);
+ break;
+
+ case PAUSE_UI:
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
+ || disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
+ || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI
+ ) strcpy(public_buf_l, common_menu.pause_special_title);
+ else strcpy(public_buf_l, pause_menu.title);
+ break;
+
+ case EXTRUSION_UI:
+ strcpy(public_buf_l, extrude_menu.title);
+ break;
+ case CHANGE_SPEED_UI:
+ strcpy(public_buf_l, speed_menu.title);
+ break;
+ case FAN_UI:
+ strcpy(public_buf_l, fan_menu.title);
+ break;
+ case PRE_HEAT_UI:
+ if ((disp_state_stack._disp_state[disp_state_stack._disp_index - 1] == OPERATE_UI)) strcpy(public_buf_l, preheat_menu.adjust_title);
+ else strcpy(public_buf_l, preheat_menu.title);
+ break;
+ case SET_UI:
+ strcpy(public_buf_l, set_menu.title);
+ break;
+ case ZERO_UI:
+ strcpy(public_buf_l, home_menu.title);
+ break;
+ case SPRAYER_UI: break;
+ case MACHINE_UI: break;
+ case LANGUAGE_UI:
+ strcpy(public_buf_l, language_menu.title);
+ break;
+ case ABOUT_UI:
+ strcpy(public_buf_l, about_menu.title);
+ break;
+ case LOG_UI: break;
+ case DISK_UI:
+ strcpy(public_buf_l, filesys_menu.title);
+ break;
+ case DIALOG_UI:
+ strcpy(public_buf_l, common_menu.dialog_confirm_title);
+ break;
+ case WIFI_UI:
+ strcpy(public_buf_l, wifi_menu.title);
+ break;
+ case MORE_UI:
+ case PRINT_MORE_UI:
+ strcpy(public_buf_l, more_menu.title);
+ break;
+ case FILAMENTCHANGE_UI:
+ strcpy(public_buf_l, filament_menu.title);
+ break;
+ case LEVELING_UI:
+ case MESHLEVELING_UI:
+ strcpy(public_buf_l, leveling_menu.title);
+ break;
+ case BIND_UI:
+ strcpy(public_buf_l, cloud_menu.title);
+ break;
+ case ZOFFSET_UI:
+ strcpy(public_buf_l, zoffset_menu.title);
+ break;
+ case TOOL_UI:
+ strcpy(public_buf_l, tool_menu.title);
+ break;
+ case WIFI_LIST_UI:
+ //strcpy(public_buf_l, list_menu.title);
+ break;
+ case MACHINE_PARA_UI:
+ strcpy(public_buf_l, MachinePara_menu.title);
+ break;
+ case BABY_STEP_UI:
+ strcpy(public_buf_l, operation_menu.babystep);
+ break;
+ default: break;
+ }
+
+ return public_buf_l;
+}
+
+char *creat_title_text() {
+ int index = 0;
+ char *tmpText = 0;
+ char tmpCurFileStr[20];
+
+ memset(tmpCurFileStr, 0, sizeof(tmpCurFileStr));
+
+ #if _LFN_UNICODE
+ //cutFileName((TCHAR *)curFileName, 16, 16, (TCHAR *)tmpCurFileStr);
+ #else
+ cutFileName(list_file.long_name[sel_id], 16, 16, tmpCurFileStr);
+ #endif
+
+ memset(public_buf_m, 0, sizeof(public_buf_m));
+
+ while (index <= disp_state_stack._disp_index) {
+ tmpText = getDispText(index);
+ if ((*tmpText == 0) || (tmpText == 0)) {
+ index++;
+ continue;
+ }
+
+ titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText);
+ if (index < disp_state_stack._disp_index) titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">");
+
+ index++;
+ }
+
+ if (disp_state_stack._disp_state[disp_state_stack._disp_index] == PRINTING_UI
+ /*|| disp_state_stack._disp_state[disp_state_stack._disp_index] == OPERATE_UI
+ || disp_state_stack._disp_state[disp_state_stack._disp_index] == PAUSE_UI*/) {
+ titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)":");
+ titleText_cat(public_buf_m, sizeof(public_buf_m), tmpCurFileStr);
+ }
+
+ if (strlen(public_buf_m) > MAX_TITLE_LEN) {
+ memset(public_buf_m, 0, sizeof(public_buf_m));
+
+ tmpText = getDispText(0);
+ if (*tmpText != 0) {
+ titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText);
+ titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">...>");
+ tmpText = getDispText(disp_state_stack._disp_index);
+ if (*tmpText != 0) titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText);
+ }
+
+ }
+
+ return public_buf_m;
+}
+
+void preview_gcode_prehandle(char *path) {
+ #if ENABLED(SDSUPPORT)
+ //uint8_t re;
+ //uint32_t read;
+ uint32_t pre_read_cnt = 0;
+ uint32_t *p1;
+ char *cur_name;
+
+ cur_name = strrchr(path, '/');
+ card.openFileRead(cur_name);
+ card.read(public_buf, 512);
+ p1 = (uint32_t *)strstr((char *)public_buf, ";simage:");
+
+ if (p1) {
+ pre_read_cnt = (uint32_t)p1 - (uint32_t)((uint32_t *)(&public_buf[0]));
+
+ To_pre_view = pre_read_cnt;
+ gcode_preview_over = 1;
+ gCfgItems.from_flash_pic = 1;
+ update_spi_flash();
+ }
+ else {
+ gcode_preview_over = 0;
+ default_preview_flg = 1;
+ gCfgItems.from_flash_pic = 0;
+ update_spi_flash();
+ }
+ card.closefile();
+ #endif
+}
+
+void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) {
+ #if ENABLED(SDSUPPORT)
+ //uint8_t ress;
+ //uint32_t write;
+ volatile uint32_t i, j;
+ volatile uint16_t *p_index;
+ //int res;
+ char *cur_name;
+ uint16_t Color;
+
+ cur_name = strrchr(path, '/');
+ card.openFileRead(cur_name);
+
+ card.setIndex((PREVIEW_LITTLE_PIC_SIZE + To_pre_view) + size * row + 8);
+ #if ENABLED(SPI_GRAPHICAL_TFT)
+ SPI_TFT.spi_init(SPI_FULL_SPEED);
+ //SPI_TFT.SetCursor(0,0);
+ SPI_TFT.SetWindows(xpos_pixel, ypos_pixel + row, 200, 1);
+ SPI_TFT.LCD_WriteRAM_Prepare();
+ #else
+ ili9320_SetWindows(xpos_pixel, ypos_pixel + row, 200, 1);
+ LCD_WriteRAM_Prepare();
+ #endif
+
+ j = i = 0;
+
+ while (1) {
+ card.read(public_buf, 400);
+ for (i = 0; i < 400;) {
+ bmp_public_buf[j] = ascii2dec_test((char*)&public_buf[i]) << 4 | ascii2dec_test((char*)&public_buf[i + 1]);
+ i += 2;
+ j++;
+ }
+
+ //if (i > 800) break;
+ //#ifdef TFT70
+ //if (j>400) {
+ // f_read(file, buff_pic, 1, &read);
+ // break;
+ //}
+ //#elif defined(TFT35)
+ if (j >= 400)
+ //f_read(file, buff_pic, 1, &read);
+ break;
+ //#endif
+
+ }
+ #if ENABLED(SPI_GRAPHICAL_TFT)
+ for (i = 0; i < 400;) {
+ p_index = (uint16_t *)(&bmp_public_buf[i]);
+ Color = (*p_index >> 8);
+ *p_index = Color | ((*p_index & 0xFF) << 8);
+ i += 2;
+ }
+ SPI_TFT_CS_L;
+ SPI_TFT_DC_H;
+ SPI.dmaSend(bmp_public_buf, 400, true);
+ SPI_TFT_CS_H;
+ #else
+ for (i = 0; i < 400;) {
+ p_index = (uint16_t *)(&bmp_public_buf[i]);
+ //if (*p_index == 0x0000)*p_index=gCfgItems.preview_bk_color;
+ LCD_IO_WriteData(*p_index);
+ i += 2;
+ }
+ #endif
+ W25QXX.init(SPI_QUARTER_SPEED);
+ if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096);
+ W25QXX.SPI_FLASH_BufferWrite(bmp_public_buf, BAK_VIEW_ADDR_TFT35 + row * 400, 400);
+ row++;
+ if (row >= 200) {
+ size = 809;
+ row = 0;
+
+ gcode_preview_over = 0;
+ //flash_preview_begin = 1;
+
+ card.closefile();
+
+ /*
+ if (gCurFileState.file_open_flag != 0xaa) {
+ reset_file_info();
+ res = f_open(file, curFileName, FA_OPEN_EXISTING | FA_READ);
+ if (res == FR_OK) {
+ f_lseek(file,PREVIEW_SIZE+To_pre_view);
+ gCurFileState.file_open_flag = 0xaa;
+ //bakup_file_path((uint8_t *)curFileName, strlen(curFileName));
+ srcfp = file;
+ mksReprint.mks_printer_state = MKS_WORKING;
+ once_flag = 0;
+ }
+ }
+ */
+ char *cur_name;
+
+ cur_name = strrchr(list_file.file_name[sel_id], '/');
+
+ SdFile file;
+ SdFile *curDir;
+ card.endFilePrint();
+ const char * const fname = card.diveToFile(true, curDir, cur_name);
+ if (!fname) return;
+ if (file.open(curDir, fname, O_READ)) {
+ gCfgItems.curFilesize = file.fileSize();
+ file.close();
+ update_spi_flash();
+ }
+
+ card.openFileRead(cur_name);
+ if (card.isFileOpen()) {
+ feedrate_percentage = 100;
+ // saved_feedrate_percentage = feedrate_percentage;
+ planner.flow_percentage[0] = 100;
+ planner.e_factor[0] = planner.flow_percentage[0] * 0.01;
+ if (EXTRUDERS == 2) {
+ planner.flow_percentage[1] = 100;
+ planner.e_factor[1] = planner.flow_percentage[1] * 0.01;
+ }
+ card.startFileprint();
+ TERN_(POWER_LOSS_RECOVERY, recovery.prepare());
+ once_flag = 0;
+ }
+ return;
+ }
+ card.closefile();
+ #endif // SDSUPPORT
+}
+
+void Draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) {
+ int index;
+ int x_off = 0, y_off = 0;
+ int _y;
+ uint16_t *p_index;
+ int i, j;
+ uint16_t temp_p, Color;
+
+ for (index = 0; index < 10; index++) { // 200*200
+ if (sel == 1) flash_view_Read(bmp_public_buf, 8000); //20k
+ //memset(bmp_public_buf,0x1f,8000);
+ else
+ //memset(bmp_public_buf,0x1f,8000);
+ default_view_Read(bmp_public_buf, 8000); //20k
+
+ i = 0;
+ #if ENABLED(SPI_GRAPHICAL_TFT)
+ //SPI_TFT.spi_init(SPI_FULL_SPEED);
+ //SPI_TFT.SetWindows(xpos_pixel, y_off * 20+ypos_pixel, 200,20); //200*200
+ //SPI_TFT.LCD_WriteRAM_Prepare();
+ j = 0;
+ for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) {
+ SPI_TFT.spi_init(SPI_FULL_SPEED);
+ SPI_TFT.SetWindows(xpos_pixel, y_off * 20 + ypos_pixel + j, 200, 1); //200*200
+ SPI_TFT.LCD_WriteRAM_Prepare();
+
+ j++;
+ //memcpy(public_buf,&bmp_public_buf[i],400);
+ SPI_TFT_CS_L;
+ SPI_TFT_DC_H;
+ SPI.dmaSend(&bmp_public_buf[i], 400, true);
+ SPI_TFT_CS_H;
+
+ i += 400;
+ if (i >= 8000) break;
+ }
+ #else
+ ili9320_SetWindows(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); //200*200
+
+ LCD_WriteRAM_Prepare();
+
+ for (_y = y_off * 20; _y < (y_off + 1) * 20; _y++) {
+ for (x_off = 0; x_off < 200; x_off++) {
+ if (sel == 1) {
+ temp_p = (uint16_t)(bmp_public_buf[i] | bmp_public_buf[i + 1] << 8);
+ p_index = &temp_p;
+ }
+ else {
+ p_index = (uint16_t *)(&bmp_public_buf[i]);
+ }
+ LCD_IO_WriteData(*p_index);
+ i += 2;
+ }
+ if (i >= 8000) break;
+ }
+ #endif
+ y_off++;
+ }
+ W25QXX.init(SPI_QUARTER_SPEED);
+}
+
+void disp_pre_gcode(int xpos_pixel, int ypos_pixel) {
+ if (gcode_preview_over == 1) gcode_preview(list_file.file_name[sel_id], xpos_pixel, ypos_pixel);
+ if (flash_preview_begin == 1) {
+ flash_preview_begin = 0;
+ Draw_default_preview(xpos_pixel, ypos_pixel, 1);
+ }
+ if (default_preview_flg == 1) {
+ Draw_default_preview(xpos_pixel, ypos_pixel, 0);
+ default_preview_flg = 0;
+ }
+}
+
+void print_time_run() {
+ static uint8_t lastSec = 0;
+
+ if (print_time.seconds >= 60) {
+ print_time.seconds = 0;
+ print_time.minutes++;
+ if (print_time.minutes >= 60) {
+ print_time.minutes = 0;
+ print_time.hours++;
+ }
+ }
+ if (disp_state == PRINTING_UI) {
+ if (lastSec != print_time.seconds) disp_print_time();
+ lastSec = print_time.seconds;
+ }
+}
+
+void GUI_RefreshPage() {
+ if ((systick_uptime_millis % 1000) == 0) temperature_change_frequency = 1;
+ if ((systick_uptime_millis % 3000) == 0) printing_rate_update_flag = 1;
+
+ switch (disp_state) {
+ case MAIN_UI:
+ lv_draw_ready_print();
+ break;
+ case EXTRUSION_UI:
+ if (temperature_change_frequency == 1) {
+ temperature_change_frequency = 0;
+ disp_hotend_temp();
+ }
+ break;
+ case PRE_HEAT_UI:
+ if (temperature_change_frequency == 1) {
+ temperature_change_frequency = 0;
+ disp_desire_temp();
+ }
+ break;
+ case PRINT_READY_UI:
+ /*
+ if (gCfgItems.display_style == 2) {
+ if (temperature_change_frequency) {
+ temperature_change_frequency = 0;
+ disp_restro_state();
+ }
+ }
+ */
+ break;
+
+ case PRINT_FILE_UI: break;
+
+ case PRINTING_UI:
+ if (temperature_change_frequency) {
+ temperature_change_frequency = 0;
+ disp_ext_temp();
+ disp_bed_temp();
+ disp_fan_speed();
+ disp_print_time();
+ disp_fan_Zpos();
+ }
+ if (printing_rate_update_flag || marlin_state == MF_SD_COMPLETE) {
+ printing_rate_update_flag = 0;
+ if (gcode_preview_over == 0) setProBarRate();
+ }
+ break;
+
+ case OPERATE_UI:
+ /*
+ if (temperature_change_frequency == 1) {
+ temperature_change_frequency = 0;
+ disp_temp_operate();
+ }
+
+ setProBarRateOpera();
+ */
+ break;
+
+ case PAUSE_UI:
+ /*
+ if (temperature_change_frequency == 1) {
+ temperature_change_frequency = 0;
+ disp_temp_pause();
+ }
+ */
+ break;
+
+ case FAN_UI:
+ if (temperature_change_frequency == 1) {
+ temperature_change_frequency = 0;
+ disp_fan_value();
+ }
+ break;
+
+ case MOVE_MOTOR_UI:
+ /*
+ if (mksReprint.mks_printer_state == MKS_IDLE) {
+ if ((z_high_count==1)&&(temper_error_flg != 1)) {
+ z_high_count = 0;
+ {
+ memset((char *)gCfgItems.move_z_coordinate, ' ', sizeof(gCfgItems.move_z_coordinate));
+ GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS);
+ sprintf((char *)gCfgItems.move_z_coordinate, "Z: %.3f", current_position[Z_AXIS]);
+ GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS);
+ }
+ }
+ }
+ */
+ break;
+
+ case WIFI_UI:
+ /*
+ if (wifi_refresh_flg == 1) {
+ disp_wifi_state();
+ wifi_refresh_flg = 0;
+ }
+ */
+ break;
+ case BIND_UI:
+ /*refresh_bind_ui();*/
+ break;
+
+ case FILAMENTCHANGE_UI:
+ /*
+ if (temperature_change_frequency) {
+ temperature_change_frequency = 0;
+ disp_filament_sprayer_temp();
+ }
+ */
+ break;
+ case DIALOG_UI:
+ /*filament_dialog_handle();
+ wifi_scan_handle();*/
+ break;
+ case MESHLEVELING_UI:
+ /*disp_zpos();*/
+ break;
+ case HARDWARE_TEST_UI:
+ break;
+ case WIFI_LIST_UI:
+ /*
+ if (wifi_refresh_flg == 1) {
+ disp_wifi_list();
+ wifi_refresh_flg = 0;
+ }
+ */
+ break;
+ case KEY_BOARD_UI:
+ /*update_password_disp();
+ update_join_state_disp();*/
+ break;
+ case TIPS_UI:
+ /*
+ switch (tips_type) {
+ case TIPS_TYPE_JOINING:
+ if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[wifi_list.nameIndex]) == 0) {
+ tips_disp.timer = TIPS_TIMER_STOP;
+ tips_disp.timer_count = 0;
+ Clear_Tips();
+ tips_type = TIPS_TYPE_WIFI_CONECTED;
+ draw_Tips();
+ }
+ if (tips_disp.timer_count >= 30) {
+ tips_disp.timer = TIPS_TIMER_STOP;
+ tips_disp.timer_count = 0;
+ Clear_Tips();
+ tips_type = TIPS_TYPE_TAILED_JOIN;
+ draw_Tips();
+ }
+ break;
+ case TIPS_TYPE_TAILED_JOIN:
+ if (tips_disp.timer_count >= 3) {
+ tips_disp.timer = TIPS_TIMER_STOP;
+ tips_disp.timer_count = 0;
+ last_disp_state = TIPS_UI;
+ Clear_Tips();
+ draw_Wifi_list();
+ }
+ break;
+ case TIPS_TYPE_WIFI_CONECTED:
+ if (tips_disp.timer_count >= 3) {
+ tips_disp.timer = TIPS_TIMER_STOP;
+ tips_disp.timer_count = 0;
+
+ last_disp_state = TIPS_UI;
+ Clear_Tips();
+ draw_Wifi();
+ }
+ break;
+ default: break;
+ }
+ */
+ break;
+ case BABY_STEP_UI:
+ /*
+ if (temperature_change_frequency == 1) {
+ temperature_change_frequency = 0;
+ disp_z_offset_value();
+ }
+ */
+ break;
+ default: break;
+ }
+
+ print_time_run();
+}
+
+void clear_cur_ui() {
+ last_disp_state = disp_state_stack._disp_state[disp_state_stack._disp_index];
+
+ switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
+ case PRINT_READY_UI:
+ //Get_Temperature_Flg = 0;
+ lv_clear_ready_print();
+ break;
+ case PRINT_FILE_UI:
+ lv_clear_print_file();
+ break;
+ case PRINTING_UI:
+ lv_clear_printing();
+ break;
+ case MOVE_MOTOR_UI:
+ lv_clear_move_motor();
+ break;
+ case OPERATE_UI:
+ lv_clear_opration();
+ break;
+ case PAUSE_UI:
+ //Clear_pause();
+ break;
+ case EXTRUSION_UI:
+ lv_clear_extrusion();
+ break;
+ case PRE_HEAT_UI:
+ lv_clear_preHeat();
+ break;
+ case CHANGE_SPEED_UI:
+ lv_clear_change_speed();
+ break;
+ case FAN_UI:
+ lv_clear_fan();
+ break;
+ case SET_UI:
+ lv_clear_set();
+ break;
+ case ZERO_UI:
+ lv_clear_home();
+ break;
+ case SPRAYER_UI:
+ //Clear_Sprayer();
+ break;
+ case MACHINE_UI:
+ //Clear_Machine();
+ break;
+ case LANGUAGE_UI:
+ lv_clear_language();
+ break;
+ case ABOUT_UI:
+ lv_clear_about();
+ break;
+ case LOG_UI:
+ //Clear_Connect();
+ break;
+ case DISK_UI:
+ //Clear_Disk();
+ break;
+ case WIFI_UI:
+ //Clear_Wifi();
+ break;
+ case MORE_UI:
+ //Clear_more();
+ break;
+ case FILETRANSFER_UI:
+ //Clear_fileTransfer();
+ break;
+ case DIALOG_UI:
+ lv_clear_dialog();
+ break;
+ case FILETRANSFERSTATE_UI:
+ //Clear_WifiFileTransferdialog();
+ break;
+ case PRINT_MORE_UI:
+ //Clear_Printmore();
+ break;
+ case LEVELING_UI:
+ lv_clear_manualLevel();
+ break;
+ case BIND_UI:
+ //Clear_Bind();
+ break;
+ case ZOFFSET_UI:
+ //Clear_Zoffset();
+ break;
+ case TOOL_UI:
+ lv_clear_tool();
+ break;
+ case MESHLEVELING_UI:
+ //Clear_MeshLeveling();
+ break;
+ case HARDWARE_TEST_UI:
+ //Clear_Hardwaretest();
+ break;
+ case WIFI_LIST_UI:
+ //Clear_Wifi_list();
+ break;
+ case KEY_BOARD_UI:
+ //Clear_Keyboard();
+ break;
+ case TIPS_UI:
+ //Clear_Tips();
+ break;
+ case MACHINE_PARA_UI:
+ //Clear_MachinePara();
+ break;
+ case MACHINE_SETTINGS_UI:
+ //Clear_MachineSettings();
+ break;
+ case TEMPERATURE_SETTINGS_UI:
+ //Clear_TemperatureSettings();
+ break;
+ case MOTOR_SETTINGS_UI:
+ //Clear_MotorSettings();
+ break;
+ case MACHINETYPE_UI:
+ //Clear_MachineType();
+ break;
+ case STROKE_UI:
+ //Clear_Stroke();
+ break;
+ case HOME_DIR_UI:
+ //Clear_HomeDir();
+ break;
+ case ENDSTOP_TYPE_UI:
+ //Clear_EndstopType();
+ break;
+ case FILAMENT_SETTINGS_UI:
+ //Clear_FilamentSettings();
+ break;
+ case LEVELING_SETTIGNS_UI:
+ //Clear_LevelingSettings();
+ break;
+ case LEVELING_PARA_UI:
+ //Clear_LevelingPara();
+ break;
+ case DELTA_LEVELING_PARA_UI:
+ //Clear_DeltaLevelPara();
+ break;
+ case XYZ_LEVELING_PARA_UI:
+ //Clear_XYZLevelPara();
+ break;
+ case MAXFEEDRATE_UI:
+ //Clear_MaxFeedRate();
+ break;
+ case STEPS_UI:
+ //Clear_Steps();
+ break;
+ case ACCELERATION_UI:
+ //Clear_Acceleration();
+ break;
+ case JERK_UI:
+ //Clear_Jerk();
+ break;
+ case MOTORDIR_UI:
+ //Clear_MotorDir();
+ break;
+ case HOMESPEED_UI:
+ //Clear_HomeSpeed();
+ break;
+ case NOZZLE_CONFIG_UI:
+ //Clear_NozzleConfig();
+ break;
+ case HOTBED_CONFIG_UI:
+ //Clear_HotbedConfig();
+ break;
+ case ADVANCED_UI:
+ //Clear_Advanced();
+ break;
+ case DOUBLE_Z_UI:
+ //Clear_DoubleZ();
+ break;
+ case ENABLE_INVERT_UI:
+ //Clear_EnableInvert();
+ break;
+ case NUMBER_KEY_UI:
+ //Clear_NumberKey();
+ break;
+ case BABY_STEP_UI:
+ //Clear_babyStep();
+ break;
+ default:
+ break;
+ }
+ //GUI_Clear();
+}
+
+void draw_return_ui() {
+ if (disp_state_stack._disp_index > 0) {
+ disp_state_stack._disp_index--;
+
+ switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) {
+ case PRINT_READY_UI:
+ lv_draw_ready_print();
+ break;
+ case PRINT_FILE_UI:
+ lv_draw_print_file();
+ break;
+ case PRINTING_UI:
+ if (gCfgItems.from_flash_pic == 1) flash_preview_begin = 1;
+ else default_preview_flg = 1;
+ lv_draw_printing();
+ break;
+ case MOVE_MOTOR_UI:
+ lv_draw_move_motor();
+ break;
+ case OPERATE_UI:
+ lv_draw_opration();
+ break;
+
+ #if 1
+ case PAUSE_UI:
+ //draw_pause();
+ break;
+ #endif
+
+ case EXTRUSION_UI:
+ lv_draw_extrusion();
+ break;
+ case PRE_HEAT_UI:
+ lv_draw_preHeat();
+ break;
+ case CHANGE_SPEED_UI:
+ lv_draw_change_speed();
+ break;
+ case FAN_UI:
+ lv_draw_fan();
+ break;
+ case SET_UI:
+ lv_draw_set();
+ break;
+ case ZERO_UI:
+ lv_draw_home();
+ break;
+ case SPRAYER_UI:
+ //draw_Sprayer();
+ break;
+ case MACHINE_UI:
+ //draw_Machine();
+ break;
+ case LANGUAGE_UI:
+ lv_draw_language();
+ break;
+ case ABOUT_UI:
+ lv_draw_about();
+ break;
+
+ #if tan_mask
+ case LOG_UI:
+ //draw_Connect();
+ break;
+ #endif
+
+ case CALIBRATE_UI:
+ //draw_calibrate();
+ break;
+ case DISK_UI:
+ //draw_Disk();
+ break;
+ case WIFI_UI:
+ //draw_Wifi();
+ break;
+ case MORE_UI:
+ //draw_More();
+ break;
+ case PRINT_MORE_UI:
+ //draw_printmore();
+ break;
+ case FILAMENTCHANGE_UI:
+ //draw_FilamentChange();
+ break;
+ case LEVELING_UI:
+ lv_draw_manualLevel();
+ break;
+ case BIND_UI:
+ //draw_bind();
+ break;
+
+ #if tan_mask
+ case ZOFFSET_UI:
+ //draw_Zoffset();
+ break;
+ #endif
+
+ case TOOL_UI:
+ lv_draw_tool();
+ break;
+ case MESHLEVELING_UI:
+ //draw_meshleveling();
+ break;
+ case HARDWARE_TEST_UI:
+ //draw_Hardwaretest();
+ break;
+ case WIFI_LIST_UI:
+ //draw_Wifi_list();
+ break;
+ case KEY_BOARD_UI:
+ //draw_Keyboard();
+ break;
+ case TIPS_UI:
+ //draw_Tips();
+ break;
+ case MACHINE_PARA_UI:
+ //draw_MachinePara();
+ break;
+ case MACHINE_SETTINGS_UI:
+ //draw_MachineSettings();
+ break;
+ case TEMPERATURE_SETTINGS_UI:
+ //draw_TemperatureSettings();
+ break;
+ case MOTOR_SETTINGS_UI:
+ //draw_MotorSettings();
+ break;
+ case MACHINETYPE_UI:
+ //draw_MachineType();
+ break;
+ case STROKE_UI:
+ //draw_Stroke();
+ break;
+ case HOME_DIR_UI:
+ //draw_HomeDir();
+ break;
+ case ENDSTOP_TYPE_UI:
+ //draw_EndstopType();
+ break;
+ case FILAMENT_SETTINGS_UI:
+ //draw_FilamentSettings();
+ break;
+ case LEVELING_SETTIGNS_UI:
+ //draw_LevelingSettings();
+ break;
+ case LEVELING_PARA_UI:
+ //draw_LevelingPara();
+ break;
+ case DELTA_LEVELING_PARA_UI:
+ //draw_DeltaLevelPara();
+ break;
+ case XYZ_LEVELING_PARA_UI:
+ //draw_XYZLevelPara();
+ break;
+ case MAXFEEDRATE_UI:
+ //draw_MaxFeedRate();
+ break;
+ case STEPS_UI:
+ //draw_Steps();
+ break;
+ case ACCELERATION_UI:
+ //draw_Acceleration();
+ break;
+ case JERK_UI:
+ //draw_Jerk();
+ break;
+ case MOTORDIR_UI:
+ //draw_MotorDir();
+ break;
+ case HOMESPEED_UI:
+ //draw_HomeSpeed();
+ break;
+ case NOZZLE_CONFIG_UI:
+ //draw_NozzleConfig();
+ break;
+ case HOTBED_CONFIG_UI:
+ //draw_HotbedConfig();
+ break;
+ case ADVANCED_UI:
+ //draw_Advanced();
+ break;
+ case DOUBLE_Z_UI:
+ //draw_DoubleZ();
+ break;
+ case ENABLE_INVERT_UI:
+ //draw_EnableInvert();
+ break;
+ case NUMBER_KEY_UI:
+ //draw_NumberKey();
+ break;
+ case DIALOG_UI:
+ //draw_dialog(DialogType);
+ break;
+ case BABY_STEP_UI:
+ //draw_babyStep();
+ break;
+ default: break;
+ }
+ }
+}
+
+#if ENABLED(SDSUPPORT)
+
+ void sd_detection() {
+ static bool last_sd_status;
+ const bool sd_status = IS_SD_INSERTED();
+ if (sd_status != last_sd_status) {
+ last_sd_status = sd_status;
+ if (sd_status) card.mount(); else card.release();
+ }
+ }
+
+#endif
+
+extern volatile uint32_t systick_uptime_millis;
+
+void print_time_count() {
+ if ((systick_uptime_millis % 1000) == 0)
+ if (print_time.start == 1) print_time.seconds++;
+}
+
+void LV_TASK_HANDLER() {
+ //lv_tick_inc(1);
+ lv_task_handler();
+ TERN_(MKS_TEST, mks_test());
+ disp_pre_gcode(2, 36);
+ GUI_RefreshPage();
+ //sd_detection();
+}
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h
new file mode 100644
index 0000000000..54720a3c1f
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h
@@ -0,0 +1,229 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+#include
+#include
+#include "lvgl.h"
+#include "inc/tft_multi_language.h"
+#include "inc/draw_ready_print.h"
+#include "inc/draw_language.h"
+#include "inc/draw_set.h"
+#include "inc/draw_tool.h"
+#include "inc/draw_print_file.h"
+#include "inc/draw_dialog.h"
+#include "inc/draw_printing.h"
+#include "inc/draw_opration.h"
+#include "inc/draw_preHeat.h"
+#include "inc/draw_extrusion.h"
+#include "inc/draw_home.h"
+#include "inc/draw_move_motor.h"
+#include "inc/draw_fan.h"
+#include "inc/draw_about.h"
+#include "inc/draw_change_speed.h"
+#include "inc/draw_manuaLevel.h"
+#include "inc/draw_error_message.h"
+#include "inc/printer_opration.h"
+
+#define TFT35
+
+#ifdef TFT35
+
+ #define TFT_WIDTH 480
+ #define TFT_HEIGHT 320
+
+ #define titleHeight 36 // TFT_screen.title_high
+ #define INTERVAL_H 2 // TFT_screen.gap_h // 2
+ #define INTERVAL_V 2 // TFT_screen.gap_v // 2
+ #define BTN_X_PIXEL 117 // TFT_screen.btn_x_pixel
+ #define BTN_Y_PIXEL 140 // TFT_screen.btn_y_pixel
+
+ #define SIMPLE_FIRST_PAGE_GRAP 30
+
+ #define BUTTON_TEXT_Y_OFFSET -20
+
+ #define TITLE_XPOS 3 //TFT_screen.title_xpos
+ #define TITLE_YPOS 5 //TFT_screen.title_ypos
+
+ #define FILE_BTN_CNT 6
+
+ #define OTHER_BTN_XPIEL 117
+ #define OTHER_BTN_YPIEL 92
+
+ #define FILE_PRE_PIC_X_OFFSET 8
+ #define FILE_PRE_PIC_Y_OFFSET 0
+
+ #define PREVIEW_LITTLE_PIC_SIZE 40910//400*100+9*101+1
+ #define PREVIEW_SIZE 202720//(PREVIEW_LITTLE_PIC_SIZE+800*200+201*9+1)
+
+ #define GCFG_FLAG_VALUE 0xEE
+
+#else
+
+ #define TFT_WIDTH 320
+ #define TFT_HEIGHT 240
+
+#endif
+
+extern char public_buf_m[100];
+extern char public_buf_l[30];
+
+typedef struct {
+ uint8_t spi_flash_flag;
+ uint8_t multiple_language;
+ uint8_t language;
+ uint8_t leveling_mode;
+ uint8_t from_flash_pic;
+ uint8_t finish_power_off;
+ uint8_t pause_reprint;
+ uint32_t curFilesize;
+} CFG_ITMES;
+
+typedef struct {
+ uint8_t curTempType : 1,
+ curSprayerChoose : 3,
+ stepHeat : 4;
+ uint8_t leveling_first_time : 1;
+ uint8_t extruStep;
+ uint8_t extruSpeed;
+ uint8_t print_state;
+ uint8_t stepPrintSpeed;
+ uint8_t waitEndMoves;
+ uint16_t moveSpeed;
+ float move_dist;
+} UI_CFG;
+
+typedef enum {
+ MAIN_UI,
+ PRINT_READY_UI,
+ PRINT_FILE_UI,
+ PRINTING_UI,
+ MOVE_MOTOR_UI,
+ OPERATE_UI,
+ PAUSE_UI,
+ EXTRUSION_UI,
+ FAN_UI,
+ PRE_HEAT_UI,
+ CHANGE_SPEED_UI,
+ TEMP_UI,
+ SET_UI,
+ ZERO_UI,
+ SPRAYER_UI,
+ MACHINE_UI,
+ LANGUAGE_UI,
+ ABOUT_UI,
+ LOG_UI,
+ DISK_UI,
+ CALIBRATE_UI,
+ DIALOG_UI,
+ WIFI_UI,
+ MORE_UI,
+ FILETRANSFER_UI,
+ FILETRANSFERSTATE_UI,
+ PRINT_MORE_UI,
+ FILAMENTCHANGE_UI,
+ LEVELING_UI,
+ MESHLEVELING_UI,
+ BIND_UI,
+ ZOFFSET_UI,
+ TOOL_UI,
+ HARDWARE_TEST_UI,
+ WIFI_LIST_UI,
+ KEY_BOARD_UI,
+ TIPS_UI,
+ MACHINE_PARA_UI,
+ MACHINE_SETTINGS_UI,
+ TEMPERATURE_SETTINGS_UI,
+ MOTOR_SETTINGS_UI,
+ MACHINETYPE_UI,
+ STROKE_UI,
+ HOME_DIR_UI,
+ ENDSTOP_TYPE_UI,
+ FILAMENT_SETTINGS_UI,
+ LEVELING_SETTIGNS_UI,
+ LEVELING_PARA_UI,
+ DELTA_LEVELING_PARA_UI,
+ XYZ_LEVELING_PARA_UI,
+ MAXFEEDRATE_UI,
+ STEPS_UI,
+ ACCELERATION_UI,
+ JERK_UI,
+ MOTORDIR_UI,
+ HOMESPEED_UI,
+ NOZZLE_CONFIG_UI,
+ HOTBED_CONFIG_UI,
+ ADVANCED_UI,
+ DOUBLE_Z_UI,
+ ENABLE_INVERT_UI,
+ NUMBER_KEY_UI,
+ BABY_STEP_UI,
+ ERROR_MESSAGE_UI
+} DISP_STATE;
+
+typedef struct {
+ DISP_STATE _disp_state[100];
+ int _disp_index;
+} DISP_STATE_STACK;
+
+typedef struct {
+ int16_t days;
+ uint16_t hours;
+ uint8_t minutes;
+ volatile int8_t seconds;
+ int8_t ms_10;
+ int8_t start;
+} PRINT_TIME;
+extern PRINT_TIME print_time;
+
+extern CFG_ITMES gCfgItems;
+extern UI_CFG uiCfg;
+extern DISP_STATE disp_state;
+extern DISP_STATE last_disp_state;
+extern DISP_STATE_STACK disp_state_stack;
+
+extern lv_style_t tft_style_scr;
+extern lv_style_t tft_style_lable_pre;
+extern lv_style_t tft_style_lable_rel;
+
+extern void gCfgItems_init();
+extern void ui_cfg_init();
+extern void tft_style_init();
+extern char *creat_title_text(void);
+extern void preview_gcode_prehandle(char *path);
+extern void update_spi_flash();
+extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel);
+extern void GUI_RefreshPage();
+extern void clear_cur_ui();
+extern void draw_return_ui();
+extern void sd_detection();
+extern void gCfg_to_spiFlah();
+extern void print_time_count();
+
+extern void LV_TASK_HANDLER();
+
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp
new file mode 100644
index 0000000000..39fb836b60
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp
@@ -0,0 +1,111 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "../../../../MarlinCore.h"
+#include "lvgl.h"
+#include "pic_manager.h"
+
+typedef struct {
+ uint16_t min;
+ uint16_t max;
+ uint8_t bpp;
+ uint8_t reserved[3];
+} x_header_t;
+
+typedef struct {
+ uint32_t pos;
+} x_table_t;
+
+typedef struct {
+ uint8_t adv_w;
+ uint8_t box_w;
+} glyph_dsc_t;
+
+static x_header_t __g_xbf_hd = { .min = 0, .max = 0, .bpp = 0 };
+static uint8_t __g_font_buf[75];
+
+static uint8_t *__user_font_getdata(int offset, int size) {
+ //memset(__g_font_buf,0,sizeof(__g_font_buf));
+ get_spi_flash_data((char *)__g_font_buf, offset, size);
+ return __g_font_buf;
+ //return &buf_test[offset];
+}
+
+static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t unicode_letter) {
+ if (__g_xbf_hd.max == 0) {
+ uint8_t *p = __user_font_getdata(0, sizeof(x_header_t));
+ memcpy(&__g_xbf_hd, p, sizeof(x_header_t));
+ }
+ if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min)
+ return NULL;
+ uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4;
+ uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4);
+ if (p_pos[0] != 0) {
+ uint32_t pos = p_pos[0];
+ //glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(pos, 2);
+ __user_font_getdata(pos, 2);
+ //return __user_font_getdata(pos+2, gdsc->box_w*__g_xbf_hd.bpp/8);
+ return __user_font_getdata(pos + 2, sizeof(__g_font_buf));
+ }
+ return NULL;
+}
+
+static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) {
+ if (__g_xbf_hd.max == 0) {
+ uint8_t *p = __user_font_getdata(0, sizeof(x_header_t));
+ memcpy(&__g_xbf_hd, p, sizeof(x_header_t));
+ }
+ if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min)
+ return NULL;
+ uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4;
+ uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4);
+ if (p_pos[0] != 0) {
+ glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(p_pos[0], 2);
+ dsc_out->adv_w = gdsc->adv_w;
+ dsc_out->box_h = font->line_height;
+ dsc_out->box_w = gdsc->box_w;
+ dsc_out->ofs_x = 0;
+ dsc_out->ofs_y = 0;
+ dsc_out->bpp = __g_xbf_hd.bpp;
+ return true;
+ }
+ return false;
+}
+
+/*lv_font_t gb2312_puhui32 = {
+.get_glyph_bitmap = __user_font_get_bitmap,
+.get_glyph_dsc = __user_font_get_glyph_dsc,
+.line_height = 25,
+.base_line = 0,
+};*/
+lv_font_t gb2312_puhui32;
+void init_gb2312_font() {
+ gb2312_puhui32.get_glyph_bitmap = __user_font_get_bitmap;
+ gb2312_puhui32.get_glyph_dsc = __user_font_get_glyph_dsc;
+ gb2312_puhui32.line_height = 25;
+ gb2312_puhui32.base_line = 0;
+}
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp
new file mode 100644
index 0000000000..08ce13c8aa
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp
@@ -0,0 +1,594 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "tft_lvgl_configuration.h"
+#include "lvgl.h"
+#include "draw_ready_print.h"
+#include "W25Qxx.h"
+#include "pic_manager.h"
+#include "mks_hardware_test.h"
+
+#include "../../../../MarlinCore.h"
+#include "../../../../module/temperature.h"
+#include "../../../../feature/touch/xpt2046.h"
+
+#if ENABLED(MKS_TEST)
+
+ extern uint8_t curent_disp_ui;
+
+ uint8_t pw_det_sta, pw_off_sta, mt_det_sta, mt_det2_sta, mt_det3_sta;
+ uint8_t endstopx1_sta, endstopx2_sta, endstopy1_sta, endstopy2_sta, endstopz1_sta, endstopz2_sta;
+ void test_gpio_readlevel_L() {
+ volatile uint32_t itest;
+ WRITE(WIFI_IO2_PIN, HIGH);
+ itest = 10000;
+ while (itest--);
+ pw_det_sta = (READ(POWER_LOSS_PIN) == 0);
+ pw_off_sta = (READ(PS_ON_PIN) == 0);
+ mt_det_sta = (READ(FIL_RUNOUT_PIN) == 0);
+ mt_det2_sta = (READ(FIL_RUNOUT_2_PIN) == 0);
+ mt_det3_sta = (READ(FIL_RUNOUT_3_PIN) == 0);
+ endstopx1_sta = (READ(X_MIN_PIN) == 0);
+ endstopx2_sta = (READ(X_MAX_PIN) == 0);
+ endstopy1_sta = (READ(Y_MIN_PIN) == 0);
+ endstopy2_sta = (READ(Y_MAX_PIN) == 0);
+ endstopz1_sta = (READ(Z_MIN_PIN) == 0);
+ endstopz2_sta = (READ(Z_MAX_PIN) == 0);
+ }
+
+ void test_gpio_readlevel_H() {
+ volatile uint32_t itest;
+ WRITE(WIFI_IO2_PIN, LOW);
+ itest = 10000;
+ while (itest--);
+ pw_det_sta = (READ(POWER_LOSS_PIN) == 1);
+ pw_off_sta = (READ(PS_ON_PIN) == 1);
+ mt_det_sta = (READ(FIL_RUNOUT_PIN) == 1);
+ mt_det2_sta = (READ(FIL_RUNOUT_2_PIN) == 1);
+ mt_det3_sta = (READ(FIL_RUNOUT_3_PIN) == 1);
+ endstopx1_sta = (READ(X_MIN_PIN) == 1);
+ endstopx2_sta = (READ(X_MAX_PIN) == 1);
+ endstopy1_sta = (READ(Y_MIN_PIN) == 1);
+ endstopy2_sta = (READ(Y_MAX_PIN) == 1);
+ endstopz1_sta = (READ(Z_MIN_PIN) == 1);
+ endstopz2_sta = (READ(Z_MAX_PIN) == 1);
+ }
+
+ void init_Tst_GPIO() {
+ SET_INPUT_PULLUP(X_MIN_PIN);
+ SET_INPUT_PULLUP(X_MAX_PIN);
+ SET_INPUT_PULLUP(Y_MIN_PIN);
+ SET_INPUT_PULLUP(Y_MAX_PIN);
+ SET_INPUT_PULLUP(Z_MIN_PIN);
+ SET_INPUT_PULLUP(Z_MAX_PIN);
+
+ SET_OUTPUT(WIFI_IO2_PIN);
+
+ SET_INPUT_PULLUP(FIL_RUNOUT_PIN);
+ SET_INPUT_PULLUP(FIL_RUNOUT_2_PIN);
+ SET_INPUT_PULLUP(FIL_RUNOUT_3_PIN);
+
+ SET_INPUT_PULLUP(POWER_LOSS_PIN);
+ SET_INPUT_PULLUP(PS_ON_PIN);
+
+ SET_INPUT_PULLUP(SERVO0_PIN);
+
+ SET_OUTPUT(E0_ENABLE_PIN);
+ SET_OUTPUT(X_ENABLE_PIN);
+
+ WRITE(X_ENABLE_PIN, LOW);
+ WRITE(Y_ENABLE_PIN, LOW);
+ WRITE(Z_ENABLE_PIN, LOW);
+ WRITE(E0_ENABLE_PIN, LOW);
+ WRITE(E1_ENABLE_PIN, LOW);
+ WRITE(E2_ENABLE_PIN, LOW);
+ }
+
+ void mks_test_beeper() {
+ WRITE(BEEPER_PIN, HIGH);
+ delay(100);
+ WRITE(BEEPER_PIN, LOW);
+ delay(100);
+ }
+
+ void Test_GPIO() {
+ init_Tst_GPIO();
+
+ test_gpio_readlevel_L();
+ test_gpio_readlevel_H();
+ test_gpio_readlevel_L();
+ if ((pw_det_sta == 1) && (mt_det_sta == 1) && (mt_det2_sta == 1) && (mt_det3_sta == 1)) {
+ if (curent_disp_ui == 1) disp_det_ok();
+ }
+ else if (curent_disp_ui == 1) disp_det_error();
+ if ((endstopx1_sta == 1)
+ && (endstopx2_sta == 1)
+ && (endstopy1_sta == 1)
+ && (endstopy2_sta == 1)
+ && (endstopz1_sta == 1)
+ && (endstopz2_sta == 1)
+ ) {
+ if (curent_disp_ui == 1) disp_Limit_ok();
+ }
+ else if (curent_disp_ui == 1)
+ disp_Limit_error();
+ //mks_test_beeper();
+
+ }
+
+ void mks_test() {
+ if (millis() % 2000 < 1000) {
+ WRITE(X_DIR_PIN, LOW);
+ WRITE(Y_DIR_PIN, LOW);
+ WRITE(Z_DIR_PIN, LOW);
+ WRITE(E0_DIR_PIN, LOW);
+ WRITE(E1_DIR_PIN, LOW);
+ WRITE(E2_DIR_PIN, LOW);
+ thermalManager.fan_speed[0] = 255;
+ WRITE(HEATER_2_PIN, HIGH); // HE2
+ WRITE(HEATER_1_PIN, HIGH); // HE1
+ WRITE(HEATER_0_PIN, HIGH); // HE0
+ WRITE(HEATER_BED_PIN, HIGH); // HOT-BED
+ }
+ else {
+ WRITE(X_DIR_PIN, HIGH);
+ WRITE(Y_DIR_PIN, HIGH);
+ WRITE(Z_DIR_PIN, HIGH);
+ WRITE(E0_DIR_PIN, HIGH);
+ WRITE(E1_DIR_PIN, HIGH);
+ WRITE(E2_DIR_PIN, HIGH);
+ thermalManager.fan_speed[0] = 0;
+ WRITE(HEATER_2_PIN, LOW); // HE2
+ WRITE(HEATER_1_PIN, LOW); // HE1
+ WRITE(HEATER_0_PIN, LOW); // HE0
+ WRITE(HEATER_BED_PIN, LOW); // HOT-BED
+ }
+ if ((endstopx1_sta == 1) && (endstopx2_sta == 1)
+ && (endstopy1_sta == 1) && (endstopy2_sta == 1)
+ && (endstopz1_sta == 1) && (endstopz2_sta == 1)
+ ) {
+
+ }
+ else {
+ mks_test_beeper();
+ }
+
+ if (curent_disp_ui == 1)
+ disp_test();
+ }
+
+#endif // MKS_TEST
+
+static const uint16_t ASCII_Table_16x24[] PROGMEM = {
+ // Space ' '
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '!'
+ 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000,
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '"'
+ 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '#'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60,
+ 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318,
+ 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000,
+ // '$'
+ 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C,
+ 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C,
+ 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000,
+ // '%'
+ 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611,
+ 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460,
+ 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000,
+ // '&'
+ 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0,
+ 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06,
+ 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // "'"
+ 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '('
+ 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060,
+ 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030,
+ 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000,
+ // ')'
+ 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300,
+ 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600,
+ 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000,
+ // '*'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,
+ 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '+'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // ','
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000,
+ // '-'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '.'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '/'
+ 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300,
+ 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0,
+ 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '0'
+ 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C,
+ 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38,
+ 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '1'
+ 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180,
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '2'
+ 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800,
+ 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018,
+ 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '3'
+ 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600,
+ 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18,
+ 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '4'
+ 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60,
+ 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00,
+ 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '5'
+ 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC,
+ 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18,
+ 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '6'
+ 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC,
+ 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38,
+ 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '7'
+ 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380,
+ 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030,
+ 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '8'
+ 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638,
+ 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38,
+ 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '9'
+ 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C,
+ 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C,
+ 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // ':'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // ';'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000,
+ // '<'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0,
+ 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '='
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '>'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0,
+ 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '?'
+ 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00,
+ 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000,
+ 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '@'
+ 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411,
+ 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004,
+ 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'A'
+ 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60,
+ 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C,
+ 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'B'
+ 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C,
+ 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C,
+ 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'C'
+ 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006,
+ 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C,
+ 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'D'
+ 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006,
+ 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06,
+ 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'E'
+ 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,
+ 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,
+ 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'F'
+ 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'G'
+ 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003,
+ 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C,
+ 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'H'
+ 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,
+ 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,
+ 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'I'
+ 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'J'
+ 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600,
+ 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738,
+ 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'K'
+ 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6,
+ 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806,
+ 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'L'
+ 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,
+ 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'M'
+ 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836,
+ 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6,
+ 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'N'
+ 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC,
+ 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C,
+ 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'O'
+ 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003,
+ 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C,
+ 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'P'
+ 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C,
+ 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,
+ 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'Q'
+ 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003,
+ 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C,
+ 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'R'
+ 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806,
+ 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006,
+ 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'S'
+ 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C,
+ 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C,
+ 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'T'
+ 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'U'
+ 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,
+ 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818,
+ 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'V'
+ 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C,
+ 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360,
+ 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'W'
+ 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366,
+ 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C,
+ 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'X'
+ 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0,
+ 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C,
+ 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'Y'
+ 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660,
+ 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'Z'
+ 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600,
+ 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006,
+ 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '['
+ 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060,
+ 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060,
+ 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000,
+ // '\'
+ 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0,
+ 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300,
+ 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // ']'
+ 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+ 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,
+ 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000,
+ // '^'
+ 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630,
+ 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '_'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '''
+ 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'a'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8,
+ 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C,
+ 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'b'
+ 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8,
+ 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38,
+ 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'c'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0,
+ 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30,
+ 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'd'
+ 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0,
+ 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30,
+ 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'e'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0,
+ 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30,
+ 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'f'
+ 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0,
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,
+ 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'g'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8,
+ 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18,
+ 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000,
+ // 'h'
+ 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8,
+ 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818,
+ 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'i'
+ 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,
+ 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'j'
+ 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000,
+ // 'k'
+ 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C,
+ 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C,
+ 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'l'
+ 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,
+ 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'm'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF,
+ 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183,
+ 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'n'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8,
+ 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818,
+ 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'o'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0,
+ 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30,
+ 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'p'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8,
+ 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38,
+ 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000,
+ // 'q'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0,
+ 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30,
+ 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000,
+ // 'r'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0,
+ 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030,
+ 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 's'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0,
+ 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38,
+ 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 't'
+ 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0,
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,
+ 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'u'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818,
+ 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38,
+ 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'v'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18,
+ 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360,
+ 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'w'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1,
+ 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C,
+ 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'x'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38,
+ 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30,
+ 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // 'y'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830,
+ 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380,
+ 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000,
+ // 'z'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC,
+ 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018,
+ 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ // '{'
+ 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,
+ 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0,
+ 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000,
+ // '|'
+ 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000,
+ // '}'
+ 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180,
+ 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180,
+ 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000,
+ // '~'
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+
+void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint16_t bkColor) {
+ for (uint16_t i = 0; i < 24; i++) {
+ const uint16_t tmp_char = pgm_read_word(&ASCII_Table_16x24[((c - 0x20) * 24) + i]);
+ for (uint16_t j = 0; j < 16; j++)
+ tft_set_point(x + j, y + i, ((tmp_char >> j) & 0x01) ? charColor : bkColor);
+ }
+}
+
+void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor, uint16_t bkColor) {
+ while (*string != '\0') {
+ disp_char_1624(x, y, *string, charColor, bkColor);
+ string++;
+ x += 16;
+ }
+}
+
+//static lv_obj_t * scr_test;
+void disp_pic_update() {
+ LCD_Clear(0x0000);
+ disp_string(120, 150, "PIC Updating...", 0xFFFF, 0x0000);
+}
+
+void disp_font_update() {
+ LCD_Clear(0x0000);
+ disp_string(120, 150, "FONT Updating...", 0xFFFF, 0x0000);
+}
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h
new file mode 100644
index 0000000000..a1e2972aa7
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.h
@@ -0,0 +1,31 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "lvgl.h"
+
+void Test_GPIO();
+void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint16_t bkColor);
+void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor, uint16_t bkColor);
+void mks_test();
+void disp_pic_update();
+void disp_font_update();
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp
new file mode 100644
index 0000000000..85049ed3a1
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp
@@ -0,0 +1,736 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "../../../../MarlinCore.h"
+
+//#include "type_define.h"
+#include "string.h"
+
+#include "pic_manager.h"
+#include "W25Qxx.h"
+#include "../../../../sd/cardreader.h"
+#include "draw_ready_print.h"
+#include "mks_hardware_test.h"
+
+//#include "gui.h"
+//#include "spi_flash.h"
+
+//uint8_t DMA_ERRO_FLAG;
+extern uint16_t DeviceCode;
+extern unsigned char bmp_public_buf[17 * 1024];
+
+#if ENABLED(SDSUPPORT)
+ extern char *createFilename(char * const buffer, const dir_t &p);
+#endif
+
+/*void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) {}*/
+
+uint32_t lv_get_pic_addr(uint8_t *Pname) {
+ uint8_t Pic_cnt;
+ uint8_t i, j;
+ PIC_MSG PIC;
+ uint32_t tmp_cnt = 0;
+ uint32_t addr = 0;
+
+ W25QXX.init(SPI_QUARTER_SPEED);
+
+ W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1);
+ if (Pic_cnt == 0xff)
+ Pic_cnt = 0;
+ for (i = 0; i < Pic_cnt; i++) {
+ j = 0;
+ do
+ {
+ W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1);
+ tmp_cnt++;
+ }while (PIC.name[j++] != '\0');
+
+ if ((strcmp((char*)Pname, (char*)PIC.name)) == 0) {
+
+ if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761))
+ addr = PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35;
+ else
+ addr = PIC_DATA_ADDR_TFT32 + i * PER_PIC_MAX_SPACE_TFT32;
+ return (addr + 4);//The purpose of adding 4 is to remove 4-byte picture header information.
+ }
+ }
+
+ return addr;
+}
+
+const char *picPath = "mks_pic";
+const char *bakPath = "bak_pic";
+
+const char *fontPath = "mks_font";
+const char *bakFont = "bak_font";
+
+#if 1
+
+void spiFlashErase_PIC() {
+ #if 1
+ volatile uint32_t pic_sectorcnt = 0;
+
+ //LCD_Clear(BACK_COLOR);
+ //LCD_DisplayString(90,80,"SPI Flash");
+ //LCD_DisplayString(120,90,"PIC Erasing...");
+ if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) {
+ //LCD_ShowString(180,100,200,24,24,"SPI Flash");
+ //LCD_ShowString(170,130,200,24,24,"PIC Erasing...");
+ }
+ else {
+ //LCD_ShowString(100,90,200,24,24,"SPI Flash");
+ //LCD_ShowString(100,120,200,24,24,"PIC Erasing...");
+ }
+ #if ENABLED(MKS_TEST)
+ for (pic_sectorcnt = 0; pic_sectorcnt < 2; pic_sectorcnt++)
+ W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024);
+
+ #else
+ for (pic_sectorcnt = 0; pic_sectorcnt < PIC_SIZE_xM * 1024 / 64; pic_sectorcnt++)
+ W25QXX.SPI_FLASH_BlockErase(PICINFOADDR + pic_sectorcnt * 64 * 1024);
+
+ #endif
+ /*
+ FLASH_Unlock();
+ spiFlashEraseFlag = SPI_FLASH_ERASE_FLAG_DATA;
+ FLASH_ProgramHalfWord(SPI_FLASH_ERASE_FLAG_ADDR,spiFlashEraseFlag);
+ FLASH_Lock();
+ */
+ #if 0
+ if (DeviceCode == 0x9488)
+ LCD_ShowString(170, 130, 200, 24, 24, "PIC Erase Done");
+ else
+ LCD_ShowString(100, 120, 200, 24, 24, "PIC Erase Done");
+
+ #endif
+ //spiFlashEraseFlag = 1;
+ #endif
+}
+
+void spiFlashErase_FONT() {
+ volatile uint32_t Font_sectorcnt = 0;
+
+ //LCD_Clear(BACK_COLOR);
+ if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) {
+ //LCD_ShowString(180,100,200,24,24,"SPI Flash");
+ //LCD_ShowString(170,130,200,24,24,"FONT Erasing...");
+ }
+ else {
+ //LCD_ShowString(100,90,200,24,24,"SPI Flash");
+ //LCD_ShowString(90,120,200,24,24,"FONT Erasing...");
+ }
+
+ for (Font_sectorcnt = 0; Font_sectorcnt < FONT_SIZE_xM * 1024 / 64; Font_sectorcnt++)
+ W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024);
+
+ /*
+ FLASH_Unlock();
+ spiFlashEraseFlag = SPI_FLASH_ERASE_FLAG_DATA;
+ FLASH_ProgramHalfWord(SPI_FLASH_ERASE_FLAG_ADDR,spiFlashEraseFlag);
+ FLASH_Lock();
+ */
+ #if 0
+ if (DeviceCode == 0x9488)
+ LCD_ShowString(170, 130, 200, 24, 24, "FONT Erase Done");
+ else
+ LCD_ShowString(90, 120, 200, 24, 24, "FONT Erase Done");
+ //LCD_DisplayString(120,90,"FONT Erase Done");
+ #endif
+ //spiFlashEraseFlag = 1;
+}
+
+uint32_t LogoWrite_Addroffset = 0;
+
+uint8_t Pic_Logo_Write(uint8_t *LogoName, uint8_t *Logo_Wbuff, uint32_t LogoWriteSize) {
+ //uint16_t n;
+ uint32_t i;
+ uint8_t temp1;
+ static uint32_t logo_maxsize;
+
+ if (LogoWriteSize <= 0) return 0;
+
+ W25QXX.SPI_FLASH_BufferWrite(Logo_Wbuff, PIC_LOGO_ADDR + LogoWrite_Addroffset, LogoWriteSize);
+
+ for (i = 0; i < LogoWriteSize; i++) {
+ W25QXX.SPI_FLASH_BufferRead(&temp1, PIC_LOGO_ADDR + LogoWrite_Addroffset + i, 1);
+ if (*(Logo_Wbuff + i) != temp1) return 0;
+ }
+ LogoWrite_Addroffset += LogoWriteSize;
+ if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761))
+ logo_maxsize = LOGO_MAX_SIZE_TFT35;
+ else
+ logo_maxsize = LOGO_MAX_SIZE_TFT32;
+ if (LogoWrite_Addroffset >= logo_maxsize)
+ LogoWrite_Addroffset = 0;
+ return 1;
+}
+
+uint32_t TitleLogoWrite_Addroffset = 0;
+uint8_t Pic_TitleLogo_Write(uint8_t *TitleLogoName, uint8_t *TitleLogo_Wbuff, uint32_t TitleLogoWriteSize) {
+ //uint32_t i;
+ //uint8_t temp1;
+ if (TitleLogoWriteSize <= 0)
+ return 0;
+ if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761))
+ W25QXX.SPI_FLASH_BufferWrite(TitleLogo_Wbuff, PIC_ICON_LOGO_ADDR_TFT35 + TitleLogoWrite_Addroffset, TitleLogoWriteSize);
+ else
+ W25QXX.SPI_FLASH_BufferWrite(TitleLogo_Wbuff, PIC_ICON_LOGO_ADDR_TFT32 + TitleLogoWrite_Addroffset, TitleLogoWriteSize);
+ TitleLogoWrite_Addroffset += TitleLogoWriteSize;
+ if (TitleLogoWrite_Addroffset >= TITLELOGO_MAX_SIZE)
+ TitleLogoWrite_Addroffset = 0;
+ return 1;
+}
+
+uint32_t default_view_addroffset_r = 0;
+void default_view_Write(uint8_t *default_view__Rbuff, uint32_t default_view_Writesize) {
+ W25QXX.SPI_FLASH_BufferWrite(default_view__Rbuff, DEFAULT_VIEW_ADDR_TFT35 + default_view_addroffset_r, default_view_Writesize);
+ default_view_addroffset_r += default_view_Writesize;
+ if (default_view_addroffset_r >= DEFAULT_VIEW_MAX_SIZE)
+ default_view_addroffset_r = 0;
+}
+
+uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) {
+ uint8_t pic_counter = 0;
+ uint32_t Pic_SaveAddr;
+ uint32_t Pic_SizeSaveAddr;
+ uint32_t Pic_NameSaveAddr;
+ //uint8_t temp;
+ uint8_t Pname_temp;
+ uint32_t i, j;
+ uint32_t name_len = 0;
+ uint32_t SaveName_len = 0;
+ union union32 size_tmp;
+ //union union32 size1;
+ //uint8_t Pn[PIC_NAME_MAX_LEN];
+ //uint8_t cnt_temp;
+ //uint16_t n0;
+ //uint32_t Name_saveAddr = 0;
+ //uint8_t pic_position;
+
+ W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1);
+
+ if (pic_counter == 0xFF)
+ pic_counter = 0;
+
+ if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761))
+ Pic_SaveAddr = PIC_DATA_ADDR_TFT35 + pic_counter * PER_PIC_MAX_SPACE_TFT35;
+ else
+ Pic_SaveAddr = PIC_DATA_ADDR_TFT32 + pic_counter * PER_PIC_MAX_SPACE_TFT32;
+
+ for (j = 0; j < pic_counter; j++) {
+ do {
+ W25QXX.SPI_FLASH_BufferRead(&Pname_temp, PIC_NAME_ADDR + SaveName_len, 1);
+ SaveName_len++;
+ } while (Pname_temp != '\0');
+ }
+ i = 0;
+ while ((*(P_name + i) != '\0')) {
+ i++;
+ name_len++;
+ }
+
+ Pic_NameSaveAddr = PIC_NAME_ADDR + SaveName_len;
+ W25QXX.SPI_FLASH_BufferWrite(P_name, Pic_NameSaveAddr, name_len + 1);
+ Pic_SizeSaveAddr = PIC_SIZE_ADDR + 4 * pic_counter;
+ size_tmp.dwords = P_size;
+ W25QXX.SPI_FLASH_BufferWrite(size_tmp.bytes, Pic_SizeSaveAddr, 4);
+
+ pic_counter++;
+ W25QXX.SPI_FLASH_SectorErase(PIC_COUNTER_ADDR);
+ W25QXX.SPI_FLASH_BufferWrite(&pic_counter, PIC_COUNTER_ADDR, 1);
+
+ return Pic_SaveAddr;
+}
+
+uint8_t public_buf[512];
+
+//uint8_t public_buf_test[512];
+ #if ENABLED(SDSUPPORT)
+void UpdatePic() {
+ //int r;
+ //unsigned char *p;
+ //char rootPath[10]={0};
+ char *fn;
+ unsigned char logoFlag;
+ uint16_t pbr;
+ uint32_t pfileSize;
+ uint32_t Pic_Write_Addr;
+ /*----------------------------------*/
+
+ // FILINFO fno;
+ //DIR dir;
+ //char tmp[30];
+ #if 0//_USE_LFN
+ static char lfn[_MAX_LFN + 1];
+ finfo.lfname = lfn;
+ finfo.lfsize = sizeof(lfn);
+ #endif
+ //SdFile curDir;
+ //if (f_opendir(&dirs, picPath) == FR_OK)
+ //card.cd(picPath);
+
+ //const uint16_t fileCnt = card.get_num_Files();
+
+ //SdFile *curDir;
+ //SdFile dir;
+ //dir.open(picPath, O_READ);
+ //const char * const fname = card.diveToFile(true, curDir, picPath);
+ //if (!fname) return;
+
+ SdFile dir, root = card.getroot();
+ if (dir.open(&root, picPath, O_RDONLY)) {
+
+ disp_pic_update();
+ spiFlashErase_PIC();
+
+ dir_t d;
+ while (dir.readDir(&d, card.longFilename) > 0) {
+ #if 1
+ /*
+ if (power_det == 0) {
+ PW_DET_ON;
+ power_det=0;
+ }
+ SPI_FLASH_Init();
+ */
+
+ //for (uint16_t i = 0; i < fileCnt; i++) {
+ //res = f_readdir(&dirs, &finfo);
+ //card.getfilename_sorted(i);
+
+ if (card.longFilename[0] == 0)
+ break;
+ /*if ( card.filename[0] == '.')
+ continue;
+ */
+ if (card.longFilename[0] == '.')
+ continue;
+
+ fn = card.longFilename;
+
+ /*if ((finfo.lfname[0] == 0) || (finfo.lfname == 0))
+ fn = finfo.fname;
+ else
+ fn = finfo.lfname;*/
+
+ /* if (fno.fattrib & AM_DIR)
+ {
+ continue;
+ }
+ else */
+ //{
+ //if ((strstr(fn, ".gco")) || (strstr(fn, ".GCO")) || (fno.fattrib & AM_DIR))
+ if (strstr(fn, ".bin")) {
+ if (strstr(fn, "_logo"))
+ logoFlag = 1;
+ else if (strstr(fn, "_titlelogo"))
+ logoFlag = 2;
+ else if (strstr(fn, "_preview"))
+ logoFlag = 3;
+ else
+ logoFlag = 0;
+
+ //public_buf[0] = '\0';
+ //strcat(public_buf, picPath);
+ //strcat(public_buf, "/");
+ char dosFilename[FILENAME_LENGTH];
+ createFilename(dosFilename, d);
+ //strcat(public_buf, dosFilename);
+
+ SdFile file;
+ if (file.open(&dir, dosFilename, O_READ)) {
+ #if 1
+ /*LCD_Clear(BACK_COLOR);
+
+ if ((DeviceCode==0x9488)||(DeviceCode==0x5761)) {
+ LCD_ShowString(170,100,200,24,24,(u8 *)fn);
+ LCD_ShowString(180,130,200,24,24,"Updating...");
+ }
+ else {
+ LCD_ShowString(90,90,200,24,24,(u8 *)fn);
+ LCD_ShowString(90,120,200,24,24,"Updating...");
+ }
+ */
+ if (logoFlag == 1) {
+ while (1) {
+ pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
+ Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); //
+ if (pbr < BMP_WRITE_BUF_LEN) break;
+ }
+ }
+ else if (logoFlag == 2) {
+ while (1) {
+ pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
+ Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); //
+ if (pbr < BMP_WRITE_BUF_LEN) break;
+ }
+ }
+ else if (logoFlag == 3) {
+ while (1)
+ {
+ pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
+ default_view_Write(public_buf, pbr); //
+ if (pbr < BMP_WRITE_BUF_LEN) break;
+ }
+ }
+ else {
+ pfileSize = file.fileSize();
+ Pic_Write_Addr = Pic_Info_Write((uint8_t *)fn, pfileSize);
+ //uint32_t addr_test = Pic_Write_Addr;
+ //memset(bmp_public_buf, 0xff, BMP_WRITE_BUF_LEN);
+ while (1)
+ {
+ pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
+ W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr);
+ Pic_Write_Addr += pbr;
+ if (pbr < BMP_WRITE_BUF_LEN) break;
+ }
+ //W25QXX.SPI_FLASH_BufferRead(public_buf_test,addr_test,BMP_WRITE_BUF_LEN);
+ }
+
+ /*--------------read test--------------------*/
+ /*
+ BufferSet(picBuffer, 0xff, PICTURE_MAX_SIZE);
+ if (logoFlag == 0)
+ {
+ PicMsg_Init();
+ Pic_Read(fn,picBuffer);
+ }
+ else
+ Pic_Logo_Read(fn,picBuffer,PICTURE_MAX_SIZE);
+ */
+ /*--------------read test--------------------*/
+
+ file.close();
+ #endif
+ }
+
+ }
+ //}
+ //}
+ /*
+ LCD_Clear(LCD_COLOR_BLACK);
+ //LCD_ShowString(110,100,200,24,24,"Complete");
+ LCD_DisplayString(110,80,"Complete");
+ delay(0xfffff);
+ */
+ //r = f_chdir("/");
+ #if 1
+ //SdFile dir, root = card.getroot();
+ /*if (dir.open(&root, bakPath, O_RDONLY))
+ {
+ dir.remove();
+ }*/
+
+ //r = f_rename(picPath, bakPath);
+
+
+ //update_flag_ok = 1;
+ #endif
+ #endif
+ }
+ dir.rename(&root, bakPath);
+ }
+}
+
+
+void spi_flash_read_test() {W25QXX.SPI_FLASH_BufferRead(public_buf, UNIGBK_FLASH_ADDR, BMP_WRITE_BUF_LEN);}
+
+void UpdateFont() {
+ //int r;
+ //unsigned char *p;
+ //char rootPath[10]={0};
+ char *fn;
+ //unsigned char logoFlag;
+ uint16_t pbr;
+ uint32_t flashaddr = 0;
+ //uint32_t pfileSize;
+ //uint32_t Pic_Write_Addr;
+ /*----------------------------------*/
+
+ // FILINFO fno;
+ //DIR dir;
+ //char tmp[30];
+ #if 0//_USE_LFN
+ static char lfn[_MAX_LFN + 1];
+ finfo.lfname = lfn;
+ finfo.lfsize = sizeof(lfn);
+ #endif
+ //SdFile curDir;
+ //if (f_opendir(&dirs, picPath) == FR_OK)
+ //card.cd(picPath);
+
+ //const uint16_t fileCnt = card.get_num_Files();
+
+ //SdFile *curDir;
+ //SdFile dir;
+ //dir.open(picPath, O_READ);
+ //const char * const fname = card.diveToFile(true, curDir, picPath);
+ //if (!fname) return;
+
+ SdFile dir, root = card.getroot();
+ if (dir.open(&root, fontPath, O_RDONLY)) {
+
+ disp_font_update();
+ spiFlashErase_FONT();
+
+ dir_t d;
+ while (dir.readDir(&d, card.longFilename) > 0)
+ {
+ #if 1
+ /*if (power_det == 0)
+ {
+ PW_DET_ON;
+ power_det=0;
+ }
+ SPI_FLASH_Init();*/
+
+
+ //for (uint16_t i = 0; i < fileCnt; i++)
+ //{
+ //res = f_readdir(&dirs, &finfo);
+ //card.getfilename_sorted(i);
+
+ if (card.longFilename[0] == 0)
+ break;
+ /*if ( card.filename[0] == '.')
+ continue;
+ */
+ if (card.longFilename[0] == '.')
+ continue;
+
+ fn = card.longFilename;
+
+ /*if ((finfo.lfname[0] == 0) || (finfo.lfname == 0))
+ fn = finfo.fname;
+ else
+ fn = finfo.lfname;*/
+
+ /* if (fno.fattrib & AM_DIR)
+ {
+ continue;
+ }
+ else */
+ //{
+ //if ((strstr(fn, ".gco")) || (strstr(fn, ".GCO")) || (fno.fattrib & AM_DIR))
+ if (strstr(fn, ".bin")) {
+ char dosFilename[FILENAME_LENGTH];
+ createFilename(dosFilename, d);
+ //strcat(public_buf, dosFilename);
+
+ SdFile file;
+ if (file.open(&dir, dosFilename, O_READ)) {
+
+ #if 1
+ /*LCD_Clear(BACK_COLOR);
+
+ if ((DeviceCode==0x9488)||(DeviceCode==0x5761))
+ {
+ LCD_ShowString(170,100,200,24,24,(u8 *)fn);
+ LCD_ShowString(180,130,200,24,24,"Updating...");
+ }
+ else
+ {
+ LCD_ShowString(90,90,200,24,24,(u8 *)fn);
+ LCD_ShowString(90,120,200,24,24,"Updating...");
+ }
+ */
+ flashaddr = UNIGBK_FLASH_ADDR;
+ pbr = 0;
+ while (1)
+ {
+ flashaddr += pbr;
+ pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
+ W25QXX.SPI_FLASH_BufferWrite(public_buf, flashaddr, pbr);
+ //W25QXX.SPI_FLASH_BufferRead(public_buf_test,flashaddr,pbr);
+ /*if (UNIGBKFlag == 1)
+ {
+ fontrate = (uint16_t)(((float)(flashaddr - UNIGBK_FLASH_ADDR)/(float)(psrc.fsize))*100);
+ }
+ else
+ {
+ fontrate = (uint16_t)(((float)(flashaddr - GBK_FLASH_ADDR)/(float)(psrc.fsize))*100);
+ }
+
+ if (fontrate > 99) fontrate=99;
+
+ if (fontrate < 10)
+ {
+ fontString[0] = fontrate%10 + 0x30;
+ fontString[1] = '%';
+ fontString[2] = '\0';
+ }
+ else
+ {
+ fontString[0] = fontrate/10 + 0x30;
+ fontString[1] = fontrate%10 + 0x30;
+ fontString[2] = '%';
+ fontString[3] = '\0';
+ }*/
+ //LCD_DisplayString(140,130,fontString);
+ if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) {
+ //LCD_ShowString(200,160,200,24,24,fontString);
+ }
+ else {
+ //LCD_ShowString(140,150,200,24,24,fontString);
+ }
+ if (pbr < BMP_WRITE_BUF_LEN) break;
+ }
+ /*--------------read test--------------------*/
+ /*
+ BufferSet(picBuffer, 0xff, PICTURE_MAX_SIZE);
+ if (logoFlag == 0)
+ {
+ PicMsg_Init();
+ Pic_Read(fn,picBuffer);
+ }
+ else
+ Pic_Logo_Read(fn,picBuffer,PICTURE_MAX_SIZE);
+ */
+ /*--------------read test--------------------*/
+
+ file.close();
+ #endif
+ }
+
+ }
+ //}
+ //}
+ /*
+ LCD_Clear(LCD_COLOR_BLACK);
+ //LCD_ShowString(110,100,200,24,24,"Complete");
+ LCD_DisplayString(110,80,"Complete");
+ delay(0xfffff);
+ */
+ //r = f_chdir("/");
+ #if 1
+ //SdFile dir, root = card.getroot();
+ /*if (dir.open(&root, bakPath, O_RDONLY))
+ {
+ dir.remove();
+ }*/
+ dir.rename(&root, bakFont);
+ //r = f_rename(picPath, bakPath);
+
+
+ //update_flag_ok = 1;
+ #endif
+ #endif
+ }
+ }
+}
+ #endif // SDSUPPORT
+
+#endif
+
+#if 1
+
+void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) {
+ uint8_t i, j;
+ uint8_t Pic_cnt;
+ uint32_t tmp_cnt = 0;
+ PIC_MSG PIC;
+
+ //void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead);
+
+ W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1);
+ if (Pic_cnt == 0xff)
+ Pic_cnt = 0;
+
+ for (i = 0; i < Pic_cnt; i++) {
+ //pic name
+ j = 0;
+ do
+ {
+ W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1);
+ tmp_cnt++;
+ }while (PIC.name[j++] != '\0');
+ //pic size
+ W25QXX.SPI_FLASH_BufferRead(PIC.size.bytes, PIC_SIZE_ADDR + i * 4, 4);
+
+ if ((strcmp((char*)Pname, (char*)PIC.name)) == 0) {
+ W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35, PIC.size.dwords);
+ /*if (DMA_ERRO_FLAG)
+ {
+ DMA_ERRO_FLAG = 0;
+ SPI_FLASH_BufferRead((uint8_t *)P_Rbuff,PIC_DATA_ADDR+i*PER_PIC_MAX_SPACE,PIC.size.dwords);
+ }*/
+ break;
+ }
+ }
+}
+
+void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) {
+ W25QXX.init(SPI_QUARTER_SPEED);
+ W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size);
+ /*if (DMA_ERRO_FLAG) {
+ DMA_ERRO_FLAG = 0;
+ SPI_FLASH_BufferRead((uint8_t *)P_Rbuff,addr,size);
+ }*/
+
+}
+
+void get_spi_flash_data(const char *rec_buf, int addr, int size) {
+ W25QXX.init(SPI_QUARTER_SPEED);
+ W25QXX.SPI_FLASH_BufferRead((uint8_t *)rec_buf, UNIGBK_FLASH_ADDR + addr, size);
+}
+
+#endif
+
+#if 1
+
+ uint32_t logo_addroffset = 0;
+ void Pic_Logo_Read(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize) {
+ W25QXX.SPI_FLASH_BufferRead(Logo_Rbuff, PIC_LOGO_ADDR + logo_addroffset, LogoReadsize);
+ logo_addroffset += LogoReadsize;
+ if (logo_addroffset >= LOGO_MAX_SIZE_TFT35)
+ logo_addroffset = 0;
+ }
+
+ uint32_t default_view_addroffset = 0;
+ void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize) {
+ W25QXX.init(SPI_QUARTER_SPEED);
+
+ W25QXX.SPI_FLASH_BufferRead(default_view_Rbuff, DEFAULT_VIEW_ADDR_TFT35 + default_view_addroffset + 4, default_view_Readsize);
+ default_view_addroffset += default_view_Readsize;
+ if (default_view_addroffset >= DEFAULT_VIEW_MAX_SIZE)
+ default_view_addroffset = 0;
+
+ }
+
+ uint32_t flash_view_addroffset = 0;
+ void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize) {
+ W25QXX.init(SPI_QUARTER_SPEED);
+
+ W25QXX.SPI_FLASH_BufferRead(flash_view_Rbuff, BAK_VIEW_ADDR_TFT35 + flash_view_addroffset, flash_view_Readsize);
+ flash_view_addroffset += flash_view_Readsize;
+ if (flash_view_addroffset >= FLASH_VIEW_MAX_SIZE)
+ flash_view_addroffset = 0;
+
+ }
+
+#endif
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h
new file mode 100644
index 0000000000..b307cc8dba
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h
@@ -0,0 +1,120 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+#include
+#include
+#include "lvgl.h"
+
+#if 1
+
+ #define PIC_MAX_CN 100 // Maximum number of pictures
+ #define PIC_NAME_MAX_LEN 50 // Picture name maximum length
+
+ #define LOGO_MAX_SIZE_TFT35 (300*1024)
+ #define LOGO_MAX_SIZE_TFT32 (150*1024)
+ #define TITLELOGO_MAX_SIZE (150*1024) // Little logo maximum
+ #define DEFAULT_VIEW_MAX_SIZE (200*200*2)
+ #define FLASH_VIEW_MAX_SIZE (200*200*2)
+
+ #define PER_PIC_MAX_SPACE_TFT35 (32*1024)
+ #define PER_PIC_MAX_SPACE_TFT32 (16*1024)
+ #define PER_FONT_MAX_SPACE (16*1024)
+
+ //pic
+ //Robin_pro pic addr
+ #define PIC_NAME_ADDR 0x003000 // Pic information addr
+ #define PIC_SIZE_ADDR 0x007000 // Pic size information addr
+ #define PIC_COUNTER_ADDR 0x008000 // Pic total number
+ #define PER_PIC_SAVE_ADDR 0x009000 // Storage address of each picture
+ #define PIC_LOGO_ADDR 0x00A000 // Logo addr
+ //#define PIC_DATA_ADDR 0x02F000 //
+
+ // TFT35
+ #define DEFAULT_VIEW_ADDR_TFT35 0XC5800
+ #define BAK_VIEW_ADDR_TFT35 (DEFAULT_VIEW_ADDR_TFT35+90*1024)
+ #define PIC_ICON_LOGO_ADDR_TFT35 (BAK_VIEW_ADDR_TFT35+80*1024)
+ #define PIC_DATA_ADDR_TFT35 (PIC_ICON_LOGO_ADDR_TFT35+350*1024)//0XC5800
+
+ // TFT32
+ #define PIC_DATA_ADDR_TFT32 0x02F000
+ #define PIC_ICON_LOGO_ADDR_TFT32 0x5D8000
+ #define PIC_OTHER_SIZE_ADDR_TFT32 0x5EE000
+
+ // font
+ #define FONTINFOADDR 0x600000 // 6M -- font addr
+ #define UNIGBK_FLASH_ADDR (FONTINFOADDR+4096) // 4*1024
+ #define GBK_FLASH_ADDR (UNIGBK_FLASH_ADDR+180224) // 176*1024
+
+ // Flash flag
+ #define FLASH_INF_VALID_FLAG 0xAA558761
+ // SD card information first addr
+ #define VAR_INF_ADDR 0x000000
+
+ union union32 {
+ uint8_t bytes[4];
+ uint32_t dwords;
+ };
+
+ // pic information
+ struct pic_msg {
+ uint8_t name[PIC_NAME_MAX_LEN];
+ union union32 size;
+ };
+
+ typedef struct pic_msg PIC_MSG;
+
+ #define BMP_WRITE_BUF_LEN 512
+
+ #define PICINFOADDR 0
+
+ #define PIC_SIZE_xM 6
+ #define FONT_SIZE_xM 2
+
+ //extern void PicMsg_Init(void);
+ extern void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff);
+ //extern void bindBmpFileData(const uint8_t **pBuf, uint8_t *pName);
+ //extern void Pic_Logo_Read(uint8_t *LogoName,uint8_t *Logo_Rbuff,uint32_t LogoReadsize);
+ //extern void default_view_Read(uint8_t *default_view_Rbuff,uint32_t default_view_Readsize);
+ //extern void flash_view_Read(uint8_t *flash_view_Rbuff,uint32_t flash_view_Readsize);
+
+ //extern void lv_Pic_Read(uint8_t *Pname,uint8_t *P_Rbuff,uint32_t addr,uint32_t size);
+ extern void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size);
+
+#endif
+
+extern uint32_t lv_get_pic_addr(uint8_t *Pname);
+
+extern void get_spi_flash_data(const char *rec_buf, int offset, int size);
+//extern void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead);
+
+extern void spi_flash_read_test();
+extern void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize);
+extern void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize);
+
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp
new file mode 100644
index 0000000000..584a009bad
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.cpp
@@ -0,0 +1,218 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+ #include "../../../../MarlinCore.h"
+
+ #include "lv_conf.h"
+ #include "draw_ui.h"
+ #include "../../../../module/temperature.h"
+ #include "../../../../module/motion.h"
+ #include "../../../../sd/cardreader.h"
+ #include "../../../../gcode/queue.h"
+
+ #if ENABLED(POWER_LOSS_RECOVERY)
+ #include "../../../../feature/powerloss.h"
+ #endif
+
+ #include "../../../../gcode/gcode.h"
+ #include "../../../../module/planner.h"
+
+ extern uint32_t To_pre_view;
+ extern uint8_t flash_preview_begin, default_preview_flg, gcode_preview_over;
+
+ void printer_state_polling() {
+ if (uiCfg.print_state == PAUSING) {
+ #if ENABLED(SDSUPPORT)
+ if (!planner.has_blocks_queued() && card.getIndex() > MIN_FILE_PRINTED) //���� �ļ��� M109��M190ָ��
+ uiCfg.waitEndMoves++;
+
+ if (uiCfg.waitEndMoves > 20) {
+ uiCfg.waitEndMoves = 0;
+ planner.synchronize();
+ gcode.process_subcommands_now_P(PSTR("M25"));
+ gcode.process_subcommands_now_P(PSTR("G91"));
+ gcode.process_subcommands_now_P(PSTR("G1 Z5"));
+ gcode.process_subcommands_now_P(PSTR("G90"));
+
+ uiCfg.print_state = PAUSED;
+
+ //#if ENABLED(POWER_LOSS_RECOVERY)
+ // if (recovery.enabled) recovery.save(true);
+ //#endif
+ gCfgItems.pause_reprint = 1;
+ update_spi_flash();
+ }
+ #endif
+ }
+ else {
+ uiCfg.waitEndMoves = 0;
+ }
+
+ if (uiCfg.print_state == PAUSED) {
+
+ }
+
+ if (uiCfg.print_state == RESUMING) {
+ if (IS_SD_PAUSED()) {
+ gcode.process_subcommands_now_P(PSTR("G91"));
+ gcode.process_subcommands_now_P(PSTR("G1 Z-5"));
+ gcode.process_subcommands_now_P(PSTR("G90"));
+ gcode.process_subcommands_now_P(PSTR("M24"));
+ uiCfg.print_state = WORKING;
+ start_print_time();
+
+ gCfgItems.pause_reprint = 0;
+ update_spi_flash();
+ }
+ }
+ #if ENABLED(POWER_LOSS_RECOVERY)
+ if (uiCfg.print_state == REPRINTED) {
+ memset(public_buf_m, 0, sizeof(public_buf_m));
+ #if HOTENDS
+ HOTEND_LOOP() {
+ const int16_t et = recovery.info.target_temperature[e];
+ if (et) {
+ #if HOTENDS > 1
+ sprintf_P(public_buf_m, PSTR("T%i"), e);
+ gcode.process_subcommands_now(public_buf_m);
+ #endif
+ sprintf_P(public_buf_m, PSTR("M109 S%i"), et);
+ gcode.process_subcommands_now(public_buf_m);
+ }
+ }
+ #endif
+
+ if (gCfgItems.pause_reprint == 1) {
+ gcode.process_subcommands_now_P(PSTR("G91"));
+ gcode.process_subcommands_now_P(PSTR("G1 Z-5"));
+ gcode.process_subcommands_now_P(PSTR("G90"));
+ }
+ recovery.resume();
+
+ uiCfg.print_state = WORKING;
+ start_print_time();
+
+ gCfgItems.pause_reprint = 0;
+ update_spi_flash();
+ }
+ #endif
+
+ if (uiCfg.print_state == WORKING)
+ filament_check();
+ }
+
+ void filament_pin_setup() {
+ #if PIN_EXISTS(MT_DET_1)
+ pinMode(MT_DET_1_PIN, INPUT_PULLUP);
+ #endif
+ #if PIN_EXISTS(MT_DET_2)
+ pinMode(MT_DET_2_PIN, INPUT_PULLUP);
+ #endif
+ #if PIN_EXISTS(MT_DET_3)
+ pinMode(MT_DET_3_PIN, INPUT_PULLUP);
+ #endif
+ }
+
+ void filament_check() {
+ const int FIL_DELAY = 20;
+ #if PIN_EXISTS(MT_DET_1)
+ static int fil_det_count_1 = 0;
+ if (!READ(MT_DET_1_PIN) && !MT_DET_PIN_INVERTING)
+ fil_det_count_1++;
+ else if (READ(MT_DET_1_PIN) && MT_DET_PIN_INVERTING)
+ fil_det_count_1++;
+ else if (fil_det_count_1 > 0)
+ fil_det_count_1--;
+
+ if (!READ(MT_DET_1_PIN) && !MT_DET_PIN_INVERTING)
+ fil_det_count_1++;
+ else if (READ(MT_DET_1_PIN) && MT_DET_PIN_INVERTING)
+ fil_det_count_1++;
+ else if (fil_det_count_1 > 0)
+ fil_det_count_1--;
+ #endif
+
+ #if PIN_EXISTS(MT_DET_2)
+ static int fil_det_count_2 = 0;
+ if (!READ(MT_DET_2_PIN) && !MT_DET_PIN_INVERTING)
+ fil_det_count_2++;
+ else if (READ(MT_DET_2_PIN) && MT_DET_PIN_INVERTING)
+ fil_det_count_2++;
+ else if (fil_det_count_2 > 0)
+ fil_det_count_2--;
+
+ if (!READ(MT_DET_2_PIN) && !MT_DET_PIN_INVERTING)
+ fil_det_count_2++;
+ else if (READ(MT_DET_2_PIN) && MT_DET_PIN_INVERTING)
+ fil_det_count_2++;
+ else if (fil_det_count_2 > 0)
+ fil_det_count_2--;
+ #endif
+
+ #if PIN_EXISTS(MT_DET_3)
+ static int fil_det_count_3 = 0;
+ if (!READ(MT_DET_3_PIN) && !MT_DET_PIN_INVERTING)
+ fil_det_count_3++;
+ else if (READ(MT_DET_3_PIN) && MT_DET_PIN_INVERTING)
+ fil_det_count_3++;
+ else if (fil_det_count_3 > 0)
+ fil_det_count_3--;
+
+ if (!READ(MT_DET_3_PIN) && !MT_DET_PIN_INVERTING)
+ fil_det_count_3++;
+ else if (READ(MT_DET_3_PIN) && MT_DET_PIN_INVERTING)
+ fil_det_count_3++;
+ else if (fil_det_count_3 > 0)
+ fil_det_count_3--;
+ #endif
+
+ if (
+ #if PIN_EXISTS(MT_DET_1)
+ fil_det_count_1 >= FIL_DELAY
+ #else
+ false
+ #endif
+ #if PIN_EXISTS(MT_DET_2)
+ || fil_det_count_2 >= FIL_DELAY
+ #endif
+ #if PIN_EXISTS(MT_DET_3)
+ || fil_det_count_3 >= FIL_DELAY
+ #endif
+ ) {
+ clear_cur_ui();
+ card.pauseSDPrint();
+ stop_print_time();
+ uiCfg.print_state = PAUSING;
+
+ if (gCfgItems.from_flash_pic == 1)
+ flash_preview_begin = 1;
+ else
+ default_preview_flg = 1;
+
+ lv_draw_printing();
+ }
+ }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.h b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.h
new file mode 100644
index 0000000000..7235188634
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_opration.h
@@ -0,0 +1,36 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+#define MIN_FILE_PRINTED 100 //5000
+
+extern void printer_state_polling();
+extern void filament_pin_setup();
+extern void filament_check();
+
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h
new file mode 100644
index 0000000000..038f5f4740
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h
@@ -0,0 +1,718 @@
+/**
+ * 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
+
+//****************英文***************************//
+#define MACHINE_CONFIG_EN "Machine\nSettings"
+
+#define NEXT_EN "Next"
+#define PREVIOUS_EN "Previous"
+#define DEFAULT_EN "Default"
+#define KEY_BACK_EN "Del"
+#define KEY_REST_EN "Rest"
+#define KEY_CONFIRM_EN "Confirm"
+
+#define KEYBOARD_KEY0_EN "0"
+#define KEYBOARD_KEY1_EN "1"
+#define KEYBOARD_KEY2_EN "2"
+#define KEYBOARD_KEY3_EN "3"
+#define KEYBOARD_KEY4_EN "4"
+#define KEYBOARD_KEY5_EN "5"
+#define KEYBOARD_KEY6_EN "6"
+#define KEYBOARD_KEY7_EN "7"
+#define KEYBOARD_KEY8_EN "8"
+#define KEYBOARD_KEY9_EN "9"
+#define KEYBOARD_KEY_POINT_EN "."
+#define KEYBOARD_KEY_NEGATIVE_EN "-"
+
+#define MACHINE_PARA_EN "Machine\nsettings"
+#define MACHINE_PARA_TITLE_EN "Machine settings"
+#define MACHINE_TYPE_CNOFIG_EN "Machine"
+#define TEMPERATURE_CONFIG_EN "Temperature"
+#define MOTOR_CONFIG_EN "Motor"
+#define ADVANCE_CONFIG_EN "Adavance"
+
+#define MACHINE_CONFIG_TITLE_EN "Machine Settings"
+#define MACHINE_TYPE_EN "Machine type"
+#define MACHINE_STROKE_EN "Machine Size"
+#define MACHINE_HOMEDIR_EN "Home direction"
+#define MACHINE_ENDSTOP_TYPE_EN "Endstop type"
+#define MACHINE_FILAMENT_CONFIG_EN "Filament settings"
+#define MACHINE_LEVELING_CONFIG_EN "Leveling settings"
+
+#define MACHINE_TYPE_CONFIG_TITLE_EN "Machine Settings>Machine type"
+#define MACHINE_TYPE_XYZ_EN "XYZ Machine"
+#define MACHINE_TYPE_DELTA_EN "Delta Machine"
+#define MACHINE_TYPE_COREXY_EN "Corexy Machine"
+
+#define MACHINE_STROKE_CONF_TITLE_EN "Machine Settings>Machine Size"
+#define X_MAX_LENGTH_EN "X-axis maximum stroke"
+#define Y_MAX_LENGTH_EN "Y-axis maximum stroke"
+#define Z_MAX_LENGTH_EN "Z-axis maximum stroke"
+
+#define X_MIN_LENGTH_EN "X-axis minimum stroke"
+#define Y_MIN_LENGTH_EN "Y-axis minimum stroke"
+#define Z_MIN_LENGTH_EN "Z-axis minimum stroke"
+
+#define HOME_DIR_CONF_TITLE_EN "Machine Settings>Home direction"
+#define HOME_DIR_X_EN "X-axis home direction"
+#define HOME_DIR_Y_EN "Y-axis home direction"
+#define HOME_DIR_Z_EN "Z-axis home direction"
+#define HOME_MIN_EN "MIN"
+#define HOME_MAX_EN "MAX"
+
+#define ENDSTOP_CONF_TITLE_EN "Machine Settings>Endstop type"
+#define MIN_ENDSTOP_X_EN "X-axis minimum Endstop"
+#define MIN_ENDSTOP_Y_EN "Y-axis minimum Endstop"
+#define MIN_ENDSTOP_Z_EN "Z-axis minimum Endstop"
+#define MAX_ENDSTOP_X_EN "X axis maximum Endstop"
+#define MAX_ENDSTOP_Y_EN "Y axis maximum Endstop"
+#define MAX_ENDSTOP_Z_EN "Z axis maximum Endstop"
+#define ENDSTOP_FIL_EN "Filament sensor"
+#define ENDSTOP_LEVEL_EN "Leveling sensor"
+#define ENDSTOP_OPENED_EN "Open"
+#define ENDSTOP_CLOSED_EN "Close"
+
+#define FILAMENT_CONF_TITLE_EN "Filament settings"
+#define FILAMENT_IN_TEMPERATURE_EN "Load temperature"
+#define FILAMENT_IN_LENGTH_EN "Load length"
+#define FILAMENT_IN_SPEED_EN "Load speed"
+#define FILAMENT_OUT_TEMPERATURE_EN "Unload temperature"
+#define FILAMENT_OUT_LENGTH_EN "Unload length"
+#define FILAMENT_OUT_SPEED_EN "Unload speed"
+
+#define LEVELING_CONF_TITLE_EN "Leveling settings"
+#define LEVELING_PARA_CONF_EN "Leveling settings"
+#define LEVELING_DELTA_EN "delta machine leveling"
+#define LEVELING_XYZ_EN "Manual leveling coordinate settings"
+
+#define LEVELING_PARA_CONF_TITLE_EN "leveling setting"
+#define AUTO_LEVELING_ENABLE_EN "Enable auto leveling"
+#define BLTOUCH_LEVELING_ENABLE_EN "Enable BLtouch"
+#define PROBE_PORT_EN "Probe connector"
+#define PROBE_X_OFFSET_EN "Probe x axis offset"
+#define PROBE_Y_OFFSET_EN "Probe y axis offset"
+#define PROBE_Z_OFFSET_EN "Probe z axis offset"
+#define PROBE_XY_SPEED_EN "Probe xy axis speed"
+#define PROBE_Z_SPEED_EN "Probe z axis speed"
+#define ENABLE_EN "YES"
+#define DISABLE_EN "NO"
+#define Z_MIN_EN "ZMin"
+#define Z_MAX_EN "ZMax"
+
+#define DELTA_LEVEL_CONF_TITLE_EN "Delta Machine settings"
+#define DELTA_LEVEL_CONF_EN "Delta Machine Leveling"
+#define DELTA_MACHINE_RADIUS_EN "Machine Radius"
+#define DELTA_DIAGONAL_ROD_EN "Machine rod length"
+#define DELTA_PRINT_RADIUS_EN "Print radius"
+#define DELTA_HEIGHT_EN "Print height"
+#define SMOOTH_ROD_OFFSET_EN "Slider offset"
+#define EFFECTOR_OFFSET_EN "Effector offset"
+#define CALIBRATION_RADIUS_EN "Leveling radius"
+
+#define XYZ_LEVEL_CONF_TITLE_EN "Cartesian Machine Settings"
+#define PROBE_REACH_MAX_LEFT_EN "Probe reaches leftmost position"
+#define PROBE_REACH_MAX_RIGHT_EN "Probe reaches rightmost position"
+#define PROBE_REACH_MAX_FRONT_EN "Probe reaches front position"
+#define PROBE_REACH_MAX_BACK_EN "Probe reaches final position"
+
+#define TEMPERATURE_CONF_TITLE_EN "Machine Settings>Temperature settings"
+#define NOZZLE_CONF_EN "Nozzle settings"
+#define HOTBED_CONF_EN "Hotbed settings"
+#define PREHEAT_TEMPER_EN "Preset temperature"
+
+#define NOZZLE_CONF_TITLE_EN "Machine Settings>Nozzle settings"
+#define NOZZLECNT_EN "Number of nozzles"
+#define NOZZLE_TYPE_EN "E0 Temperature type"
+#define NOZZLE_ADJUST_TYPE_EN "PID thermostat"
+#define NOZZLE_MIN_TEMPERATURE_EN "lowest temperature"
+#define NOZZLE_MAX_TEMPERATURE_EN "Maximum temperature"
+#define EXTRUD_MIN_TEMPER_EN "Minimum extrusion temperature"
+
+#define HOTBED_CONF_TITLE_EN "Machine Settings>Hotbed settings"
+#define HOTBED_ADJUST_EN "PID thermostat"
+#define HOTBED_MIN_TEMPERATURE_EN "lowest temperature"
+#define HOTBED_MAX_TEMPERATURE_EN "Maximum temperature"
+
+#define MOTOR_CONF_TITLE_EN "Machine Settings>Motor settings"
+#define MAXFEEDRATE_CONF_EN "Maximum speed settings"
+#define ACCELERATION_CONF_EN "Acceleration settings"
+#define JERKCONF_EN "Jerk settings"
+#define STEPSCONF_EN "Steps settings"
+#define MOTORDIRCONF_EN "Motor direction settings"
+#define HOMEFEEDRATECONF_EN "Home speed setting"
+
+#define MAXFEEDRATE_CONF_TITLE_EN "Machine Settings>Maximum speed"
+#define X_MAXFEEDRATE_EN "X axis maximum speed"
+#define Y_MAXFEEDRATE_EN "Y axis maximum speed"
+#define Z_MAXFEEDRATE_EN "Z axis maximum speed"
+#define E0_MAXFEEDRATE_EN "E0 axis maximum speed"
+#define E1_MAXFEEDRATE_EN "E1 axis maximum speed"
+
+#define ACCELERATION_CONF_TITLE_EN "Machine Settings>Acceleration"
+#define PRINT_ACCELERATION_EN "Print acceleration"
+#define RETRACT_ACCELERATION_EN "Retraction acceleration"
+#define TRAVEL_ACCELERATION_EN "Travel acceleration"
+#define X_ACCELERATION_EN "X-axis acceleration"
+#define Y_ACCELERATION_EN "Y-axis acceleration"
+#define Z_ACCELERATION_EN "Z-axis acceleration"
+#define E0_ACCELERATION_EN "E0-axis acceleration"
+#define E1_ACCELERATION_EN "E1-axis acceleration"
+
+#define JERK_CONF_TITLE_EN "Machine Settings>Jerk speed"
+#define X_JERK_EN "X-axis jerk speed"
+#define Y_JERK_EN "Y-axis jerk speed"
+#define Z_JERK_EN "J-axis jerk speed"
+#define E_JERK_EN "E-axis jerk speed"
+
+#define STEPS_CONF_TITLE_EN "Machine Settings>Steps settings"
+#define X_STEPS_EN "X-axis steps"
+#define Y_STEPS_EN "Y-axis stepS"
+#define Z_STEPS_EN "Z-axis stepS"
+#define E0_STEPS_EN "E0-axis steps"
+#define E1_STEPS_EN "E1-axis steps"
+
+#define MOTORDIR_CONF_TITLE_EN "Machine Settings>Motor direction"
+#define X_MOTORDIR_EN "X-axis motor direction invert"
+#define Y_MOTORDIR_EN "Y-axis motor direction invert"
+#define Z_MOTORDIR_EN "Z-axis motor direction invert"
+#define E0_MOTORDIR_EN "E0-axis motor direction invert"
+#define E1_MOTORDIR_EN "E1-axis motor direction invert"
+#define INVERT_P_EN "YES"
+#define INVERT_N_EN "NO"
+
+#define HOMEFEEDRATE_CONF_TITLE_EN "Machine Settings>Home speed"
+#define X_HOMESPEED_EN "XY-axis Home speed"
+#define Y_HOMESPEED_EN "Y-axis Home speed"
+#define Z_HOMESPEED_EN "Z-axis Home speed"
+
+#define ADVANCED_CONF_TITLE_EN "Machine Settings>Advance"
+#define PWROFF_DECTION_EN "power off dection module"
+#define PWROFF_AFTER_PRINT_EN "Auto Shutdown after print"
+#define HAVE_UPS_EN "Has UPS power supply"
+#define Z2_AND_Z2ENDSTOP_CONF_EN "Z2 Settings"
+#define ENABLE_PINS_CONF_EN "Enable pins level settings"
+
+#define Z2_AND_Z2ENDSTOP_CONF_TITLE_EN "Z2 Settings"
+#define Z2_ENABLE_EN "Z2 Enable"
+#define Z2_ENDSTOP_EN "Z2_EndStop Enable"
+#define Z2_PORT_EN "Z2 Connector"
+
+#define ENABLE_PINS_CONF_TITLE_EN "ENABLE_PINS_LEVEL"
+#define X_ENABLE_PINS_INVERT_EN "X_ENABLE_PIN_INVERT"
+#define Y_ENABLE_PINS_INVERT_EN "Y_ENABLE_PIN_INVERT"
+#define Z_ENABLE_PINS_INVERT_EN "Z_ENABLE_PIN_INVERT"
+#define E_ENABLE_PINS_INVERT_EN "E_ENABLE_PIN_INVERT"
+
+#define TOOL_TEXT_EN "Tool"
+#define PREHEAT_TEXT_EN "Preheat"
+#define MOVE_TEXT_EN "Move"
+#define HOME_TEXT_EN "Home"
+#define PRINT_TEXT_EN "Printing"
+#define EXTRUDE_TEXT_EN "Extrusion"
+#define LEVELING_TEXT_EN "Leveling"
+#define AUTO_LEVELING_TEXT_EN "AutoLevel"
+#define SET_TEXT_EN "Settings"
+#define MORE_TEXT_EN "More"
+
+#define ADD_TEXT_EN "Add"
+#define DEC_TEXT_EN "Dec"
+#define EXTRUDER_1_TEXT_EN "Extrusion1"
+#define EXTRUDER_2_TEXT_EN "Extrusion2"
+#define HEATBED_TEXT_EN "HeatBed"
+#define TEXT_1C_EN "1℃"
+#define TEXT_5C_EN "5℃"
+#define TEXT_10C_EN "10℃"
+#define CLOSE_TEXT_EN "Close"
+
+#define BACK_TEXT_EN "Back"
+
+#define TOOL_PREHEAT_EN "Preheat"
+#define TOOL_EXTRUDE_EN "Extrusion"
+#define TOOL_MOVE_EN "Move"
+#define TOOL_HOME_EN "Home"
+#define TOOL_LEVELING_EN "Leveling"
+#define TOOL_AUTO_LEVELING_EN "AutoLevel"
+#define TOOL_FILAMENT_EN "Filament"
+#define TOOL_MORE_EN "More"
+
+#define AXIS_X_ADD_TEXT_EN "X+"
+#define AXIS_X_DEC_TEXT_EN "X-"
+#define AXIS_Y_ADD_TEXT_EN "Y+"
+#define AXIS_Y_DEC_TEXT_EN "Y-"
+#define AXIS_Z_ADD_TEXT_EN "Z+"
+#define AXIS_Z_DEC_TEXT_EN "Z-"
+#define TEXT_01MM_EN "0.1mm"
+#define TEXT_1MM_EN "1mm"
+#define TEXT_10MM_EN "10mm"
+
+#define HOME_X_TEXT_EN "X"
+#define HOME_Y_TEXT_EN "Y"
+#define HOME_Z_TEXT_EN "Z"
+#define HOME_ALL_TEXT_EN "Home"
+#define HOME_STOPMOVE_EN "Quickstop"
+
+#define PAGE_UP_TEXT_EN "Page up"
+#define PAGE_DOWN_TEXT_EN "Page down"
+
+#define EXTRUDER_IN_TEXT_EN "In"
+#define EXTRUDER_OUT_TEXT_EN "Out"
+#define EXTRUDE_1MM_TEXT_EN "1mm"
+#define EXTRUDE_5MM_TEXT_EN "5mm"
+#define EXTRUDE_10MM_TEXT_EN "10mm"
+#define EXTRUDE_LOW_SPEED_TEXT_EN "Low"
+#define EXTRUDE_MEDIUM_SPEED_TEXT_EN "Normal"
+#define EXTRUDE_HIGH_SPEED_TEXT_EN "High"
+
+#define LEVELING_POINT1_TEXT_EN "Point1"
+#define LEVELING_POINT2_TEXT_EN "Point2"
+#define LEVELING_POINT3_TEXT_EN "Point3"
+#define LEVELING_POINT4_TEXT_EN "Point4"
+#define LEVELING_POINT5_TEXT_EN "Point5"
+
+#define FILESYS_TEXT_EN "FileSys"
+#define WIFI_TEXT_EN "WiFi"
+#define FAN_TEXT_EN "Fan"
+#define ABOUT_TEXT_EN "About"
+#define BREAK_POINT_TEXT_EN "Continue"
+#define FILAMENT_TEXT_EN "Filament"
+#define LANGUAGE_TEXT_EN "Language"
+#define MOTOR_OFF_TEXT_EN "Motor-off"
+#define MOTOR_OFF_XY_TEXT_EN "Off-XY"
+#define SHUTDOWN_TEXT_EN "Shutdown"
+
+#define U_DISK_TEXT_EN "USB"
+#define SD_CARD_TEXT_EN "SD"
+#define WIFI_NAME_TEXT_EN "WiFi: "
+#define WIFI_KEY_TEXT_EN "Key: "
+#define WIFI_IP_TEXT_EN "IP: "
+#define WIFI_AP_TEXT_EN "State: AP"
+#define WIFI_STA_TEXT_EN "State: STA"
+#define WIFI_CONNECTED_TEXT_EN "Connected"
+#define WIFI_DISCONNECTED_TEXT_EN "Disconnected"
+#define WIFI_EXCEPTION_TEXT_EN "Exception"
+#define WIFI_RECONNECT_TEXT_EN "Reconnect"
+#define CLOUD_TEXT_EN "Cloud"
+#define CLOUD_BIND_EN "Bind"
+#define CLOUD_UNBIND_EN "Unbind"
+#define CLOUD_UNBINDING_EN "Unbinding"
+#define CLOUD_DISCONNECTED_EN "Disconnected"
+#define CLOUD_UNBINDED_EN "Unbinded"
+#define CLOUD_BINDED_EN "Binded"
+#define CLOUD_DISABLE_EN "Disable"
+
+#define FAN_ADD_TEXT_EN "Add"
+#define FAN_DEC_TEXT_EN "Dec"
+#define FAN_OPEN_TEXT_EN "100%"
+#define FAN_HALF_TEXT_EN "50%"
+#define FAN_CLOSE_TEXT_EN "Close"
+#define FAN_TIPS1_TEXT_EN "FAN"
+#define FAN_TIPS2_TEXT_EN "FAN\nClose"
+
+#define FILAMENT_IN_TEXT_EN "Load"
+#define FILAMENT_OUT_TEXT_EN "Unload"
+#define FILAMENT_EXT0_TEXT_EN "Extrusion1"
+#define FILAMENT_EXT1_TEXT_EN "Extrusion2"
+#define FILAMENT_HEAT_TEXT_EN "Preheat"
+#define FILAMENT_STOP_TEXT_EN "Stop"
+//#define FILAMENT_CHANGE_TEXT_EN "Filament replace"
+#define FILAMENT_TIPS2_TEXT_EN "T:"
+#define FILAMENT_TIPS3_TEXT_EN "Loading..."
+#define FILAMENT_TIPS4_TEXT_EN "Unloading..."
+#define FILAMENT_TIPS5_TEXT_EN "Temp is too low to go,please heat"
+#define FILAMENT_TIPS6_TEXT_EN "Completed"
+
+#if 0
+ #define FILAMENT_REPLAYS_IDLE_TEXT_EN "Please click or \nto replace filament!"
+ #define FILAMENT_CHANGE_TEXT_EN "Please click or ,\nAfter pinter pause."
+ #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN "Heating up the nozzle,please wait..."
+ #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN "Heating up the nozzle,please wait..."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN "Heat completed,please load filament to extruder,and click for start loading."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_EN "Please load filament to extruder,and click for start loading."
+ #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN "Heat completed,please click for start unloading.!"
+ #define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading ,please wait!"
+ #define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading,please wait!"
+ #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN "Load filament completed,click for return!"
+ #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN "Unload filament completed,click for return!"
+#endif
+
+
+#define FILAMENT_CHANGE_TEXT_EN "Please click \nor ,After \npinter pause."
+#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN "Heating up the nozzle,\nplease wait..."
+#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN "Heating up the nozzle,\nplease wait..."
+#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN "Heat completed,please load filament \nto extruder,and click \nfor start loading."
+#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_EN "Please load filament to extruder,\nand click for start loading."
+#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN "Heat completed,please \nclick for start unloading.!"
+#define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading ,please wait!"
+#define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading,please wait!"
+#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN "Load filament completed,\nclick for return!"
+#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN "Unload filament completed,\nclick for return!"
+
+
+#define PRE_HEAT_EXT_TEXT_EN "E"
+#define PRE_HEAT_BED_TEXT_EN "Bed"
+
+#define FILE_LOADING_EN "Loading......"
+#if 0
+ #define NO_FILE_AND_CHECK_EN "No files found!Please insert SD card or U disk!"
+#else
+ #define NO_FILE_AND_CHECK_EN " No files found!\n Check the file system configuration!"
+#endif
+
+#define NO_FILE_EN "No files found!"
+
+#define EXTRUDER_TEMP_TEXT_EN "Temper"
+#define EXTRUDER_E_LENGTH1_TEXT_EN "Extrusion1"
+#define EXTRUDER_E_LENGTH2_TEXT_EN "Extrusion2"
+#define EXTRUDER_E_LENGTH3_TEXT_EN "Extrusion3"
+
+#define ABOUT_TYPE_TEXT_EN "Type: "
+#define ABOUT_VERSION_TEXT_EN "Firmware: "
+#define ABOUT_WIFI_TEXT_EN "WiFi: "
+
+#define PRINTING_OPERATION_EN "Option"
+#define PRINTING_PAUSE_EN "Pause"
+#define PRINTING_TEMP_EN "Temp."
+#define PRINTING_CHANGESPEED_EN "Speed"
+#define PRINTING_RESUME_EN "Resume"
+#define PRINTING_STOP_EN "Stop"
+#define PRINTING_MORE_EN "More"
+#define PRINTING_EXTRUDER_EN "Extrusion"
+#define PRINTING_MOVE_EN "Move"
+
+#define EXTRUDER_SPEED_EN "Extrusion"
+#define MOVE_SPEED_EN "Move"
+#define EXTRUDER_SPEED_STATE_EN "Extrude Speed"
+#define MOVE_SPEED_STATE_EN "Move Speed"
+#define STEP_1PERCENT_EN "1%"
+#define STEP_5PERCENT_EN "5%"
+#define STEP_10PERCENT_EN "10%"
+
+#define ZOFFSET_EN "Z Offset"
+#define ZOFFSET_INC_EN "Add"
+#define ZOFFSET_DEC_EN "Dec"
+
+#define TITLE_READYPRINT_EN "ReadyPrint"
+#define TITLE_PREHEAT_EN "Preheat"
+#define TITLE_MOVE_EN "Move"
+#define TITLE_HOME_EN "Home"
+#define TITLE_EXTRUDE_EN "Extrusion"
+#define TITLE_LEVELING_EN "Leveling"
+#define TITLE_SET_EN "Settings"
+#define TITLE_MORE_EN "More"
+#define TITLE_CHOOSEFILE_EN "ChooseFile"
+#define TITLE_PRINTING_EN "Printing"
+#define TITLE_OPERATION_EN "Operation"
+#define TITLE_ADJUST_EN "Adjust"
+#define TITLE_WIRELESS_EN "Wireless"
+#define TITLE_FILAMENT_EN "Filament"
+#define TITLE_ABOUT_EN "About"
+#define TITLE_FAN_EN "Fan"
+#define TITLE_LANGUAGE_EN "Language"
+#define TITLE_PAUSE_EN "Pause"
+#define TITLE_CHANGESPEED_EN "Speed"
+#define TITLE_CLOUD_TEXT_EN "Cloud"
+#define TITLE_DIALOG_CONFIRM_EN "Confirm"
+#define TITLE_FILESYS_EN "FileSys"
+#define TITLE_ZOFFSET_EN "Z Offset"
+
+#define AUTO_SHUTDOWN_EN "Auto"
+#define MANUAL_SHUTDOWN_EN "Manual"
+
+#define DIALOG_CONFIRM_EN "Confirm"
+#define DIALOG_CANCLE_EN "Cancel"
+#define DIALOG_OK_EN "OK"
+#define DIALOG_RESET_EN "Reset"
+#define DIALOG_RETRY_EN "Retry"
+#define DIALOG_DISABLE_EN "Disable"
+#define DIALOG_PRINT_MODEL_EN "Print this model?"
+#define DIALOG_CANCEL_PRINT_EN "Stop print?"
+#define DIALOG_RETRY_EN "Retry"
+#define DIALOG_STOP_EN "Stop"
+#define DIALOG_REPRINT_FROM_BREAKPOINT_EN "Reprint from breakpoint?"
+//#define DIALOG_UNBIND_PRINTER_EN "Unbind the printer?"
+#define DIALOG_ERROR_TIPS1_EN "Error:no file,please check it again."
+#define DIALOG_ERROR_TIPS2_EN "Error:transaction failed.please check display baudrate \nwhether as the same as mainboard!"
+#define DIALOG_ERROR_TIPS3_EN "Error:file name or path is too long!"
+#define DIALOG_CLOSE_MACHINE_EN "Closing machine......"
+#define DIALOG_UNBIND_PRINTER_EN "Unbind the printer?"
+#define DIALOG_FILAMENT_NO_PRESS_EN "Filament detection switch is not pressed"
+#define DIALOG_PRINT_FINISH_EN "Done print!"
+#define DIALOG_PRINT_TIME_EN "Print time: "
+#define DIALOG_REPRINT_EN "Print again"
+#define DIALOG_WIFI_ENABLE_TIPS_EN "The wifi module is being configured\nplease wait a moment....."
+
+#define HOTBED_ENABLE_EN "Enable heatbed"
+#define MOTOR_EN_HIGH_LEVEL_EN "High"
+#define MOTOR_EN_LOW_LEVEL_EN "Low"
+
+#define TEXT_WIFI_MENU_TITLE_EN "WI-FI"
+#define TEXT_WIFI_SAPCE_EN "space"
+#define TEXT_WIFI_LETTER_EN "abc"
+#define TEXT_WIFI_DIGITAL_EN "123"
+#define TEXT_WIFI_SYMBOL_EN "#+="
+#define TEXT_WIFI_PASSWORD_EN "Password"
+
+#define TEXT_WIFI_POINT_BOLD_EN "`"
+
+#define TEXT_WIFI_JOINING_EN "Joining\nNetwork..."
+#define TEXT_WIFI_FAILED_JOIN_EN "Failed to\nJoin Wi-Fi"
+#define TEXT_WIFI_WIFI_CONECTED_EN "Wi-Fi\nConnected"
+
+#define TEXT_BUTTON_DISCONECTED_EN "Disconnect"
+#define TEXT_WIFI_FORGET_EN "Forget Network"
+#define TEXT_DISCONECTED_EN "Wi-Fi Connected"
+
+//wifi-list
+#define MAIN_BUILT_EN "Build"
+#define MAIN_FILAMENT_EN "Filament"
+#define MAIN_SETUP_EN "Setup"
+#define MAIN_ABOUT_EN "About"
+#define MAIN_MENU_EN "Menu"
+#define FILE_MENU_BUILD_EN "Build"
+#define FILE_MENU_MENU_EN " < Menu"
+
+//about
+#define ABOUT_TITLE_EN "About"
+#define ABOUT_BUILT_MACHINES_EN "Built Machines"
+#define ABOUT_SPARK_EN "Spark"
+#define ABOUT_VERSION_EN "Version 1.1.0"
+#define ABOUT_SERIAL_NUMBER_EN "Serial Number:"
+#define ABOUT_S_NUMBER_EN "DCPLX02KFC6P"
+
+//set
+#define SETUP_TITLE_EN "Setup"
+#define SETUP_WIFI_EN "Wi-Fi"
+#define SETUP_MANUAL_IP_EN "Manual IP"
+#define SETUP_WIFI_NOT_CONNECTED_EN "Not Connected"
+#define SETUP_WIFI_NETWORK_EN "WiFi_Network"
+
+//build
+#define BUILD_TITLE_EN "Build"
+#define BUILD_SD_CARD_EN "SD Card"
+#define BUILD_USB_DRIVE_EN "USB Drive"
+
+//SD card
+#define SD_CARD_TITLE_EN "SD Card"
+#define SD_CARD_BACK_EN "< Back"
+//USB Drive
+#define USB_DRIVE_TITLE_EN "USB Drive"
+#define USB_DRIVE_BACK_EN "< Back"
+#define FILE_PAGES_EN "%d/%d"
+#define FILE_NEXT_PAGE_EN "Next Page"
+
+//BUILD PLATE
+#define PLATE_TITLE_EN "Build Plate"
+#define PLATE_BACK_EN "< Back"
+#define PLATE_CONFIRM_EN "Confirm >"
+#define PLATE_TIPS_EN "Confirm that there is a Clear\nBuild Plate installed in the\nmachine."
+
+//build model
+#define MODEL_TITLE_EN "Build Model"
+#define MODEL_START_BUILD_EN "Start Build"
+#define MODEL_BACK_EN "< Back"
+
+//building
+#define BUILDING_TITLE_EN "Building"
+#define BUILDING_MENU_EN "Build Menu"
+#define BUILDING_COMPLETED "Build\nComplete"
+
+//building menu
+#define BUILDING_MENU_TITLE_EN "Build Menu"
+#define BUILDING_MENU_SETTINGS_EN "Build Settings"
+#define BUILDING_MENU_PAUSE_EN "Pause Build"
+#define BUILDING_MENU_CANCEL_EN "Cancel Build"
+#define BUILDING_MENU_BACK_EN "< Back"
+
+//build settings
+#define SETTINGS_TITLE_EN "Build Settings"
+#define SETTINGS_NOZZLE_TEMPER_EN "Nozzle Temp:"
+#define SETTINGS_NOZZLE_VALUE_EN "%d"
+#define SETTINGS_BED_TEMPER_EN "Bed Temp:"
+#define SETTINGS_BED_VALUE_EN "%d"
+#define SETTINGS_BUILD_SPEED_EN "Build Speed:"
+#define SETTINGS_SPEED_VALUE_EN "Standard"
+#define SETTINGS_BACK_EN "< Back"
+
+//build paused
+#define PAUSED_TITLE_EN "Build Paused"
+#define PAUSED_RESUME_EN "Resume Build"
+#define PAUSED_CANCEL_EN "Cancel Build"
+#define PAUSED_BACK_EN "< Back"
+
+//build cancel
+#define CANCEL_TITLE_EN "Cancel Build"
+#define CANCEL_BUILD_EN "Cancel Build"
+#define CANCEL_TIPS_EN "Are you sure you want to\ncancel this build? The model\nwill be deleted from this\nmachine. It will need to be\nresent from your computer\nbefore it can be built in the\nfuture."
+#define CANCEL_BACK_EN "< Back"
+#define CANCEL_BUILD_DISPLAY_EN "Build\nCanceled"
+#define CANCEL_OVER_PLATE_TIPS_EN "Confirm that the Build Plate\nhas been removed from the\nmachine."
+
+//filament model enter
+#define FILAMENT_MODEL_ENTER_TITLE_EN "Model-PLA"
+#define FILAMENT_MODEL_ENTER_BACK_EN "< Back"
+#define FILAMENT_MODEL_ENTER_BEGIN_EN "Begin >"
+#define FILAMENT_MODEL_ENTER_TIPS_EN "The Model Filament spool\ncompartment is located on\nthe right side of the machine."
+
+//filament model PLA
+#define FILAMENT_MODEL_PLA_TITLE_EN "Model-PLA"
+#define FILAMENT_PLA_LOAD_TITLE_EN "Load Filament"
+#define FILAMENT_PLA_UNLOAD_TITLE_EN "Unload Filament"
+#define FILAMENT_MODEL_PLA_LOAD_EN "Load Filament"
+#define FILAMENT_MODEL_PLA_UNLOAD_EN "Unload Filament"
+//filament support enter
+#define FILAMENT_SUPPORT_ENTER_TITLE_EN "Support-PVA"
+#define FILAMENT_SUPPORT_ENTER_BACK_EN "< Back"
+#define FILAMENT_SUPPORT_ENTER_BEGIN_EN "Begin >"
+#define FILAMENT_SUPPORT_ENTER_TIPS_EN "The Support Filament spool\ncompartment is located on\nthe left side of the machine."
+//filament heating
+#define FILAMENT_HEATING_LOAD_TITLE_EN "Load Filament"
+#define FILAMENT_HEATING_UNLOAD_TITLE_EN "Unload Filament"
+#define FILAMENT_HEATING_CANCEL_EN "< Cancel"
+#define FILAMENT_HEATING_MATERIAL_EN "Material:"
+#define FILAMENT_HEATING_PLA_EN "Model-PLA"
+#define FILAMENT_HEATING_TIPS_EN "Print head is heating..."
+//rotate left
+#define ROTATE_LEFT_LOAD_TITLE_EN "Load Filament"
+#define ROTATE_LEFT_UNLOAD_TITLE_EN "Unload Filament"
+#define ROTATE_LEFT_CANCEL_EN "< Cancel"
+#define ROTATE_LEFT_MATERIAL_EN "Material:"
+#define ROTATE_LEFT_PLA_EN "Model-PLA"
+#define ROTATE_LEFT_NEXT_EN "Next >"
+#define ROTATE_LEFT_TIPS_EN "Rotate extruder selection\ndial to the left."
+
+//hang spool
+#define HANG_SPOOL_TITLE_EN "Load Filament"
+#define HANG_SPOOL_PREVIOUS_EN "< Previous"
+#define HANG_SPOOL_MATERIAL_EN "Material:"
+#define HANG_SPOOL_PLA_EN "Model-PLA"
+#define HANG_SPOOL_NEXT_EN "Next >"
+#define HANG_SPOOL_TIPS_EN "Hang the spool in the spool\ncompartment as shown."
+
+//feed filament
+#define FEED_FILAMENT_TITLE_EN "Load Filament"
+#define FEED_FILAMENT_PREVIOUS_EN "< Previous"
+#define FEED_FILAMENT_MATERIAL_EN "Material:"
+#define FEED_FILAMENT_PLA_EN "Model-PLA"
+#define FEED_FILAMENT_NEXT_EN "Next >"
+#define FEED_FILAMENT_TIPS_EN "Feed filament into extruder\nup beyond the gears."
+
+//feed filament
+#define ROTATE_UP_TITLE_EN "Load Filament"
+#define ROTATE_UP_PREVIOUS_EN "< Previous"
+#define ROTATE_UP_MATERIAL_EN "Material:"
+#define ROTATE_UP_PLA_EN "Model-PLA"
+#define ROTATE_UP_NEXT_EN "Next >"
+#define ROTATE_UP_TIPS_EN "Rotate extruder selection\ndial up."
+
+//filament begin
+#define FEED_BEGIN_TITLE_EN "Load Filament"
+#define FEED_BEGIN_MATERIAL_EN "Material:"
+#define FEED_BEGIN_PLA_EN "Model-PLA"
+#define FEED_BEGIN_NEXT_EN "Next >"
+#define FEED_BEGIN_TIPS_EN "Press Next when filament\nbegins to extrude."
+
+//filament finish
+#define FEED_FINISH_TITLE_EN "Load Filament"
+#define FEED_FINISH_MATERIAL_EN "Material:"
+#define FEED_FINISH_PLA_EN "Model-PLA"
+#define FEED_FINISH_NEXT_EN "Finish >"
+#define FEED_FINISH_TIPS_EN "Remove filament from the\nnozzle and discard."
+//fiament remove
+#define REMOVE_SPOOL_TITLE_EN "Unload Filament"
+#define REMOVE_SPOOL_PREVIOUS_EN "< Previous"
+#define REMOVE_SPOOL_FINISH_EN "Finish >"
+#define REMOVE_SPOOL_MATERIAL_EN "Material:"
+#define REMOVE_SPOOL_PLA_EN "Model-PLA"
+#define REMOVE_SPOOL_TIPS_EN "Remove the spool and pull\nfilament out of the machine."
+
+#define FILAMENT_SUPPORT_PVA_EN "Support-PVA"
+#define LOAD_FINISH_EN "Load\nFilament\nComplete"
+#define UNLOAD_FINISH_EN "Unload\nFilament\nComplete"
+
+//manual ip
+#define MANUAL_IP_TITLE_EN "Manual IP"
+#define MANUAL_IP_CANCEL_EN "< Cancel"
+#define MANUAL_IP_APPLY_EN "Join >"
+#define MANUAL_IP_ADDRESS_EN "IP Address"
+#define MANUAL_IP_MASK_EN "Subnet Mask"
+#define MANUAL_IP_GATEWAY_EN "Default Gateway"
+#define MANUAL_IP_SERVER_EN "Name Server"
+#define MANUAL_IP_INIT_DATA_EN "0.0.0.0"
+#define MANUAL_TEXT_POINT_EN "."
+#define MANUAL_TEXT_ENTER_EN "enter"
+
+//Wifi name
+//#define TEXT_WIFI_MENU_TITLE_EN "WI-FI"
+//#define TEXT_WIFI_SAPCE_EN "space"
+//#define TEXT_WIFI_LETTER_EN "abc"
+//#define TEXT_WIFI_DIGITAL_EN "123"
+//#define TEXT_WIFI_SYMBOL_EN "#+="
+//#define TEXT_WIFI_PASSWORD_EN "Password"
+
+//#define TEXT_WIFI_POINT_BOLD_EN "`"
+
+//#define TEXT_WIFI_JOINING_EN "Joining\nNetwork..."
+//#define TEXT_WIFI_FAILED_JOIN_EN "Failed to\nJoin Wi-Fi"
+//#define TEXT_WIFI_WIFI_CONECTED_EN "Wi-Fi\nConnected"
+
+//#define TEXT_BUTTON_DISCONECTED_EN "Disconnect"
+//#define TEXT_WIFI_FORGET_EN "Forget Network"
+//#define TEXT_DISCONECTED_EN "Wi-Fi Connected"
+
+#define TEXT_FORGET_TIPS_TITLE_EN "Forget Network"
+#define TEXT_FORGET_NETWORK_TIPS1_EN "Are you sure you want to\nforget this network?"
+#define TEXT_FORGET_NETWORK_TIPS2_EN "This machine will no longer\njoin this Wi-Fi Network."
+
+#define TEXT_IPADDRESS_EN "IP Address: "
+
+#define TEXT_BUILD_FROM_CURA_CANCEL_TIPS1_EN "Are you sure you want to\ncancel this build?"
+#define TEXT_BUILD_FROM_CURA_CANCEL_TIPS2_EN "The model will be deleted\nfrom this machine.It will\nneed to be resent from your\ncomputer before it can be\nbuilt in the future."
+
+#define DIALOG_CONFIRM_EN2 "Confirm"
+
+#define HEATING_TITLE_EN "Heating"
+#define LEVELING_TITLE_EN "Leveling"
+
+#define ABOUT_SPARK_ADD_EN "Spark+"
+
+#define TEXT_RECEIVING_DATA_EN "Receiving Data"
+
+#define TEXT_BABY_STEP_EN "Babystep"
+
+#define PRINTING_OTHER_LANGUGE "Printing"
+#define PRINTING_OPERATION_OTHER_LANGUGE "Operation"
+#define PRINTING_PAUSE_OTHER_LANGUGE "Pause"
+
+#define MESSEGE_PAUSING_EN "Parking..."
+#define MESSEGE_CHANGING_EN "Wait for filament change to start"
+#define MESSEGE_UNLOAD_EN "Wait for filament unload"
+#define MESSEGE_WAITING_EN "Press Button to resume print"
+#define MESSEGE_INSERT_EN "Insert filament and press button to continue"
+#define MESSEGE_LOAD_EN "Wait for filament load"
+#define MESSEGE_PURGE_EN "Wait for filament purge"
+#define MESSEGE_RESUME_EN "Wait for print to resume..."
+#define MESSEGE_HEAT_EN "Press button to heat nozzle"
+#define MESSEGE_HEATING_EN "Nozzle heating Please wait..."
+#define MESSEGE_OPTION_EN "Purge more or continue print?"
+#define MESSEGE_PURGE_MORE_EN "Purge"
+#define MESSEGE_CONTINUE_PRINT_EN "Print"
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h
new file mode 100644
index 0000000000..c1dd8eb0a4
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h
@@ -0,0 +1,276 @@
+/**
+ * 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
+
+//*************法文****************************//
+#define TOOL_TEXT_FR "prêt"
+#define PREHEAT_TEXT_FR "Préchauffe"
+#define MOVE_TEXT_FR "Déplace"
+#define HOME_TEXT_FR "Acceuil"
+#define PRINT_TEXT_FR "Impression"
+#define EXTRUDE_TEXT_FR "Extruder"
+#define LEVELING_TEXT_FR "Leveling"
+#define AUTO_LEVELING_TEXT_FR "AutoLevel"
+#define SET_TEXT_FR "Config"
+#define MORE_TEXT_FR "Plus"
+
+#define ADD_TEXT_FR "Ajouter"
+#define DEC_TEXT_FR "Réduire"
+#define EXTRUDER_1_TEXT_FR "Extr1"
+#define EXTRUDER_2_TEXT_FR "Extr2"
+#define HEATBED_TEXT_FR "Hotlit"
+#define TEXT_1C_FR "1℃"
+#define TEXT_5C_FR "5℃"
+#define TEXT_10C_FR "10℃"
+#define CLOSE_TEXT_FR "Off"
+
+#define BACK_TEXT_FR "Arrière"
+
+#define TOOL_PREHEAT_FR "Préchauffe"
+#define TOOL_EXTRUDE_FR "Extruder"
+#define TOOL_MOVE_FR "Déplace"
+#define TOOL_HOME_FR "Acceuil"
+#define TOOL_LEVELING_FR "Leveling"
+#define TOOL_AUTO_LEVELING_FR "AutoLevel"
+#define TOOL_FILAMENT_FR "Filament"
+#define TOOL_MORE_FR "Plus"
+
+#define AXIS_X_ADD_TEXT_FR "X+"
+#define AXIS_X_DEC_TEXT_FR "X-"
+#define AXIS_Y_ADD_TEXT_FR "Y+"
+#define AXIS_Y_DEC_TEXT_FR "Y-"
+#define AXIS_Z_ADD_TEXT_FR "Z+"
+#define AXIS_Z_DEC_TEXT_FR "Z-"
+#define TEXT_01MM_FR "0.1mm"
+#define TEXT_1MM_FR "1mm"
+#define TEXT_10MM_FR "10mm"
+
+#define HOME_X_TEXT_FR "X"
+#define HOME_Y_TEXT_FR "Y"
+#define HOME_Z_TEXT_FR "Z"
+#define HOME_ALL_TEXT_FR "ALL"
+#define HOME_STOPMOVE_FR "Quickstop"
+
+#define PAGE_UP_TEXT_FR "En haut"
+#define PAGE_DOWN_TEXT_FR "En bas"
+
+#define EXTRUDER_IN_TEXT_FR "Insérer"
+#define EXTRUDER_OUT_TEXT_FR "éjecter"
+#define EXTRUDE_1MM_TEXT_FR "1mm"
+#define EXTRUDE_5MM_TEXT_FR "5mm"
+#define EXTRUDE_10MM_TEXT_FR "10mm"
+#define EXTRUDE_LOW_SPEED_TEXT_FR "Lente"
+#define EXTRUDE_MEDIUM_SPEED_TEXT_FR "Moyen"
+#define EXTRUDE_HIGH_SPEED_TEXT_FR "Rapide"
+
+#define LEVELING_POINT1_TEXT_FR "Premier"
+#define LEVELING_POINT2_TEXT_FR "Seconde"
+#define LEVELING_POINT3_TEXT_FR "Troisième"
+#define LEVELING_POINT4_TEXT_FR "Quatrième"
+#define LEVELING_POINT5_TEXT_FR "Cinquième"
+
+#define FILESYS_TEXT_FR "Fichier"
+#define WIFI_TEXT_FR "WiFi"
+#define FAN_TEXT_FR "Fan"
+#define ABOUT_TEXT_FR "A propos"
+#define BREAK_POINT_TEXT_FR "Continuer"
+#define FILAMENT_TEXT_FR "Remplacer"
+#define LANGUAGE_TEXT_FR "Langue"
+#define MOTOR_OFF_TEXT_FR "M-hors"
+#define MOTOR_OFF_XY_TEXT_FR "M-hors-XY"
+#define SHUTDOWN_TEXT_FR "Eteindre"
+
+#define U_DISK_TEXT_FR "Clé usb"
+#define SD_CARD_TEXT_FR "Carte SD"
+#define WIFI_NAME_TEXT_FR "WiFi: "
+#define WIFI_KEY_TEXT_FR "Key: "
+#define WIFI_IP_TEXT_FR "IP: "
+#define WIFI_AP_TEXT_FR "Etat: AP"
+#define WIFI_STA_TEXT_FR "Etat: STA"
+#define WIFI_CONNECTED_TEXT_FR "Connecté"
+#define WIFI_DISCONNECTED_TEXT_FR "Déconnecté"
+#define WIFI_EXCEPTION_TEXT_FR "Exception"
+#define WIFI_RECONNECT_TEXT_FR "Reconnect"
+#define CLOUD_TEXT_FR "Cloud"
+#define CLOUD_BIND_FR "Lié"
+#define CLOUD_UNBIND_FR "Délier"
+#define CLOUD_UNBINDING_FR "Délier"
+#define CLOUD_DISCONNECTED_FR "Déconnecté"
+#define CLOUD_UNBINDED_FR "Délier"
+#define CLOUD_BINDED_FR "Lié"
+#define CLOUD_DISABLE_FR "Désactiver"
+
+#define FAN_ADD_TEXT_FR "Ajouter"
+#define FAN_DEC_TEXT_FR "Réduire"
+#define FAN_OPEN_TEXT_FR "100%"
+#define FAN_HALF_TEXT_FR "50%"
+#define FAN_CLOSE_TEXT_FR "0%"
+#define FAN_TIPS1_TEXT_FR "ventilateur"
+#define FAN_TIPS2_TEXT_FR "ventilateur\n0"
+
+#define FILAMENT_IN_TEXT_FR "Insérer"
+#define FILAMENT_OUT_TEXT_FR "éjecter"
+#define FILAMENT_EXT0_TEXT_FR "Extr1"
+#define FILAMENT_EXT1_TEXT_FR "Extr2"
+#define FILAMENT_HEAT_TEXT_FR "Preheat"
+#define FILAMENT_STOP_TEXT_FR "Arrêter"
+//#define FILAMENT_CHANGE_TEXT_FR "Filament remplacer"
+#define FILAMENT_TIPS2_TEXT_FR "T:"
+#define FILAMENT_TIPS3_TEXT_FR "Insérer le filament..."
+#define FILAMENT_TIPS4_TEXT_FR "éjecter le filament..."
+#define FILAMENT_TIPS5_TEXT_FR "Température trop basse pour démarrer, chauffez svp"
+#define FILAMENT_TIPS6_TEXT_FR "Terminé"
+
+#if 0
+ #define FILAMENT_REPLAYS_IDLE_TEXT_FR "Please click or <éjecter> \nto replace filament!"
+ #define FILAMENT_CHANGE_TEXT_FR "Please click or <éjecter>,\nAfter pinter pause."
+ #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Heating up the nozzle,please wait..."
+ #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Heating up the nozzle,please wait..."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Heat completed,please load filament to extruder,and click for start loading."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Please load filament to extruder,and click for start loading."
+ #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Heat completed,please click for start unloading.!"
+ #define FILAMENT_DIALOG_LOADING_TIPS_FR "Is loading ,please wait!"
+ #define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Is unloading,please wait!"
+ #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Load filament completed,click for return!"
+ #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Unload filament completed,click for return!"
+#endif
+#define FILAMENT_CHANGE_TEXT_FR "Please click \nor ,After \npinter pause."
+#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..."
+#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..."
+#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Heat completed,please load filament \nto extruder,and click \nfor start loading."
+#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Please load filament to extruder,\nand click for start loading."
+#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Heat completed,please \nclick for start unloading.!"
+#define FILAMENT_DIALOG_LOADING_TIPS_FR "Is loading ,please wait!"
+#define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Is unloading,please wait!"
+#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Load filament completed,\nclick for return!"
+#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Unload filament completed,\nclick for return!"
+
+
+#define PRE_HEAT_EXT_TEXT_FR "E"
+#define PRE_HEAT_BED_TEXT_FR "Bed"
+
+#define FILE_LOADING_FR "Chargement......"
+#if 0
+ #define NO_FILE_AND_CHECK_FR "Aucun fichier trouvé! Insérez une carte SD ou un disque U!"
+#else
+ #define NO_FILE_AND_CHECK_FR "Aucun fichier,vérifiez à nouveau!"
+#endif
+
+#define NO_FILE_FR "Pas de fichier!"
+
+
+
+#define EXTRUDER_TEMP_TEXT_FR "Temper"
+#define EXTRUDER_E_LENGTH1_TEXT_FR "Extruder1"
+#define EXTRUDER_E_LENGTH2_TEXT_FR "Extruder2"
+#define EXTRUDER_E_LENGTH3_TEXT_FR "Extruder3"
+
+#define ABOUT_TYPE_TEXT_FR "Type: "
+#define ABOUT_VERSION_TEXT_FR "Firmware: "
+#define ABOUT_WIFI_TEXT_FR "Wifi: "
+
+#define PRINTING_OPERATION_FR "Option"
+#define PRINTING_PAUSE_FR "Pause"
+#define PRINTING_TEMP_FR "Temp."
+#define PRINTING_CHANGESPEED_FR "Speed"
+#define PRINTING_RESUME_FR "Reprendre"
+#define PRINTING_STOP_FR "Stop"
+#define PRINTING_MORE_FR "Plus"
+#define PRINTING_EXTRUDER_FR "Extruder"
+#define PRINTING_MOVE_FR "Déplace"
+
+#define EXTRUDER_SPEED_FR "Extruder"
+#define MOVE_SPEED_FR "Déplace"
+#define EXTRUDER_SPEED_STATE_FR "Vitesse d'extrusion"
+#define MOVE_SPEED_STATE_FR "vitesse de déplacement"
+#define STEP_1PERCENT_FR "1%"
+#define STEP_5PERCENT_FR "5%"
+#define STEP_10PERCENT_FR "10%"
+
+#define ZOFFSET_FR "Z Offset"
+#define ZOFFSET_INC_FR "Ajouter"
+#define ZOFFSET_DEC_FR "Réduire"
+
+#define TITLE_READYPRINT_FR "Prête"
+#define TITLE_PREHEAT_FR "Préchauffe"
+#define TITLE_MOVE_FR "Déplace"
+#define TITLE_HOME_FR "Acceuil"
+#define TITLE_EXTRUDE_FR "Extruder"
+#define TITLE_LEVELING_FR "Leveling"
+#define TITLE_SET_FR "Paramètres"
+#define TITLE_MORE_FR "Plus"
+#define TITLE_CHOOSEFILE_FR "Fichier"
+#define TITLE_PRINTING_FR "Pimpression"
+#define TITLE_OPERATION_FR "Option"
+#define TITLE_ADJUST_FR "Réglage"
+#define TITLE_WIRELESS_FR "Sans fil"
+#define TITLE_FILAMENT_FR "Remplacer"
+#define TITLE_ABOUT_FR "A propos"
+#define TITLE_FAN_FR "Ventilateur"
+#define TITLE_LANGUAGE_FR "Langue"
+#define TITLE_PAUSE_FR "Pause"
+#define TITLE_CHANGESPEED_FR "Speed"
+#define TITLE_CLOUD_TEXT_FR "Cloud"
+#define TITLE_DIALOG_CONFIRM_FR "Confirm"
+#define TITLE_FILESYS_FR "FileSys"
+#define TITLE_ZOFFSET_FR "Z Offset"
+
+#define DIALOG_CLOSE_MACHINE_FR "Closing machine......"
+
+#define AUTO_SHUTDOWN_FR "Auto"
+#define MANUAL_SHUTDOWN_FR "Manuel"
+
+#define DIALOG_CONFIRM_FR "Confirmer"
+#define DIALOG_CANCLE_FR "Annuler"
+#define DIALOG_OK_FR "OK"
+#define DIALOG_RESET_FR "Réinitialiser"
+#define DIALOG_RETRY_FR "Recommencez"
+#define DIALOG_DISABLE_FR "Disable"
+#define DIALOG_PRINT_MODEL_FR "Imprimer le fichier?"
+#define DIALOG_CANCEL_PRINT_FR "Arrêter?"
+
+#define DIALOG_STOP_FR "Arrêter"
+#define DIALOG_REPRINT_FROM_BREAKPOINT_FR "Continuer?"
+//#define DIALOG_UNBIND_PRINTER_FR "Non lié?"
+#define DIALOG_ERROR_TIPS1_FR "Erreur:error:Aucun fichier, \nvérifiez à nouveau."
+#define DIALOG_ERROR_TIPS2_FR "Erreur:La opération a échoué. \nVerifiez que le baudrate de l'écran et de \nla carte mère soient identique!"
+#define DIALOG_ERROR_TIPS3_FR "Erreur: le nom du fichier ou le \nchemin d'accès est trop long."
+#define DIALOG_UNBIND_PRINTER_FR "Unbind the printer?"
+#define DIALOG_FILAMENT_NO_PRESS_FR "Filament detection switch is not pressed"
+#define DIALOG_PRINT_FINISH_FR "L'impression est terminée!"
+#define DIALOG_PRINT_TIME_FR "Temps d'impression: "
+#define DIALOG_REPRINT_FR "Print again"
+#define DIALOG_WIFI_ENABLE_TIPS_FR "The wifi module is being configured,\nplease wait a moment....."
+
+#define MESSEGE_PAUSING_FR "Parking..."
+#define MESSEGE_CHANGING_FR "Attente filament pour démarrer"
+#define MESSEGE_UNLOAD_FR "Attente retrait du filament"
+#define MESSEGE_WAITING_FR "Presser bouton,pour reprendre"
+#define MESSEGE_INSERT_FR "Insérer filament et app. bouton pour continuer..."
+#define MESSEGE_LOAD_FR "Attente chargement filament"
+#define MESSEGE_PURGE_FR "Attente Purge filament"
+#define MESSEGE_RESUME_FR "Attente reprise impression"
+#define MESSEGE_HEAT_FR "Presser le bouton pour chauffer..."
+#define MESSEGE_HEATING_FR "Buse en chauffe Patienter SVP..."
+#define MESSEGE_OPTION_FR "Purger davantage ou continuer l'impression?"
+#define MESSEGE_PURGE_MORE_FR "Purge"
+#define MESSEGE_CONTINUE_PRINT_FR "Impression"
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h
new file mode 100644
index 0000000000..d43ba086db
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h
@@ -0,0 +1,271 @@
+/**
+ * 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
+
+//****************意大利语***************************//
+#define TOOL_TEXT_IT "Strumento"
+#define PREHEAT_TEXT_IT "Prerisc"
+#define MOVE_TEXT_IT "Muovi"
+#define HOME_TEXT_IT "Home"
+#define PRINT_TEXT_IT "Stampa"
+#define EXTRUDE_TEXT_IT "Estrude"
+#define LEVELING_TEXT_IT "Leveling"
+#define AUTO_LEVELING_TEXT_IT "AutoLevel"
+#define SET_TEXT_IT "Imposta"
+#define MORE_TEXT_IT "Di più"
+
+#define ADD_TEXT_IT "Aumentare"
+#define DEC_TEXT_IT "Ridurre"
+#define EXTRUDER_1_TEXT_IT "Estrude1"
+#define EXTRUDER_2_TEXT_IT "Estrude2"
+#define HEATBED_TEXT_IT "Piano"
+#define TEXT_1C_IT "1℃"
+#define TEXT_5C_IT "5℃"
+#define TEXT_10C_IT "10℃"
+#define CLOSE_TEXT_IT "Spento"
+
+#define BACK_TEXT_IT "Indietro"
+
+#define TOOL_PREHEAT_IT "Prerisc"
+#define TOOL_EXTRUDE_IT "Estrude"
+#define TOOL_MOVE_IT "Muovi"
+#define TOOL_HOME_IT "Home"
+#define TOOL_LEVELING_IT "Leveling"
+#define TOOL_AUTO_LEVELING_IT "Autolevel"
+#define TOOL_FILAMENT_IT "Filamento"
+#define TOOL_MORE_IT "Di più"
+
+#define AXIS_X_ADD_TEXT_IT "X+"
+#define AXIS_X_DEC_TEXT_IT "X-"
+#define AXIS_Y_ADD_TEXT_IT "Y+"
+#define AXIS_Y_DEC_TEXT_IT "Y-"
+#define AXIS_Z_ADD_TEXT_IT "Z+"
+#define AXIS_Z_DEC_TEXT_IT "Z-"
+#define TEXT_01MM_IT "0.1mm"
+#define TEXT_1MM_IT "1mm"
+#define TEXT_10MM_IT "10mm"
+
+#define HOME_X_TEXT_IT "X"
+#define HOME_Y_TEXT_IT "Y"
+#define HOME_Z_TEXT_IT "Z"
+#define HOME_ALL_TEXT_IT "All"
+#define HOME_STOPMOVE_IT "Quickstop"
+
+#define PAGE_UP_TEXT_IT "Pagina su"
+#define PAGE_DOWN_TEXT_IT "Pagina giù"
+
+#define EXTRUDER_IN_TEXT_IT "Estru"
+#define EXTRUDER_OUT_TEXT_IT "Ritra"
+#define EXTRUDE_1MM_TEXT_IT "1mm"
+#define EXTRUDE_5MM_TEXT_IT "5mm"
+#define EXTRUDE_10MM_TEXT_IT "10mm"
+#define EXTRUDE_LOW_SPEED_TEXT_IT "Bassa"
+#define EXTRUDE_MEDIUM_SPEED_TEXT_IT "Media"
+#define EXTRUDE_HIGH_SPEED_TEXT_IT "Alta"
+
+#define LEVELING_POINT1_TEXT_IT "Primo"
+#define LEVELING_POINT2_TEXT_IT "Secondo"
+#define LEVELING_POINT3_TEXT_IT "Terzo"
+#define LEVELING_POINT4_TEXT_IT "Quarto"
+#define LEVELING_POINT5_TEXT_IT "Quinto"
+
+#define FILESYS_TEXT_IT "FileSys"
+#define WIFI_TEXT_IT "WIFI"
+#define FAN_TEXT_IT "Ventola"
+#define ABOUT_TEXT_IT "Circa"
+#define BREAK_POINT_TEXT_IT "Continua"
+#define FILAMENT_TEXT_IT "Filamento"
+#define LANGUAGE_TEXT_IT "Lingua"
+#define MOTOR_OFF_TEXT_IT "Motor off"
+#define MOTOR_OFF_XY_TEXT_IT "Off-XY"
+#define SHUTDOWN_TEXT_IT "Spento"
+
+#define U_DISK_TEXT_IT "USB"
+#define SD_CARD_TEXT_IT "SD"
+#define WIFI_NAME_TEXT_IT "WIFI: "
+#define WIFI_KEY_TEXT_IT "KEY: "
+#define WIFI_IP_TEXT_IT "IP: "
+#define WIFI_AP_TEXT_IT "Stato: AP"
+#define WIFI_STA_TEXT_IT "Stato: STA"
+#define WIFI_CONNECTED_TEXT_IT "Connesso"
+#define WIFI_DISCONNECTED_TEXT_IT "Disconnesso"
+#define WIFI_EXCEPTION_TEXT_IT "Eccezione"
+#define WIFI_RECONNECT_TEXT_IT "Reconnect"
+#define CLOUD_TEXT_IT "Cloud"
+#define CLOUD_BIND_IT "Legato"
+#define CLOUD_UNBIND_IT "Libero"
+#define CLOUD_DISCONNECTED_IT "Disconnesso"
+#define CLOUD_UNBINDING_IT "Libero"
+#define CLOUD_UNBINDED_IT "Sciolto"
+#define CLOUD_BINDED_IT "Legato"
+#define CLOUD_DISABLE_IT "Disable"
+
+#define FAN_ADD_TEXT_IT "Aumentare"
+#define FAN_DEC_TEXT_IT "Ridurre"
+#define FAN_OPEN_TEXT_IT "100%"
+#define FAN_HALF_TEXT_IT "50%"
+#define FAN_CLOSE_TEXT_IT "Spento"
+#define FAN_TIPS1_TEXT_IT "Ventola"
+#define FAN_TIPS2_TEXT_IT "Ventola\n0"
+
+#define FILAMENT_IN_TEXT_IT "Inser"
+#define FILAMENT_OUT_TEXT_IT "Estra"
+#define FILAMENT_EXT0_TEXT_IT "Estrude1"
+#define FILAMENT_EXT1_TEXT_IT "Estrude2"
+#define FILAMENT_HEAT_TEXT_IT "Preriscaldamento"
+#define FILAMENT_STOP_TEXT_IT "Stop"
+//#define FILAMENT_CHANGE_TEXT_IT "Filamento"
+#define FILAMENT_TIPS2_TEXT_IT "T:"
+#define FILAMENT_TIPS3_TEXT_IT "Inserimento del filamento..."
+#define FILAMENT_TIPS4_TEXT_IT "Estrazione del filamento..."
+#define FILAMENT_TIPS5_TEXT_IT "Temp is too low to go,please heat"
+#define FILAMENT_TIPS6_TEXT_IT "Completato"
+
+#if 0
+ #define FILAMENT_REPLAYS_IDLE_TEXT_IT "Please click or \nto replace filament!"
+ #define FILAMENT_CHANGE_TEXT_IT "Please click or ,\nAfter pinter pause."
+ #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..."
+ #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament to extruder,and click for start loading."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,and click for start loading."
+ #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please click for start unloading.!"
+ #define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!"
+ #define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!"
+ #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,click for return!"
+ #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,click for return!"
+#endif
+#define FILAMENT_CHANGE_TEXT_IT "Please click \nor ,After \npinter pause."
+#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..."
+#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT "Heating up the nozzle,please wait..."
+#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT "Heat completed,please load filament \nto extruder,and click \nfor start loading."
+#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_IT "Please load filament to extruder,\nand click for start loading."
+#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT "Heat completed,please \nclick for start unloading.!"
+#define FILAMENT_DIALOG_LOADING_TIPS_IT "Is loading ,please wait!"
+#define FILAMENT_DIALOG_UNLOADING_TIPS_IT "Is unloading,please wait!"
+#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT "Load filament completed,\nclick for return!"
+#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT "Unload filament completed,\nclick for return!"
+
+
+#define PRE_HEAT_EXT_TEXT_IT "E"
+#define PRE_HEAT_BED_TEXT_IT "Piano"
+
+#define FILE_LOADING_IT "Caricamento......"
+#if 0
+ #define NO_FILE_AND_CHECK_IT "Nessun file trovato! Inserisci la scheda SD o il disco U!"
+#endif
+#define NO_FILE_AND_CHECK_IT "Nessun file,\n per favore controllare di nuovo!"
+
+#define NO_FILE_IT "Nessun file!"
+
+#define EXTRUDER_TEMP_TEXT_IT "Temper"
+#define EXTRUDER_E_LENGTH1_TEXT_IT "Estrude1"
+#define EXTRUDER_E_LENGTH2_TEXT_IT "Estrude2"
+#define EXTRUDER_E_LENGTH3_TEXT_IT "Estrude3"
+
+#define ABOUT_TYPE_TEXT_IT "Type: "
+#define ABOUT_VERSION_TEXT_IT "Firmware: "
+#define ABOUT_WIFI_TEXT_IT "WiFi: "
+
+#define PRINTING_OPERATION_IT "Opzioni"
+#define PRINTING_PAUSE_IT "Pause"
+#define PRINTING_TEMP_IT "Temp."
+#define PRINTING_CHANGESPEED_IT "Velocità"
+#define PRINTING_RESUME_IT "Recupero"
+#define PRINTING_STOP_IT "Stop"
+#define PRINTING_MORE_IT "Di più"
+#define PRINTING_EXTRUDER_IT "Estrude"
+#define PRINTING_MOVE_IT "Muovi"
+
+#define EXTRUDER_SPEED_IT "Estrude"
+#define MOVE_SPEED_IT "Muovi"
+#define EXTRUDER_SPEED_STATE_IT "Estrusione"
+#define MOVE_SPEED_STATE_IT "Movimento"
+#define STEP_1PERCENT_IT "1%"
+#define STEP_5PERCENT_IT "5%"
+#define STEP_10PERCENT_IT "10%"
+
+#define ZOFFSET_IT "Z Offset"
+#define ZOFFSET_INC_IT "Add"
+#define ZOFFSET_DEC_IT "Dec"
+
+#define TITLE_READYPRINT_IT "Pronto"
+#define TITLE_PREHEAT_IT "Preris"
+#define TITLE_MOVE_IT "Muovi"
+#define TITLE_HOME_IT "Home"
+#define TITLE_EXTRUDE_IT "Estrude"
+#define TITLE_LEVELING_IT "Livella"
+#define TITLE_SET_IT "Impostare"
+#define TITLE_MORE_IT "Di più"
+#define TITLE_CHOOSEFILE_IT "File"
+#define TITLE_PRINTING_IT "Stampa"
+#define TITLE_OPERATION_IT "Opzioni"
+#define TITLE_ADJUST_IT "Regolare"
+#define TITLE_WIRELESS_IT "Wireless"
+#define TITLE_FILAMENT_IT "Filamento"
+#define TITLE_ABOUT_IT "Circa"
+#define TITLE_FAN_IT "Ventola"
+#define TITLE_LANGUAGE_IT "Lingua"
+#define TITLE_PAUSE_IT "Pausa"
+#define TITLE_CHANGESPEED_IT "Velocità"
+#define TITLE_CLOUD_TEXT_IT "Cloud"
+#define TITLE_DIALOG_CONFIRM_IT "Confirm"
+#define TITLE_FILESYS_IT "FileSys"
+#define TITLE_ZOFFSET_IT "Z Offset"
+
+#define AUTO_SHUTDOWN_IT "Auto"
+#define MANUAL_SHUTDOWN_IT "Manuale"
+
+#define DIALOG_CONFIRM_IT "Conferma"
+#define DIALOG_CANCLE_IT "Cancella"
+#define DIALOG_OK_IT "OK"
+#define DIALOG_RESET_IT "Resettare"
+#define DIALOG_RETRY_IT "Riprovare"
+#define DIALOG_DISABLE_IT "Disable"
+#define DIALOG_PRINT_MODEL_IT "Gcode stampa?"
+#define DIALOG_CANCEL_PRINT_IT "Stop stampa?"
+#define DIALOG_STOP_IT "Stop"
+#define DIALOG_REPRINT_FROM_BREAKPOINT_IT "Continua a stampare dal \npunto di interruzione?"
+//#define DIALOG_UNBIND_PRINTER_IT "Libero?"
+#define DIALOG_ERROR_TIPS1_IT "Errore: nessun file, \nper favore controllare di nuovo."
+#define DIALOG_ERROR_TIPS2_IT "Errore: operazione non riuscita, \nsi prega di controllare se il baudrate del \ndisplay è lo stesso scheda madre"
+#define DIALOG_ERROR_TIPS3_IT "Errore: il nome del file o il \npercorso è troppo lungo!"
+#define DIALOG_CLOSE_MACHINE_IT "Closing machine......"
+#define DIALOG_UNBIND_PRINTER_IT "Unbind the printer?"
+#define DIALOG_FILAMENT_NO_PRESS_IT "Filament detection switch is not pressed"
+#define DIALOG_PRINT_FINISH_IT "La stampa è completa!"
+#define DIALOG_PRINT_TIME_IT "Tempo di stampa: "
+#define DIALOG_REPRINT_IT "Print again"
+#define DIALOG_WIFI_ENABLE_TIPS_IT "The wifi module is being configured,\nplease wait a moment....."
+
+#define MESSEGE_PAUSING_IT "Parcheggiando..."
+#define MESSEGE_CHANGING_IT "Attendere avvio del cambio di filamento"
+#define MESSEGE_UNLOAD_IT "Attendere l'espulsione del filamento"
+#define MESSEGE_WAITING_IT "Premi per riprendere la stampa"
+#define MESSEGE_INSERT_IT "Inserisci il filamento e premi per continuare"
+#define MESSEGE_LOAD_IT "Attendere il caricamento del filamento"
+#define MESSEGE_PURGE_IT "Attendere lo spurgo del filamento"
+#define MESSEGE_RESUME_IT "Attendere la ripresa della stampa..."
+#define MESSEGE_HEAT_IT "Premi per riscaldare ugello"
+#define MESSEGE_HEATING_IT "Riscaldam. ugello Attendere prego..."
+#define MESSEGE_OPTION_IT "Eliminare di più o continuare a stampare?"
+#define MESSEGE_PURGE_MORE_IT "Epurazione"
+#define MESSEGE_CONTINUE_PRINT_IT "Stampa"
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h
new file mode 100644
index 0000000000..e78067d898
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h
@@ -0,0 +1,272 @@
+/**
+ * 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
+
+//****************俄语***************************//
+#define TOOL_TEXT_RU "инструмент"
+#define PREHEAT_TEXT_RU " нагрев"
+#define MOVE_TEXT_RU "движение"
+#define HOME_TEXT_RU "домой"
+#define PRINT_TEXT_RU " печать"
+#define EXTRUDE_TEXT_RU "экструзия"
+#define LEVELING_TEXT_RU "уровень"
+#define AUTO_LEVELING_TEXT_RU "aвто"
+#define SET_TEXT_RU "настройки"
+#define MORE_TEXT_RU "больше"
+
+#define ADD_TEXT_RU "добавить"
+#define DEC_TEXT_RU "уменьшить"
+#define EXTRUDER_1_TEXT_RU "экструдер1"
+#define EXTRUDER_2_TEXT_RU "экструдер2"
+#define HEATBED_TEXT_RU "стол"
+#define TEXT_1C_RU "1℃"
+#define TEXT_5C_RU "5℃"
+#define TEXT_10C_RU "10℃"
+#define CLOSE_TEXT_RU "выкл"
+
+#define BACK_TEXT_RU "назад"
+
+#define TOOL_PREHEAT_RU "нагрев"
+#define TOOL_EXTRUDE_RU "экструзия"
+#define TOOL_MOVE_RU "движение"
+#define TOOL_HOME_RU "домой"
+#define TOOL_LEVELING_RU "уровень"
+#define TOOL_AUTO_LEVELING_RU "aвто"
+#define TOOL_FILAMENT_RU "замена"
+#define TOOL_MORE_RU "больше"
+
+#define AXIS_X_ADD_TEXT_RU "X+"
+#define AXIS_X_DEC_TEXT_RU "X-"
+#define AXIS_Y_ADD_TEXT_RU "Y+"
+#define AXIS_Y_DEC_TEXT_RU "Y-"
+#define AXIS_Z_ADD_TEXT_RU "Z+"
+#define AXIS_Z_DEC_TEXT_RU "Z-"
+#define TEXT_01MM_RU "0.1mm"
+#define TEXT_1MM_RU "1mm"
+#define TEXT_10MM_RU "10mm"
+
+#define HOME_X_TEXT_RU "X"
+#define HOME_Y_TEXT_RU "Y"
+#define HOME_Z_TEXT_RU "Z"
+#define HOME_ALL_TEXT_RU "Home"
+#define HOME_STOPMOVE_RU "Quickstop"
+
+#define PAGE_UP_TEXT_RU "вверх"
+#define PAGE_DOWN_TEXT_RU "вниз"
+
+#define EXTRUDER_IN_TEXT_RU "втянуть"
+#define EXTRUDER_OUT_TEXT_RU "выдавить"
+#define EXTRUDE_1MM_TEXT_RU "1mm"
+#define EXTRUDE_5MM_TEXT_RU "5mm"
+#define EXTRUDE_10MM_TEXT_RU "10mm"
+#define EXTRUDE_LOW_SPEED_TEXT_RU "мин"
+#define EXTRUDE_MEDIUM_SPEED_TEXT_RU "сред"
+#define EXTRUDE_HIGH_SPEED_TEXT_RU "выс"
+
+#define LEVELING_POINT1_TEXT_RU "1точка"
+#define LEVELING_POINT2_TEXT_RU "2точка"
+#define LEVELING_POINT3_TEXT_RU "3точка"
+#define LEVELING_POINT4_TEXT_RU "4точка"
+#define LEVELING_POINT5_TEXT_RU "5точка"
+
+#define FILESYS_TEXT_RU "система"
+#define WIFI_TEXT_RU "WiFi"
+#define FAN_TEXT_RU "вентилятор"
+#define ABOUT_TEXT_RU "инфо"
+#define BREAK_POINT_TEXT_RU "продолжить"
+#define FILAMENT_TEXT_RU "замена"
+#define LANGUAGE_TEXT_RU "язык"
+#define MOTOR_OFF_TEXT_RU "отклмотор"
+#define MOTOR_OFF_XY_TEXT_RU "Off-XY"
+#define SHUTDOWN_TEXT_RU "выключение"
+
+#define U_DISK_TEXT_RU "U диск"
+#define SD_CARD_TEXT_RU "SD диск"
+#define WIFI_NAME_TEXT_RU "WiFi: "
+#define WIFI_KEY_TEXT_RU "пароль: "
+#define WIFI_IP_TEXT_RU "IP: "
+#define WIFI_AP_TEXT_RU "режим: AP"
+#define WIFI_STA_TEXT_RU "режим: STA"
+#define WIFI_CONNECTED_TEXT_RU "подключен"
+#define WIFI_DISCONNECTED_TEXT_RU "не подключен"
+#define WIFI_EXCEPTION_TEXT_RU "исключение"
+#define WIFI_RECONNECT_TEXT_RU "Reconnect"
+#define CLOUD_TEXT_RU "облако"
+#define CLOUD_BIND_RU "соединён"
+#define CLOUD_UNBIND_RU "не соединён"
+#define CLOUD_UNBINDING_RU "Unbinding"
+#define CLOUD_DISCONNECTED_RU "Disconnected"
+#define CLOUD_UNBINDED_RU "Unbinded"
+#define CLOUD_BINDED_RU "Binded"
+#define CLOUD_DISABLE_RU "Disable"
+
+#define FAN_ADD_TEXT_RU "добавить"
+#define FAN_DEC_TEXT_RU "уменьшить"
+#define FAN_OPEN_TEXT_RU "100%"
+#define FAN_HALF_TEXT_RU "50%"
+#define FAN_CLOSE_TEXT_RU "откл"
+#define FAN_TIPS1_TEXT_RU "вентилятор"
+#define FAN_TIPS2_TEXT_RU "вентилятор\nоткл"
+
+#define FILAMENT_IN_TEXT_RU "втянуть"
+#define FILAMENT_OUT_TEXT_RU "выдавить"
+#define FILAMENT_EXT0_TEXT_RU "экструдер1"
+#define FILAMENT_EXT1_TEXT_RU "экструдер2"
+#define FILAMENT_HEAT_TEXT_RU "нагрев"
+#define FILAMENT_STOP_TEXT_RU "стоп"
+//#define FILAMENT_CHANGE_TEXT_RU "замена"
+#define FILAMENT_TIPS2_TEXT_RU "T:"
+#define FILAMENT_TIPS3_TEXT_RU "втянуть..."
+#define FILAMENT_TIPS4_TEXT_RU "вядавить..."
+#define FILAMENT_TIPS5_TEXT_RU "Низкая температура, \nнеобходим нагрев"
+#define FILAMENT_TIPS6_TEXT_RU "завершено"
+
+#if 0
+ #define FILAMENT_REPLAYS_IDLE_TEXT_RU "Please click <втянуть> or <выдавить> \nto replace filament!"
+ #define FILAMENT_CHANGE_TEXT_RU "Please click <втянуть> or <выдавить>,\nAfter pinter pause."
+ #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU "Heating up the nozzle,please wait..."
+ #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU "Heating up the nozzle,please wait..."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU "Heat completed,please load filament to extruder,and click <да> for start loading."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_RU "Please load filament to extruder,and click <да> for start loading."
+ #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU "Heat completed,please click <да> for start unloading.!"
+ #define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading ,please wait!"
+ #define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading,please wait!"
+ #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU "Load filament completed,click <да> for return!"
+ #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU "Unload filament completed,click <да> for return!"
+#endif
+#define FILAMENT_CHANGE_TEXT_RU "Please click \nor ,After \npinter pause."
+#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU "Heating up the nozzle,\nplease wait..."
+#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU "Heating up the nozzle,\nplease wait..."
+#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU "Heat completed,please load filament \nto extruder,and click \nfor start loading."
+#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_RU "Please load filament to extruder,\nand click for start loading."
+#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU "Heat completed,please \nclick for start unloading.!"
+#define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading ,please wait!"
+#define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading,please wait!"
+#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU "Load filament completed,\nclick for return!"
+#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU "Unload filament completed,\nclick for return!"
+
+
+#define PRE_HEAT_EXT_TEXT_RU "E"
+#define PRE_HEAT_BED_TEXT_RU "стол"
+
+#define FILE_LOADING_RU "загрузка......"
+#if 0
+ #define NO_FILE_AND_CHECK_RU "Файлы не найдены! Вставьте SD-карту или диск U!"
+#endif
+#define NO_FILE_AND_CHECK_RU "нет файла,попробуйте ещё раз!"
+
+#define NO_FILE_RU "нет файла!"
+
+#define EXTRUDER_TEMP_TEXT_RU "температура"
+#define EXTRUDER_E_LENGTH1_TEXT_RU "экструзия1"
+#define EXTRUDER_E_LENGTH2_TEXT_RU "экструзия2"
+#define EXTRUDER_E_LENGTH3_TEXT_RU "экструзия3"
+
+#define ABOUT_TYPE_TEXT_RU "Type: "
+#define ABOUT_VERSION_TEXT_RU "Firmware: "
+#define ABOUT_WIFI_TEXT_RU "WiFi: "
+
+#define PRINTING_OPERATION_RU "управление"
+#define PRINTING_PAUSE_RU "пауза"
+#define PRINTING_TEMP_RU "темп"
+#define PRINTING_CHANGESPEED_RU "скорости"
+#define PRINTING_RESUME_RU "возобновить"
+#define PRINTING_STOP_RU "стоп"
+#define PRINTING_MORE_RU "больше"
+#define PRINTING_EXTRUDER_RU "экстр"
+#define PRINTING_MOVE_RU "движение"
+
+#define EXTRUDER_SPEED_RU "экстр"
+#define MOVE_SPEED_RU "движ"
+#define EXTRUDER_SPEED_STATE_RU "скорость экстр"
+#define MOVE_SPEED_STATE_RU "скорость движ"
+#define STEP_1PERCENT_RU "1%"
+#define STEP_5PERCENT_RU "5%"
+#define STEP_10PERCENT_RU "10%"
+
+#define ZOFFSET_RU "Z Offset"
+#define ZOFFSET_INC_RU "добавить"
+#define ZOFFSET_DEC_RU "уменьшить"
+
+#define TITLE_READYPRINT_RU "готов к"
+#define TITLE_PREHEAT_RU "движение"
+#define TITLE_MOVE_RU "движение"
+#define TITLE_HOME_RU "Home"
+#define TITLE_EXTRUDE_RU "экструзия"
+#define TITLE_LEVELING_RU "уровень"
+#define TITLE_SET_RU "настройки"
+#define TITLE_MORE_RU "больше"
+#define TITLE_CHOOSEFILE_RU "файла"
+#define TITLE_PRINTING_RU "печать"
+#define TITLE_OPERATION_RU "управление"
+#define TITLE_ADJUST_RU "регулировать"
+#define TITLE_WIRELESS_RU "Wireless"
+#define TITLE_FILAMENT_RU "замена"
+#define TITLE_ABOUT_RU "инфо"
+#define TITLE_FAN_RU "вентилятор"
+#define TITLE_LANGUAGE_RU "язык"
+#define TITLE_PAUSE_RU "пауза"
+#define TITLE_CHANGESPEED_RU "скорости"
+#define TILE_TOOL_RU "инструмент"
+#define TITLE_CLOUD_TEXT_RU "Cloud"
+#define TITLE_DIALOG_CONFIRM_RU "Confirm"
+#define TITLE_FILESYS_RU "FileSys"
+#define TITLE_ZOFFSET_RU "Z Offset"
+
+#define AUTO_SHUTDOWN_RU "авто-откл"
+#define MANUAL_SHUTDOWN_RU "ручн-откл"
+
+#define DIALOG_CONFIRM_RU "да"//"подтвердить"
+#define DIALOG_CANCLE_RU "отмена"
+#define DIALOG_OK_RU "да"
+#define DIALOG_RESET_RU "сброс"
+#define DIALOG_RETRY_RU "повтор"
+#define DIALOG_DISABLE_RU "запретить"
+#define DIALOG_PRINT_MODEL_RU "печать модели?"
+#define DIALOG_CANCEL_PRINT_RU "стоп?"
+#define DIALOG_STOP_RU "стоп"
+#define DIALOG_REPRINT_FROM_BREAKPOINT_RU "продолжить?"
+//#define DIALOG_UNBIND_PRINTER_RU "разрыв?"
+#define DIALOG_ERROR_TIPS1_RU "ошибка:нет файла, попробуйте ещё раз."
+#define DIALOG_ERROR_TIPS2_RU "ошибка:сбой передачи. установите скорость \nпередачи данных как на плате управления!"
+#define DIALOG_ERROR_TIPS3_RU "ошибка: имя файла слишком длинное!"
+#define DIALOG_CLOSE_MACHINE_RU "Closing machine......"
+#define DIALOG_UNBIND_PRINTER_RU "Unbind the printer?"
+#define DIALOG_FILAMENT_NO_PRESS_RU "Filament detection switch is not pressed"
+#define DIALOG_PRINT_FINISH_RU "Печать завершена!"
+#define DIALOG_PRINT_TIME_RU "Время печати: "
+#define DIALOG_REPRINT_RU "Print again"
+#define DIALOG_WIFI_ENABLE_TIPS_RU "The wifi module is being configured,\nplease wait a moment....."
+
+#define MESSEGE_PAUSING_RU "Стоянка..."
+#define MESSEGE_CHANGING_RU "Подождите, пока начнется смена филамента"
+#define MESSEGE_UNLOAD_RU "Дождитесь выгрузки нити"
+#define MESSEGE_WAITING_RU "Нажмите кнопку,чтобы возобновить печать"
+#define MESSEGE_INSERT_RU "Вставьте нить и нажмите кнопку,чтобы продолжить"
+#define MESSEGE_LOAD_RU "Дождитесь загрузки нити"
+#define MESSEGE_PURGE_RU "Дождитесь чистки нити"
+#define MESSEGE_RESUME_RU "Подождите,пока печать возобновится ..."
+#define MESSEGE_HEAT_RU "Нажмите кнопку, чтобы нагреть форсунку"
+#define MESSEGE_HEATING_RU "Подогрев форсунки Пожалуйста, подождите ..."
+#define MESSEGE_OPTION_RU "Очистить больше или продолжить печать?"
+#define MESSEGE_PURGE_MORE_RU "чистка"
+#define MESSEGE_CONTINUE_PRINT_RU "Распечатать"
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h
new file mode 100644
index 0000000000..50a9deaf2e
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h
@@ -0,0 +1,264 @@
+/**
+ * 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
+
+//*************简体中文***********************//
+#define TOOL_TEXT_CN "工具"
+#define PREHEAT_TEXT_CN "预热"
+#define MOVE_TEXT_CN "移动"
+#define HOME_TEXT_CN "回零"
+#define PRINT_TEXT_CN "打印"
+#define EXTRUDE_TEXT_CN "挤出"
+#define LEVELING_TEXT_CN "调平"
+#define AUTO_LEVELING_TEXT_CN "自动调平"
+#define SET_TEXT_CN "设置"
+#define MORE_TEXT_CN "更多"
+
+#define ADD_TEXT_CN "增加"
+#define DEC_TEXT_CN "减少"
+#define EXTRUDER_1_TEXT_CN "喷头1"
+#define EXTRUDER_2_TEXT_CN "喷头2"
+#define HEATBED_TEXT_CN "热床"
+#define TEXT_1C_CN "1℃"
+#define TEXT_5C_CN "5℃"
+#define TEXT_10C_CN "10℃"
+#define CLOSE_TEXT_CN "关闭"
+
+#define BACK_TEXT_CN "返回"
+
+#define TOOL_PREHEAT_CN "预热"
+#define TOOL_EXTRUDE_CN "挤出"
+#define TOOL_MOVE_CN "移动"
+#define TOOL_HOME_CN "回零"
+#define TOOL_LEVELING_CN "调平"
+#define TOOL_AUTO_LEVELING_CN "自动调平"
+#define TOOL_FILAMENT_CN "换料"
+#define TOOL_MORE_CN "更多"
+
+#define AXIS_X_ADD_TEXT_CN "X+"
+#define AXIS_X_DEC_TEXT_CN "X-"
+#define AXIS_Y_ADD_TEXT_CN "Y+"
+#define AXIS_Y_DEC_TEXT_CN "Y-"
+#define AXIS_Z_ADD_TEXT_CN "Z+"
+#define AXIS_Z_DEC_TEXT_CN "Z-"
+#define TEXT_01MM_CN "0.1mm"
+#define TEXT_1MM_CN "1mm"
+#define TEXT_10MM_CN "10mm"
+
+#define HOME_X_TEXT_CN "X"
+#define HOME_Y_TEXT_CN "Y"
+#define HOME_Z_TEXT_CN "Z"
+#define HOME_ALL_TEXT_CN "回零"
+#define HOME_STOPMOVE_CN "急停"
+
+#define PAGE_UP_TEXT_CN "上一页"
+#define PAGE_DOWN_TEXT_CN "下一页"
+
+#define EXTRUDER_IN_TEXT_CN "进料"
+#define EXTRUDER_OUT_TEXT_CN "退料"
+#define EXTRUDE_1MM_TEXT_CN "1mm"
+#define EXTRUDE_5MM_TEXT_CN "5mm"
+#define EXTRUDE_10MM_TEXT_CN "10mm"
+#define EXTRUDE_LOW_SPEED_TEXT_CN "低速"
+#define EXTRUDE_MEDIUM_SPEED_TEXT_CN "常速"
+#define EXTRUDE_HIGH_SPEED_TEXT_CN "高速"
+
+#define LEVELING_POINT1_TEXT_CN "第一点"
+#define LEVELING_POINT2_TEXT_CN "第二点"
+#define LEVELING_POINT3_TEXT_CN "第三点"
+#define LEVELING_POINT4_TEXT_CN "第四点"
+#define LEVELING_POINT5_TEXT_CN "第五点"
+
+#define FILESYS_TEXT_CN "文件系统"
+#define WIFI_TEXT_CN "WIFI"
+#define FAN_TEXT_CN "风扇"
+#define ABOUT_TEXT_CN "关于"
+#define BREAK_POINT_TEXT_CN "断点续打"
+#define FILAMENT_TEXT_CN "换料"
+#define LANGUAGE_TEXT_CN "语言"
+#define MOTOR_OFF_TEXT_CN "关闭电机"
+#define MOTOR_OFF_XY_TEXT_CN "关闭XY"
+#define SHUTDOWN_TEXT_CN "关机"
+
+#define U_DISK_TEXT_CN "U盘"
+#define SD_CARD_TEXT_CN "SD卡"
+#define WIFI_NAME_TEXT_CN "无线网络:"
+#define WIFI_KEY_TEXT_CN "密码: "
+#define WIFI_IP_TEXT_CN "IP: "
+#define WIFI_AP_TEXT_CN "状态: AP"
+#define WIFI_STA_TEXT_CN "状态: STA"
+#define WIFI_CONNECTED_TEXT_CN "已连接"
+#define WIFI_DISCONNECTED_TEXT_CN "未连接"
+#define WIFI_EXCEPTION_TEXT_CN "模块异常"
+#define CLOUD_TEXT_CN "云服务"
+#define CLOUD_BIND_CN "已绑定"
+#define CLOUD_UNBIND_CN "解绑"
+#define CLOUD_UNBINDING_CN "解绑中"
+#define CLOUD_DISCONNECTED_CN "未连接"
+#define CLOUD_UNBINDED_CN "未绑定"
+#define CLOUD_BINDED_CN "已绑定"
+#define CLOUD_DISABLE_CN "已禁用"
+
+#define FAN_ADD_TEXT_CN "增加"
+#define FAN_DEC_TEXT_CN "减少"
+#define FAN_OPEN_TEXT_CN "100%"
+#define FAN_HALF_TEXT_CN "50%"
+#define FAN_CLOSE_TEXT_CN "关闭"
+#define FAN_TIPS1_TEXT_CN "风扇"
+#define FAN_TIPS2_TEXT_CN "FAN\nClose"
+
+#define FILAMENT_IN_TEXT_CN "进料"
+#define FILAMENT_OUT_TEXT_CN "退料"
+#define FILAMENT_EXT0_TEXT_CN "喷头1"
+#define FILAMENT_EXT1_TEXT_CN "喷头2"
+#define FILAMENT_HEAT_TEXT_CN "预热"
+#define FILAMENT_STOP_TEXT_CN "停止"
+#if 0
+ #define FILAMENT_REPLAYS_IDLE_TEXT_CN "请按<进料>或<退料>进行换料!"
+ #define FILAMENT_CHANGE_TEXT_CN "待打印机暂停后,请按<进料>或<退料>进行换料!"
+#else
+ #define FILAMENT_CHANGE_TEXT_CN "待打印机暂停后,\n请按<进料>或<退料>"
+#endif
+
+#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_CN "准备进料,正在加热,请稍等!"
+#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_CN "准备退料,正在加热,请稍等!"
+#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_CN "加热完成,请装载耗材后,按<确定>开始进料!"
+#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_CN "请装载耗材,按<确定>开始进料!"
+#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_CN "加热完成,请按<确定>开始退料!"
+#define FILAMENT_DIALOG_LOADING_TIPS_CN "正在进料,请等待耗材加载完成!"
+#define FILAMENT_DIALOG_UNLOADING_TIPS_CN "正在退料,请等待耗材卸载完成!"
+#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_CN "进料完成,请按<确定>返回"
+#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_CN "退料完成,请按<确定>返回"
+
+#define FILAMENT_TIPS3_TEXT_CN "正在进料"
+#define FILAMENT_TIPS4_TEXT_CN "正在退料"
+#define FILAMENT_TIPS5_TEXT_CN "温度太低,请先预热"
+#define FILAMENT_TIPS6_TEXT_CN "换料完成"
+
+#define PRE_HEAT_EXT_TEXT_CN "喷头"
+#define PRE_HEAT_BED_TEXT_CN "热床"
+
+#define FILE_LOADING_CN "正在载入......"
+#define NO_FILE_AND_CHECK_CN "无文件!请插入sd卡或u盘!"
+#define NO_FILE_CN "无文件!"
+
+#define EXTRUDER_TEMP_TEXT_CN "温度"
+#define EXTRUDER_E_LENGTH1_TEXT_CN "喷头"
+#define EXTRUDER_E_LENGTH2_TEXT_CN "喷头"
+#define EXTRUDER_E_LENGTH3_TEXT_CN "喷头"
+
+#define ABOUT_TYPE_TEXT_CN "Type: "
+#define ABOUT_VERSION_TEXT_CN "Firmware: "
+#define ABOUT_WIFI_TEXT_CN "Wifi: "
+
+#define PRINTING_OPERATION_CN "操作"
+#define PRINTING_PAUSE_CN "暂停"
+#define PRINTING_TEMP_CN "温度"
+#define PRINTING_CHANGESPEED_CN "变速"
+#define PRINTING_RESUME_CN "恢复"
+#define PRINTING_STOP_CN "停止"
+#define PRINTING_MORE_CN "更多"
+#define PRINTING_EXTRUDER_CN "挤出"
+#define PRINTING_MOVE_CN "移动"
+
+#define EXTRUDER_SPEED_CN "挤出"
+#define MOVE_SPEED_CN "移动"
+#define EXTRUDER_SPEED_STATE_CN "挤出速度"
+#define MOVE_SPEED_STATE_CN "移动速度"
+#define STEP_1PERCENT_CN "1%"
+#define STEP_5PERCENT_CN "5%"
+#define STEP_10PERCENT_CN "10%"
+
+#define ZOFFSET_CN "Z Offset"
+#define ZOFFSET_INC_CN "增加"
+#define ZOFFSET_DEC_CN "减少"
+
+#define TITLE_READYPRINT_CN "准备打印"
+#define TITLE_PREHEAT_CN "预热"
+#define TITLE_MOVE_CN "移动"
+#define TITLE_HOME_CN "回零"
+#define TITLE_EXTRUDE_CN "挤出"
+#define TITLE_LEVELING_CN "调平"
+#define TITLE_SET_CN "设置"
+#define TITLE_MORE_CN "更多"
+#define TITLE_CHOOSEFILE_CN "选择文件"
+#define TITLE_PRINTING_CN "正在打印"
+#define TITLE_OPERATION_CN "操作"
+#define TITLE_ADJUST_CN "调整"
+#define TITLE_WIRELESS_CN "无线网络"
+#define TITLE_FILAMENT_CN "换料"
+#define TITLE_ABOUT_CN "关于"
+#define TITLE_FAN_CN "风扇"
+#define TITLE_LANGUAGE_CN "语言"
+#define TITLE_PAUSE_CN "暂停"
+#define TITLE_CHANGESPEED_CN "变速"
+#define TITLE_CLOUD_TEXT_CN "云服务"
+#define TITLE_DIALOG_CONFIRM_CN "确认"
+#define TITLE_FILESYS_CN "文件系统"
+#define TITLE_ZOFFSET_CN "Z Offset"
+
+#define AUTO_SHUTDOWN_CN "自动关机"
+#define MANUAL_SHUTDOWN_CN "手动关机"
+
+#define DIALOG_CONFIRM_CN "确定"
+#define DIALOG_CANCLE_CN "取消"
+#define DIALOG_OK_CN "确认"
+#define DIALOG_RESET_CN "重置"
+#define DIALOG_DISABLE_CN "禁用"
+#define DIALOG_PRINT_MODEL_CN "打印模型?"
+#define DIALOG_CANCEL_PRINT_CN "停止打印?"
+#define DIALOG_RETRY_CN "重试"
+#define DIALOG_STOP_CN "停止"
+#define DIALOG_REPRINT_FROM_BREAKPOINT_CN "从断点续打?"
+//#define DIALOG_UNBIND_PRINTER_CN "解除绑定 ?"
+#define DIALOG_ERROR_TIPS1_CN "错误:找不到文件,请插入sd卡/u盘!"
+#define DIALOG_ERROR_TIPS2_CN "错误:通信失败,请检查波特率或主板硬件!"
+#define DIALOG_ERROR_TIPS3_CN "错误:文件名或文件路径太长 !"
+#define DIALOG_CLOSE_MACHINE_CN "正在关机......"
+#define DIALOG_UNBIND_PRINTER_CN "解除绑定?"
+#define DIALOG_FILAMENT_NO_PRESS_CN "请先装载耗材!"
+#define DIALOG_PRINT_FINISH_CN "打印完成!"
+#define DIALOG_PRINT_TIME_CN "打印时间: "
+#define DIALOG_REPRINT_CN "再打印一次"
+#define DIALOG_WIFI_ENABLE_TIPS_CN "wifi模块正在配置中,请稍等......"
+
+#define TEXT_VALUE_CN "%d℃/%d℃"
+#define EXTRUDE_TEXT_VALUE_T_CN ": %d℃"
+#define WIFI_RECONNECT_TEXT_CN "重新连接"
+
+#define PRINTING_GBK "正在打印"
+#define PRINTING_OPERATION_GBK "操作"
+#define PRINTING_PAUSE_GBK "暂停"
+
+#define MESSEGE_PAUSING_CN "暂停中..."
+#define MESSEGE_CHANGING_CN "等待换料开始..."
+#define MESSEGE_UNLOAD_CN "退料中,请稍等..."
+#define MESSEGE_WAITING_CN "点击按钮恢复打印"
+#define MESSEGE_INSERT_CN "装载耗材后,点击按钮开始打印"
+#define MESSEGE_LOAD_CN "进料中,请稍等..."
+#define MESSEGE_PURGE_CN "等待挤出..."
+#define MESSEGE_RESUME_CN "等待恢复打印..."
+#define MESSEGE_HEAT_CN "按下按钮,加热喷头"
+#define MESSEGE_HEATING_CN "喷头加热中,请等待..."
+#define MESSEGE_OPTION_CN "挤出更多还是继续打印?"
+#define MESSEGE_PURGE_MORE_CN "挤出"
+#define MESSEGE_CONTINUE_PRINT_CN "打印"
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h
new file mode 100644
index 0000000000..f83771b838
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h
@@ -0,0 +1,279 @@
+/**
+ * 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
+
+//****************西班牙语***************************
+#define TOOL_TEXT_SP "Ajustes"
+#define PREHEAT_TEXT_SP "Precalentar"//"precalent\nar"
+#define MOVE_TEXT_SP "Mover"
+#define HOME_TEXT_SP "Origen"
+#define PRINT_TEXT_SP "Imprimir"
+#define EXTRUDE_TEXT_SP "Extrusor"
+#define LEVELING_TEXT_SP "Leveling"//"nivelac\nión"
+#define AUTO_LEVELING_TEXT_SP "Autolevel"//"auto\nnivelación"
+#define SET_TEXT_SP "Config"
+#define MORE_TEXT_SP "Más"
+
+#define ADD_TEXT_SP "Más"
+#define DEC_TEXT_SP "Menos"
+#define EXTRUDER_1_TEXT_SP "Extrusor1: "
+#define EXTRUDER_2_TEXT_SP "Extrusor2: "
+#define HEATBED_TEXT_SP "Cama: "
+#define TEXT_1C_SP "1℃"
+#define TEXT_5C_SP "5℃"
+#define TEXT_10C_SP "10℃"
+#define CLOSE_TEXT_SP "Apagar"
+
+#define BACK_TEXT_SP "Atrás"
+
+#define TOOL_PREHEAT_SP "Precalentar"
+#define TOOL_EXTRUDE_SP "Extrusor"
+#define TOOL_MOVE_SP "Mover"
+#define TOOL_HOME_SP "Origen"
+#define TOOL_LEVELING_SP "Leveling"
+#define TOOL_AUTO_LEVELING_SP "Autolevel"
+#define TOOL_FILAMENT_SP "Filamento"
+#define TOOL_MORE_SP "Más"
+
+#define AXIS_X_ADD_TEXT_SP "X+"
+#define AXIS_X_DEC_TEXT_SP "X-"
+#define AXIS_Y_ADD_TEXT_SP "Y+"
+#define AXIS_Y_DEC_TEXT_SP "Y-"
+#define AXIS_Z_ADD_TEXT_SP "Z+"
+#define AXIS_Z_DEC_TEXT_SP "Z-"
+#define TEXT_01MM_SP "0.1mm"
+#define TEXT_1MM_SP "1mm"
+#define TEXT_10MM_SP "10mm"
+
+#define HOME_X_TEXT_SP "EJE X"
+#define HOME_Y_TEXT_SP "EJE Y"
+#define HOME_Z_TEXT_SP "EJE Z"
+#define HOME_ALL_TEXT_SP "TODOS"
+#define HOME_STOPMOVE_SP "Quickstop"
+
+#define PAGE_UP_TEXT_SP "Arriba"
+#define PAGE_DOWN_TEXT_SP "Abajo"
+
+#define EXTRUDER_IN_TEXT_SP "Dentro"
+#define EXTRUDER_OUT_TEXT_SP "Fuera"
+#define EXTRUDE_1MM_TEXT_SP "1mm"
+#define EXTRUDE_5MM_TEXT_SP "5mm"
+#define EXTRUDE_10MM_TEXT_SP "10mm"
+#define EXTRUDE_LOW_SPEED_TEXT_SP "Baja"
+#define EXTRUDE_MEDIUM_SPEED_TEXT_SP "Media"
+#define EXTRUDE_HIGH_SPEED_TEXT_SP "Alta"
+
+#define LEVELING_POINT1_TEXT_SP "Primero"
+#define LEVELING_POINT2_TEXT_SP "Segundo"
+#define LEVELING_POINT3_TEXT_SP "Tercero"
+#define LEVELING_POINT4_TEXT_SP "Cuarto"
+#define LEVELING_POINT5_TEXT_SP "Quinto"
+
+#define FILESYS_TEXT_SP "Puerto"
+#define WIFI_TEXT_SP "WiFi"
+#define FAN_TEXT_SP "Ventilador"
+#define ABOUT_TEXT_SP "Acerca"
+#define BREAK_POINT_TEXT_SP "Continuar"
+#define FILAMENT_TEXT_SP "Filamento"
+#define LANGUAGE_TEXT_SP "Language"
+#define MOTOR_OFF_TEXT_SP "Apagar motor"
+#define MOTOR_OFF_XY_TEXT_SP "Off-XY"
+#define SHUTDOWN_TEXT_SP "Apagar"
+
+#define U_DISK_TEXT_SP "PENDRIVE"
+#define SD_CARD_TEXT_SP "SD"
+#define WIFI_NAME_TEXT_SP "WIFI: "
+#define WIFI_KEY_TEXT_SP "Contraseña: "
+#define WIFI_IP_TEXT_SP "IP: "
+#define WIFI_AP_TEXT_SP "Estado: AP"
+#define WIFI_STA_TEXT_SP "Estado: STA"
+#define WIFI_CONNECTED_TEXT_SP "Conectado"
+#define WIFI_DISCONNECTED_TEXT_SP "Desconectado"
+#define WIFI_EXCEPTION_TEXT_SP "Excepción"
+#define WIFI_RECONNECT_TEXT_SP "Reconnect"
+#define CLOUD_TEXT_SP "Nube"
+#define CLOUD_BIND_SP "Atado"
+#define CLOUD_UNBIND_SP "Sin atar"
+#define CLOUD_UNBINDING_SP "Unbinding"
+#define CLOUD_DISCONNECTED_SP "Disconnected"
+#define CLOUD_UNBINDED_SP "Unbinded"
+#define CLOUD_BINDED_SP "Binded"
+#define CLOUD_DISABLE_SP "Disable"
+
+#define FAN_ADD_TEXT_SP "Más"
+#define FAN_DEC_TEXT_SP "Menos"
+#define FAN_OPEN_TEXT_SP "100%"
+#define FAN_HALF_TEXT_SP "50%"
+#define FAN_CLOSE_TEXT_SP "0%"
+#define FAN_TIPS1_TEXT_SP "ventilador"
+#define FAN_TIPS2_TEXT_SP "ventilador\n0"
+
+#define FILAMENT_IN_TEXT_SP "Dentro"
+#define FILAMENT_OUT_TEXT_SP "Fuera"
+#define FILAMENT_EXT0_TEXT_SP "Extrusor1"
+#define FILAMENT_EXT1_TEXT_SP "Extrusor2"
+#define FILAMENT_HEAT_TEXT_SP "Precalentar"
+#define FILAMENT_STOP_TEXT_SP "Parar"
+//#define FILAMENT_CHANGE_TEXT_SP "Filamento"
+#define FILAMENT_TIPS2_TEXT_SP "T:"
+#define FILAMENT_TIPS3_TEXT_SP "Dentro..."
+#define FILAMENT_TIPS4_TEXT_SP "Fuera..."
+#define FILAMENT_TIPS5_TEXT_SP "Temperatura demasiado baja, por favor calentar"
+#define FILAMENT_TIPS6_TEXT_SP "Completado"
+#if 0
+ #define FILAMENT_REPLAYS_IDLE_TEXT_SP "Please click or \nto replace filament!"
+ #define FILAMENT_CHANGE_TEXT_SP "Please click or ,\nAfter pinter pause."
+ #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP "Calentando el extrusor, por favor espere..."
+ #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP "Calentando el extrusor, por favor espere..."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP "Temperatura alcanzada.Inserte el filamento y luego presione\"Confirmar\"para comenzar la carga."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_SP "Inserte el filamento y luego presione\"Confirmar\"para comenzar la carga."
+ #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP "Temperatura alcanzada.Presione\"Confirmar\"para retirar el filamento."
+ #define FILAMENT_DIALOG_LOADING_TIPS_SP "Cargando filamento,por favor espere."
+ #define FILAMENT_DIALOG_UNLOADING_TIPS_SP "Retirando filamento,por favor espere."
+ #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP "Filamento cargado,presione\"Confirmar\"."
+ #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP "Filamento retirado,presione\"Confirmar\"."
+#else
+ #define FILAMENT_CHANGE_TEXT_SP "Please click \nor ,After \npinter pause."
+ #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP "Calentando el extrusor,\npor favor espere..."
+ #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP "Calentando el extrusor,\npor favor espere..."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP "Temperatura alcanzada.Inserte el \nfilamento y luego presione\"Confirmar\"\npara comenzar la carga."
+ #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_SP "Inserte el filamento y \nluego presione\"Confirmar\"para \ncomenzar la carga."
+ #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP "Temperatura alcanzada.\nPresione\"Confirmar\"para retirar \nel filamento."
+ #define FILAMENT_DIALOG_LOADING_TIPS_SP "Cargando filamento,\npor favor espere."
+ #define FILAMENT_DIALOG_UNLOADING_TIPS_SP "Retirando filamento,\npor favor espere."
+ #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP "Filamento cargado,\npresione\"Confirmar\"."
+ #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP "Filamento retirado,\npresione\"Confirmar\"."
+#endif
+
+#define PRE_HEAT_EXT_TEXT_SP "Extrusor"
+#define PRE_HEAT_BED_TEXT_SP "cama"
+
+#define FILE_LOADING_SP "Cargando......"
+#if 0
+ #define NO_FILE_AND_CHECK_SP "No se encontraron archivos! Por favor, inserte la tarjeta SD o el disco U!"
+#endif
+#define NO_FILE_AND_CHECK_SP "Archivo no encontrado,\n por favor insertar SD o disco USB!"
+
+#define NO_FILE_SP "Sin archivo!"
+
+
+
+#define EXTRUDER_TEMP_TEXT_SP "Temper"
+#define EXTRUDER_E_LENGTH1_TEXT_SP "Extrusor1"
+#define EXTRUDER_E_LENGTH2_TEXT_SP "Extrusor2"
+#define EXTRUDER_E_LENGTH3_TEXT_SP "Extrusor3"
+
+#define ABOUT_TYPE_TEXT_SP "Pantalla: "
+#define ABOUT_VERSION_TEXT_SP "Firmware: "
+#define ABOUT_WIFI_TEXT_SP "WiFi: "
+
+#define PRINTING_OPERATION_SP "Ajustes"
+#define PRINTING_PAUSE_SP "Pausar"
+#define PRINTING_TEMP_SP "Temp."
+#define PRINTING_CHANGESPEED_SP "Velocidad"
+#define PRINTING_RESUME_SP "Resumir"
+#define PRINTING_STOP_SP "Detener"
+#define PRINTING_MORE_SP "Más"
+#define PRINTING_EXTRUDER_SP "Extrusor"
+#define PRINTING_MOVE_SP "Mover"
+
+#define EXTRUDER_SPEED_SP "Extrusor"
+#define MOVE_SPEED_SP "Mover"
+#define EXTRUDER_SPEED_STATE_SP "Extrusión"
+#define MOVE_SPEED_STATE_SP "Movimiento"
+#define STEP_1PERCENT_SP "1%"
+#define STEP_5PERCENT_SP "5%"
+#define STEP_10PERCENT_SP "10%"
+
+#define ZOFFSET_SP "Z Offset"
+#define ZOFFSET_INC_SP "Más"
+#define ZOFFSET_DEC_SP "Menos"
+
+#define TITLE_READYPRINT_SP "Inicio"
+#define TITLE_PREHEAT_SP "Precalentar"
+#define TITLE_MOVE_SP "Mover"
+#define TITLE_HOME_SP "Origen"
+#define TITLE_EXTRUDE_SP "Extrusor"
+#define TITLE_LEVELING_SP "Leveling"
+#define TITLE_SET_SP "Config"
+#define TITLE_MORE_SP "Más"
+#define TITLE_CHOOSEFILE_SP "Imprimir"
+#define TITLE_PRINTING_SP "Imprimir"
+#define TITLE_OPERATION_SP "Ajustes"
+#define TITLE_ADJUST_SP "Temp."
+#define TITLE_WIRELESS_SP "Wireless"
+#define TITLE_FILAMENT_SP "Filamento"
+#define TITLE_ABOUT_SP "Acerca"
+#define TITLE_FAN_SP "Ventilador"
+#define TITLE_LANGUAGE_SP "Language"
+#define TITLE_PAUSE_SP "Pausar"
+#define TITLE_CHANGESPEED_SP "Velocidad"
+#define TILE_TOOL_SP "Ajustes"
+#define TITLE_CLOUD_TEXT_SP "Cloud"
+#define TITLE_DIALOG_CONFIRM_SP "Confirmar"
+#define TITLE_FILESYS_SP "Puerto"
+#define TITLE_ZOFFSET_SP "Z Offset"
+
+#define AUTO_SHUTDOWN_SP "Auto"
+#define MANUAL_SHUTDOWN_SP "manual"
+
+#define DIALOG_CONFIRM_SP "Confirmar"
+#define DIALOG_CANCLE_SP "Cancelar"
+#define DIALOG_OK_SP "OK"
+#define DIALOG_RESET_SP "Resetear"
+#define DIALOG_RETRY_SP "Reintentar"
+#define DIALOG_DISABLE_SP "Desactivar"
+#define DIALOG_PRINT_MODEL_SP "¿Está seguro?"
+#define DIALOG_CANCEL_PRINT_SP "¿Está seguro que desea detener la impresión?"
+
+#define DIALOG_RETRY_SP "Reintentar"
+#define DIALOG_STOP_SP "Stop"
+#define DIALOG_REPRINT_FROM_BREAKPOINT_SP "Reprint from breakpoint?"
+//#define DIALOG_UNBIND_PRINTER_SP "Unbind the printer?"
+#define DIALOG_ERROR_TIPS1_SP "Error:archivo no encontrado, \npor favor insertar SD o disco USB."
+#define DIALOG_ERROR_TIPS2_SP "error:transacción fallida, \nconfigurar baudrate del \ndisplay para la placa base!"
+#define DIALOG_ERROR_TIPS3_SP "Error : nombre de archivo o \nruta demasiado largo!"
+#define DIALOG_CLOSE_MACHINE_SP "Closing machine......"
+#define DIALOG_UNBIND_PRINTER_SP "Unbind the printer?"
+#define DIALOG_FILAMENT_NO_PRESS_SP "Filament detection switch is not pressed"
+#define DIALOG_PRINT_FINISH_SP "¡La impresión está completa!"
+#define DIALOG_PRINT_TIME_SP "Tiempo de impresión: "
+#define DIALOG_REPRINT_SP "Print again"
+#define DIALOG_WIFI_ENABLE_TIPS_SP "The wifi module is being configured,\nplease wait a moment....."
+
+#define PRINTING_SP "Imprimiendo"
+#define PRINTING_AJUSTES_SP "Ajustes"
+#define PRINTING_PAUSAR_SP "Pausar"
+
+#define MESSEGE_PAUSING_SP "Aparcando..."
+#define MESSEGE_CHANGING_SP "Esperando para iniciar el cambio de filamento"
+#define MESSEGE_UNLOAD_SP "Espere para liberar el filamento"
+#define MESSEGE_WAITING_SP "Pulsar el botón para reanudar impresión"
+#define MESSEGE_INSERT_SP "Inserte el filamento y pulse el botón para continuar..."
+#define MESSEGE_LOAD_SP "Espere para purgar el filamento"
+#define MESSEGE_PURGE_SP "Espere para purgar el filamento"
+#define MESSEGE_RESUME_SP "Esperando impresora para reanudar..."
+#define MESSEGE_HEAT_SP "Pulse el botón para calentar la boquilla"
+#define MESSEGE_HEATING_SP "Calentando boquilla Espere por favor..."
+#define MESSEGE_OPTION_SP "¿Purgar más o continuar con la impresión?"
+#define MESSEGE_PURGE_MORE_SP "Purga"
+#define MESSEGE_CONTINUE_PRINT_SP "Impresión"
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp
new file mode 100644
index 0000000000..25fd7082d9
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.cpp
@@ -0,0 +1,273 @@
+/**
+ * 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/MarlinConfig.h"
+
+#if ENABLED(TFT_LITTLE_VGL_UI)
+
+ #if defined(ARDUINO_ARCH_STM32F1) && PIN_EXISTS(FSMC_CS) // FSMC on 100/144 pins SoCs
+
+ #include
+ #include
+ #include
+ #include
+
+/* Timing configuration */
+ #define FSMC_ADDRESS_SETUP_TIME 15// AddressSetupTime
+ #define FSMC_DATA_SETUP_TIME 15// DataSetupTime
+
+ void LCD_IO_Init(uint8_t cs, uint8_t rs);
+ void LCD_IO_WriteData(uint16_t RegValue);
+ void LCD_IO_WriteReg(uint16_t Reg);
+ uint16_t LCD_IO_ReadData(uint16_t RegValue);
+ uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize);
+ uint16_t ILI9488_ReadRAM();
+ #ifdef LCD_USE_DMA_FSMC
+ void LCD_IO_WriteMultiple(uint16_t data, uint32_t count);
+ void LCD_IO_WriteSequence(uint16_t *data, uint16_t length);
+ #endif
+
+/**
+ * FSMC LCD IO
+ */
+ #define __ASM __asm
+ #define __STATIC_INLINE static inline
+
+ __attribute__((always_inline)) __STATIC_INLINE void __DSB() {__ASM volatile ("dsb 0xF" ::: "memory");}
+
+ #define FSMC_CS_NE1 PD7
+
+ #if ENABLED(STM32_XL_DENSITY)
+ #define FSMC_CS_NE2 PG9
+ #define FSMC_CS_NE3 PG10
+ #define FSMC_CS_NE4 PG12
+
+ #define FSMC_RS_A0 PF0
+ #define FSMC_RS_A1 PF1
+ #define FSMC_RS_A2 PF2
+ #define FSMC_RS_A3 PF3
+ #define FSMC_RS_A4 PF4
+ #define FSMC_RS_A5 PF5
+ #define FSMC_RS_A6 PF12
+ #define FSMC_RS_A7 PF13
+ #define FSMC_RS_A8 PF14
+ #define FSMC_RS_A9 PF15
+ #define FSMC_RS_A10 PG0
+ #define FSMC_RS_A11 PG1
+ #define FSMC_RS_A12 PG2
+ #define FSMC_RS_A13 PG3
+ #define FSMC_RS_A14 PG4
+ #define FSMC_RS_A15 PG5
+ #endif
+
+ #define FSMC_RS_A16 PD11
+ #define FSMC_RS_A17 PD12
+ #define FSMC_RS_A18 PD13
+ #define FSMC_RS_A19 PE3
+ #define FSMC_RS_A20 PE4
+ #define FSMC_RS_A21 PE5
+ #define FSMC_RS_A22 PE6
+ #define FSMC_RS_A23 PE2
+
+ #if ENABLED(STM32_XL_DENSITY)
+ #define FSMC_RS_A24 PG13
+ #define FSMC_RS_A25 PG14
+ #endif
+
+ static uint8_t fsmcInit = 0;
+
+ typedef struct {
+ __IO uint16_t REG;
+ __IO uint16_t RAM;
+ } LCD_CONTROLLER_TypeDef;
+
+ LCD_CONTROLLER_TypeDef *LCD;
+
+ void LCD_IO_Init(uint8_t cs, uint8_t rs) {
+ uint32_t controllerAddress;
+
+ if (fsmcInit) return;
+ fsmcInit = 1;
+
+ switch (cs) {
+ case FSMC_CS_NE1: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION1; break;
+ #if ENABLED(STM32_XL_DENSITY)
+ case FSMC_CS_NE2: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION2; break;
+ case FSMC_CS_NE3: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION3; break;
+ case FSMC_CS_NE4: controllerAddress = (uint32_t)FSMC_NOR_PSRAM_REGION4; break;
+ #endif
+ default: return;
+ }
+
+ #define _ORADDR(N) controllerAddress |= (_BV32(N) - 2)
+
+ switch (rs) {
+ #if ENABLED(STM32_XL_DENSITY)
+ case FSMC_RS_A0: _ORADDR( 1); break;
+ case FSMC_RS_A1: _ORADDR( 2); break;
+ case FSMC_RS_A2: _ORADDR( 3); break;
+ case FSMC_RS_A3: _ORADDR( 4); break;
+ case FSMC_RS_A4: _ORADDR( 5); break;
+ case FSMC_RS_A5: _ORADDR( 6); break;
+ case FSMC_RS_A6: _ORADDR( 7); break;
+ case FSMC_RS_A7: _ORADDR( 8); break;
+ case FSMC_RS_A8: _ORADDR( 9); break;
+ case FSMC_RS_A9: _ORADDR(10); break;
+ case FSMC_RS_A10: _ORADDR(11); break;
+ case FSMC_RS_A11: _ORADDR(12); break;
+ case FSMC_RS_A12: _ORADDR(13); break;
+ case FSMC_RS_A13: _ORADDR(14); break;
+ case FSMC_RS_A14: _ORADDR(15); break;
+ case FSMC_RS_A15: _ORADDR(16); break;
+ #endif
+ case FSMC_RS_A16: _ORADDR(17); break;
+ case FSMC_RS_A17: _ORADDR(18); break;
+ case FSMC_RS_A18: _ORADDR(19); break;
+ case FSMC_RS_A19: _ORADDR(20); break;
+ case FSMC_RS_A20: _ORADDR(21); break;
+ case FSMC_RS_A21: _ORADDR(22); break;
+ case FSMC_RS_A22: _ORADDR(23); break;
+ case FSMC_RS_A23: _ORADDR(24); break;
+ #if ENABLED(STM32_XL_DENSITY)
+ case FSMC_RS_A24: _ORADDR(25); break;
+ case FSMC_RS_A25: _ORADDR(26); break;
+ #endif
+ default: return;
+ }
+
+ rcc_clk_enable(RCC_FSMC);
+
+ gpio_set_mode(GPIOD, 14, GPIO_AF_OUTPUT_PP); // FSMC_D00
+ gpio_set_mode(GPIOD, 15, GPIO_AF_OUTPUT_PP); // FSMC_D01
+ gpio_set_mode(GPIOD, 0, GPIO_AF_OUTPUT_PP);// FSMC_D02
+ gpio_set_mode(GPIOD, 1, GPIO_AF_OUTPUT_PP);// FSMC_D03
+ gpio_set_mode(GPIOE, 7, GPIO_AF_OUTPUT_PP);// FSMC_D04
+ gpio_set_mode(GPIOE, 8, GPIO_AF_OUTPUT_PP);// FSMC_D05
+ gpio_set_mode(GPIOE, 9, GPIO_AF_OUTPUT_PP);// FSMC_D06
+ gpio_set_mode(GPIOE, 10, GPIO_AF_OUTPUT_PP); // FSMC_D07
+ gpio_set_mode(GPIOE, 11, GPIO_AF_OUTPUT_PP); // FSMC_D08
+ gpio_set_mode(GPIOE, 12, GPIO_AF_OUTPUT_PP); // FSMC_D09
+ gpio_set_mode(GPIOE, 13, GPIO_AF_OUTPUT_PP); // FSMC_D10
+ gpio_set_mode(GPIOE, 14, GPIO_AF_OUTPUT_PP); // FSMC_D11
+ gpio_set_mode(GPIOE, 15, GPIO_AF_OUTPUT_PP); // FSMC_D12
+ gpio_set_mode(GPIOD, 8, GPIO_AF_OUTPUT_PP);// FSMC_D13
+ gpio_set_mode(GPIOD, 9, GPIO_AF_OUTPUT_PP);// FSMC_D14
+ gpio_set_mode(GPIOD, 10, GPIO_AF_OUTPUT_PP); // FSMC_D15
+
+ gpio_set_mode(GPIOD, 4, GPIO_AF_OUTPUT_PP);// FSMC_NOE
+ gpio_set_mode(GPIOD, 5, GPIO_AF_OUTPUT_PP);// FSMC_NWE
+
+ gpio_set_mode(PIN_MAP[cs].gpio_device, PIN_MAP[cs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_CS_NEx
+ gpio_set_mode(PIN_MAP[rs].gpio_device, PIN_MAP[rs].gpio_bit, GPIO_AF_OUTPUT_PP); //FSMC_RS_Ax
+
+ #if ENABLED(STM32_XL_DENSITY)
+ FSMC_NOR_PSRAM4_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN;
+ FSMC_NOR_PSRAM4_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME;
+ #else // PSRAM1 for STM32F103V (high density)
+ FSMC_NOR_PSRAM1_BASE->BCR = FSMC_BCR_WREN | FSMC_BCR_MTYP_SRAM | FSMC_BCR_MWID_16BITS | FSMC_BCR_MBKEN;
+ FSMC_NOR_PSRAM1_BASE->BTR = (FSMC_DATA_SETUP_TIME << 8) | FSMC_ADDRESS_SETUP_TIME;
+ #endif
+
+ afio_remap(AFIO_REMAP_FSMC_NADV);
+
+ LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress;
+ }
+
+ void LCD_IO_WriteData(uint16_t RegValue) {
+ LCD->RAM = RegValue;
+ __DSB();
+ }
+
+ void LCD_IO_WriteReg(uint16_t Reg) {
+ LCD->REG = Reg;
+ __DSB();
+ }
+
+ uint16_t LCD_IO_ReadData(uint16_t RegValue) {
+ LCD->REG = RegValue;
+ __DSB();
+
+ return LCD->RAM;
+ }
+
+ uint16_t ILI9488_ReadRAM() {
+ uint16_t data;
+ data = LCD->RAM;
+ return data;
+ }
+
+ uint32_t LCD_IO_ReadData(uint16_t RegValue, uint8_t ReadSize) {
+ volatile uint32_t data;
+ LCD->REG = RegValue;
+ __DSB();
+
+ data = LCD->RAM; // dummy read
+ data = LCD->RAM & 0x00FF;
+
+ while (--ReadSize) {
+ data <<= 8;
+ data |= (LCD->RAM & 0x00FF);
+ }
+ return uint32_t(data);
+ }
+
+ #if ENABLED(LCD_USE_DMA_FSMC)
+
+ void LCD_IO_WriteMultiple(uint16_t color, uint32_t count) {
+ while (count > 0) {
+ dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, &color, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM);
+ dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, count > 65535 ? 65535 : count);
+ dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+ dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+
+ while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}
+ dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+
+ count = count > 65535 ? count - 65535 : 0;
+ }
+ }
+
+ void LCD_IO_WriteSequence(uint16_t *data, uint16_t length) {
+ dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE);
+ dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length);
+ dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+ dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+
+ while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}
+ dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+ }
+
+ void LCD_IO_WriteSequence_Async(uint16_t *data, uint16_t length) {
+ dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | DMA_PINC_MODE);
+ dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, length);
+ dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+ dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+ }
+
+ void LCD_IO_WaitSequence_Async() {
+ while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & 0x0A) == 0) {}
+ dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL);
+ }
+
+ #endif // LCD_USE_DMA_FSMC
+ #endif // ARDUINO_ARCH_STM32F1 && FSMC_CS_PIN
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h
new file mode 100644
index 0000000000..13720d1bbf
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_fsmc.h
@@ -0,0 +1,30 @@
+/**
+ * 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
+
+#ifdef __cplusplus
+extern "C" { /* C-declarations for C++ */
+#endif
+
+#ifdef __cplusplus
+} /* C-declarations for C++ */
+#endif
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
new file mode 100644
index 0000000000..a34b1ff470
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp
@@ -0,0 +1,791 @@
+/**
+ * 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 lcd_lvgl_configuration.c
+ * @date 2020-02-21
+ */
+
+#include "../../../../inc/MarlinConfigPre.h"
+
+#if ENABLED(TFT_LITTLE_VGL_UI)
+
+ #include "../../../../MarlinCore.h"
+
+ #include "tft_lvgl_configuration.h"
+ #include "lvgl.h"
+ #include "../../../../feature/touch/xpt2046.h"
+ #include "draw_ready_print.h"
+ #include "W25Qxx.h"
+ #include "pic_manager.h"
+
+ #include "mks_hardware_test.h"
+ #include "draw_ui.h"
+
+ #if ENABLED(POWER_LOSS_RECOVERY)
+ #include "../../../../feature/powerloss.h"
+ #endif
+
+ #include
+
+ #if ENABLED(SPI_GRAPHICAL_TFT)
+ #include "SPI_TFT.h"
+ #endif
+
+//#include "../../Configuration.h"
+//#include "../../src/core/macros.h"
+
+ extern void LCD_IO_Init(uint8_t cs, uint8_t rs);
+ extern void LCD_IO_WriteData(uint16_t RegValue);
+ extern void LCD_IO_WriteReg(uint16_t Reg);
+
+ extern void LCD_IO_WriteMultiple(uint16_t color, uint32_t count);
+
+ extern void init_gb2312_font();
+
+ static lv_disp_buf_t disp_buf;
+//static lv_color_t buf[LV_HOR_RES_MAX * 18];
+//static lv_color_t buf[10*5];
+//extern lv_obj_t * scr;
+ #if ENABLED(SDSUPPORT)
+ extern void UpdatePic();
+ extern void UpdateFont();
+ #endif
+ uint16_t DeviceCode = 0x9488;
+ extern uint8_t sel_id;
+
+ #define SetCs
+ #define ClrCs
+
+ #define HDP 799//Horizontal Display Period //**
+ #define HT 1000//Horizontal Total
+ #define HPS 51//LLINE Pulse Start Position
+ #define LPS 3 // Horizontal Display Period Start Position
+ #define HPW 8 // LLINE Pulse Width
+
+ #define VDP 479//Vertical Display Period
+ #define VT 530//Vertical Total
+ #define VPS 24// LFRAME Pulse Start Position
+ #define FPS 23//Vertical Display Period Start Positio
+ #define VPW 3 // LFRAME Pulse Width //**
+
+ #define MAX_HZ_POSX HDP+1
+ #define MAX_HZ_POSY VDP+1
+
+ extern uint8_t gcode_preview_over, flash_preview_begin, default_preview_flg;
+
+ void SysTick_Callback() {
+ lv_tick_inc(1);
+ print_time_count();
+ }
+
+ void tft_set_cursor(uint16_t x, uint16_t y) {
+ #if 0
+ if (DeviceCode == 0x8989) {
+ LCD_WriteReg(0x004E, y); //行
+ LCD_WriteReg(0x004F, x); //列
+ }
+ else if ((DeviceCode == 0x9919)) {
+ LCD_WriteReg(0x004E, x); // 行
+ LCD_WriteReg(0x004F, y); // 列
+ }
+ else if ((DeviceCode == 0x5761)) { //SSD1963
+ LCD_WrtReg(0x002A);
+ LCD_WrtRAM(x >> 8);
+ LCD_WrtRAM(x & 0x00FF);
+ LCD_WrtRAM(HDP >> 8);
+ LCD_WrtRAM(HDP & 0x00FF);
+ LCD_WrtReg(0x002B);
+ LCD_WrtRAM(y >> 8);
+ LCD_WrtRAM(y & 0x00FF);
+ LCD_WrtRAM(VDP >> 8);
+ LCD_WrtRAM(VDP & 0x00FF);
+ }
+ else if (DeviceCode == 0x9488) {
+ ILI9488_WriteCmd(0x002A);
+ ILI9488_WriteData(x >> 8);
+ ILI9488_WriteData(x & 0x00FF);
+ ILI9488_WriteData(x >> 8);
+ ILI9488_WriteData(x & 0x00FF);
+ //ILI9488_WriteData(0x01);
+ //ILI9488_WriteData(0xDF);
+ ILI9488_WriteCmd(0x002B);
+ ILI9488_WriteData(y >> 8);
+ ILI9488_WriteData(y & 0x00FF);
+ ILI9488_WriteData(y >> 8);
+ ILI9488_WriteData(y & 0x00FF);
+ //ILI9488_WriteData(0x01);
+ //ILI9488_WriteData(0x3F);
+ }
+ else {
+ LCD_WriteReg(0x0020, y); // 行
+ LCD_WriteReg(0x0021, 0x13f - x); // 列
+ }
+ #else // if 0
+ LCD_IO_WriteReg(0x002A);
+ LCD_IO_WriteData(x >> 8);
+ LCD_IO_WriteData(x & 0x00FF);
+ LCD_IO_WriteData(x >> 8);
+ LCD_IO_WriteData(x & 0x00FF);
+ //ILI9488_WriteData(0x01);
+ //ILI9488_WriteData(0xDF);
+ LCD_IO_WriteReg(0x002B);
+ LCD_IO_WriteData(y >> 8);
+ LCD_IO_WriteData(y & 0x00FF);
+ LCD_IO_WriteData(y >> 8);
+ LCD_IO_WriteData(y & 0x00FF);
+ //ILI9488_WriteData(0x01);
+ //ILI9488_WriteData(0x3F);
+ #endif // if 0
+ }
+
+ void LCD_WriteRAM_Prepare(void) {
+ #if 0
+ if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x8989)) {
+ ClrCs
+ LCD->LCD_REG = R34;
+ SetCs
+ }
+ else {
+ LCD_WrtReg(0x002C);
+ }
+ #else
+ LCD_IO_WriteReg(0x002C);
+ #endif
+ }
+
+ void tft_set_point(uint16_t x, uint16_t y, uint16_t point) {
+ //if (DeviceCode == 0x9488) {
+ if ((x > 480) || (y > 320)) return;
+ //}
+ //**if ( (x>320)||(y>240) ) return;
+ tft_set_cursor(x, y); /*设置光标位置*/
+
+ LCD_WriteRAM_Prepare(); /* 开始写入GRAM*/
+ //LCD_WriteRAM(point);
+ LCD_IO_WriteData(point);
+ }
+
+ void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) {
+ /* Write 16-bit Index, then Write Reg */
+ ClrCs
+ LCD_IO_WriteReg(LCD_Reg);
+ /* Write 16-bit Reg */
+ LCD_IO_WriteData(LCD_RegValue);
+ SetCs
+ }
+
+ void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh) {
+ uint16_t s_h, s_l, e_h, e_l;
+
+ uint16_t xEnd, yEnd;
+ xEnd = StartX + width;
+ yEnd = StartY + heigh - 1;
+ if (DeviceCode == 0x8989) {
+ /*LCD_WriteReg(0x0044, (StartX & 0xFF) | (xEnd << 8));
+ LCD_WriteReg(0x0045, StartY);
+ LCD_WriteReg(0x0046, yEnd);*/
+ LCD_WriteReg(0x0044, (StartY & 0xFF) | (yEnd << 8));
+ LCD_WriteReg(0x0045, StartX);
+ LCD_WriteReg(0x0046, xEnd);
+ }
+ else if (DeviceCode == 0x9488) {
+ s_h = (StartX >> 8) & 0x00ff;
+ s_l = StartX & 0x00ff;
+ e_h = ((StartX + width - 1) >> 8) & 0x00ff;
+ e_l = (StartX + width - 1) & 0x00ff;
+
+ LCD_IO_WriteReg(0x002A);
+ LCD_IO_WriteData(s_h);
+ LCD_IO_WriteData(s_l);
+ LCD_IO_WriteData(e_h);
+ LCD_IO_WriteData(e_l);
+
+ s_h = (StartY >> 8) & 0x00ff;
+ s_l = StartY & 0x00ff;
+ e_h = ((StartY + heigh - 1) >> 8) & 0x00ff;
+ e_l = (StartY + heigh - 1) & 0x00ff;
+
+ LCD_IO_WriteReg(0x002B);
+ LCD_IO_WriteData(s_h);
+ LCD_IO_WriteData(s_l);
+ LCD_IO_WriteData(e_h);
+ LCD_IO_WriteData(e_l);
+ }
+ else if ((DeviceCode == 0x9325) || (DeviceCode == 0x9328) || (DeviceCode == 0x1505)) {
+ /* LCD_WriteReg(0x0050, StartX);
+ LCD_WriteReg(0x0052, StartY);
+ LCD_WriteReg(0x0051, xEnd);
+ LCD_WriteReg(0x0053, yEnd);*/
+ LCD_WriteReg(0x0050, StartY); //Specify the start/end positions of the window address in the horizontal direction by an address unit
+ LCD_WriteReg(0x0051, yEnd); //Specify the start positions of the window address in the vertical direction by an address unit
+ LCD_WriteReg(0x0052, 320 - xEnd);
+ LCD_WriteReg(0x0053, 320 - StartX - 1); //Specify the end positions of the window address in the vertical direction by an address unit
+
+ }
+ else {
+ s_h = (StartX >> 8) & 0xFF;
+ s_l = StartX & 0xFF;
+ e_h = ((StartX + width - 1) >> 8) & 0xFF;
+ e_l = (StartX + width - 1) & 0xFF;
+
+ LCD_IO_WriteReg(0x2A);
+ LCD_IO_WriteData(s_h);
+ LCD_IO_WriteData(s_l);
+ LCD_IO_WriteData(e_h);
+ LCD_IO_WriteData(e_l);
+
+ s_h = (StartY >> 8) & 0xFF;
+ s_l = StartY & 0xFF;
+ e_h = ((StartY + heigh - 1) >> 8) & 0xFF;
+ e_l = (StartY + heigh - 1) & 0xFF;
+
+ LCD_IO_WriteReg(0x2B);
+ LCD_IO_WriteData(s_h);
+ LCD_IO_WriteData(s_l);
+ LCD_IO_WriteData(e_h);
+ LCD_IO_WriteData(e_l);
+ }
+ }
+
+ void LCD_Clear(uint16_t Color) {
+ uint32_t index = 0;
+ unsigned int count;
+
+ if (DeviceCode == 0x9488) {
+ tft_set_cursor(0, 0);
+ ili9320_SetWindows(0, 0, 480, 320);
+ LCD_WriteRAM_Prepare();
+ //index = (160*480);
+ for (index = 0; index < 320 * 480; index++)
+ LCD_IO_WriteData(Color);
+ //LCD_IO_WriteMultiple(Color, (480*320));
+ //while(index --) LCD_IO_WriteData(Color);
+ }
+ else if (DeviceCode == 0x5761) {
+ LCD_IO_WriteReg(0x002a);
+ LCD_IO_WriteData(0);
+ LCD_IO_WriteData(0);
+ LCD_IO_WriteData(HDP >> 8);
+ LCD_IO_WriteData(HDP & 0x00ff);
+ LCD_IO_WriteReg(0x002b);
+ LCD_IO_WriteData(0);
+ LCD_IO_WriteData(0);
+ LCD_IO_WriteData(VDP >> 8);
+ LCD_IO_WriteData(VDP & 0x00ff);
+ LCD_IO_WriteReg(0x002c);
+ LCD_IO_WriteReg(0x002c);
+ for (count = 0; count < (HDP + 1) * (VDP + 1); count++)
+ LCD_IO_WriteData(Color);
+ }
+ else {
+ tft_set_cursor(0, 0);
+ LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
+ for (index = 0; index < 76800; index++)
+ LCD_IO_WriteData(Color);
+ }
+ }
+
+ extern uint16_t ILI9488_ReadRAM();
+
+ #if DISABLED(SPI_GRAPHICAL_TFT)
+
+ void init_tft() {
+ uint16_t i;
+ //************* Start Initial Sequence **********//
+
+ LCD_IO_Init(FSMC_CS_PIN, FSMC_RS_PIN);
+
+ _delay_ms(5);
+
+ LCD_IO_WriteReg(0x00D3);
+ DeviceCode = ILI9488_ReadRAM(); //dummy read
+ DeviceCode = ILI9488_ReadRAM();
+ DeviceCode = ILI9488_ReadRAM();
+ DeviceCode <<= 8;
+ DeviceCode |= ILI9488_ReadRAM();
+
+ if (DeviceCode == 0x9488) {
+ LCD_IO_WriteReg(0x00E0);
+ LCD_IO_WriteData(0x0000);
+ LCD_IO_WriteData(0x0007);
+ LCD_IO_WriteData(0x000f);
+ LCD_IO_WriteData(0x000D);
+ LCD_IO_WriteData(0x001B);
+ LCD_IO_WriteData(0x000A);
+ LCD_IO_WriteData(0x003c);
+ LCD_IO_WriteData(0x0078);
+ LCD_IO_WriteData(0x004A);
+ LCD_IO_WriteData(0x0007);
+ LCD_IO_WriteData(0x000E);
+ LCD_IO_WriteData(0x0009);
+ LCD_IO_WriteData(0x001B);
+ LCD_IO_WriteData(0x001e);
+ LCD_IO_WriteData(0x000f);
+
+ LCD_IO_WriteReg(0x00E1);
+ LCD_IO_WriteData(0x0000);
+ LCD_IO_WriteData(0x0022);
+ LCD_IO_WriteData(0x0024);
+ LCD_IO_WriteData(0x0006);
+ LCD_IO_WriteData(0x0012);
+ LCD_IO_WriteData(0x0007);
+ LCD_IO_WriteData(0x0036);
+ LCD_IO_WriteData(0x0047);
+ LCD_IO_WriteData(0x0047);
+ LCD_IO_WriteData(0x0006);
+ LCD_IO_WriteData(0x000a);
+ LCD_IO_WriteData(0x0007);
+ LCD_IO_WriteData(0x0030);
+ LCD_IO_WriteData(0x0037);
+ LCD_IO_WriteData(0x000f);
+
+ LCD_IO_WriteReg(0x00C0);
+ LCD_IO_WriteData(0x0010);
+ LCD_IO_WriteData(0x0010);
+
+ LCD_IO_WriteReg(0x00C1);
+ LCD_IO_WriteData(0x0041);
+
+ LCD_IO_WriteReg(0x00C5);
+ LCD_IO_WriteData(0x0000);
+ LCD_IO_WriteData(0x0022);
+ LCD_IO_WriteData(0x0080);
+
+ LCD_IO_WriteReg(0x0036);
+ //ILI9488_WriteData(0x0068);
+ //if (gCfgItems.overturn_180 != 0xEE)
+ //{
+ LCD_IO_WriteData(0x0068);
+ //}
+ //else
+ //{
+ //ILI9488_WriteData(0x00A8);
+ //}
+
+ LCD_IO_WriteReg(0x003A); //Interface Mode Control
+ LCD_IO_WriteData(0x0055);
+
+ LCD_IO_WriteReg(0x00B0); //Interface Mode Control
+ LCD_IO_WriteData(0x0000);
+ LCD_IO_WriteReg(0x00B1); //Frame rate 70HZ
+ LCD_IO_WriteData(0x00B0);
+ LCD_IO_WriteData(0x0011);
+ LCD_IO_WriteReg(0x00B4);
+ LCD_IO_WriteData(0x0002);
+ LCD_IO_WriteReg(0x00B6); //RGB/MCU Interface Control
+ LCD_IO_WriteData(0x0002);
+ LCD_IO_WriteData(0x0042);
+
+ LCD_IO_WriteReg(0x00B7);
+ LCD_IO_WriteData(0x00C6);
+
+ //WriteComm(0xBE);
+ //WriteData(0x00);
+ //WriteData(0x04);
+
+ LCD_IO_WriteReg(0x00E9);
+ LCD_IO_WriteData(0x0000);
+
+ LCD_IO_WriteReg(0x00F7);
+ LCD_IO_WriteData(0x00A9);
+ LCD_IO_WriteData(0x0051);
+ LCD_IO_WriteData(0x002C);
+ LCD_IO_WriteData(0x0082);
+
+ LCD_IO_WriteReg(0x0011);
+ for (i = 0; i < 65535; i++);
+ LCD_IO_WriteReg(0x0029);
+
+ ili9320_SetWindows(0, 0, 480, 320);
+ LCD_Clear(0x0000);
+
+ OUT_WRITE(LCD_BACKLIGHT_PIN, HIGH);
+ }
+ }
+
+ #endif // if DISABLED(SPI_GRAPHICAL_TFT)
+
+ extern uint8_t bmp_public_buf[17 * 1024];
+ void tft_lvgl_init() {
+ //uint16_t test_id=0;
+ W25QXX.init(SPI_QUARTER_SPEED);
+ //test_id=W25QXX.W25QXX_ReadID();
+ #if ENABLED(SDSUPPORT)
+ UpdatePic();
+ UpdateFont();
+ #endif
+
+ gCfgItems_init();
+ ui_cfg_init();
+ disp_language_init();
+ //spi_flash_read_test();
+
+ #if ENABLED(SPI_GRAPHICAL_TFT)
+ SPI_TFT.spi_init(SPI_FULL_SPEED);
+ SPI_TFT.LCD_init();
+ #else
+ init_tft();
+ #endif
+
+ lv_init();
+
+ lv_disp_buf_init(&disp_buf, bmp_public_buf, NULL, LV_HOR_RES_MAX * 18); /*Initialize the display buffer*/
+
+ lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/
+ lv_disp_drv_init(&disp_drv); /*Basic initialization*/
+ disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/
+ disp_drv.buffer = &disp_buf; /*Assign the buffer to the display*/
+ lv_disp_drv_register(&disp_drv); /*Finally register the driver*/
+
+ lv_indev_drv_t indev_drv;
+ lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/
+ indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/
+ indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/
+ lv_indev_drv_register(&indev_drv); /*Finally register the driver*/
+
+ systick_attach_callback(SysTick_Callback);
+
+ init_gb2312_font();
+
+ tft_style_init();
+
+ filament_pin_setup();
+
+ #if ENABLED(POWER_LOSS_RECOVERY)
+ if (recovery.valid()) {
+ if (gCfgItems.from_flash_pic == 1)
+ flash_preview_begin = 1;
+ else
+ default_preview_flg = 1;
+
+ uiCfg.print_state = REPRINTING;
+
+ memset(public_buf_m, 0, sizeof(public_buf_m));
+ strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m));
+ card.printLongPath(public_buf_m);
+
+ strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id]));
+
+ lv_draw_printing();
+ }
+ else
+ #endif
+ lv_draw_ready_print();
+
+ #if ENABLED(MKS_TEST)
+ Test_GPIO();
+ #endif
+ }
+
+ #if 0
+ void LCD_WriteRAM(uint16_t RGB_Code) {
+ #if 0
+ ClrCs
+ /* Write 16-bit GRAM Reg */
+ LCD->LCD_RAM = RGB_Code;
+ SetCs
+ #else
+ LCD_IO_WriteData(RGB_Code);
+ #endif
+ }
+ #endif
+
+ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) {
+ #if ENABLED(SPI_GRAPHICAL_TFT)
+ uint16_t i, width, height;
+ uint16_t clr_temp;
+ uint8_t tbuf[480 * 2];
+
+ SPI_TFT.spi_init(SPI_FULL_SPEED);
+
+ width = area->x2 - area->x1 + 1;
+ height = area->y2 - area->y1 + 1;
+
+ for (int j = 0; j < height; j++) {
+ SPI_TFT.SetCursor(0, 0);
+ SPI_TFT.SetWindows((uint16_t)area->x1, (uint16_t)area->y1 + j, width, 1);
+ SPI_TFT.LCD_WriteRAM_Prepare();
+
+ for (i = 0; i < width * 2;) {
+ clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11)
+ | ((uint16_t)color_p->ch.green << 5)
+ | ((uint16_t)color_p->ch.blue));
+
+ tbuf[i] = clr_temp >> 8;
+ tbuf[i + 1] = clr_temp;
+ i += 2;
+ color_p++;
+ }
+ SPI_TFT_CS_L;
+ SPI_TFT_DC_H;
+ SPI.dmaSend(tbuf, width * 2, true);
+ SPI_TFT_CS_H;
+ }
+
+ lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/
+
+ W25QXX.init(SPI_QUARTER_SPEED);
+ #else
+ #if 1
+ uint16_t i, width, height;
+ uint16_t clr_temp;
+ #if 0
+ int32_t x, y;
+ for (y = area->y1; y <= area->y2; y++)
+ for (x = area->x1; x <= area->x2; x++) {
+ //set_pixel(x, y, *color_p); /* Put a pixel to the display.*/
+ clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11)
+ | ((uint16_t)color_p->ch.green << 5)
+ | ((uint16_t)color_p->ch.blue));
+ tft_set_point(x, y, clr_temp);
+ color_p++;
+ }
+
+ #else
+ width = area->x2 - area->x1 + 1;
+ height = area->y2 - area->y1 + 1;
+ //tft_set_cursor((uint16_t)area->x1,(uint16_t)area->y1);
+ ili9320_SetWindows((uint16_t)area->x1, (uint16_t)area->y1, width, height);
+ LCD_WriteRAM_Prepare();
+ for (i = 0; i < width * height; i++) {
+ clr_temp = (uint16_t)(((uint16_t)color_p->ch.red << 11)
+ | ((uint16_t)color_p->ch.green << 5)
+ | ((uint16_t)color_p->ch.blue));
+ LCD_IO_WriteData(clr_temp);
+ color_p++;
+ }
+ #endif
+
+ lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/
+ #endif
+ #endif // SPI_GRAPHICAL_TFT
+ }
+
+ #define TICK_CYCLE 1
+
+ static int32_t touch_time1 = 0;
+
+ unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) {
+ if (lastTick <= curTick)
+ return (curTick - lastTick) * TICK_CYCLE;
+ else
+ return (0xFFFFFFFF - lastTick + curTick) * TICK_CYCLE;
+ }
+
+ #if ENABLED(SPI_GRAPHICAL_TFT)
+
+ #ifndef USE_XPT2046
+ #define USE_XPT2046 1
+ #define XPT2046_XY_SWAP 1
+ #define XPT2046_X_INV 1
+ #define XPT2046_Y_INV 0
+ #endif
+
+ #if USE_XPT2046
+ #define XPT2046_HOR_RES 480
+ #define XPT2046_VER_RES 320
+ #define XPT2046_X_MIN 201
+ #define XPT2046_Y_MIN 164
+ #define XPT2046_X_MAX 3919
+ #define XPT2046_Y_MAX 3776
+ #define XPT2046_AVG 4
+ #define XPT2046_INV 1
+ #endif
+
+ #else
+
+ #ifndef USE_XPT2046
+ #define USE_XPT2046 1
+ #define XPT2046_XY_SWAP 1
+ #define XPT2046_X_INV 0
+ #define XPT2046_Y_INV 1
+ #endif
+
+ #if USE_XPT2046
+ #define XPT2046_HOR_RES 480
+ #define XPT2046_VER_RES 320
+ #define XPT2046_X_MIN 201
+ #define XPT2046_Y_MIN 164
+ #define XPT2046_X_MAX 3919
+ #define XPT2046_Y_MAX 3776
+ #define XPT2046_AVG 4
+ #define XPT2046_INV 0
+ #endif
+
+ #endif
+
+ static void xpt2046_corr(uint16_t *x, uint16_t *y) {
+ #if XPT2046_XY_SWAP
+ int16_t swap_tmp;
+ swap_tmp = *x;
+ *x = *y;
+ *y = swap_tmp;
+ #endif
+ if ((*x) > XPT2046_X_MIN) (*x) -= XPT2046_X_MIN; else (*x) = 0;
+ if ((*y) > XPT2046_Y_MIN) (*y) -= XPT2046_Y_MIN; else (*y) = 0;
+ (*x) = uint32_t(uint32_t(*x) * XPT2046_HOR_RES) / (XPT2046_X_MAX - XPT2046_X_MIN);
+ (*y) = uint32_t(uint32_t(*y) * XPT2046_VER_RES) / (XPT2046_Y_MAX - XPT2046_Y_MIN);
+ #if XPT2046_X_INV
+ (*x) = XPT2046_HOR_RES - (*x);
+ #endif
+ #if XPT2046_Y_INV
+ (*y) = XPT2046_VER_RES - (*y);
+ #endif
+ }
+
+ #define times 4
+ #define CHX 0x90// 0x90
+ #define CHY 0xD0// 0xD0
+
+ int SPI2_ReadWrite2Bytes(void) {
+ volatile uint16_t ans = 0;
+ uint16_t temp = 0;
+ #if ENABLED(SPI_GRAPHICAL_TFT)
+ temp = SPI_TFT.spi_read_write_byte(0xFF);
+ ans = temp << 8;
+ temp = SPI_TFT.spi_read_write_byte(0xFF);
+ ans |= temp;
+ ans >>= 3;
+ #else
+ temp = W25QXX.spi_flash_read_write_byte(0xFF);
+ ans = temp << 8;
+ temp = W25QXX.spi_flash_read_write_byte(0xFF);
+ ans |= temp;
+ ans >>= 3;
+ #endif
+ return ans & 0x0FFF;
+ }
+
+ uint16_t x_addata[times], y_addata[times];
+ void XPT2046_Rd_Addata(uint16_t *X_Addata, uint16_t *Y_Addata) {
+ uint16_t i, j, k;
+ //int result;
+ //#if ENABLED(TOUCH_BUTTONS)
+
+ #if ENABLED(SPI_GRAPHICAL_TFT)
+ SPI_TFT.spi_init(SPI_QUARTER_SPEED);
+ #endif
+
+ for (i = 0; i < times; i++) {
+ #if ENABLED(SPI_GRAPHICAL_TFT)
+ OUT_WRITE(TOUCH_CS_PIN, LOW);
+ SPI_TFT.spi_read_write_byte(CHX);
+ y_addata[i] = SPI2_ReadWrite2Bytes();
+ WRITE(TOUCH_CS_PIN, HIGH);
+
+ OUT_WRITE(TOUCH_CS_PIN, LOW);
+ SPI_TFT.spi_read_write_byte(CHY);
+ x_addata[i] = SPI2_ReadWrite2Bytes();
+ WRITE(TOUCH_CS_PIN, HIGH);
+ #else // #if ENABLED(TOUCH_BUTTONS)
+ OUT_WRITE(TOUCH_CS_PIN, LOW);
+ W25QXX.spi_flash_read_write_byte(CHX);
+ y_addata[i] = SPI2_ReadWrite2Bytes();
+ WRITE(TOUCH_CS_PIN, HIGH);
+
+ OUT_WRITE(TOUCH_CS_PIN, LOW);
+ W25QXX.spi_flash_read_write_byte(CHY);
+ x_addata[i] = SPI2_ReadWrite2Bytes();
+ WRITE(TOUCH_CS_PIN, HIGH);
+ #endif
+
+ }
+ //#endif
+ //result = x_addata[0];
+ for (i = 0; i < times; i++)
+ for (j = i + 1; j < times; j++)
+ if (x_addata[j] > x_addata[i]) {
+ k = x_addata[j];
+ x_addata[j] = x_addata[i];
+ x_addata[i] = k;
+ }
+ if (x_addata[times / 2 - 1] - x_addata[times / 2] > 50) {
+ *X_Addata = *Y_Addata = 0;
+ return;
+ }
+
+ *X_Addata = (x_addata[times / 2 - 1] + x_addata[times / 2]) / 2;
+
+ //result = y_addata[0];
+ for (i = 0; i < times; i++)
+ for (j = i + 1; j < times; j++)
+ if (y_addata[j] > y_addata[i]) {
+ k = y_addata[j];
+ y_addata[j] = y_addata[i];
+ y_addata[i] = k;
+ }
+
+ if (y_addata[times / 2 - 1] - y_addata[times / 2] > 50) {
+ *X_Addata = *Y_Addata = 0;
+ return;
+ }
+
+ *Y_Addata = (y_addata[times / 2 - 1] + y_addata[times / 2]) / 2;
+ }
+
+ #define ADC_VALID_OFFSET 10
+
+ uint8_t TOUCH_PressValid(uint16_t _usX, uint16_t _usY) {
+ if ((_usX <= ADC_VALID_OFFSET) || (_usY <= ADC_VALID_OFFSET)
+ || (_usX >= 4095 - ADC_VALID_OFFSET) || (_usY >= 4095 - ADC_VALID_OFFSET)
+ ) return 0;
+
+ return 1;
+ }
+
+ static lv_coord_t last_x = 0, last_y = 0;
+ bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) {
+ #if 1
+ uint32_t tmpTime, diffTime = 0;
+
+ tmpTime = millis();
+ diffTime = getTickDiff(tmpTime, touch_time1);
+ /*Save the state and save the pressed coordinate*/
+ //data->state = TOUCH_PressValid(last_x, last_y) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
+ //if (data->state == LV_INDEV_STATE_PR) ADS7843_Rd_Addata((u16 *)&last_x, (u16 *)&last_y);
+ //touchpad_get_xy(&last_x, &last_y);
+ /*Save the pressed coordinates and the state*/
+ if (diffTime > 10) {
+ XPT2046_Rd_Addata((uint16_t *)&last_x, (uint16_t *)&last_y);
+ if (TOUCH_PressValid(last_x, last_y)) {
+
+ data->state = LV_INDEV_STATE_PR;
+
+ /*Set the coordinates (if released use the last pressed coordinates)*/
+
+ xpt2046_corr((uint16_t *)&last_x, (uint16_t *)&last_y);
+ data->point.x = last_x;
+ data->point.y = last_y;
+
+ }
+ else {
+ data->state = LV_INDEV_STATE_REL;
+ }
+ touch_time1 = tmpTime;
+ }
+
+ return false; /*Return `false` because we are not buffering and no more data to read*/
+ #endif
+ }
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h
new file mode 100644
index 0000000000..c1e40e77f3
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h
@@ -0,0 +1,46 @@
+/**
+ * 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
+
+/**
+ * @file tft_lvgl_configuration.h
+ * @date 2020-02-21
+ * */
+
+//#ifdef __cplusplus
+//extern "C" {
+//#endif
+
+#include "lvgl.h"
+
+void tft_lvgl_init();
+void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p);
+bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data);
+
+void LCD_Clear(uint16_t Color);
+void tft_set_point(uint16_t x, uint16_t y, uint16_t point);
+void ili9320_SetWindows(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh);
+void LCD_WriteRAM_Prepare(void);
+
+//#ifdef __cplusplus
+//} /* extern "C" */
+//#endif
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp
new file mode 100644
index 0000000000..9874d2406b
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp
@@ -0,0 +1,1903 @@
+/**
+ * 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 ENABLED(TFT_LITTLE_VGL_UI)
+
+#include "../../../../MarlinCore.h"
+
+#include "draw_ui.h"
+#include "tft_multi_language.h"
+
+//********************************************//
+
+//*********************************************//
+
+common_menu_def common_menu;
+main_menu_def main_menu;
+preheat_menu_def preheat_menu;
+move_menu_def move_menu;
+home_menu_def home_menu;
+file_menu_def file_menu;
+extrude_menu_def extrude_menu;
+leveling_menu_def leveling_menu;
+set_menu_def set_menu;
+more_menu_def more_menu;
+wifi_menu_def wifi_menu;
+cloud_menu_def cloud_menu;
+about_menu_def about_menu;
+fan_menu_def fan_menu;
+filament_menu_def filament_menu;
+printing_menu_def printing_menu;
+operation_menu_def operation_menu;
+pause_menu_def pause_menu;
+speed_menu_def speed_menu;
+printing_more_menu_def printing_more_menu;
+dialog_menu_def dialog_menu;
+language_menu_def language_menu;
+print_file_dialog_menu_def print_file_dialog_menu;
+filesys_menu_def filesys_menu;
+zoffset_menu_def zoffset_menu;
+tool_menu_def tool_menu;
+MachinePara_menu_def MachinePara_menu;
+MachineSettings_menu_def MachineSettings_menu;
+TemperatureSettings_menu_def TemperatureSettings_menu;
+pause_msg_def pause_msg_menu;
+
+void disp_language_init() {
+ preheat_menu.value_state = TEXT_VALUE;
+ preheat_menu.step_1c = TEXT_1C;
+ preheat_menu.step_5c = TEXT_5C;
+ preheat_menu.step_10c = TEXT_10C;
+
+ move_menu.x_add = AXIS_X_ADD_TEXT;
+ move_menu.x_dec = AXIS_X_DEC_TEXT;
+ move_menu.y_add = AXIS_Y_ADD_TEXT;
+ move_menu.y_dec = AXIS_Y_DEC_TEXT;
+ move_menu.z_add = AXIS_Z_ADD_TEXT;
+ move_menu.z_dec = AXIS_Z_DEC_TEXT;
+
+ move_menu.step_001mm = TEXT_001MM;
+ move_menu.step_005mm = TEXT_005MM;
+ move_menu.step_01mm = TEXT_01MM;
+ move_menu.step_1mm = TEXT_1MM;
+ move_menu.step_10mm = TEXT_10MM;
+
+ home_menu.home_x = HOME_X_TEXT;
+ home_menu.home_y = HOME_Y_TEXT;
+ home_menu.home_z = HOME_Z_TEXT;
+ home_menu.home_all = HOME_ALL_TEXT;
+
+ extrude_menu.temp_value = TEXT_VALUE_T;
+ extrude_menu.count_value_mm = TEXT_VALUE_mm;
+ extrude_menu.count_value_cm = TEXT_VALUE_cm;
+ extrude_menu.count_value_m = TEXT_VALUE_m;
+ extrude_menu.step_1mm = EXTRUDE_1MM_TEXT;
+ extrude_menu.step_5mm = EXTRUDE_5MM_TEXT;
+ extrude_menu.step_10mm = EXTRUDE_10MM_TEXT;
+
+ fan_menu.full = FAN_OPEN_TEXT;
+ fan_menu.half = FAN_HALF_TEXT;
+ fan_menu.off = FAN_CLOSE_TEXT;
+
+ speed_menu.step_1percent = STEP_1PERCENT;
+ speed_menu.step_5percent = STEP_5PERCENT;
+ speed_menu.step_10percent = STEP_10PERCENT;
+
+ language_menu.chinese_s = LANGUAGE_S_CN;
+ language_menu.chinese_t = LANGUAGE_T_CN;
+ language_menu.english = LANGUAGE_EN;
+ language_menu.russian = LANGUAGE_RU;
+ language_menu.spanish = LANGUAGE_SP;
+ language_menu.german = LANGUAGE_GE;
+ language_menu.japan = LANGUAGE_JP;
+ language_menu.korean = LANGUAGE_KR;
+ language_menu.portuguese = LANGUAGE_PR;
+ language_menu.italy = LANGUAGE_IT;
+ language_menu.brazil = LANGUAGE_BR;
+ language_menu.french = LANGUAGE_FR;
+
+ about_menu.type_name = ABOUT_TYPE_TEXT;
+ about_menu.firmware_v = ABOUT_VERSION_TEXT;
+ //about_menu.wifi = ABOUT_WIFI_TEXT;
+
+ wifi_menu.ip = WIFI_IP_TEXT;
+ wifi_menu.wifi = WIFI_NAME_TEXT;
+ wifi_menu.key = WIFI_KEY_TEXT;
+ wifi_menu.state_ap = WIFI_STATE_AP_TEXT;
+ wifi_menu.state_sta = WIFI_STATE_STA_TEXT;
+ wifi_menu.connected = WIFI_CONNECTED_TEXT;
+ wifi_menu.disconnected = WIFI_DISCONNECTED_TEXT;
+ wifi_menu.exception = WIFI_EXCEPTION_TEXT;
+
+ printing_menu.temp1 = TEXT_VALUE;
+ printing_menu.temp2 = TEXT_VALUE;
+ printing_menu.bed_temp = TEXT_VALUE;
+
+ filament_menu.stat_temp = TEXT_VALUE;
+
+ zoffset_menu.step001 = ZOFFSET_STEP001;
+ zoffset_menu.step01 = ZOFFSET_STEP01;
+ zoffset_menu.step1 = ZOFFSET_STEP1;
+
+ //wifi-list
+ #if 0
+ list_menu.title = TEXT_WIFI_MENU_TITLE_EN;
+ list_menu.file_pages = FILE_PAGES_EN;
+ //keyboard
+ keyboard_menu.apply = MANUAL_IP_APPLY_EN;
+ keyboard_menu.password = TEXT_WIFI_PASSWORD_EN;
+ keyboard_menu.space = TEXT_WIFI_SAPCE_EN;
+ keyboard_menu.letter = TEXT_WIFI_LETTER_EN;
+ keyboard_menu.digital = TEXT_WIFI_DIGITAL_EN;
+ keyboard_menu.symbol = TEXT_WIFI_SYMBOL_EN;
+ //tips
+ tips_menu.pointBold = TEXT_WIFI_POINT_BOLD_EN;
+ tips_menu.joining = TEXT_WIFI_JOINING_EN;
+ tips_menu.failedJoin = TEXT_WIFI_FAILED_JOIN_EN;
+ tips_menu.wifiConected = TEXT_WIFI_WIFI_CONECTED_EN;
+ #endif
+ operation_menu.babystep = TEXT_BABY_STEP_EN;
+
+ switch (gCfgItems.language) {
+ case LANG_SIMPLE_CHINESE:
+ common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_CN;
+ common_menu.text_back = BACK_TEXT_CN;
+ common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_CN;
+ common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_CN;
+ common_menu.print_special_title = PRINTING_GBK;
+ common_menu.pause_special_title = PRINTING_PAUSE_GBK;
+ common_menu.operate_special_title = PRINTING_OPERATION_GBK;
+ //
+ main_menu.title = TITLE_READYPRINT_CN;
+ main_menu.preheat = PREHEAT_TEXT_CN;
+ main_menu.move = MOVE_TEXT_CN;
+ main_menu.home = HOME_TEXT_CN;
+ main_menu.print = PRINT_TEXT_CN;
+ main_menu.extrude = EXTRUDE_TEXT_CN;
+ main_menu.leveling = LEVELING_TEXT_CN;
+ main_menu.autoleveling = AUTO_LEVELING_TEXT_CN;
+ main_menu.fan = FAN_TEXT_CN;
+ main_menu.set = SET_TEXT_CN;
+ main_menu.more = MORE_TEXT_CN;
+ main_menu.tool = TOOL_TEXT_CN;
+ //TOOL
+ tool_menu.title = TOOL_TEXT_CN;
+ tool_menu.preheat = TOOL_PREHEAT_CN;
+ tool_menu.extrude = TOOL_EXTRUDE_CN;
+ tool_menu.move = TOOL_MOVE_CN;
+ tool_menu.home = TOOL_HOME_CN;
+ tool_menu.leveling = TOOL_LEVELING_CN;
+ tool_menu.autoleveling = TOOL_AUTO_LEVELING_CN;
+ tool_menu.filament = TOOL_FILAMENT_CN;
+ tool_menu.more = TOOL_MORE_CN;
+ //
+ preheat_menu.adjust_title = TITLE_ADJUST_CN;
+ preheat_menu.title = TITLE_PREHEAT_CN;
+ preheat_menu.add = ADD_TEXT_CN;
+ preheat_menu.dec = DEC_TEXT_CN;
+ preheat_menu.ext1 = EXTRUDER_1_TEXT_CN;
+ preheat_menu.ext2 = EXTRUDER_2_TEXT_CN;
+ preheat_menu.hotbed = HEATBED_TEXT_CN;
+ preheat_menu.off = CLOSE_TEXT_CN;
+
+ preheat_menu.value_state = TEXT_VALUE_CN;
+ preheat_menu.step_1c = TEXT_1C_CN;
+ preheat_menu.step_5c = TEXT_5C_CN;
+ preheat_menu.step_10c = TEXT_10C_CN;
+ //
+ move_menu.title = MOVE_TEXT_CN;
+ //
+ home_menu.title = TITLE_HOME_CN;
+ home_menu.stopmove = HOME_STOPMOVE_CN;
+ //
+ file_menu.title = TITLE_CHOOSEFILE_CN;
+ file_menu.page_up = PAGE_UP_TEXT_CN;
+ file_menu.page_down = PAGE_DOWN_TEXT_CN;
+ file_menu.file_loading = FILE_LOADING_CN;
+ file_menu.no_file = NO_FILE_CN;
+ file_menu.no_file_and_check = NO_FILE_CN;//NO_FILE_AND_CHECK_CN;
+ //
+ extrude_menu.title = TITLE_EXTRUDE_CN;
+ extrude_menu.in = EXTRUDER_IN_TEXT_CN;
+ extrude_menu.out = EXTRUDER_OUT_TEXT_CN;
+ extrude_menu.ext1 = EXTRUDER_1_TEXT_CN;
+ extrude_menu.ext2 = EXTRUDER_2_TEXT_CN;
+ extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_CN;
+ extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_CN;
+ extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_CN;
+ extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_CN;
+ extrude_menu.temp_value = EXTRUDE_TEXT_VALUE_T_CN;
+ //
+ leveling_menu.title = TITLE_LEVELING_CN;
+ leveling_menu.position1 = LEVELING_POINT1_TEXT_CN;
+ leveling_menu.position2 = LEVELING_POINT2_TEXT_CN;
+ leveling_menu.position3 = LEVELING_POINT3_TEXT_CN;
+ leveling_menu.position4 = LEVELING_POINT4_TEXT_CN;
+ leveling_menu.position5 = LEVELING_POINT5_TEXT_CN;
+ //
+ set_menu.title = TITLE_SET_CN;
+ set_menu.filesys = FILESYS_TEXT_CN;
+ set_menu.wifi = WIFI_TEXT_CN;
+ set_menu.about = ABOUT_TEXT_CN;
+ set_menu.fan = FAN_TEXT_CN;
+ set_menu.filament = FILAMENT_TEXT_CN;
+ set_menu.breakpoint = BREAK_POINT_TEXT_CN;
+ set_menu.motoroff = MOTOR_OFF_TEXT_CN;
+ set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_CN;
+ set_menu.language = LANGUAGE_TEXT_CN;
+ set_menu.shutdown = SHUTDOWN_TEXT_CN;
+ //set_menu.machine_para = MACHINE_PARA_CN;
+
+ //
+ filesys_menu.title = TITLE_FILESYS_CN;
+ filesys_menu.sd_sys = SD_CARD_TEXT_CN;
+ filesys_menu.usb_sys = U_DISK_TEXT_CN;
+ //
+ more_menu.title = TITLE_MORE_CN;
+ more_menu.zoffset = ZOFFSET_CN;
+ //WIFI
+ wifi_menu.title = WIFI_TEXT;
+ //wifi_menu.key = WIFI_KEY_TEXT_CN;
+ //wifi_menu.ip = WIFI_IP_TEXT_CN;
+ //wifi_menu.state = WIFI_STA_TEXT_CN;
+ wifi_menu.cloud = CLOUD_TEXT_CN;
+ wifi_menu.reconnect = WIFI_RECONNECT_TEXT_CN;
+ //CLOUD
+ cloud_menu.title = TITLE_CLOUD_TEXT_CN;
+ cloud_menu.bind = CLOUD_BINDED_CN;
+ cloud_menu.binded = CLOUD_BINDED_CN;
+ cloud_menu.unbind = CLOUD_UNBIND_CN;
+ cloud_menu.unbinding = CLOUD_UNBINDED_CN;
+ cloud_menu.disconnected = CLOUD_DISCONNECTED_CN;
+ cloud_menu.disable = CLOUD_DISABLE_CN;
+ //
+ about_menu.title = ABOUT_TEXT_CN;
+ about_menu.type = ABOUT_TYPE_TEXT_CN;
+ about_menu.version = ABOUT_VERSION_TEXT_CN;
+ about_menu.wifi = ABOUT_WIFI_TEXT_CN;
+
+ //
+ fan_menu.title = FAN_TEXT_CN;
+ fan_menu.add = FAN_ADD_TEXT_CN;
+ fan_menu.dec = FAN_DEC_TEXT_CN;
+ fan_menu.state = FAN_TIPS1_TEXT_CN;
+ //
+ filament_menu.title = TITLE_FILAMENT_CN;
+ filament_menu.in = FILAMENT_IN_TEXT_CN;
+ filament_menu.out = FILAMENT_OUT_TEXT_CN;
+ filament_menu.ext1 = FILAMENT_EXT0_TEXT_CN;
+ filament_menu.ext2 = FILAMENT_EXT1_TEXT_CN;
+ filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_CN;
+ filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_CN;
+ filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_CN;
+ filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_CN;
+ filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_CN;
+ filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_CN;
+ filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_CN;
+ filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_CN;
+ filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_CN;
+
+
+ //
+ language_menu.title = TITLE_LANGUAGE_CN;
+ language_menu.next = PAGE_DOWN_TEXT_CN;
+ language_menu.up = PAGE_UP_TEXT_CN;
+
+ //
+ printing_menu.title = TITLE_PRINTING_CN;
+ printing_menu.option = PRINTING_OPERATION_CN;
+ printing_menu.stop = PRINTING_STOP_CN;
+ printing_menu.pause = PRINTING_PAUSE_CN;
+ printing_menu.resume = PRINTING_RESUME_CN;
+
+ //
+ operation_menu.title = TITLE_OPERATION_CN;
+ operation_menu.pause = PRINTING_PAUSE_CN;
+ operation_menu.stop = PRINTING_STOP_CN;
+ operation_menu.temp = PRINTING_TEMP_CN;
+ operation_menu.fan = FAN_TEXT_CN;
+ operation_menu.filament = FILAMENT_TEXT_CN;
+ operation_menu.extr = PRINTING_EXTRUDER_CN;
+ operation_menu.speed = PRINTING_CHANGESPEED_CN;
+ operation_menu.more = PRINTING_MORE_CN;
+ operation_menu.move = PRINTING_MOVE_CN;
+ operation_menu.auto_off = AUTO_SHUTDOWN_CN;
+ operation_menu.manual_off = MANUAL_SHUTDOWN_CN;
+ //
+ pause_menu.title = TITLE_PAUSE_CN;
+ pause_menu.resume = PRINTING_RESUME_CN;
+ pause_menu.stop = PRINTING_STOP_CN;
+ pause_menu.extrude = PRINTING_EXTRUDER_CN;
+ pause_menu.move = PRINTING_MOVE_CN;
+ pause_menu.filament = FILAMENT_TEXT_CN;
+ pause_menu.more = PRINTING_MORE_CN;
+
+ //
+ speed_menu.title = PRINTING_CHANGESPEED_CN;
+ speed_menu.add = ADD_TEXT_CN;
+ speed_menu.dec = DEC_TEXT_CN;
+ speed_menu.move = MOVE_SPEED_CN;
+ speed_menu.extrude = EXTRUDER_SPEED_CN;
+ speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_CN;
+ speed_menu.move_speed = MOVE_SPEED_STATE_CN;
+ //
+ printing_more_menu.title = TITLE_MORE_CN;
+ printing_more_menu.fan = FAN_TEXT_CN;
+ printing_more_menu.auto_close = AUTO_SHUTDOWN_CN;
+ printing_more_menu.manual = MANUAL_SHUTDOWN_CN;
+ printing_more_menu.speed = PRINTING_CHANGESPEED_CN;
+ printing_more_menu.temp = PRINTING_TEMP_CN;
+
+ //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN;
+ print_file_dialog_menu.confirm = DIALOG_CONFIRM_CN;
+ print_file_dialog_menu.cancle = DIALOG_CANCLE_CN;
+ print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_CN;
+ print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_CN;
+ print_file_dialog_menu.retry = DIALOG_RETRY_CN;
+ print_file_dialog_menu.stop = DIALOG_STOP_CN;
+ print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_CN;
+ print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_CN;
+
+ print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_CN;
+ print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_CN;
+
+ print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_CN;
+ print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_CN;
+ print_file_dialog_menu.reprint = DIALOG_REPRINT_CN;
+ print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_CN;
+
+ //ZOFFSET
+ zoffset_menu.title = TITLE_ZOFFSET_CN;
+ zoffset_menu.inc = ZOFFSET_INC_CN;
+ zoffset_menu.dec = ZOFFSET_DEC_CN;
+
+ pause_msg_menu.pausing = MESSEGE_PAUSING_CN;
+ pause_msg_menu.changing = MESSEGE_CHANGING_CN;
+ pause_msg_menu.unload = MESSEGE_UNLOAD_CN;
+ pause_msg_menu.waiting = MESSEGE_WAITING_CN;
+ pause_msg_menu.insert = MESSEGE_INSERT_CN;
+ pause_msg_menu.load = MESSEGE_LOAD_CN;
+ pause_msg_menu.purge = MESSEGE_PURGE_CN;
+ pause_msg_menu.resume = MESSEGE_RESUME_CN;
+ pause_msg_menu.heat = MESSEGE_HEAT_CN;
+ pause_msg_menu.heating = MESSEGE_HEATING_CN;
+ pause_msg_menu.option = MESSEGE_OPTION_CN;
+ pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_CN;
+ pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_CN;
+ break;
+
+ #if 1
+ #if 1
+
+ case LANG_COMPLEX_CHINESE:
+ common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_T_CN;
+ common_menu.text_back = BACK_TEXT_T_CN;
+ common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_T_CN;
+ common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_T_CN;
+ common_menu.print_special_title = PRINTING_GBK;
+ common_menu.pause_special_title = PRINTING_PAUSE_GBK;
+ common_menu.operate_special_title = PRINTING_OPERATION_GBK;
+ //
+ main_menu.title = TITLE_READYPRINT_T_CN;
+ main_menu.preheat = PREHEAT_TEXT_T_CN;
+ main_menu.move = MOVE_TEXT_T_CN;
+ main_menu.home = HOME_TEXT_T_CN;
+ main_menu.print = PRINT_TEXT_T_CN;
+ main_menu.extrude = EXTRUDE_TEXT_T_CN;
+ main_menu.leveling = LEVELING_TEXT_T_CN;
+ main_menu.autoleveling = AUTO_LEVELING_TEXT_T_CN;
+ main_menu.fan = FAN_TEXT_T_CN;
+ main_menu.set = SET_TEXT_T_CN;
+ main_menu.more = MORE_TEXT_T_CN;
+ main_menu.tool = TOOL_TEXT_T_CN;
+ //TOOL
+ tool_menu.title = TOOL_TEXT_T_CN;
+ tool_menu.preheat = TOOL_PREHEAT_T_CN;
+ tool_menu.extrude = TOOL_EXTRUDE_T_CN;
+ tool_menu.move = TOOL_MOVE_T_CN;
+ tool_menu.home = TOOL_HOME_T_CN;
+ tool_menu.leveling = TOOL_LEVELING_T_CN;
+ tool_menu.autoleveling = TOOL_AUTO_LEVELING_T_CN;
+ tool_menu.filament = TOOL_FILAMENT_T_CN;
+ tool_menu.more = TOOL_MORE_T_CN;
+ //
+ preheat_menu.adjust_title = TITLE_ADJUST_T_CN;
+ preheat_menu.title = TITLE_PREHEAT_T_CN;
+ preheat_menu.add = ADD_TEXT_T_CN;
+ preheat_menu.dec = DEC_TEXT_T_CN;
+ preheat_menu.ext1 = EXTRUDER_1_TEXT_T_CN;
+ preheat_menu.ext2 = EXTRUDER_2_TEXT_T_CN;
+ preheat_menu.hotbed = HEATBED_TEXT_T_CN;
+ preheat_menu.off = CLOSE_TEXT_T_CN;
+ preheat_menu.value_state = TEXT_VALUE_T_CN;
+ preheat_menu.step_1c = TEXT_1C_T_CN;
+ preheat_menu.step_5c = TEXT_5C_T_CN;
+ preheat_menu.step_10c = TEXT_10C_T_CN;
+ //
+ move_menu.title = MOVE_TEXT_T_CN;
+ more_menu.zoffset = ZOFFSET_T_CN;
+ //
+ home_menu.title = TITLE_HOME_T_CN;
+ home_menu.stopmove = HOME_STOPMOVE_T_CN;
+ //
+ file_menu.title = TITLE_CHOOSEFILE_T_CN;
+ file_menu.page_up = PAGE_UP_TEXT_T_CN;
+ file_menu.page_down = PAGE_DOWN_TEXT_T_CN;
+ file_menu.file_loading = FILE_LOADING_T_CN;
+ file_menu.no_file = NO_FILE_T_CN;
+ file_menu.no_file_and_check = NO_FILE_T_CN;//NO_FILE_AND_CHECK_T_CN;
+ //
+ extrude_menu.title = TITLE_EXTRUDE_T_CN;
+ extrude_menu.in = EXTRUDER_IN_TEXT_T_CN;
+ extrude_menu.out = EXTRUDER_OUT_TEXT_T_CN;
+ extrude_menu.ext1 = EXTRUDER_1_TEXT_T_CN;
+ extrude_menu.ext2 = EXTRUDER_2_TEXT_T_CN;
+ extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_T_CN;
+ extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_T_CN;
+ extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_T_CN;
+ extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_T_CN;
+ extrude_menu.temp_value = EXTRUDE_TEXT_VALUE_T_T_CN;
+ //
+ leveling_menu.title = TITLE_LEVELING_CN;
+ leveling_menu.position1 = LEVELING_POINT1_TEXT_T_CN;
+ leveling_menu.position2 = LEVELING_POINT2_TEXT_T_CN;
+ leveling_menu.position3 = LEVELING_POINT3_TEXT_T_CN;
+ leveling_menu.position4 = LEVELING_POINT4_TEXT_T_CN;
+ leveling_menu.position5 = LEVELING_POINT5_TEXT_T_CN;
+ //
+ set_menu.title = TITLE_SET_T_CN;
+ set_menu.filesys = FILESYS_TEXT_T_CN;
+ set_menu.wifi = WIFI_TEXT_T_CN;
+ set_menu.about = ABOUT_TEXT_T_CN;
+ set_menu.fan = FAN_TEXT_T_CN;
+ set_menu.filament = FILAMENT_TEXT_T_CN;
+ set_menu.breakpoint = BREAK_POINT_TEXT_T_CN;
+ set_menu.motoroff = MOTOR_OFF_TEXT_T_CN;
+ set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_T_CN;
+ set_menu.language = LANGUAGE_TEXT_T_CN;
+ set_menu.shutdown = SHUTDOWN_TEXT_T_CN;
+ //set_menu.machine_para = MACHINE_PARA_T_CN;
+ //
+ filesys_menu.title = TITLE_FILESYS_T_CN;
+ filesys_menu.sd_sys = SD_CARD_TEXT_T_CN;
+ filesys_menu.usb_sys = U_DISK_TEXT_T_CN;
+ //
+ more_menu.title = TITLE_MORE_T_CN;
+ //WIFI
+ wifi_menu.title = WIFI_TEXT;
+ //wifi_menu.key = WIFI_KEY_TEXT_CN;
+ //wifi_menu.ip = WIFI_IP_TEXT_CN;
+ //wifi_menu.state = WIFI_STA_TEXT_CN;
+ wifi_menu.cloud = CLOUD_TEXT_T_CN;
+ wifi_menu.reconnect = WIFI_RECONNECT_TEXT_T_CN;
+ //CLOUD
+ cloud_menu.title = TITLE_CLOUD_TEXT_T_CN;
+ cloud_menu.bind = CLOUD_BINDED_T_CN;
+ cloud_menu.binded = CLOUD_BINDED_T_CN;
+ cloud_menu.unbind = CLOUD_UNBIND_T_CN;
+ cloud_menu.unbinding = CLOUD_UNBINDED_T_CN;
+ cloud_menu.disconnected = CLOUD_DISCONNECTED_T_CN;
+ cloud_menu.disable = CLOUD_DISABLE_T_CN;
+ //
+ about_menu.title = ABOUT_TEXT_T_CN;
+ about_menu.type = ABOUT_TYPE_TEXT_T_CN;
+ about_menu.version = ABOUT_VERSION_TEXT_T_CN;
+ about_menu.wifi = ABOUT_WIFI_TEXT_T_CN;
+
+ //
+ fan_menu.title = FAN_TEXT_T_CN;
+ fan_menu.add = FAN_ADD_TEXT_T_CN;
+ fan_menu.dec = FAN_DEC_TEXT_T_CN;
+ fan_menu.state = FAN_TIPS1_TEXT_T_CN;
+ //
+ filament_menu.title = TITLE_FILAMENT_T_CN;
+ filament_menu.in = FILAMENT_IN_TEXT_T_CN;
+ filament_menu.out = FILAMENT_OUT_TEXT_T_CN;
+ filament_menu.ext1 = FILAMENT_EXT0_TEXT_T_CN;
+ filament_menu.ext2 = FILAMENT_EXT1_TEXT_T_CN;
+ filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_T_CN;
+ filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_T_CN;
+ filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_T_CN;
+ filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_T_CN;
+ filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_T_CN;
+ filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_T_CN;
+ filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_T_CN;
+ filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_T_CN;
+ filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_T_CN;
+
+
+ //
+ language_menu.title = TITLE_LANGUAGE_T_CN;
+ language_menu.next = PAGE_DOWN_TEXT_T_CN;
+ language_menu.up = PAGE_UP_TEXT_T_CN;
+
+ //
+ printing_menu.title = TITLE_PRINTING_T_CN;
+ printing_menu.option = PRINTING_OPERATION_T_CN;
+ printing_menu.stop = PRINTING_STOP_T_CN;
+ printing_menu.pause = PRINTING_PAUSE_T_CN;
+ printing_menu.resume = PRINTING_RESUME_T_CN;
+
+ //
+ operation_menu.title = TITLE_OPERATION_T_CN;
+ operation_menu.pause = PRINTING_PAUSE_T_CN;
+ operation_menu.stop = PRINTING_STOP_T_CN;
+ operation_menu.temp = PRINTING_TEMP_T_CN;
+ operation_menu.fan = FAN_TEXT_T_CN;
+ operation_menu.extr = PRINTING_EXTRUDER_T_CN;
+ operation_menu.speed = PRINTING_CHANGESPEED_T_CN;
+ operation_menu.filament = FILAMENT_TEXT_T_CN;
+ operation_menu.more = PRINTING_MORE_T_CN;
+ operation_menu.move = PRINTING_MOVE_T_CN;
+ operation_menu.auto_off = AUTO_SHUTDOWN_T_CN;
+ operation_menu.manual_off = MANUAL_SHUTDOWN_T_CN;
+ //
+ pause_menu.title = TITLE_PAUSE_T_CN;
+ pause_menu.resume = PRINTING_RESUME_T_CN;
+ pause_menu.stop = PRINTING_STOP_T_CN;
+ pause_menu.extrude = PRINTING_EXTRUDER_T_CN;
+ pause_menu.move = PRINTING_MOVE_T_CN;
+ pause_menu.filament = FILAMENT_TEXT_T_CN;
+ pause_menu.more = PRINTING_MORE_T_CN;
+
+ //
+ speed_menu.title = PRINTING_CHANGESPEED_T_CN;
+ speed_menu.add = ADD_TEXT_T_CN;
+ speed_menu.dec = DEC_TEXT_T_CN;
+ speed_menu.move = MOVE_SPEED_T_CN;
+ speed_menu.extrude = EXTRUDER_SPEED_T_CN;
+ speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_T_CN;
+ speed_menu.move_speed = MOVE_SPEED_STATE_T_CN;
+ //
+ printing_more_menu.title = TITLE_MORE_T_CN;
+ printing_more_menu.fan = FAN_TEXT_T_CN;
+ printing_more_menu.auto_close = AUTO_SHUTDOWN_T_CN;
+ printing_more_menu.manual = MANUAL_SHUTDOWN_T_CN;
+ printing_more_menu.speed = PRINTING_CHANGESPEED_T_CN;
+ printing_more_menu.temp = PRINTING_TEMP_T_CN;
+
+ //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_CN;
+ print_file_dialog_menu.confirm = DIALOG_CONFIRM_T_CN;
+ print_file_dialog_menu.cancle = DIALOG_CANCLE_T_CN;
+ print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_T_CN;
+ print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_T_CN;
+ print_file_dialog_menu.retry = DIALOG_RETRY_T_CN;
+ print_file_dialog_menu.stop = DIALOG_STOP_T_CN;
+ print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_T_CN;
+ print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_T_CN;
+
+ print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_T_CN;
+ print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_T_CN;
+ print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_T_CN;
+ print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_T_CN;
+ print_file_dialog_menu.reprint = DIALOG_REPRINT_T_CN;
+ print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_T_CN;
+ //ZOFFSET
+ zoffset_menu.title = TITLE_ZOFFSET_T_CN;
+ zoffset_menu.inc = ZOFFSET_INC_T_CN;
+ zoffset_menu.dec = ZOFFSET_DEC_T_CN;
+
+ pause_msg_menu.pausing = MESSEGE_PAUSING_T_CN;
+ pause_msg_menu.changing = MESSEGE_CHANGING_T_CN;
+ pause_msg_menu.unload = MESSEGE_UNLOAD_T_CN;
+ pause_msg_menu.waiting = MESSEGE_WAITING_T_CN;
+ pause_msg_menu.insert = MESSEGE_INSERT_T_CN;
+ pause_msg_menu.load = MESSEGE_LOAD_T_CN;
+ pause_msg_menu.purge = MESSEGE_PURGE_T_CN;
+ pause_msg_menu.resume = MESSEGE_RESUME_T_CN;
+ pause_msg_menu.heat = MESSEGE_HEAT_T_CN;
+ pause_msg_menu.heating = MESSEGE_HEATING_T_CN;
+ pause_msg_menu.option = MESSEGE_OPTION_T_CN;
+ pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_T_CN;
+ pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_T_CN;
+ break;
+ case LANG_ENGLISH:
+ common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_EN;
+ common_menu.text_back = BACK_TEXT_EN;
+ common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_EN;
+ common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_EN;
+ common_menu.print_special_title = PRINTING_OTHER_LANGUGE;
+ common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE;
+ common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE;
+ //
+ main_menu.title = TITLE_READYPRINT_EN;
+ main_menu.preheat = PREHEAT_TEXT_EN;
+ main_menu.move = MOVE_TEXT_EN;
+ main_menu.home = HOME_TEXT_EN;
+ main_menu.print = PRINT_TEXT_EN;
+ main_menu.extrude = EXTRUDE_TEXT_EN;
+ main_menu.leveling = LEVELING_TEXT_EN;
+ main_menu.autoleveling = AUTO_LEVELING_TEXT_EN;
+ main_menu.fan = FAN_TEXT_EN;
+ main_menu.set = SET_TEXT_EN;
+ main_menu.more = MORE_TEXT_EN;
+ main_menu.tool = TOOL_TEXT_EN;
+ //TOOL
+ tool_menu.title = TOOL_TEXT_EN;
+ tool_menu.preheat = TOOL_PREHEAT_EN;
+ tool_menu.extrude = TOOL_EXTRUDE_EN;
+ tool_menu.move = TOOL_MOVE_EN;
+ tool_menu.home = TOOL_HOME_EN;
+ tool_menu.leveling = TOOL_LEVELING_EN;
+ tool_menu.autoleveling = TOOL_AUTO_LEVELING_EN;
+ tool_menu.filament = TOOL_FILAMENT_EN;
+ tool_menu.more = TOOL_MORE_EN;
+ //
+ preheat_menu.adjust_title = TITLE_ADJUST_EN;
+ preheat_menu.title = TITLE_PREHEAT_EN;
+ preheat_menu.add = ADD_TEXT_EN;
+ preheat_menu.dec = DEC_TEXT_EN;
+ preheat_menu.ext1 = EXTRUDER_1_TEXT_EN;
+ preheat_menu.ext2 = EXTRUDER_2_TEXT_EN;
+ preheat_menu.hotbed = HEATBED_TEXT_EN;
+ preheat_menu.off = CLOSE_TEXT_EN;
+ //
+ move_menu.title = TITLE_MOVE_EN;
+ //
+ home_menu.title = TITLE_HOME_EN;
+ home_menu.stopmove = HOME_STOPMOVE_EN;
+ //
+ file_menu.title = TITLE_CHOOSEFILE_EN;
+ file_menu.page_up = PAGE_UP_TEXT_EN;
+ file_menu.page_down = PAGE_DOWN_TEXT_EN;
+ file_menu.file_loading = FILE_LOADING_EN;
+ file_menu.no_file = NO_FILE_EN;
+ file_menu.no_file_and_check = NO_FILE_EN;//NO_FILE_AND_CHECK_EN;
+ //
+ extrude_menu.title = TITLE_EXTRUDE_EN;
+ extrude_menu.in = EXTRUDER_IN_TEXT_EN;
+ extrude_menu.out = EXTRUDER_OUT_TEXT_EN;
+ extrude_menu.ext1 = EXTRUDER_1_TEXT_EN;
+ extrude_menu.ext2 = EXTRUDER_2_TEXT_EN;
+ extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_EN;
+ extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_EN;
+ extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_EN;
+ extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_EN;
+ //
+ leveling_menu.title = TITLE_LEVELING_EN;
+ leveling_menu.position1 = LEVELING_POINT1_TEXT_EN;
+ leveling_menu.position2 = LEVELING_POINT2_TEXT_EN;
+ leveling_menu.position3 = LEVELING_POINT3_TEXT_EN;
+ leveling_menu.position4 = LEVELING_POINT4_TEXT_EN;
+ leveling_menu.position5 = LEVELING_POINT5_TEXT_EN;
+ //
+ set_menu.title = TITLE_SET_EN;
+ set_menu.filesys = FILESYS_TEXT_EN;
+ set_menu.wifi = WIFI_TEXT_EN;
+ set_menu.about = ABOUT_TEXT_EN;
+ set_menu.fan = FAN_TEXT_EN;
+ set_menu.filament = FILAMENT_TEXT_EN;
+ set_menu.breakpoint = BREAK_POINT_TEXT_EN;
+ set_menu.motoroff = MOTOR_OFF_TEXT_EN;
+ set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_EN;
+ set_menu.language = LANGUAGE_TEXT_EN;
+ set_menu.shutdown = SHUTDOWN_TEXT_EN;
+ //set_menu.machine_para = MACHINE_PARA_EN;
+ //
+ more_menu.title = TITLE_MORE_EN;
+ more_menu.zoffset = ZOFFSET_EN;
+ //
+ filesys_menu.title = TITLE_FILESYS_EN;
+ filesys_menu.sd_sys = SD_CARD_TEXT_EN;
+ filesys_menu.usb_sys = U_DISK_TEXT_EN;
+ //WIFI
+ wifi_menu.title = WIFI_TEXT;
+ //wifi_menu.key = WIFI_KEY_TEXT_EN;
+ //wifi_menu.ip = WIFI_IP_TEXT_EN;
+ //wifi_menu.state = WIFI_STA_TEXT_EN;
+ wifi_menu.cloud = CLOUD_TEXT_EN;
+ wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN;
+
+ cloud_menu.title = TITLE_CLOUD_TEXT_EN;
+ cloud_menu.bind = CLOUD_BINDED_EN;
+ cloud_menu.binded = CLOUD_BINDED_EN;
+ cloud_menu.unbind = CLOUD_UNBIND_EN;
+ cloud_menu.unbinding = CLOUD_UNBINDED_EN;
+ cloud_menu.disconnected = CLOUD_DISCONNECTED_EN;
+ cloud_menu.disable = CLOUD_DISABLE_EN;
+ //
+ about_menu.title = TITLE_ABOUT_EN;
+ about_menu.type = ABOUT_TYPE_TEXT_EN;
+ about_menu.version = ABOUT_VERSION_TEXT_EN;
+ about_menu.wifi = ABOUT_WIFI_TEXT_EN;
+ //
+ fan_menu.title = TITLE_FAN_EN;
+ fan_menu.add = FAN_ADD_TEXT_EN;
+ fan_menu.dec = FAN_DEC_TEXT_EN;
+ fan_menu.state = FAN_TIPS1_TEXT_EN;
+ //
+ filament_menu.title = TITLE_FILAMENT_EN;
+ filament_menu.in = FILAMENT_IN_TEXT_EN;
+ filament_menu.out = FILAMENT_OUT_TEXT_EN;
+ filament_menu.ext1 = FILAMENT_EXT0_TEXT_EN;
+ filament_menu.ext2 = FILAMENT_EXT1_TEXT_EN;
+ filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_EN;
+ filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN;
+ filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN;
+ filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_EN;
+ filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN;
+ filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN;
+ filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN;
+ filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_EN;
+ filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN;
+
+ //
+ language_menu.title = TITLE_LANGUAGE_EN;
+ language_menu.next = PAGE_DOWN_TEXT_EN;
+ language_menu.up = PAGE_UP_TEXT_EN;
+ //
+ printing_menu.title = TITLE_PRINTING_EN;
+ printing_menu.option = PRINTING_OPERATION_EN;
+ printing_menu.stop = PRINTING_STOP_EN;
+ printing_menu.pause = PRINTING_PAUSE_EN;
+ printing_menu.resume = PRINTING_RESUME_EN;
+
+ //
+ operation_menu.title = TITLE_OPERATION_EN;
+ operation_menu.pause = PRINTING_PAUSE_EN;
+ operation_menu.stop = PRINTING_STOP_EN;
+ operation_menu.temp = PRINTING_TEMP_EN;
+ operation_menu.fan = FAN_TEXT_EN;
+ operation_menu.extr = PRINTING_EXTRUDER_EN;
+ operation_menu.speed = PRINTING_CHANGESPEED_EN;
+ operation_menu.filament = FILAMENT_TEXT_EN;
+ operation_menu.more = PRINTING_MORE_EN;
+ operation_menu.move = PRINTING_MOVE_EN;
+ operation_menu.auto_off = AUTO_SHUTDOWN_EN;
+ operation_menu.manual_off = MANUAL_SHUTDOWN_EN;
+ //
+ pause_menu.title = TITLE_PAUSE_EN;
+ pause_menu.resume = PRINTING_RESUME_EN;
+ pause_menu.stop = PRINTING_STOP_EN;
+ pause_menu.extrude = PRINTING_EXTRUDER_EN;
+ pause_menu.move = PRINTING_MOVE_EN;
+ pause_menu.filament = FILAMENT_TEXT_EN;
+ pause_menu.more = PRINTING_MORE_EN;
+
+ //
+ speed_menu.title = TITLE_CHANGESPEED_EN;
+ speed_menu.add = ADD_TEXT_EN;
+ speed_menu.dec = DEC_TEXT_EN;
+ speed_menu.move = MOVE_SPEED_EN;
+ speed_menu.extrude = EXTRUDER_SPEED_EN;
+ speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_EN;
+ speed_menu.move_speed = MOVE_SPEED_STATE_EN;
+ //
+ printing_more_menu.title = TITLE_MORE_EN;
+ printing_more_menu.fan = FAN_TEXT_EN;
+ printing_more_menu.auto_close = AUTO_SHUTDOWN_EN;
+ printing_more_menu.manual = MANUAL_SHUTDOWN_EN;
+ printing_more_menu.speed = PRINTING_CHANGESPEED_EN;
+ printing_more_menu.temp = PRINTING_TEMP_EN;
+
+ //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_EN;
+ print_file_dialog_menu.confirm = DIALOG_CONFIRM_EN;
+ print_file_dialog_menu.cancle = DIALOG_CANCLE_EN;
+ print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_EN;
+ print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_EN;
+ print_file_dialog_menu.retry = DIALOG_RETRY_EN;
+ print_file_dialog_menu.stop = DIALOG_STOP_EN;
+ print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_EN;
+ print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_EN;
+ print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_EN;
+ print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_EN;
+ print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_EN;
+ print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_EN;
+ print_file_dialog_menu.reprint = DIALOG_REPRINT_EN;
+ print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_EN;
+ //ZOFFSET
+ zoffset_menu.title = TITLE_ZOFFSET_EN;
+ zoffset_menu.inc = ZOFFSET_INC_EN;
+ zoffset_menu.dec = ZOFFSET_DEC_EN;
+
+ pause_msg_menu.pausing = MESSEGE_PAUSING_EN;
+ pause_msg_menu.changing = MESSEGE_CHANGING_EN;
+ pause_msg_menu.unload = MESSEGE_UNLOAD_EN;
+ pause_msg_menu.waiting = MESSEGE_WAITING_EN;
+ pause_msg_menu.insert = MESSEGE_INSERT_EN;
+ pause_msg_menu.load = MESSEGE_LOAD_EN;
+ pause_msg_menu.purge = MESSEGE_PURGE_EN;
+ pause_msg_menu.resume = MESSEGE_RESUME_EN;
+ pause_msg_menu.heat = MESSEGE_HEAT_EN;
+ pause_msg_menu.heating = MESSEGE_HEATING_EN;
+ pause_msg_menu.option = MESSEGE_OPTION_EN;
+ pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_EN;
+ pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_EN;
+ break;
+ case LANG_RUSSIAN:
+ common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_RU;
+ common_menu.text_back = BACK_TEXT_RU;
+ common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_RU;
+ common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_RU;
+ common_menu.print_special_title = PRINTING_OTHER_LANGUGE;
+ common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE;
+ common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE;
+ //
+ main_menu.title = TITLE_READYPRINT_RU;
+ main_menu.preheat = PREHEAT_TEXT_RU;
+ main_menu.move = MOVE_TEXT_RU;
+ main_menu.home = HOME_TEXT_RU;
+ main_menu.print = PRINT_TEXT_RU;
+ main_menu.extrude = EXTRUDE_TEXT_RU;
+ main_menu.leveling = LEVELING_TEXT_RU;
+ main_menu.autoleveling = AUTO_LEVELING_TEXT_RU;
+ main_menu.fan = FAN_TEXT_RU;
+ main_menu.set = SET_TEXT_RU;
+ main_menu.more = MORE_TEXT_RU;
+ main_menu.tool = TOOL_TEXT_RU;
+ //TOOL
+ tool_menu.title = TOOL_TEXT_RU;
+ tool_menu.preheat = TOOL_PREHEAT_RU;
+ tool_menu.extrude = TOOL_EXTRUDE_RU;
+ tool_menu.move = TOOL_MOVE_RU;
+ tool_menu.home = TOOL_HOME_RU;
+ tool_menu.leveling = TOOL_LEVELING_RU;
+ tool_menu.autoleveling = TOOL_AUTO_LEVELING_RU;
+ tool_menu.filament = TOOL_FILAMENT_RU;
+ tool_menu.more = TOOL_MORE_RU;
+ //
+ preheat_menu.adjust_title = TITLE_ADJUST_RU;
+ preheat_menu.title = TITLE_PREHEAT_RU;
+ preheat_menu.add = ADD_TEXT_RU;
+ preheat_menu.dec = DEC_TEXT_RU;
+ preheat_menu.ext1 = EXTRUDER_1_TEXT_RU;
+ preheat_menu.ext2 = EXTRUDER_2_TEXT_RU;
+ preheat_menu.hotbed = HEATBED_TEXT_RU;
+ preheat_menu.off = CLOSE_TEXT_RU;
+ //
+ move_menu.title = MOVE_TEXT_RU;
+ //
+ home_menu.title = TITLE_HOME_RU;
+ home_menu.stopmove = HOME_STOPMOVE_RU;
+ //
+ file_menu.title = TITLE_CHOOSEFILE_RU;
+ file_menu.page_up = PAGE_UP_TEXT_RU;
+ file_menu.page_down = PAGE_DOWN_TEXT_RU;
+ file_menu.file_loading = FILE_LOADING_RU;
+ file_menu.no_file = NO_FILE_RU;
+ file_menu.no_file_and_check = NO_FILE_RU;//NO_FILE_AND_CHECK_RU;
+ //
+ extrude_menu.title = TITLE_EXTRUDE_RU;
+ extrude_menu.in = EXTRUDER_IN_TEXT_RU;
+ extrude_menu.out = EXTRUDER_OUT_TEXT_RU;
+ extrude_menu.ext1 = EXTRUDER_1_TEXT_RU;
+ extrude_menu.ext2 = EXTRUDER_2_TEXT_RU;
+ extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_RU;
+ extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_RU;
+ extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_RU;
+ extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_RU;
+ //
+ leveling_menu.title = TITLE_LEVELING_RU;
+ leveling_menu.position1 = LEVELING_POINT1_TEXT_RU;
+ leveling_menu.position2 = LEVELING_POINT2_TEXT_RU;
+ leveling_menu.position3 = LEVELING_POINT3_TEXT_RU;
+ leveling_menu.position4 = LEVELING_POINT4_TEXT_RU;
+ leveling_menu.position5 = LEVELING_POINT5_TEXT_RU;
+ //
+ set_menu.title = TITLE_SET_RU;
+ set_menu.filesys = FILESYS_TEXT_RU;
+ set_menu.wifi = WIFI_TEXT_RU;
+ set_menu.about = ABOUT_TEXT_RU;
+ set_menu.fan = FAN_TEXT_RU;
+ set_menu.filament = FILAMENT_TEXT_RU;
+ set_menu.breakpoint = BREAK_POINT_TEXT_RU;
+ set_menu.motoroff = MOTOR_OFF_TEXT_RU;
+ set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_RU;
+ set_menu.language = LANGUAGE_TEXT_RU;
+ set_menu.shutdown = SHUTDOWN_TEXT_RU;
+ //
+ more_menu.title = TITLE_MORE_RU;
+ more_menu.zoffset = ZOFFSET_RU;
+ //
+ filesys_menu.title = TITLE_FILESYS_RU;
+ filesys_menu.sd_sys = SD_CARD_TEXT_RU;
+ filesys_menu.usb_sys = U_DISK_TEXT_RU;
+ //WIFI
+ wifi_menu.title = WIFI_TEXT;
+ //wifi_menu.key = WIFI_KEY_TEXT_RU;
+ //wifi_menu.ip = WIFI_IP_TEXT_RU;
+ //wifi_menu.state = WIFI_STA_TEXT_RU;
+ wifi_menu.cloud = CLOUD_TEXT_RU;
+ wifi_menu.reconnect = WIFI_RECONNECT_TEXT_RU;
+
+
+ cloud_menu.title = TITLE_CLOUD_TEXT_RU;
+ cloud_menu.bind = CLOUD_BINDED_RU;
+ cloud_menu.binded = CLOUD_BINDED_RU;
+ cloud_menu.unbind = CLOUD_UNBIND_RU;
+ cloud_menu.unbinding = CLOUD_UNBINDED_RU;
+ cloud_menu.disconnected = CLOUD_DISCONNECTED_RU;
+ cloud_menu.disable = CLOUD_DISABLE_RU;
+ //
+ about_menu.title = ABOUT_TEXT_RU;
+ about_menu.type = ABOUT_TYPE_TEXT_RU;
+ about_menu.version = ABOUT_VERSION_TEXT_RU;
+ about_menu.wifi = ABOUT_WIFI_TEXT_RU;
+ //
+ fan_menu.title = FAN_TEXT_RU;
+ fan_menu.add = FAN_ADD_TEXT_RU;
+ fan_menu.dec = FAN_DEC_TEXT_RU;
+ fan_menu.state = FAN_TIPS1_TEXT_RU;
+ //
+ filament_menu.title = TITLE_FILAMENT_RU;
+ filament_menu.in = FILAMENT_IN_TEXT_RU;
+ filament_menu.out = FILAMENT_OUT_TEXT_RU;
+ filament_menu.ext1 = FILAMENT_EXT0_TEXT_RU;
+ filament_menu.ext2 = FILAMENT_EXT1_TEXT_RU;
+ filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_RU;
+ filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU;
+ filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU;
+ filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_RU;
+ filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU;
+ filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU;
+ filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU;
+ filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_RU;
+ filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU;
+
+ //
+ language_menu.title = LANGUAGE_TEXT_RU;
+ language_menu.next = PAGE_DOWN_TEXT_RU;
+ language_menu.up = PAGE_UP_TEXT_RU;
+ //
+ printing_menu.title = TITLE_PRINTING_RU;
+ printing_menu.option = PRINTING_OPERATION_RU;
+ printing_menu.stop = PRINTING_STOP_RU;
+ printing_menu.pause = PRINTING_PAUSE_RU;
+ printing_menu.resume = PRINTING_RESUME_RU;
+
+ //
+ operation_menu.title = TITLE_OPERATION_RU;
+ operation_menu.pause = PRINTING_PAUSE_RU;
+ operation_menu.stop = PRINTING_STOP_RU;
+ operation_menu.temp = PRINTING_TEMP_RU;
+ operation_menu.fan = FAN_TEXT_RU;
+ operation_menu.extr = PRINTING_EXTRUDER_RU;
+ operation_menu.speed = PRINTING_CHANGESPEED_RU;
+ operation_menu.filament = FILAMENT_TEXT_RU;
+ operation_menu.more = PRINTING_MORE_RU;
+ operation_menu.move = PRINTING_MOVE_RU;
+ operation_menu.auto_off = AUTO_SHUTDOWN_RU;
+ operation_menu.manual_off = MANUAL_SHUTDOWN_RU;
+ //
+ pause_menu.title = TITLE_PAUSE_RU;
+ pause_menu.resume = PRINTING_RESUME_RU;
+ pause_menu.stop = PRINTING_STOP_RU;
+ pause_menu.extrude = PRINTING_EXTRUDER_RU;
+ pause_menu.move = PRINTING_MOVE_RU;
+ pause_menu.filament = FILAMENT_TEXT_RU;
+ pause_menu.more = PRINTING_MORE_RU;
+
+ //
+ speed_menu.title = PRINTING_CHANGESPEED_RU;
+ speed_menu.add = ADD_TEXT_RU;
+ speed_menu.dec = DEC_TEXT_RU;
+ speed_menu.move = MOVE_SPEED_RU;
+ speed_menu.extrude = EXTRUDER_SPEED_RU;
+ speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_RU;
+ speed_menu.move_speed = MOVE_SPEED_STATE_RU;
+ //
+ printing_more_menu.title = TITLE_MORE_RU;
+ printing_more_menu.fan = FAN_TEXT_RU;
+ printing_more_menu.auto_close = AUTO_SHUTDOWN_RU;
+ printing_more_menu.manual = MANUAL_SHUTDOWN_RU;
+ printing_more_menu.speed = PRINTING_CHANGESPEED_RU;
+ printing_more_menu.temp = PRINTING_TEMP_RU;
+ //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_RU;
+ print_file_dialog_menu.confirm = DIALOG_CONFIRM_RU;
+ print_file_dialog_menu.cancle = DIALOG_CANCLE_RU;
+ print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_RU;
+ print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_RU;
+ print_file_dialog_menu.retry = DIALOG_RETRY_RU;
+ print_file_dialog_menu.stop = DIALOG_STOP_RU;
+ print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_RU;
+ print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_RU;
+ print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_RU;
+ print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_RU;
+ print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_RU;
+ print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_RU;
+ print_file_dialog_menu.reprint = DIALOG_REPRINT_RU;
+ print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_RU;
+ //ZOFFSET
+ zoffset_menu.title = TITLE_ZOFFSET_RU;
+ zoffset_menu.inc = ZOFFSET_INC_RU;
+ zoffset_menu.dec = ZOFFSET_DEC_RU;
+
+ pause_msg_menu.pausing = MESSEGE_PAUSING_RU;
+ pause_msg_menu.changing = MESSEGE_CHANGING_RU;
+ pause_msg_menu.unload = MESSEGE_UNLOAD_RU;
+ pause_msg_menu.waiting = MESSEGE_WAITING_RU;
+ pause_msg_menu.insert = MESSEGE_INSERT_RU;
+ pause_msg_menu.load = MESSEGE_LOAD_RU;
+ pause_msg_menu.purge = MESSEGE_PURGE_RU;
+ pause_msg_menu.resume = MESSEGE_RESUME_RU;
+ pause_msg_menu.heat = MESSEGE_HEAT_RU;
+ pause_msg_menu.heating = MESSEGE_HEATING_RU;
+ pause_msg_menu.option = MESSEGE_OPTION_RU;
+ pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_RU;
+ pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_RU;
+ break;
+ case LANG_SPANISH:
+ common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_SP;
+ common_menu.text_back = BACK_TEXT_SP;
+ common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_SP;
+ common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_SP;
+ common_menu.print_special_title = PRINTING_SP;
+ common_menu.pause_special_title = PRINTING_PAUSAR_SP;
+ common_menu.operate_special_title = PRINTING_AJUSTES_SP;
+ //
+ main_menu.title = TITLE_READYPRINT_SP;
+ main_menu.preheat = PREHEAT_TEXT_SP;
+ main_menu.move = MOVE_TEXT_SP;
+ main_menu.home = HOME_TEXT_SP;
+ main_menu.print = PRINT_TEXT_SP;
+ main_menu.extrude = EXTRUDE_TEXT_SP;
+ main_menu.leveling = LEVELING_TEXT_SP;
+ main_menu.autoleveling = AUTO_LEVELING_TEXT_SP;
+ main_menu.fan = FAN_TEXT_SP;
+ main_menu.set = SET_TEXT_SP;
+ main_menu.more = MORE_TEXT_SP;
+ main_menu.tool = TOOL_TEXT_SP;
+ //TOOL
+ tool_menu.title = TOOL_TEXT_SP;
+ tool_menu.preheat = TOOL_PREHEAT_SP;
+ tool_menu.extrude = TOOL_EXTRUDE_SP;
+ tool_menu.move = TOOL_MOVE_SP;
+ tool_menu.home = TOOL_HOME_SP;
+ tool_menu.leveling = TOOL_LEVELING_SP;
+ tool_menu.autoleveling = TOOL_AUTO_LEVELING_SP;
+ tool_menu.filament = TOOL_FILAMENT_SP;
+ tool_menu.more = TOOL_MORE_SP;
+ //
+ preheat_menu.adjust_title = TITLE_ADJUST_SP;
+ preheat_menu.title = TITLE_PREHEAT_SP;
+ preheat_menu.add = ADD_TEXT_SP;
+ preheat_menu.dec = DEC_TEXT_SP;
+ preheat_menu.ext1 = EXTRUDER_1_TEXT_SP;
+ preheat_menu.ext2 = EXTRUDER_2_TEXT_SP;
+ preheat_menu.hotbed = HEATBED_TEXT_SP;
+ preheat_menu.off = CLOSE_TEXT_SP;
+ //
+ move_menu.title = MOVE_TEXT_SP;
+ //
+ home_menu.title = TITLE_HOME_SP;
+ home_menu.home_x = HOME_X_TEXT_SP;
+ home_menu.home_y = HOME_Y_TEXT_SP;
+ home_menu.home_z = HOME_Z_TEXT_SP;
+ home_menu.home_all = HOME_ALL_TEXT_SP;
+ home_menu.stopmove = HOME_STOPMOVE_SP;
+ //
+ file_menu.title = TITLE_CHOOSEFILE_SP;
+ file_menu.page_up = PAGE_UP_TEXT_SP;
+ file_menu.page_down = PAGE_DOWN_TEXT_SP;
+ file_menu.file_loading = FILE_LOADING_SP;
+ file_menu.no_file = NO_FILE_SP;
+ file_menu.no_file_and_check = NO_FILE_SP;//NO_FILE_AND_CHECK_SP;
+ //
+ extrude_menu.title = TITLE_EXTRUDE_SP;
+ extrude_menu.in = EXTRUDER_IN_TEXT_SP;
+ extrude_menu.out = EXTRUDER_OUT_TEXT_SP;
+ extrude_menu.ext1 = EXTRUDER_1_TEXT_SP;
+ extrude_menu.ext2 = EXTRUDER_2_TEXT_SP;
+ extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_SP;
+ extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_SP;
+ extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_SP;
+ extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_SP;
+ //
+ leveling_menu.title = TITLE_LEVELING_SP;
+ leveling_menu.position1 = LEVELING_POINT1_TEXT_SP;
+ leveling_menu.position2 = LEVELING_POINT2_TEXT_SP;
+ leveling_menu.position3 = LEVELING_POINT3_TEXT_SP;
+ leveling_menu.position4 = LEVELING_POINT4_TEXT_SP;
+ leveling_menu.position5 = LEVELING_POINT5_TEXT_SP;
+ //
+ set_menu.title = TITLE_SET_SP;
+ set_menu.filesys = FILESYS_TEXT_SP;
+ set_menu.wifi = WIFI_TEXT_SP;
+ set_menu.about = ABOUT_TEXT_SP;
+ set_menu.fan = FAN_TEXT_SP;
+ set_menu.filament = FILAMENT_TEXT_SP;
+ set_menu.breakpoint = BREAK_POINT_TEXT_SP;
+ set_menu.motoroff = MOTOR_OFF_TEXT_SP;
+ set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_SP;
+ set_menu.language = LANGUAGE_TEXT_SP;
+ set_menu.shutdown = SHUTDOWN_TEXT_SP;
+ //
+ more_menu.title = TITLE_MORE_SP;
+ more_menu.zoffset = ZOFFSET_SP;
+ //
+ filesys_menu.title = TITLE_FILESYS_SP;
+ filesys_menu.sd_sys = SD_CARD_TEXT_SP;
+ filesys_menu.usb_sys = U_DISK_TEXT_SP;
+
+ //WIFI
+ wifi_menu.title = WIFI_TEXT;
+ //wifi_menu.key = WIFI_KEY_TEXT_SP;
+ //wifi_menu.ip = WIFI_IP_TEXT_SP;
+ //wifi_menu.state = WIFI_STA_TEXT_SP;
+ wifi_menu.cloud = CLOUD_TEXT_SP;
+ wifi_menu.reconnect = WIFI_RECONNECT_TEXT_SP;
+
+ cloud_menu.title = TITLE_CLOUD_TEXT_SP;
+ cloud_menu.bind = CLOUD_BINDED_SP;
+ cloud_menu.binded = CLOUD_BINDED_SP;
+ cloud_menu.unbind = CLOUD_UNBIND_SP;
+ cloud_menu.unbinding = CLOUD_UNBINDED_SP;
+ cloud_menu.disconnected = CLOUD_DISCONNECTED_SP;
+ cloud_menu.disable = CLOUD_DISABLE_SP;
+ //
+ about_menu.title = ABOUT_TEXT_SP;
+ about_menu.type = ABOUT_TYPE_TEXT_SP;
+ about_menu.version = ABOUT_VERSION_TEXT_SP;
+ about_menu.wifi = ABOUT_WIFI_TEXT_SP;
+ //
+ fan_menu.title = FAN_TEXT_SP;
+ fan_menu.add = FAN_ADD_TEXT_SP;
+ fan_menu.dec = FAN_DEC_TEXT_SP;
+ fan_menu.state = FAN_TIPS1_TEXT_SP;
+ //
+ filament_menu.title = TITLE_FILAMENT_SP;
+ filament_menu.in = FILAMENT_IN_TEXT_SP;
+ filament_menu.out = FILAMENT_OUT_TEXT_SP;
+ filament_menu.ext1 = FILAMENT_EXT0_TEXT_SP;
+ filament_menu.ext2 = FILAMENT_EXT1_TEXT_SP;
+ filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_SP;
+ filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP;
+ filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP;
+ filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_SP;
+ filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP;
+ filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP;
+ filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP;
+ filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_SP;
+ filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP;
+
+ //
+ language_menu.title = LANGUAGE_TEXT_SP;
+ language_menu.next = PAGE_DOWN_TEXT_SP;
+ language_menu.up = PAGE_UP_TEXT_SP;
+ //
+ printing_menu.title = TITLE_PRINTING_SP;
+ printing_menu.option = PRINTING_OPERATION_SP;
+ printing_menu.stop = PRINTING_STOP_SP;
+ printing_menu.pause = PRINTING_PAUSE_SP;
+ printing_menu.resume = PRINTING_RESUME_SP;
+
+ //
+ operation_menu.title = TITLE_OPERATION_SP;
+ operation_menu.pause = PRINTING_PAUSE_SP;
+ operation_menu.stop = PRINTING_STOP_SP;
+ operation_menu.temp = PRINTING_TEMP_SP;
+ operation_menu.fan = FAN_TEXT_SP;
+ operation_menu.extr = PRINTING_EXTRUDER_SP;
+ operation_menu.speed = PRINTING_CHANGESPEED_SP;
+ operation_menu.filament = FILAMENT_TEXT_SP;
+ operation_menu.more = PRINTING_MORE_SP;
+ operation_menu.move = PRINTING_MOVE_SP;
+ operation_menu.auto_off = AUTO_SHUTDOWN_SP;
+ operation_menu.manual_off = MANUAL_SHUTDOWN_SP;
+ //
+ pause_menu.title = TITLE_PAUSE_RU;
+ pause_menu.resume = PRINTING_RESUME_SP;
+ pause_menu.stop = PRINTING_STOP_SP;
+ pause_menu.extrude = PRINTING_EXTRUDER_SP;
+ pause_menu.move = PRINTING_MOVE_SP;
+ pause_menu.filament = FILAMENT_TEXT_SP;
+ pause_menu.more = PRINTING_MORE_SP;
+
+ //
+ speed_menu.title = PRINTING_CHANGESPEED_SP;
+ speed_menu.add = ADD_TEXT_SP;
+ speed_menu.dec = DEC_TEXT_SP;
+ speed_menu.move = MOVE_SPEED_SP;
+ speed_menu.extrude = EXTRUDER_SPEED_SP;
+ speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_SP;
+ speed_menu.move_speed = MOVE_SPEED_STATE_SP;
+ //
+ printing_more_menu.title = TITLE_MORE_SP;
+ printing_more_menu.fan = FAN_TEXT_SP;
+ printing_more_menu.auto_close = AUTO_SHUTDOWN_SP;
+ printing_more_menu.manual = MANUAL_SHUTDOWN_SP;
+ printing_more_menu.speed = PRINTING_CHANGESPEED_SP;
+ printing_more_menu.temp = PRINTING_TEMP_SP;
+
+ //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP;
+ print_file_dialog_menu.confirm = DIALOG_CONFIRM_SP;
+ print_file_dialog_menu.cancle = DIALOG_CANCLE_SP;
+ print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_SP;
+ print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_SP;
+ print_file_dialog_menu.retry = DIALOG_RETRY_SP;
+ print_file_dialog_menu.stop = DIALOG_STOP_SP;
+ print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_SP;
+ print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_SP;
+ print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_SP;
+ print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_SP;
+ print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_SP;
+ print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_SP;
+ print_file_dialog_menu.reprint = DIALOG_REPRINT_SP;
+ print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_SP;
+ //ZOFFSET
+ zoffset_menu.title = TITLE_ZOFFSET_SP;
+ zoffset_menu.inc = ZOFFSET_INC_SP;
+ zoffset_menu.dec = ZOFFSET_DEC_SP;
+
+ pause_msg_menu.pausing = MESSEGE_PAUSING_SP;
+ pause_msg_menu.changing = MESSEGE_CHANGING_SP;
+ pause_msg_menu.unload = MESSEGE_UNLOAD_SP;
+ pause_msg_menu.waiting = MESSEGE_WAITING_SP;
+ pause_msg_menu.insert = MESSEGE_INSERT_SP;
+ pause_msg_menu.load = MESSEGE_LOAD_SP;
+ pause_msg_menu.purge = MESSEGE_PURGE_SP;
+ pause_msg_menu.resume = MESSEGE_RESUME_SP;
+ pause_msg_menu.heat = MESSEGE_HEAT_SP;
+ pause_msg_menu.heating = MESSEGE_HEATING_SP;
+ pause_msg_menu.option = MESSEGE_OPTION_SP;
+ pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_SP;
+ pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_SP;
+ break;
+
+ #endif
+
+ case LANG_FRENCH:
+ common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_FR;
+ common_menu.text_back = BACK_TEXT_FR;
+ common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_FR;
+ common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_FR;
+ common_menu.print_special_title = PRINTING_OTHER_LANGUGE;
+ common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE;
+ common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE;
+
+ //
+ main_menu.title = TITLE_READYPRINT_FR;
+ main_menu.preheat = PREHEAT_TEXT_FR;
+ main_menu.move = MOVE_TEXT_FR;
+ main_menu.home = HOME_TEXT_FR;
+ main_menu.print = PRINT_TEXT_FR;
+ main_menu.extrude = EXTRUDE_TEXT_FR;
+ main_menu.leveling = LEVELING_TEXT_FR;
+ main_menu.autoleveling = AUTO_LEVELING_TEXT_FR;
+ main_menu.fan = FAN_TEXT_FR;
+ main_menu.set = SET_TEXT_FR;
+ main_menu.more = MORE_TEXT_FR;
+ main_menu.tool = TOOL_TEXT_FR;
+ //TOOL
+ tool_menu.title = TOOL_TEXT_FR;
+ tool_menu.preheat = TOOL_PREHEAT_FR;
+ tool_menu.extrude = TOOL_EXTRUDE_FR;
+ tool_menu.move = TOOL_MOVE_FR;
+ tool_menu.home = TOOL_HOME_FR;
+ tool_menu.leveling = TOOL_LEVELING_FR;
+ tool_menu.autoleveling = TOOL_AUTO_LEVELING_FR;
+ tool_menu.filament = TOOL_FILAMENT_FR;
+ tool_menu.more = TOOL_MORE_FR;
+ //
+ preheat_menu.adjust_title = TITLE_ADJUST_FR;
+ preheat_menu.title = TITLE_PREHEAT_FR;
+ preheat_menu.add = ADD_TEXT_FR;
+ preheat_menu.dec = DEC_TEXT_FR;
+ preheat_menu.ext1 = EXTRUDER_1_TEXT_FR;
+ preheat_menu.ext2 = EXTRUDER_2_TEXT_FR;
+ preheat_menu.hotbed = HEATBED_TEXT_FR;
+ preheat_menu.off = CLOSE_TEXT_FR;
+ //
+ move_menu.title = MOVE_TEXT_FR;
+ //
+ home_menu.title = TITLE_HOME_FR;
+ home_menu.stopmove = HOME_STOPMOVE_FR;
+ //
+ file_menu.title = TITLE_CHOOSEFILE_FR;
+ file_menu.page_up = PAGE_UP_TEXT_FR;
+ file_menu.page_down = PAGE_DOWN_TEXT_FR;
+ //
+ extrude_menu.title = TITLE_EXTRUDE_FR;
+ extrude_menu.in = EXTRUDER_IN_TEXT_FR;
+ extrude_menu.out = EXTRUDER_OUT_TEXT_FR;
+ extrude_menu.ext1 = EXTRUDER_1_TEXT_FR;
+ extrude_menu.ext2 = EXTRUDER_2_TEXT_FR;
+ extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_FR;
+ extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_FR;
+ extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_FR;
+ extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_FR;
+ //
+ leveling_menu.title = TITLE_LEVELING_FR;
+ leveling_menu.position1 = LEVELING_POINT1_TEXT_FR;
+ leveling_menu.position2 = LEVELING_POINT2_TEXT_FR;
+ leveling_menu.position3 = LEVELING_POINT3_TEXT_FR;
+ leveling_menu.position4 = LEVELING_POINT4_TEXT_FR;
+ leveling_menu.position5 = LEVELING_POINT5_TEXT_FR;
+ //
+ set_menu.title = TITLE_SET_FR;
+ set_menu.filesys = FILESYS_TEXT_FR;
+ set_menu.wifi = WIFI_TEXT_FR;
+ set_menu.about = ABOUT_TEXT_FR;
+ set_menu.fan = FAN_TEXT_FR;
+ set_menu.filament = FILAMENT_TEXT_FR;
+ set_menu.breakpoint = BREAK_POINT_TEXT_FR;
+ set_menu.motoroff = MOTOR_OFF_TEXT_FR;
+ set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_FR;
+ set_menu.language = LANGUAGE_TEXT_FR;
+ set_menu.shutdown = SHUTDOWN_TEXT_FR;
+ //
+ more_menu.title = TITLE_MORE_FR;
+ more_menu.zoffset = ZOFFSET_FR;
+ //
+ filesys_menu.title = TITLE_FILESYS_FR;
+ filesys_menu.sd_sys = SD_CARD_TEXT_FR;
+ filesys_menu.usb_sys = U_DISK_TEXT_FR;
+ file_menu.file_loading = FILE_LOADING_FR;
+ file_menu.no_file = NO_FILE_FR;
+ file_menu.no_file_and_check = NO_FILE_FR;//NO_FILE_AND_CHECK_FR;
+ //WIFI
+ wifi_menu.title = WIFI_NAME_TEXT_FR;
+ //wifi_menu.key = WIFI_KEY_TEXT_FR;
+ //wifi_menu.ip = WIFI_IP_TEXT_FR;
+ //wifi_menu.state = WIFI_STA_TEXT_FR;
+ //wifi_menu.cloud = CLOSE_TEXT_FR;
+ wifi_menu.cloud = CLOUD_TEXT_FR;
+ wifi_menu.reconnect = WIFI_RECONNECT_TEXT_FR;
+
+ cloud_menu.title = TITLE_CLOUD_TEXT_FR;
+ cloud_menu.bind = CLOUD_BINDED_FR;
+ cloud_menu.binded = CLOUD_BINDED_FR;
+ cloud_menu.unbind = CLOUD_UNBIND_FR;
+ cloud_menu.unbinding = CLOUD_UNBINDED_FR;
+ cloud_menu.disconnected = CLOUD_DISCONNECTED_FR;
+ cloud_menu.disable = CLOUD_DISABLE_FR;
+ //
+ about_menu.title = ABOUT_TEXT_FR;
+ about_menu.type = ABOUT_TYPE_TEXT_FR;
+ about_menu.version = ABOUT_VERSION_TEXT_FR;
+ about_menu.wifi = ABOUT_WIFI_TEXT_FR;
+ //
+ fan_menu.title = FAN_TEXT_FR;
+ fan_menu.add = FAN_ADD_TEXT_FR;
+ fan_menu.dec = FAN_DEC_TEXT_FR;
+ fan_menu.state = FAN_TIPS1_TEXT_FR;
+ //
+ filament_menu.title = TITLE_FILAMENT_FR;
+ filament_menu.in = FILAMENT_IN_TEXT_FR;
+ filament_menu.out = FILAMENT_OUT_TEXT_FR;
+ filament_menu.ext1 = FILAMENT_EXT0_TEXT_FR;
+ filament_menu.ext2 = FILAMENT_EXT1_TEXT_FR;
+ filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_FR;
+ filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR;
+ filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR;
+ filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_FR;
+ filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR;
+ filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR;
+ filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR;
+ filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_FR;
+ filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR;
+
+ //
+ language_menu.title = LANGUAGE_TEXT_FR;
+
+ //
+ printing_menu.title = TITLE_PRINTING_FR;
+ printing_menu.option = PRINTING_OPERATION_FR;
+ printing_menu.stop = PRINTING_STOP_FR;
+ printing_menu.pause = PRINTING_PAUSE_FR;
+ printing_menu.resume = PRINTING_RESUME_FR;
+
+ //
+ operation_menu.title = TITLE_OPERATION_FR;
+ operation_menu.pause = PRINTING_PAUSE_FR;
+ operation_menu.stop = PRINTING_STOP_FR;
+ operation_menu.temp = PRINTING_TEMP_FR;
+ operation_menu.fan = FAN_TEXT_FR;
+ operation_menu.extr = PRINTING_EXTRUDER_FR;
+ operation_menu.speed = PRINTING_CHANGESPEED_FR;
+ operation_menu.filament = FILAMENT_TEXT_FR;
+ operation_menu.more = PRINTING_MORE_FR;
+ operation_menu.move = PRINTING_MOVE_FR;
+ operation_menu.auto_off = AUTO_SHUTDOWN_FR;
+ operation_menu.manual_off = MANUAL_SHUTDOWN_FR;
+ //
+ pause_menu.title = TITLE_PAUSE_FR;
+ pause_menu.resume = PRINTING_RESUME_FR;
+ pause_menu.stop = PRINTING_STOP_FR;
+ pause_menu.extrude = PRINTING_EXTRUDER_FR;
+ pause_menu.move = PRINTING_MOVE_FR;
+ pause_menu.filament = FILAMENT_TEXT_FR;
+ pause_menu.more = PRINTING_MORE_FR;
+
+ //
+ speed_menu.title = PRINTING_CHANGESPEED_FR;
+ speed_menu.add = ADD_TEXT_FR;
+ speed_menu.dec = DEC_TEXT_FR;
+ speed_menu.move = MOVE_SPEED_FR;
+ speed_menu.extrude = EXTRUDER_SPEED_FR;
+ speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_FR;
+ speed_menu.move_speed = MOVE_SPEED_STATE_FR;
+ //
+ printing_more_menu.fan = FAN_TEXT_FR;
+ printing_more_menu.auto_close = AUTO_SHUTDOWN_FR;
+ printing_more_menu.manual = MANUAL_SHUTDOWN_FR;
+ printing_more_menu.speed = PRINTING_CHANGESPEED_FR;
+ printing_more_menu.temp = PRINTING_TEMP_FR;
+
+ //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP;
+ print_file_dialog_menu.confirm = DIALOG_CONFIRM_FR;
+ print_file_dialog_menu.cancle = DIALOG_CANCLE_FR;
+ print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_FR;
+ print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_FR;
+ print_file_dialog_menu.retry = DIALOG_RETRY_FR;
+ print_file_dialog_menu.stop = DIALOG_STOP_FR;
+ print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_FR;
+ print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_FR;
+ print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_FR;
+ print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_FR;
+ print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_FR;
+ print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_FR;
+ print_file_dialog_menu.reprint = DIALOG_REPRINT_FR;
+ print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_FR;
+ //ZOFFSET
+ zoffset_menu.title = TITLE_ZOFFSET_FR;
+ zoffset_menu.inc = ZOFFSET_INC_FR;
+ zoffset_menu.dec = ZOFFSET_DEC_FR;
+
+ pause_msg_menu.pausing = MESSEGE_PAUSING_FR;
+ pause_msg_menu.changing = MESSEGE_CHANGING_FR;
+ pause_msg_menu.unload = MESSEGE_UNLOAD_FR;
+ pause_msg_menu.waiting = MESSEGE_WAITING_FR;
+ pause_msg_menu.insert = MESSEGE_INSERT_FR;
+ pause_msg_menu.load = MESSEGE_LOAD_FR;
+ pause_msg_menu.purge = MESSEGE_PURGE_FR;
+ pause_msg_menu.resume = MESSEGE_RESUME_FR;
+ pause_msg_menu.heat = MESSEGE_HEAT_FR;
+ pause_msg_menu.heating = MESSEGE_HEATING_FR;
+ pause_msg_menu.option = MESSEGE_OPTION_FR;
+ pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_FR;
+ pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_FR;
+ break;
+
+ case LANG_ITALY:
+ common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_IT;
+ common_menu.text_back = BACK_TEXT_IT;
+ common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_IT;
+ common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_IT;
+ common_menu.print_special_title = PRINTING_OTHER_LANGUGE;
+ common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE;
+ common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE;
+
+ //
+ main_menu.title = TITLE_READYPRINT_IT;
+ main_menu.preheat = PREHEAT_TEXT_IT;
+ main_menu.move = MOVE_TEXT_IT;
+ main_menu.home = HOME_TEXT_IT;
+ main_menu.print = PRINT_TEXT_IT;
+ main_menu.extrude = EXTRUDE_TEXT_IT;
+ main_menu.leveling = LEVELING_TEXT_IT;
+ main_menu.autoleveling = AUTO_LEVELING_TEXT_IT;
+ main_menu.fan = FAN_TEXT_IT;
+ main_menu.set = SET_TEXT_IT;
+ main_menu.more = MORE_TEXT_IT;
+ main_menu.tool = TOOL_TEXT_IT;
+ //TOOL
+ tool_menu.title = TOOL_TEXT_IT;
+ tool_menu.preheat = TOOL_PREHEAT_IT;
+ tool_menu.extrude = TOOL_EXTRUDE_IT;
+ tool_menu.move = TOOL_MOVE_IT;
+ tool_menu.home = TOOL_HOME_IT;
+ tool_menu.leveling = TOOL_LEVELING_IT;
+ tool_menu.autoleveling = TOOL_AUTO_LEVELING_IT;
+ tool_menu.filament = TOOL_FILAMENT_IT;
+ tool_menu.more = TOOL_MORE_IT;
+ //
+ preheat_menu.adjust_title = TITLE_ADJUST_IT;
+ preheat_menu.title = TITLE_PREHEAT_IT;
+ preheat_menu.add = ADD_TEXT_IT;
+ preheat_menu.dec = DEC_TEXT_IT;
+ preheat_menu.ext1 = EXTRUDER_1_TEXT_IT;
+ preheat_menu.ext2 = EXTRUDER_2_TEXT_IT;
+ preheat_menu.hotbed = HEATBED_TEXT_IT;
+ preheat_menu.off = CLOSE_TEXT_IT;
+ //
+ move_menu.title = MOVE_TEXT_IT;
+ //
+ home_menu.title = TITLE_HOME_IT;
+ home_menu.stopmove = HOME_STOPMOVE_IT;
+ //
+ file_menu.title = TITLE_CHOOSEFILE_IT;
+ file_menu.page_up = PAGE_UP_TEXT_IT;
+ file_menu.page_down = PAGE_DOWN_TEXT_IT;
+ file_menu.file_loading = FILE_LOADING_IT;
+ file_menu.no_file = NO_FILE_IT;
+ file_menu.no_file_and_check = NO_FILE_IT;//NO_FILE_AND_CHECK_IT;
+ //
+ extrude_menu.title = TITLE_EXTRUDE_IT;
+ extrude_menu.in = EXTRUDER_IN_TEXT_IT;
+ extrude_menu.out = EXTRUDER_OUT_TEXT_IT;
+ extrude_menu.ext1 = EXTRUDER_1_TEXT_IT;
+ extrude_menu.ext2 = EXTRUDER_2_TEXT_IT;
+ extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_IT;
+ extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_IT;
+ extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_IT;
+ extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_IT;
+ //
+ leveling_menu.title = TITLE_LEVELING_IT;
+ leveling_menu.position1 = LEVELING_POINT1_TEXT_IT;
+ leveling_menu.position2 = LEVELING_POINT2_TEXT_IT;
+ leveling_menu.position3 = LEVELING_POINT3_TEXT_IT;
+ leveling_menu.position4 = LEVELING_POINT4_TEXT_IT;
+ leveling_menu.position5 = LEVELING_POINT5_TEXT_IT;
+ //
+ set_menu.title = TITLE_SET_IT;
+ set_menu.filesys = FILESYS_TEXT_IT;
+ set_menu.wifi = WIFI_TEXT_IT;
+ set_menu.about = ABOUT_TEXT_IT;
+ set_menu.fan = FAN_TEXT_IT;
+ set_menu.filament = FILAMENT_TEXT_IT;
+ set_menu.breakpoint = BREAK_POINT_TEXT_IT;
+ set_menu.motoroff = MOTOR_OFF_TEXT_IT;
+ set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_IT;
+ set_menu.language = LANGUAGE_TEXT_IT;
+ set_menu.shutdown = SHUTDOWN_TEXT_IT;
+ //
+ more_menu.title = TITLE_MORE_IT;
+ more_menu.zoffset = ZOFFSET_IT;
+ //
+ filesys_menu.title = TITLE_FILESYS_IT;
+ filesys_menu.sd_sys = SD_CARD_TEXT_IT;
+ filesys_menu.usb_sys = U_DISK_TEXT_IT;
+
+ //WIFI
+ wifi_menu.title = WIFI_NAME_TEXT_IT;
+ //wifi_menu.key = WIFI_KEY_TEXT_IT;
+ //wifi_menu.ip = WIFI_IP_TEXT_IT;
+ //wifi_menu.state = WIFI_STA_TEXT_IT;
+ wifi_menu.cloud = CLOSE_TEXT_IT;
+ wifi_menu.reconnect = WIFI_RECONNECT_TEXT_IT;
+
+ cloud_menu.title = TITLE_CLOUD_TEXT_IT;
+ cloud_menu.bind = CLOUD_BINDED_IT;
+ cloud_menu.binded = CLOUD_BINDED_IT;
+ cloud_menu.unbind = CLOUD_UNBIND_IT;
+ cloud_menu.unbinding = CLOUD_UNBINDED_IT;
+ cloud_menu.disconnected = CLOUD_DISCONNECTED_IT;
+ cloud_menu.disable = CLOUD_DISABLE_IT;
+ //
+ about_menu.title = ABOUT_TEXT_IT;
+ about_menu.type = ABOUT_TYPE_TEXT_IT;
+ about_menu.version = ABOUT_VERSION_TEXT_IT;
+ about_menu.wifi = ABOUT_WIFI_TEXT_IT;
+ //
+ fan_menu.title = FAN_TEXT_IT;
+ fan_menu.add = FAN_ADD_TEXT_IT;
+ fan_menu.dec = FAN_DEC_TEXT_IT;
+ fan_menu.state = FAN_TIPS1_TEXT_IT;
+ //
+ filament_menu.title = TITLE_FILAMENT_IT;
+ filament_menu.in = FILAMENT_IN_TEXT_IT;
+ filament_menu.out = FILAMENT_OUT_TEXT_IT;
+ filament_menu.ext1 = FILAMENT_EXT0_TEXT_IT;
+ filament_menu.ext2 = FILAMENT_EXT1_TEXT_IT;
+ filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_IT;
+ filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_IT;
+ filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_IT;
+ filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_IT;
+ filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_IT;
+ filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_IT;
+ filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_IT;
+ filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_IT;
+ filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_IT;
+
+ //
+ language_menu.title = LANGUAGE_TEXT_IT;
+
+ //
+ printing_menu.title = TITLE_PRINTING_IT;
+ printing_menu.option = PRINTING_OPERATION_IT;
+ printing_menu.stop = PRINTING_STOP_IT;
+ printing_menu.pause = PRINTING_PAUSE_IT;
+ printing_menu.resume = PRINTING_RESUME_IT;
+
+ //
+ operation_menu.title = TITLE_OPERATION_IT;
+ operation_menu.pause = PRINTING_PAUSE_IT;
+ operation_menu.stop = PRINTING_STOP_IT;
+ operation_menu.temp = PRINTING_TEMP_IT;
+ operation_menu.fan = FAN_TEXT_IT;
+ operation_menu.extr = PRINTING_EXTRUDER_IT;
+ operation_menu.speed = PRINTING_CHANGESPEED_IT;
+ operation_menu.filament = FILAMENT_TEXT_IT;
+ operation_menu.more = PRINTING_MORE_IT;
+ operation_menu.move = PRINTING_MOVE_IT;
+ operation_menu.auto_off = AUTO_SHUTDOWN_IT;
+ operation_menu.manual_off = MANUAL_SHUTDOWN_IT;
+ //
+ pause_menu.title = TITLE_PAUSE_IT;
+ pause_menu.resume = PRINTING_RESUME_IT;
+ pause_menu.stop = PRINTING_STOP_IT;
+ pause_menu.extrude = PRINTING_EXTRUDER_IT;
+ pause_menu.move = PRINTING_MOVE_IT;
+ pause_menu.filament = FILAMENT_TEXT_IT;
+ pause_menu.more = PRINTING_MORE_IT;
+
+ //
+ speed_menu.title = PRINTING_CHANGESPEED_IT;
+ speed_menu.add = ADD_TEXT_IT;
+ speed_menu.dec = DEC_TEXT_IT;
+ speed_menu.move = MOVE_SPEED_IT;
+ speed_menu.extrude = EXTRUDER_SPEED_IT;
+ speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_IT;
+ speed_menu.move_speed = MOVE_SPEED_STATE_IT;
+ //
+ printing_more_menu.fan = FAN_TEXT_IT;
+ printing_more_menu.auto_close = AUTO_SHUTDOWN_IT;
+ printing_more_menu.manual = MANUAL_SHUTDOWN_IT;
+ printing_more_menu.temp = PRINTING_TEMP_IT;
+ printing_more_menu.speed = PRINTING_CHANGESPEED_IT;
+
+ //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_SP;
+ print_file_dialog_menu.confirm = DIALOG_CONFIRM_IT;
+ print_file_dialog_menu.cancle = DIALOG_CANCLE_IT;
+ print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_IT;
+ print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_IT;
+ print_file_dialog_menu.retry = DIALOG_RETRY_IT;
+ print_file_dialog_menu.stop = DIALOG_STOP_IT;
+ print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_IT;
+ print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_IT;
+ print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_IT;
+ print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_IT;
+ print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_IT;
+ print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_IT;
+ print_file_dialog_menu.reprint = DIALOG_REPRINT_IT;
+ print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_IT;
+ //ZOFFSET
+ zoffset_menu.title = TITLE_ZOFFSET_IT;
+ zoffset_menu.inc = ZOFFSET_INC_IT;
+ zoffset_menu.dec = ZOFFSET_DEC_IT;
+
+ pause_msg_menu.pausing = MESSEGE_PAUSING_IT;
+ pause_msg_menu.changing = MESSEGE_CHANGING_IT;
+ pause_msg_menu.unload = MESSEGE_UNLOAD_IT;
+ pause_msg_menu.waiting = MESSEGE_WAITING_IT;
+ pause_msg_menu.insert = MESSEGE_INSERT_IT;
+ pause_msg_menu.load = MESSEGE_LOAD_IT;
+ pause_msg_menu.purge = MESSEGE_PURGE_IT;
+ pause_msg_menu.resume = MESSEGE_RESUME_IT;
+ pause_msg_menu.heat = MESSEGE_HEAT_IT;
+ pause_msg_menu.heating = MESSEGE_HEATING_IT;
+ pause_msg_menu.option = MESSEGE_OPTION_IT;
+ pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_IT;
+ pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_IT;
+ break;
+
+ #endif
+
+ default:
+ common_menu.dialog_confirm_title = TITLE_DIALOG_CONFIRM_EN;
+ common_menu.text_back = BACK_TEXT_EN;
+ common_menu.close_machine_tips = DIALOG_CLOSE_MACHINE_EN;
+ common_menu.unbind_printer_tips = DIALOG_UNBIND_PRINTER_EN;
+ common_menu.print_special_title = PRINTING_OTHER_LANGUGE;
+ common_menu.pause_special_title = PRINTING_PAUSE_OTHER_LANGUGE;
+ common_menu.operate_special_title = PRINTING_OPERATION_OTHER_LANGUGE;
+ //
+ main_menu.title = TITLE_READYPRINT_EN;
+ main_menu.preheat = PREHEAT_TEXT_EN;
+ main_menu.move = MOVE_TEXT_EN;
+ main_menu.home = HOME_TEXT_EN;
+ main_menu.print = PRINT_TEXT_EN;
+ main_menu.extrude = EXTRUDE_TEXT_EN;
+ main_menu.leveling = LEVELING_TEXT_EN;
+ main_menu.autoleveling = AUTO_LEVELING_TEXT_EN;
+ main_menu.fan = FAN_TEXT_EN;
+ main_menu.set = SET_TEXT_EN;
+ main_menu.more = MORE_TEXT_EN;
+ main_menu.tool = TOOL_TEXT_EN;
+ //TOOL
+ tool_menu.title = TOOL_TEXT_EN;
+ tool_menu.preheat = TOOL_PREHEAT_EN;
+ tool_menu.extrude = TOOL_EXTRUDE_EN;
+ tool_menu.move = TOOL_MOVE_EN;
+ tool_menu.home = TOOL_HOME_EN;
+ tool_menu.leveling = TOOL_LEVELING_EN;
+ tool_menu.autoleveling = TOOL_AUTO_LEVELING_EN;
+ tool_menu.filament = TOOL_FILAMENT_EN;
+ tool_menu.more = TOOL_MORE_EN;
+ //
+ preheat_menu.adjust_title = TITLE_ADJUST_EN;
+ preheat_menu.title = TITLE_PREHEAT_EN;
+ preheat_menu.add = ADD_TEXT_EN;
+ preheat_menu.dec = DEC_TEXT_EN;
+ preheat_menu.ext1 = EXTRUDER_1_TEXT_EN;
+ preheat_menu.ext2 = EXTRUDER_2_TEXT_EN;
+ preheat_menu.hotbed = HEATBED_TEXT_EN;
+ preheat_menu.off = CLOSE_TEXT_EN;
+ //
+ move_menu.title = TITLE_MOVE_EN;
+ //
+ home_menu.title = TITLE_HOME_EN;
+ home_menu.stopmove = HOME_STOPMOVE_EN;
+ //
+ file_menu.title = TITLE_CHOOSEFILE_EN;
+ file_menu.page_up = PAGE_UP_TEXT_EN;
+ file_menu.page_down = PAGE_DOWN_TEXT_EN;
+ file_menu.file_loading = FILE_LOADING_EN;
+ file_menu.no_file = NO_FILE_EN;
+ file_menu.no_file_and_check = NO_FILE_EN;//NO_FILE_AND_CHECK_EN;
+ //
+ extrude_menu.title = TITLE_EXTRUDE_EN;
+ extrude_menu.in = EXTRUDER_IN_TEXT_EN;
+ extrude_menu.out = EXTRUDER_OUT_TEXT_EN;
+ extrude_menu.ext1 = EXTRUDER_1_TEXT_EN;
+ extrude_menu.ext2 = EXTRUDER_2_TEXT_EN;
+ extrude_menu.low = EXTRUDE_LOW_SPEED_TEXT_EN;
+ extrude_menu.normal = EXTRUDE_MEDIUM_SPEED_TEXT_EN;
+ extrude_menu.high = EXTRUDE_HIGH_SPEED_TEXT_EN;
+ extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_EN;
+ //
+ leveling_menu.title = TITLE_LEVELING_EN;
+ leveling_menu.position1 = LEVELING_POINT1_TEXT_EN;
+ leveling_menu.position2 = LEVELING_POINT2_TEXT_EN;
+ leveling_menu.position3 = LEVELING_POINT3_TEXT_EN;
+ leveling_menu.position4 = LEVELING_POINT4_TEXT_EN;
+ leveling_menu.position5 = LEVELING_POINT5_TEXT_EN;
+ //
+ set_menu.title = TITLE_SET_EN;
+ set_menu.filesys = FILESYS_TEXT_EN;
+ set_menu.wifi = WIFI_TEXT_EN;
+ set_menu.about = ABOUT_TEXT_EN;
+ set_menu.fan = FAN_TEXT_EN;
+ set_menu.filament = FILAMENT_TEXT_EN;
+ set_menu.breakpoint = BREAK_POINT_TEXT_EN;
+ set_menu.motoroff = MOTOR_OFF_TEXT_EN;
+ set_menu.motoroffXY = MOTOR_OFF_XY_TEXT_EN;
+ set_menu.language = LANGUAGE_TEXT_EN;
+ set_menu.shutdown = SHUTDOWN_TEXT_EN;
+ //set_menu.machine_para = MACHINE_PARA_EN;
+ //
+ more_menu.title = TITLE_MORE_EN;
+ more_menu.zoffset = ZOFFSET_EN;
+ //
+ filesys_menu.title = TITLE_FILESYS_EN;
+ filesys_menu.sd_sys = SD_CARD_TEXT_EN;
+ filesys_menu.usb_sys = U_DISK_TEXT_EN;
+ //WIFI
+ wifi_menu.title = WIFI_TEXT;
+ //wifi_menu.key = WIFI_KEY_TEXT_EN;
+ //wifi_menu.ip = WIFI_IP_TEXT_EN;
+ //wifi_menu.state = WIFI_STA_TEXT_EN;
+ wifi_menu.cloud = CLOUD_TEXT_EN;
+ wifi_menu.reconnect = WIFI_RECONNECT_TEXT_EN;
+
+ cloud_menu.title = TITLE_CLOUD_TEXT_EN;
+ cloud_menu.bind = CLOUD_BINDED_EN;
+ cloud_menu.binded = CLOUD_BINDED_EN;
+ cloud_menu.unbind = CLOUD_UNBIND_EN;
+ cloud_menu.unbinding = CLOUD_UNBINDED_EN;
+ cloud_menu.disconnected = CLOUD_DISCONNECTED_EN;
+ cloud_menu.disable = CLOUD_DISABLE_EN;
+ //
+ about_menu.title = TITLE_ABOUT_EN;
+ about_menu.type = ABOUT_TYPE_TEXT_EN;
+ about_menu.version = ABOUT_VERSION_TEXT_EN;
+ about_menu.wifi = ABOUT_WIFI_TEXT_EN;
+ //
+ fan_menu.title = TITLE_FAN_EN;
+ fan_menu.add = FAN_ADD_TEXT_EN;
+ fan_menu.dec = FAN_DEC_TEXT_EN;
+ fan_menu.state = FAN_TIPS1_TEXT_EN;
+ //
+ filament_menu.title = TITLE_FILAMENT_EN;
+ filament_menu.in = FILAMENT_IN_TEXT_EN;
+ filament_menu.out = FILAMENT_OUT_TEXT_EN;
+ filament_menu.ext1 = FILAMENT_EXT0_TEXT_EN;
+ filament_menu.ext2 = FILAMENT_EXT1_TEXT_EN;
+ filament_menu.ready_replace = FILAMENT_CHANGE_TEXT_EN;
+ filament_menu.filament_dialog_load_heat = FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN;
+ filament_menu.filament_dialog_load_heat_confirm = FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN;
+ filament_menu.filament_dialog_loading = FILAMENT_DIALOG_LOADING_TIPS_EN;
+ filament_menu.filament_dialog_load_completed = FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN;
+ filament_menu.filament_dialog_unload_heat = FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN;
+ filament_menu.filament_dialog_unload_heat_confirm = FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN;
+ filament_menu.filament_dialog_unloading = FILAMENT_DIALOG_UNLOADING_TIPS_EN;
+ filament_menu.filament_dialog_unload_completed = FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN;
+
+ //
+ language_menu.title = TITLE_LANGUAGE_EN;
+ language_menu.next = PAGE_DOWN_TEXT_EN;
+ language_menu.up = PAGE_UP_TEXT_EN;
+ //
+ printing_menu.title = TITLE_PRINTING_EN;
+ printing_menu.option = PRINTING_OPERATION_EN;
+ printing_menu.stop = PRINTING_STOP_EN;
+ printing_menu.pause = PRINTING_PAUSE_EN;
+ printing_menu.resume = PRINTING_RESUME_EN;
+
+ //
+ operation_menu.title = TITLE_OPERATION_EN;
+ operation_menu.pause = PRINTING_PAUSE_EN;
+ operation_menu.stop = PRINTING_STOP_EN;
+ operation_menu.temp = PRINTING_TEMP_EN;
+ operation_menu.fan = FAN_TEXT_EN;
+ operation_menu.extr = PRINTING_EXTRUDER_EN;
+ operation_menu.speed = PRINTING_CHANGESPEED_EN;
+ operation_menu.filament = FILAMENT_TEXT_EN;
+ operation_menu.more = PRINTING_MORE_EN;
+ operation_menu.move = PRINTING_MOVE_EN;
+ operation_menu.auto_off = AUTO_SHUTDOWN_EN;
+ operation_menu.manual_off = MANUAL_SHUTDOWN_EN;
+ //
+ pause_menu.title = TITLE_PAUSE_EN;
+ pause_menu.resume = PRINTING_RESUME_EN;
+ pause_menu.stop = PRINTING_STOP_EN;
+ pause_menu.extrude = PRINTING_EXTRUDER_EN;
+ pause_menu.move = PRINTING_MOVE_EN;
+ pause_menu.filament = FILAMENT_TEXT_EN;
+ pause_menu.more = PRINTING_MORE_EN;
+
+ //
+ speed_menu.title = TITLE_CHANGESPEED_EN;
+ speed_menu.add = ADD_TEXT_EN;
+ speed_menu.dec = DEC_TEXT_EN;
+ speed_menu.move = MOVE_SPEED_EN;
+ speed_menu.extrude = EXTRUDER_SPEED_EN;
+ speed_menu.extrude_speed = EXTRUDER_SPEED_STATE_EN;
+ speed_menu.move_speed = MOVE_SPEED_STATE_EN;
+ //
+ printing_more_menu.title = TITLE_MORE_EN;
+ printing_more_menu.fan = FAN_TEXT_EN;
+ printing_more_menu.auto_close = AUTO_SHUTDOWN_EN;
+ printing_more_menu.manual = MANUAL_SHUTDOWN_EN;
+ printing_more_menu.speed = PRINTING_CHANGESPEED_EN;
+ printing_more_menu.temp = PRINTING_TEMP_EN;
+
+ //print_file_dialog_menu.title = TITLE_DIALOG_CONFIRM_EN;
+ print_file_dialog_menu.confirm = DIALOG_CONFIRM_EN;
+ print_file_dialog_menu.cancle = DIALOG_CANCLE_EN;
+ print_file_dialog_menu.print_file = DIALOG_PRINT_MODEL_EN;
+ print_file_dialog_menu.cancle_print = DIALOG_CANCEL_PRINT_EN;
+ print_file_dialog_menu.retry = DIALOG_RETRY_EN;
+ print_file_dialog_menu.stop = DIALOG_STOP_EN;
+ print_file_dialog_menu.no_file_print_tips = DIALOG_ERROR_TIPS1_EN;
+ print_file_dialog_menu.print_from_breakpoint = DIALOG_REPRINT_FROM_BREAKPOINT_EN;
+ print_file_dialog_menu.close_machine_error = DIALOG_ERROR_TIPS2_EN;
+ print_file_dialog_menu.filament_no_press = DIALOG_FILAMENT_NO_PRESS_EN;
+ print_file_dialog_menu.print_finish = DIALOG_PRINT_FINISH_EN;
+ print_file_dialog_menu.print_time = DIALOG_PRINT_TIME_EN;
+ print_file_dialog_menu.reprint = DIALOG_REPRINT_EN;
+ print_file_dialog_menu.wifi_enable_tips = DIALOG_WIFI_ENABLE_TIPS_EN;
+ //ZOFFSET
+ zoffset_menu.title = TITLE_ZOFFSET_EN;
+ zoffset_menu.inc = ZOFFSET_INC_EN;
+ zoffset_menu.dec = ZOFFSET_DEC_EN;
+
+ pause_msg_menu.pausing = MESSEGE_PAUSING_EN;
+ pause_msg_menu.changing = MESSEGE_CHANGING_EN;
+ pause_msg_menu.unload = MESSEGE_UNLOAD_EN;
+ pause_msg_menu.waiting = MESSEGE_WAITING_EN;
+ pause_msg_menu.insert = MESSEGE_INSERT_EN;
+ pause_msg_menu.load = MESSEGE_LOAD_EN;
+ pause_msg_menu.purge = MESSEGE_PURGE_EN;
+ pause_msg_menu.resume = MESSEGE_RESUME_EN;
+ pause_msg_menu.heat = MESSEGE_HEAT_EN;
+ pause_msg_menu.heating = MESSEGE_HEATING_EN;
+ pause_msg_menu.option = MESSEGE_OPTION_EN;
+ pause_msg_menu.purgeMore = MESSEGE_PURGE_MORE_EN;
+ pause_msg_menu.continuePrint = MESSEGE_CONTINUE_PRINT_EN;
+ break;
+ }
+}
+
+#endif // TFT_LITTLE_VGL_UI
diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h
new file mode 100644
index 0000000000..2443bc7d57
--- /dev/null
+++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h
@@ -0,0 +1,584 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "inc/tft_Language_en.h"
+#include "inc/tft_Language_s_cn.h"
+#include "inc/tft_Language_t_cn.h"
+#include "inc/tft_Language_ru.h"
+#include "inc/tft_Language_fr.h"
+#include "inc/tft_Language_sp.h"
+#include "inc/tft_Language_it.h"
+
+extern void disp_language_init();
+
+#define LANG_SIMPLE_CHINESE 1
+#define LANG_COMPLEX_CHINESE 2
+#define LANG_ENGLISH 3
+#define LANG_JAPAN 4
+#define LANG_GERMAN 5
+#define LANG_FRENCH 6
+#define LANG_RUSSIAN 7
+#define LANG_KOREAN 8
+#define LANG_TURKISH 9
+#define LANG_SPANISH 10
+#define LANG_GREEK 11
+#define LANG_ITALY 12
+#define LANG_PORTUGUESE 13
+
+#define MULTI_LANGUAGE_ENABLE 1
+#define MULTI_LANGUAGE_DISABLE 0
+
+typedef struct common_menu_disp {
+ const char *text_back;
+ const char *dialog_confirm_title;
+ const char *close_machine_tips;
+ const char *unbind_printer_tips;
+ const char *print_special_title;
+ const char *pause_special_title;
+ const char *operate_special_title;
+ const char *next;
+ const char *previous;
+} common_menu_def;
+extern common_menu_def common_menu;
+
+typedef struct main_menu_disp {
+ const char *title;
+ const char *preheat;
+ const char *move;
+ const char *home;
+ const char *print;
+ const char *extrude;
+ const char *leveling;
+ const char *autoleveling;
+ const char *fan;
+ const char *set;
+ const char *tool;
+ const char *more;
+ const char *machine_para;
+} main_menu_def;
+extern main_menu_def main_menu;
+
+typedef struct preheat_menu_disp {
+ const char *adjust_title;
+ const char *title;
+ const char *add;
+ const char *dec;
+ const char *ext1;
+ const char *ext2;
+ const char *hotbed;
+ const char *off;
+ const char *step_1c;
+ const char *step_5c;
+ const char *step_10c;
+ const char *back;
+
+ const char *value_state;
+
+ const char *dialog_tips;
+
+}preheat_menu_def;
+extern preheat_menu_def preheat_menu;
+
+typedef struct move_menu_disp {
+ const char *title;
+ const char *x_add;
+ const char *x_dec;
+ const char *y_add;
+ const char *y_dec;
+ const char *z_add;
+ const char *z_dec;
+ const char *step_001mm;
+ const char *step_005mm;
+ const char *step_01mm;
+ const char *step_1mm;
+ const char *step_10mm;
+ const char *back;
+} move_menu_def;
+extern move_menu_def move_menu;
+
+typedef struct home_menu_disp {
+ const char *title;
+ const char *home_all;
+ const char *home_x;
+ const char *home_y;
+ const char *home_z;
+ const char *stopmove;
+ const char *back;
+} home_menu_def;
+extern home_menu_def home_menu;
+
+typedef struct file_menu_disp {
+ const char *title;
+ const char *page_up;
+ const char *page_down;
+ const char *back;
+
+ const char *file_loading;
+ const char *no_file;
+ const char *no_file_and_check;
+
+}file_menu_def;
+extern file_menu_def file_menu;
+
+typedef struct extrude_menu_disp {
+ const char *title;
+ const char *in;
+ const char *out;
+ const char *ext1;
+ const char *ext2;
+ const char *step_1mm;
+ const char *step_5mm;
+ const char *step_10mm;
+ const char *low;
+ const char *normal;
+ const char *high;
+ const char *back;
+
+ const char *count_value_mm;
+ const char *count_value_cm;
+ const char *count_value_m;
+ const char *temp_value;
+ const char *temper_text;
+} extrude_menu_def;
+extern extrude_menu_def extrude_menu;
+
+typedef struct leveling_menu_disp {
+ const char *title;
+ const char *position1;
+ const char *position2;
+ const char *position3;
+ const char *position4;
+ const char *position5;
+
+ char *back;
+} leveling_menu_def;
+extern leveling_menu_def leveling_menu;
+
+typedef struct set_menu_disp {
+ const char *title;
+ const char *filesys;
+ const char *wifi;
+ const char *about;
+ const char *fan;
+ const char *filament;
+ const char *breakpoint;
+ const char *motoroff;
+ const char *motoroffXY;
+ const char *shutdown;
+ const char *language;
+ const char *machine_para;
+ const char *back;
+} set_menu_def;
+extern set_menu_def set_menu;
+
+typedef struct filesys_menu_disp {
+ const char *title;
+ const char *filesys;
+ const char *sd_sys;
+ const char *usb_sys;
+ const char *back;
+} filesys_menu_def;
+extern filesys_menu_def filesys_menu;
+
+typedef struct more_menu_disp {
+ const char *title;
+ const char *zoffset;
+ const char *back;
+} more_menu_def;
+extern more_menu_def more_menu;
+
+typedef struct wifi_menu_disp {
+ const char *title;
+ const char *ip;
+ const char *wifi;
+ const char *key;
+ const char *state_ap;
+ const char *state_sta;
+ const char *cloud;
+ const char *connected;
+ const char *disconnected;
+ const char *exception;
+ const char *back;
+ const char *reconnect;
+} wifi_menu_def;
+extern wifi_menu_def wifi_menu;
+
+typedef struct cloud_menu_disp {
+ const char *title;
+ const char *unbind;
+ const char *unbinding;
+ const char *unbinded;
+ const char *bind;
+ const char *binding;
+ const char *binded;
+ const char *disable;
+ const char *disconnected;
+ const char *back;
+ const char *unbind_printer_tips;
+} cloud_menu_def;
+extern cloud_menu_def cloud_menu;
+
+typedef struct about_menu_disp {
+ const char *title;
+ const char *type_name;
+ const char *firmware_v;
+ const char *type;
+ const char *version;
+ const char *wifi;
+ const char *type_robin;
+ const char *type_robin_mini;
+ const char *back;
+} about_menu_def;
+extern about_menu_def about_menu;
+
+typedef struct fan_menu_disp {
+ const char *title;
+ const char *add;
+ const char *dec;
+ const char *full;
+ const char *half;
+ const char *off;
+ const char *back;
+
+ const char *state;
+ const char *state_value;
+} fan_menu_def;
+extern fan_menu_def fan_menu;
+
+typedef struct filament_menu_disp {
+ const char *title;
+ const char *in;
+ const char *out;
+ const char *ext1;
+ const char *ext2;
+ const char *back;
+ const char *stat_temp;
+ const char *ready_replace;
+ const char *replacing;
+ const char *loading;
+ const char *unloading;
+ const char *heating;
+ const char *complete_and_back;
+ const char *filament_dialog_load_heat;
+ const char *filament_dialog_unload_heat;
+ const char *filament_dialog_load_heat_confirm;
+ const char *filament_dialog_unload_heat_confirm;
+ const char *filament_dialog_loading;
+ const char *filament_dialog_unloading;
+ const char *filament_dialog_load_completed;
+ const char *filament_dialog_unload_completed;
+ const char *filament_dialog_ok;
+ const char *filament_dialog_back;
+} filament_menu_def;
+extern filament_menu_def filament_menu;
+
+typedef struct language_menu {
+ const char *title;
+ const char *chinese_s;
+ const char *chinese_t;
+ const char *english;
+ const char *russian;
+ const char *japan;
+ const char *italy;
+ const char *german;
+ const char *spanish;
+ const char *korean;
+ const char *french;
+ const char *brazil;
+ const char *portuguese;
+ const char *next;
+ const char *up;
+ const char *back;
+} language_menu_def;
+extern language_menu_def language_menu;
+
+typedef struct printing_menu_disp {
+ const char *title;
+ const char *option;
+ const char *temp1;
+ const char *temp2;
+ const char *bed_temp;
+ const char *fan_speed;
+ const char *pause;
+ const char *resume;
+ const char *stop;
+} printing_menu_def;
+extern printing_menu_def printing_menu;
+
+typedef struct operation_menu_disp {
+ const char *title;
+ const char *pause;
+ const char *stop;
+ const char *temp;
+ const char *fan;
+ const char *filament;
+ const char *extr;
+ const char *speed;
+ const char *move;
+ const char *more;
+ const char *auto_off;
+ const char *manual_off;
+ const char *back;
+ const char *babystep;
+} operation_menu_def;
+extern operation_menu_def operation_menu;
+
+typedef struct pause_menu_disp {
+ const char *title;
+ const char *resume;
+ const char *stop;
+ const char *extrude;
+ const char *move;
+ const char *filament;
+ const char *more;
+} pause_menu_def;
+extern pause_menu_def pause_menu;
+
+typedef struct speed_menu_disp {
+ const char *title;
+ const char *add;
+ const char *dec;
+ const char *extrude;
+ const char *move;
+ const char *step_1percent;
+ const char *step_5percent;
+ const char *step_10percent;
+ const char *back;
+ const char *move_speed;
+ const char *extrude_speed;
+} speed_menu_def;
+extern speed_menu_def speed_menu;
+
+typedef struct printing_more_menu_disp {
+ const char *title;
+ const char *fan;
+ const char *auto_close;
+ const char *manual;
+ const char *temp;
+ const char *speed;
+ const char *back;
+} printing_more_menu_def;
+extern printing_more_menu_def printing_more_menu;
+
+typedef struct dialog_menu_disp {
+ const char *confirm_title;
+
+ const char *error1_repint_no_file;
+ const char *error2_communication_fail;
+ const char *error3_filename_too_long;
+ const char *error4_no_file;
+ const char *error5_check_filesys;
+
+ const char *tip1_print_file;
+ const char *tip2_stop_file;
+} dialog_menu_def;
+extern dialog_menu_def dialog_menu;
+
+typedef struct print_file_dialog_disp {
+ const char *title;
+ const char *confirm;
+ const char *cancle;
+ const char *print_file;
+ const char *cancle_print;
+ const char *retry;
+ const char *stop;
+ const char *no_file_print_tips;
+ const char *print_from_breakpoint;
+ const char *file_name_too_long_error;
+ const char *close_machine_error;
+ const char *filament_no_press;
+ const char *print_finish;
+ const char *print_time;
+ const char *reprint;
+ const char *wifi_enable_tips;
+} print_file_dialog_menu_def;
+extern print_file_dialog_menu_def print_file_dialog_menu;
+
+typedef struct zoffset_menu_disp {
+ const char *title;
+ const char *inc;
+ const char *dec;
+ const char *step001;
+ const char *step01;
+ const char *step1;
+ const char *back;
+} zoffset_menu_def;
+extern zoffset_menu_def zoffset_menu;
+
+typedef struct tool_menu_disp {
+ const char *title;
+ const char *preheat;
+ const char *extrude;
+ const char *move;
+ const char *home;
+ const char *leveling;
+ const char *autoleveling;
+ const char *filament;
+ const char *more;
+ const char *back;
+} tool_menu_def;
+extern tool_menu_def tool_menu;
+
+typedef struct MachinePara_menu_disp {
+ const char *title;
+ const char *MachineSetting;
+ const char *TemperatureSetting;
+ const char *MotorSetting;
+ const char *AdvanceSetting;
+ //const char *back;
+} MachinePara_menu_def;
+extern MachinePara_menu_def MachinePara_menu;
+
+typedef struct MachineSettings_menu_disp {
+ const char *title;
+ const char *Machine;
+ const char *Stroke;
+ const char *HomeDir;
+ const char *EndStopType;
+ const char *filamet;
+ const char *leveling;
+ const char *back;
+} MachineSettings_menu_def;
+extern MachineSettings_menu_def MachineSettings_menu;
+
+typedef struct TemperatureSettings_menu_disp {
+ const char *title;
+ const char *nozzle;
+ const char *hotbed;
+ const char *preheat;
+ const char *back;
+} TemperatureSettings_menu_def;
+extern TemperatureSettings_menu_def TemperatureSettings_menu;
+
+typedef struct pause_msg_disp {
+ const char *pausing;
+ const char *changing;
+ const char *unload;
+ const char *waiting;
+ const char *insert;
+ const char *load;
+ const char *purge;
+ const char *resume;
+ const char *heat;
+ const char *heating;
+ const char *option;
+ const char *purgeMore;
+ const char *continuePrint;
+} pause_msg_def;
+extern pause_msg_def pause_msg_menu;
+
+/*****************************************/
+//********************************************//
+//#if defined(TFT70)
+//
+//#elif defined(TFT35)
+#define TEXT_VALUE "%d/%d"
+//#endif
+
+#define TEXT_VALUE_T ": %d℃"
+#define TEXT_VALUE_mm ": %dmm"
+#define TEXT_VALUE_cm ": %dcm"
+#define TEXT_VALUE_m ": %dm"
+
+#define TEMP_UNIT_SYBOL "%d℃"
+#define FLOAT_TEMP_UNIT_SYBOL "%.1f℃"
+
+#define TEXT_1C "1℃"
+#define TEXT_5C "5℃"
+#define TEXT_10C "10℃"
+
+#define AXIS_X_ADD_TEXT "X+"
+#define AXIS_X_DEC_TEXT "X-"
+#define AXIS_Y_ADD_TEXT "Y+"
+#define AXIS_Y_DEC_TEXT "Y-"
+#define AXIS_Z_ADD_TEXT "Z+"
+#define AXIS_Z_DEC_TEXT "Z-"
+#define TEXT_001MM "0.01mm"
+#define TEXT_005MM "0.05mm"
+#define TEXT_01MM "0.1mm"
+#define TEXT_1MM "1mm"
+#define TEXT_10MM "10mm"
+
+#define EXTRUDE_1MM_TEXT "1mm"
+#define EXTRUDE_5MM_TEXT "5mm"
+#define EXTRUDE_10MM_TEXT "10mm"
+
+#define STEP_1PERCENT "1%"
+#define STEP_5PERCENT "5%"
+#define STEP_10PERCENT "10%"
+
+#define LANGUAGE_S_CN "简体"
+#define LANGUAGE_T_CN "繁体"
+#define LANGUAGE_EN "English"
+#define LANGUAGE_JP "日本語"
+#define LANGUAGE_GE "Deutsch"
+#define LANGUAGE_FR "français"
+#define LANGUAGE_IT "Italia"
+#define LANGUAGE_PR "português"
+#define LANGUAGE_KR "Korean"
+#define LANGUAGE_BR "Brazil"
+#define LANGUAGE_RU "русский"
+#define LANGUAGE_SP "español"
+
+#define HOME_X_TEXT "X"
+#define HOME_Y_TEXT "Y"
+#define HOME_Z_TEXT "Z"
+#define HOME_ALL_TEXT "All"
+//#if defined(MKS_ROBIN_NANO)
+#define ABOUT_TYPE_TEXT "MKS Robin Pro"
+//#elif defined(MKS_ROBIN_MINI)
+//#define ABOUT_TYPE_TEXT "MKS Robin Mini"
+//#endif
+#define ABOUT_VERSION_TEXT "1.0.0"
+//#define ABOUT_WIFI_TEXT "WiFi:"
+
+#define FAN_OPEN_TEXT "100%"
+#define FAN_HALF_TEXT "50%"
+#define FAN_CLOSE_TEXT "0%"
+//#define FAN_TIPS1_TEXT "FAN"
+//#define FAN_TIPS2_TEXT "FAN\nClose"
+
+#define WIFI_TEXT "WIFI"
+#define WIFI_IP_TEXT "IP: "
+#define WIFI_NAME_TEXT "WiFi: "
+#define WIFI_KEY_TEXT "Key: "
+#define WIFI_STATE_AP_TEXT "State: AP"
+#define WIFI_STATE_STA_TEXT "State: STA"
+#define WIFI_CONNECTED_TEXT "Connected"
+#define WIFI_DISCONNECTED_TEXT "Disconnected"
+#define WIFI_EXCEPTION_TEXT "Exception"
+
+#define FILAMENT_TIPS2_TEXT "T:"
+
+#define DIALOG_UPLOAD_ING_EN "Uploading......"
+#define DIALOG_UPLOAD_ERROR_EN "Upload error"
+#define DIALOG_UPLOAD_FINISH_EN "Upload finished"
+#define DIALOG_UPLOAD_SIZE_EN "Size"
+#define DIALOG_UPLOAD_TIME_EN "Time"
+#define DIALOG_UPLOAD_SPEED_EN "Speed"
+#define DIALOG_UPDATE_WIFI_FIRMWARE_EN "Updating wifi model firmware"
+#define DIALOG_UPDATE_WIFI_WEB_EN "Updating wifi model web data"
+
+#define ZOFFSET_STEP001 "0.01mm"
+#define ZOFFSET_STEP01 "0.1mm"
+#define ZOFFSET_STEP1 "1mm"
diff --git a/Marlin/src/module/thermistor/thermistor_22.h b/Marlin/src/module/thermistor/thermistor_22.h
index b3ef68a47e..e9b6acbb1e 100644
--- a/Marlin/src/module/thermistor/thermistor_22.h
+++ b/Marlin/src/module/thermistor/thermistor_22.h
@@ -1,9 +1,9 @@
/**
* Marlin 3D Printer Firmware
- * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
- * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ * 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
diff --git a/Marlin/src/module/thermistor/thermistor_23.h b/Marlin/src/module/thermistor/thermistor_23.h
index 46c025d21a..13918c5893 100644
--- a/Marlin/src/module/thermistor/thermistor_23.h
+++ b/Marlin/src/module/thermistor/thermistor_23.h
@@ -1,9 +1,9 @@
/**
* Marlin 3D Printer Firmware
- * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
- * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ * 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
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h
index 06369fbd27..d1f418ce00 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h
@@ -45,6 +45,7 @@
//#define FLASH_EEPROM_EMULATION
#define SDCARD_EEPROM_EMULATION
#endif
+#define ENABLE_SPI2
//
// Limit Switches
@@ -106,16 +107,27 @@
//
// Misc. Functions
//
-#define POWER_LOSS_PIN PA2 // PW_DET
-#define PS_ON_PIN PA3 // PW_OFF
+//#define POWER_LOSS_PIN PA2 // PW_DET
+//#define PS_ON_PIN PA3 // PW_OFF
-#define LED_PIN PB2
+//#define SUICIDE_PIN PB2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY
+//#define SUICIDE_PIN_INVERTING false
+
+//#define KILL_PIN PA2 // Enable MKSPWC support ROBIN NANO v1.2 ONLY
+//#define KILL_PIN_INVERTING true // Enable MKSPWC support ROBIN NANO v1.2 ONLY
+
+//#define SERVO0_PIN PA8 // Enable BLTOUCH support ROBIN NANO v1.2 ONLY
+
+//#define LED_PIN PB2
+
+#define MT_DET_1_PIN PA4
+#define MT_DET_PIN_INVERTING false
//
// SD Card
//
#ifndef SDCARD_CONNECTION
- #define SDCARD_CONNECTION ONBOARD
+ //#define SDCARD_CONNECTION ONBOARD
#endif
#define SDIO_SUPPORT
@@ -131,7 +143,90 @@
* If the screen stays white, disable 'LCD_RESET_PIN'
* to let the bootloader init the screen.
*/
-#if ENABLED(FSMC_GRAPHICAL_TFT)
+
+#if ENABLED(SPI_GRAPHICAL_TFT)
+
+ #if HAS_SPI_LCD
+
+ #define BEEPER_PIN PC5
+ #define BTN_ENC PE13
+ #define LCD_PINS_ENABLE PD13
+ #define LCD_PINS_RS PC6
+ #define BTN_EN1 PE8
+ #define BTN_EN2 PE11
+ #define LCD_BACKLIGHT_PIN -1
+
+ // MKS MINI12864 and MKS LCD12864B; If using MKS LCD12864A (Need to remove RPK2 resistor)
+ #if ENABLED(MKS_MINI_12864)
+ #define LCD_BACKLIGHT_PIN -1
+ #define LCD_RESET_PIN -1
+ #define DOGLCD_A0 PD11
+ #define DOGLCD_CS PE15
+ #define DOGLCD_SCK PA5
+ #define DOGLCD_MOSI PA7
+
+ // Required for MKS_MINI_12864 with this board
+ #define MKS_LCD12864B
+ #undef SHOW_BOOTSCREEN
+
+ #else // !MKS_MINI_12864
+
+ #define LCD_PINS_D4 PE14
+ #if ENABLED(ULTIPANEL)
+ #define LCD_PINS_D5 PE15
+ #define LCD_PINS_D6 PD11
+ #define LCD_PINS_D7 PD10
+ #endif
+
+ #ifndef ST7920_DELAY_1
+ #define ST7920_DELAY_1 DELAY_NS(125)
+ #endif
+ #ifndef ST7920_DELAY_2
+ #define ST7920_DELAY_2 DELAY_NS(125)
+ #endif
+ #ifndef ST7920_DELAY_3
+ #define ST7920_DELAY_3 DELAY_NS(125)
+ #endif
+
+ #endif // !MKS_MINI_12864
+
+ #else
+
+ #define SPI_TFT_CS_PIN PD11
+ #define SPI_TFT_SCK_PIN PA5
+ #define SPI_TFT_MISO_PIN PA6
+ #define SPI_TFT_MOSI_PIN PA7
+ #define SPI_TFT_DC_PIN PD10
+ #define SPI_TFT_RST_PIN PC6
+
+ #define LCD_BACKLIGHT_PIN PD13
+
+ #define TOUCH_CS_PIN PE14 // SPI1_NSS
+ #define TOUCH_SCK_PIN PA5 // SPI1_SCK
+ #define TOUCH_MISO_PIN PA6 // SPI1_MISO
+ #define TOUCH_MOSI_PIN PA7 // SPI1_MOSI
+
+ #define BTN_EN1 PE8
+ #define BTN_EN2 PE11
+ #define BEEPER_PIN PC5
+ #define BTN_ENC PE13
+
+ #endif // HAS_SPI_LCD
+
+#elif ENABLED(TFT_LITTLE_VGL_UI)
+
+ #define FSMC_CS_PIN PD7 // NE4
+ #define FSMC_RS_PIN PD11 // A0
+
+ #define TOUCH_CS_PIN PA7 // SPI2_NSS
+ #define TOUCH_SCK_PIN PB13 // SPI2_SCK
+ #define TOUCH_MISO_PIN PB14 // SPI2_MISO
+ #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI
+
+ #define LCD_BACKLIGHT_PIN PD13
+
+#elif ENABLED(FSMC_GRAPHICAL_TFT)
+
#define FSMC_CS_PIN PD7 // NE4
#define FSMC_RS_PIN PD11 // A0
@@ -146,4 +241,13 @@
#define TOUCH_MISO_PIN PB14 // SPI2_MISO
#define TOUCH_MOSI_PIN PB15 // SPI2_MOSI
#endif
+
+#endif
+
+#define SPI_FLASH
+#if ENABLED(SPI_FLASH)
+ #define W25QXX_CS_PIN PB12
+ #define W25QXX_MOSI_PIN PB15
+ #define W25QXX_MISO_PIN PB14
+ #define W25QXX_SCK_PIN PB13
#endif
diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py
new file mode 100644
index 0000000000..0047289adf
--- /dev/null
+++ b/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py
@@ -0,0 +1,40 @@
+import os
+Import("env")
+
+# Relocate firmware from 0x08000000 to 0x08007000
+for define in env['CPPDEFINES']:
+ if define[0] == "VECT_TAB_ADDR":
+ env['CPPDEFINES'].remove(define)
+env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000"))
+
+custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld")
+for i, flag in enumerate(env["LINKFLAGS"]):
+ if "-Wl,-T" in flag:
+ env["LINKFLAGS"][i] = "-Wl,-T" + custom_ld_script
+ elif flag == "-T":
+ env["LINKFLAGS"][i + 1] = custom_ld_script
+
+
+# Encrypt ${PROGNAME}.bin and save it as 'Robin_nano35.bin'
+def encrypt(source, target, env):
+ import sys
+
+ key = [0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80, 0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33, 0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF, 0xF7, 0x3E]
+
+ firmware = open(target[0].path, "rb")
+ robin = open(target[0].dir.path +'/Robin_nano35.bin', "wb")
+ length = os.path.getsize(target[0].path)
+ position = 0
+ try:
+ while position < length:
+ byte = firmware.read(1)
+ if position >= 320 and position < 31040:
+ byte = chr(ord(byte) ^ key[position & 31])
+ if sys.version_info[0] > 2:
+ byte = bytes(byte, 'latin1')
+ robin.write(byte)
+ position += 1
+ finally:
+ firmware.close()
+ robin.close()
+env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt);
diff --git a/platformio.ini b/platformio.ini
index 2ef6b70b89..34a0a41159 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -550,7 +550,6 @@ extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_nano.py
build_flags = ${common_stm32f1.build_flags}
-DMCU_STM32F103VE -DSS_TIMER=4
-
#
# MKS Robin (STM32F103ZET6)
#
@@ -626,6 +625,23 @@ build_flags = ${common_stm32f1.build_flags}
lib_ignore = ${common_stm32f1.lib_ignore}
LiquidCrystal, LiquidTWI2, TMCStepper, U8glib-HAL, SoftwareSerialM
+#
+# MKS Robin Nano (STM32F103VET6)
+#
+[env:mks_robin_nano35]
+platform = ststm32
+board = genericSTM32F103VE
+platform_packages = tool-stm32duino
+build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py
+ ${common.build_flags} -std=gnu++14 -DHAVE_SW_SERIAL -DSS_TIMER=4
+build_unflags = -std=gnu++11
+extra_scripts = buildroot/share/PlatformIO/scripts/mks_robin_nano35.py
+src_filter = ${common.default_src_filter} +
+lib_deps = ${common.lib_deps}
+ SoftwareSerialM=https://github.com/FYSETC/SoftwareSerialM/archive/master.zip
+ MKS-LittlevGL=https://github.com/makerbase-mks/MKS-LittlevGL/archive/master.zip
+lib_ignore = Adafruit NeoPixel, SPI
+
#
# Malyan M200 v2 (STM32F070RB)
#