Bladeren bron

LCD menu optimalization - lcd_printPGM replaced with lcd_puts_P

Robert Pelnar 5 jaren geleden
bovenliggende
commit
68e59399af
7 gewijzigde bestanden met toevoegingen van 212 en 239 verwijderingen
  1. 20 20
      Firmware/Marlin_main.cpp
  2. 1 1
      Firmware/cardreader.cpp
  3. 2 26
      Firmware/lcd.cpp
  4. 0 3
      Firmware/lcd.h
  5. 5 5
      Firmware/mesh_bed_calibration.cpp
  6. 182 182
      Firmware/ultralcd.cpp
  7. 2 2
      Firmware/util.cpp

+ 20 - 20
Firmware/Marlin_main.cpp

@@ -838,8 +838,8 @@ void factory_reset(char level, bool quiet)
 
         // Level 2: Prepare for shipping
         case 2:
-			//lcd_printPGM(PSTR("Factory RESET"));
-            //lcd_print_at_PGM(1,2,PSTR("Shipping prep"));
+			//lcd_puts_P(PSTR("Factory RESET"));
+            //lcd_puts_at_P(1,2,PSTR("Shipping prep"));
             
             // Force language selection at the next boot up.
 			lang_reset();
@@ -870,15 +870,15 @@ void factory_reset(char level, bool quiet)
 			// Level 3: erase everything, whole EEPROM will be set to 0xFF
 
 		case 3:
-			lcd_printPGM(PSTR("Factory RESET"));
-			lcd_print_at_PGM(1, 2, PSTR("ERASING all data"));
+			lcd_puts_P(PSTR("Factory RESET"));
+			lcd_puts_at_P(1, 2, PSTR("ERASING all data"));
 
 			WRITE(BEEPER, HIGH);
 			_delay_ms(100);
 			WRITE(BEEPER, LOW);
 
 			er_progress = 0;
-			lcd_print_at_PGM(3, 3, PSTR("      "));
+			lcd_puts_at_P(3, 3, PSTR("      "));
 			lcd_print_at(3, 3, er_progress);
 
 			// Erase EEPROM
@@ -887,9 +887,9 @@ void factory_reset(char level, bool quiet)
 
 				if (i % 41 == 0) {
 					er_progress++;
-					lcd_print_at_PGM(3, 3, PSTR("      "));
+					lcd_puts_at_P(3, 3, PSTR("      "));
 					lcd_print_at(3, 3, er_progress);
-					lcd_printPGM(PSTR("%"));
+					lcd_puts_P(PSTR("%"));
 				}
 
 			}
@@ -928,8 +928,8 @@ int uart_putchar(char c, FILE *stream)
 
 void lcd_splash()
 {
-//	lcd_print_at_PGM(0, 1, PSTR("   Original Prusa   "));
-//	lcd_print_at_PGM(0, 2, PSTR("    3D  Printers    "));
+//	lcd_puts_at_P(0, 1, PSTR("   Original Prusa   "));
+//	lcd_puts_at_P(0, 2, PSTR("    3D  Printers    "));
 //	lcd.print_P(PSTR("\x1b[1;3HOriginal Prusa\x1b[2;4H3D  Printers"));
 //    fputs_P(PSTR(ESC_2J ESC_H(1,1) "Original Prusa i3" ESC_H(3,2) "Prusa Research"), lcdout);
     lcd_puts_P(PSTR(ESC_2J ESC_H(1,1) "Original Prusa i3" ESC_H(3,2) "Prusa Research"));
@@ -948,7 +948,7 @@ void factory_reset()
 			lcd_clear();
 
 
-			lcd_printPGM(PSTR("Factory RESET"));
+			lcd_puts_P(PSTR("Factory RESET"));
 
 
 			SET_OUTPUT(BEEPER);
@@ -1020,13 +1020,13 @@ void show_fw_version_warnings() {
     lcd_update_enable(false);
     lcd_clear();
   #if FW_DEV_VERSION == FW_VERSION_DEVEL
-    lcd_print_at_PGM(0, 0, PSTR("Development build !!"));
+    lcd_puts_at_P(0, 0, PSTR("Development build !!"));
   #else
-    lcd_print_at_PGM(0, 0, PSTR("Debbugging build !!!"));
+    lcd_puts_at_P(0, 0, PSTR("Debbugging build !!!"));
   #endif
-    lcd_print_at_PGM(0, 1, PSTR("May destroy printer!"));
-    lcd_print_at_PGM(0, 2, PSTR("ver ")); lcd_printPGM(PSTR(FW_VERSION_FULL));
-    lcd_print_at_PGM(0, 3, PSTR(FW_REPOSITORY));
+    lcd_puts_at_P(0, 1, PSTR("May destroy printer!"));
+    lcd_puts_at_P(0, 2, PSTR("ver ")); lcd_puts_P(PSTR(FW_VERSION_FULL));
+    lcd_puts_at_P(0, 3, PSTR(FW_REPOSITORY));
     lcd_wait_for_click();
     break;
 //	default: lcd_show_fullscreen_message_and_wait_P(_i("WARNING: This is an unofficial, unsupported build. Use at your own risk!")); break;////MSG_FW_VERSION_UNKNOWN c=20 r=8
@@ -1823,7 +1823,7 @@ int serial_read_stream() {
     setTargetBed(0);
 
     lcd_clear();
-    lcd_printPGM(PSTR(" Upload in progress"));
+    lcd_puts_P(PSTR(" Upload in progress"));
 
     // first wait for how many bytes we will receive
     uint32_t bytesToReceive;
@@ -2282,7 +2282,7 @@ bool calibrate_z_auto()
 {
 	//lcd_display_message_fullscreen_P(_T(MSG_CALIBRATE_Z_AUTO));
 	lcd_clear();
-	lcd_print_at_PGM(0,1, _T(MSG_CALIBRATE_Z_AUTO));
+	lcd_puts_at_P(0,1, _T(MSG_CALIBRATE_Z_AUTO));
 	bool endstops_enabled  = enable_endstops(true);
 	int axis_up_dir = -home_dir(Z_AXIS);
 	tmc2130_home_enter(Z_AXIS_MASK);
@@ -2968,7 +2968,7 @@ bool gcode_M45(bool onlyZ, int8_t verbosity_level)
 			KEEPALIVE_STATE(IN_HANDLER);
 			lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1));
 			lcd_print_at(0, 2, 1);
-			lcd_printPGM(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2));
+			lcd_puts_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2));
 		}
 		// Move the print head close to the bed.
 		current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
@@ -7609,9 +7609,9 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s
                     lcd_update_enable(false);
                     lcd_clear();
                     lcd.setCursor(0, 0);
-                    lcd_printPGM(_T(MSG_ERROR));
+                    lcd_puts_P(_T(MSG_ERROR));
                     lcd.setCursor(0, 2);
-                    lcd_printPGM(_T(MSG_PREHEAT_NOZZLE));
+                    lcd_puts_P(_T(MSG_PREHEAT_NOZZLE));
                     delay(2000);
                     lcd_clear();
                     lcd_update_enable(true);

+ 1 - 1
Firmware/cardreader.cpp

@@ -762,7 +762,7 @@ void CardReader::presort() {
 		#if !SDSORT_USES_RAM
 			lcd_set_progress();
 		#endif
-		lcd_print_at_PGM(0, 1, _i("Sorting files"));////MSG_SORTING c=20 r=1
+		lcd_puts_at_P(0, 1, _i("Sorting files"));////MSG_SORTING c=20 r=1
 
 		// Sort order is always needed. May be static or dynamic.
 		#if SDSORT_DYNAMIC_RAM

+ 2 - 26
Firmware/lcd.cpp

@@ -277,30 +277,6 @@ void lcd_implementation_init_noclear(void)
 }
 
 
