@@ -196,14 +196,15 @@ bool GCodeQueue::process_injected_command() {
 | 
				
			|||||||
 * Never call this from a G-code handler!
 | 
					 * Never call this from a G-code handler!
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void GCodeQueue::enqueue_one_now(const char * const cmd) { while (!enqueue_one(cmd)) idle(); }
 | 
					void GCodeQueue::enqueue_one_now(const char * const cmd) { while (!enqueue_one(cmd)) idle(); }
 | 
				
			||||||
 | 
					void GCodeQueue::enqueue_one_now(FSTR_P const fcmd) { while (!enqueue_one(fcmd)) idle(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Attempt to enqueue a single G-code command
 | 
					 * Attempt to enqueue a single G-code command
 | 
				
			||||||
 * and return 'true' if successful.
 | 
					 * and return 'true' if successful.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
bool GCodeQueue::enqueue_one(FSTR_P const fgcode) {
 | 
					bool GCodeQueue::enqueue_one(FSTR_P const fcmd) {
 | 
				
			||||||
  size_t i = 0;
 | 
					  size_t i = 0;
 | 
				
			||||||
  PGM_P p = FTOP(fgcode);
 | 
					  PGM_P p = FTOP(fcmd);
 | 
				
			||||||
  char c;
 | 
					  char c;
 | 
				
			||||||
  while ((c = pgm_read_byte(&p[i])) && c != '\n') i++;
 | 
					  while ((c = pgm_read_byte(&p[i])) && c != '\n') i++;
 | 
				
			||||||
  char cmd[i + 1];
 | 
					  char cmd[i + 1];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -141,12 +141,13 @@ public:
 | 
				
			|||||||
   * Enqueue and return only when commands are actually enqueued
 | 
					   * Enqueue and return only when commands are actually enqueued
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  static void enqueue_one_now(const char * const cmd);
 | 
					  static void enqueue_one_now(const char * const cmd);
 | 
				
			||||||
 | 
					  static void enqueue_one_now(FSTR_P const fcmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Attempt to enqueue a single G-code command
 | 
					   * Attempt to enqueue a single G-code command
 | 
				
			||||||
   * and return 'true' if successful.
 | 
					   * and return 'true' if successful.
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  static bool enqueue_one(FSTR_P const fgcode);
 | 
					  static bool enqueue_one(FSTR_P const fcmd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Enqueue with Serial Echo
 | 
					   * Enqueue with Serial Echo
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -176,9 +176,13 @@ void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis,
 | 
				
			|||||||
void DWIN_Draw_String(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const char * const string, uint16_t rlimit=0xFFFF);
 | 
					void DWIN_Draw_String(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const char * const string, uint16_t rlimit=0xFFFF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline void DWIN_Draw_String(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, FSTR_P const ftitle) {
 | 
					inline void DWIN_Draw_String(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, FSTR_P const ftitle) {
 | 
				
			||||||
 | 
					  #ifdef __AVR__
 | 
				
			||||||
    char ctitle[strlen_P(FTOP(ftitle)) + 1];
 | 
					    char ctitle[strlen_P(FTOP(ftitle)) + 1];
 | 
				
			||||||
    strcpy_P(ctitle, FTOP(ftitle));
 | 
					    strcpy_P(ctitle, FTOP(ftitle));
 | 
				
			||||||
    DWIN_Draw_String(bShow, size, color, bColor, x, y, ctitle);
 | 
					    DWIN_Draw_String(bShow, size, color, bColor, x, y, ctitle);
 | 
				
			||||||
 | 
					  #else
 | 
				
			||||||
 | 
					    DWIN_Draw_String(bShow, size, color, bColor, x, y, FTOP(ftitle));
 | 
				
			||||||
 | 
					  #endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Draw a positive integer
 | 
					// Draw a positive integer
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4307,9 +4307,13 @@ void DWIN_StatusChanged(const char * const cstr/*=nullptr*/) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DWIN_StatusChanged(FSTR_P const fstr) {
 | 
					void DWIN_StatusChanged(FSTR_P const fstr) {
 | 
				
			||||||
 | 
					  #ifdef __AVR__
 | 
				
			||||||
    char str[strlen_P(FTOP(fstr)) + 1];
 | 
					    char str[strlen_P(FTOP(fstr)) + 1];
 | 
				
			||||||
    strcpy_P(str, FTOP(fstr));
 | 
					    strcpy_P(str, FTOP(fstr));
 | 
				
			||||||
    DWIN_StatusChanged(str);
 | 
					    DWIN_StatusChanged(str);
 | 
				
			||||||
 | 
					  #else
 | 
				
			||||||
 | 
					    DWIN_StatusChanged(FTOP(fstr));
 | 
				
			||||||
 | 
					  #endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // DWIN_CREALITY_LCD
 | 
					#endif // DWIN_CREALITY_LCD
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -274,7 +274,7 @@ void MarlinUI::draw_status_message(const bool blink) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      dwin_font.solid = false;
 | 
					      dwin_font.solid = false;
 | 
				
			||||||
      dwin_font.fg = Color_White;
 | 
					      dwin_font.fg = Color_White;
 | 
				
			||||||
      dwin_string.set("E");
 | 
					      dwin_string.set('E');
 | 
				
			||||||
      dwin_string.add('1' + extruder);
 | 
					      dwin_string.add('1' + extruder);
 | 
				
			||||||
      dwin_string.add(' ');
 | 
					      dwin_string.add(' ');
 | 
				
			||||||
      dwin_string.add(i16tostr3rj(thermalManager.degHotend(extruder)));
 | 
					      dwin_string.add(i16tostr3rj(thermalManager.degHotend(extruder)));
 | 
				
			||||||
@@ -282,7 +282,7 @@ void MarlinUI::draw_status_message(const bool blink) {
 | 
				
			|||||||
      if (get_blink() || !thermalManager.heater_idle[thermalManager.idle_index_for_id(extruder)].timed_out)
 | 
					      if (get_blink() || !thermalManager.heater_idle[thermalManager.idle_index_for_id(extruder)].timed_out)
 | 
				
			||||||
        dwin_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder)));
 | 
					        dwin_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder)));
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        dwin_string.add(PSTR("    "));
 | 
					        dwin_string.add(F("    "));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      lcd_moveto(LCD_WIDTH - dwin_string.length, row);
 | 
					      lcd_moveto(LCD_WIDTH - dwin_string.length, row);
 | 
				
			||||||
      lcd_put_dwin_string();
 | 
					      lcd_put_dwin_string();
 | 
				
			||||||
@@ -540,11 +540,11 @@ void MarlinUI::draw_status_message(const bool blink) {
 | 
				
			|||||||
      lcd_put_u8str(ftostr52(lpos.y));
 | 
					      lcd_put_u8str(ftostr52(lpos.y));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Print plot position
 | 
					      // Print plot position
 | 
				
			||||||
      dwin_string.set("(");
 | 
					      dwin_string.set('(');
 | 
				
			||||||
      dwin_string.add(i8tostr3rj(x_plot));
 | 
					      dwin_string.add(i8tostr3rj(x_plot));
 | 
				
			||||||
      dwin_string.add(",");
 | 
					      dwin_string.add(',');
 | 
				
			||||||
      dwin_string.add(i8tostr3rj(y_plot));
 | 
					      dwin_string.add(i8tostr3rj(y_plot));
 | 
				
			||||||
      dwin_string.add(")");
 | 
					      dwin_string.add(')');
 | 
				
			||||||
      lcd_moveto(
 | 
					      lcd_moveto(
 | 
				
			||||||
        TERN(DWIN_MARLINUI_LANDSCAPE, ((x_offset + x_map_pixels) / MENU_FONT_WIDTH) + 2, LCD_WIDTH - dwin_string.length),
 | 
					        TERN(DWIN_MARLINUI_LANDSCAPE, ((x_offset + x_map_pixels) / MENU_FONT_WIDTH) + 2, LCD_WIDTH - dwin_string.length),
 | 
				
			||||||
        TERN(DWIN_MARLINUI_LANDSCAPE, LCD_HEIGHT - 2, ((y_offset + y_map_pixels) / MENU_LINE_HEIGHT) + 1)
 | 
					        TERN(DWIN_MARLINUI_LANDSCAPE, LCD_HEIGHT - 2, ((y_offset + y_map_pixels) / MENU_LINE_HEIGHT) + 1)
 | 
				
			||||||
@@ -556,7 +556,7 @@ void MarlinUI::draw_status_message(const bool blink) {
 | 
				
			|||||||
      if (!isnan(bedlevel.z_values[x_plot][y_plot]))
 | 
					      if (!isnan(bedlevel.z_values[x_plot][y_plot]))
 | 
				
			||||||
        dwin_string.add(ftostr43sign(bedlevel.z_values[x_plot][y_plot]));
 | 
					        dwin_string.add(ftostr43sign(bedlevel.z_values[x_plot][y_plot]));
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        dwin_string.add(PSTR(" -----"));
 | 
					        dwin_string.add(F(" -----"));
 | 
				
			||||||
      lcd_moveto(
 | 
					      lcd_moveto(
 | 
				
			||||||
        TERN(DWIN_MARLINUI_LANDSCAPE, ((x_offset + x_map_pixels) / MENU_FONT_WIDTH) + 2, LCD_WIDTH - dwin_string.length),
 | 
					        TERN(DWIN_MARLINUI_LANDSCAPE, ((x_offset + x_map_pixels) / MENU_FONT_WIDTH) + 2, LCD_WIDTH - dwin_string.length),
 | 
				
			||||||
        TERN(DWIN_MARLINUI_LANDSCAPE, LCD_HEIGHT - 1, ((y_offset + y_map_pixels) / MENU_LINE_HEIGHT) + 2)
 | 
					        TERN(DWIN_MARLINUI_LANDSCAPE, LCD_HEIGHT - 1, ((y_offset + y_map_pixels) / MENU_LINE_HEIGHT) + 2)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,7 +88,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // For E_TOTAL there may be some characters to cover up
 | 
					    // For E_TOTAL there may be some characters to cover up
 | 
				
			||||||
    if (BOTH(DWIN_MARLINUI_PORTRAIT, LCD_SHOW_E_TOTAL) && axis == X_AXIS)
 | 
					    if (BOTH(DWIN_MARLINUI_PORTRAIT, LCD_SHOW_E_TOTAL) && axis == X_AXIS)
 | 
				
			||||||
      dwin_string.add("   ");
 | 
					      dwin_string.add(F("   "));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x, y + 32, S(dwin_string.string()));
 | 
					    DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x, y + 32, S(dwin_string.string()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -117,7 +117,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // For E_TOTAL there may be some characters to cover up
 | 
					    // For E_TOTAL there may be some characters to cover up
 | 
				
			||||||
    if (ENABLED(LCD_SHOW_E_TOTAL) && (!ui.did_first_redraw  || ui.old_is_printing != print_job_timer.isRunning()) && axis == X_AXIS)
 | 
					    if (ENABLED(LCD_SHOW_E_TOTAL) && (!ui.did_first_redraw  || ui.old_is_printing != print_job_timer.isRunning()) && axis == X_AXIS)
 | 
				
			||||||
      dwin_string.add("   ");
 | 
					      dwin_string.add(F("   "));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x + 32, y + 4, S(dwin_string.string()));
 | 
					    DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x + 32, y + 4, S(dwin_string.string()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -133,7 +133,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      if (!ui.did_first_redraw) {
 | 
					      if (!ui.did_first_redraw) {
 | 
				
			||||||
        // Extra spaces to erase previous value
 | 
					        // Extra spaces to erase previous value
 | 
				
			||||||
        dwin_string.set("E         ");
 | 
					        dwin_string.set(F("E         "));
 | 
				
			||||||
        DWIN_Draw_String(true, font16x32, Color_IconBlue, Color_Bg_Black, x + (4 * 14 / 2) - 7, y + 2, S(dwin_string.string()));
 | 
					        DWIN_Draw_String(true, font16x32, Color_IconBlue, Color_Bg_Black, x + (4 * 14 / 2) - 7, y + 2, S(dwin_string.string()));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -146,7 +146,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const
 | 
				
			|||||||
    #else // !DWIN_MARLINUI_PORTRAIT
 | 
					    #else // !DWIN_MARLINUI_PORTRAIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (!ui.did_first_redraw || ui.old_is_printing != print_job_timer.isRunning()) {
 | 
					      if (!ui.did_first_redraw || ui.old_is_printing != print_job_timer.isRunning()) {
 | 
				
			||||||
        dwin_string.set("E ");
 | 
					        dwin_string.set(F("E "));
 | 
				
			||||||
        DWIN_Draw_String(true, font16x32, Color_IconBlue, Color_Bg_Black, x, y, S(dwin_string.string()));
 | 
					        DWIN_Draw_String(true, font16x32, Color_IconBlue, Color_Bg_Black, x, y, S(dwin_string.string()));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -176,7 +176,7 @@ FORCE_INLINE void _draw_fan_status(const uint16_t x, const uint16_t y) {
 | 
				
			|||||||
  else {
 | 
					  else {
 | 
				
			||||||
    DWIN_ICON_AnimationControl(0x0000); // disable all icon animations (this is the only one)
 | 
					    DWIN_ICON_AnimationControl(0x0000); // disable all icon animations (this is the only one)
 | 
				
			||||||
    DWIN_ICON_Show(ICON, ICON_Fan0, x + fanx, y);
 | 
					    DWIN_ICON_Show(ICON, ICON_Fan0, x + fanx, y);
 | 
				
			||||||
    dwin_string.set(PSTR("    "));
 | 
					    dwin_string.set(F("    "));
 | 
				
			||||||
    DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x, y + STATUS_FAN_HEIGHT, S(dwin_string.string()));
 | 
					    DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x, y + STATUS_FAN_HEIGHT, S(dwin_string.string()));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -289,7 +289,7 @@ FORCE_INLINE void _draw_feedrate_status(const char *value, uint16_t x, uint16_t
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  dwin_string.set(value);
 | 
					  dwin_string.set(value);
 | 
				
			||||||
  dwin_string.add(PSTR("%"));
 | 
					  dwin_string.add('%');
 | 
				
			||||||
  DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x + 14, y, S(dwin_string.string()));
 | 
					  DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x + 14, y, S(dwin_string.string()));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -396,7 +396,7 @@ void MarlinUI::draw_status_screen() {
 | 
				
			|||||||
    // landscape mode shows both elapsed and remaining (if SHOW_REMAINING_TIME)
 | 
					    // landscape mode shows both elapsed and remaining (if SHOW_REMAINING_TIME)
 | 
				
			||||||
    time = print_job_timer.duration();
 | 
					    time = print_job_timer.duration();
 | 
				
			||||||
    time.toDigital(buffer);
 | 
					    time.toDigital(buffer);
 | 
				
			||||||
    dwin_string.set(" ");
 | 
					    dwin_string.set(' ');
 | 
				
			||||||
    dwin_string.add(buffer);
 | 
					    dwin_string.add(buffer);
 | 
				
			||||||
    DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, 230, 170, S(dwin_string.string()));
 | 
					    DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, 230, 170, S(dwin_string.string()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -405,7 +405,7 @@ void MarlinUI::draw_status_screen() {
 | 
				
			|||||||
        time = get_remaining_time();
 | 
					        time = get_remaining_time();
 | 
				
			||||||
        DWIN_Draw_String(true, font14x28, Color_IconBlue, Color_Bg_Black, 336, 170, S(" R "));
 | 
					        DWIN_Draw_String(true, font14x28, Color_IconBlue, Color_Bg_Black, 336, 170, S(" R "));
 | 
				
			||||||
        if (print_job_timer.isPaused() && blink)
 | 
					        if (print_job_timer.isPaused() && blink)
 | 
				
			||||||
          dwin_string.set("     ");
 | 
					          dwin_string.set(F("     "));
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
          time.toDigital(buffer);
 | 
					          time.toDigital(buffer);
 | 
				
			||||||
          dwin_string.set(buffer);
 | 
					          dwin_string.set(buffer);
 | 
				
			||||||
@@ -413,7 +413,7 @@ void MarlinUI::draw_status_screen() {
 | 
				
			|||||||
        DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, 378, 170, S(dwin_string.string()));
 | 
					        DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, 378, 170, S(dwin_string.string()));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else if (!ui.did_first_redraw || ui.old_is_printing != print_job_timer.isRunning()) {
 | 
					      else if (!ui.did_first_redraw || ui.old_is_printing != print_job_timer.isRunning()) {
 | 
				
			||||||
        dwin_string.set("        ");
 | 
					        dwin_string.set(F("        "));
 | 
				
			||||||
        DWIN_Draw_String(true, font14x28, Color_IconBlue, Color_Bg_Black, 336, 170, S(dwin_string.string()));
 | 
					        DWIN_Draw_String(true, font14x28, Color_IconBlue, Color_Bg_Black, 336, 170, S(dwin_string.string()));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    #endif
 | 
					    #endif
 | 
				
			||||||
@@ -449,7 +449,7 @@ void MarlinUI::draw_status_screen() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      #if ENABLED(SHOW_SD_PERCENT)
 | 
					      #if ENABLED(SHOW_SD_PERCENT)
 | 
				
			||||||
        dwin_string.set(TERN(PRINT_PROGRESS_SHOW_DECIMALS, permyriadtostr4(progress), ui8tostr3rj(progress / (PROGRESS_SCALE))));
 | 
					        dwin_string.set(TERN(PRINT_PROGRESS_SHOW_DECIMALS, permyriadtostr4(progress), ui8tostr3rj(progress / (PROGRESS_SCALE))));
 | 
				
			||||||
        dwin_string.add(PSTR("%"));
 | 
					        dwin_string.add('%');
 | 
				
			||||||
        DWIN_Draw_String(
 | 
					        DWIN_Draw_String(
 | 
				
			||||||
          false, font16x32, Percent_Color, Color_Bg_Black,
 | 
					          false, font16x32, Percent_Color, Color_Bg_Black,
 | 
				
			||||||
          pb_left + (pb_width - dwin_string.length * 16) / 2,
 | 
					          pb_left + (pb_width - dwin_string.length * 16) / 2,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -474,13 +474,8 @@ void DGUSScreenHandler::HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void DGUSScreenHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr) {
 | 
					void DGUSScreenHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr) {
 | 
				
			||||||
  DEBUG_ECHOLNPGM("HandleMotorLockUnlock");
 | 
					  DEBUG_ECHOLNPGM("HandleMotorLockUnlock");
 | 
				
			||||||
 | 
					 | 
				
			||||||
  char buf[4];
 | 
					 | 
				
			||||||
  const int16_t lock = swap16(*(uint16_t*)val_ptr);
 | 
					  const int16_t lock = swap16(*(uint16_t*)val_ptr);
 | 
				
			||||||
  strcpy_P(buf, lock ? PSTR("M18") : PSTR("M17"));
 | 
					  queue.enqueue_one_now(lock ? F("M18") : F("M17"));
 | 
				
			||||||
 | 
					 | 
				
			||||||
  //DEBUG_ECHOPGM(" ", buf);
 | 
					 | 
				
			||||||
  queue.enqueue_one_now(buf);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DGUSScreenHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) {
 | 
					void DGUSScreenHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) {
 | 
				
			||||||
@@ -552,23 +547,23 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo
 | 
				
			|||||||
          #if HAS_HOTEND
 | 
					          #if HAS_HOTEND
 | 
				
			||||||
            case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0
 | 
					            case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0
 | 
				
			||||||
              sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E0);
 | 
					              sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E0);
 | 
				
			||||||
 | 
					              queue.enqueue_one_now(buf);
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
          #endif
 | 
					          #endif
 | 
				
			||||||
          #if HAS_MULTI_HOTEND
 | 
					          #if HAS_MULTI_HOTEND
 | 
				
			||||||
            case VP_PID_AUTOTUNE_E1:
 | 
					            case VP_PID_AUTOTUNE_E1:
 | 
				
			||||||
              sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E1);
 | 
					              sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E1);
 | 
				
			||||||
 | 
					              queue.enqueue_one_now(buf);
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
          #endif
 | 
					          #endif
 | 
				
			||||||
        #endif
 | 
					        #endif
 | 
				
			||||||
        #if ENABLED(PIDTEMPBED)
 | 
					        #if ENABLED(PIDTEMPBED)
 | 
				
			||||||
          case VP_PID_AUTOTUNE_BED:
 | 
					          case VP_PID_AUTOTUNE_BED:
 | 
				
			||||||
            strcpy_P(buf, PSTR("M303 E-1 C5 S70 U1"));
 | 
					            queue.enqueue_one_now(F("M303 E-1 C5 S70 U1"));
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        #endif
 | 
					        #endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (buf[0]) queue.enqueue_one_now(buf);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    #if ENABLED(DGUS_UI_WAITING)
 | 
					    #if ENABLED(DGUS_UI_WAITING)
 | 
				
			||||||
      sendinfoscreen(F("PID is autotuning"), F("please wait"), NUL_STR, NUL_STR, true, true, true, true);
 | 
					      sendinfoscreen(F("PID is autotuning"), F("please wait"), NUL_STR, NUL_STR, true, true, true, true);
 | 
				
			||||||
      GotoScreen(DGUSLCD_SCREEN_WAITING);
 | 
					      GotoScreen(DGUSLCD_SCREEN_WAITING);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,12 +32,12 @@ using namespace Theme;
 | 
				
			|||||||
#define GRID_COLS 2
 | 
					#define GRID_COLS 2
 | 
				
			||||||
#define GRID_ROWS 9
 | 
					#define GRID_ROWS 9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BioPrintingDialogBox::draw_status_message(draw_mode_t what, const char *message) {
 | 
					void BioPrintingDialogBox::draw_status_message(draw_mode_t what, const char *cmsg) {
 | 
				
			||||||
  if (what & BACKGROUND) {
 | 
					  if (what & BACKGROUND) {
 | 
				
			||||||
    CommandProcessor cmd;
 | 
					    CommandProcessor cmd;
 | 
				
			||||||
    cmd.cmd(COLOR_RGB(bg_text_enabled))
 | 
					    cmd.cmd(COLOR_RGB(bg_text_enabled))
 | 
				
			||||||
       .tag(0);
 | 
					       .tag(0);
 | 
				
			||||||
    draw_text_box(cmd, BTN_POS(1,2), BTN_SIZE(2,2), message, OPT_CENTER, font_large);
 | 
					    draw_text_box(cmd, BTN_POS(1,2), BTN_SIZE(2,2), cmsg, OPT_CENTER, font_large);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -105,26 +105,30 @@ bool BioPrintingDialogBox::onTouchEnd(uint8_t tag) {
 | 
				
			|||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BioPrintingDialogBox::setStatusMessage(FSTR_P message) {
 | 
					void BioPrintingDialogBox::setStatusMessage(FSTR_P fmsg) {
 | 
				
			||||||
  char buff[strlen_P(FTOP(message)) + 1];
 | 
					  #ifdef __AVR__
 | 
				
			||||||
  strcpy_P(buff, FTOP(message));
 | 
					    char buff[strlen_P(FTOP(fmsg)) + 1];
 | 
				
			||||||
 | 
					    strcpy_P(buff, FTOP(fmsg));
 | 
				
			||||||
    setStatusMessage(buff);
 | 
					    setStatusMessage(buff);
 | 
				
			||||||
 | 
					  #else
 | 
				
			||||||
 | 
					    setStatusMessage(FTOP(fmsg));
 | 
				
			||||||
 | 
					  #endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void BioPrintingDialogBox::setStatusMessage(const char *message) {
 | 
					void BioPrintingDialogBox::setStatusMessage(const char *cmsg) {
 | 
				
			||||||
  CommandProcessor cmd;
 | 
					  CommandProcessor cmd;
 | 
				
			||||||
  cmd.cmd(CMD_DLSTART)
 | 
					  cmd.cmd(CMD_DLSTART)
 | 
				
			||||||
     .cmd(CLEAR_COLOR_RGB(bg_color))
 | 
					     .cmd(CLEAR_COLOR_RGB(bg_color))
 | 
				
			||||||
     .cmd(CLEAR(true,true,true));
 | 
					     .cmd(CLEAR(true,true,true));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  draw_status_message(BACKGROUND, message);
 | 
					  draw_status_message(BACKGROUND, cmsg);
 | 
				
			||||||
  draw_progress(BACKGROUND);
 | 
					  draw_progress(BACKGROUND);
 | 
				
			||||||
  draw_time_remaining(BACKGROUND);
 | 
					  draw_time_remaining(BACKGROUND);
 | 
				
			||||||
  draw_interaction_buttons(BACKGROUND);
 | 
					  draw_interaction_buttons(BACKGROUND);
 | 
				
			||||||
  storeBackground();
 | 
					  storeBackground();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #if ENABLED(TOUCH_UI_DEBUG)
 | 
					  #if ENABLED(TOUCH_UI_DEBUG)
 | 
				
			||||||
    SERIAL_ECHO_MSG("New status message: ", message);
 | 
					    SERIAL_ECHO_MSG("New status message: ", cmsg);
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (AT_SCREEN(BioPrintingDialogBox))
 | 
					  if (AT_SCREEN(BioPrintingDialogBox))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -354,8 +354,8 @@ bool StatusScreen::onTouchHeld(uint8_t tag) {
 | 
				
			|||||||
  return false;
 | 
					  return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void StatusScreen::setStatusMessage(FSTR_P pstr) {
 | 
					void StatusScreen::setStatusMessage(FSTR_P fstr) {
 | 
				
			||||||
  BioPrintingDialogBox::setStatusMessage(pstr);
 | 
					  BioPrintingDialogBox::setStatusMessage(fstr);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void StatusScreen::setStatusMessage(const char * const str) {
 | 
					void StatusScreen::setStatusMessage(const char * const str) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -136,9 +136,13 @@ namespace FTDI {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, FSTR_P fstr, uint16_t options, uint8_t font) {
 | 
					  void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, FSTR_P fstr, uint16_t options, uint8_t font) {
 | 
				
			||||||
 | 
					    #ifdef __AVR__
 | 
				
			||||||
      char str[strlen_P(FTOP(fstr)) + 1];
 | 
					      char str[strlen_P(FTOP(fstr)) + 1];
 | 
				
			||||||
      strcpy_P(str, FTOP(fstr));
 | 
					      strcpy_P(str, FTOP(fstr));
 | 
				
			||||||
      draw_text_box(cmd, x, y, w, h, (const char*) str, options, font);
 | 
					      draw_text_box(cmd, x, y, w, h, (const char*) str, options, font);
 | 
				
			||||||
 | 
					    #else
 | 
				
			||||||
 | 
					      draw_text_box(cmd, x, y, w, h, FTOP(fstr), options, font);
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
} // namespace FTDI
 | 
					} // namespace FTDI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -192,9 +192,13 @@
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uint16_t FTDI::get_utf8_text_width(FSTR_P fstr, font_size_t fs) {
 | 
					  uint16_t FTDI::get_utf8_text_width(FSTR_P fstr, font_size_t fs) {
 | 
				
			||||||
 | 
					    #ifdef __AVR__
 | 
				
			||||||
      char str[strlen_P(FTOP(fstr)) + 1];
 | 
					      char str[strlen_P(FTOP(fstr)) + 1];
 | 
				
			||||||
      strcpy_P(str, FTOP(fstr));
 | 
					      strcpy_P(str, FTOP(fstr));
 | 
				
			||||||
      return get_utf8_text_width(str, fs);
 | 
					      return get_utf8_text_width(str, fs);
 | 
				
			||||||
 | 
					    #else
 | 
				
			||||||
 | 
					      return get_utf8_text_width(FTOP(fstr), fs);
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /**
 | 
					   /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,7 @@ using namespace Theme;
 | 
				
			|||||||
#define GRID_ROWS 8
 | 
					#define GRID_ROWS 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename T>
 | 
					template<typename T>
 | 
				
			||||||
void DialogBoxBaseClass::drawMessage(T message, int16_t font) {
 | 
					void DialogBoxBaseClass::drawMessage(T message, const int16_t font) {
 | 
				
			||||||
  CommandProcessor cmd;
 | 
					  CommandProcessor cmd;
 | 
				
			||||||
  cmd.cmd(CMD_DLSTART)
 | 
					  cmd.cmd(CMD_DLSTART)
 | 
				
			||||||
     .cmd(CLEAR_COLOR_RGB(bg_color))
 | 
					     .cmd(CLEAR_COLOR_RGB(bg_color))
 | 
				
			||||||
@@ -43,8 +43,7 @@ void DialogBoxBaseClass::drawMessage(T message, int16_t font) {
 | 
				
			|||||||
  cmd.colors(normal_btn);
 | 
					  cmd.colors(normal_btn);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template void DialogBoxBaseClass::drawMessage(const char *, int16_t font);
 | 
					template void DialogBoxBaseClass::drawMessage(PGM_P const, const int16_t);
 | 
				
			||||||
template void DialogBoxBaseClass::drawMessage(FSTR_P, int16_t font);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DialogBoxBaseClass::drawYesNoButtons(uint8_t default_btn) {
 | 
					void DialogBoxBaseClass::drawYesNoButtons(uint8_t default_btn) {
 | 
				
			||||||
  CommandProcessor cmd;
 | 
					  CommandProcessor cmd;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,12 +27,15 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class DialogBoxBaseClass : public BaseScreen {
 | 
					class DialogBoxBaseClass : public BaseScreen {
 | 
				
			||||||
  protected:
 | 
					  protected:
 | 
				
			||||||
    template<typename T> static void drawMessage(T, int16_t font = 0);
 | 
					    template<typename T> static void drawMessage(T, const int16_t font=0);
 | 
				
			||||||
 | 
					    static void drawMessage(FSTR_P const fstr, const int16_t font=0) { drawMessage(FTOP(fstr), font); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    template<typename T> static void drawButton(T);
 | 
					    template<typename T> static void drawButton(T);
 | 
				
			||||||
    static void drawYesNoButtons(uint8_t default_btn = 0);
 | 
					    static void drawYesNoButtons(uint8_t default_btn = 0);
 | 
				
			||||||
    static void drawOkayButton();
 | 
					    static void drawOkayButton();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static void onRedraw(draw_mode_t) {};
 | 
					    static void onRedraw(draw_mode_t) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    static bool onTouchEnd(uint8_t tag);
 | 
					    static bool onTouchEnd(uint8_t tag);
 | 
				
			||||||
    static void onIdle();
 | 
					    static void onIdle();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -332,10 +332,14 @@ void StatusScreen::draw_status_message(draw_mode_t what, const char *message) {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void StatusScreen::setStatusMessage(FSTR_P message) {
 | 
					void StatusScreen::setStatusMessage(FSTR_P fmsg) {
 | 
				
			||||||
  char buff[strlen_P(FTOP(message)) + 1];
 | 
					  #ifdef __AVR__
 | 
				
			||||||
  strcpy_P(buff, FTOP(message));
 | 
					    char buff[strlen_P(FTOP(fmsg)) + 1];
 | 
				
			||||||
  setStatusMessage((const char *) buff);
 | 
					    strcpy_P(buff, FTOP(fmsg));
 | 
				
			||||||
 | 
					    setStatusMessage((const char *)buff);
 | 
				
			||||||
 | 
					  #else
 | 
				
			||||||
 | 
					    setStatusMessage(FTOP(fmsg));
 | 
				
			||||||
 | 
					  #endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void StatusScreen::setStatusMessage(const char *message) {
 | 
					void StatusScreen::setStatusMessage(const char *message) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -711,12 +711,16 @@ void disp_assets_update() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void disp_assets_update_progress(FSTR_P const fmsg) {
 | 
					void disp_assets_update_progress(FSTR_P const fmsg) {
 | 
				
			||||||
 | 
					  #ifdef __AVR__
 | 
				
			||||||
    static constexpr int buflen = 30;
 | 
					    static constexpr int buflen = 30;
 | 
				
			||||||
    char buf[buflen];
 | 
					    char buf[buflen];
 | 
				
			||||||
    memset(buf, ' ', buflen);
 | 
					    memset(buf, ' ', buflen);
 | 
				
			||||||
    strncpy_P(buf, FTOP(fmsg), buflen - 1);
 | 
					    strncpy_P(buf, FTOP(fmsg), buflen - 1);
 | 
				
			||||||
    buf[buflen - 1] = '\0';
 | 
					    buf[buflen - 1] = '\0';
 | 
				
			||||||
    disp_string(100, 165, buf, 0xFFFF, 0x0000);
 | 
					    disp_string(100, 165, buf, 0xFFFF, 0x0000);
 | 
				
			||||||
 | 
					  #else
 | 
				
			||||||
 | 
					    disp_string(100, 165, FTOP(fmsg), 0xFFFF, 0x0000);
 | 
				
			||||||
 | 
					  #endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if BOTH(MKS_TEST, SDSUPPORT)
 | 
					#if BOTH(MKS_TEST, SDSUPPORT)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1112,15 +1112,23 @@ namespace ExtUI {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Simplest approach is to make an SRAM copy
 | 
					  // Simplest approach is to make an SRAM copy
 | 
				
			||||||
  void onUserConfirmRequired(FSTR_P const fstr) {
 | 
					  void onUserConfirmRequired(FSTR_P const fstr) {
 | 
				
			||||||
 | 
					    #ifdef __AVR__
 | 
				
			||||||
      char msg[strlen_P(FTOP(fstr)) + 1];
 | 
					      char msg[strlen_P(FTOP(fstr)) + 1];
 | 
				
			||||||
      strcpy_P(msg, FTOP(fstr));
 | 
					      strcpy_P(msg, FTOP(fstr));
 | 
				
			||||||
      onUserConfirmRequired(msg);
 | 
					      onUserConfirmRequired(msg);
 | 
				
			||||||
 | 
					    #else
 | 
				
			||||||
 | 
					      onUserConfirmRequired(FTOP(fstr));
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void onStatusChanged(FSTR_P const fstr) {
 | 
					  void onStatusChanged(FSTR_P const fstr) {
 | 
				
			||||||
 | 
					    #ifdef __AVR__
 | 
				
			||||||
      char msg[strlen_P(FTOP(fstr)) + 1];
 | 
					      char msg[strlen_P(FTOP(fstr)) + 1];
 | 
				
			||||||
      strcpy_P(msg, FTOP(fstr));
 | 
					      strcpy_P(msg, FTOP(fstr));
 | 
				
			||||||
      onStatusChanged(msg);
 | 
					      onStatusChanged(msg);
 | 
				
			||||||
 | 
					    #else
 | 
				
			||||||
 | 
					      onStatusChanged(FTOP(fstr));
 | 
				
			||||||
 | 
					    #endif
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FileList::FileList() { refresh(); }
 | 
					  FileList::FileList() { refresh(); }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,11 +113,15 @@ class MenuItem_confirm : public MenuItemBase {
 | 
				
			|||||||
    static void select_screen(
 | 
					    static void select_screen(
 | 
				
			||||||
      FSTR_P const yes, FSTR_P const no,
 | 
					      FSTR_P const yes, FSTR_P const no,
 | 
				
			||||||
      selectFunc_t yesFunc, selectFunc_t noFunc,
 | 
					      selectFunc_t yesFunc, selectFunc_t noFunc,
 | 
				
			||||||
      FSTR_P const pref, FSTR_P const string, FSTR_P const suff=nullptr
 | 
					      FSTR_P const pref, FSTR_P const fstr, FSTR_P const suff=nullptr
 | 
				
			||||||
    ) {
 | 
					    ) {
 | 
				
			||||||
      char str[strlen_P(FTOP(string)) + 1];
 | 
					      #ifdef __AVR__
 | 
				
			||||||
      strcpy_P(str, FTOP(string));
 | 
					        char str[strlen_P(FTOP(fstr)) + 1];
 | 
				
			||||||
 | 
					        strcpy_P(str, FTOP(fstr));
 | 
				
			||||||
        select_screen(yes, no, yesFunc, noFunc, pref, str, suff);
 | 
					        select_screen(yes, no, yesFunc, noFunc, pref, str, suff);
 | 
				
			||||||
 | 
					      #else
 | 
				
			||||||
 | 
					        select_screen(yes, no, yesFunc, noFunc, pref, FTOP(fstr), suff);
 | 
				
			||||||
 | 
					      #endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // Shortcut for prompt with "NO"/ "YES" labels
 | 
					    // Shortcut for prompt with "NO"/ "YES" labels
 | 
				
			||||||
    FORCE_INLINE static void confirm_screen(selectFunc_t yesFunc, selectFunc_t noFunc, FSTR_P const pref, const char * const string=nullptr, FSTR_P const suff=nullptr) {
 | 
					    FORCE_INLINE static void confirm_screen(selectFunc_t yesFunc, selectFunc_t noFunc, FSTR_P const pref, const char * const string=nullptr, FSTR_P const suff=nullptr) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -271,19 +271,25 @@ void MarlinUI::draw_status_screen() {
 | 
				
			|||||||
  else {
 | 
					  else {
 | 
				
			||||||
    tft.add_text(200, 3, COLOR_AXIS_HOMED , "X");
 | 
					    tft.add_text(200, 3, COLOR_AXIS_HOMED , "X");
 | 
				
			||||||
    const bool nhx = axis_should_home(X_AXIS);
 | 
					    const bool nhx = axis_should_home(X_AXIS);
 | 
				
			||||||
    tft_string.set(blink && nhx ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x)));
 | 
					    if (blink && nhx)
 | 
				
			||||||
 | 
					      tft_string.set('?');
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      tft_string.set(ftostr4sign(LOGICAL_X_POSITION(current_position.x)));
 | 
				
			||||||
    tft.add_text(300 - tft_string.width(), 3, nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string);
 | 
					    tft.add_text(300 - tft_string.width(), 3, nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tft.add_text(500, 3, COLOR_AXIS_HOMED , "Y");
 | 
					    tft.add_text(500, 3, COLOR_AXIS_HOMED , "Y");
 | 
				
			||||||
    const bool nhy = axis_should_home(Y_AXIS);
 | 
					    const bool nhy = axis_should_home(Y_AXIS);
 | 
				
			||||||
    tft_string.set(blink && nhy ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y)));
 | 
					    if (blink && nhy)
 | 
				
			||||||
 | 
					      tft_string.set('?');
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      tft_string.set(ftostr4sign(LOGICAL_Y_POSITION(current_position.y)));
 | 
				
			||||||
    tft.add_text(600 - tft_string.width(), 3, nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string);
 | 
					    tft.add_text(600 - tft_string.width(), 3, nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  tft.add_text(800, 3, COLOR_AXIS_HOMED , "Z");
 | 
					  tft.add_text(800, 3, COLOR_AXIS_HOMED , "Z");
 | 
				
			||||||
  uint16_t offset = 32;
 | 
					  uint16_t offset = 32;
 | 
				
			||||||
  const bool nhz = axis_should_home(Z_AXIS);
 | 
					  const bool nhz = axis_should_home(Z_AXIS);
 | 
				
			||||||
  if (blink && nhz)
 | 
					  if (blink && nhz)
 | 
				
			||||||
    tft_string.set("?");
 | 
					    tft_string.set('?');
 | 
				
			||||||
  else {
 | 
					  else {
 | 
				
			||||||
    const float z = LOGICAL_Z_POSITION(current_position.z);
 | 
					    const float z = LOGICAL_Z_POSITION(current_position.z);
 | 
				
			||||||
    tft_string.set(ftostr52sp((int16_t)z));
 | 
					    tft_string.set(ftostr52sp((int16_t)z));
 | 
				
			||||||
@@ -479,7 +485,7 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con
 | 
				
			|||||||
    tft_string.add(' ');
 | 
					    tft_string.add(' ');
 | 
				
			||||||
    tft_string.add(i16tostr3rj(thermalManager.wholeDegHotend(extruder)));
 | 
					    tft_string.add(i16tostr3rj(thermalManager.wholeDegHotend(extruder)));
 | 
				
			||||||
    tft_string.add(LCD_STR_DEGREE);
 | 
					    tft_string.add(LCD_STR_DEGREE);
 | 
				
			||||||
    tft_string.add(" / ");
 | 
					    tft_string.add(F(" / "));
 | 
				
			||||||
    tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder)));
 | 
					    tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder)));
 | 
				
			||||||
    tft_string.add(LCD_STR_DEGREE);
 | 
					    tft_string.add(LCD_STR_DEGREE);
 | 
				
			||||||
    tft_string.trim();
 | 
					    tft_string.trim();
 | 
				
			||||||
@@ -607,19 +613,19 @@ static void quick_feedback() {
 | 
				
			|||||||
#define CUR_STEP_VALUE_WIDTH 104
 | 
					#define CUR_STEP_VALUE_WIDTH 104
 | 
				
			||||||
static void drawCurStepValue() {
 | 
					static void drawCurStepValue() {
 | 
				
			||||||
  tft_string.set(ftostr52sp(motionAxisState.currentStepSize));
 | 
					  tft_string.set(ftostr52sp(motionAxisState.currentStepSize));
 | 
				
			||||||
  tft_string.add("mm");
 | 
					  tft_string.add(F("mm"));
 | 
				
			||||||
  tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT);
 | 
					  tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string);
 | 
					  tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drawCurZSelection() {
 | 
					static void drawCurZSelection() {
 | 
				
			||||||
  tft_string.set("Z");
 | 
					  tft_string.set('Z');
 | 
				
			||||||
  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34);
 | 
					  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft.add_text(0, 0, Z_BTN_COLOR, tft_string);
 | 
					  tft.add_text(0, 0, Z_BTN_COLOR, tft_string);
 | 
				
			||||||
  tft.queue.sync();
 | 
					  tft.queue.sync();
 | 
				
			||||||
  tft_string.set("Offset");
 | 
					  tft_string.set(F("Offset"));
 | 
				
			||||||
  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34);
 | 
					  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) {
 | 
					  if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) {
 | 
				
			||||||
@@ -630,17 +636,19 @@ static void drawCurZSelection() {
 | 
				
			|||||||
static void drawCurESelection() {
 | 
					static void drawCurESelection() {
 | 
				
			||||||
  tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT);
 | 
					  tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft_string.set("E");
 | 
					  tft_string.set('E');
 | 
				
			||||||
  tft.add_text(0, 0, E_BTN_COLOR , tft_string);
 | 
					  tft.add_text(0, 0, E_BTN_COLOR , tft_string);
 | 
				
			||||||
  tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection));
 | 
					  tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drawMessage(const char *msg) {
 | 
					static void drawMessage(PGM_P const msg) {
 | 
				
			||||||
  tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - 34, TFT_HEIGHT / 2, 34);
 | 
					  tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - 34, TFT_HEIGHT / 2, 34);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft.add_text(0, 0, COLOR_YELLOW, msg);
 | 
					  tft.add_text(0, 0, COLOR_YELLOW, msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void drawMessage(FSTR_P const fmsg) { drawMessage(FTOP(fmsg)); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drawAxisValue(const AxisEnum axis) {
 | 
					static void drawAxisValue(const AxisEnum axis) {
 | 
				
			||||||
  const float value = (
 | 
					  const float value = (
 | 
				
			||||||
    TERN_(HAS_BED_PROBE, axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? probe.offset.z :)
 | 
					    TERN_(HAS_BED_PROBE, axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? probe.offset.z :)
 | 
				
			||||||
@@ -666,7 +674,7 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  #if ENABLED(PREVENT_COLD_EXTRUSION)
 | 
					  #if ENABLED(PREVENT_COLD_EXTRUSION)
 | 
				
			||||||
    if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) {
 | 
					    if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) {
 | 
				
			||||||
      drawMessage("Too cold");
 | 
					      drawMessage(F("Too cold"));
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -282,7 +282,7 @@ void MarlinUI::draw_status_screen() {
 | 
				
			|||||||
  const bool nhz = axis_should_home(Z_AXIS);
 | 
					  const bool nhz = axis_should_home(Z_AXIS);
 | 
				
			||||||
  uint16_t offset = 25;
 | 
					  uint16_t offset = 25;
 | 
				
			||||||
  if (blink && nhz)
 | 
					  if (blink && nhz)
 | 
				
			||||||
    tft_string.set("?");
 | 
					    tft_string.set('?');
 | 
				
			||||||
  else {
 | 
					  else {
 | 
				
			||||||
    const float z = LOGICAL_Z_POSITION(current_position.z);
 | 
					    const float z = LOGICAL_Z_POSITION(current_position.z);
 | 
				
			||||||
    tft_string.set(ftostr52sp((int16_t)z));
 | 
					    tft_string.set(ftostr52sp((int16_t)z));
 | 
				
			||||||
@@ -461,7 +461,7 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con
 | 
				
			|||||||
    tft_string.add(' ');
 | 
					    tft_string.add(' ');
 | 
				
			||||||
    tft_string.add(i16tostr3rj(thermalManager.wholeDegHotend(extruder)));
 | 
					    tft_string.add(i16tostr3rj(thermalManager.wholeDegHotend(extruder)));
 | 
				
			||||||
    tft_string.add(LCD_STR_DEGREE);
 | 
					    tft_string.add(LCD_STR_DEGREE);
 | 
				
			||||||
    tft_string.add(" / ");
 | 
					    tft_string.add(F(" / "));
 | 
				
			||||||
    tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder)));
 | 
					    tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder)));
 | 
				
			||||||
    tft_string.add(LCD_STR_DEGREE);
 | 
					    tft_string.add(LCD_STR_DEGREE);
 | 
				
			||||||
    tft_string.trim();
 | 
					    tft_string.trim();
 | 
				
			||||||
@@ -593,19 +593,19 @@ static void drawCurStepValue() {
 | 
				
			|||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft.add_text(CUR_STEP_VALUE_WIDTH - tft_string.width(), 0, COLOR_AXIS_HOMED, tft_string);
 | 
					  tft.add_text(CUR_STEP_VALUE_WIDTH - tft_string.width(), 0, COLOR_AXIS_HOMED, tft_string);
 | 
				
			||||||
  tft.queue.sync();
 | 
					  tft.queue.sync();
 | 
				
			||||||
  tft_string.set("mm");
 | 
					  tft_string.set(F("mm"));
 | 
				
			||||||
  tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y + 20, CUR_STEP_VALUE_WIDTH, 20);
 | 
					  tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y + 20, CUR_STEP_VALUE_WIDTH, 20);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft.add_text(CUR_STEP_VALUE_WIDTH - tft_string.width(), 0, COLOR_AXIS_HOMED, tft_string);
 | 
					  tft.add_text(CUR_STEP_VALUE_WIDTH - tft_string.width(), 0, COLOR_AXIS_HOMED, tft_string);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drawCurZSelection() {
 | 
					static void drawCurZSelection() {
 | 
				
			||||||
  tft_string.set("Z");
 | 
					  tft_string.set('Z');
 | 
				
			||||||
  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 20);
 | 
					  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 20);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft.add_text(0, 0, Z_BTN_COLOR, tft_string);
 | 
					  tft.add_text(0, 0, Z_BTN_COLOR, tft_string);
 | 
				
			||||||
  tft.queue.sync();
 | 
					  tft.queue.sync();
 | 
				
			||||||
  tft_string.set("Offset");
 | 
					  tft_string.set(F("Offset"));
 | 
				
			||||||
  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 20);
 | 
					  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 20);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) {
 | 
					  if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) {
 | 
				
			||||||
@@ -616,7 +616,7 @@ static void drawCurZSelection() {
 | 
				
			|||||||
static void drawCurESelection() {
 | 
					static void drawCurESelection() {
 | 
				
			||||||
  tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT);
 | 
					  tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft_string.set("E");
 | 
					  tft_string.set('E');
 | 
				
			||||||
  tft.add_text(0, 0, E_BTN_COLOR , tft_string);
 | 
					  tft.add_text(0, 0, E_BTN_COLOR , tft_string);
 | 
				
			||||||
  tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection));
 | 
					  tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -627,6 +627,8 @@ static void drawMessage(PGM_P const msg) {
 | 
				
			|||||||
  tft.add_text(0, 0, COLOR_YELLOW, msg);
 | 
					  tft.add_text(0, 0, COLOR_YELLOW, msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void drawMessage(FSTR_P const fmsg) { drawMessage(FTOP(fmsg)); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drawAxisValue(const AxisEnum axis) {
 | 
					static void drawAxisValue(const AxisEnum axis) {
 | 
				
			||||||
  const float value = (
 | 
					  const float value = (
 | 
				
			||||||
    TERN_(HAS_BED_PROBE, axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? probe.offset.z :)
 | 
					    TERN_(HAS_BED_PROBE, axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? probe.offset.z :)
 | 
				
			||||||
@@ -652,7 +654,7 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  #if ENABLED(PREVENT_COLD_EXTRUSION)
 | 
					  #if ENABLED(PREVENT_COLD_EXTRUSION)
 | 
				
			||||||
    if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) {
 | 
					    if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) {
 | 
				
			||||||
      drawMessage(PSTR("Too cold"));
 | 
					      drawMessage(F("Too cold"));
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
@@ -679,18 +681,18 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) {
 | 
				
			|||||||
        drawAxisValue(axis);
 | 
					        drawAxisValue(axis);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else {
 | 
					      else {
 | 
				
			||||||
        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
 | 
					        drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    #elif HAS_BED_PROBE
 | 
					    #elif HAS_BED_PROBE
 | 
				
			||||||
      // only change probe.offset.z
 | 
					      // only change probe.offset.z
 | 
				
			||||||
      probe.offset.z += diff;
 | 
					      probe.offset.z += diff;
 | 
				
			||||||
      if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) {
 | 
					      if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) {
 | 
				
			||||||
        current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN;
 | 
					        current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN;
 | 
				
			||||||
        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
 | 
					        drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) {
 | 
					      else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) {
 | 
				
			||||||
        current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX;
 | 
					        current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX;
 | 
				
			||||||
        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
 | 
					        drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else {
 | 
					      else {
 | 
				
			||||||
        drawMessage(NUL_STR); // clear the error
 | 
					        drawMessage(NUL_STR); // clear the error
 | 
				
			||||||
@@ -752,7 +754,7 @@ static void z_minus() { moveAxis(Z_AXIS, -1); }
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  static void do_home() {
 | 
					  static void do_home() {
 | 
				
			||||||
    quick_feedback();
 | 
					    quick_feedback();
 | 
				
			||||||
    drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING));
 | 
					    drawMessage(GET_TEXT_F(MSG_LEVEL_BED_HOMING));
 | 
				
			||||||
    queue.inject_P(G28_STR);
 | 
					    queue.inject_P(G28_STR);
 | 
				
			||||||
    // Disable touch until home is done
 | 
					    // Disable touch until home is done
 | 
				
			||||||
    TERN_(HAS_TFT_XPT2046, touch.disable());
 | 
					    TERN_(HAS_TFT_XPT2046, touch.disable());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -283,7 +283,7 @@ void MarlinUI::draw_status_screen() {
 | 
				
			|||||||
  uint16_t offset = 32;
 | 
					  uint16_t offset = 32;
 | 
				
			||||||
  const bool nhz = axis_should_home(Z_AXIS);
 | 
					  const bool nhz = axis_should_home(Z_AXIS);
 | 
				
			||||||
  if (blink && nhz)
 | 
					  if (blink && nhz)
 | 
				
			||||||
    tft_string.set("?");
 | 
					    tft_string.set('?');
 | 
				
			||||||
  else {
 | 
					  else {
 | 
				
			||||||
    const float z = LOGICAL_Z_POSITION(current_position.z);
 | 
					    const float z = LOGICAL_Z_POSITION(current_position.z);
 | 
				
			||||||
    tft_string.set(ftostr52sp((int16_t)z));
 | 
					    tft_string.set(ftostr52sp((int16_t)z));
 | 
				
			||||||
@@ -466,7 +466,7 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con
 | 
				
			|||||||
    tft_string.add(' ');
 | 
					    tft_string.add(' ');
 | 
				
			||||||
    tft_string.add(i16tostr3rj(thermalManager.wholeDegHotend(extruder)));
 | 
					    tft_string.add(i16tostr3rj(thermalManager.wholeDegHotend(extruder)));
 | 
				
			||||||
    tft_string.add(LCD_STR_DEGREE);
 | 
					    tft_string.add(LCD_STR_DEGREE);
 | 
				
			||||||
    tft_string.add(" / ");
 | 
					    tft_string.add(F(" / "));
 | 
				
			||||||
    tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder)));
 | 
					    tft_string.add(i16tostr3rj(thermalManager.degTargetHotend(extruder)));
 | 
				
			||||||
    tft_string.add(LCD_STR_DEGREE);
 | 
					    tft_string.add(LCD_STR_DEGREE);
 | 
				
			||||||
    tft_string.trim();
 | 
					    tft_string.trim();
 | 
				
			||||||
@@ -594,19 +594,19 @@ static void quick_feedback() {
 | 
				
			|||||||
#define CUR_STEP_VALUE_WIDTH 104
 | 
					#define CUR_STEP_VALUE_WIDTH 104
 | 
				
			||||||
static void drawCurStepValue() {
 | 
					static void drawCurStepValue() {
 | 
				
			||||||
  tft_string.set(ftostr52sp(motionAxisState.currentStepSize));
 | 
					  tft_string.set(ftostr52sp(motionAxisState.currentStepSize));
 | 
				
			||||||
  tft_string.add("mm");
 | 
					  tft_string.add(F("mm"));
 | 
				
			||||||
  tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT);
 | 
					  tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string);
 | 
					  tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drawCurZSelection() {
 | 
					static void drawCurZSelection() {
 | 
				
			||||||
  tft_string.set("Z");
 | 
					  tft_string.set('Z');
 | 
				
			||||||
  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34);
 | 
					  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft.add_text(0, 0, Z_BTN_COLOR, tft_string);
 | 
					  tft.add_text(0, 0, Z_BTN_COLOR, tft_string);
 | 
				
			||||||
  tft.queue.sync();
 | 
					  tft.queue.sync();
 | 
				
			||||||
  tft_string.set("Offset");
 | 
					  tft_string.set(F("Offset"));
 | 
				
			||||||
  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34);
 | 
					  tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) {
 | 
					  if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) {
 | 
				
			||||||
@@ -617,7 +617,7 @@ static void drawCurZSelection() {
 | 
				
			|||||||
static void drawCurESelection() {
 | 
					static void drawCurESelection() {
 | 
				
			||||||
  tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT);
 | 
					  tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT);
 | 
				
			||||||
  tft.set_background(COLOR_BACKGROUND);
 | 
					  tft.set_background(COLOR_BACKGROUND);
 | 
				
			||||||
  tft_string.set("E");
 | 
					  tft_string.set('E');
 | 
				
			||||||
  tft.add_text(0, 0, E_BTN_COLOR , tft_string);
 | 
					  tft.add_text(0, 0, E_BTN_COLOR , tft_string);
 | 
				
			||||||
  tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection));
 | 
					  tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -628,6 +628,8 @@ static void drawMessage(PGM_P const msg) {
 | 
				
			|||||||
  tft.add_text(0, 0, COLOR_YELLOW, msg);
 | 
					  tft.add_text(0, 0, COLOR_YELLOW, msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void drawMessage(FSTR_P const fmsg) { drawMessage(FTOP(fmsg)); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void drawAxisValue(const AxisEnum axis) {
 | 
					static void drawAxisValue(const AxisEnum axis) {
 | 
				
			||||||
  const float value = (
 | 
					  const float value = (
 | 
				
			||||||
    TERN_(HAS_BED_PROBE, axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? probe.offset.z :)
 | 
					    TERN_(HAS_BED_PROBE, axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? probe.offset.z :)
 | 
				
			||||||
@@ -653,7 +655,7 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  #if ENABLED(PREVENT_COLD_EXTRUSION)
 | 
					  #if ENABLED(PREVENT_COLD_EXTRUSION)
 | 
				
			||||||
    if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) {
 | 
					    if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) {
 | 
				
			||||||
      drawMessage(PSTR("Too cold"));
 | 
					      drawMessage(F("Too cold"));
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  #endif
 | 
					  #endif
 | 
				
			||||||
@@ -680,18 +682,18 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) {
 | 
				
			|||||||
        drawAxisValue(axis);
 | 
					        drawAxisValue(axis);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else {
 | 
					      else {
 | 
				
			||||||
        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
 | 
					        drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    #elif HAS_BED_PROBE
 | 
					    #elif HAS_BED_PROBE
 | 
				
			||||||
      // only change probe.offset.z
 | 
					      // only change probe.offset.z
 | 
				
			||||||
      probe.offset.z += diff;
 | 
					      probe.offset.z += diff;
 | 
				
			||||||
      if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) {
 | 
					      if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) {
 | 
				
			||||||
        current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN;
 | 
					        current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN;
 | 
				
			||||||
        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
 | 
					        drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) {
 | 
					      else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) {
 | 
				
			||||||
        current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX;
 | 
					        current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX;
 | 
				
			||||||
        drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS));
 | 
					        drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else {
 | 
					      else {
 | 
				
			||||||
        drawMessage(NUL_STR); // clear the error
 | 
					        drawMessage(NUL_STR); // clear the error
 | 
				
			||||||
@@ -753,7 +755,7 @@ static void z_minus() { moveAxis(Z_AXIS, -1); }
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  static void do_home() {
 | 
					  static void do_home() {
 | 
				
			||||||
    quick_feedback();
 | 
					    quick_feedback();
 | 
				
			||||||
    drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING));
 | 
					    drawMessage(GET_TEXT_F(MSG_LEVEL_BED_HOMING));
 | 
				
			||||||
    queue.inject_P(G28_STR);
 | 
					    queue.inject_P(G28_STR);
 | 
				
			||||||
    // Disable touch until home is done
 | 
					    // Disable touch until home is done
 | 
				
			||||||
    TERN_(HAS_TFT_XPT2046, touch.disable());
 | 
					    TERN_(HAS_TFT_XPT2046, touch.disable());
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user