From 72f9fdc05f4b5e49e3b56fde8a7fc65f6e3bf50b Mon Sep 17 00:00:00 2001 From: Serhiy-K <52166448+Serhiy-K@users.noreply.github.com> Date: Sat, 10 Oct 2020 13:01:46 +0300 Subject: [PATCH] Fixes for TFTGLCD Panel, FastIO (#19614) --- Marlin/src/HAL/STM32/fastio.h | 18 +- Marlin/src/core/language.h | 2 +- Marlin/src/core/utility.h | 2 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/Conditionals_post.h | 2 +- Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp | 223 +++++++----------- Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h | 1 + Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 16 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 2 +- Marlin/src/pins/stm32f0/pins_MALYAN_M300.h | 3 + Marlin/src/pins/stm32f1/pins_MORPHEUS.h | 1 + 12 files changed, 112 insertions(+), 162 deletions(-) diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h index d90b2fbeb0..7d02062b53 100644 --- a/Marlin/src/HAL/STM32/fastio.h +++ b/Marlin/src/HAL/STM32/fastio.h @@ -51,19 +51,19 @@ void FastIO_init(); // Must be called before using fast io macros #if defined(STM32F0xx) || defined(STM32F1xx) || defined(STM32F3xx) || defined(STM32L0xx) || defined(STM32L4xx) #define _WRITE(IO, V) do { \ - if (V) FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(STM_PIN(digitalPin[IO])) ; \ - else FastIOPortMap[STM_PORT(digitalPin[IO])]->BRR = _BV32(STM_PIN(digitalPin[IO])) ; \ + if (V) FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(digitalPinToPinName(IO) & 0x1F) ; \ + else FastIOPortMap[STM_PORT(digitalPin[IO])]->BRR = _BV32(digitalPinToPinName(IO) & 0x1F) ; \ }while(0) #else - #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(STM_PIN(digitalPin[IO]) + ((V) ? 0 : 16))) + #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPin[IO])]->BSRR = _BV32(digitalPinToPinName(IO) + ((V) ? 0 : 16))) #endif -#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPin[IO])]->IDR, _BV32(STM_PIN(digitalPin[IO])))) -#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPin[IO])]->ODR ^= _BV32(STM_PIN(digitalPin[IO]))) +#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPin[IO])]->IDR, _BV32(digitalPinToPinName(IO) & 0x1F))) +#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPin[IO])]->ODR ^= _BV32(digitalPinToPinName(IO) & 0x1F)) #define _GET_MODE(IO) #define _SET_MODE(IO,M) pinMode(IO, M) -#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ +#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) //!< Output Push Pull Mode & GPIO_NOPULL #define _SET_OUTPUT_OD(IO) pinMode(IO, OUTPUT_OPEN_DRAIN) #define WRITE(IO,V) _WRITE(IO,V) @@ -73,9 +73,9 @@ void FastIO_init(); // Must be called before using fast io macros #define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) #define OUT_WRITE_OD(IO,V) do{ _SET_OUTPUT_OD(IO); WRITE(IO,V); }while(0) -#define SET_INPUT(IO) _SET_MODE(IO, INPUT) /*!< Input Floating Mode */ -#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) /*!< Input with Pull-up activation */ -#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ +#define SET_INPUT(IO) _SET_MODE(IO, INPUT) //!< Input Floating Mode +#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, INPUT_PULLUP) //!< Input with Pull-up activation +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) //!< Input with Pull-down activation #define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) #define SET_PWM(IO) _SET_MODE(IO, PWM) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index a644ab2fc8..60d9aa6b72 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -303,7 +303,7 @@ #define LCD_STR_C STR_C #define LCD_STR_E STR_E -#if HAS_MARLINUI_HD44780 +#if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) // Custom characters defined in the first 8 characters of the LCD #define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string! diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index 0481ffc02a..645a4be807 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -71,7 +71,7 @@ public: inline void restore() { ref_ = val_; } }; -#define REMEMBER(N,X,V...) restorer restorer_##N(X, ##V) +#define REMEMBER(N,X,V...) restorer<__typeof__(X)> restorer_##N(X, ##V) #define RESTORE(N) restorer_##N.restore() // Converts from an uint8_t in the range of 0-255 to an uint8_t diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 210bf3e91b..42d82dcc10 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -226,9 +226,9 @@ #define LCD_PROGRESS_BAR #endif #if ENABLED(TFTGLCD_PANEL_I2C) - #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD for I2C and SPI buses (LiquidTWI2 not required) #define LCD_I2C_ADDRESS 0x27 // Must be equal to panel's I2C slave addres #endif + #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD, used for both I2C and SPI buses (LiquidTWI2 not required) #define STD_ENCODER_PULSES_PER_STEP 2 #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 #define LCD_WIDTH 20 // 20 or 24 chars in line diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 80c42955e9..f832137f5b 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2457,7 +2457,7 @@ /** * Buzzer/Speaker */ -#if PIN_EXISTS(BEEPER) || ANY(LCD_USE_I2C_BUZZER, PCA9632_BUZZER, IS_TFTGLCD_PANEL) +#if PIN_EXISTS(BEEPER) || ANY(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) #define HAS_BUZZER 1 #if PIN_EXISTS(BEEPER) #define USE_BEEPER 1 diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp index a537d92081..b5789091dc 100644 --- a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp @@ -32,7 +32,7 @@ * and supports color output. */ -#if NONE(__AVR__, MCU_LPC1768, __STM32F1__, STM32F4xx) +#if NONE(__AVR__, TARGET_LPC1768, __STM32F1__, STM32F4xx) #warning "Selected platform not yet tested. Please contribute your good pin mappings." #endif @@ -72,16 +72,17 @@ TFTGLCD lcd; #define ICON_HOT B01000000 //when any T > 50deg #define PIC_MASK 0x7F -//LEDs not used, for compatibility with Smoothieware +// LEDs not used, for compatibility with Smoothieware #define LED_HOTEND_ON B00000001 #define LED_BED_ON B00000010 #define LED_FAN_ON B00000100 #define LED_HOT B00001000 #define LED_MASK 0x0F -#define FBSIZE (LCD_WIDTH * LCD_HEIGHT + 2) +#define FBSIZE (LCD_WIDTH * LCD_HEIGHT + 2) +#define MIDDLE_Y ((LCD_HEIGHT - 1) / 2) -//markers for change line color +// Markers for change line colors #define COLOR_EDIT '#' #define COLOR_ERROR '!' @@ -114,7 +115,8 @@ enum Commands { // based on Smoothieware commands GET_LCD_ROW = 0xE0, // for detect panel GET_LCD_COL, // reserved for compatibility with Smoothieware, not used LCD_PUT, // write one line to LCD - INIT_SCREEN = 0xFE, // clear panel buffer + CLR_SCREEN, + INIT_SCREEN = 0xFE // clear panel buffer }; static unsigned char framebuffer[FBSIZE]; @@ -123,28 +125,62 @@ static uint8_t cour_line; static uint8_t picBits, ledBits, hotBits; static uint8_t PanelDetected = 0; +// Different platforms use different SPI methods +#if ANY(__AVR__, TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + #define SPI_SEND_ONE(V) SPI.transfer(V); + #define SPI_SEND_TWO(V) SPI.transfer16(V); +#elif defined(STM32F4xx) + #define SPI_SEND_ONE(V) SPI.transfer(V, SPI_CONTINUE); + #define SPI_SEND_TWO(V) SPI.transfer16(V, SPI_CONTINUE); +#elif defined(ARDUINO_ARCH_ESP32) + #define SPI_SEND_ONE(V) SPI.write(V); + #define SPI_SEND_TWO(V) SPI.write16(V); +#endif + +#if ANY(__AVR__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L); +#elif defined(STM32F4xx) + #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L, SPI_CONTINUE); +#elif ANY(TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_ESP32) + #define SPI_SEND_SOME(V,L,Z) do{ for (uint16_t i = 0; i < L; i++) SPI_SEND_ONE(V[(Z)+i]); }while(0) +#endif + // Constructor TFTGLCD::TFTGLCD() {} -//clearing local buffer +// Clear local buffer void TFTGLCD::clear_buffer() { memset(&framebuffer[0], ' ', FBSIZE - 2); framebuffer[FBSIZE - 1] = framebuffer[FBSIZE - 2] = 0; picBits = ledBits = 0; } -//set new text cursor position +// Clear panel's screen +void TFTGLCD::clr_screen() { + if (!PanelDetected) return; + #if ENABLED(TFTGLCD_PANEL_SPI) + WRITE(TFTGLCD_CS, LOW); + SPI_SEND_ONE(CLR_SCREEN); + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); //set I2C device address + Wire.write(CLR_SCREEN); + Wire.endTransmission(); //transmit data + #endif +} + +// Set new text cursor position void TFTGLCD::setCursor(uint8_t col, uint8_t row) { fb = &framebuffer[0] + col + row * LCD_WIDTH; cour_line = row; } -//send char to buffer +// Send char to buffer void TFTGLCD::write(char c) { *fb++ = c; } -//send text line to buffer +// Send text line to buffer void TFTGLCD::print(const char *line) { while (*line) *fb++ = *line++; } @@ -154,27 +190,9 @@ void TFTGLCD::print_line() { if (!PanelDetected) return; #if ENABLED(TFTGLCD_PANEL_SPI) WRITE(TFTGLCD_CS, LOW); - #ifdef __AVR__ - SPI.transfer(LCD_PUT); - SPI.transfer(cour_line); - SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH); - #elif EITHER(MCU_LPC1768, __STM32F1__) - SPI.transfer(LCD_PUT); - SPI.transfer(cour_line); - for (uint16_t i = 0; i < LCD_WIDTH; i++) SPI.transfer(framebuffer[cour_line * LCD_WIDTH + i]); - #elif defined(STM32F4xx) - SPI.transfer(LCD_PUT, SPI_CONTINUE); - SPI.transfer(cour_line, SPI_CONTINUE); - SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(LCD_PUT); - SPI.transfer(cour_line); - SPI.transfer(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(LCD_PUT); - SPI.write(cour_line); - for (uint16_t i = 0; i < LCD_WIDTH; i++) SPI.write(framebuffer[cour_line * LCD_WIDTH + i]); - #endif + SPI_SEND_ONE(LCD_PUT); + SPI_SEND_ONE(cour_line); + SPI_SEND_SOME(framebuffer, LCD_WIDTH, cour_line * LCD_WIDTH); WRITE(TFTGLCD_CS, HIGH); #else Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); //set I2C device address @@ -193,22 +211,8 @@ void TFTGLCD::print_screen(){ #if ENABLED(TFTGLCD_PANEL_SPI) // Send all framebuffer to panel WRITE(TFTGLCD_CS, LOW); - #ifdef __AVR__ - SPI.transfer(LCD_WRITE); - SPI.transfer(&framebuffer[0], FBSIZE); - #elif EITHER(MCU_LPC1768, __STM32F1__) - SPI.transfer(LCD_WRITE); - for (uint16_t i = 0; i < FBSIZE; i++) SPI.transfer(framebuffer[i]); - #elif defined(STM32F4xx) - SPI.transfer(LCD_WRITE, SPI_CONTINUE); - SPI.transfer(&framebuffer[0], FBSIZE, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(LCD_WRITE); - SPI.transfer(&framebuffer[0], FBSIZE); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(LCD_WRITE); - for (uint16_t i = 0; i < FBSIZE; i++) SPI.write(framebuffer[i]); - #endif + SPI_SEND_ONE(LCD_WRITE); + SPI_SEND_SOME(framebuffer, FBSIZE, 0); WRITE(TFTGLCD_CS, HIGH); #else uint8_t r; @@ -235,19 +239,8 @@ void TFTGLCD::setContrast(uint16_t contrast) { if (!PanelDetected) return; #if ENABLED(TFTGLCD_PANEL_SPI) WRITE(TFTGLCD_CS, LOW); - #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) - SPI.transfer(CONTRAST); - SPI.transfer((uint8_t)contrast); - #elif defined(STM32F4xx) - SPI.transfer(CONTRAST, SPI_CONTINUE); - SPI.transfer((uint8_t)contrast, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(CONTRAST); - SPI.transfer((uint8_t)contrast); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(CONTRAST); - SPI.write((uint8_t)contrast); - #endif + SPI_SEND_ONE(CONTRAST); + SPI_SEND_ONE((uint8_t)contrast); WRITE(TFTGLCD_CS, HIGH); #else Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); @@ -257,37 +250,24 @@ void TFTGLCD::setContrast(uint16_t contrast) { #endif } -//reading buttons and encoder states extern volatile int8_t encoderDiff; +// Read buttons and encoder states uint8_t MarlinUI::read_slow_buttons(void) { if (!PanelDetected) return 0; #if ENABLED(TFTGLCD_PANEL_SPI) uint8_t b = 0; WRITE(TFTGLCD_CS, LOW); - #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) - SPI.transfer(READ_ENCODER); - WRITE(TFTGLCD_CS, LOW); //for delay - encoderDiff += SPI.transfer(READ_BUTTONS); - WRITE(TFTGLCD_CS, LOW); //for delay - b = SPI.transfer(GET_SPI_DATA); - #elif defined(STM32F4xx) - SPI.transfer(READ_ENCODER, SPI_CONTINUE); - encoderDiff += SPI.transfer(READ_BUTTONS, SPI_CONTINUE); - b = SPI.transfer(GET_SPI_DATA, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(READ_ENCODER); - WRITE(TFTGLCD_CS, LOW); //for delay ???? - encoderDiff += SPI.transfer(READ_BUTTONS); - WRITE(TFTGLCD_CS, LOW); //for delay ???? - b = SPI.transfer(GET_SPI_DATA); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.transfer(READ_ENCODER); - WRITE(TFTGLCD_CS, LOW); //for delay ???? - encoderDiff += SPI.transfer(READ_BUTTONS); - WRITE(TFTGLCD_CS, LOW); //for delay ???? - b = SPI.transfer(GET_SPI_DATA); + SPI_SEND_ONE(READ_ENCODER); + #ifndef STM32F4xx + WRITE(TFTGLCD_CS, LOW); // for delay #endif + encoderDiff += SPI_SEND_ONE(READ_BUTTONS); + #ifndef STM32F4xx + WRITE(TFTGLCD_CS, LOW); // for delay + WRITE(TFTGLCD_CS, LOW); + #endif + b = SPI_SEND_ONE(GET_SPI_DATA); WRITE(TFTGLCD_CS, HIGH); return b; #else @@ -298,7 +278,7 @@ uint8_t MarlinUI::read_slow_buttons(void) { Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 2, 0, 0, 1); #elif defined(__STM32F1__) Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, (uint8_t)2); - #elif EITHER(STM32F4xx, MCU_LPC1768) + #elif EITHER(STM32F4xx, TARGET_LPC1768) Wire.requestFrom(LCD_I2C_ADDRESS, 2); #endif encoderDiff += Wire.read(); @@ -306,28 +286,14 @@ uint8_t MarlinUI::read_slow_buttons(void) { #endif } -// duration in ms, freq in Hz +// Duration in ms, freq in Hz void MarlinUI::buzz(const long duration, const uint16_t freq) { if (!PanelDetected) return; #if ENABLED(TFTGLCD_PANEL_SPI) WRITE(TFTGLCD_CS, LOW); - #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) - SPI.transfer(BUZZER); - SPI.transfer16((uint16_t)duration); - SPI.transfer16(freq); - #elif defined(STM32F4xx) - SPI.transfer(BUZZER, SPI_CONTINUE); - SPI.transfer16((uint16_t)duration, SPI_CONTINUE); - SPI.transfer16(freq, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(BUZZER); - SPI.transfer16((uint16_t)duration); - SPI.transfer16(freq); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(BUZZER); - SPI.write16((uint16_t)duration); - SPI.write16(freq); - #endif + SPI_SEND_ONE(BUZZER); + SPI_SEND_TWO((uint16_t)duration); + SPI_SEND_TWO(freq); WRITE(TFTGLCD_CS, HIGH); #else Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); @@ -346,24 +312,14 @@ void MarlinUI::init_lcd() { t = 0; #if ENABLED(TFTGLCD_PANEL_SPI) // SPI speed must be less 10MHz - OUT_WRITE(TFTGLCD_CS, HIGH); + _SET_OUTPUT(TFTGLCD_CS); + WRITE(TFTGLCD_CS, HIGH); spiInit(TERN(__STM32F1__, SPI_QUARTER_SPEED, SPI_FULL_SPEED)); WRITE(TFTGLCD_CS, LOW); - #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) - SPI.transfer(GET_LCD_ROW); - t = SPI.transfer(GET_SPI_DATA); - #elif defined(STM32F4xx) - SPI.transfer(GET_LCD_ROW, SPI_CONTINUE); - t = SPI.transfer(GET_SPI_DATA, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(GET_LCD_ROW); - t = SPI.transfer(GET_SPI_DATA); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(GET_LCD_ROW); - t = SPI.transfer(GET_SPI_DATA); - #endif + SPI_SEND_ONE(GET_LCD_ROW); + t = SPI_SEND_ONE(GET_SPI_DATA); #else - #ifdef MCU_LPC1768 + #ifdef TARGET_LPC1768 Wire.begin(); //init twi/I2C #else Wire.begin((uint8_t)LCD_I2C_ADDRESS); //init twi/I2C @@ -373,7 +329,7 @@ void MarlinUI::init_lcd() { Wire.endTransmission(); // send buffer #ifdef __AVR__ Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 1, 0, 0, 1); - #elif ANY(__STM32F1__, STM32F4xx, MCU_LPC1768) + #elif ANY(__STM32F1__, STM32F4xx, TARGET_LPC1768) Wire.requestFrom(LCD_I2C_ADDRESS, 1); #endif t = (uint8_t)Wire.read(); @@ -382,20 +338,8 @@ void MarlinUI::init_lcd() { if (t == LCD_HEIGHT) { PanelDetected = 1; #if ENABLED(TFTGLCD_PANEL_SPI) - PanelDetected = 1; - #if ANY(__AVR__, MCU_LPC1768, __STM32F1__) - SPI.transfer(INIT_SCREEN); - SPI.transfer(Marlin); - #elif defined(STM32F4xx) - SPI.transfer(INIT_SCREEN, SPI_CONTINUE); - SPI.transfer(Marlin, SPI_CONTINUE); - #elif ANY(ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) - SPI.transfer(INIT_SCREEN); - SPI.transfer(Marlin); - #elif defined(ARDUINO_ARCH_ESP32) - SPI.write(INIT_SCREEN); - SPI.write(Marlin); - #endif + SPI_SEND_ONE(INIT_SCREEN); + SPI_SEND_ONE(Marlin); WRITE(TFTGLCD_CS, HIGH); #else Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); @@ -415,8 +359,8 @@ bool MarlinUI::detected() { void MarlinUI::clear_lcd() { if (!PanelDetected) return; + lcd.clr_screen(); lcd.clear_buffer(); - lcd.print_screen(); } int16_t MarlinUI::contrast; // Initialized by settings.load() @@ -583,10 +527,10 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *p lcd.write('%'); lcd.write(percent); } else { // For progress bar test - lcd.setCursor(LCD_WIDTH / 2 - 2, LCD_HEIGHT / 2 - 2); + lcd.setCursor(LCD_WIDTH / 2 - 2, MIDDLE_Y); lcd.print(i16tostr3rj(percent)); lcd.write('%'); lcd.print_line(); - lcd.setCursor(0, LCD_HEIGHT / 2 - 1); + lcd.setCursor(0, MIDDLE_Y + 1); lcd.write('%'); lcd.write(percent); lcd.print_line(); } @@ -912,16 +856,17 @@ void MarlinUI::draw_status_screen() { } // Low-level draw_edit_screen can be used to draw an edit screen from anyplace + // This line moves to the last line of the screen for UBL plot screen on the panel side void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { if (!PanelDetected) return; ui.encoder_direction_normal(); - lcd.setCursor(0, LCD_HEIGHT - 1); //last line is free most time + lcd.setCursor(0, MIDDLE_Y); lcd.write(COLOR_EDIT); lcd_put_u8str_P(pstr); if (value != nullptr) { lcd.write(':'); - lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), LCD_HEIGHT - 1); // Right-justified, padded by spaces - lcd.write(' '); // Overwrite char if value gets shorter + lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), MIDDLE_Y); // Right-justified, padded by spaces + lcd.write(' '); // Overwrite char if value gets shorter lcd.print(value); lcd.write(' '); lcd.print_line(); @@ -932,10 +877,10 @@ void MarlinUI::draw_status_screen() { void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const bool yesno, PGM_P const pref, const char * const string, PGM_P const suff) { if (!PanelDetected) return; ui.draw_select_screen_prompt(pref, string, suff); - lcd.setCursor(0, LCD_HEIGHT - 1); + lcd.setCursor(0, MIDDLE_Y); lcd.write(COLOR_EDIT); lcd.write(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd.write(yesno ? ' ' : ']'); - lcd.setCursor(LCD_WIDTH - utf8_strlen_P(yes) - 3, LCD_HEIGHT - 1); + lcd.setCursor(LCD_WIDTH - utf8_strlen_P(yes) - 3, MIDDLE_Y); lcd.write(yesno ? '[' : ' '); lcd_put_u8str_P(yes); lcd.write(yesno ? ']' : ' '); lcd.print_line(); } diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h index 9f54730c3c..eedcc4afa0 100644 --- a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h @@ -45,6 +45,7 @@ class TFTGLCD { public: TFTGLCD(); void clear_buffer(); + void clr_screen(); void setCursor(uint8_t col, uint8_t row); void write(char c); void print(const char *line); diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index c0a72bbe6c..68a10245e9 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -490,7 +490,7 @@ void menu_backlash(); #if ENABLED(PROBE_OFFSET_WIZARD) SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); #endif - + END_MENU(); } #endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index 8cb06824b4..5bb32a420a 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -223,14 +223,14 @@ #endif /** - * _____ _____ - * NC | · · | GND 5V | · · | GND - * RESET | · · | 1.31(SD_DETECT) (LCD_D7) 1.23 | · · | 1.22 (LCD_D6) - * (MOSI)0.18 | · · | 3.25(BTN_EN2) (LCD_D5) 1.21 | · · | 1.20 (LCD_D4) - * (SD_SS)0.16 | · · | 3.26(BTN_EN1) (LCD_RS) 1.19 | · · | 1.18 (LCD_EN) - * (SCK)0.15 | · · | 0.17(MISO) (BTN_ENC) 0.28 | · · | 1.30 (BEEPER) - * ----- ----- - * EXP2 EXP1 + * _____ _____ + * NC | · · | GND 5V | · · | GND + * RESET | · · | 1.31 (SD_DETECT) (LCD_D7) 1.23 | · · | 1.22 (LCD_D6) + * (MOSI) 0.18 | · · | 3.25 (BTN_EN2) (LCD_D5) 1.21 | · · | 1.20 (LCD_D4) + * (SD_SS) 0.16 | · · | 3.26 (BTN_EN1) (LCD_RS) 1.19 | · · | 1.18 (LCD_EN) + * (SCK) 0.15 | · · | 0.17 (MISO) (BTN_ENC) 0.28 | · · | 1.30 (BEEPER) + * ----- ----- + * EXP2 EXP1 */ #if HAS_WIRED_LCD #if ENABLED(ANET_FULL_GRAPHICS_LCD) diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index fd902afda4..820c35a01c 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -92,7 +92,7 @@ // // LCD / Controller // -#if HAS_WIRED_LCD +#if HAS_WIRED_LCD && DISABLED(LCD_USE_I2C_BUZZER) #define BEEPER_PIN P1_30 // (37) not 5V tolerant #endif diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h index dfa413b63f..a0e035a916 100644 --- a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h @@ -33,6 +33,9 @@ // #if NO_EEPROM_SELECTED #define FLASH_EEPROM_EMULATION + #ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x800U // 2KB + #endif #endif // diff --git a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h index 28262eaa82..ccc92b7527 100644 --- a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h +++ b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h @@ -89,3 +89,4 @@ // #define LED_PIN PC13 #define SDSS PA3 +#define TFTGLCD_CS PA4