-/* Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own */
-void lcd_printPGM(const char* str)
-{
-    char c;
-    while((c = pgm_read_byte(str++)) != '\0')
-    {
-        lcd.write(c);
-    }
-}
-
-void lcd_print_at_PGM(uint8_t x, uint8_t y, const char* str)
-{
-    lcd.setCursor(x, y);
-    char c;
-    while((c = pgm_read_byte(str++)) != '\0')
-    {
-        lcd.write(c);
-    }
-}
-
-void lcd_implementation_write(char c)
-{
-    lcd.write(c);
-}
 
 void lcd_print(int8_t i)
 {
@@ -352,7 +328,7 @@ void lcd_print_at(uint8_t x, uint8_t y, const char *str)
 void lcd_drawedit(const char* pstr, char* value)
 {
     lcd.setCursor(1, 1);
-    lcd_printPGM(pstr);
+    lcd_puts_P(pstr);
     lcd.print(':');
    #if LCD_WIDTH < 20
       lcd.setCursor(LCD_WIDTH - strlen(value), 1);
@@ -365,7 +341,7 @@ void lcd_drawedit(const char* pstr, char* value)
 void lcd_drawedit_2(const char* pstr, char* value)
 {
     lcd.setCursor(0, 1);
-    lcd_printPGM(pstr);
+    lcd_puts_P(pstr);
     lcd.print(':');
 
     lcd.setCursor((LCD_WIDTH - strlen(value))/2, 3);

+ 0 - 3
Firmware/lcd.h

@@ -174,9 +174,6 @@ extern void lcd_set_custom_characters_degree(void);
 extern void lcd_implementation_init(void);
 extern void lcd_implementation_init_noclear(void);
 
-// Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own
-extern void lcd_printPGM(const char* str);
-extern void lcd_print_at_PGM(uint8_t x, uint8_t y, const char* str);
 extern void lcd_print(int8_t i);
 extern void lcd_print_at(uint8_t x, uint8_t y, int8_t i);
 extern void lcd_print(int i);

+ 5 - 5
Firmware/mesh_bed_calibration.cpp

@@ -2205,10 +2205,10 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level
 		refresh_cmd_timeout();
 #ifdef MESH_BED_CALIBRATION_SHOW_LCD
 		lcd_print_at(0, next_line, k + 1);
-		lcd_printPGM(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2));
+		lcd_puts_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2));
 
 		if (iteration > 0) {
-			lcd_print_at_PGM(0, next_line + 1, _i("Iteration "));////MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
+			lcd_puts_at_P(0, next_line + 1, _i("Iteration "));////MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
 			lcd_print(int(iteration + 1));
 		}
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
@@ -2479,7 +2479,7 @@ BedSkewOffsetDetectionResultType improve_bed_offset_and_skew(int8_t method, int8
         // Print the decrasing ID of the measurement point.
 #ifdef MESH_BED_CALIBRATION_SHOW_LCD
         lcd_print_at(0, next_line, mesh_point+1);
-        lcd_printPGM(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2));////MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
+        lcd_puts_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2));////MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
 
         // Move up.
@@ -2783,7 +2783,7 @@ bool sample_mesh_and_store_reference()
         next_line = 3;
     // display "point xx of yy"
     lcd_print_at(0, next_line, 1);
-    lcd_printPGM(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2));
+    lcd_puts_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2));
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
 
     // Sample Z heights for the mesh bed leveling.
@@ -2829,7 +2829,7 @@ bool sample_mesh_and_store_reference()
 #ifdef MESH_BED_CALIBRATION_SHOW_LCD
         // display "point xx of yy"
         lcd_print_at(0, next_line, mesh_point+1);
-        lcd_printPGM(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2));
+        lcd_puts_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2));
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
 		if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um
 		{

+ 182 - 182
Firmware/ultralcd.cpp

@@ -287,15 +287,15 @@ bool wait_for_unclick;
 static inline void lcd_print_percent_done() {
 	if (is_usb_printing)
 	{
-		lcd_printPGM(PSTR("USB"));
+		lcd_puts_P(PSTR("USB"));
 	}
 	else if(IS_SD_PRINTING)
 	{
-		lcd_printPGM(PSTR("SD"));
+		lcd_puts_P(PSTR("SD"));
 	}
 	else
 	{
-		lcd_printPGM(PSTR("  "));
+		lcd_puts_P(PSTR("  "));
 	}
 	if (IS_SD_PRINTING || (PRINTER_ACTIVE && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT)))
 	{
@@ -303,9 +303,9 @@ static inline void lcd_print_percent_done() {
 	}
 	else
 	{
-		lcd_printPGM(PSTR("---"));
+		lcd_puts_P(PSTR("---"));
 	}
-	lcd_printPGM(PSTR("% "));
+	lcd_puts_P(PSTR("% "));
 }
 
 static inline void lcd_print_time() {
@@ -330,10 +330,10 @@ static inline void lcd_print_time() {
 			(feedmultiply == 100) ? lcd.print(' ') : lcd.print('?');
 		}
 		else {
-			lcd_printPGM(PSTR("  "));
+			lcd_puts_P(PSTR("  "));
 		}
     }else{
-        lcd_printPGM(PSTR("--:--  "));
+        lcd_puts_P(PSTR("--:--  "));
     }
 }
 
@@ -604,22 +604,22 @@ static void lcd_implementation_status_screen()
     lcd.print(itostr3(tHotend));
     lcd.print('/');
     lcd.print(itostr3left(tTarget));
-    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
-    lcd_printPGM(PSTR("  "));
+    lcd_puts_P(PSTR(LCD_STR_DEGREE " "));
+    lcd_puts_P(PSTR("  "));
 
     //Print the Z coordinates
     lcd.setCursor(LCD_WIDTH - 8-2, 0);
 #if 1
-    lcd_printPGM(PSTR("  Z"));
+    lcd_puts_P(PSTR("  Z"));
     if (custom_message_type == 1) {
         // In a bed calibration mode.
-        lcd_printPGM(PSTR("   --- "));
+        lcd_puts_P(PSTR("   --- "));
     } else {
         lcd.print(ftostr32sp(current_position[Z_AXIS] + 0.00001));
         lcd.print(' ');
     }
 #else
-    lcd_printPGM(PSTR(" Queue:"));
+    lcd_puts_P(PSTR(" Queue:"));
     lcd.print(int(moves_planned()));
     lcd.print(' ');
 #endif
@@ -632,15 +632,15 @@ static void lcd_implementation_status_screen()
     lcd.print(itostr3(tHotend));
     lcd.print('/');
     lcd.print(itostr3left(tTarget));
-    lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
-    lcd_printPGM(PSTR("  "));
+    lcd_puts_P(PSTR(LCD_STR_DEGREE " "));
+    lcd_puts_P(PSTR("  "));
 
 #ifdef PLANNER_DIAGNOSTICS
     //Print Feedrate
     lcd.setCursor(LCD_WIDTH - 8-2, 1);
     lcd.print(LCD_STR_FEEDRATE[0]);
     lcd.print(itostr3(feedmultiply));
-    lcd_printPGM(PSTR("%  Q"));
+    lcd_puts_P(PSTR("%  Q"));
     {
       uint8_t queue = planner_queue_min();
       if (queue < (BLOCK_BUFFER_SIZE >> 1)) {
@@ -655,10 +655,10 @@ static void lcd_implementation_status_screen()
 #else /* PLANNER_DIAGNOSTICS */
     //Print Feedrate
     lcd.setCursor(LCD_WIDTH - 8-2, 1);
-    lcd_printPGM(PSTR("  "));
+    lcd_puts_P(PSTR("  "));
     lcd.print(LCD_STR_FEEDRATE[0]);
     lcd.print(itostr3(feedmultiply));
-    lcd_printPGM(PSTR("%     "));
+    lcd_puts_P(PSTR("%     "));
 #endif /* PLANNER_DIAGNOSTICS */
 
 	bool print_sd_status = true;
@@ -668,9 +668,9 @@ static void lcd_implementation_status_screen()
 	if (false)
 	{
 		lcd.setCursor(0, 2);
-		lcd_printPGM(PSTR("P"));
+		lcd_puts_P(PSTR("P"));
 		lcd.print(ftostr3(current_temperature_pinda));
-		lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
+		lcd_puts_P(PSTR(LCD_STR_DEGREE " "));
 		print_sd_status = false;
 	}
 #endif //PINDA_THERMISTOR
@@ -688,37 +688,37 @@ if (print_sd_status)
 	if (farm_mode)
 	{
 		lcd.setCursor(6, 2);
-		lcd_printPGM(PSTR(" F"));
+		lcd_puts_P(PSTR(" F"));
 		lcd.print(farm_no);
-		lcd_printPGM(PSTR("  "));
+		lcd_puts_P(PSTR("  "));
         
         // Beat display
         lcd.setCursor(LCD_WIDTH - 1, 0);
         if ( (millis() - kicktime) < 60000 ) {
         
-            lcd_printPGM(PSTR("L"));
+            lcd_puts_P(PSTR("L"));
         
         }else{
-            lcd_printPGM(PSTR(" "));
+            lcd_puts_P(PSTR(" "));
         }
         
 	}
 	else {
 #ifdef SNMM
-		lcd_printPGM(PSTR(" E"));
+		lcd_puts_P(PSTR(" E"));
 		lcd.print(get_ext_nr() + 1);
 
 #else
 		lcd.setCursor(LCD_WIDTH - 8 - 2, 2);
-		lcd_printPGM(PSTR(" "));
+		lcd_puts_P(PSTR(" "));
 #endif
 	}
 
 #ifdef CMD_DIAGNOSTICS
 	lcd.setCursor(LCD_WIDTH - 8 -1, 2);
-	lcd_printPGM(PSTR("      C"));
+	lcd_puts_P(PSTR("      C"));
 	lcd.print(buflen);	// number of commands in cmd buffer
-	if (buflen < 9) lcd_printPGM(" ");
+	if (buflen < 9) lcd_puts_P(" ");
 #else
     //Print time
 	lcd.setCursor(LCD_WIDTH - 8, 2);
@@ -800,7 +800,7 @@ if (print_sd_status)
 					heating_status_counter = 0;
 				}
 				lcd.setCursor(7, 3);
-				lcd_printPGM(PSTR("             "));
+				lcd_puts_P(PSTR("             "));
 
 				for (int dots = 0; dots < heating_status_counter; dots++)
 				{
@@ -812,22 +812,22 @@ if (print_sd_status)
 				{
 				case 1:
 					lcd.setCursor(0, 3);
-					lcd_printPGM(_T(MSG_HEATING));
+					lcd_puts_P(_T(MSG_HEATING));
 					break;
 				case 2:
 					lcd.setCursor(0, 3);
-					lcd_printPGM(_T(MSG_HEATING_COMPLETE));
+					lcd_puts_P(_T(MSG_HEATING_COMPLETE));
 					heating_status = 0;
 					heating_status_counter = 0;
 					custom_message = false;
 					break;
 				case 3:
 					lcd.setCursor(0, 3);
-					lcd_printPGM(_T(MSG_BED_HEATING));
+					lcd_puts_P(_T(MSG_BED_HEATING));
 					break;
 				case 4:
 					lcd.setCursor(0, 3);
-					lcd_printPGM(_T(MSG_BED_DONE));
+					lcd_puts_P(_T(MSG_BED_DONE));
 					heating_status = 0;
 					heating_status_counter = 0;
 					custom_message = false;
@@ -844,17 +844,17 @@ if (print_sd_status)
 				if (custom_message_state > 10)
 				{
 					lcd.setCursor(0, 3);
-					lcd_printPGM(PSTR("                    "));
+					lcd_puts_P(PSTR("                    "));
 					lcd.setCursor(0, 3);
-					lcd_printPGM(_T(MSG_CALIBRATE_Z_AUTO));
-					lcd_printPGM(PSTR(" : "));
+					lcd_puts_P(_T(MSG_CALIBRATE_Z_AUTO));
+					lcd_puts_P(PSTR(" : "));
 					lcd.print(custom_message_state-10);
 				}
 				else
 				{
 					if (custom_message_state == 3)
 					{
-						lcd_printPGM(_T(WELCOME_MSG));
+						lcd_puts_P(_T(WELCOME_MSG));
 						lcd_setstatuspgm(_T(WELCOME_MSG));
 						custom_message = false;
 						custom_message_type = 0;
@@ -862,9 +862,9 @@ if (print_sd_status)
 					if (custom_message_state > 3 && custom_message_state <= 10 )
 					{
 						lcd.setCursor(0, 3);
-						lcd_printPGM(PSTR("                   "));
+						lcd_puts_P(PSTR("                   "));
 						lcd.setCursor(0, 3);
-						lcd_printPGM(_i("Calibration done"));////MSG_HOMEYZ_DONE c=0 r=0
+						lcd_puts_P(_i("Calibration done"));////MSG_HOMEYZ_DONE c=0 r=0
 						custom_message_state--;
 					}
 				}
@@ -890,7 +890,7 @@ if (print_sd_status)
 			if (custom_message_type == 4) {
 				char progress[4];
 				lcd.setCursor(0, 3);
-				lcd_printPGM(_T(MSG_TEMP_CALIBRATION));
+				lcd_puts_P(_T(MSG_TEMP_CALIBRATION));
 				lcd.setCursor(12, 3);
 				sprintf(progress, "%d/6", custom_message_state);
 				lcd.print(progress);
@@ -898,9 +898,9 @@ if (print_sd_status)
 			// temp compensation preheat
 			if (custom_message_type == 5) {
 				lcd.setCursor(0, 3);
-				lcd_printPGM(_i("PINDA Heating"));////MSG_PINDA_PREHEAT c=20 r=1
+				lcd_puts_P(_i("PINDA Heating"));////MSG_PINDA_PREHEAT c=20 r=1
 				if (custom_message_state <= PINDA_HEAT_T) {
-					lcd_printPGM(PSTR(": "));
+					lcd_puts_P(PSTR(": "));
 					lcd.print(custom_message_state); //seconds
 					lcd.print(' ');
 					
@@ -1073,7 +1073,7 @@ static void lcd_status_screen()
 
   /*if (farm_mode && !printer_connected) {
 	  lcd.setCursor(0, 3);
-	  lcd_printPGM(_i("Printer disconnected"));////MSG_PRINTER_DISCONNECTED c=20 r=1
+	  lcd_puts_P(_i("Printer disconnected"));////MSG_PRINTER_DISCONNECTED c=20 r=1
   }*/
 
 
@@ -2293,9 +2293,9 @@ void lcd_unLoadFilament()
 
     lcd_clear();
     lcd.setCursor(0, 0);
-    lcd_printPGM(_T(MSG_ERROR));
+    lcd_puts_P(_T(MSG_ERROR));
     lcd.setCursor(0, 2);
-    lcd_printPGM(_T(MSG_PREHEAT_NOZZLE));
+    lcd_puts_P(_T(MSG_PREHEAT_NOZZLE));
 
     delay(2000);
     lcd_clear();
@@ -2310,7 +2310,7 @@ void lcd_change_filament() {
 
   lcd.setCursor(0, 1);
 
-  lcd_printPGM(_i("Changing filament!"));////MSG_CHANGING_FILAMENT c=20 r=0
+  lcd_puts_P(_i("Changing filament!"));////MSG_CHANGING_FILAMENT c=20 r=0
 
 
 }
@@ -2322,12 +2322,12 @@ void lcd_wait_interact() {
 
   lcd.setCursor(0, 1);
 #ifdef SNMM 
-  lcd_printPGM(_i("Prepare new filament"));////MSG_PREPARE_FILAMENT c=20 r=1
+  lcd_puts_P(_i("Prepare new filament"));////MSG_PREPARE_FILAMENT c=20 r=1
 #else
-  lcd_printPGM(_i("Insert filament"));////MSG_INSERT_FILAMENT c=20 r=0
+  lcd_puts_P(_i("Insert filament"));////MSG_INSERT_FILAMENT c=20 r=0
 #endif
   lcd.setCursor(0, 2);
-  lcd_printPGM(_i("and press the knob"));////MSG_PRESS c=20 r=0
+  lcd_puts_P(_i("and press the knob"));////MSG_PRESS c=20 r=0
 
 }
 
@@ -2338,7 +2338,7 @@ void lcd_change_success() {
 
   lcd.setCursor(0, 2);
 
-  lcd_printPGM(_i("Change success!"));////MSG_CHANGE_SUCCESS c=0 r=0
+  lcd_puts_P(_i("Change success!"));////MSG_CHANGE_SUCCESS c=0 r=0
 
 
 }
@@ -2350,9 +2350,9 @@ void lcd_loading_color() {
 
   lcd.setCursor(0, 0);
 
-  lcd_printPGM(_i("Loading color"));////MSG_LOADING_COLOR c=0 r=0
+  lcd_puts_P(_i("Loading color"));////MSG_LOADING_COLOR c=0 r=0
   lcd.setCursor(0, 2);
-  lcd_printPGM(_T(MSG_PLEASE_WAIT));
+  lcd_puts_P(_T(MSG_PLEASE_WAIT));
 
 
   for (int i = 0; i < 20; i++) {
@@ -2379,9 +2379,9 @@ void lcd_loading_filament() {
 
   lcd.setCursor(0, 0);
 
-  lcd_printPGM(_T(MSG_LOADING_FILAMENT));
+  lcd_puts_P(_T(MSG_LOADING_FILAMENT));
   lcd.setCursor(0, 2);
-  lcd_printPGM(_T(MSG_PLEASE_WAIT));
+  lcd_puts_P(_T(MSG_PLEASE_WAIT));
 
   for (int i = 0; i < 20; i++) {
 
@@ -2417,19 +2417,19 @@ void lcd_alright() {
 
   lcd.setCursor(0, 0);
 
-  lcd_printPGM(_i("Changed correctly?"));////MSG_CORRECTLY c=20 r=0
+  lcd_puts_P(_i("Changed correctly?"));////MSG_CORRECTLY c=20 r=0
 
   lcd.setCursor(1, 1);
 
-  lcd_printPGM(_T(MSG_YES));
+  lcd_puts_P(_T(MSG_YES));
 
   lcd.setCursor(1, 2);
 
-  lcd_printPGM(_i("Filament not loaded"));////MSG_NOT_LOADED c=19 r=0
+  lcd_puts_P(_i("Filament not loaded"));////MSG_NOT_LOADED c=19 r=0
 
 
   lcd.setCursor(1, 3);
-  lcd_printPGM(_i("Color not correct"));////MSG_NOT_COLOR c=0 r=0
+  lcd_puts_P(_i("Color not correct"));////MSG_NOT_COLOR c=0 r=0
 
 
   lcd.setCursor(0, 1);
@@ -2507,9 +2507,9 @@ static void lcd_menu_AutoLoadFilament()
 		ShortTimer* ptimer = (ShortTimer*)&(menuData.autoLoadFilamentMenu.dummy);
         if (!ptimer->running()) ptimer->start();
         lcd.setCursor(0, 0);
-        lcd_printPGM(_T(MSG_ERROR));
+        lcd_puts_P(_T(MSG_ERROR));
         lcd.setCursor(0, 2);
-        lcd_printPGM(_T(MSG_PREHEAT_NOZZLE));
+        lcd_puts_P(_T(MSG_PREHEAT_NOZZLE));
         if (ptimer->expired(2000ul)) menu_back();
     }
     menu_back_if_clicked();
@@ -2531,9 +2531,9 @@ static void lcd_LoadFilament()
 
     lcd_clear();
     lcd.setCursor(0, 0);
-    lcd_printPGM(_T(MSG_ERROR));
+    lcd_puts_P(_T(MSG_ERROR));
     lcd.setCursor(0, 2);
-    lcd_printPGM(_T(MSG_PREHEAT_NOZZLE));
+    lcd_puts_P(_T(MSG_PREHEAT_NOZZLE));
     delay(2000);
     lcd_clear();
   }
@@ -2660,9 +2660,9 @@ static void lcd_move_e()
 	else {
 		lcd_clear();
 		lcd.setCursor(0, 0);
-		lcd_printPGM(_T(MSG_ERROR));
+		lcd_puts_P(_T(MSG_ERROR));
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_T(MSG_PREHEAT_NOZZLE));
+		lcd_puts_P(_T(MSG_PREHEAT_NOZZLE));
 
 		delay(2000);
 		lcd_return_to_status();
@@ -2747,10 +2747,10 @@ static void lcd_menu_xyz_skew()
 static void lcd_menu_xyz_offset()
 {
     lcd.setCursor(0,0);
-    lcd_printPGM(_i("[0;0] point offset"));////MSG_MEASURED_OFFSET c=0 r=0
-    lcd_print_at_PGM(0, 1, separator);
-    lcd_print_at_PGM(0, 2, PSTR("X"));
-    lcd_print_at_PGM(0, 3, PSTR("Y"));
+    lcd_puts_P(_i("[0;0] point offset"));////MSG_MEASURED_OFFSET c=0 r=0
+    lcd_puts_at_P(0, 1, separator);
+    lcd_puts_at_P(0, 2, PSTR("X"));
+    lcd_puts_at_P(0, 3, PSTR("Y"));
 
     float vec_x[2];
     float vec_y[2];
@@ -2759,9 +2759,9 @@ static void lcd_menu_xyz_offset()
 
     for (int i = 0; i < 2; i++)
     {
-        lcd_print_at_PGM(11, i + 2, PSTR(""));
+        lcd_puts_at_P(11, i + 2, PSTR(""));
         lcd.print(cntr[i]);
-        lcd_print_at_PGM((cntr[i] < 0) ? 17 : 16, i + 2, PSTR("mm"));
+        lcd_puts_at_P((cntr[i] < 0) ? 17 : 16, i + 2, PSTR("mm"));
     }
     menu_back_if_clicked();
 }
@@ -2942,7 +2942,7 @@ void pid_extruder() {
 
 	lcd_clear();
 	lcd.setCursor(1, 0);
-	lcd_printPGM(_i("Set temperature:"));////MSG_SET_TEMPERATURE c=19 r=1
+	lcd_puts_P(_i("Set temperature:"));////MSG_SET_TEMPERATURE c=19 r=1
 	pid_temp += int(lcd_encoder);
 	if (pid_temp > HEATER_0_MAXTEMP) pid_temp = HEATER_0_MAXTEMP;
 	if (pid_temp < HEATER_0_MINTEMP) pid_temp = HEATER_0_MINTEMP;
@@ -2967,13 +2967,13 @@ void lcd_adjust_z() {
 
   lcd_clear();
   lcd.setCursor(0, 0);
-  lcd_printPGM(_i("Auto adjust Z?"));////MSG_ADJUSTZ c=0 r=0
+  lcd_puts_P(_i("Auto adjust Z?"));////MSG_ADJUSTZ c=0 r=0
   lcd.setCursor(1, 1);
-  lcd_printPGM(_T(MSG_YES));
+  lcd_puts_P(_T(MSG_YES));
 
   lcd.setCursor(1, 2);
 
-  lcd_printPGM(_T(MSG_NO));
+  lcd_puts_P(_T(MSG_NO));
 
   lcd.setCursor(0, 1);
 
@@ -3188,12 +3188,12 @@ calibrated:
     if(only_z){
         lcd_display_message_fullscreen_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1));
         lcd_print_at(0, 3, 1);
-        lcd_printPGM(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2));
+        lcd_puts_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2));
     }else{
 		//lcd_show_fullscreen_message_and_wait_P(_T(MSG_PAPER));
         lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1));
         lcd_print_at(0, 2, 1);
-        lcd_printPGM(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2));
+        lcd_puts_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2));
     }
     
     
@@ -3378,15 +3378,15 @@ int8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allo
 				if (msg_next == NULL) {
 					lcd.setCursor(0, 3);
 					if (enc_dif < lcd_encoder_diff && yes) {
-						lcd_printPGM((PSTR(" ")));
+						lcd_puts_P((PSTR(" ")));
 						lcd.setCursor(7, 3);
-						lcd_printPGM((PSTR(">")));
+						lcd_puts_P((PSTR(">")));
 						yes = false;
 					}
 					else if (enc_dif > lcd_encoder_diff && !yes) {
-						lcd_printPGM((PSTR(">")));
+						lcd_puts_P((PSTR(">")));
 						lcd.setCursor(7, 3);
-						lcd_printPGM((PSTR(" ")));
+						lcd_puts_P((PSTR(" ")));
 						yes = true;
 					}
 					enc_dif = lcd_encoder_diff;
@@ -3415,13 +3415,13 @@ int8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allo
 		}
 		if (msg_next == NULL) {
 			lcd.setCursor(0, 3);
-			if (yes) lcd_printPGM(PSTR(">"));
+			if (yes) lcd_puts_P(PSTR(">"));
 			lcd.setCursor(1, 3);
-			lcd_printPGM(_T(MSG_YES));
+			lcd_puts_P(_T(MSG_YES));
 			lcd.setCursor(7, 3);
-			if (!yes) lcd_printPGM(PSTR(">"));
+			if (!yes) lcd_puts_P(PSTR(">"));
 			lcd.setCursor(8, 3);
-			lcd_printPGM(_T(MSG_NO));
+			lcd_puts_P(_T(MSG_NO));
 		}
 	}
 }
@@ -3433,17 +3433,17 @@ int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow
 	
 	if (default_yes) {
 		lcd.setCursor(0, 2);
-		lcd_printPGM(PSTR(">"));
-		lcd_printPGM(_T(MSG_YES));
+		lcd_puts_P(PSTR(">"));
+		lcd_puts_P(_T(MSG_YES));
 		lcd.setCursor(1, 3);
-		lcd_printPGM(_T(MSG_NO));
+		lcd_puts_P(_T(MSG_NO));
 	}
 	else {
 		lcd.setCursor(1, 2);
-		lcd_printPGM(_T(MSG_YES));
+		lcd_puts_P(_T(MSG_YES));
 		lcd.setCursor(0, 3);
-		lcd_printPGM(PSTR(">"));
-		lcd_printPGM(_T(MSG_NO));
+		lcd_puts_P(PSTR(">"));
+		lcd_puts_P(_T(MSG_NO));
 	}
 	bool yes = default_yes ? true : false;
 
@@ -3459,15 +3459,15 @@ int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow
 		if (abs(enc_dif - lcd_encoder_diff) > 4) {
 			lcd.setCursor(0, 2);
 				if (enc_dif < lcd_encoder_diff && yes) {
-					lcd_printPGM((PSTR(" ")));
+					lcd_puts_P((PSTR(" ")));
 					lcd.setCursor(0, 3);
-					lcd_printPGM((PSTR(">")));
+					lcd_puts_P((PSTR(">")));
 					yes = false;
 				}
 				else if (enc_dif > lcd_encoder_diff && !yes) {
-					lcd_printPGM((PSTR(">")));
+					lcd_puts_P((PSTR(">")));
 					lcd.setCursor(0, 3);
-					lcd_printPGM((PSTR(" ")));
+					lcd_puts_P((PSTR(" ")));
 					yes = true;
 				}
 				enc_dif = lcd_encoder_diff;
@@ -3566,13 +3566,13 @@ void lcd_temp_cal_show_result(bool result) {
 
 static void lcd_show_end_stops() {
 	lcd.setCursor(0, 0);
-	lcd_printPGM((PSTR("End stops diag")));
+	lcd_puts_P((PSTR("End stops diag")));
 	lcd.setCursor(0, 1);
-	lcd_printPGM((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1) ? (PSTR("X1")) : (PSTR("X0")));
+	lcd_puts_P((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1) ? (PSTR("X1")) : (PSTR("X0")));
 	lcd.setCursor(0, 2);
-	lcd_printPGM((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) ? (PSTR("Y1")) : (PSTR("Y0")));
+	lcd_puts_P((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) ? (PSTR("Y1")) : (PSTR("Y0")));
 	lcd.setCursor(0, 3);
-	lcd_printPGM((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) ? (PSTR("Z1")) : (PSTR("Z0")));
+	lcd_puts_P((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) ? (PSTR("Z1")) : (PSTR("Z0")));
 }
 
 static void menu_show_end_stops() {
@@ -3830,7 +3830,7 @@ void lcd_pick_babystep(){
     
     lcd.setCursor(0, 0);
     
-    lcd_printPGM(_i("Pick print"));////MSG_PICK_Z c=0 r=0
+    lcd_puts_P(_i("Pick print"));////MSG_PICK_Z c=0 r=0
     
     
     lcd.setCursor(3, 2);
@@ -4228,7 +4228,7 @@ void lcd_calibrate_pinda() {
 		lcd_clear();
 		
 		
-		lcd.setCursor(0, 1); lcd_printPGM(_T(MSG_PLEASE_WAIT));
+		lcd.setCursor(0, 1); lcd_puts_P(_T(MSG_PLEASE_WAIT));
 		current_position[E_AXIS] += e_shift_calibration;
 		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feedrate, active_extruder);
 		st_synchronize();
@@ -4283,9 +4283,9 @@ void lcd_calibrate_pinda() {
 	{
 		lcd_clear();
 		lcd.setCursor(0, 0);
-		lcd_printPGM(_T(MSG_ERROR));
+		lcd_puts_P(_T(MSG_ERROR));
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_T(MSG_PREHEAT_NOZZLE));
+		lcd_puts_P(_T(MSG_PREHEAT_NOZZLE));
 		delay(2000);
 		lcd_clear();
 	}
@@ -4453,7 +4453,7 @@ void lcd_wizard(int state) {
 			lcd_show_fullscreen_message_and_wait_P(_i("Please insert PLA filament to the extruder, then press knob to load it."));////MSG_WIZARD_LOAD_FILAMENT c=20 r=8
 			lcd_update_enable(false);
 			lcd_clear();
-			lcd_print_at_PGM(0, 2, _T(MSG_LOADING_FILAMENT));
+			lcd_puts_at_P(0, 2, _T(MSG_LOADING_FILAMENT));
 #ifdef SNMM
 			change_extr(0);
 #endif
@@ -4885,10 +4885,10 @@ void bowden_menu() {
 
 static char snmm_stop_print_menu() { //menu for choosing which filaments will be unloaded in stop print
 	lcd_clear();
-	lcd_print_at_PGM(0,0,_T(MSG_UNLOAD_FILAMENT)); lcd.print(":");
+	lcd_puts_at_P(0,0,_T(MSG_UNLOAD_FILAMENT)); lcd.print(":");
 	lcd.setCursor(0, 1); lcd.print(">");
-	lcd_print_at_PGM(1,2,_i("Used during print"));////MSG_USED c=19 r=1
-	lcd_print_at_PGM(1,3,_i("Current"));////MSG_CURRENT c=19 r=1
+	lcd_puts_at_P(1,2,_i("Used during print"));////MSG_USED c=19 r=1
+	lcd_puts_at_P(1,3,_i("Current"));////MSG_CURRENT c=19 r=1
 	char cursor_pos = 1;
 	int enc_dif = 0;
 	KEEPALIVE_STATE(PAUSED_FOR_USER);
@@ -4936,11 +4936,11 @@ char choose_extruder_menu() {
 	enc_dif = lcd_encoder_diff;
 	lcd_clear();
 	
-	lcd_printPGM(_T(MSG_CHOOSE_EXTRUDER));
+	lcd_puts_P(_T(MSG_CHOOSE_EXTRUDER));
 	lcd.setCursor(0, 1);
 	lcd.print(">");
 	for (int i = 0; i < 3; i++) {
-		lcd_print_at_PGM(1, i + 1, _T(MSG_EXTRUDER));
+		lcd_puts_at_P(1, i + 1, _T(MSG_EXTRUDER));
 	}
 	KEEPALIVE_STATE(PAUSED_FOR_USER);
 	while (1) {
@@ -4969,9 +4969,9 @@ char choose_extruder_menu() {
 					if (first < items_no - 3) {
 						first++;
 						lcd_clear();
-						lcd_printPGM(_T(MSG_CHOOSE_EXTRUDER));
+						lcd_puts_P(_T(MSG_CHOOSE_EXTRUDER));
 						for (int i = 0; i < 3; i++) {
-							lcd_print_at_PGM(1, i + 1, _T(MSG_EXTRUDER));
+							lcd_puts_at_P(1, i + 1, _T(MSG_EXTRUDER));
 						}
 					}
 				}
@@ -4981,9 +4981,9 @@ char choose_extruder_menu() {
 					if (first > 0) {
 						first--;
 						lcd_clear();
-						lcd_printPGM(_T(MSG_CHOOSE_EXTRUDER));
+						lcd_puts_P(_T(MSG_CHOOSE_EXTRUDER));
 						for (int i = 0; i < 3; i++) {
-							lcd_print_at_PGM(1, i + 1, _T(MSG_EXTRUDER));
+							lcd_puts_at_P(1, i + 1, _T(MSG_EXTRUDER));
 						}
 					}
 				}
@@ -5207,11 +5207,11 @@ void extr_adj(int extruder) //loading filament for SNMM
 	//extr_mov(BOWDEN_LENGTH/2.f, 500);
 	extr_mov(bowden_length[extruder], 500);
 	lcd_clear();
-	lcd.setCursor(0, 0); lcd_printPGM(_T(MSG_LOADING_FILAMENT));
+	lcd.setCursor(0, 0); lcd_puts_P(_T(MSG_LOADING_FILAMENT));
 	if(strlen(_T(MSG_LOADING_FILAMENT))>18) lcd.setCursor(0, 1);
 	else lcd.print(" ");
 	lcd.print(snmm_extruder + 1);
-	lcd.setCursor(0, 2); lcd_printPGM(_T(MSG_PLEASE_WAIT));
+	lcd.setCursor(0, 2); lcd_puts_P(_T(MSG_PLEASE_WAIT));
 	st_synchronize();
 	max_feedrate[E_AXIS] = 50;
 	lcd_update_enable(true);
@@ -5229,10 +5229,10 @@ void extr_unload() { //unloads filament
 		lcd_clear();
 		lcd_display_message_fullscreen_P(PSTR(""));
 		max_feedrate[E_AXIS] = 50;
-		lcd.setCursor(0, 0); lcd_printPGM(_T(MSG_UNLOADING_FILAMENT));
+		lcd.setCursor(0, 0); lcd_puts_P(_T(MSG_UNLOADING_FILAMENT));
 		lcd.print(" ");
 		lcd.print(snmm_extruder + 1);
-		lcd.setCursor(0, 2); lcd_printPGM(_T(MSG_PLEASE_WAIT));
+		lcd.setCursor(0, 2); lcd_puts_P(_T(MSG_PLEASE_WAIT));
 		if (current_position[Z_AXIS] < 15) {
 			current_position[Z_AXIS] += 15; //lifting in Z direction to make space for extrusion
 			plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 25, active_extruder);
@@ -5280,9 +5280,9 @@ void extr_unload() { //unloads filament
 
 		lcd_clear();
 		lcd.setCursor(0, 0);
-		lcd_printPGM(_T(MSG_ERROR));
+		lcd_puts_P(_T(MSG_ERROR));
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_T(MSG_PREHEAT_NOZZLE));
+		lcd_puts_P(_T(MSG_PREHEAT_NOZZLE));
 
 		delay(2000);
 		lcd_clear();
@@ -5349,9 +5349,9 @@ void extr_unload_all() {
 	else {
 		lcd_clear();
 		lcd.setCursor(0, 0);
-		lcd_printPGM(_T(MSG_ERROR));
+		lcd_puts_P(_T(MSG_ERROR));
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_T(MSG_PREHEAT_NOZZLE));
+		lcd_puts_P(_T(MSG_PREHEAT_NOZZLE));
 		delay(2000);
 		lcd_clear();
 		lcd_return_to_status();
@@ -5373,9 +5373,9 @@ void extr_unload_used() {
 	else {
 		lcd_clear();
 		lcd.setCursor(0, 0);
-		lcd_printPGM(_T(MSG_ERROR));
+		lcd_puts_P(_T(MSG_ERROR));
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_T(MSG_PREHEAT_NOZZLE));
+		lcd_puts_P(_T(MSG_PREHEAT_NOZZLE));
 		delay(2000);
 		lcd_clear();
 		lcd_return_to_status();
@@ -5530,7 +5530,7 @@ unsigned char lcd_choose_color() {
 	active_rows = items_no < 3 ? items_no : 3;
 
 	while (1) {
-		lcd_print_at_PGM(0, 0, PSTR("Choose color:"));
+		lcd_puts_at_P(0, 0, PSTR("Choose color:"));
 		for (int i = 0; i < active_rows; i++) {
 			lcd.setCursor(1, i+1);
 			lcd.print(item[first + i]);
@@ -5625,9 +5625,9 @@ void lcd_confirm_print()
 		lcd.setCursor(0, 2); lcd.print("          ");
 		lcd.setCursor(0, 3); lcd.print("          ");
 		lcd.setCursor(2, 2);
-		lcd_printPGM(_T(MSG_YES));
+		lcd_puts_P(_T(MSG_YES));
 		lcd.setCursor(2, 3);
-		lcd_printPGM(_T(MSG_NO));
+		lcd_puts_P(_T(MSG_NO));
 		lcd.setCursor(0, 1 + cursor_pos);
 		lcd.print(">");
 		delay(100);
@@ -6081,11 +6081,11 @@ void lcd_sdcard_stop()
 {
 	
 	lcd.setCursor(0, 0);
-	lcd_printPGM(_T(MSG_STOP_PRINT));
+	lcd_puts_P(_T(MSG_STOP_PRINT));
 	lcd.setCursor(2, 2);
-	lcd_printPGM(_T(MSG_NO));
+	lcd_puts_P(_T(MSG_NO));
 	lcd.setCursor(2, 3);
-	lcd_printPGM(_T(MSG_YES));
+	lcd_puts_P(_T(MSG_YES));
 	lcd.setCursor(0, 2); lcd.print(" ");
 	lcd.setCursor(0, 3); lcd.print(" ");
 
@@ -6175,7 +6175,7 @@ bool lcd_selftest()
 	bool _result = true;
 	lcd_wait_for_cool_down();
 	lcd_clear();
-	lcd.setCursor(0, 0); lcd_printPGM(_i("Self test start  "));////MSG_SELFTEST_START c=20 r=0
+	lcd.setCursor(0, 0); lcd_puts_P(_i("Self test start  "));////MSG_SELFTEST_START c=20 r=0
 	#ifdef TMC2130
 	  FORCE_HIGH_POWER_START;
 	#endif // TMC2130
@@ -6767,95 +6767,95 @@ static void lcd_selftest_error(int _error_no, const char *_error_1, const char *
 	lcd_clear();
 
 	lcd.setCursor(0, 0);
-	lcd_printPGM(_i("Selftest error !"));////MSG_SELFTEST_ERROR c=0 r=0
+	lcd_puts_P(_i("Selftest error !"));////MSG_SELFTEST_ERROR c=0 r=0
 	lcd.setCursor(0, 1);
-	lcd_printPGM(_i("Please check :"));////MSG_SELFTEST_PLEASECHECK c=0 r=0
+	lcd_puts_P(_i("Please check :"));////MSG_SELFTEST_PLEASECHECK c=0 r=0
 
 	switch (_error_no)
 	{
 	case 1:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_i("Heater/Thermistor"));////MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
+		lcd_puts_P(_i("Heater/Thermistor"));////MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_i("Not connected"));////MSG_SELFTEST_NOTCONNECTED c=0 r=0
+		lcd_puts_P(_i("Not connected"));////MSG_SELFTEST_NOTCONNECTED c=0 r=0
 		break;
 	case 2:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_i("Bed / Heater"));////MSG_SELFTEST_BEDHEATER c=0 r=0
+		lcd_puts_P(_i("Bed / Heater"));////MSG_SELFTEST_BEDHEATER c=0 r=0
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_T(MSG_SELFTEST_WIRINGERROR));
+		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		break;
 	case 3:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_i("Endstops"));////MSG_SELFTEST_ENDSTOPS c=0 r=0
+		lcd_puts_P(_i("Endstops"));////MSG_SELFTEST_ENDSTOPS c=0 r=0
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_T(MSG_SELFTEST_WIRINGERROR));
+		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		lcd.setCursor(17, 3);
 		lcd.print(_error_1);
 		break;
 	case 4:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_T(MSG_SELFTEST_MOTOR));
+		lcd_puts_P(_T(MSG_SELFTEST_MOTOR));
 		lcd.setCursor(18, 2);
 		lcd.print(_error_1);
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_i("Endstop"));////MSG_SELFTEST_ENDSTOP c=0 r=0
+		lcd_puts_P(_i("Endstop"));////MSG_SELFTEST_ENDSTOP c=0 r=0
 		lcd.setCursor(18, 3);
 		lcd.print(_error_2);
 		break;
 	case 5:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_i("Endstop not hit"));////MSG_SELFTEST_ENDSTOP_NOTHIT c=20 r=1
+		lcd_puts_P(_i("Endstop not hit"));////MSG_SELFTEST_ENDSTOP_NOTHIT c=20 r=1
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_T(MSG_SELFTEST_MOTOR));
+		lcd_puts_P(_T(MSG_SELFTEST_MOTOR));
 		lcd.setCursor(18, 3);
 		lcd.print(_error_1);
 		break;
 	case 6:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_T(MSG_SELFTEST_COOLING_FAN));
+		lcd_puts_P(_T(MSG_SELFTEST_COOLING_FAN));
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_T(MSG_SELFTEST_WIRINGERROR));
+		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		lcd.setCursor(18, 3);
 		lcd.print(_error_1);
 		break;
 	case 7:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_T(MSG_SELFTEST_EXTRUDER_FAN));
+		lcd_puts_P(_T(MSG_SELFTEST_EXTRUDER_FAN));
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_T(MSG_SELFTEST_WIRINGERROR));
+		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		lcd.setCursor(18, 3);
 		lcd.print(_error_1);
 		break;
 	case 8:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_i("Loose pulley"));////MSG_LOOSE_PULLEY c=20 r=1
+		lcd_puts_P(_i("Loose pulley"));////MSG_LOOSE_PULLEY c=20 r=1
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_T(MSG_SELFTEST_MOTOR));
+		lcd_puts_P(_T(MSG_SELFTEST_MOTOR));
 		lcd.setCursor(18, 3);
 		lcd.print(_error_1);
 		break;
 	case 9:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_i("Axis length"));////MSG_SELFTEST_AXIS_LENGTH c=0 r=0
+		lcd_puts_P(_i("Axis length"));////MSG_SELFTEST_AXIS_LENGTH c=0 r=0
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_i("Axis"));////MSG_SELFTEST_AXIS c=0 r=0
+		lcd_puts_P(_i("Axis"));////MSG_SELFTEST_AXIS c=0 r=0
 		lcd.setCursor(18, 3);
 		lcd.print(_error_1);
 		break;
 	case 10:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_i("Front/left fans"));////MSG_SELFTEST_FANS c=0 r=0
+		lcd_puts_P(_i("Front/left fans"));////MSG_SELFTEST_FANS c=0 r=0
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_i("Swapped"));////MSG_SELFTEST_SWAPPED c=0 r=0
+		lcd_puts_P(_i("Swapped"));////MSG_SELFTEST_SWAPPED c=0 r=0
 		lcd.setCursor(18, 3);
 		lcd.print(_error_1);
 		break;
 	case 11: 
 		lcd.setCursor(0, 2);
-		lcd_printPGM(_i("Filament sensor"));////MSG_FILAMENT_SENSOR c=20 r=0
+		lcd_puts_P(_i("Filament sensor"));////MSG_FILAMENT_SENSOR c=20 r=0
 		lcd.setCursor(0, 3);
-		lcd_printPGM(_T(MSG_SELFTEST_WIRINGERROR));
+		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		break;
 	}
 
@@ -6891,32 +6891,32 @@ static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite)
 	bool _result = check_opposite;
 	lcd_clear();
 
-	lcd.setCursor(0, 0); lcd_printPGM(_T(MSG_SELFTEST_FAN));
+	lcd.setCursor(0, 0); lcd_puts_P(_T(MSG_SELFTEST_FAN));
 	
 	switch (_fan)
 	{
 	case 0:
 		// extruder cooling fan
 		lcd.setCursor(0, 1); 
-		if(check_opposite == true) lcd_printPGM(_T(MSG_SELFTEST_COOLING_FAN)); 
-		else lcd_printPGM(_T(MSG_SELFTEST_EXTRUDER_FAN));
+		if(check_opposite == true) lcd_puts_P(_T(MSG_SELFTEST_COOLING_FAN)); 
+		else lcd_puts_P(_T(MSG_SELFTEST_EXTRUDER_FAN));
 		SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN);
 		WRITE(EXTRUDER_0_AUTO_FAN_PIN, 1);
 		break;
 	case 1:
 		// object cooling fan
 		lcd.setCursor(0, 1);
-		if (check_opposite == true) lcd_printPGM(_T(MSG_SELFTEST_EXTRUDER_FAN));
-		else lcd_printPGM(_T(MSG_SELFTEST_COOLING_FAN));
+		if (check_opposite == true) lcd_puts_P(_T(MSG_SELFTEST_EXTRUDER_FAN));
+		else lcd_puts_P(_T(MSG_SELFTEST_COOLING_FAN));
 		SET_OUTPUT(FAN_PIN);
 		analogWrite(FAN_PIN, 255);
 		break;
 	}
 	delay(500);
 
-	lcd.setCursor(1, 2); lcd_printPGM(_T(MSG_SELFTEST_FAN_YES));
+	lcd.setCursor(1, 2); lcd_puts_P(_T(MSG_SELFTEST_FAN_YES));
 	lcd.setCursor(0, 3); lcd.print(">");
-	lcd.setCursor(1, 3); lcd_printPGM(_T(MSG_SELFTEST_FAN_NO));
+	lcd.setCursor(1, 3); lcd_puts_P(_T(MSG_SELFTEST_FAN_NO));
 
 	int8_t enc_dif = 0;
 	KEEPALIVE_STATE(PAUSED_FOR_USER);
@@ -6942,17 +6942,17 @@ static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite)
 			if (enc_dif > lcd_encoder_diff) {
 				_result = !check_opposite;
 				lcd.setCursor(0, 2); lcd.print(">");
-				lcd.setCursor(1, 2); lcd_printPGM(_T(MSG_SELFTEST_FAN_YES));
+				lcd.setCursor(1, 2); lcd_puts_P(_T(MSG_SELFTEST_FAN_YES));
 				lcd.setCursor(0, 3); lcd.print(" ");
-				lcd.setCursor(1, 3); lcd_printPGM(_T(MSG_SELFTEST_FAN_NO));
+				lcd.setCursor(1, 3); lcd_puts_P(_T(MSG_SELFTEST_FAN_NO));
 			}
 
 			if (enc_dif < lcd_encoder_diff) {
 				_result = check_opposite;
 				lcd.setCursor(0, 2); lcd.print(" ");
-				lcd.setCursor(1, 2); lcd_printPGM(_T(MSG_SELFTEST_FAN_YES));
+				lcd.setCursor(1, 2); lcd_puts_P(_T(MSG_SELFTEST_FAN_YES));
 				lcd.setCursor(0, 3); lcd.print(">");
-				lcd.setCursor(1, 3); lcd_printPGM(_T(MSG_SELFTEST_FAN_NO));
+				lcd.setCursor(1, 3); lcd_puts_P(_T(MSG_SELFTEST_FAN_NO));
 			}
 			enc_dif = 0;
 			lcd_encoder_diff = 0;
@@ -7053,37 +7053,37 @@ static int lcd_selftest_screen(int _step, int _progress, int _progress_scale, bo
 
 	lcd.setCursor(0, 0);
 
-	if (_step == -1) lcd_printPGM(_T(MSG_SELFTEST_FAN));
-	if (_step == 0) lcd_printPGM(_T(MSG_SELFTEST_FAN));
-	if (_step == 1) lcd_printPGM(_T(MSG_SELFTEST_FAN));
-	if (_step == 2) lcd_printPGM(_i("Checking endstops"));////MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
-	if (_step == 3) lcd_printPGM(_i("Checking hotend  "));////MSG_SELFTEST_CHECK_HOTEND c=20 r=0
-	if (_step == 4) lcd_printPGM(_i("Checking X axis  "));////MSG_SELFTEST_CHECK_X c=20 r=0
-	if (_step == 5) lcd_printPGM(_i("Checking Y axis  "));////MSG_SELFTEST_CHECK_Y c=20 r=0
-	if (_step == 6) lcd_printPGM(_i("Checking Z axis  "));////MSG_SELFTEST_CHECK_Z c=20 r=0
-	if (_step == 7) lcd_printPGM(_T(MSG_SELFTEST_CHECK_BED));
-	if (_step == 8) lcd_printPGM(_T(MSG_SELFTEST_CHECK_BED));
-	if (_step == 9) lcd_printPGM(_T(MSG_SELFTEST_CHECK_FSENSOR));
-	if (_step == 10) lcd_printPGM(_T(MSG_SELFTEST_CHECK_FSENSOR));
-	if (_step == 11) lcd_printPGM(_i("All correct      "));////MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
-	if (_step == 12) lcd_printPGM(_T(MSG_SELFTEST_FAILED));
-	if (_step == 13) lcd_printPGM(PSTR("Calibrating home"));
+	if (_step == -1) lcd_puts_P(_T(MSG_SELFTEST_FAN));
+	if (_step == 0) lcd_puts_P(_T(MSG_SELFTEST_FAN));
+	if (_step == 1) lcd_puts_P(_T(MSG_SELFTEST_FAN));
+	if (_step == 2) lcd_puts_P(_i("Checking endstops"));////MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
+	if (_step == 3) lcd_puts_P(_i("Checking hotend  "));////MSG_SELFTEST_CHECK_HOTEND c=20 r=0
+	if (_step == 4) lcd_puts_P(_i("Checking X axis  "));////MSG_SELFTEST_CHECK_X c=20 r=0
+	if (_step == 5) lcd_puts_P(_i("Checking Y axis  "));////MSG_SELFTEST_CHECK_Y c=20 r=0
+	if (_step == 6) lcd_puts_P(_i("Checking Z axis  "));////MSG_SELFTEST_CHECK_Z c=20 r=0
+	if (_step == 7) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED));
+	if (_step == 8) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED));
+	if (_step == 9) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
+	if (_step == 10) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
+	if (_step == 11) lcd_puts_P(_i("All correct      "));////MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
+	if (_step == 12) lcd_puts_P(_T(MSG_SELFTEST_FAILED));
+	if (_step == 13) lcd_puts_P(PSTR("Calibrating home"));
 
 	lcd.setCursor(0, 1);
-	lcd_printPGM(separator);
+	lcd_puts_P(separator);
 	if ((_step >= -1) && (_step <= 1))
 	{
 		//SERIAL_ECHOLNPGM("Fan test");
-		lcd_print_at_PGM(0, 2, _i("Extruder fan:"));////MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18 r=0
+		lcd_puts_at_P(0, 2, _i("Extruder fan:"));////MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18 r=0
 		lcd.setCursor(18, 2);
 		(_step < 0) ? lcd.print(_indicator) : lcd.print("OK");
-		lcd_print_at_PGM(0, 3, _i("Print fan:"));////MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
+		lcd_puts_at_P(0, 3, _i("Print fan:"));////MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
 		lcd.setCursor(18, 3);
 		(_step < 1) ? lcd.print(_indicator) : lcd.print("OK");
 	}
 	else if (_step >= 9 && _step <= 10)
 	{
-		lcd_print_at_PGM(0, 2, _i("Filament sensor:"));////MSG_SELFTEST_FILAMENT_SENSOR c=18 r=0
+		lcd_puts_at_P(0, 2, _i("Filament sensor:"));////MSG_SELFTEST_FILAMENT_SENSOR c=18 r=0
 		lcd.setCursor(18, 2);
 		(_step == 9) ? lcd.print(_indicator) : lcd.print("OK");
 	}

+ 2 - 2
Firmware/util.cpp

@@ -291,10 +291,10 @@ bool show_upgrade_dialog_if_version_newer(const char *version_string)
 
     if (upgrade) {
         lcd_display_message_fullscreen_P(_i("New firmware version available:"));////MSG_NEW_FIRMWARE_AVAILABLE c=20 r=2
-        lcd_print_at_PGM(0, 2, PSTR(""));
+        lcd_puts_at_P(0, 2, PSTR(""));
         for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c)
             lcd_putc(*c);
-        lcd_print_at_PGM(0, 3, _i("Please upgrade."));////MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20 r=0
+        lcd_puts_at_P(0, 3, _i("Please upgrade."));////MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20 r=0
         tone(BEEPER, 1000);
         delay_keep_alive(50);
         noTone(BEEPER);