Browse Source

Merge branch 'MK3' into MK3_Enable_fan_waiting_cooldown

Voinea 6 years ago
parent
commit
d81970dd3d
65 changed files with 3190 additions and 3213 deletions
  1. 5 2
      Firmware/Configuration.h
  2. 23 1
      Firmware/ConfigurationStore.cpp
  3. 1 0
      Firmware/ConfigurationStore.h
  4. 4 4
      Firmware/Dcodes.cpp
  5. 14 2
      Firmware/Marlin.h
  6. 313 182
      Firmware/Marlin_main.cpp
  7. 12 11
      Firmware/cardreader.cpp
  8. 1 0
      Firmware/cardreader.h
  9. 6 6
      Firmware/cmdqueue.cpp
  10. 5 1
      Firmware/config.h
  11. 13 0
      Firmware/eeprom.h
  12. 214 0
      Firmware/first_lay_cal.cpp
  13. 15 0
      Firmware/first_lay_cal.h
  14. 53 14
      Firmware/fsensor.cpp
  15. 1 0
      Firmware/fsensor.h
  16. 4 10
      Firmware/lcd.h
  17. 0 0
      Firmware/le.sh
  18. 70 32
      Firmware/menu.cpp
  19. 30 2
      Firmware/menu.h
  20. 3 3
      Firmware/mesh_bed_calibration.cpp
  21. 83 81
      Firmware/messages.c
  22. 2 0
      Firmware/messages.h
  23. 128 73
      Firmware/mmu.cpp
  24. 3 3
      Firmware/mmu.h
  25. 2 0
      Firmware/optiboot_w25x20cl.cpp
  26. 0 0
      Firmware/pins_Einsy_1_0.h
  27. 2 2
      Firmware/planner.cpp
  28. 1 1
      Firmware/stepper.cpp
  29. 1 1
      Firmware/system_timer.h
  30. 155 35
      Firmware/temperature.cpp
  31. 7 0
      Firmware/temperature.h
  32. 7 0
      Firmware/timer02.c
  33. 8 5
      Firmware/tmc2130.cpp
  34. 772 770
      Firmware/ultralcd.cpp
  35. 44 29
      Firmware/ultralcd.h
  36. 45 2
      Firmware/util.cpp
  37. 25 0
      Firmware/util.h
  38. 5 1
      Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h
  39. 4 1
      Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h
  40. 5 1
      Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h
  41. 5 1
      Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h
  42. 12 1
      Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h
  43. 12 1
      Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h
  44. 3 2
      Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h
  45. 11 2
      Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h
  46. 25 25
      PF-build.sh
  47. 24 0
      README.md
  48. 1 1
      build.sh
  49. 0 0
      lang/config.sh
  50. 6 6
      lang/fw-build.sh
  51. 0 0
      lang/fw-clean.sh
  52. 0 0
      lang/lang-add.sh
  53. 2 0
      lang/lang-build.sh
  54. 75 0
      lang/lang-check.py
  55. 0 0
      lang/lang-check.sh
  56. 0 0
      lang/lang-clean.sh
  57. 0 0
      lang/lang-export.sh
  58. 0 0
      lang/lang-import.sh
  59. 127 235
      lang/lang_en.txt
  60. 132 276
      lang/lang_en_cz.txt
  61. 134 277
      lang/lang_en_de.txt
  62. 134 278
      lang/lang_en_es.txt
  63. 133 277
      lang/lang_en_fr.txt
  64. 134 278
      lang/lang_en_it.txt
  65. 134 278
      lang/lang_en_pl.txt

+ 5 - 2
Firmware/Configuration.h

@@ -7,8 +7,8 @@
 #define STR(x) STR_HELPER(x)
 #define STR(x) STR_HELPER(x)
 
 
 // Firmware version
 // Firmware version
-#define FW_VERSION "3.7.0"
-#define FW_COMMIT_NR   2201
+#define FW_VERSION "3.7.2-RC1"
+#define FW_COMMIT_NR   2359
 // FW_VERSION_UNKNOWN means this is an unofficial build.
 // FW_VERSION_UNKNOWN means this is an unofficial build.
 // The firmware should only be checked into github with this symbol.
 // The firmware should only be checked into github with this symbol.
 #define FW_DEV_VERSION FW_VERSION_UNKNOWN
 #define FW_DEV_VERSION FW_VERSION_UNKNOWN
@@ -480,6 +480,9 @@ your extruder heater takes 2 minutes to hit the target on heating.
 #define FAN_SOFT_PWM
 #define FAN_SOFT_PWM
 #define FAN_SOFT_PWM_BITS 4 //PWM bit resolution = 4bits, freq = 62.5Hz
 #define FAN_SOFT_PWM_BITS 4 //PWM bit resolution = 4bits, freq = 62.5Hz
 
 
+// Bed soft pwm
+#define HEATER_BED_SOFT_PWM_BITS 5 //PWM bit resolution = 5bits, freq = 31.25Hz
+
 // Incrementing this by 1 will double the software PWM frequency,
 // Incrementing this by 1 will double the software PWM frequency,
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
 // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
 // However, control resolution will be halved for each increment;
 // However, control resolution will be halved for each increment;

+ 23 - 1
Firmware/ConfigurationStore.cpp

@@ -11,6 +11,11 @@
 #include "mesh_bed_leveling.h"
 #include "mesh_bed_leveling.h"
 #endif
 #endif
 
 
+#ifdef TMC2130
+#include "tmc2130.h"
+#endif
+
+
 M500_conf cs;
 M500_conf cs;
 
 
 //! @brief Write data to EEPROM
 //! @brief Write data to EEPROM
@@ -86,6 +91,7 @@ void Config_PrintSettings(uint8_t level)
 #ifdef TMC2130
 #ifdef TMC2130
 	printf_P(PSTR(
 	printf_P(PSTR(
 		"%SSteps per unit:\n%S  M92 X%.2f Y%.2f Z%.2f E%.2f\n"
 		"%SSteps per unit:\n%S  M92 X%.2f Y%.2f Z%.2f E%.2f\n"
+        "%SUStep resolution: \n%S M350 X%d Y%d Z%d E%d\n"
 		"%SMaximum feedrates - normal (mm/s):\n%S  M203 X%.2f Y%.2f Z%.2f E%.2f\n"
 		"%SMaximum feedrates - normal (mm/s):\n%S  M203 X%.2f Y%.2f Z%.2f E%.2f\n"
 		"%SMaximum feedrates - stealth (mm/s):\n%S  M203 X%.2f Y%.2f Z%.2f E%.2f\n"
 		"%SMaximum feedrates - stealth (mm/s):\n%S  M203 X%.2f Y%.2f Z%.2f E%.2f\n"
 		"%SMaximum acceleration - normal (mm/s2):\n%S  M201 X%lu Y%lu Z%lu E%lu\n"
 		"%SMaximum acceleration - normal (mm/s2):\n%S  M201 X%lu Y%lu Z%lu E%lu\n"
@@ -95,6 +101,7 @@ void Config_PrintSettings(uint8_t level)
 		"%SHome offset (mm):\n%S  M206 X%.2f Y%.2f Z%.2f\n"
 		"%SHome offset (mm):\n%S  M206 X%.2f Y%.2f Z%.2f\n"
 		),
 		),
 		echomagic, echomagic, cs.axis_steps_per_unit[X_AXIS], cs.axis_steps_per_unit[Y_AXIS], cs.axis_steps_per_unit[Z_AXIS], cs.axis_steps_per_unit[E_AXIS],
 		echomagic, echomagic, cs.axis_steps_per_unit[X_AXIS], cs.axis_steps_per_unit[Y_AXIS], cs.axis_steps_per_unit[Z_AXIS], cs.axis_steps_per_unit[E_AXIS],
+		echomagic, echomagic, cs.axis_ustep_resolution[X_AXIS], cs.axis_ustep_resolution[Y_AXIS], cs.axis_ustep_resolution[Z_AXIS], cs.axis_ustep_resolution[E_AXIS],
 		echomagic, echomagic, cs.max_feedrate_normal[X_AXIS], cs.max_feedrate_normal[Y_AXIS], cs.max_feedrate_normal[Z_AXIS], cs.max_feedrate_normal[E_AXIS],
 		echomagic, echomagic, cs.max_feedrate_normal[X_AXIS], cs.max_feedrate_normal[Y_AXIS], cs.max_feedrate_normal[Z_AXIS], cs.max_feedrate_normal[E_AXIS],
 		echomagic, echomagic, cs.max_feedrate_silent[X_AXIS], cs.max_feedrate_silent[Y_AXIS], cs.max_feedrate_silent[Z_AXIS], cs.max_feedrate_silent[E_AXIS],
 		echomagic, echomagic, cs.max_feedrate_silent[X_AXIS], cs.max_feedrate_silent[Y_AXIS], cs.max_feedrate_silent[Z_AXIS], cs.max_feedrate_silent[E_AXIS],
 		echomagic, echomagic, cs.max_acceleration_units_per_sq_second_normal[X_AXIS], cs.max_acceleration_units_per_sq_second_normal[Y_AXIS], cs.max_acceleration_units_per_sq_second_normal[Z_AXIS], cs.max_acceleration_units_per_sq_second_normal[E_AXIS],
 		echomagic, echomagic, cs.max_acceleration_units_per_sq_second_normal[X_AXIS], cs.max_acceleration_units_per_sq_second_normal[Y_AXIS], cs.max_acceleration_units_per_sq_second_normal[Z_AXIS], cs.max_acceleration_units_per_sq_second_normal[E_AXIS],
@@ -177,7 +184,7 @@ static_assert (false, "zprobe_zoffset was not initialized in printers in field t
         "0.0, if this is not acceptable, increment EEPROM_VERSION to force use default_conf");
         "0.0, if this is not acceptable, increment EEPROM_VERSION to force use default_conf");
 #endif
 #endif
 
 
-static_assert (sizeof(M500_conf) == 188, "sizeof(M500_conf) has changed, ensure that EEPROM_VERSION has been incremented, "
+static_assert (sizeof(M500_conf) == 192, "sizeof(M500_conf) has changed, ensure that EEPROM_VERSION has been incremented, "
         "or if you added members in the end of struct, ensure that historically uninitialized values will be initialized."
         "or if you added members in the end of struct, ensure that historically uninitialized values will be initialized."
         "If this is caused by change to more then 8bit processor, decide whether make this struct packed to save EEPROM,"
         "If this is caused by change to more then 8bit processor, decide whether make this struct packed to save EEPROM,"
         "leave as it is to keep fast code, or reorder struct members to pack more tightly.");
         "leave as it is to keep fast code, or reorder struct members to pack more tightly.");
@@ -220,6 +227,11 @@ static const M500_conf default_conf PROGMEM =
     },
     },
     DEFAULT_MAX_FEEDRATE_SILENT,
     DEFAULT_MAX_FEEDRATE_SILENT,
     DEFAULT_MAX_ACCELERATION_SILENT,
     DEFAULT_MAX_ACCELERATION_SILENT,
+#ifdef TMC2130
+    { TMC2130_USTEPS_XY, TMC2130_USTEPS_XY, TMC2130_USTEPS_Z, TMC2130_USTEPS_E },
+#else // TMC2130
+    {16,16,16,16},
+#endif
 };
 };
 
 
 //! @brief Read M500 configuration
 //! @brief Read M500 configuration
@@ -269,6 +281,16 @@ bool Config_RetrieveSettings()
 			if (cs.max_acceleration_units_per_sq_second_silent[j] > SILENT_MAX_ACCEL_XY)
 			if (cs.max_acceleration_units_per_sq_second_silent[j] > SILENT_MAX_ACCEL_XY)
 				cs.max_acceleration_units_per_sq_second_silent[j] = SILENT_MAX_ACCEL_XY;
 				cs.max_acceleration_units_per_sq_second_silent[j] = SILENT_MAX_ACCEL_XY;
 		}
 		}
+        
+		if(cs.axis_ustep_resolution[X_AXIS] == 0xff){ cs.axis_ustep_resolution[X_AXIS] = TMC2130_USTEPS_XY; }
+		if(cs.axis_ustep_resolution[Y_AXIS] == 0xff){ cs.axis_ustep_resolution[Y_AXIS] = TMC2130_USTEPS_XY; }
+		if(cs.axis_ustep_resolution[Z_AXIS] == 0xff){ cs.axis_ustep_resolution[Z_AXIS] = TMC2130_USTEPS_Z; }
+		if(cs.axis_ustep_resolution[E_AXIS] == 0xff){ cs.axis_ustep_resolution[E_AXIS] = TMC2130_USTEPS_E; }
+
+		tmc2130_set_res(X_AXIS, cs.axis_ustep_resolution[X_AXIS]);
+		tmc2130_set_res(Y_AXIS, cs.axis_ustep_resolution[Y_AXIS]);
+		tmc2130_set_res(Z_AXIS, cs.axis_ustep_resolution[Z_AXIS]);
+		tmc2130_set_res(E_AXIS, cs.axis_ustep_resolution[E_AXIS]);
 #endif //TMC2130
 #endif //TMC2130
 
 
 		reset_acceleration_rates();
 		reset_acceleration_rates();

+ 1 - 0
Firmware/ConfigurationStore.h

@@ -37,6 +37,7 @@ typedef struct
     float filament_size[1]; //!< cross-sectional area of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder.
     float filament_size[1]; //!< cross-sectional area of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder.
     float max_feedrate_silent[4]; //!< max speeds for silent mode
     float max_feedrate_silent[4]; //!< max speeds for silent mode
     unsigned long max_acceleration_units_per_sq_second_silent[4];
     unsigned long max_acceleration_units_per_sq_second_silent[4];
+    unsigned char axis_ustep_resolution[4];
 } M500_conf;
 } M500_conf;
 
 
 extern M500_conf cs;
 extern M500_conf cs;

+ 4 - 4
Firmware/Dcodes.cpp

@@ -176,15 +176,15 @@ extern float axis_steps_per_unit[NUM_AXIS];
 #endif //0
 #endif //0
 #define LOG(args...)
 #define LOG(args...)
 
 
-#ifdef DEBUG_DCODES
-
 void dcode__1()
 void dcode__1()
 {
 {
-	printf("D-1 - Endless loop\n");
-	cli();
+	printf_P(PSTR("D-1 - Endless loop\n"));
+//	cli();
 	while (1);
 	while (1);
 }
 }
 
 
+#ifdef DEBUG_DCODES
+
 void dcode_0()
 void dcode_0()
 {
 {
 	if (*(strchr_pointer + 1) == 0) return;
 	if (*(strchr_pointer + 1) == 0) return;

+ 14 - 2
Firmware/Marlin.h

@@ -214,6 +214,9 @@ void manage_inactivity(bool ignore_stepper_queue=false);
 #endif
 #endif
 
 
 
 
+#define FARM_FILAMENT_COLOR_NONE 99;
+
+
 enum AxisEnum {X_AXIS=0, Y_AXIS=1, Z_AXIS=2, E_AXIS=3, X_HEAD=4, Y_HEAD=5};
 enum AxisEnum {X_AXIS=0, Y_AXIS=1, Z_AXIS=2, E_AXIS=3, X_HEAD=4, Y_HEAD=5};
 #define X_AXIS_MASK  1
 #define X_AXIS_MASK  1
 #define Y_AXIS_MASK  2
 #define Y_AXIS_MASK  2
@@ -389,7 +392,14 @@ extern bool wizard_active; //autoload temporarily disabled during wizard
 extern LongTimer safetyTimer;
 extern LongTimer safetyTimer;
 
 
 #define PRINT_PERCENT_DONE_INIT   0xff
 #define PRINT_PERCENT_DONE_INIT   0xff
-#define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == CUSTOM_MSG_TYPE_TEMCAL) || saved_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL) || card.paused || mmu_print_saved)
+#define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == CustomMsg::TempCal) || saved_printing || (lcd_commands_type == LcdCommands::Layer1Cal) || card.paused || mmu_print_saved)
+//! Beware - mcode_in_progress is set as soon as the command gets really processed,
+//! which is not the same as posting the M600 command into the command queue
+//! There can be a considerable lag between posting M600 and its real processing which might result
+//! in posting multiple M600's into the command queue
+//! Instead, the fsensor uses another state variable :( , which is set to true, when the M600 command is enqued
+//! and is reset to false when the fsensor returns into its filament runout finished handler
+//! I'd normally change this macro, but who knows what would happen in the MMU :)
 #define CHECK_FSENSOR ((IS_SD_PRINTING || is_usb_printing) && (mcode_in_progress != 600) && !saved_printing && e_active())
 #define CHECK_FSENSOR ((IS_SD_PRINTING || is_usb_printing) && (mcode_in_progress != 600) && !saved_printing && e_active())
 
 
 extern void calculate_extruder_multipliers();
 extern void calculate_extruder_multipliers();
@@ -469,7 +479,7 @@ extern uint8_t calc_percent_done();
 #define KEEPALIVE_STATE(n) do { busy_state = n;} while (0)
 #define KEEPALIVE_STATE(n) do { busy_state = n;} while (0)
 extern void host_keepalive();
 extern void host_keepalive();
 //extern MarlinBusyState busy_state;
 //extern MarlinBusyState busy_state;
-extern int busy_state;
+extern int8_t busy_state;
 
 
 
 
 #ifdef TMC2130
 #ifdef TMC2130
@@ -497,3 +507,5 @@ void M600_load_filament_movements();
 void M600_wait_for_user(float HotendTempBckp);
 void M600_wait_for_user(float HotendTempBckp);
 void M600_check_state(float nozzle_temp);
 void M600_check_state(float nozzle_temp);
 void load_filament_final_feed();
 void load_filament_final_feed();
+void marlin_wait_for_click();
+void marlin_rise_z(void);

+ 313 - 182
Firmware/Marlin_main.cpp

@@ -156,7 +156,6 @@
 //=============================imported variables============================
 //=============================imported variables============================
 //===========================================================================
 //===========================================================================
 
 
-
 //===========================================================================
 //===========================================================================
 //=============================public variables=============================
 //=============================public variables=============================
 //===========================================================================
 //===========================================================================
@@ -215,8 +214,6 @@ static LongTimer crashDetTimer;
 bool mesh_bed_leveling_flag = false;
 bool mesh_bed_leveling_flag = false;
 bool mesh_bed_run_from_menu = false;
 bool mesh_bed_run_from_menu = false;
 
 
-int8_t FarmMode = 0;
-
 bool prusa_sd_card_upload = false;
 bool prusa_sd_card_upload = false;
 
 
 unsigned int status_number = 0;
 unsigned int status_number = 0;
@@ -303,7 +300,7 @@ int fanSpeed=0;
 
 
 bool cancel_heatup = false ;
 bool cancel_heatup = false ;
 
 
-int busy_state = NOT_BUSY;
+int8_t busy_state = NOT_BUSY;
 static long prev_busy_signal_ms = -1;
 static long prev_busy_signal_ms = -1;
 uint8_t host_keepalive_interval = HOST_KEEPALIVE_INTERVAL;
 uint8_t host_keepalive_interval = HOST_KEEPALIVE_INTERVAL;
 
 
@@ -865,6 +862,27 @@ void show_fw_version_warnings() {
 	lcd_update_enable(true);
 	lcd_update_enable(true);
 }
 }
 
 
+//! @brief try to check if firmware is on right type of printer
+static void check_if_fw_is_on_right_printer(){
+#ifdef FILAMENT_SENSOR
+  if((PRINTER_TYPE == PRINTER_MK3) || (PRINTER_TYPE == PRINTER_MK3S)){
+    #ifdef IR_SENSOR
+    swi2c_init();
+    const uint8_t pat9125_detected = swi2c_readByte_A8(PAT9125_I2C_ADDR,0x00,NULL);
+      if (pat9125_detected){
+        lcd_show_fullscreen_message_and_wait_P(_i("MK3S firmware detected on MK3 printer"));}
+    #endif //IR_SENSOR
+
+    #ifdef PAT9125
+      //will return 1 only if IR can detect filament in bondtech extruder so this may fail even when we have IR sensor
+      const uint8_t ir_detected = !(PIN_GET(IR_SENSOR_PIN));
+      if (ir_detected){
+        lcd_show_fullscreen_message_and_wait_P(_i("MK3 firmware detected on MK3S printer"));}
+    #endif //PAT9125
+  }
+#endif //FILAMENT_SENSOR
+}
+
 uint8_t check_printer_version()
 uint8_t check_printer_version()
 {
 {
 	uint8_t version_changed = 0;
 	uint8_t version_changed = 0;
@@ -977,13 +995,19 @@ void list_sec_lang_from_external_flash()
 #endif //(LANG_MODE != 0)
 #endif //(LANG_MODE != 0)
 
 
 
 
+static void w25x20cl_err_msg()
+{
+    lcd_puts_P(_n(ESC_2J ESC_H(0,0) "External SPI flash" ESC_H(0,1) "W25X20CL is not res-"
+            ESC_H(0,2) "ponding. Language" ESC_H(0,3) "switch unavailable."));
+}
+
 // "Setup" function is called by the Arduino framework on startup.
 // "Setup" function is called by the Arduino framework on startup.
 // Before startup, the Timers-functions (PWM)/Analog RW and HardwareSerial provided by the Arduino-code 
 // Before startup, the Timers-functions (PWM)/Analog RW and HardwareSerial provided by the Arduino-code 
 // are initialized by the main() routine provided by the Arduino framework.
 // are initialized by the main() routine provided by the Arduino framework.
 void setup()
 void setup()
 {
 {
 	mmu_init();
 	mmu_init();
-	
+
 	ultralcd_init();
 	ultralcd_init();
 
 
 #if (LCD_BL_PIN != -1) && defined (LCD_BL_PIN)
 #if (LCD_BL_PIN != -1) && defined (LCD_BL_PIN)
@@ -993,21 +1017,25 @@ void setup()
 	spi_init();
 	spi_init();
 
 
 	lcd_splash();
 	lcd_splash();
-     Sound_Init();                                // also guarantee "SET_OUTPUT(BEEPER)"
+    Sound_Init();                                // also guarantee "SET_OUTPUT(BEEPER)"
 
 
 #ifdef W25X20CL
 #ifdef W25X20CL
-	if (!w25x20cl_init())
-		kill(_i("External SPI flash W25X20CL not responding."));
-	// Enter an STK500 compatible Optiboot boot loader waiting for flashing the languages to an external flash memory.
-	optiboot_w25x20cl_enter();
-#endif
-
+    bool w25x20cl_success = w25x20cl_init();
+	if (w25x20cl_success)
+	{
+	    optiboot_w25x20cl_enter();
 #if (LANG_MODE != 0) //secondary language support
 #if (LANG_MODE != 0) //secondary language support
-#ifdef W25X20CL
-	if (w25x20cl_init())
-		update_sec_lang_from_external_flash();
-#endif //W25X20CL
+        update_sec_lang_from_external_flash();
 #endif //(LANG_MODE != 0)
 #endif //(LANG_MODE != 0)
+	}
+	else
+	{
+	    w25x20cl_err_msg();
+	}
+#else
+	const bool w25x20cl_success = true;
+#endif //W25X20CL
+
 
 
 	setup_killpin();
 	setup_killpin();
 	setup_powerhold();
 	setup_powerhold();
@@ -1035,6 +1063,9 @@ void setup()
 		//disabled filament autoload (PFW360)
 		//disabled filament autoload (PFW360)
 		fsensor_autoload_set(false);
 		fsensor_autoload_set(false);
 #endif //FILAMENT_SENSOR
 #endif //FILAMENT_SENSOR
+          // ~ FanCheck -> on
+          if(!(eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED)))
+               eeprom_update_byte((unsigned char *)EEPROM_FAN_CHECK_ENABLED,true);
 	}
 	}
 	MYSERIAL.begin(BAUDRATE);
 	MYSERIAL.begin(BAUDRATE);
 	fdev_setup_stream(uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE); //setup uart out stream
 	fdev_setup_stream(uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE); //setup uart out stream
@@ -1184,9 +1215,9 @@ void setup()
 #ifdef STRING_VERSION_CONFIG_H
 #ifdef STRING_VERSION_CONFIG_H
 #ifdef STRING_CONFIG_H_AUTHOR
 #ifdef STRING_CONFIG_H_AUTHOR
 	SERIAL_ECHO_START;
 	SERIAL_ECHO_START;
-	SERIAL_ECHORPGM(_n(" Last Updated: "));////MSG_CONFIGURATION_VER c=0 r=0
+	SERIAL_ECHORPGM(_n(" Last Updated: "));////MSG_CONFIGURATION_VER
 	SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H);
 	SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H);
-	SERIAL_ECHORPGM(_n(" | Author: "));////MSG_AUTHOR c=0 r=0
+	SERIAL_ECHORPGM(_n(" | Author: "));////MSG_AUTHOR
 	SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR);
 	SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR);
 	SERIAL_ECHOPGM("Compiled: ");
 	SERIAL_ECHOPGM("Compiled: ");
 	SERIAL_ECHOLNPGM(__DATE__);
 	SERIAL_ECHOLNPGM(__DATE__);
@@ -1194,9 +1225,9 @@ void setup()
 #endif
 #endif
 
 
 	SERIAL_ECHO_START;
 	SERIAL_ECHO_START;
-	SERIAL_ECHORPGM(_n(" Free Memory: "));////MSG_FREE_MEMORY c=0 r=0
+	SERIAL_ECHORPGM(_n(" Free Memory: "));////MSG_FREE_MEMORY
 	SERIAL_ECHO(freeMemory());
 	SERIAL_ECHO(freeMemory());
-	SERIAL_ECHORPGM(_n("  PlannerBufferBytes: "));////MSG_PLANNER_BUFFER_BYTES c=0 r=0
+	SERIAL_ECHORPGM(_n("  PlannerBufferBytes: "));////MSG_PLANNER_BUFFER_BYTES
 	SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE);
 	SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE);
 	//lcd_update_enable(false); // why do we need this?? - andre
 	//lcd_update_enable(false); // why do we need this?? - andre
 	// loads data from EEPROM if available else uses defaults (and resets step acceleration rate)
 	// loads data from EEPROM if available else uses defaults (and resets step acceleration rate)
@@ -1213,12 +1244,17 @@ void setup()
 
 
 	tp_init();    // Initialize temperature loop
 	tp_init();    // Initialize temperature loop
 
 
-	lcd_splash(); // we need to do this again, because tp_init() kills lcd
+	if (w25x20cl_success) lcd_splash(); // we need to do this again, because tp_init() kills lcd
+	else
+	{
+	    w25x20cl_err_msg();
+	    printf_P(_n("W25X20CL not responding.\n"));
+	}
 
 
 	plan_init();  // Initialize planner;
 	plan_init();  // Initialize planner;
 
 
 	factory_reset();
 	factory_reset();
-     lcd_encoder_diff=0;
+    lcd_encoder_diff=0;
 
 
 #ifdef TMC2130
 #ifdef TMC2130
 	uint8_t silentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT);
 	uint8_t silentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT);
@@ -1250,18 +1286,10 @@ void setup()
 #endif //TMC2130_LINEARITY_CORRECTION
 #endif //TMC2130_LINEARITY_CORRECTION
 
 
 #ifdef TMC2130_VARIABLE_RESOLUTION
 #ifdef TMC2130_VARIABLE_RESOLUTION
-	tmc2130_mres[X_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_X_MRES);
-	tmc2130_mres[Y_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_Y_MRES);
-	tmc2130_mres[Z_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_Z_MRES);
-	tmc2130_mres[E_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_E_MRES);
-	if (tmc2130_mres[X_AXIS] == 0xff) tmc2130_mres[X_AXIS] = tmc2130_usteps2mres(TMC2130_USTEPS_XY);
-	if (tmc2130_mres[Y_AXIS] == 0xff) tmc2130_mres[Y_AXIS] = tmc2130_usteps2mres(TMC2130_USTEPS_XY);
-	if (tmc2130_mres[Z_AXIS] == 0xff) tmc2130_mres[Z_AXIS] = tmc2130_usteps2mres(TMC2130_USTEPS_Z);
-	if (tmc2130_mres[E_AXIS] == 0xff) tmc2130_mres[E_AXIS] = tmc2130_usteps2mres(TMC2130_USTEPS_E);
-	eeprom_update_byte((uint8_t*)EEPROM_TMC2130_X_MRES, tmc2130_mres[X_AXIS]);
-	eeprom_update_byte((uint8_t*)EEPROM_TMC2130_Y_MRES, tmc2130_mres[Y_AXIS]);
-	eeprom_update_byte((uint8_t*)EEPROM_TMC2130_Z_MRES, tmc2130_mres[Z_AXIS]);
-	eeprom_update_byte((uint8_t*)EEPROM_TMC2130_E_MRES, tmc2130_mres[E_AXIS]);
+	tmc2130_mres[X_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[X_AXIS]);
+	tmc2130_mres[Y_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[Y_AXIS]);
+	tmc2130_mres[Z_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[Z_AXIS]);
+	tmc2130_mres[E_AXIS] = tmc2130_usteps2mres(cs.axis_ustep_resolution[E_AXIS]);
 #else //TMC2130_VARIABLE_RESOLUTION
 #else //TMC2130_VARIABLE_RESOLUTION
 	tmc2130_mres[X_AXIS] = tmc2130_usteps2mres(TMC2130_USTEPS_XY);
 	tmc2130_mres[X_AXIS] = tmc2130_usteps2mres(TMC2130_USTEPS_XY);
 	tmc2130_mres[Y_AXIS] = tmc2130_usteps2mres(TMC2130_USTEPS_XY);
 	tmc2130_mres[Y_AXIS] = tmc2130_usteps2mres(TMC2130_USTEPS_XY);
@@ -1271,8 +1299,11 @@ void setup()
 
 
 #endif //TMC2130
 #endif //TMC2130
 
 
-
 	st_init();    // Initialize stepper, this enables interrupts!
 	st_init();    // Initialize stepper, this enables interrupts!
+  
+#ifdef UVLO_SUPPORT
+    setup_uvlo_interrupt();
+#endif //UVLO_SUPPORT
 
 
 #ifdef TMC2130
 #ifdef TMC2130
 	tmc2130_mode = silentMode?TMC2130_MODE_SILENT:TMC2130_MODE_NORMAL;
 	tmc2130_mode = silentMode?TMC2130_MODE_SILENT:TMC2130_MODE_NORMAL;
@@ -1475,10 +1506,6 @@ void setup()
 	}
 	}
 	check_babystep(); //checking if Z babystep is in allowed range
 	check_babystep(); //checking if Z babystep is in allowed range
 
 
-#ifdef UVLO_SUPPORT
-	setup_uvlo_interrupt();
-#endif //UVLO_SUPPORT
-
 #if !defined(DEBUG_DISABLE_FANCHECK) && defined(FANCHECK) && defined(TACH_1) && TACH_1 >-1
 #if !defined(DEBUG_DISABLE_FANCHECK) && defined(FANCHECK) && defined(TACH_1) && TACH_1 >-1
 	setup_fan_interrupt();
 	setup_fan_interrupt();
 #endif //DEBUG_DISABLE_FANCHECK
 #endif //DEBUG_DISABLE_FANCHECK
@@ -1491,6 +1518,7 @@ void setup()
 #ifndef DEBUG_DISABLE_STARTMSGS
 #ifndef DEBUG_DISABLE_STARTMSGS
   KEEPALIVE_STATE(PAUSED_FOR_USER);
   KEEPALIVE_STATE(PAUSED_FOR_USER);
 
 
+  check_if_fw_is_on_right_printer();
   show_fw_version_warnings();
   show_fw_version_warnings();
 
 
   switch (hw_changed) { 
   switch (hw_changed) { 
@@ -1617,6 +1645,7 @@ void setup()
 	   
 	   
   }
   }
 #endif //UVLO_SUPPORT
 #endif //UVLO_SUPPORT
+  fCheckModeInit();
   KEEPALIVE_STATE(NOT_BUSY);
   KEEPALIVE_STATE(NOT_BUSY);
 #ifdef WATCHDOG
 #ifdef WATCHDOG
   wdt_enable(WDTO_4S);
   wdt_enable(WDTO_4S);
@@ -2962,7 +2991,7 @@ void gcode_M114()
 	SERIAL_PROTOCOLPGM(" E:");
 	SERIAL_PROTOCOLPGM(" E:");
 	SERIAL_PROTOCOL(current_position[E_AXIS]);
 	SERIAL_PROTOCOL(current_position[E_AXIS]);
 
 
-	SERIAL_PROTOCOLRPGM(_n(" Count X: "));////MSG_COUNT_X c=0 r=0
+	SERIAL_PROTOCOLRPGM(_n(" Count X: "));////MSG_COUNT_X
 	SERIAL_PROTOCOL(float(st_get_position(X_AXIS)) / cs.axis_steps_per_unit[X_AXIS]);
 	SERIAL_PROTOCOL(float(st_get_position(X_AXIS)) / cs.axis_steps_per_unit[X_AXIS]);
 	SERIAL_PROTOCOLPGM(" Y:");
 	SERIAL_PROTOCOLPGM(" Y:");
 	SERIAL_PROTOCOL(float(st_get_position(Y_AXIS)) / cs.axis_steps_per_unit[Y_AXIS]);
 	SERIAL_PROTOCOL(float(st_get_position(Y_AXIS)) / cs.axis_steps_per_unit[Y_AXIS]);
@@ -2974,6 +3003,32 @@ void gcode_M114()
 	SERIAL_PROTOCOLLN("");
 	SERIAL_PROTOCOLLN("");
 }
 }
 
 
+//! extracted code to compute z_shift for M600 in case of filament change operation 
+//! requested from fsensors.
+//! The function ensures, that the printhead lifts to at least 25mm above the heat bed
+//! unlike the previous implementation, which was adding 25mm even when the head was
+//! printing at e.g. 24mm height.
+//! A safety margin of FILAMENTCHANGE_ZADD is added in all cases to avoid touching
+//! the printout.
+//! This function is templated to enable fast change of computation data type.
+//! @return new z_shift value
+template<typename T>
+static T gcode_M600_filament_change_z_shift()
+{
+#ifdef FILAMENTCHANGE_ZADD
+	static_assert(Z_MAX_POS < (255 - FILAMENTCHANGE_ZADD), "Z-range too high, change the T type from uint8_t to uint16_t");
+	// avoid floating point arithmetics when not necessary - results in shorter code
+	T ztmp = T( current_position[Z_AXIS] );
+	T z_shift = 0;
+	if(ztmp < T(25)){
+		z_shift = T(25) - ztmp; // make sure to be at least 25mm above the heat bed
+	} 
+	return z_shift + T(FILAMENTCHANGE_ZADD); // always move above printout
+#else
+	return T(0);
+#endif
+}	
+
 static void gcode_M600(bool automatic, float x_position, float y_position, float z_shift, float e_shift, float /*e_shift_late*/)
 static void gcode_M600(bool automatic, float x_position, float y_position, float z_shift, float e_shift, float /*e_shift_late*/)
 {
 {
     st_synchronize();
     st_synchronize();
@@ -3104,11 +3159,17 @@ static void gcode_M600(bool automatic, float x_position, float y_position, float
 #endif //IR_SENSOR
 #endif //IR_SENSOR
 
 
     lcd_setstatuspgm(_T(WELCOME_MSG));
     lcd_setstatuspgm(_T(WELCOME_MSG));
-    custom_message_type = CUSTOM_MSG_TYPE_STATUS;
+    custom_message_type = CustomMsg::Status;
 }
 }
 
 
-
-
+//! @brief Rise Z if too low to avoid blob/jam before filament loading
+//!
+//! It doesn't plan_buffer_line(), as it expects plan_buffer_line() to be called after
+//! during extruding (loading) filament.
+void marlin_rise_z(void)
+{
+    if (current_position[Z_AXIS] < 20) current_position[Z_AXIS] += 30;
+}
 
 
 void gcode_M701()
 void gcode_M701()
 {
 {
@@ -3122,7 +3183,7 @@ void gcode_M701()
 	else
 	else
 	{
 	{
 		enable_z();
 		enable_z();
-		custom_message_type = CUSTOM_MSG_TYPE_F_LOAD;
+		custom_message_type = CustomMsg::FilamentLoading;
 
 
 #ifdef FSENSOR_QUALITY
 #ifdef FSENSOR_QUALITY
 		fsensor_oq_meassure_start(40);
 		fsensor_oq_meassure_start(40);
@@ -3133,7 +3194,7 @@ void gcode_M701()
 		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence
 		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence
 		st_synchronize();
 		st_synchronize();
 
 
-		if (current_position[Z_AXIS] < 20) current_position[Z_AXIS] += 30;
+		marlin_rise_z();
 		current_position[E_AXIS] += 30;
 		current_position[E_AXIS] += 30;
 		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence
 		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence
 		
 		
@@ -3152,7 +3213,7 @@ void gcode_M701()
 		lcd_setstatuspgm(_T(WELCOME_MSG));
 		lcd_setstatuspgm(_T(WELCOME_MSG));
 		disable_z();
 		disable_z();
 		loading_flag = false;
 		loading_flag = false;
-		custom_message_type = CUSTOM_MSG_TYPE_STATUS;
+		custom_message_type = CustomMsg::Status;
 
 
 #ifdef FSENSOR_QUALITY
 #ifdef FSENSOR_QUALITY
         fsensor_oq_meassure_stop();
         fsensor_oq_meassure_stop();
@@ -3355,6 +3416,16 @@ extern uint8_t st_backlash_y;
 //!@n M999 - Restart after being stopped by error
 //!@n M999 - Restart after being stopped by error
 void process_commands()
 void process_commands()
 {
 {
+  #ifdef FANCHECK
+  if (fan_check_error){
+	if( fan_check_error == EFCE_DETECTED ){
+		fan_check_error = EFCE_REPORTED;
+		lcd_pause_print();
+	} // otherwise it has already been reported, so just ignore further processing
+    return;
+  }
+  #endif
+
 	if (!buflen) return; //empty command
 	if (!buflen) return; //empty command
   #ifdef FILAMENT_RUNOUT_SUPPORT
   #ifdef FILAMENT_RUNOUT_SUPPORT
     SET_INPUT(FR_SENS);
     SET_INPUT(FR_SENS);
@@ -3523,7 +3594,7 @@ void process_commands()
 		else if (code_seen("RESET")) { //! PRUSA RESET
 		else if (code_seen("RESET")) { //! PRUSA RESET
             // careful!
             // careful!
             if (farm_mode) {
             if (farm_mode) {
-#ifdef WATCHDOG
+#if (defined(WATCHDOG) && (MOTHERBOARD == BOARD_EINSY_1_0a))
                 boot_app_magic = BOOT_APP_MAGIC;
                 boot_app_magic = BOOT_APP_MAGIC;
                 boot_app_flags = BOOT_APP_FLG_RUN;
                 boot_app_flags = BOOT_APP_FLG_RUN;
 				wdt_enable(WDTO_15MS);
 				wdt_enable(WDTO_15MS);
@@ -3580,7 +3651,39 @@ void process_commands()
     } else if(code_seen("FR")) { //! PRUSA FR
     } else if(code_seen("FR")) { //! PRUSA FR
         // Factory full reset
         // Factory full reset
         factory_reset(0);
         factory_reset(0);
-    }
+
+//-//
+/*
+    } else if(code_seen("qqq")) {
+MYSERIAL.println("=== checking ===");
+MYSERIAL.println(eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODE),DEC);
+MYSERIAL.println(eeprom_read_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER),DEC);
+MYSERIAL.println(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM),DEC);
+MYSERIAL.println(farm_mode,DEC);
+MYSERIAL.println(eCheckMode,DEC);
+    } else if(code_seen("www")) {
+MYSERIAL.println("=== @ FF ===");
+eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,0xFF);
+eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,0xFF);
+eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,0xFFFF);
+*/
+    } else if (code_seen("nozzle")) { //! PRUSA nozzle
+          uint16_t nDiameter;
+          if(code_seen('D'))
+               {
+               nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um]
+               nozzle_diameter_check(nDiameter);
+               }
+          else if(code_seen("set") && farm_mode)
+               {
+               strchr_pointer++;                  // skip 2nd char (~ 'e')
+               strchr_pointer++;                  // skip 3rd char (~ 't')
+               nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um]
+               eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)e_NOZZLE_DIAMETER_NULL); // for correct synchronization after farm-mode exiting
+               eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,nDiameter);
+               }
+          else SERIAL_PROTOCOLLN((float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0);
+	}	
     //else if (code_seen('Cal')) {
     //else if (code_seen('Cal')) {
 		//  lcd_calibration();
 		//  lcd_calibration();
 	  // }
 	  // }
@@ -3807,7 +3910,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
       codenum = 0;
       codenum = 0;
       if(code_seen('P')) codenum = code_value(); // milliseconds to wait
       if(code_seen('P')) codenum = code_value(); // milliseconds to wait
       if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait
       if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait
-	  if(codenum != 0) LCD_MESSAGERPGM(_n("Sleep..."));////MSG_DWELL c=0 r=0
+	  if(codenum != 0) LCD_MESSAGERPGM(_n("Sleep..."));////MSG_DWELL
       st_synchronize();
       st_synchronize();
       codenum += _millis();  // keep track of when we started waiting
       codenum += _millis();  // keep track of when we started waiting
       previous_millis_cmd = _millis();
       previous_millis_cmd = _millis();
@@ -4125,7 +4228,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 //			setTargetHotend(200, 0);
 //			setTargetHotend(200, 0);
 			setTargetBed(70 + (start_temp - 30));
 			setTargetBed(70 + (start_temp - 30));
 
 
-			custom_message_type = CUSTOM_MSG_TYPE_TEMCAL;
+			custom_message_type = CustomMsg::TempCal;
 			custom_message_state = 1;
 			custom_message_state = 1;
 			lcd_setstatuspgm(_T(MSG_TEMP_CALIBRATION));
 			lcd_setstatuspgm(_T(MSG_TEMP_CALIBRATION));
 			current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
 			current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
@@ -4227,7 +4330,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 			break;
 			break;
 		}
 		}
 		puts_P(_N("PINDA probe calibration start"));
 		puts_P(_N("PINDA probe calibration start"));
-		custom_message_type = CUSTOM_MSG_TYPE_TEMCAL;
+		custom_message_type = CustomMsg::TempCal;
 		custom_message_state = 1;
 		custom_message_state = 1;
 		lcd_setstatuspgm(_T(MSG_TEMP_CALIBRATION));
 		lcd_setstatuspgm(_T(MSG_TEMP_CALIBRATION));
 		current_position[X_AXIS] = PINDA_PREHEAT_X;
 		current_position[X_AXIS] = PINDA_PREHEAT_X;
@@ -4295,7 +4398,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 			
 			
 		
 		
 		}
 		}
-		custom_message_type = CUSTOM_MSG_TYPE_STATUS;
+		custom_message_type = CustomMsg::Status;
 
 
 		eeprom_update_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 1);
 		eeprom_update_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 1);
 		puts_P(_N("Temperature calibration done."));
 		puts_P(_N("Temperature calibration done."));
@@ -4355,7 +4458,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 			// We don't know where we are! HOME!
 			// We don't know where we are! HOME!
 			// Push the commands to the front of the message queue in the reverse order!
 			// Push the commands to the front of the message queue in the reverse order!
 			// There shall be always enough space reserved for these commands.
 			// There shall be always enough space reserved for these commands.
-			if (lcd_commands_type != LCD_COMMAND_STOP_PRINT) {
+			if (lcd_commands_type != LcdCommands::StopPrint) {
 				repeatcommand_front(); // repeat G80 with all its parameters
 				repeatcommand_front(); // repeat G80 with all its parameters
 				enquecommand_front_P((PSTR("G28 W0")));
 				enquecommand_front_P((PSTR("G28 W0")));
 			}
 			}
@@ -4395,7 +4498,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 
 
 		if (temp_comp_start)
 		if (temp_comp_start)
 		if (run == false && temp_cal_active == true && calibration_status_pinda() == true && target_temperature_bed >= 50) {
 		if (run == false && temp_cal_active == true && calibration_status_pinda() == true && target_temperature_bed >= 50) {
-			if (lcd_commands_type != LCD_COMMAND_STOP_PRINT) {
+			if (lcd_commands_type != LcdCommands::StopPrint) {
 				temp_compensation_start();
 				temp_compensation_start();
 				run = true;
 				run = true;
 				repeatcommand_front(); // repeat G80 with all its parameters
 				repeatcommand_front(); // repeat G80 with all its parameters
@@ -4407,14 +4510,14 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 			break;
 			break;
 		}
 		}
 		run = false;
 		run = false;
-		if (lcd_commands_type == LCD_COMMAND_STOP_PRINT) {
+		if (lcd_commands_type == LcdCommands::StopPrint) {
 			mesh_bed_leveling_flag = false;
 			mesh_bed_leveling_flag = false;
 			break;
 			break;
 		}
 		}
 		// Save custom message state, set a new custom message state to display: Calibrating point 9.
 		// Save custom message state, set a new custom message state to display: Calibrating point 9.
-		unsigned int custom_message_type_old = custom_message_type;
+		CustomMsg custom_message_type_old = custom_message_type;
 		unsigned int custom_message_state_old = custom_message_state;
 		unsigned int custom_message_state_old = custom_message_state;
-		custom_message_type = CUSTOM_MSG_TYPE_MESHBL;
+		custom_message_type = CustomMsg::MeshBedLeveling;
 		custom_message_state = (nMeasPoints * nMeasPoints) + 10;
 		custom_message_state = (nMeasPoints * nMeasPoints) + 10;
 		lcd_update(1);
 		lcd_update(1);
 
 
@@ -4614,7 +4717,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
                     enable_z_endstop(bState);
                     enable_z_endstop(bState);
                     } while (st_get_position_mm(Z_AXIS) > MESH_HOME_Z_SEARCH); // i.e. Z-leveling not o.k.
                     } while (st_get_position_mm(Z_AXIS) > MESH_HOME_Z_SEARCH); // i.e. Z-leveling not o.k.
 //               plan_set_z_position(MESH_HOME_Z_SEARCH); // is not necessary ('do-while' loop always ends at the expected Z-position)
 //               plan_set_z_position(MESH_HOME_Z_SEARCH); // is not necessary ('do-while' loop always ends at the expected Z-position)
-               custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
+               custom_message_type=CustomMsg::Status; // display / status-line recovery
                lcd_update_enable(true);           // display / status-line recovery
                lcd_update_enable(true);           // display / status-line recovery
                gcode_G28(true, true, true);       // X & Y & Z-homing (must be after individual Z-homing (problem with spool-holder)!)
                gcode_G28(true, true, true);       // X & Y & Z-homing (must be after individual Z-homing (problem with spool-holder)!)
                repeatcommand_front();             // re-run (i.e. of "G80")
                repeatcommand_front();             // re-run (i.e. of "G80")
@@ -4890,6 +4993,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 		EEPROM_save_B(EEPROM_FARM_NUMBER, &farm_no);
 		EEPROM_save_B(EEPROM_FARM_NUMBER, &farm_no);
           SilentModeMenu = SILENT_MODE_OFF;
           SilentModeMenu = SILENT_MODE_OFF;
           eeprom_update_byte((unsigned char *)EEPROM_SILENT, SilentModeMenu);
           eeprom_update_byte((unsigned char *)EEPROM_SILENT, SilentModeMenu);
+          fCheckModeInit();                       // alternatively invoke printer reset
 		break;
 		break;
 
 
 	case 99: //! G99 (deactivate farm mode)
 	case 99: //! G99 (deactivate farm mode)
@@ -4897,6 +5001,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 		lcd_printer_connected();
 		lcd_printer_connected();
 		eeprom_update_byte((unsigned char *)EEPROM_FARM_MODE, farm_mode);
 		eeprom_update_byte((unsigned char *)EEPROM_FARM_MODE, farm_mode);
 		lcd_update(2);
 		lcd_update(2);
+          fCheckModeInit();                       // alternatively invoke printer reset
 		break;
 		break;
 	default:
 	default:
 		printf_P(PSTR("Unknown G code: %s \n"), cmdbuffer + bufindr + CMDHDRSIZE);
 		printf_P(PSTR("Unknown G code: %s \n"), cmdbuffer + bufindr + CMDHDRSIZE);
@@ -4945,7 +5050,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
       if (!hasP && !hasS && *src != '\0') {
       if (!hasP && !hasS && *src != '\0') {
         lcd_setstatus(src);
         lcd_setstatus(src);
       } else {
       } else {
-        LCD_MESSAGERPGM(_i("Wait for user..."));////MSG_USERWAIT c=0 r=0
+        LCD_MESSAGERPGM(_i("Wait for user..."));////MSG_USERWAIT
       }
       }
 
 
       lcd_ignore_click();				//call lcd_ignore_click aslo for else ???
       lcd_ignore_click();				//call lcd_ignore_click aslo for else ???
@@ -4962,13 +5067,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 		KEEPALIVE_STATE(IN_HANDLER);
 		KEEPALIVE_STATE(IN_HANDLER);
         lcd_ignore_click(false);
         lcd_ignore_click(false);
       }else{
       }else{
-		KEEPALIVE_STATE(PAUSED_FOR_USER);
-        while(!lcd_clicked()){
-          manage_heater();
-          manage_inactivity(true);
-          lcd_update(0);
-        }
-		KEEPALIVE_STATE(IN_HANDLER);
+        marlin_wait_for_click();
       }
       }
       if (IS_SD_PRINTING)
       if (IS_SD_PRINTING)
         LCD_MESSAGERPGM(_T(MSG_RESUMING_PRINT));
         LCD_MESSAGERPGM(_T(MSG_RESUMING_PRINT));
@@ -4977,7 +5076,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
     }
     }
     break;
     break;
     case 17:
     case 17:
-        LCD_MESSAGERPGM(_i("No move."));////MSG_NO_MOVE c=0 r=0
+        LCD_MESSAGERPGM(_i("No move."));////MSG_NO_MOVE
         enable_x();
         enable_x();
         enable_y();
         enable_y();
         enable_z();
         enable_z();
@@ -4988,9 +5087,9 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 
 
 #ifdef SDSUPPORT
 #ifdef SDSUPPORT
     case 20: // M20 - list SD card
     case 20: // M20 - list SD card
-      SERIAL_PROTOCOLLNRPGM(_N("Begin file list"));////MSG_BEGIN_FILE_LIST c=0 r=0
+      SERIAL_PROTOCOLLNRPGM(_N("Begin file list"));////MSG_BEGIN_FILE_LIST
       card.ls();
       card.ls();
-      SERIAL_PROTOCOLLNRPGM(_N("End file list"));////MSG_END_FILE_LIST c=0 r=0
+      SERIAL_PROTOCOLLNRPGM(_N("End file list"));////MSG_END_FILE_LIST
       break;
       break;
     case 21: // M21 - init SD card
     case 21: // M21 - init SD card
 
 
@@ -5546,7 +5645,7 @@ Sigma_Exit:
         }
         }
       #else
       #else
         SERIAL_ERROR_START;
         SERIAL_ERROR_START;
-        SERIAL_ERRORLNRPGM(_i("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS c=0 r=0
+        SERIAL_ERRORLNRPGM(_i("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS
       #endif
       #endif
 
 
         SERIAL_PROTOCOLPGM(" @:");
         SERIAL_PROTOCOLPGM(" @:");
@@ -5896,10 +5995,10 @@ Sigma_Exit:
       enable_endstops(true) ;
       enable_endstops(true) ;
       break;
       break;
     case 119: // M119
     case 119: // M119
-    SERIAL_PROTOCOLRPGM(_N("Reporting endstop status"));////MSG_M119_REPORT c=0 r=0
+    SERIAL_PROTOCOLRPGM(_N("Reporting endstop status"));////MSG_M119_REPORT
     SERIAL_PROTOCOLLN("");
     SERIAL_PROTOCOLLN("");
       #if defined(X_MIN_PIN) && X_MIN_PIN > -1
       #if defined(X_MIN_PIN) && X_MIN_PIN > -1
-        SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN c=0 r=0
+        SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN
         if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){
         if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
         }else{
         }else{
@@ -5908,7 +6007,7 @@ Sigma_Exit:
         SERIAL_PROTOCOLLN("");
         SERIAL_PROTOCOLLN("");
       #endif
       #endif
       #if defined(X_MAX_PIN) && X_MAX_PIN > -1
       #if defined(X_MAX_PIN) && X_MAX_PIN > -1
-        SERIAL_PROTOCOLRPGM(_n("x_max: "));////MSG_X_MAX c=0 r=0
+        SERIAL_PROTOCOLRPGM(_n("x_max: "));////MSG_X_MAX
         if(READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING){
         if(READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING){
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
         }else{
         }else{
@@ -5917,7 +6016,7 @@ Sigma_Exit:
         SERIAL_PROTOCOLLN("");
         SERIAL_PROTOCOLLN("");
       #endif
       #endif
       #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
       #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
-        SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN c=0 r=0
+        SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN
         if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){
         if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
         }else{
         }else{
@@ -5926,7 +6025,7 @@ Sigma_Exit:
         SERIAL_PROTOCOLLN("");
         SERIAL_PROTOCOLLN("");
       #endif
       #endif
       #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1
       #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1
-        SERIAL_PROTOCOLRPGM(_n("y_max: "));////MSG_Y_MAX c=0 r=0
+        SERIAL_PROTOCOLRPGM(_n("y_max: "));////MSG_Y_MAX
         if(READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING){
         if(READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING){
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
         }else{
         }else{
@@ -5977,7 +6076,7 @@ Sigma_Exit:
           extruder = code_value();
           extruder = code_value();
 		  if(extruder >= EXTRUDERS) {
 		  if(extruder >= EXTRUDERS) {
             SERIAL_ECHO_START;
             SERIAL_ECHO_START;
-            SERIAL_ECHO(_n("M200 Invalid extruder "));////MSG_M200_INVALID_EXTRUDER c=0 r=0
+            SERIAL_ECHO(_n("M200 Invalid extruder "));////MSG_M200_INVALID_EXTRUDER
             break;
             break;
           }
           }
         }
         }
@@ -6551,7 +6650,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 
 
 		float x_position = current_position[X_AXIS];
 		float x_position = current_position[X_AXIS];
 		float y_position = current_position[Y_AXIS];
 		float y_position = current_position[Y_AXIS];
-		float z_shift = 0;
+		float z_shift = 0; // is it necessary to be a float?
 		float e_shift_init = 0;
 		float e_shift_init = 0;
 		float e_shift_late = 0;
 		float e_shift_late = 0;
 		bool automatic = false;
 		bool automatic = false;
@@ -6587,10 +6686,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
         }
         }
         else
         else
         {
         {
-          #ifdef FILAMENTCHANGE_ZADD
-            z_shift= FILAMENTCHANGE_ZADD ;
-            if(current_position[Z_AXIS] < 25) z_shift+= 25 ;
-          #endif
+			z_shift = gcode_M600_filament_change_z_shift<uint8_t>();
         }
         }
 		//Move XY to side
 		//Move XY to side
         if(code_seen('X'))
         if(code_seen('X'))
@@ -6889,6 +6985,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 				uint8_t axis = E_AXIS;
 				uint8_t axis = E_AXIS;
 				uint16_t res = tmc2130_get_res(axis);
 				uint16_t res = tmc2130_get_res(axis);
 				tmc2130_set_res(axis, res_new);
 				tmc2130_set_res(axis, res_new);
+				cs.axis_ustep_resolution[axis] = res_new;
 				if (res_new > res)
 				if (res_new > res)
 				{
 				{
 					uint16_t fac = (res_new / res);
 					uint16_t fac = (res_new / res);
@@ -7014,7 +7111,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 	  	if (mmu_enabled) 
 	  	if (mmu_enabled) 
 		{
 		{
 			st_synchronize();
 			st_synchronize();
-			mmu_continue_loading();
+			mmu_continue_loading(is_usb_printing);
 			mmu_extruder = tmp_extruder; //filament change is finished
 			mmu_extruder = tmp_extruder; //filament change is finished
 			mmu_load_to_nozzle();
 			mmu_load_to_nozzle();
 		}
 		}
@@ -7049,10 +7146,17 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
               }
               }
 			  else
 			  else
 			  {
 			  {
+#if defined(MMU_HAS_CUTTER) && defined(MMU_ALWAYS_CUT)
+			      if (EEPROM_MMU_CUTTER_ENABLED_always == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
+                  {
+                      mmu_command(MmuCmd::K0 + tmp_extruder);
+                      manage_response(true, true, MMU_UNLOAD_MOVE);
+                  }
+#endif //defined(MMU_HAS_CUTTER) && defined(MMU_ALWAYS_CUT)
 				  mmu_command(MmuCmd::T0 + tmp_extruder);
 				  mmu_command(MmuCmd::T0 + tmp_extruder);
-
 				  manage_response(true, true, MMU_TCODE_MOVE);
 				  manage_response(true, true, MMU_TCODE_MOVE);
-				  mmu_continue_loading();
+		          mmu_continue_loading(is_usb_printing);
+
 				  mmu_extruder = tmp_extruder; //filament change is finished
 				  mmu_extruder = tmp_extruder; //filament change is finished
 
 
 				  if (load_to_nozzle)// for single material usage with mmu
 				  if (load_to_nozzle)// for single material usage with mmu
@@ -7115,7 +7219,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
                   SERIAL_ECHO_START;
                   SERIAL_ECHO_START;
                   SERIAL_ECHOPGM("T");
                   SERIAL_ECHOPGM("T");
                   SERIAL_PROTOCOLLN((int)tmp_extruder);
                   SERIAL_PROTOCOLLN((int)tmp_extruder);
-                  SERIAL_ECHOLNRPGM(_n("Invalid extruder"));////MSG_INVALID_EXTRUDER c=0 r=0
+                  SERIAL_ECHOLNRPGM(_n("Invalid extruder"));////MSG_INVALID_EXTRUDER
               }
               }
               else {
               else {
 #if EXTRUDERS > 1
 #if EXTRUDERS > 1
@@ -7151,7 +7255,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
                   }
                   }
 #endif
 #endif
                   SERIAL_ECHO_START;
                   SERIAL_ECHO_START;
-                  SERIAL_ECHORPGM(_n("Active Extruder: "));////MSG_ACTIVE_EXTRUDER c=0 r=0
+                  SERIAL_ECHORPGM(_n("Active Extruder: "));////MSG_ACTIVE_EXTRUDER
                   SERIAL_PROTOCOLLN((int)active_extruder);
                   SERIAL_PROTOCOLLN((int)active_extruder);
               }
               }
 
 
@@ -7164,9 +7268,9 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
   {
   {
     switch((int)code_value())
     switch((int)code_value())
     {
     {
-#ifdef DEBUG_DCODES
 	case -1: //! D-1 - Endless loop
 	case -1: //! D-1 - Endless loop
 		dcode__1(); break;
 		dcode__1(); break;
+#ifdef DEBUG_DCODES
 	case 0: //! D0 - Reset
 	case 0: //! D0 - Reset
 		dcode_0(); break;
 		dcode_0(); break;
 	case 1: //! D1 - Clear EEPROM
 	case 1: //! D1 - Clear EEPROM
@@ -7603,11 +7707,11 @@ static void handleSafetyTimer()
     {
     {
         safetyTimer.start();
         safetyTimer.start();
     }
     }
-    else if (safetyTimer.expired(safetytimer_inactive_time))
+    else if (safetyTimer.expired(farm_mode?FARM_DEFAULT_SAFETYTIMER_TIME_ms:safetytimer_inactive_time))
     {
     {
         setTargetBed(0);
         setTargetBed(0);
         setAllTargetHotends(0);
         setAllTargetHotends(0);
-        lcd_show_fullscreen_message_and_wait_P(_i("Heating disabled by safety timer."));////MSG_BED_HEATING_SAFETY_DISABLED c=0 r=0
+        lcd_show_fullscreen_message_and_wait_P(_i("Heating disabled by safety timer."));////MSG_BED_HEATING_SAFETY_DISABLED
     }
     }
 }
 }
 #endif //SAFETYTIMER
 #endif //SAFETYTIMER
@@ -7625,9 +7729,9 @@ bool bInhibitFlag;
 #ifdef IR_SENSOR
 #ifdef IR_SENSOR
           bInhibitFlag=(menu_menu==lcd_menu_show_sensors_state); // Support::SensorInfo menu active
           bInhibitFlag=(menu_menu==lcd_menu_show_sensors_state); // Support::SensorInfo menu active
 #endif // IR_SENSOR
 #endif // IR_SENSOR
-          if ((mcode_in_progress != 600) && (eFilamentAction != e_FILAMENT_ACTION_autoLoad) && (!bInhibitFlag)) //M600 not in progress, preHeat @ autoLoad menu not active, Support::ExtruderInfo/SensorInfo menu not active
+          if ((mcode_in_progress != 600) && (eFilamentAction != FilamentAction::AutoLoad) && (!bInhibitFlag)) //M600 not in progress, preHeat @ autoLoad menu not active, Support::ExtruderInfo/SensorInfo menu not active
 		{
 		{
-			if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LCD_COMMAND_V2_CAL) && !wizard_active)
+			if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal) && !wizard_active)
 			{
 			{
 				if (fsensor_check_autoload())
 				if (fsensor_check_autoload())
 				{
 				{
@@ -7651,7 +7755,7 @@ if(0)
 						show_preheat_nozzle_warning();
 						show_preheat_nozzle_warning();
 						lcd_update_enable(true);
 						lcd_update_enable(true);
 */
 */
-                              eFilamentAction=e_FILAMENT_ACTION_autoLoad;
+                              eFilamentAction=FilamentAction::AutoLoad;
                               bFilamentFirstRun=false;
                               bFilamentFirstRun=false;
                               if(target_temperature[0]>=EXTRUDE_MINTEMP)
                               if(target_temperature[0]>=EXTRUDE_MINTEMP)
                               {
                               {
@@ -7786,12 +7890,12 @@ void kill(const char *full_screen_message, unsigned char id)
   pinMode(PS_ON_PIN,INPUT);
   pinMode(PS_ON_PIN,INPUT);
 #endif
 #endif
   SERIAL_ERROR_START;
   SERIAL_ERROR_START;
-  SERIAL_ERRORLNRPGM(_n("Printer halted. kill() called!"));////MSG_ERR_KILLED c=0 r=0
+  SERIAL_ERRORLNRPGM(_n("Printer halted. kill() called!"));////MSG_ERR_KILLED
   if (full_screen_message != NULL) {
   if (full_screen_message != NULL) {
       SERIAL_ERRORLNRPGM(full_screen_message);
       SERIAL_ERRORLNRPGM(full_screen_message);
       lcd_display_message_fullscreen_P(full_screen_message);
       lcd_display_message_fullscreen_P(full_screen_message);
   } else {
   } else {
-      LCD_ALERTMESSAGERPGM(_n("KILLED. "));////MSG_KILLED c=0 r=0
+      LCD_ALERTMESSAGERPGM(_n("KILLED. "));////MSG_KILLED
   }
   }
 
 
   // FMC small patch to update the LCD before ending
   // FMC small patch to update the LCD before ending
@@ -7915,19 +8019,19 @@ bool setTargetedHotend(int code, uint8_t &extruder)
       SERIAL_ECHO_START;
       SERIAL_ECHO_START;
       switch(code){
       switch(code){
         case 104:
         case 104:
-          SERIAL_ECHORPGM(_n("M104 Invalid extruder "));////MSG_M104_INVALID_EXTRUDER c=0 r=0
+          SERIAL_ECHORPGM(_n("M104 Invalid extruder "));////MSG_M104_INVALID_EXTRUDER
           break;
           break;
         case 105:
         case 105:
-          SERIAL_ECHO(_n("M105 Invalid extruder "));////MSG_M105_INVALID_EXTRUDER c=0 r=0
+          SERIAL_ECHO(_n("M105 Invalid extruder "));////MSG_M105_INVALID_EXTRUDER
           break;
           break;
         case 109:
         case 109:
-          SERIAL_ECHO(_n("M109 Invalid extruder "));////MSG_M109_INVALID_EXTRUDER c=0 r=0
+          SERIAL_ECHO(_n("M109 Invalid extruder "));////MSG_M109_INVALID_EXTRUDER
           break;
           break;
         case 218:
         case 218:
-          SERIAL_ECHO(_n("M218 Invalid extruder "));////MSG_M218_INVALID_EXTRUDER c=0 r=0
+          SERIAL_ECHO(_n("M218 Invalid extruder "));////MSG_M218_INVALID_EXTRUDER
           break;
           break;
         case 221:
         case 221:
-          SERIAL_ECHO(_n("M221 Invalid extruder "));////MSG_M221_INVALID_EXTRUDER c=0 r=0
+          SERIAL_ECHO(_n("M221 Invalid extruder "));////MSG_M221_INVALID_EXTRUDER
           break;
           break;
       }
       }
       SERIAL_PROTOCOLLN((int)extruder);
       SERIAL_PROTOCOLLN((int)extruder);
@@ -8125,7 +8229,7 @@ void bed_check(float x_dimension, float y_dimension, int x_points_num, int y_poi
 	float bed_zero_ref_y = (-0.6f + Y_PROBE_OFFSET_FROM_EXTRUDER);
 	float bed_zero_ref_y = (-0.6f + Y_PROBE_OFFSET_FROM_EXTRUDER);
 
 
 	float mesh_home_z_search = 4;
 	float mesh_home_z_search = 4;
-	float measure_z_heigth = 0.2f;
+	float measure_z_height = 0.2f;
 	float row[x_points_num];
 	float row[x_points_num];
 	int ix = 0;
 	int ix = 0;
 	int iy = 0;
 	int iy = 0;
@@ -8142,7 +8246,7 @@ void bed_check(float x_dimension, float y_dimension, int x_points_num, int y_poi
 
 
 	unsigned int custom_message_type_old = custom_message_type;
 	unsigned int custom_message_type_old = custom_message_type;
 	unsigned int custom_message_state_old = custom_message_state;
 	unsigned int custom_message_state_old = custom_message_state;
-	custom_message_type = CUSTOM_MSG_TYPE_MESHBL;
+	custom_message_type = CustomMsg::MeshBedLeveling;
 	custom_message_state = (x_points_num * y_points_num) + 10;
 	custom_message_state = (x_points_num * y_points_num) + 10;
 	lcd_update(1);
 	lcd_update(1);
 
 
@@ -8160,7 +8264,7 @@ void bed_check(float x_dimension, float y_dimension, int x_points_num, int y_poi
 	}
 	}
 	st_synchronize();
 	st_synchronize();
 	*/
 	*/
-		destination[Z_AXIS] = measure_z_heigth;
+		destination[Z_AXIS] = measure_z_height;
 		plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], Z_LIFT_FEEDRATE, active_extruder);
 		plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], Z_LIFT_FEEDRATE, active_extruder);
 		for(int8_t i=0; i < NUM_AXIS; i++) {
 		for(int8_t i=0; i < NUM_AXIS; i++) {
 			current_position[i] = destination[i];
 			current_position[i] = destination[i];
@@ -8340,7 +8444,7 @@ void bed_analysis(float x_dimension, float y_dimension, int x_points_num, int y_
 	}
 	}
 	unsigned int custom_message_type_old = custom_message_type;
 	unsigned int custom_message_type_old = custom_message_type;
 	unsigned int custom_message_state_old = custom_message_state;
 	unsigned int custom_message_state_old = custom_message_state;
-	custom_message_type = CUSTOM_MSG_TYPE_MESHBL;
+	custom_message_type = CustomMsg::MeshBedLeveling;
 	custom_message_state = (x_points_num * y_points_num) + 10;
 	custom_message_state = (x_points_num * y_points_num) + 10;
 	lcd_update(1);
 	lcd_update(1);
 
 
@@ -8490,7 +8594,7 @@ void bed_analysis(float x_dimension, float y_dimension, int x_points_num, int y_
 
 
 void temp_compensation_start() {
 void temp_compensation_start() {
 	
 	
-	custom_message_type = CUSTOM_MSG_TYPE_TEMPRE;
+	custom_message_type = CustomMsg::TempCompPreheat;
 	custom_message_state = PINDA_HEAT_T + 1;
 	custom_message_state = PINDA_HEAT_T + 1;
 	lcd_update(2);
 	lcd_update(2);
 	if (degHotend(active_extruder) > EXTRUDE_MINTEMP) {
 	if (degHotend(active_extruder) > EXTRUDE_MINTEMP) {
@@ -8511,7 +8615,7 @@ void temp_compensation_start() {
 		if (custom_message_state == 99 || custom_message_state == 9) lcd_update(2); //force whole display redraw if number of digits changed
 		if (custom_message_state == 99 || custom_message_state == 9) lcd_update(2); //force whole display redraw if number of digits changed
 		else lcd_update(1);
 		else lcd_update(1);
 	}	
 	}	
-	custom_message_type = CUSTOM_MSG_TYPE_STATUS;
+	custom_message_type = CustomMsg::Status;
 	custom_message_state = 0;
 	custom_message_state = 0;
 }
 }
 
 
@@ -8650,12 +8754,10 @@ void serialecho_temperatures() {
 	SERIAL_PROTOCOL_F(degBed(), 1);
 	SERIAL_PROTOCOL_F(degBed(), 1);
 	SERIAL_PROTOCOLLN("");
 	SERIAL_PROTOCOLLN("");
 }
 }
-
 extern uint32_t sdpos_atomic;
 extern uint32_t sdpos_atomic;
-
 #ifdef UVLO_SUPPORT
 #ifdef UVLO_SUPPORT
 
 
-void uvlo_() 
+void uvlo_()
 {
 {
 	unsigned long time_start = _millis();
 	unsigned long time_start = _millis();
 	bool sd_print = card.sdprinting;
 	bool sd_print = card.sdprinting;
@@ -8702,12 +8804,10 @@ void uvlo_()
 	// Store the current extruder position.
 	// Store the current extruder position.
 	eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION_E), st_get_position_mm(E_AXIS));
 	eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION_E), st_get_position_mm(E_AXIS));
 	eeprom_update_byte((uint8_t*)EEPROM_UVLO_E_ABS, axis_relative_modes[3]?0:1);
 	eeprom_update_byte((uint8_t*)EEPROM_UVLO_E_ABS, axis_relative_modes[3]?0:1);
-
     // Clean the input command queue.
     // Clean the input command queue.
     cmdqueue_reset();
     cmdqueue_reset();
     card.sdprinting = false;
     card.sdprinting = false;
-//    card.closefile();
-
+//    card.closefile();    
     // Enable stepper driver interrupt to move Z axis.
     // Enable stepper driver interrupt to move Z axis.
     // This should be fine as the planner and command queues are empty and the SD card printing is disabled.
     // This should be fine as the planner and command queues are empty and the SD card printing is disabled.
     //FIXME one may want to disable serial lines at this point of time to avoid interfering with the command queue,
     //FIXME one may want to disable serial lines at this point of time to avoid interfering with the command queue,
@@ -8723,26 +8823,25 @@ void uvlo_()
         st_synchronize();
         st_synchronize();
         disable_e0();
         disable_e0();
     
     
-		plan_buffer_line(
-      current_position[X_AXIS], 
-      current_position[Y_AXIS], 
-      current_position[Z_AXIS] + UVLO_Z_AXIS_SHIFT + float((1024 - z_microsteps + 7) >> 4) / cs.axis_steps_per_unit[Z_AXIS], 
+    plan_buffer_line(
+      current_position[X_AXIS],
+      current_position[Y_AXIS],
+      current_position[Z_AXIS] + UVLO_Z_AXIS_SHIFT + float((1024 - z_microsteps + 7) >> 4) / cs.axis_steps_per_unit[Z_AXIS],
       current_position[E_AXIS] - default_retraction,
       current_position[E_AXIS] - default_retraction,
       40, active_extruder);
       40, active_extruder);
-    
     st_synchronize();
     st_synchronize();
     disable_e0();
     disable_e0();
-    
+
     plan_buffer_line(
     plan_buffer_line(
-                     current_position[X_AXIS],
-                     current_position[Y_AXIS],
-                     current_position[Z_AXIS] + UVLO_Z_AXIS_SHIFT + float((1024 - z_microsteps + 7) >> 4) / cs.axis_steps_per_unit[Z_AXIS],
-                     current_position[E_AXIS] - default_retraction,
-                     40, active_extruder);
+      current_position[X_AXIS],
+      current_position[Y_AXIS],
+      current_position[Z_AXIS] + UVLO_Z_AXIS_SHIFT + float((1024 - z_microsteps + 7) >> 4) / cs.axis_steps_per_unit[Z_AXIS],
+      current_position[E_AXIS] - default_retraction,
+      40, active_extruder);
     st_synchronize();
     st_synchronize();
+
     disable_e0();
     disable_e0();
     disable_z();
     disable_z();
-    
     // Move Z up to the next 0th full step.
     // Move Z up to the next 0th full step.
     // Write the file position.
     // Write the file position.
     eeprom_update_dword((uint32_t*)(EEPROM_FILE_POSITION), sd_position);
     eeprom_update_dword((uint32_t*)(EEPROM_FILE_POSITION), sd_position);
@@ -8758,9 +8857,10 @@ void uvlo_()
     // for reaching the zero full step before powering off.
     // for reaching the zero full step before powering off.
     eeprom_update_word((uint16_t*)(EEPROM_UVLO_Z_MICROSTEPS), z_microsteps);
     eeprom_update_word((uint16_t*)(EEPROM_UVLO_Z_MICROSTEPS), z_microsteps);
     // Store the current position.
     // Store the current position.
+
     eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 0), current_position[X_AXIS]);
     eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 0), current_position[X_AXIS]);
     eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4), current_position[Y_AXIS]);
     eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4), current_position[Y_AXIS]);
-    eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION_Z), current_position[Z_AXIS]);
+    eeprom_update_float((float*)EEPROM_UVLO_CURRENT_POSITION_Z , current_position[Z_AXIS]);
     // Store the current feed rate, temperatures, fan speed and extruder multipliers (flow rates)
     // Store the current feed rate, temperatures, fan speed and extruder multipliers (flow rates)
     EEPROM_save_B(EEPROM_UVLO_FEEDRATE, &feedrate_bckp);
     EEPROM_save_B(EEPROM_UVLO_FEEDRATE, &feedrate_bckp);
     eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_HOTEND, target_temperature[active_extruder]);
     eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_HOTEND, target_temperature[active_extruder]);
@@ -8786,16 +8886,14 @@ void uvlo_()
     // Increment power failure counter
     // Increment power failure counter
 	eeprom_update_byte((uint8_t*)EEPROM_POWER_COUNT, eeprom_read_byte((uint8_t*)EEPROM_POWER_COUNT) + 1);
 	eeprom_update_byte((uint8_t*)EEPROM_POWER_COUNT, eeprom_read_byte((uint8_t*)EEPROM_POWER_COUNT) + 1);
 	eeprom_update_word((uint16_t*)EEPROM_POWER_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT) + 1);
 	eeprom_update_word((uint16_t*)EEPROM_POWER_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT) + 1);
-    
-		printf_P(_N("UVLO - end %d\n"), _millis() - time_start);
-    
+      printf_P(_N("UVLO - end %d\n"), _millis() - time_start);
+
 #if 0
 #if 0
     // Move the print head to the side of the print until all the power stored in the power supply capacitors is depleted.
     // Move the print head to the side of the print until all the power stored in the power supply capacitors is depleted.
     current_position[X_AXIS] = (current_position[X_AXIS] < 0.5f * (X_MIN_POS + X_MAX_POS)) ? X_MIN_POS : X_MAX_POS;
     current_position[X_AXIS] = (current_position[X_AXIS] < 0.5f * (X_MIN_POS + X_MAX_POS)) ? X_MIN_POS : X_MAX_POS;
     plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 500, active_extruder);
     plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 500, active_extruder);
     st_synchronize();
     st_synchronize();
 #endif
 #endif
-    
 wdt_enable(WDTO_500MS);
 wdt_enable(WDTO_500MS);
 WRITE(BEEPER,HIGH);
 WRITE(BEEPER,HIGH);
 while(1)
 while(1)
@@ -8821,30 +8919,29 @@ tmc2130_set_current_r(Z_AXIS, 20);
 #ifdef TMC2130
 #ifdef TMC2130
 z_microsteps=tmc2130_rd_MSCNT(Z_TMC2130_CS);
 z_microsteps=tmc2130_rd_MSCNT(Z_TMC2130_CS);
 #endif //TMC2130
 #endif //TMC2130
-
 planner_abort_hard();
 planner_abort_hard();
-sei();
-plan_buffer_line(
-     current_position[X_AXIS], 
-     current_position[Y_AXIS], 
-//     current_position[Z_AXIS]+float((1024-z_microsteps+7)>>4)/axis_steps_per_unit[Z_AXIS], 
-     current_position[Z_AXIS]+UVLO_Z_AXIS_SHIFT+float((1024-z_microsteps+7)>>4)/cs.axis_steps_per_unit[Z_AXIS], 
-     current_position[E_AXIS],
-     40, active_extruder);
-st_synchronize();
 disable_z();
 disable_z();
 
 
-// Finaly store the "power outage" flag.
-//if(sd_print)
-     eeprom_update_byte((uint8_t*)EEPROM_UVLO,2);
+//save current position only in case, where the printer is moving on Z axis, which is only when EEPROM_UVLO is 1
+//EEPROM_UVLO is 1 after normal uvlo or after recover_print(), when the extruder is moving on Z axis after rehome
+if(eeprom_read_byte((uint8_t*)EEPROM_UVLO)!=2){
+  eeprom_update_float((float*)(EEPROM_UVLO_TINY_CURRENT_POSITION_Z), current_position[Z_AXIS]);
+  eeprom_update_word((uint16_t*)(EEPROM_UVLO_TINY_Z_MICROSTEPS),z_microsteps);
+}
 
 
-eeprom_update_word((uint16_t*)(EEPROM_UVLO_TINY_Z_MICROSTEPS),z_microsteps);
-eeprom_update_float((float*)(EEPROM_UVLO_TINY_CURRENT_POSITION_Z), current_position[Z_AXIS]);
+//after multiple power panics current Z axis is unknow
+//in this case we set EEPROM_UVLO_TINY_CURRENT_POSITION_Z to last know position which is EEPROM_UVLO_CURRENT_POSITION_Z 
+if(eeprom_read_float((float*)EEPROM_UVLO_TINY_CURRENT_POSITION_Z) < 0.001f){
+  eeprom_update_float((float*)(EEPROM_UVLO_TINY_CURRENT_POSITION_Z), eeprom_read_float((float*)EEPROM_UVLO_CURRENT_POSITION_Z));
+  eeprom_update_word((uint16_t*)(EEPROM_UVLO_TINY_Z_MICROSTEPS), eeprom_read_word((uint16_t*)EEPROM_UVLO_Z_MICROSTEPS));
+}
+
+// Finaly store the "power outage" flag.
+eeprom_update_byte((uint8_t*)EEPROM_UVLO,2);
 
 
 // Increment power failure counter
 // Increment power failure counter
 eeprom_update_byte((uint8_t*)EEPROM_POWER_COUNT, eeprom_read_byte((uint8_t*)EEPROM_POWER_COUNT) + 1);
 eeprom_update_byte((uint8_t*)EEPROM_POWER_COUNT, eeprom_read_byte((uint8_t*)EEPROM_POWER_COUNT) + 1);
 eeprom_update_word((uint16_t*)EEPROM_POWER_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT) + 1);
 eeprom_update_word((uint16_t*)EEPROM_POWER_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT) + 1);
-
 wdt_enable(WDTO_500MS);
 wdt_enable(WDTO_500MS);
 WRITE(BEEPER,HIGH);
 WRITE(BEEPER,HIGH);
 while(1)
 while(1)
@@ -8906,7 +9003,9 @@ void setup_uvlo_interrupt() {
 ISR(INT4_vect) {
 ISR(INT4_vect) {
 	EIMSK &= ~(1 << 4); //disable INT4 interrupt to make sure that this code will be executed just once 
 	EIMSK &= ~(1 << 4); //disable INT4 interrupt to make sure that this code will be executed just once 
 	SERIAL_ECHOLNPGM("INT4");
 	SERIAL_ECHOLNPGM("INT4");
-     if(IS_SD_PRINTING && (!(eeprom_read_byte((uint8_t*)EEPROM_UVLO))) ) uvlo_();
+    //fire normal uvlo only in case where EEPROM_UVLO is 0 or if IS_SD_PRINTING is 1. 
+    //Don't change || to && because in some case the printer can be moving although IS_SD_PRINTING is zero
+     if((IS_SD_PRINTING ) || (!(eeprom_read_byte((uint8_t*)EEPROM_UVLO)))) uvlo_();
      if(eeprom_read_byte((uint8_t*)EEPROM_UVLO)) uvlo_tiny();
      if(eeprom_read_byte((uint8_t*)EEPROM_UVLO)) uvlo_tiny();
 }
 }
 
 
@@ -8914,14 +9013,14 @@ void recover_print(uint8_t automatic) {
 	char cmd[30];
 	char cmd[30];
 	lcd_update_enable(true);
 	lcd_update_enable(true);
 	lcd_update(2);
 	lcd_update(2);
-	lcd_setstatuspgm(_i("Recovering print    "));////MSG_RECOVERING_PRINT c=20 r=1
-
-     bool bTiny=(eeprom_read_byte((uint8_t*)EEPROM_UVLO)==2);
-     recover_machine_state_after_power_panic(bTiny); //recover position, temperatures and extrude_multipliers
+  lcd_setstatuspgm(_i("Recovering print    "));////MSG_RECOVERING_PRINT c=20 r=1
 
 
+      bool bTiny=(eeprom_read_byte((uint8_t*)EEPROM_UVLO)==2);
+      recover_machine_state_after_power_panic(bTiny); //recover position, temperatures and extrude_multipliers
   // Lift the print head, so one may remove the excess priming material.
   // Lift the print head, so one may remove the excess priming material.
-     if(!bTiny&&(current_position[Z_AXIS]<25))
+      if(!bTiny&&(current_position[Z_AXIS]<25))
           enquecommand_P(PSTR("G1 Z25 F800"));
           enquecommand_P(PSTR("G1 Z25 F800"));
+
   // Home X and Y axes. Homing just X and Y shall not touch the babystep and the world2machine transformation status.
   // Home X and Y axes. Homing just X and Y shall not touch the babystep and the world2machine transformation status.
 	enquecommand_P(PSTR("G28 X Y"));
 	enquecommand_P(PSTR("G28 X Y"));
   // Set the target bed and nozzle temperatures and wait.
   // Set the target bed and nozzle temperatures and wait.
@@ -8941,8 +9040,7 @@ void recover_print(uint8_t automatic) {
 
 
   // Restart the print.
   // Restart the print.
 	restore_print_from_eeprom();
 	restore_print_from_eeprom();
-
-	printf_P(_N("Current pos Z_AXIS:%.3f\nCurrent pos E_AXIS:%.3f\n"), current_position[Z_AXIS], current_position[E_AXIS]);
+  printf_P(_N("Current pos Z_AXIS:%.3f\nCurrent pos E_AXIS:%.3f\n"), current_position[Z_AXIS], current_position[E_AXIS]);
 }
 }
 
 
 void recover_machine_state_after_power_panic(bool bTiny)
 void recover_machine_state_after_power_panic(bool bTiny)
@@ -8952,14 +9050,36 @@ void recover_machine_state_after_power_panic(bool bTiny)
   // The logical XY coordinates are needed to recover the machine Z coordinate corrected by the mesh bed leveling.
   // The logical XY coordinates are needed to recover the machine Z coordinate corrected by the mesh bed leveling.
   current_position[X_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 0));
   current_position[X_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 0));
   current_position[Y_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4));
   current_position[Y_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4));
+
+  // 2) Restore the mesh bed leveling offsets. This is 2*7*7=98 bytes, which takes 98*3.4us=333us in worst case.
+  mbl.active = false;
+  for (int8_t mesh_point = 0; mesh_point < MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS; ++ mesh_point) {
+    uint8_t ix = mesh_point % MESH_NUM_X_POINTS; // from 0 to MESH_NUM_X_POINTS - 1
+    uint8_t iy = mesh_point / MESH_NUM_X_POINTS;
+    // Scale the z value to 10u resolution.
+    int16_t v;
+    eeprom_read_block(&v, (void*)(EEPROM_UVLO_MESH_BED_LEVELING_FULL+2*mesh_point), 2);
+    if (v != 0)
+      mbl.active = true;
+    mbl.z_values[iy][ix] = float(v) * 0.001f;
+  }
+
   // Recover the logical coordinate of the Z axis at the time of the power panic.
   // Recover the logical coordinate of the Z axis at the time of the power panic.
   // The current position after power panic is moved to the next closest 0th full step.
   // The current position after power panic is moved to the next closest 0th full step.
-  if(bTiny)
-    current_position[Z_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_TINY_CURRENT_POSITION_Z)) + 
-    UVLO_Z_AXIS_SHIFT + float((1024 - eeprom_read_word((uint16_t*)(EEPROM_UVLO_TINY_Z_MICROSTEPS)) + 7) >> 4) / cs.axis_steps_per_unit[Z_AXIS];
-  else
+  if(bTiny){    
+    current_position[Z_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_TINY_CURRENT_POSITION_Z))
+     + float((1024 - eeprom_read_word((uint16_t*)(EEPROM_UVLO_TINY_Z_MICROSTEPS)) 
+    + 7) >> 4) / cs.axis_steps_per_unit[Z_AXIS];
+
+    //after multiple power panics the print is slightly in the air so get it little bit down. 
+    //Not exactly sure why is this happening, but it has something to do with bed leveling and world2machine coordinates 
+    current_position[Z_AXIS] -= 0.4*mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS]); 
+  }
+  else{
     current_position[Z_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_Z)) + 
     current_position[Z_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_Z)) + 
-    UVLO_Z_AXIS_SHIFT + float((1024 - eeprom_read_word((uint16_t*)(EEPROM_UVLO_Z_MICROSTEPS)) + 7) >> 4) / cs.axis_steps_per_unit[Z_AXIS];
+    UVLO_Z_AXIS_SHIFT + float((1024 - eeprom_read_word((uint16_t*)(EEPROM_UVLO_Z_MICROSTEPS)) 
+    + 7) >> 4) / cs.axis_steps_per_unit[Z_AXIS];
+  }
   if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_E_ABS)) {
   if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_E_ABS)) {
 	  current_position[E_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_E));
 	  current_position[E_AXIS] = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_E));
 	  sprintf_P(cmd, PSTR("G92 E"));
 	  sprintf_P(cmd, PSTR("G92 E"));
@@ -8972,21 +9092,8 @@ void recover_machine_state_after_power_panic(bool bTiny)
   SERIAL_ECHOPGM("recover_machine_state_after_power_panic, initial ");
   SERIAL_ECHOPGM("recover_machine_state_after_power_panic, initial ");
   print_world_coordinates();
   print_world_coordinates();
 
 
-  // 2) Initialize the logical to physical coordinate system transformation.
+  // 3) Initialize the logical to physical coordinate system transformation.
   world2machine_initialize();
   world2machine_initialize();
-
-  // 3) Restore the mesh bed leveling offsets. This is 2*7*7=98 bytes, which takes 98*3.4us=333us in worst case.
-  mbl.active = false;
-  for (int8_t mesh_point = 0; mesh_point < MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS; ++ mesh_point) {
-    uint8_t ix = mesh_point % MESH_NUM_X_POINTS; // from 0 to MESH_NUM_X_POINTS - 1
-    uint8_t iy = mesh_point / MESH_NUM_X_POINTS;
-    // Scale the z value to 10u resolution.
-    int16_t v;
-    eeprom_read_block(&v, (void*)(EEPROM_UVLO_MESH_BED_LEVELING_FULL+2*mesh_point), 2);
-    if (v != 0)
-      mbl.active = true;
-    mbl.z_values[iy][ix] = float(v) * 0.001f;
-  }
 //  SERIAL_ECHOPGM("recover_machine_state_after_power_panic, initial ");
 //  SERIAL_ECHOPGM("recover_machine_state_after_power_panic, initial ");
 //  print_mesh_bed_leveling_table();
 //  print_mesh_bed_leveling_table();
 
 
@@ -9002,7 +9109,7 @@ void recover_machine_state_after_power_panic(bool bTiny)
   axis_known_position[X_AXIS] = true; enable_x();
   axis_known_position[X_AXIS] = true; enable_x();
   axis_known_position[Y_AXIS] = true; enable_y();
   axis_known_position[Y_AXIS] = true; enable_y();
   axis_known_position[Z_AXIS] = true; enable_z();
   axis_known_position[Z_AXIS] = true; enable_z();
-
+  
   SERIAL_ECHOPGM("recover_machine_state_after_power_panic, initial ");
   SERIAL_ECHOPGM("recover_machine_state_after_power_panic, initial ");
   print_physical_coordinates();
   print_physical_coordinates();
 
 
@@ -9066,6 +9173,8 @@ void restore_print_from_eeprom() {
 	strcat_P(cmd, PSTR(" Y"));   strcat(cmd, ftostr32(eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4))));
 	strcat_P(cmd, PSTR(" Y"));   strcat(cmd, ftostr32(eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION + 4))));
 	strcat_P(cmd, PSTR(" F2000"));
 	strcat_P(cmd, PSTR(" F2000"));
 	enquecommand(cmd);
 	enquecommand(cmd);
+  //moving on Z axis ahead, set EEPROM_UVLO to 1, so normal uvlo can fire
+  eeprom_update_byte((uint8_t*)EEPROM_UVLO,1);
   // Move the Z axis down to the print, in logical coordinates.
   // Move the Z axis down to the print, in logical coordinates.
 	strcpy_P(cmd, PSTR("G1 Z")); strcat(cmd, ftostr32(eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_Z))));
 	strcpy_P(cmd, PSTR("G1 Z")); strcat(cmd, ftostr32(eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_Z))));
 	enquecommand(cmd);
 	enquecommand(cmd);
@@ -9255,22 +9364,20 @@ void stop_and_save_print_to_ram(float z_move, float e_move)
 
 
 	// First unretract (relative extrusion)
 	// First unretract (relative extrusion)
 	if(!saved_extruder_relative_mode){
 	if(!saved_extruder_relative_mode){
-	  strcpy_P(buf, PSTR("M83"));
-	  enquecommand(buf, false);
+		enquecommand(PSTR("M83"), true);
 	}
 	}
 	
 	
 	//retract 45mm/s
 	//retract 45mm/s
-	strcpy_P(buf, PSTR("G1 E"));
-	dtostrf(e_move, 6, 3, buf + strlen(buf));
-	strcat_P(buf, PSTR(" F"));
-	dtostrf(2700, 8, 3, buf + strlen(buf));
+	// A single sprintf may not be faster, but is definitely 20B shorter
+	// than a sequence of commands building the string piece by piece
+	// A snprintf would have been a safer call, but since it is not used
+	// in the whole program, its implementation would bring more bytes to the total size
+	// The behavior of dtostrf 8,3 should be roughly the same as %-0.3
+	sprintf_P(buf, PSTR("G1 E%-0.3f F2700"), e_move);
 	enquecommand(buf, false);
 	enquecommand(buf, false);
 
 
 	// Then lift Z axis
 	// Then lift Z axis
-    strcpy_P(buf, PSTR("G1 Z"));
-    dtostrf(saved_pos[Z_AXIS] + z_move, 8, 3, buf + strlen(buf));
-    strcat_P(buf, PSTR(" F"));
-    dtostrf(homing_feedrate[Z_AXIS], 8, 3, buf + strlen(buf));
+	sprintf_P(buf, PSTR("G1 Z%-0.3f F%-0.3f"), saved_pos[Z_AXIS] + z_move, homing_feedrate[Z_AXIS]); 
     // At this point the command queue is empty.
     // At this point the command queue is empty.
     enquecommand(buf, false);
     enquecommand(buf, false);
     // If this call is invoked from the main Arduino loop() function, let the caller know that the command
     // If this call is invoked from the main Arduino loop() function, let the caller know that the command
@@ -9296,6 +9403,12 @@ void stop_and_save_print_to_ram(float z_move, float e_move)
 void restore_print_from_ram_and_continue(float e_move)
 void restore_print_from_ram_and_continue(float e_move)
 {
 {
 	if (!saved_printing) return;
 	if (!saved_printing) return;
+	
+#ifdef FANCHECK
+	// Do not allow resume printing if fans are still not ok
+	if( fan_check_error != EFCE_OK )return;
+#endif
+	
 //	for (int axis = X_AXIS; axis <= E_AXIS; axis++)
 //	for (int axis = X_AXIS; axis <= E_AXIS; axis++)
 //	    current_position[axis] = st_get_position_mm(axis);
 //	    current_position[axis] = st_get_position_mm(axis);
 	active_extruder = saved_active_extruder; //restore active_extruder
 	active_extruder = saved_active_extruder; //restore active_extruder
@@ -9614,4 +9727,22 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 	lcd_update_enable(false);
 	lcd_update_enable(false);
 }
 }
 
 
+
+//! @brief Wait for click
+//!
+//! Set
+void marlin_wait_for_click()
+{
+    int8_t busy_state_backup = busy_state;
+    KEEPALIVE_STATE(PAUSED_FOR_USER);
+    lcd_consume_click();
+    while(!lcd_clicked())
+    {
+        manage_heater();
+        manage_inactivity(true);
+        lcd_update(0);
+    }
+    KEEPALIVE_STATE(busy_state_backup);
+}
+
 #define FIL_LOAD_LENGTH 60
 #define FIL_LOAD_LENGTH 60

+ 12 - 11
Firmware/cardreader.cpp

@@ -94,7 +94,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
 				if (!dir.open(parent, lfilename, O_READ)) {
 				if (!dir.open(parent, lfilename, O_READ)) {
 					if (lsAction == LS_SerialPrint) {
 					if (lsAction == LS_SerialPrint) {
 						//SERIAL_ECHO_START();
 						//SERIAL_ECHO_START();
-						//SERIAL_ECHOPGM(_i("Cannot open subdir"));////MSG_SD_CANT_OPEN_SUBDIR c=0 r=0
+						//SERIAL_ECHOPGM(_i("Cannot open subdir"));////MSG_SD_CANT_OPEN_SUBDIR
 						//SERIAL_ECHOLN(lfilename);
 						//SERIAL_ECHOLN(lfilename);
 					}
 					}
 				}
 				}
@@ -183,23 +183,23 @@ void CardReader::initsd()
   {
   {
     //if (!card.init(SPI_HALF_SPEED,SDSS))
     //if (!card.init(SPI_HALF_SPEED,SDSS))
     SERIAL_ECHO_START;
     SERIAL_ECHO_START;
-    SERIAL_ECHOLNRPGM(_n("SD init fail"));////MSG_SD_INIT_FAIL c=0 r=0
+    SERIAL_ECHOLNRPGM(_n("SD init fail"));////MSG_SD_INIT_FAIL
   }
   }
   else if (!volume.init(&card))
   else if (!volume.init(&card))
   {
   {
     SERIAL_ERROR_START;
     SERIAL_ERROR_START;
-    SERIAL_ERRORLNRPGM(_n("volume.init failed"));////MSG_SD_VOL_INIT_FAIL c=0 r=0
+    SERIAL_ERRORLNRPGM(_n("volume.init failed"));////MSG_SD_VOL_INIT_FAIL
   }
   }
   else if (!root.openRoot(&volume)) 
   else if (!root.openRoot(&volume)) 
   {
   {
     SERIAL_ERROR_START;
     SERIAL_ERROR_START;
-    SERIAL_ERRORLNRPGM(_n("openRoot failed"));////MSG_SD_OPENROOT_FAIL c=0 r=0
+    SERIAL_ERRORLNRPGM(_n("openRoot failed"));////MSG_SD_OPENROOT_FAIL
   }
   }
   else 
   else 
   {
   {
     cardOK = true;
     cardOK = true;
     SERIAL_ECHO_START;
     SERIAL_ECHO_START;
-    SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK c=0 r=0
+    SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK
   }
   }
   workDir=root;
   workDir=root;
   curDir=&root;
   curDir=&root;
@@ -242,6 +242,7 @@ void CardReader::startFileprint()
   {
   {
     sdprinting = true;
     sdprinting = true;
 	paused = false;
 	paused = false;
+     Stopped = false;
 	#ifdef SDCARD_SORT_ALPHA
 	#ifdef SDCARD_SORT_ALPHA
 		//flush_presort();
 		//flush_presort();
 	#endif
 	#endif
@@ -418,13 +419,13 @@ void CardReader::openFile(const char* name,bool read, bool replace_current/*=tru
     if (file.open(curDir, fname, O_READ)) 
     if (file.open(curDir, fname, O_READ)) 
     {
     {
       filesize = file.fileSize();
       filesize = file.fileSize();
-      SERIAL_PROTOCOLRPGM(_N("File opened: "));////MSG_SD_FILE_OPENED c=0 r=0
+      SERIAL_PROTOCOLRPGM(_N("File opened: "));////MSG_SD_FILE_OPENED
       SERIAL_PROTOCOL(fname);
       SERIAL_PROTOCOL(fname);
-      SERIAL_PROTOCOLRPGM(_n(" Size: "));////MSG_SD_SIZE c=0 r=0
+      SERIAL_PROTOCOLRPGM(_n(" Size: "));////MSG_SD_SIZE
       SERIAL_PROTOCOLLN(filesize);
       SERIAL_PROTOCOLLN(filesize);
       sdpos = 0;
       sdpos = 0;
       
       
-      SERIAL_PROTOCOLLNRPGM(_N("File selected"));////MSG_SD_FILE_SELECTED c=0 r=0
+      SERIAL_PROTOCOLLNRPGM(_N("File selected"));////MSG_SD_FILE_SELECTED
       getfilename(0, fname);
       getfilename(0, fname);
       lcd_setstatus(longFilename[0] ? longFilename : fname);
       lcd_setstatus(longFilename[0] ? longFilename : fname);
       lcd_setstatus("SD-PRINTING         ");
       lcd_setstatus("SD-PRINTING         ");
@@ -447,7 +448,7 @@ void CardReader::openFile(const char* name,bool read, bool replace_current/*=tru
     else
     else
     {
     {
       saving = true;
       saving = true;
-      SERIAL_PROTOCOLRPGM(_N("Writing to file: "));////MSG_SD_WRITE_TO_FILE c=0 r=0
+      SERIAL_PROTOCOLRPGM(_N("Writing to file: "));////MSG_SD_WRITE_TO_FILE
       SERIAL_PROTOCOLLN(name);
       SERIAL_PROTOCOLLN(name);
       lcd_setstatus(fname);
       lcd_setstatus(fname);
     }
     }
@@ -493,7 +494,7 @@ void CardReader::getStatus()
   if(sdprinting){
   if(sdprinting){
     SERIAL_PROTOCOL(longFilename);
     SERIAL_PROTOCOL(longFilename);
     SERIAL_PROTOCOLPGM("\n");
     SERIAL_PROTOCOLPGM("\n");
-    SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE c=0 r=0
+    SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE
     SERIAL_PROTOCOL(sdpos);
     SERIAL_PROTOCOL(sdpos);
     SERIAL_PROTOCOLPGM("/");
     SERIAL_PROTOCOLPGM("/");
     SERIAL_PROTOCOLLN(filesize);
     SERIAL_PROTOCOLLN(filesize);
@@ -659,7 +660,7 @@ void CardReader::chdir(const char * relpath)
   if(!newfile.open(*parent,relpath, O_READ))
   if(!newfile.open(*parent,relpath, O_READ))
   {
   {
    SERIAL_ECHO_START;
    SERIAL_ECHO_START;
-   SERIAL_ECHORPGM(_n("Cannot enter subdir: "));////MSG_SD_CANT_ENTER_SUBDIR c=0 r=0
+   SERIAL_ECHORPGM(_n("Cannot enter subdir: "));////MSG_SD_CANT_ENTER_SUBDIR
    SERIAL_ECHOLN(relpath);
    SERIAL_ECHOLN(relpath);
   }
   }
   else
   else

+ 1 - 0
Firmware/cardreader.h

@@ -161,6 +161,7 @@ private:
   void flush_presort();
   void flush_presort();
 #endif
 #endif
 };
 };
+extern bool Stopped;
 extern CardReader card;
 extern CardReader card;
 #define IS_SD_PRINTING (card.sdprinting)
 #define IS_SD_PRINTING (card.sdprinting)
 
 

+ 6 - 6
Firmware/cmdqueue.cpp

@@ -429,7 +429,7 @@ void get_command()
 				  // M110 - set current line number.
 				  // M110 - set current line number.
 				  // Line numbers not sent in succession.
 				  // Line numbers not sent in succession.
 				  SERIAL_ERROR_START;
 				  SERIAL_ERROR_START;
-				  SERIAL_ERRORRPGM(_n("Line Number is not Last Line Number+1, Last Line: "));////MSG_ERR_LINE_NO c=0 r=0
+				  SERIAL_ERRORRPGM(_n("Line Number is not Last Line Number+1, Last Line: "));////MSG_ERR_LINE_NO
 				  SERIAL_ERRORLN(gcode_LastN);
 				  SERIAL_ERRORLN(gcode_LastN);
 				  //Serial.println(gcode_N);
 				  //Serial.println(gcode_N);
 				  FlushSerialRequestResend();
 				  FlushSerialRequestResend();
@@ -445,7 +445,7 @@ void get_command()
 					  checksum = checksum^(*p++);
 					  checksum = checksum^(*p++);
 				  if (int(strtol(strchr_pointer+1, NULL, 10)) != int(checksum)) {
 				  if (int(strtol(strchr_pointer+1, NULL, 10)) != int(checksum)) {
 					  SERIAL_ERROR_START;
 					  SERIAL_ERROR_START;
-					  SERIAL_ERRORRPGM(_n("checksum mismatch, Last Line: "));////MSG_ERR_CHECKSUM_MISMATCH c=0 r=0
+					  SERIAL_ERRORRPGM(_n("checksum mismatch, Last Line: "));////MSG_ERR_CHECKSUM_MISMATCH
 					  SERIAL_ERRORLN(gcode_LastN);
 					  SERIAL_ERRORLN(gcode_LastN);
 					  FlushSerialRequestResend();
 					  FlushSerialRequestResend();
 					  serial_count = 0;
 					  serial_count = 0;
@@ -457,7 +457,7 @@ void get_command()
 			  else
 			  else
 			  {
 			  {
 				  SERIAL_ERROR_START;
 				  SERIAL_ERROR_START;
-				  SERIAL_ERRORRPGM(_n("No Checksum with line number, Last Line: "));////MSG_ERR_NO_CHECKSUM c=0 r=0
+				  SERIAL_ERRORRPGM(_n("No Checksum with line number, Last Line: "));////MSG_ERR_NO_CHECKSUM
 				  SERIAL_ERRORLN(gcode_LastN);
 				  SERIAL_ERRORLN(gcode_LastN);
 				  FlushSerialRequestResend();
 				  FlushSerialRequestResend();
 				  serial_count = 0;
 				  serial_count = 0;
@@ -474,7 +474,7 @@ void get_command()
         {
         {
 
 
             SERIAL_ERROR_START;
             SERIAL_ERROR_START;
-            SERIAL_ERRORRPGM(_n("No Line Number with checksum, Last Line: "));////MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM c=0 r=0
+            SERIAL_ERRORRPGM(_n("No Line Number with checksum, Last Line: "));////MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM
             SERIAL_ERRORLN(gcode_LastN);
             SERIAL_ERRORLN(gcode_LastN);
 			FlushSerialRequestResend();
 			FlushSerialRequestResend();
             serial_count = 0;
             serial_count = 0;
@@ -579,7 +579,7 @@ void get_command()
        serial_count >= (MAX_CMD_SIZE - 1) || n==-1)
        serial_count >= (MAX_CMD_SIZE - 1) || n==-1)
     {
     {
       if(card.eof()){
       if(card.eof()){
-        SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED c=0 r=0
+        SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED
         stoptime=_millis();
         stoptime=_millis();
         char time[30];
         char time[30];
         unsigned long t=(stoptime-starttime-pause_time)/1000;
         unsigned long t=(stoptime-starttime-pause_time)/1000;
@@ -598,7 +598,7 @@ void get_command()
         if (farm_mode)
         if (farm_mode)
         {
         {
             prusa_statistics(6);
             prusa_statistics(6);
-            lcd_commands_type = LCD_COMMAND_FARM_MODE_CONFIRM;
+            lcd_commands_type = LcdCommands::FarmModeConfirm;
         }
         }
 
 
       }
       }

+ 5 - 1
Firmware/config.h

@@ -42,10 +42,14 @@
 #define W25X20CL_SPCR          SPI_SPCR(W25X20CL_SPI_RATE, 1, 1, 1, 0)
 #define W25X20CL_SPCR          SPI_SPCR(W25X20CL_SPI_RATE, 1, 1, 1, 0)
 #define W25X20CL_SPSR          SPI_SPSR(W25X20CL_SPI_RATE)
 #define W25X20CL_SPSR          SPI_SPSR(W25X20CL_SPI_RATE)
 
 
+#include "boards.h"
+#include "Configuration_prusa.h"
+
 //LANG - Multi-language support
 //LANG - Multi-language support
 //#define LANG_MODE              0 // primary language only
 //#define LANG_MODE              0 // primary language only
 #define LANG_MODE              1 // sec. language support
 #define LANG_MODE              1 // sec. language support
-#define LANG_SIZE_RESERVED     0x2f00 // reserved space for secondary language (12032 bytes)
+
+#define LANG_SIZE_RESERVED     0x2800 // reserved space for secondary language (10240 bytes)
 
 
 
 
 #endif //_CONFIG_H
 #endif //_CONFIG_H

+ 13 - 0
Firmware/eeprom.h

@@ -155,11 +155,18 @@
 #define EEPROM_MMU_LOAD_FAIL (EEPROM_MMU_LOAD_FAIL_TOT - 1) //uint8_t
 #define EEPROM_MMU_LOAD_FAIL (EEPROM_MMU_LOAD_FAIL_TOT - 1) //uint8_t
 #define EEPROM_MMU_CUTTER_ENABLED (EEPROM_MMU_LOAD_FAIL - 1)
 #define EEPROM_MMU_CUTTER_ENABLED (EEPROM_MMU_LOAD_FAIL - 1)
 #define EEPROM_UVLO_MESH_BED_LEVELING_FULL     (EEPROM_MMU_CUTTER_ENABLED - 12*12*2) //allow 12 calibration points for future expansion
 #define EEPROM_UVLO_MESH_BED_LEVELING_FULL     (EEPROM_MMU_CUTTER_ENABLED - 12*12*2) //allow 12 calibration points for future expansion
+
 #define EEPROM_MBL_TYPE	(EEPROM_UVLO_MESH_BED_LEVELING_FULL-1) //uint8_t for mesh bed leveling precision
 #define EEPROM_MBL_TYPE	(EEPROM_UVLO_MESH_BED_LEVELING_FULL-1) //uint8_t for mesh bed leveling precision
 #define EEPROM_MBL_MAGNET_ELIMINATION (EEPROM_MBL_TYPE -1)  
 #define EEPROM_MBL_MAGNET_ELIMINATION (EEPROM_MBL_TYPE -1)  
 #define EEPROM_MBL_POINTS_NR (EEPROM_MBL_MAGNET_ELIMINATION -1) //uint8_t number of points in one exis for mesh bed leveling
 #define EEPROM_MBL_POINTS_NR (EEPROM_MBL_MAGNET_ELIMINATION -1) //uint8_t number of points in one exis for mesh bed leveling
 #define EEPROM_MBL_PROBE_NR (EEPROM_MBL_POINTS_NR-1) //number of measurements for each point
 #define EEPROM_MBL_PROBE_NR (EEPROM_MBL_POINTS_NR-1) //number of measurements for each point
+
 #define EEPROM_MMU_STEALTH (EEPROM_MBL_PROBE_NR-1)
 #define EEPROM_MMU_STEALTH (EEPROM_MBL_PROBE_NR-1)
+
+#define EEPROM_CHECK_MODE (EEPROM_MMU_STEALTH-1) // uint8
+#define EEPROM_NOZZLE_DIAMETER (EEPROM_CHECK_MODE-1) // uint8
+#define EEPROM_NOZZLE_DIAMETER_uM (EEPROM_NOZZLE_DIAMETER-2) // uint16
+
 // !!!!!
 // !!!!!
 // !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!!
 // !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!!
 // !!!!!
 // !!!!!
@@ -201,5 +208,11 @@
 static M500_conf * const EEPROM_M500_base = reinterpret_cast<M500_conf*>(20); //offset for storing settings using M500
 static M500_conf * const EEPROM_M500_base = reinterpret_cast<M500_conf*>(20); //offset for storing settings using M500
 #endif
 #endif
 
 
+enum
+{
+    EEPROM_MMU_CUTTER_ENABLED_enabled = 1,
+    EEPROM_MMU_CUTTER_ENABLED_always = 2,
+};
+
 
 
 #endif // EEPROM_H
 #endif // EEPROM_H

+ 214 - 0
Firmware/first_lay_cal.cpp

@@ -0,0 +1,214 @@
+//! @file
+//! @date Jun 10, 2019
+//! @author Marek Bel
+//! @brief First layer (Z offset) calibration
+
+#include "first_lay_cal.h"
+#include "Configuration_prusa.h"
+#include "language.h"
+#include "Marlin.h"
+#include "mmu.h"
+#include <avr/pgmspace.h>
+
+//! @brief Preheat
+void lay1cal_preheat()
+{
+    static const char cmd_preheat_0[] PROGMEM = "M107";
+    static const char cmd_preheat_1[] PROGMEM = "M104 S" STRINGIFY(PLA_PREHEAT_HOTEND_TEMP);
+    static const char cmd_preheat_2[] PROGMEM = "M140 S" STRINGIFY(PLA_PREHEAT_HPB_TEMP);
+    static const char cmd_preheat_3[] PROGMEM = "M190 S" STRINGIFY(PLA_PREHEAT_HPB_TEMP);
+    static const char cmd_preheat_4[] PROGMEM = "M109 S" STRINGIFY(PLA_PREHEAT_HOTEND_TEMP);
+    static const char cmd_preheat_5[] PROGMEM = "G28";
+    static const char cmd_preheat_6[] PROGMEM = "G92 E0.0";
+
+    static const char * const preheat_cmd[] PROGMEM =
+    {
+        cmd_preheat_0,
+        cmd_preheat_1,
+        cmd_preheat_2,
+        cmd_preheat_3,
+        cmd_preheat_4,
+        cmd_preheat_5, //call MSG_M117_V2_CALIBRATION before
+        cmd_preheat_6,
+    };
+
+    for (uint8_t i = 0; i < (sizeof(preheat_cmd)/sizeof(preheat_cmd[0])); ++i)
+    {
+        if (5 == i)  enquecommand_P(_T(MSG_M117_V2_CALIBRATION));
+        enquecommand_P(static_cast<char*>(pgm_read_ptr(&preheat_cmd[i])));
+    }
+
+}
+
+//! @brief Print intro line
+//! @param cmd_buffer character buffer needed to format gcodes
+//! @param filament filament to use (applies for MMU only)
+void lay1cal_intro_line(char *cmd_buffer, uint8_t filament)
+{
+    static const char cmd_intro_mmu_0[] PROGMEM = "M83";
+    static const char cmd_intro_mmu_1[] PROGMEM = "G1 Y-3.0 F1000.0";
+    static const char cmd_intro_mmu_2[] PROGMEM = "G1 Z0.4 F1000.0";
+    static const char cmd_intro_mmu_3[] PROGMEM = "G1 X55.0 E32.0 F1073.0"; // call T code before
+    static const char cmd_intro_mmu_4[] PROGMEM = "G1 X5.0 E32.0 F1800.0";
+    static const char cmd_intro_mmu_5[] PROGMEM = "G1 X55.0 E8.0 F2000.0";
+    static const char cmd_intro_mmu_6[] PROGMEM = "G1 Z0.3 F1000.0";
+    static const char cmd_intro_mmu_7[] PROGMEM = "G92 E0.0";
+    static const char cmd_intro_mmu_8[] PROGMEM = "G1 X240.0 E25.0  F2200.0";
+    static const char cmd_intro_mmu_9[] PROGMEM = "G1 Y-2.0 F1000.0";
+    static const char cmd_intro_mmu_10[] PROGMEM = "G1 X55.0 E25 F1400.0";
+    static const char cmd_intro_mmu_11[] PROGMEM = "G1 Z0.20 F1000.0";
+    static const char cmd_intro_mmu_12[] PROGMEM = "G1 X5.0 E4.0 F1000.0";
+
+    static const char * const intro_mmu_cmd[] PROGMEM =
+    {
+        cmd_intro_mmu_0,
+        cmd_intro_mmu_1,
+        cmd_intro_mmu_2,
+        cmd_intro_mmu_3, // call T code before
+        cmd_intro_mmu_4,
+        cmd_intro_mmu_5,
+        cmd_intro_mmu_6,
+        cmd_intro_mmu_7,
+        cmd_intro_mmu_8,
+        cmd_intro_mmu_9,
+        cmd_intro_mmu_10,
+        cmd_intro_mmu_11,
+        cmd_intro_mmu_12,
+    };
+
+    if (mmu_enabled)
+    {
+        for (uint8_t i = 0; i < (sizeof(intro_mmu_cmd)/sizeof(intro_mmu_cmd[0])); ++i)
+        {
+            if (3 == i)
+                {
+                    sprintf_P(cmd_buffer, PSTR("T%d"), filament);
+                    enquecommand(cmd_buffer);
+                }
+            enquecommand_P(static_cast<char*>(pgm_read_ptr(&intro_mmu_cmd[i])));
+        }
+    }
+    else
+    {
+        enquecommand_P(PSTR("G1 X60.0 E9.0 F1000.0"));
+        enquecommand_P(PSTR("G1 X100.0 E12.5 F1000.0"));
+    }
+}
+
+//! @brief Setup for printing meander
+void lay1cal_before_meander()
+{
+    static const char cmd_pre_meander_0[] PROGMEM = "G92 E0.0";
+    static const char cmd_pre_meander_1[] PROGMEM = "G21"; //set units to millimeters TODO unsupported command
+    static const char cmd_pre_meander_2[] PROGMEM = "G90"; //use absolute coordinates
+    static const char cmd_pre_meander_3[] PROGMEM = "M83"; //use relative distances for extrusion TODO: duplicate
+    static const char cmd_pre_meander_4[] PROGMEM = "G1 E-1.50000 F2100.00000";
+    static const char cmd_pre_meander_5[] PROGMEM = "G1 Z5 F7200.000";
+    static const char cmd_pre_meander_6[] PROGMEM = "M204 S1000"; //set acceleration
+    static const char cmd_pre_meander_7[] PROGMEM = "G1 F4000";
+
+    static const char * const cmd_pre_meander[] PROGMEM =
+    {
+            cmd_pre_meander_0,
+            cmd_pre_meander_1,
+            cmd_pre_meander_2,
+            cmd_pre_meander_3,
+            cmd_pre_meander_4,
+            cmd_pre_meander_5,
+            cmd_pre_meander_6,
+            cmd_pre_meander_7,
+    };
+
+    for (uint8_t i = 0; i < (sizeof(cmd_pre_meander)/sizeof(cmd_pre_meander[0])); ++i)
+    {
+        enquecommand_P(static_cast<char*>(pgm_read_ptr(&cmd_pre_meander[i])));
+    }
+}
+
+
+//! @brief Count extrude length
+//!
+//! @param layer_height layer height in mm
+//! @param extrusion_width extrusion width in mm
+//! @param extrusion_length extrusion length in mm
+//! @return filament length in mm which needs to be extruded to form line
+static constexpr float count_e(float layer_height, float extrusion_width, float extrusion_length)
+{
+    return (extrusion_length * layer_height * extrusion_width / (M_PI * pow(1.75, 2) / 4));
+}
+
+static const float width = 0.4; //!< line width
+static const float length = 20 - width; //!< line length
+static const float height = 0.2; //!< layer height TODO This is wrong, as current Z height is 0.15 mm
+static const float extr = count_e(height, width, length); //!< E axis movement needed to print line
+
+//! @brief Print meander
+//! @param cmd_buffer character buffer needed to format gcodes
+void lay1cal_meander(char *cmd_buffer)
+{
+    static const char cmd_meander_0[] PROGMEM = "G1 X50 Y155";
+    static const char cmd_meander_1[] PROGMEM = "G1 Z0.150 F7200.000";
+    static const char cmd_meander_2[] PROGMEM = "G1 F1080";
+    static const char cmd_meander_3[] PROGMEM = "G1 X75 Y155 E2.5";
+    static const char cmd_meander_4[] PROGMEM = "G1 X100 Y155 E2";
+    static const char cmd_meander_5[] PROGMEM = "G1 X200 Y155 E2.62773";
+    static const char cmd_meander_6[] PROGMEM = "G1 X200 Y135 E0.66174";
+    static const char cmd_meander_7[] PROGMEM = "G1 X50 Y135 E3.62773";
+    static const char cmd_meander_8[] PROGMEM = "G1 X50 Y115 E0.49386";
+    static const char cmd_meander_9[] PROGMEM = "G1 X200 Y115 E3.62773";
+    static const char cmd_meander_10[] PROGMEM = "G1 X200 Y95 E0.49386";
+    static const char cmd_meander_11[] PROGMEM = "G1 X50 Y95 E3.62773";
+    static const char cmd_meander_12[] PROGMEM = "G1 X50 Y75 E0.49386";
+    static const char cmd_meander_13[] PROGMEM = "G1 X200 Y75 E3.62773";
+    static const char cmd_meander_14[] PROGMEM = "G1 X200 Y55 E0.49386";
+    static const char cmd_meander_15[] PROGMEM = "G1 X50 Y55 E3.62773";
+
+    static const char * const cmd_meander[] PROGMEM =
+    {
+        cmd_meander_0,
+        cmd_meander_1,
+        cmd_meander_2,
+        cmd_meander_3,
+        cmd_meander_4,
+        cmd_meander_5,
+        cmd_meander_6,
+        cmd_meander_7,
+        cmd_meander_8,
+        cmd_meander_9,
+        cmd_meander_10,
+        cmd_meander_11,
+        cmd_meander_12,
+        cmd_meander_13,
+        cmd_meander_14,
+        cmd_meander_15,
+    };
+
+    for (uint8_t i = 0; i < (sizeof(cmd_meander)/sizeof(cmd_meander[0])); ++i)
+    {
+        enquecommand_P(static_cast<char*>(pgm_read_ptr(&cmd_meander[i])));
+    }
+    sprintf_P(cmd_buffer, PSTR("G1 X50 Y35 E%-.3f"), extr);
+    enquecommand(cmd_buffer);
+}
+
+//! @brief Print square
+//!
+//! This function needs to be called 16 times for i from 0 to 15.
+//!
+//! @param cmd_buffer character buffer needed to format gcodes
+//! @param i iteration
+void lay1cal_square(char *cmd_buffer, uint8_t i)
+{
+    const float extr_short_segment = count_e(height, width, width);
+
+    static const char fmt1[] PROGMEM = "G1 X%d Y%-.2f E%-.3f";
+    static const char fmt2[] PROGMEM = "G1 Y%-.2f E%-.3f";
+    sprintf_P(cmd_buffer, fmt1, 70, (35 - i*width * 2), extr);
+    enquecommand(cmd_buffer);
+    sprintf_P(cmd_buffer, fmt2, (35 - (2 * i + 1)*width), extr_short_segment);
+    enquecommand(cmd_buffer);
+    sprintf_P(cmd_buffer, fmt1, 50, (35 - (2 * i + 1)*width), extr);
+    enquecommand(cmd_buffer);
+    sprintf_P(cmd_buffer, fmt2, (35 - (i + 1)*width * 2), extr_short_segment);
+    enquecommand(cmd_buffer);
+}

+ 15 - 0
Firmware/first_lay_cal.h

@@ -0,0 +1,15 @@
+//! @file
+//! @date Jun 10, 2019
+//! @author Marek Bel
+
+#ifndef FIRMWARE_FIRST_LAY_CAL_H_
+#define FIRMWARE_FIRST_LAY_CAL_H_
+#include <stdint.h>
+
+void lay1cal_preheat();
+void lay1cal_intro_line(char *cmd_buffer, uint8_t filament);
+void lay1cal_before_meander();
+void lay1cal_meander(char *cmd_buffer);
+void lay1cal_square(char *cmd_buffer, uint8_t i);
+
+#endif /* FIRMWARE_FIRST_LAY_CAL_H_ */

+ 53 - 14
Firmware/fsensor.cpp

@@ -57,6 +57,11 @@ bool fsensor_not_responding = false;
 bool fsensor_printing_saved = false;
 bool fsensor_printing_saved = false;
 //! enable/disable quality meassurement
 //! enable/disable quality meassurement
 bool fsensor_oq_meassure_enabled = false;
 bool fsensor_oq_meassure_enabled = false;
+//! as explained in the CHECK_FSENSOR macro: this flag is set to true when fsensor posts
+//! the M600 into the command queue, which elliminates the hazard of having posted multiple M600's
+//! before the first one gets read and started processing.
+//! Btw., the IR fsensor could do up to 6 posts before the command queue managed to start processing the first M600 ;)
+static bool fsensor_m600_enqueued = false;
 
 
 //! number of errors, updated in ISR
 //! number of errors, updated in ISR
 uint8_t fsensor_err_cnt = 0;
 uint8_t fsensor_err_cnt = 0;
@@ -123,6 +128,7 @@ void fsensor_restore_print_and_continue(void)
     printf_P(PSTR("fsensor_restore_print_and_continue\n"));
     printf_P(PSTR("fsensor_restore_print_and_continue\n"));
 	fsensor_watch_runout = true;
 	fsensor_watch_runout = true;
 	fsensor_err_cnt = 0;
 	fsensor_err_cnt = 0;
+	fsensor_m600_enqueued = false;
     restore_print_from_ram_and_continue(0); //XYZ = orig, E - no change
     restore_print_from_ram_and_continue(0); //XYZ = orig, E - no change
 }
 }
 
 
@@ -516,6 +522,47 @@ void fsensor_st_block_chunk(block_t* bl, int cnt)
 	}
 	}
 }
 }
 
 
+//! This ensures generating z-position at least 25mm above the heat bed.
+//! Making this a template enables changing the computation data type easily at all spots where necessary.
+//! @param current_z current z-position
+//! @return z-position at least 25mm above the heat bed plus FILAMENTCHANGE_ZADD 
+template <typename T>
+inline T fsensor_clamp_z(float current_z){
+	T z( current_z );
+	if(z < T(25)){ // make sure the compiler understands, that the constant 25 is of correct type
+		// - necessary for uint8_t -> results in shorter code
+		z = T(25); // move to at least 25mm above heat bed
+	}
+	return z + T(FILAMENTCHANGE_ZADD); // always move above the printout by FILAMENTCHANGE_ZADD (default 2mm)	
+}
+
+//! Common code for enqueing M600 and supplemental codes into the command queue.
+//! Used both for the IR sensor and the PAT9125
+void fsensor_enque_M600(){
+	printf_P(PSTR("fsensor_update - M600\n"));
+	eeprom_update_byte((uint8_t*)EEPROM_FERROR_COUNT, eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT) + 1);
+	eeprom_update_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) + 1);
+	enquecommand_front_P(PSTR("PRUSA fsensor_recover"));
+	fsensor_m600_enqueued = true;
+	enquecommand_front_P((PSTR("M600")));
+#define xstr(a) str(a)
+#define str(a) #a
+	static const char gcodeMove[] PROGMEM = 
+			"G1 X" xstr(FILAMENTCHANGE_XPOS) 
+			" Y" xstr(FILAMENTCHANGE_YPOS) 
+			" Z%u";
+#undef str
+#undef xstr
+	char buf[32];
+	// integer arithmetics is far shorter, I don't need a precise float position here, just move a bit above
+	// 8bit arithmetics in fsensor_clamp_z is 10B shorter than 16bit (not talking about float ;) ) 
+	// The compile-time static_assert here ensures, that the computation gets enough bits in case of Z-range too high,
+	// i.e. makes the user change the data type, which also results in larger code
+	static_assert(Z_MAX_POS < (255 - FILAMENTCHANGE_ZADD), "Z-range too high, change fsensor_clamp_z<uint8_t> to <uint16_t>");
+	sprintf_P(buf, gcodeMove, fsensor_clamp_z<uint8_t>(current_position[Z_AXIS]) );
+	enquecommand_front(buf, false);
+}
+
 //! @brief filament sensor update (perform M600 on filament runout)
 //! @brief filament sensor update (perform M600 on filament runout)
 //!
 //!
 //! Works only if filament sensor is enabled.
 //! Works only if filament sensor is enabled.
@@ -524,7 +571,7 @@ void fsensor_st_block_chunk(block_t* bl, int cnt)
 void fsensor_update(void)
 void fsensor_update(void)
 {
 {
 #ifdef PAT9125
 #ifdef PAT9125
-		if (fsensor_enabled && fsensor_watch_runout && (fsensor_err_cnt > FSENSOR_ERR_MAX))
+		if (fsensor_enabled && fsensor_watch_runout && (fsensor_err_cnt > FSENSOR_ERR_MAX) && ( ! fsensor_m600_enqueued) )
 		{
 		{
 			bool autoload_enabled_tmp = fsensor_autoload_enabled;
 			bool autoload_enabled_tmp = fsensor_autoload_enabled;
 			fsensor_autoload_enabled = false;
 			fsensor_autoload_enabled = false;
@@ -564,25 +611,17 @@ void fsensor_update(void)
 			}
 			}
 			else
 			else
 			{
 			{
-				printf_P(PSTR("fsensor_update - M600\n"));
-				eeprom_update_byte((uint8_t*)EEPROM_FERROR_COUNT, eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT) + 1);
-				eeprom_update_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) + 1);
-				enquecommand_front_P(PSTR("PRUSA fsensor_recover"));
-				enquecommand_front_P((PSTR("M600")));
+				fsensor_enque_M600();
 				fsensor_watch_runout = false;
 				fsensor_watch_runout = false;
 			}
 			}
 			fsensor_autoload_enabled = autoload_enabled_tmp;
 			fsensor_autoload_enabled = autoload_enabled_tmp;
 			fsensor_oq_meassure_enabled = oq_meassure_enabled_tmp;
 			fsensor_oq_meassure_enabled = oq_meassure_enabled_tmp;
 		}
 		}
 #else //PAT9125
 #else //PAT9125
-		if ((digitalRead(IR_SENSOR_PIN) == 1) && CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected)
-		{
-			fsensor_stop_and_save_print();
-			printf_P(PSTR("fsensor_update - M600\n"));
-			eeprom_update_byte((uint8_t*)EEPROM_FERROR_COUNT, eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT) + 1);
-			eeprom_update_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) + 1);
-			enquecommand_front_P(PSTR("PRUSA fsensor_recover"));
-			enquecommand_front_P((PSTR("M600")));
+		if ((digitalRead(IR_SENSOR_PIN) == 1) && CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected && ( ! fsensor_m600_enqueued) )
+		{
+			fsensor_stop_and_save_print();
+			fsensor_enque_M600();
 		}
 		}
 #endif //PAT9125
 #endif //PAT9125
 }
 }

+ 1 - 0
Firmware/fsensor.h

@@ -18,6 +18,7 @@ extern bool fsensor_oq_meassure_enabled;
 //! @name save restore printing
 //! @name save restore printing
 //! @{
 //! @{
 extern void fsensor_stop_and_save_print(void);
 extern void fsensor_stop_and_save_print(void);
+//! restore print - restore position and heatup to original temperature
 extern void fsensor_restore_print_and_continue(void);
 extern void fsensor_restore_print_and_continue(void);
 //! @}
 //! @}
 
 

+ 4 - 10
Firmware/lcd.h

@@ -64,23 +64,17 @@ extern void lcd_print(long, int = 10);
 extern void lcd_print(unsigned long, int = 10);
 extern void lcd_print(unsigned long, int = 10);
 extern void lcd_print(double, int = 2);
 extern void lcd_print(double, int = 2);
 
 
+//! @brief Clear screen
 #define ESC_2J     "\x1b[2J"
 #define ESC_2J     "\x1b[2J"
 #define ESC_25h    "\x1b[?25h"
 #define ESC_25h    "\x1b[?25h"
 #define ESC_25l    "\x1b[?25l"
 #define ESC_25l    "\x1b[?25l"
+//! @brief Set cursor to
+//! @param c column
+//! @param r row
 #define ESC_H(c,r) "\x1b["#r";"#c"H"
 #define ESC_H(c,r) "\x1b["#r";"#c"H"
 
 
 
 
 
 
-
-
-
-
-
-
-
-
-
-
 #define LCD_UPDATE_INTERVAL    100
 #define LCD_UPDATE_INTERVAL    100
 #define LCD_TIMEOUT_TO_STATUS 30000ul //!< Generic timeout to status screen in ms, when no user action.
 #define LCD_TIMEOUT_TO_STATUS 30000ul //!< Generic timeout to status screen in ms, when no user action.
 #define LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z 90000ul //!< Specific timeout for lcd_babystep_z screen in ms.
 #define LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z 90000ul //!< Specific timeout for lcd_babystep_z screen in ms.

+ 0 - 0
Firmware/le.sh


+ 70 - 32
Firmware/menu.cpp

@@ -26,7 +26,7 @@ uint8_t menu_data[MENU_DATA_SIZE];
 #endif
 #endif
 
 
 uint8_t menu_depth = 0;
 uint8_t menu_depth = 0;
-
+uint8_t menu_block_entering_on_serious_errors = SERIOUS_ERR_NONE;
 uint8_t menu_line = 0;
 uint8_t menu_line = 0;
 uint8_t menu_item = 0;
 uint8_t menu_item = 0;
 uint8_t menu_row = 0;
 uint8_t menu_row = 0;
@@ -168,11 +168,19 @@ int menu_draw_item_printf_P(char type_char, const char* format, ...)
 }
 }
 */
 */
 
 
-static int menu_draw_item_puts_P(char type_char, const char* str)
+static void menu_draw_item_puts_P(char type_char, const char* str)
 {
 {
     lcd_set_cursor(0, menu_row);
     lcd_set_cursor(0, menu_row);
-	int cnt = lcd_printf_P(PSTR("%c%-18S%c"), (lcd_encoder == menu_item)?'>':' ', str, type_char);
-	return cnt;
+    lcd_printf_P(PSTR("%c%-18.18S%c"), (lcd_encoder == menu_item)?'>':' ', str, type_char);
+}
+
+static void menu_draw_item_puts_P(char type_char, const char* str, char num)
+{
+    lcd_set_cursor(0, menu_row);
+    lcd_printf_P(PSTR("%c%-.16S "), (lcd_encoder == menu_item)?'>':' ', str);
+    lcd_putc(num);
+    lcd_set_cursor(19, menu_row);
+    lcd_putc(type_char);
 }
 }
 
 
 /*
 /*
@@ -250,6 +258,34 @@ uint8_t menu_item_function_P(const char* str, menu_func_t func)
 	return 0;
 	return 0;
 }
 }
 
 
+//! @brief Menu item function taking single parameter
+//!
+//! Ideal for numbered lists calling functions with number parameter.
+//! @param str Item caption
+//! @param number aditional character to be added after str, e.g. number
+//! @param func pointer to function taking uint8_t with no return value
+//! @param fn_par value to be passed to function
+//! @retval 0
+//! @retval 1 Item was clicked
+uint8_t menu_item_function_P(const char* str, char number, void (*func)(uint8_t), uint8_t fn_par)
+{
+    if (menu_item == menu_line)
+    {
+        if (lcd_draw_update) menu_draw_item_puts_P(' ', str, number);
+        if (menu_clicked && (lcd_encoder == menu_item))
+        {
+            menu_clicked = false;
+            lcd_consume_click();
+            lcd_update_enabled = 0;
+            if (func) func(fn_par);
+            lcd_update_enabled = 1;
+            return menu_item_ret();
+        }
+    }
+    menu_item++;
+    return 0;
+}
+
 uint8_t menu_item_gcode_P(const char* str, const char* str_gcode)
 uint8_t menu_item_gcode_P(const char* str, const char* str_gcode)
 {
 {
 	if (menu_item == menu_line)
 	if (menu_item == menu_line)
@@ -270,11 +306,11 @@ const char menu_20x_space[] PROGMEM = "                    ";
 
 
 const char menu_fmt_int3[] PROGMEM = "%c%.15S:%s%3d";
 const char menu_fmt_int3[] PROGMEM = "%c%.15S:%s%3d";
 
 
-const char menu_fmt_float31[] PROGMEM = "%c%.12S:%s%+06.1f";
+const char menu_fmt_float31[] PROGMEM = "%-12.12S%+8.1f";
 
 
-const char menu_fmt_float13[] PROGMEM = "%c%.12S:%s%+06.3f";
+const char menu_fmt_float13[] PROGMEM = "%c%-13.13S%+5.3f";
 
 
-const char menu_fmt_float13off[] PROGMEM = "%c%.12S:%s%";
+const char menu_fmt_float13off[] PROGMEM = "%c%-13.13S%6.6s";
 
 
 template<typename T>
 template<typename T>
 static void menu_draw_P(char chr, const char* str, int16_t val);
 static void menu_draw_P(char chr, const char* str, int16_t val);
@@ -295,43 +331,45 @@ template<>
 void menu_draw_P<uint8_t*>(char chr, const char* str, int16_t val)
 void menu_draw_P<uint8_t*>(char chr, const char* str, int16_t val)
 {
 {
     menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]);
     menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]);
-    int text_len = strlen_P(str);
-    if (text_len > 15) text_len = 15;
-    char spaces[21];
-    strcpy_P(spaces, menu_20x_space);
-    spaces[12 - text_len] = 0;
-    float factor = 1.0 + static_cast<float>(val) / 1000.0;
+    float factor = 1.0f + static_cast<float>(val) / 1000.0f;
     if (val <= _md->minEditValue)
     if (val <= _md->minEditValue)
     {
     {
-        lcd_printf_P(menu_fmt_float13off, chr, str, spaces);
-        lcd_puts_P(_i(" [off]"));
+        lcd_printf_P(menu_fmt_float13off, chr, str, " [off]");
     }
     }
     else
     else
     {
     {
-        lcd_printf_P(menu_fmt_float13, chr, str, spaces, factor);
+        lcd_printf_P(menu_fmt_float13, chr, str, factor);
     }
     }
 }
 }
 
 
-//draw up to 12 chars of text, ':' and float number in format +123.0
-void menu_draw_float31(char chr, const char* str, float val)
+//! @brief Draw up to 10 chars of text and a float number in format from +0.0 to +12345.0. The increased range is necessary
+//! for displaying large values of extruder positions, which caused text overflow in the previous implementation.
+//! 
+//! @param str string label to print
+//! @param val value to print aligned to the right side of the display  
+//! 
+//! Implementation comments:
+//! The text needs to come with a colon ":", this function does not append it anymore.
+//! That resulted in a much shorter implementation (234628B -> 234476B)
+//! There are similar functions around which may be shortened in a similar way
+void menu_draw_float31(const char* str, float val)
 {
 {
-	int text_len = strlen_P(str);
-	if (text_len > 12) text_len = 12;
-	char spaces[21];
-	strcpy_P(spaces, menu_20x_space);
-	spaces[12 - text_len] = 0;
-	lcd_printf_P(menu_fmt_float31, chr, str, spaces, val);
+	lcd_printf_P(menu_fmt_float31, str, val);	
 }
 }
 
 
-//draw up to 12 chars of text, ':' and float number in format +1.234
-void menu_draw_float13(char chr, const char* str, float val)
+//! @brief Draw up to 14 chars of text and a float number in format +1.234
+//! 
+//! @param str string label to print
+//! @param val value to print aligned to the right side of the display  
+//! 
+//! Implementation comments:
+//! This function uses similar optimization principles as menu_draw_float31
+//! (i.e. str must include a ':' at its end)
+//! FLASH usage dropped 234476B -> 234392B
+//! Moreover, this function gets inlined in the final code, so removing it doesn't really help ;)
+void menu_draw_float13(const char* str, float val)
 {
 {
-	int text_len = strlen_P(str);
-	if (text_len > 12) text_len = 12;
-	char spaces[21];
-	strcpy_P(spaces, menu_20x_space);
-	spaces[12 - text_len] = 0;
-	lcd_printf_P(menu_fmt_float13, chr, str, spaces, val);
+	lcd_printf_P(menu_fmt_float13, ' ', str, val);
 }
 }
 
 
 template <typename T>
 template <typename T>

+ 30 - 2
Firmware/menu.h

@@ -28,6 +28,27 @@ extern uint8_t menu_data[MENU_DATA_SIZE];
 
 
 extern uint8_t menu_depth;
 extern uint8_t menu_depth;
 
 
+//! definition of serious errors possibly blocking the main menu
+//! Use them as bit mask, so that the code may set various errors at the same time
+enum ESeriousErrors {
+	SERIOUS_ERR_NONE            = 0,
+	SERIOUS_ERR_MINTEMP_HEATER  = 0x01,
+	SERIOUS_ERR_MINTEMP_BED     = 0x02
+}; // and possibly others in the future.
+
+//! this is a flag for disabling entering the main menu. If this is set
+//! to anything != 0, the only the main status screen will be shown on the
+//! LCD and the user will be prevented from entering the menu.
+//! Now used only to block doing anything with the printer when there is
+//! the infamous MINTEMP error (SERIOUS_ERR_MINTEMP).
+extern uint8_t menu_block_entering_on_serious_errors;
+
+//! a pair of macros for manipulating the serious errors
+//! a c++ class would have been better
+#define menu_set_serious_error(x) menu_block_entering_on_serious_errors |= x;
+#define menu_unset_serious_error(x) menu_block_entering_on_serious_errors &= ~x;
+#define menu_is_serious_error(x) (menu_block_entering_on_serious_errors & x) != 0
+
 extern uint8_t menu_line;
 extern uint8_t menu_line;
 extern uint8_t menu_item;
 extern uint8_t menu_item;
 extern uint8_t menu_row;
 extern uint8_t menu_row;
@@ -81,9 +102,15 @@ extern uint8_t menu_item_submenu_P(const char* str, menu_func_t submenu);
 #define MENU_ITEM_BACK_P(str) do { if (menu_item_back_P(str)) return; } while (0)
 #define MENU_ITEM_BACK_P(str) do { if (menu_item_back_P(str)) return; } while (0)
 extern uint8_t menu_item_back_P(const char* str);
 extern uint8_t menu_item_back_P(const char* str);
 
 
+// leaving menu - this condition must be immediately before MENU_ITEM_BACK_P
+#define ON_MENU_LEAVE(func) do { if (((menu_item == menu_line) && menu_clicked && (lcd_encoder == menu_item)) || menu_leaving){ func } } while (0)
+
 #define MENU_ITEM_FUNCTION_P(str, func) do { if (menu_item_function_P(str, func)) return; } while (0)
 #define MENU_ITEM_FUNCTION_P(str, func) do { if (menu_item_function_P(str, func)) return; } while (0)
 extern uint8_t menu_item_function_P(const char* str, menu_func_t func);
 extern uint8_t menu_item_function_P(const char* str, menu_func_t func);
 
 
+#define MENU_ITEM_FUNCTION_NR_P(str, number, func, fn_par) do { if (menu_item_function_P(str, number, func, fn_par)) return; } while (0)
+extern uint8_t menu_item_function_P(const char* str, char number, void (*func)(uint8_t), uint8_t fn_par);
+
 #define MENU_ITEM_GCODE_P(str, str_gcode) do { if (menu_item_gcode_P(str, str_gcode)) return; } while (0)
 #define MENU_ITEM_GCODE_P(str, str_gcode) do { if (menu_item_gcode_P(str, str_gcode)) return; } while (0)
 extern uint8_t menu_item_gcode_P(const char* str, const char* str_gcode);
 extern uint8_t menu_item_gcode_P(const char* str, const char* str_gcode);
 
 
@@ -91,11 +118,12 @@ extern uint8_t menu_item_gcode_P(const char* str, const char* str_gcode);
 extern const char menu_fmt_int3[];
 extern const char menu_fmt_int3[];
 
 
 extern const char menu_fmt_float31[];
 extern const char menu_fmt_float31[];
+extern const char menu_fmt_float13[];
 
 
 
 
-extern void menu_draw_float31(char chr, const char* str, float val);
+extern void menu_draw_float31(const char* str, float val);
 
 
-extern void menu_draw_float13(char chr, const char* str, float val);
+extern void menu_draw_float13(const char* str, float val);
 
 
 
 
 #define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) do { if (menu_item_edit_P(str, pval, minval, maxval)) return; } while (0)
 #define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) do { if (menu_item_edit_P(str, pval, minval, maxval)) return; } while (0)

+ 3 - 3
Firmware/mesh_bed_calibration.cpp

@@ -2239,7 +2239,7 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level
 		lcd_puts_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2));
 		lcd_puts_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2));
 
 
 		if (iteration > 0) {
 		if (iteration > 0) {
-			lcd_puts_at_P(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
 			lcd_print(int(iteration + 1));
 			lcd_print(int(iteration + 1));
 		}
 		}
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
@@ -2500,7 +2500,7 @@ BedSkewOffsetDetectionResultType improve_bed_offset_and_skew(int8_t method, int8
 
 
 #ifdef MESH_BED_CALIBRATION_SHOW_LCD
 #ifdef MESH_BED_CALIBRATION_SHOW_LCD
     uint8_t next_line;
     uint8_t next_line;
-    lcd_display_message_fullscreen_P(_i("Improving bed calibration point"), next_line);////MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
+    lcd_display_message_fullscreen_P(_i("Improving bed calibration point"), next_line);////MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60
     if (next_line > 3)
     if (next_line > 3)
         next_line = 3;
         next_line = 3;
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
@@ -2514,7 +2514,7 @@ BedSkewOffsetDetectionResultType improve_bed_offset_and_skew(int8_t method, int8
 #ifdef MESH_BED_CALIBRATION_SHOW_LCD
 #ifdef MESH_BED_CALIBRATION_SHOW_LCD
         lcd_set_cursor(0, next_line);
         lcd_set_cursor(0, next_line);
 		lcd_print(mesh_point+1);
 		lcd_print(mesh_point+1);
-        lcd_puts_P(_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
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
 
 
         // Move up.
         // Move up.

+ 83 - 81
Firmware/messages.c

@@ -8,119 +8,121 @@
 #include "Configuration_prusa.h"
 #include "Configuration_prusa.h"
 
 
 //internationalized messages
 //internationalized messages
-const char MSG_AUTO_HOME[] PROGMEM_I1 = ISTR("Auto home"); ////c=0 r=0
-const char MSG_AUTO_MODE_ON[] PROGMEM_I1 = ISTR("Mode [auto power]"); ////c=0 r=0
-const char MSG_BABYSTEP_Z[] PROGMEM_I1 = ISTR("Live adjust Z"); ////c=0 r=0
+const char MSG_AUTO_HOME[] PROGMEM_I1 = ISTR("Auto home"); ////
+const char MSG_AUTO_MODE_ON[] PROGMEM_I1 = ISTR("Mode [auto power]"); ////
+const char MSG_BABYSTEP_Z[] PROGMEM_I1 = ISTR("Live adjust Z"); ////
 const char MSG_BABYSTEP_Z_NOT_SET[] PROGMEM_I1 = ISTR("Distance between tip of the nozzle and the bed surface has not been set yet. Please follow the manual, chapter First steps, section First layer calibration."); ////c=20 r=12
 const char MSG_BABYSTEP_Z_NOT_SET[] PROGMEM_I1 = ISTR("Distance between tip of the nozzle and the bed surface has not been set yet. Please follow the manual, chapter First steps, section First layer calibration."); ////c=20 r=12
-const char MSG_BED[] PROGMEM_I1 = ISTR("Bed"); ////c=0 r=0
-const char MSG_BED_DONE[] PROGMEM_I1 = ISTR("Bed done"); ////c=0 r=0
-const char MSG_BED_HEATING[] PROGMEM_I1 = ISTR("Bed Heating"); ////c=0 r=0
+const char MSG_BED[] PROGMEM_I1 = ISTR("Bed"); ////
+const char MSG_BED_DONE[] PROGMEM_I1 = ISTR("Bed done"); ////
+const char MSG_BED_HEATING[] PROGMEM_I1 = ISTR("Bed Heating"); ////
 const char MSG_BED_LEVELING_FAILED_POINT_LOW[] PROGMEM_I1 = ISTR("Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."); ////c=20 r=4
 const char MSG_BED_LEVELING_FAILED_POINT_LOW[] PROGMEM_I1 = ISTR("Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."); ////c=20 r=4
 const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED[] PROGMEM_I1 = ISTR("XYZ calibration failed. Please consult the manual."); ////c=20 r=8
 const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED[] PROGMEM_I1 = ISTR("XYZ calibration failed. Please consult the manual."); ////c=20 r=8
 const char MSG_CALIBRATE_Z_AUTO[] PROGMEM_I1 = ISTR("Calibrating Z"); ////c=20 r=2
 const char MSG_CALIBRATE_Z_AUTO[] PROGMEM_I1 = ISTR("Calibrating Z"); ////c=20 r=2
-const char MSG_CARD_MENU[] PROGMEM_I1 = ISTR("Print from SD"); ////c=0 r=0
+const char MSG_CARD_MENU[] PROGMEM_I1 = ISTR("Print from SD"); ////
 const char MSG_CONFIRM_NOZZLE_CLEAN[] PROGMEM_I1 = ISTR("Please clean the nozzle for calibration. Click when done."); ////c=20 r=8
 const char MSG_CONFIRM_NOZZLE_CLEAN[] PROGMEM_I1 = ISTR("Please clean the nozzle for calibration. Click when done."); ////c=20 r=8
-const char MSG_COOLDOWN[] PROGMEM_I1 = ISTR("Cooldown"); ////c=0 r=0
+const char MSG_COOLDOWN[] PROGMEM_I1 = ISTR("Cooldown"); ////
 const char MSG_CRASH_DETECTED[] PROGMEM_I1 = ISTR("Crash detected."); ////c=20 r=1
 const char MSG_CRASH_DETECTED[] PROGMEM_I1 = ISTR("Crash detected."); ////c=20 r=1
-const char MSG_CRASHDETECT_NA[] PROGMEM_I1 = ISTR("Crash det.  [N/A]"); ////c=0 r=0
-const char MSG_CRASHDETECT_OFF[] PROGMEM_I1 = ISTR("Crash det.  [off]"); ////c=0 r=0
-const char MSG_CRASHDETECT_ON[] PROGMEM_I1 = ISTR("Crash det.   [on]"); ////c=0 r=0
-const char MSG_ERROR[] PROGMEM_I1 = ISTR("ERROR:"); ////c=0 r=0
+const char MSG_CRASHDETECT_NA[] PROGMEM_I1 = ISTR("Crash det.  [N/A]"); ////
+const char MSG_CRASHDETECT_OFF[] PROGMEM_I1 = ISTR("Crash det.  [off]"); ////
+const char MSG_CRASHDETECT_ON[] PROGMEM_I1 = ISTR("Crash det.   [on]"); ////
+const char MSG_ERROR[] PROGMEM_I1 = ISTR("ERROR:"); ////
 const char MSG_EXTRUDER[] PROGMEM_I1 = ISTR("Extruder"); ////c=17 r=1
 const char MSG_EXTRUDER[] PROGMEM_I1 = ISTR("Extruder"); ////c=17 r=1
 const char MSG_FILAMENT[] PROGMEM_I1 = ISTR("Filament"); ////c=17 r=1
 const char MSG_FILAMENT[] PROGMEM_I1 = ISTR("Filament"); ////c=17 r=1
-const char MSG_FAN_SPEED[] PROGMEM_I1 = ISTR("Fan speed"); ////c=14 r=0
+const char MSG_FAN_SPEED[] PROGMEM_I1 = ISTR("Fan speed"); ////c=14
 const char MSG_FILAMENT_CLEAN[] PROGMEM_I1 = ISTR("Filament extruding & with correct color?"); ////c=20 r=2
 const char MSG_FILAMENT_CLEAN[] PROGMEM_I1 = ISTR("Filament extruding & with correct color?"); ////c=20 r=2
 const char MSG_FILAMENT_LOADING_T0[] PROGMEM_I1 = ISTR("Insert filament into extruder 1. Click when done."); ////c=20 r=4
 const char MSG_FILAMENT_LOADING_T0[] PROGMEM_I1 = ISTR("Insert filament into extruder 1. Click when done."); ////c=20 r=4
 const char MSG_FILAMENT_LOADING_T1[] PROGMEM_I1 = ISTR("Insert filament into extruder 2. Click when done."); ////c=20 r=4
 const char MSG_FILAMENT_LOADING_T1[] PROGMEM_I1 = ISTR("Insert filament into extruder 2. Click when done."); ////c=20 r=4
 const char MSG_FILAMENT_LOADING_T2[] PROGMEM_I1 = ISTR("Insert filament into extruder 3. Click when done."); ////c=20 r=4
 const char MSG_FILAMENT_LOADING_T2[] PROGMEM_I1 = ISTR("Insert filament into extruder 3. Click when done."); ////c=20 r=4
 const char MSG_FILAMENT_LOADING_T3[] PROGMEM_I1 = ISTR("Insert filament into extruder 4. Click when done."); ////c=20 r=4
 const char MSG_FILAMENT_LOADING_T3[] PROGMEM_I1 = ISTR("Insert filament into extruder 4. Click when done."); ////c=20 r=4
-const char MSG_FILAMENTCHANGE[] PROGMEM_I1 = ISTR("Change filament"); ////c=0 r=0
-const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1[] PROGMEM_I1 = ISTR("Searching bed calibration point"); ////c=60 r=0
-const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2[] PROGMEM_I1 = ISTR(" of 4"); ////c=14 r=0
+const char MSG_FILAMENTCHANGE[] PROGMEM_I1 = ISTR("Change filament"); ////
+const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1[] PROGMEM_I1 = ISTR("Searching bed calibration point"); ////c=60
+const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2[] PROGMEM_I1 = ISTR(" of 4"); ////c=14
 const char MSG_FINISHING_MOVEMENTS[] PROGMEM_I1 = ISTR("Finishing movements"); ////c=20 r=1
 const char MSG_FINISHING_MOVEMENTS[] PROGMEM_I1 = ISTR("Finishing movements"); ////c=20 r=1
 const char MSG_FOLLOW_CALIBRATION_FLOW[] PROGMEM_I1 = ISTR("Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."); ////c=20 r=8
 const char MSG_FOLLOW_CALIBRATION_FLOW[] PROGMEM_I1 = ISTR("Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."); ////c=20 r=8
 const char MSG_FOLLOW_Z_CALIBRATION_FLOW[] PROGMEM_I1 = ISTR("There is still a need to make Z calibration. Please follow the manual, chapter First steps, section Calibration flow."); ////c=20 r=8
 const char MSG_FOLLOW_Z_CALIBRATION_FLOW[] PROGMEM_I1 = ISTR("There is still a need to make Z calibration. Please follow the manual, chapter First steps, section Calibration flow."); ////c=20 r=8
 const char MSG_FSENS_AUTOLOAD_NA[] PROGMEM_I1 = ISTR("F. autoload [N/A]"); ////c=17 r=1
 const char MSG_FSENS_AUTOLOAD_NA[] PROGMEM_I1 = ISTR("F. autoload [N/A]"); ////c=17 r=1
-const char MSG_FSENSOR_OFF[] PROGMEM_I1 = ISTR("Fil. sensor [off]"); ////c=0 r=0
-const char MSG_FSENSOR_ON[] PROGMEM_I1 = ISTR("Fil. sensor  [on]"); ////c=0 r=0
-const char MSG_HEATING[] PROGMEM_I1 = ISTR("Heating"); ////c=0 r=0
-const char MSG_HEATING_COMPLETE[] PROGMEM_I1 = ISTR("Heating done."); ////c=20 r=0
-const char MSG_HOMEYZ[] PROGMEM_I1 = ISTR("Calibrate Z"); ////c=0 r=0
+const char MSG_FSENSOR_OFF[] PROGMEM_I1 = ISTR("Fil. sensor [off]"); ////
+const char MSG_FSENSOR_ON[] PROGMEM_I1 = ISTR("Fil. sensor  [on]"); ////
+const char MSG_HEATING[] PROGMEM_I1 = ISTR("Heating"); ////
+const char MSG_HEATING_COMPLETE[] PROGMEM_I1 = ISTR("Heating done."); ////c=20
+const char MSG_HOMEYZ[] PROGMEM_I1 = ISTR("Calibrate Z"); ////
 const char MSG_CHOOSE_EXTRUDER[] PROGMEM_I1 = ISTR("Choose extruder:"); ////c=20 r=1
 const char MSG_CHOOSE_EXTRUDER[] PROGMEM_I1 = ISTR("Choose extruder:"); ////c=20 r=1
 const char MSG_CHOOSE_FILAMENT[] PROGMEM_I1 = ISTR("Choose filament:"); ////c=20 r=1
 const char MSG_CHOOSE_FILAMENT[] PROGMEM_I1 = ISTR("Choose filament:"); ////c=20 r=1
-const char MSG_LOAD_FILAMENT[] PROGMEM_I1 = ISTR("Load filament"); ////c=17 r=0
-const char MSG_LOADING_FILAMENT[] PROGMEM_I1 = ISTR("Loading filament"); ////c=20 r=0
+const char MSG_LOAD_FILAMENT[] PROGMEM_I1 = ISTR("Load filament"); //// Number 1 to 5 is added behind text e.g. "Load filament 1" c=16
+const char MSG_LOADING_FILAMENT[] PROGMEM_I1 = ISTR("Loading filament"); ////c=20
+const char MSG_EJECT_FILAMENT[] PROGMEM_I1 = ISTR("Eject filament"); //// Number 1 to 5 is added behind text e.g. "Eject filament 1" c=16
+const char MSG_CUT_FILAMENT[] PROGMEM_I1 = ISTR("Cut filament"); //// Number 1 to 5 is added behind text e.g. "Cut filament 1" c=16
 const char MSG_M117_V2_CALIBRATION[] PROGMEM_I1 = ISTR("M117 First layer cal."); ////c=25 r=1
 const char MSG_M117_V2_CALIBRATION[] PROGMEM_I1 = ISTR("M117 First layer cal."); ////c=25 r=1
-const char MSG_MAIN[] PROGMEM_I1 = ISTR("Main"); ////c=0 r=0
-const char MSG_BACK[] PROGMEM_I1 = ISTR("Back"); ////c=0 r=0
-const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1[] PROGMEM_I1 = ISTR("Measuring reference height of calibration point"); ////c=60 r=0
-const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2[] PROGMEM_I1 = ISTR(" of 9"); ////c=14 r=0
-const char MSG_MENU_CALIBRATION[] PROGMEM_I1 = ISTR("Calibration"); ////c=0 r=0
-const char MSG_NO[] PROGMEM_I1 = ISTR("No"); ////c=0 r=0
-const char MSG_NOZZLE[] PROGMEM_I1 = ISTR("Nozzle"); ////c=0 r=0
+const char MSG_MAIN[] PROGMEM_I1 = ISTR("Main"); ////
+const char MSG_BACK[] PROGMEM_I1 = ISTR("Back"); ////
+const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1[] PROGMEM_I1 = ISTR("Measuring reference height of calibration point"); ////c=60
+const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2[] PROGMEM_I1 = ISTR(" of 9"); ////c=14
+const char MSG_MENU_CALIBRATION[] PROGMEM_I1 = ISTR("Calibration"); ////
+const char MSG_NO[] PROGMEM_I1 = ISTR("No"); ////
+const char MSG_NOZZLE[] PROGMEM_I1 = ISTR("Nozzle"); ////
 const char MSG_PAPER[] PROGMEM_I1 = ISTR("Place a sheet of paper under the nozzle during the calibration of first 4 points. If the nozzle catches the paper, power off the printer immediately."); ////c=20 r=8
 const char MSG_PAPER[] PROGMEM_I1 = ISTR("Place a sheet of paper under the nozzle during the calibration of first 4 points. If the nozzle catches the paper, power off the printer immediately."); ////c=20 r=8
 const char MSG_PLACE_STEEL_SHEET[] PROGMEM_I1 = ISTR("Please place steel sheet on heatbed."); ////c=20 r=4
 const char MSG_PLACE_STEEL_SHEET[] PROGMEM_I1 = ISTR("Please place steel sheet on heatbed."); ////c=20 r=4
-const char MSG_PLEASE_WAIT[] PROGMEM_I1 = ISTR("Please wait"); ////c=20 r=0
-const char MSG_PREHEAT_NOZZLE[] PROGMEM_I1 = ISTR("Preheat the nozzle!"); ////c=20 r=0
+const char MSG_PLEASE_WAIT[] PROGMEM_I1 = ISTR("Please wait"); ////c=20
+const char MSG_PREHEAT_NOZZLE[] PROGMEM_I1 = ISTR("Preheat the nozzle!"); ////c=20
 const char MSG_PRESS_TO_UNLOAD[] PROGMEM_I1 = ISTR("Please press the knob to unload filament"); ////c=20 r=4
 const char MSG_PRESS_TO_UNLOAD[] PROGMEM_I1 = ISTR("Please press the knob to unload filament"); ////c=20 r=4
-const char MSG_PRINT_ABORTED[] PROGMEM_I1 = ISTR("Print aborted"); ////c=20 r=0
+const char MSG_PRINT_ABORTED[] PROGMEM_I1 = ISTR("Print aborted"); ////c=20
 const char MSG_PULL_OUT_FILAMENT[] PROGMEM_I1 = ISTR("Please pull out filament immediately"); ////c=20 r=4
 const char MSG_PULL_OUT_FILAMENT[] PROGMEM_I1 = ISTR("Please pull out filament immediately"); ////c=20 r=4
 const char MSG_RECOVER_PRINT[] PROGMEM_I1 = ISTR("Blackout occurred. Recover print?"); ////c=20 r=2
 const char MSG_RECOVER_PRINT[] PROGMEM_I1 = ISTR("Blackout occurred. Recover print?"); ////c=20 r=2
-const char MSG_REFRESH[] PROGMEM_I1 = ISTR("\xF8" "Refresh"); ////c=0 r=0
-const char MSG_RESUMING_PRINT[] PROGMEM_I1 = ISTR("Resuming print"); ////c=0 r=0
+const char MSG_REFRESH[] PROGMEM_I1 = ISTR("\xF8" "Refresh"); ////
+const char MSG_RESUMING_PRINT[] PROGMEM_I1 = ISTR("Resuming print"); ////
 const char MSG_REMOVE_STEEL_SHEET[] PROGMEM_I1 = ISTR("Please remove steel sheet from heatbed."); ////c=20 r=4
 const char MSG_REMOVE_STEEL_SHEET[] PROGMEM_I1 = ISTR("Please remove steel sheet from heatbed."); ////c=20 r=4
-const char MSG_SELFTEST_COOLING_FAN[] PROGMEM_I1 = ISTR("Front print fan?"); ////c=20 r=0
-const char MSG_SELFTEST_EXTRUDER_FAN[] PROGMEM_I1 = ISTR("Left hotend fan?"); ////c=20 r=0
-const char MSG_SELFTEST_FAILED[] PROGMEM_I1 = ISTR("Selftest failed  "); ////c=20 r=0
-const char MSG_SELFTEST_FAN[] PROGMEM_I1 = ISTR("Fan test"); ////c=20 r=0
-const char MSG_SELFTEST_FAN_NO[] PROGMEM_I1 = ISTR("Not spinning"); ////c=19 r=0
-const char MSG_SELFTEST_FAN_YES[] PROGMEM_I1 = ISTR("Spinning"); ////c=19 r=0
-const char MSG_SELFTEST_CHECK_BED[] PROGMEM_I1 = ISTR("Checking bed     "); ////c=20 r=0
-const char MSG_SELFTEST_CHECK_FSENSOR[] PROGMEM_I1 = ISTR("Checking sensors "); ////c=20 r=0
-const char MSG_SELFTEST_MOTOR[] PROGMEM_I1 = ISTR("Motor"); ////c=0 r=0
-const char MSG_SELFTEST_FILAMENT_SENSOR[] PROGMEM_I1 = ISTR("Filament sensor"); ////c=17 r=0
-const char MSG_SELFTEST_WIRINGERROR[] PROGMEM_I1 = ISTR("Wiring error"); ////c=0 r=0
-const char MSG_SETTINGS[] PROGMEM_I1 = ISTR("Settings"); ////c=0 r=0
-const char MSG_SILENT_MODE_OFF[] PROGMEM_I1 = ISTR("Mode [high power]"); ////c=0 r=0
-const char MSG_SILENT_MODE_ON[] PROGMEM_I1 = ISTR("Mode     [silent]"); ////c=0 r=0
-const char MSG_STEALTH_MODE_OFF[] PROGMEM_I1 = ISTR("Mode     [Normal]"); ////c=0 r=0
-const char MSG_STEALTH_MODE_ON[] PROGMEM_I1 = ISTR("Mode    [Stealth]"); ////c=0 r=0
+const char MSG_SELFTEST_COOLING_FAN[] PROGMEM_I1 = ISTR("Front print fan?"); ////c=20
+const char MSG_SELFTEST_EXTRUDER_FAN[] PROGMEM_I1 = ISTR("Left hotend fan?"); ////c=20
+const char MSG_SELFTEST_FAILED[] PROGMEM_I1 = ISTR("Selftest failed  "); ////c=20
+const char MSG_SELFTEST_FAN[] PROGMEM_I1 = ISTR("Fan test"); ////c=20
+const char MSG_SELFTEST_FAN_NO[] PROGMEM_I1 = ISTR("Not spinning"); ////c=19
+const char MSG_SELFTEST_FAN_YES[] PROGMEM_I1 = ISTR("Spinning"); ////c=19
+const char MSG_SELFTEST_CHECK_BED[] PROGMEM_I1 = ISTR("Checking bed     "); ////c=20
+const char MSG_SELFTEST_CHECK_FSENSOR[] PROGMEM_I1 = ISTR("Checking sensors "); ////c=20
+const char MSG_SELFTEST_MOTOR[] PROGMEM_I1 = ISTR("Motor"); ////
+const char MSG_SELFTEST_FILAMENT_SENSOR[] PROGMEM_I1 = ISTR("Filament sensor"); ////c=17
+const char MSG_SELFTEST_WIRINGERROR[] PROGMEM_I1 = ISTR("Wiring error"); ////
+const char MSG_SETTINGS[] PROGMEM_I1 = ISTR("Settings"); ////
+const char MSG_SILENT_MODE_OFF[] PROGMEM_I1 = ISTR("Mode [high power]"); ////
+const char MSG_SILENT_MODE_ON[] PROGMEM_I1 = ISTR("Mode     [silent]"); ////
+const char MSG_STEALTH_MODE_OFF[] PROGMEM_I1 = ISTR("Mode     [Normal]"); ////
+const char MSG_STEALTH_MODE_ON[] PROGMEM_I1 = ISTR("Mode    [Stealth]"); ////
 const char MSG_STEEL_SHEET_CHECK[] PROGMEM_I1 = ISTR("Is steel sheet on heatbed?"); ////c=20 r=2
 const char MSG_STEEL_SHEET_CHECK[] PROGMEM_I1 = ISTR("Is steel sheet on heatbed?"); ////c=20 r=2
-const char MSG_STOP_PRINT[] PROGMEM_I1 = ISTR("Stop print"); ////c=0 r=0
-const char MSG_STOPPED[] PROGMEM_I1 = ISTR("STOPPED. "); ////c=0 r=0
+const char MSG_STOP_PRINT[] PROGMEM_I1 = ISTR("Stop print"); ////
+const char MSG_STOPPED[] PROGMEM_I1 = ISTR("STOPPED. "); ////
 const char MSG_TEMP_CALIBRATION[] PROGMEM_I1 = ISTR("Temp. cal.          "); ////c=20 r=1
 const char MSG_TEMP_CALIBRATION[] PROGMEM_I1 = ISTR("Temp. cal.          "); ////c=20 r=1
 const char MSG_TEMP_CALIBRATION_DONE[] PROGMEM_I1 = ISTR("Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."); ////c=20 r=12
 const char MSG_TEMP_CALIBRATION_DONE[] PROGMEM_I1 = ISTR("Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."); ////c=20 r=12
-const char MSG_UNLOAD_FILAMENT[] PROGMEM_I1 = ISTR("Unload filament"); ////c=17 r=0
+const char MSG_UNLOAD_FILAMENT[] PROGMEM_I1 = ISTR("Unload filament"); ////c=17
 const char MSG_UNLOADING_FILAMENT[] PROGMEM_I1 = ISTR("Unloading filament"); ////c=20 r=1
 const char MSG_UNLOADING_FILAMENT[] PROGMEM_I1 = ISTR("Unloading filament"); ////c=20 r=1
-const char MSG_WATCH[] PROGMEM_I1 = ISTR("Info screen"); ////c=0 r=0
+const char MSG_WATCH[] PROGMEM_I1 = ISTR("Info screen"); ////
 const char MSG_WIZARD_CALIBRATION_FAILED[] PROGMEM_I1 = ISTR("Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."); ////c=20 r=8
 const char MSG_WIZARD_CALIBRATION_FAILED[] PROGMEM_I1 = ISTR("Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."); ////c=20 r=8
 const char MSG_WIZARD_DONE[] PROGMEM_I1 = ISTR("All is done. Happy printing!"); ////c=20 r=8
 const char MSG_WIZARD_DONE[] PROGMEM_I1 = ISTR("All is done. Happy printing!"); ////c=20 r=8
 const char MSG_WIZARD_HEATING[] PROGMEM_I1 = ISTR("Preheating nozzle. Please wait."); ////c=20 r=3
 const char MSG_WIZARD_HEATING[] PROGMEM_I1 = ISTR("Preheating nozzle. Please wait."); ////c=20 r=3
 const char MSG_WIZARD_QUIT[] PROGMEM_I1 = ISTR("You can always resume the Wizard from Calibration -> Wizard."); ////c=20 r=8
 const char MSG_WIZARD_QUIT[] PROGMEM_I1 = ISTR("You can always resume the Wizard from Calibration -> Wizard."); ////c=20 r=8
-const char MSG_YES[] PROGMEM_I1 = ISTR("Yes"); ////c=0 r=0
-const char WELCOME_MSG[] PROGMEM_I1 = ISTR(CUSTOM_MENDEL_NAME " OK."); ////c=20 r=0
+const char MSG_YES[] PROGMEM_I1 = ISTR("Yes"); ////
+const char WELCOME_MSG[] PROGMEM_I1 = ISTR(CUSTOM_MENDEL_NAME " OK."); ////c=20
 //not internationalized messages
 //not internationalized messages
-const char MSG_SD_WORKDIR_FAIL[] PROGMEM_N1 = "workDir open failed"; ////c=0 r=0
-const char MSG_BROWNOUT_RESET[] PROGMEM_N1 = " Brown out Reset"; ////c=0 r=0
-const char MSG_EXTERNAL_RESET[] PROGMEM_N1 = " External Reset"; ////c=0 r=0
-const char MSG_FILE_SAVED[] PROGMEM_N1 = "Done saving file."; ////c=0 r=0
-const char MSG_OFF[] PROGMEM_N1 = "Off"; ////c=0 r=0
-const char MSG_ON[] PROGMEM_N1 = "On "; ////c=0 r=0
-const char MSG_POSITION_UNKNOWN[] PROGMEM_N1 = "Home X/Y before Z"; ////c=0 r=0
-const char MSG_SOFTWARE_RESET[] PROGMEM_N1 = " Software Reset"; ////c=0 r=0
-const char MSG_UNKNOWN_COMMAND[] PROGMEM_N1 = "Unknown command: \""; ////c=0 r=0
-const char MSG_WATCHDOG_RESET[] PROGMEM_N1 = " Watchdog Reset"; ////c=0 r=0
-const char MSG_Z_MAX[] PROGMEM_N1 = "z_max: "; ////c=0 r=0
-const char MSG_Z_MIN[] PROGMEM_N1 = "z_min: "; ////c=0 r=0
-const char MSG_ZPROBE_OUT[] PROGMEM_N1 = "Z probe out. bed"; ////c=0 r=0
-const char MSG_ZPROBE_ZOFFSET[] PROGMEM_N1 = "Z Offset"; ////c=0 r=0
-const char MSG_TMC_OVERTEMP[] PROGMEM_N1 = "TMC DRIVER OVERTEMP"; ////c=0 r=0
-const char MSG_Enqueing[] PROGMEM_N1 = "enqueing \""; ////c=0 r=0
-const char MSG_ENDSTOPS_HIT[] PROGMEM_N1 = "endstops hit: "; ////c=0 r=0
-const char MSG_SD_ERR_WRITE_TO_FILE[] PROGMEM_N1 = "error writing to file"; ////c=0 r=0
-const char MSG_OK[] PROGMEM_N1 = "ok"; ////c=0 r=0
-const char MSG_SD_OPEN_FILE_FAIL[] PROGMEM_N1 = "open failed, File: "; ////c=0 r=0
-const char MSG_ENDSTOP_OPEN[] PROGMEM_N1 = "open"; ////c=0 r=0
-const char MSG_POWERUP[] PROGMEM_N1 = "PowerUp"; ////c=0 r=0
-const char MSG_ERR_STOPPED[] PROGMEM_N1 = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; ////c=0 r=0
-const char MSG_ENDSTOP_HIT[] PROGMEM_N1 = "TRIGGERED"; ////c=0 r=0
+const char MSG_SD_WORKDIR_FAIL[] PROGMEM_N1 = "workDir open failed"; ////
+const char MSG_BROWNOUT_RESET[] PROGMEM_N1 = " Brown out Reset"; ////
+const char MSG_EXTERNAL_RESET[] PROGMEM_N1 = " External Reset"; ////
+const char MSG_FILE_SAVED[] PROGMEM_N1 = "Done saving file."; ////
+const char MSG_OFF[] PROGMEM_N1 = "Off"; ////
+const char MSG_ON[] PROGMEM_N1 = "On "; ////
+const char MSG_POSITION_UNKNOWN[] PROGMEM_N1 = "Home X/Y before Z"; ////
+const char MSG_SOFTWARE_RESET[] PROGMEM_N1 = " Software Reset"; ////
+const char MSG_UNKNOWN_COMMAND[] PROGMEM_N1 = "Unknown command: \""; ////
+const char MSG_WATCHDOG_RESET[] PROGMEM_N1 = " Watchdog Reset"; ////
+const char MSG_Z_MAX[] PROGMEM_N1 = "z_max: "; ////
+const char MSG_Z_MIN[] PROGMEM_N1 = "z_min: "; ////
+const char MSG_ZPROBE_OUT[] PROGMEM_N1 = "Z probe out. bed"; ////
+const char MSG_ZPROBE_ZOFFSET[] PROGMEM_N1 = "Z Offset"; ////
+const char MSG_TMC_OVERTEMP[] PROGMEM_N1 = "TMC DRIVER OVERTEMP"; ////
+const char MSG_Enqueing[] PROGMEM_N1 = "enqueing \""; ////
+const char MSG_ENDSTOPS_HIT[] PROGMEM_N1 = "endstops hit: "; ////
+const char MSG_SD_ERR_WRITE_TO_FILE[] PROGMEM_N1 = "error writing to file"; ////
+const char MSG_OK[] PROGMEM_N1 = "ok"; ////
+const char MSG_SD_OPEN_FILE_FAIL[] PROGMEM_N1 = "open failed, File: "; ////
+const char MSG_ENDSTOP_OPEN[] PROGMEM_N1 = "open"; ////
+const char MSG_POWERUP[] PROGMEM_N1 = "PowerUp"; ////
+const char MSG_ERR_STOPPED[] PROGMEM_N1 = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; ////
+const char MSG_ENDSTOP_HIT[] PROGMEM_N1 = "TRIGGERED"; ////

+ 2 - 0
Firmware/messages.h

@@ -125,6 +125,8 @@ extern const char MSG_ENDSTOP_OPEN[];
 extern const char MSG_POWERUP[];
 extern const char MSG_POWERUP[];
 extern const char MSG_ERR_STOPPED[];
 extern const char MSG_ERR_STOPPED[];
 extern const char MSG_ENDSTOP_HIT[];
 extern const char MSG_ENDSTOP_HIT[];
+extern const char MSG_EJECT_FILAMENT[];
+extern const char MSG_CUT_FILAMENT[];
 
 
 #if defined(__cplusplus)
 #if defined(__cplusplus)
 }
 }

+ 128 - 73
Firmware/mmu.cpp

@@ -679,6 +679,7 @@ void manage_response(bool move_axes, bool turn_off_nozzle, uint8_t move)
 				  st_synchronize();
 				  st_synchronize();
 				  mmu_print_saved = true;
 				  mmu_print_saved = true;
 				  printf_P(PSTR("MMU not responding\n"));
 				  printf_P(PSTR("MMU not responding\n"));
+				  KEEPALIVE_STATE(PAUSED_FOR_USER);
 				  hotend_temp_bckp = degTargetHotend(active_extruder);
 				  hotend_temp_bckp = degTargetHotend(active_extruder);
 				  if (move_axes) {
 				  if (move_axes) {
 					  z_position_bckp = current_position[Z_AXIS];
 					  z_position_bckp = current_position[Z_AXIS];
@@ -735,6 +736,7 @@ void manage_response(bool move_axes, bool turn_off_nozzle, uint8_t move)
 		  }
 		  }
 		  else if (mmu_print_saved) {
 		  else if (mmu_print_saved) {
 			  printf_P(PSTR("MMU starts responding\n"));
 			  printf_P(PSTR("MMU starts responding\n"));
+			  KEEPALIVE_STATE(IN_HANDLER);
 			  mmu_loading_flag = false;
 			  mmu_loading_flag = false;
 			  if (turn_off_nozzle) 
 			  if (turn_off_nozzle) 
 			  {
 			  {
@@ -878,7 +880,7 @@ void mmu_M600_load_filament(bool automatic, float nozzle_temp)
     mmu_command(MmuCmd::T0 + tmp_extruder);
     mmu_command(MmuCmd::T0 + tmp_extruder);
 
 
     manage_response(false, true, MMU_LOAD_MOVE);
     manage_response(false, true, MMU_LOAD_MOVE);
-    mmu_continue_loading();
+    mmu_continue_loading(is_usb_printing);
     mmu_extruder = tmp_extruder; //filament change is finished
     mmu_extruder = tmp_extruder; //filament change is finished
 
 
     mmu_load_to_nozzle();
     mmu_load_to_nozzle();
@@ -963,7 +965,7 @@ void display_loading()
 	}
 	}
 }
 }
 
 
-void extr_adj(int extruder) //loading filament for SNMM
+void extr_adj(uint8_t extruder) //loading filament for SNMM
 {
 {
 #ifndef SNMM
 #ifndef SNMM
     MmuCmd cmd = MmuCmd::L0 + extruder;
     MmuCmd cmd = MmuCmd::L0 + extruder;
@@ -1074,7 +1076,7 @@ if(0)
      extr_unload();
      extr_unload();
      }
      }
 else	{
 else	{
-     eFilamentAction=e_FILAMENT_ACTION_mmuUnLoad;
+     eFilamentAction=FilamentAction::MmuUnLoad;
      bFilamentFirstRun=false;
      bFilamentFirstRun=false;
      if(target_temperature[0]>=EXTRUDE_MINTEMP)
      if(target_temperature[0]>=EXTRUDE_MINTEMP)
           {
           {
@@ -1351,40 +1353,43 @@ void mmu_show_warning()
 
 
 void lcd_mmu_load_to_nozzle(uint8_t filament_nr)
 void lcd_mmu_load_to_nozzle(uint8_t filament_nr)
 {
 {
-//-//
-bFilamentAction=false;                            // NOT in "mmu_load_to_nozzle_menu()"
-  if (degHotend0() > EXTRUDE_MINTEMP)
-  {
-	tmp_extruder = filament_nr;
-	lcd_update_enable(false);
-	lcd_clear();
-	lcd_set_cursor(0, 1); lcd_puts_P(_T(MSG_LOADING_FILAMENT));
-	lcd_print(" ");
-	lcd_print(tmp_extruder + 1);
-	mmu_command(MmuCmd::T0 + tmp_extruder);
-	manage_response(true, true, MMU_TCODE_MOVE);
-	mmu_continue_loading();
-	mmu_extruder = tmp_extruder; //filament change is finished
-	mmu_load_to_nozzle();
-	load_filament_final_feed();
-	st_synchronize();
-	custom_message_type = CUSTOM_MSG_TYPE_F_LOAD;
-	lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT));
-	lcd_return_to_status();
-	lcd_update_enable(true);	
-	lcd_load_filament_color_check();
-	lcd_setstatuspgm(_T(WELCOME_MSG));
-	custom_message_type = CUSTOM_MSG_TYPE_STATUS;
-  }
-  else
-  {
-	  show_preheat_nozzle_warning();
-  }
+    menu_back();
+    bFilamentAction = false;                            // NOT in "mmu_load_to_nozzle_menu()"
+    if (degHotend0() > EXTRUDE_MINTEMP)
+    {
+        tmp_extruder = filament_nr;
+        lcd_update_enable(false);
+        lcd_clear();
+        lcd_set_cursor(0, 1);
+        lcd_puts_P(_T(MSG_LOADING_FILAMENT));
+        lcd_print(" ");
+        lcd_print(tmp_extruder + 1);
+        mmu_command(MmuCmd::T0 + tmp_extruder);
+        manage_response(true, true, MMU_TCODE_MOVE);
+        mmu_continue_loading(false);
+        mmu_extruder = tmp_extruder; //filament change is finished
+        marlin_rise_z();
+        mmu_load_to_nozzle();
+        load_filament_final_feed();
+        st_synchronize();
+        custom_message_type = CustomMsg::FilamentLoading;
+        lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT));
+        lcd_return_to_status();
+        lcd_update_enable(true);
+        lcd_load_filament_color_check();
+        lcd_setstatuspgm(_T(WELCOME_MSG));
+        custom_message_type = CustomMsg::Status;
+    }
+    else
+    {
+        show_preheat_nozzle_warning();
+    }
 }
 }
 
 
 #ifdef MMU_HAS_CUTTER
 #ifdef MMU_HAS_CUTTER
 void mmu_cut_filament(uint8_t filament_nr)
 void mmu_cut_filament(uint8_t filament_nr)
 {
 {
+    menu_back();
     bFilamentAction=false;                            // NOT in "mmu_load_to_nozzle_menu()"
     bFilamentAction=false;                            // NOT in "mmu_load_to_nozzle_menu()"
     if (degHotend0() > EXTRUDE_MINTEMP)
     if (degHotend0() > EXTRUDE_MINTEMP)
     {
     {
@@ -1464,59 +1469,109 @@ static void load_more()
     st_synchronize();
     st_synchronize();
 }
 }
 
 
-void mmu_continue_loading() 
+static void increment_load_fail()
 {
 {
-	if (ir_sensor_detected)
+    uint8_t mmu_load_fail = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL);
+    uint16_t mmu_load_fail_tot = eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT);
+    if(mmu_load_fail < 255) eeprom_update_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL, mmu_load_fail + 1);
+    if(mmu_load_fail_tot < 65535) eeprom_update_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT, mmu_load_fail_tot + 1);
+}
+
+//! @brief continue loading filament
+//! @par blocking
+//!  * true blocking - do not return until successful load
+//!  * false non-blocking - pause print and return on load failure
+//!
+//! @startuml
+//! [*] --> [*] : !ir_sensor_detected /\n send MmuCmd::C0
+//! [*] --> LoadMore
+//! LoadMore --> [*] : filament \ndetected
+//! LoadMore --> Retry : !filament detected /\n increment load fail
+//! Retry --> [*] : filament \ndetected
+//! Retry --> Unload : !filament \ndetected
+//! Unload --> [*] : non-blocking
+//! Unload --> Retry : button \nclicked
+//!
+//! Retry : Cut filament if enabled
+//! Retry : repeat last T-code
+//! Unload : unload filament
+//! Unload : pause print
+//! Unload : show error message
+//!
+//! @enduml
+void mmu_continue_loading(bool blocking)
+{
+	if (!ir_sensor_detected)
 	{
 	{
-	    load_more();
+	    mmu_command(MmuCmd::C0);
+	    return;
+	}
 
 
-		if (PIN_GET(IR_SENSOR_PIN) != 0) {
-			uint8_t mmu_load_fail = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL);
-			uint16_t mmu_load_fail_tot = eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT);
-			if(mmu_load_fail < 255) eeprom_update_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL, mmu_load_fail + 1);
-			if(mmu_load_fail_tot < 65535) eeprom_update_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT, mmu_load_fail_tot + 1);
+    load_more();
 
 
+    enum class Ls : uint_least8_t
+    {
+        Enter,
+        Retry,
+        Unload,
+    };
+    Ls state = Ls::Enter;
+
+    while (PIN_GET(IR_SENSOR_PIN) != 0)
+    {
+        switch (state)
+        {
+        case Ls::Enter:
+            increment_load_fail();
+            // no break
+        case Ls::Retry:
 #ifdef MMU_HAS_CUTTER
 #ifdef MMU_HAS_CUTTER
-			if (1 == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
-			{
-			    mmu_command(MmuCmd::K0 + tmp_extruder);
-			    manage_response(true, true, MMU_UNLOAD_MOVE);
-			}
+            if (1 == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
+            {
+                mmu_command(MmuCmd::K0 + tmp_extruder);
+                manage_response(true, true, MMU_UNLOAD_MOVE);
+            }
 #endif //MMU_HAS_CUTTER
 #endif //MMU_HAS_CUTTER
-
             mmu_command(MmuCmd::T0 + tmp_extruder);
             mmu_command(MmuCmd::T0 + tmp_extruder);
             manage_response(true, true, MMU_TCODE_MOVE);
             manage_response(true, true, MMU_TCODE_MOVE);
             load_more();
             load_more();
-
-            if (PIN_GET(IR_SENSOR_PIN) != 0)
+            state = Ls::Unload;
+            break;
+        case Ls::Unload:
+            stop_and_save_print_to_ram(0, 0);
+
+            //lift z
+            current_position[Z_AXIS] += Z_PAUSE_LIFT;
+            if (current_position[Z_AXIS] > Z_MAX_POS) current_position[Z_AXIS] = Z_MAX_POS;
+            plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 15, active_extruder);
+            st_synchronize();
+
+            //Move XY to side
+            current_position[X_AXIS] = X_PAUSE_POS;
+            current_position[Y_AXIS] = Y_PAUSE_POS;
+            plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 50, active_extruder);
+            st_synchronize();
+
+            mmu_command(MmuCmd::U0);
+            manage_response(false, true, MMU_UNLOAD_MOVE);
+
+            setAllTargetHotends(0);
+            lcd_setstatuspgm(_i("MMU load failed     "));////c=20 r=1
+
+            if (blocking)
+            {
+                marlin_wait_for_click();
+                restore_print_from_ram_and_continue(0);
+                state = Ls::Retry;
+            }
+            else
             {
             {
-                //pause print, show error message and then repeat last T-code
-                stop_and_save_print_to_ram(0, 0);
-
-                //lift z
-                current_position[Z_AXIS] += Z_PAUSE_LIFT;
-                if (current_position[Z_AXIS] > Z_MAX_POS) current_position[Z_AXIS] = Z_MAX_POS;
-                plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 15, active_extruder);
-                st_synchronize();
-
-                //Move XY to side
-                current_position[X_AXIS] = X_PAUSE_POS;
-                current_position[Y_AXIS] = Y_PAUSE_POS;
-                plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 50, active_extruder);
-                st_synchronize();
-
-                mmu_command(MmuCmd::U0);
-                manage_response(false, true, MMU_UNLOAD_MOVE);
-
-                setAllTargetHotends(0);
-                lcd_setstatuspgm(_i("MMU load failed     "));////MSG_RECOVERING_PRINT c=20 r=1
                 mmu_fil_loaded = false; //so we can retry same T-code again
                 mmu_fil_loaded = false; //so we can retry same T-code again
                 isPrintPaused = true;
                 isPrintPaused = true;
                 mmu_command(MmuCmd::W0);
                 mmu_command(MmuCmd::W0);
+                return;
             }
             }
-		}
-	}
-	else { //mmu_ir_sensor_detected == false
-		mmu_command(MmuCmd::C0);
-	}
+            break;
+        }
+    }
 }
 }

+ 3 - 3
Firmware/mmu.h

@@ -58,7 +58,7 @@ enum class MmuCmd : uint_least8_t
     K4,
     K4,
     R0,
     R0,
     S3,
     S3,
-    W0,
+    W0, //!< Wait and signal load error
 };
 };
 
 
 inline MmuCmd operator+ (MmuCmd cmd, uint8_t filament)
 inline MmuCmd operator+ (MmuCmd cmd, uint8_t filament)
@@ -103,7 +103,7 @@ extern void extr_mov(float shift, float feed_rate);
 extern void change_extr(int extr);
 extern void change_extr(int extr);
 extern int get_ext_nr();
 extern int get_ext_nr();
 extern void display_loading();
 extern void display_loading();
-extern void extr_adj(int extruder);
+extern void extr_adj(uint8_t extruder);
 extern void extr_unload();
 extern void extr_unload();
 //-//
 //-//
 extern void extr_unload_();
 extern void extr_unload_();
@@ -134,7 +134,7 @@ extern void mmu_eject_filament(uint8_t filament, bool recover);
 #ifdef MMU_HAS_CUTTER
 #ifdef MMU_HAS_CUTTER
 extern void mmu_cut_filament(uint8_t filament_nr);
 extern void mmu_cut_filament(uint8_t filament_nr);
 #endif //MMU_HAS_CUTTER
 #endif //MMU_HAS_CUTTER
-extern void mmu_continue_loading();
+extern void mmu_continue_loading(bool blocking);
 extern void mmu_filament_ramming();
 extern void mmu_filament_ramming();
 extern void mmu_wait_for_heater_blocking();
 extern void mmu_wait_for_heater_blocking();
 extern void mmu_load_step(bool synchronize = true);
 extern void mmu_load_step(bool synchronize = true);

+ 2 - 0
Firmware/optiboot_w25x20cl.cpp

@@ -1,3 +1,4 @@
+//! @file
 // Based on the OptiBoot project
 // Based on the OptiBoot project
 // https://github.com/Optiboot/optiboot
 // https://github.com/Optiboot/optiboot
 // Licence GLP 2 or later.
 // Licence GLP 2 or later.
@@ -97,6 +98,7 @@ static const char entry_magic_cfm    [] PROGMEM = "w25x20cl_cfm\n";
 struct block_t;
 struct block_t;
 extern struct block_t *block_buffer;
 extern struct block_t *block_buffer;
 
 
+//! @brief Enter an STK500 compatible Optiboot boot loader waiting for flashing the languages to an external flash memory.
 void optiboot_w25x20cl_enter()
 void optiboot_w25x20cl_enter()
 {
 {
   if (boot_app_flags & BOOT_APP_FLG_USER0) return;
   if (boot_app_flags & BOOT_APP_FLG_USER0) return;

+ 0 - 0
Firmware/pins_Einsy_1_0.h


+ 2 - 2
Firmware/planner.cpp

@@ -764,7 +764,7 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
       de_float = 0;
       de_float = 0;
 #endif
 #endif
       SERIAL_ECHO_START;
       SERIAL_ECHO_START;
-      SERIAL_ECHOLNRPGM(_n(" cold extrusion prevented"));////MSG_ERR_COLD_EXTRUDE_STOP c=0 r=0
+      SERIAL_ECHOLNRPGM(_n(" cold extrusion prevented"));////MSG_ERR_COLD_EXTRUDE_STOP
     }
     }
     
     
     #ifdef PREVENT_LENGTHY_EXTRUDE
     #ifdef PREVENT_LENGTHY_EXTRUDE
@@ -776,7 +776,7 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
         de_float = 0;
         de_float = 0;
 #endif
 #endif
       SERIAL_ECHO_START;
       SERIAL_ECHO_START;
-      SERIAL_ECHOLNRPGM(_n(" too long extrusion prevented"));////MSG_ERR_LONG_EXTRUDE_STOP c=0 r=0
+      SERIAL_ECHOLNRPGM(_n(" too long extrusion prevented"));////MSG_ERR_LONG_EXTRUDE_STOP
     }
     }
     #endif
     #endif
   }
   }

+ 1 - 1
Firmware/stepper.cpp

@@ -348,7 +348,7 @@ FORCE_INLINE unsigned short calc_timer(uint16_t step_rate) {
     timer = (unsigned short)pgm_read_word_near(table_address);
     timer = (unsigned short)pgm_read_word_near(table_address);
     timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
     timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
   }
   }
-  if(timer < 100) { timer = 100; MYSERIAL.print(_N("Steprate too high: ")); MYSERIAL.println(step_rate); }//(20kHz this should never happen)////MSG_STEPPER_TOO_HIGH c=0 r=0
+  if(timer < 100) { timer = 100; MYSERIAL.print(_N("Steprate too high: ")); MYSERIAL.println(step_rate); }//(20kHz this should never happen)////MSG_STEPPER_TOO_HIGH
   return timer;
   return timer;
 }
 }
 
 

+ 1 - 1
Firmware/system_timer.h

@@ -4,7 +4,7 @@
 #define FIRMWARE_SYSTEM_TIMER_H_
 #define FIRMWARE_SYSTEM_TIMER_H_
 
 
 #include "Arduino.h"
 #include "Arduino.h"
-#define SYSTEM_TIMER_2
+//#define SYSTEM_TIMER_2
 
 
 #ifdef SYSTEM_TIMER_2
 #ifdef SYSTEM_TIMER_2
 #include "timer02.h"
 #include "timer02.h"

+ 155 - 35
Firmware/temperature.cpp

@@ -94,6 +94,9 @@ float current_temperature_bed = 0.0;
   unsigned char fanSpeedSoftPwm;
   unsigned char fanSpeedSoftPwm;
 #endif
 #endif
 
 
+#ifdef FANCHECK
+  volatile uint8_t fan_check_error = EFCE_OK;
+#endif
 
 
 unsigned char soft_pwm_bed;
 unsigned char soft_pwm_bed;
 
 
@@ -264,11 +267,13 @@ static void temp_runaway_stop(bool isPreheat, bool isBed);
      soft_pwm_bed = (MAX_BED_POWER)/2;
      soft_pwm_bed = (MAX_BED_POWER)/2;
 	 timer02_set_pwm0(soft_pwm_bed << 1);
 	 timer02_set_pwm0(soft_pwm_bed << 1);
      bias = d = (MAX_BED_POWER)/2;
      bias = d = (MAX_BED_POWER)/2;
+     target_temperature_bed = (int)temp; // to display the requested target bed temperature properly on the main screen
    }
    }
    else
    else
    {
    {
      soft_pwm[extruder] = (PID_MAX)/2;
      soft_pwm[extruder] = (PID_MAX)/2;
      bias = d = (PID_MAX)/2;
      bias = d = (PID_MAX)/2;
+     target_temperature[extruder] = (int)temp; // to display the requested target extruder temperature properly on the main screen
   }
   }
 
 
 
 
@@ -429,7 +434,7 @@ static void temp_runaway_stop(bool isPreheat, bool isBed);
 void updatePID()
 void updatePID()
 {
 {
 #ifdef PIDTEMP
 #ifdef PIDTEMP
-  for(int e = 0; e < EXTRUDERS; e++) { 
+  for(uint_least8_t e = 0; e < EXTRUDERS; e++) {
      iState_sum_max[e] = PID_INTEGRAL_DRIVE_MAX / cs.Ki;  
      iState_sum_max[e] = PID_INTEGRAL_DRIVE_MAX / cs.Ki;  
   }
   }
 #endif
 #endif
@@ -507,6 +512,12 @@ void checkFanSpeed()
 	else fan_speed_errors[1] = 0;
 	else fan_speed_errors[1] = 0;
 #endif
 #endif
 
 
+	// drop the fan_check_error flag when both fans are ok
+	if( fan_speed_errors[0] == 0 && fan_speed_errors[1] == 0 && fan_check_error == EFCE_REPORTED){
+		// we may even send some info to the LCD from here
+		fan_check_error = EFCE_OK;
+	}
+
 	if ((fan_speed_errors[0] > max_extruder_fan_errors) && fans_check_enabled) {
 	if ((fan_speed_errors[0] > max_extruder_fan_errors) && fans_check_enabled) {
 		fan_speed_errors[0] = 0;
 		fan_speed_errors[0] = 0;
 		fanSpeedError(0); //extruder fan
 		fanSpeedError(0); //extruder fan
@@ -517,6 +528,23 @@ void checkFanSpeed()
 	}
 	}
 }
 }
 
 
+//! Prints serialMsg to serial port, displays lcdMsg onto the LCD and beeps.
+//! Extracted from fanSpeedError to save some space.
+//! @param serialMsg pointer into PROGMEM, this text will be printed to the serial port
+//! @param lcdMsg pointer into PROGMEM, this text will be printed onto the LCD
+static void fanSpeedErrorBeep(const char *serialMsg, const char *lcdMsg){
+	SERIAL_ECHOLNRPGM(serialMsg);
+	if (get_message_level() == 0) {
+		if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)||(eSoundMode==e_SOUND_MODE_SILENT)){
+			WRITE(BEEPER, HIGH);
+			delayMicroseconds(200);
+			WRITE(BEEPER, LOW);
+			delayMicroseconds(100); // what is this wait for?
+		}
+		LCD_ALERTMESSAGERPGM(lcdMsg);
+	}
+}
+
 void fanSpeedError(unsigned char _fan) {
 void fanSpeedError(unsigned char _fan) {
 	if (get_message_level() != 0 && isPrintPaused) return; 
 	if (get_message_level() != 0 && isPrintPaused) return; 
 	//to ensure that target temp. is not set to zero in case taht we are resuming print 
 	//to ensure that target temp. is not set to zero in case taht we are resuming print 
@@ -525,7 +553,8 @@ void fanSpeedError(unsigned char _fan) {
 			lcd_print_stop();
 			lcd_print_stop();
 		}
 		}
 		else {
 		else {
-			lcd_pause_print();
+			fan_check_error = EFCE_DETECTED;
+
 		}
 		}
 	}
 	}
 	else {
 	else {
@@ -533,27 +562,11 @@ void fanSpeedError(unsigned char _fan) {
 			SERIAL_ECHOLNPGM("// action:pause"); //for octoprint
 			SERIAL_ECHOLNPGM("// action:pause"); //for octoprint
 	}
 	}
 	switch (_fan) {
 	switch (_fan) {
-	case 0:
-			SERIAL_ECHOLNPGM("Extruder fan speed is lower then expected");
-			if (get_message_level() == 0) {
-if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)||(eSoundMode==e_SOUND_MODE_SILENT))
-				WRITE(BEEPER, HIGH);
-				delayMicroseconds(200);
-				WRITE(BEEPER, LOW);
-				delayMicroseconds(100);
-				LCD_ALERTMESSAGEPGM("Err: EXTR. FAN ERROR");
-			}
+	case 0:	// extracting the same code from case 0 and case 1 into a function saves 72B
+		fanSpeedErrorBeep(PSTR("Extruder fan speed is lower than expected"), PSTR("Err: EXTR. FAN ERROR") );
 		break;
 		break;
 	case 1:
 	case 1:
-			SERIAL_ECHOLNPGM("Print fan speed is lower then expected");
-			if (get_message_level() == 0) {
-if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)||(eSoundMode==e_SOUND_MODE_SILENT))
-				WRITE(BEEPER, HIGH);
-				delayMicroseconds(200);
-				WRITE(BEEPER, LOW);
-				delayMicroseconds(100);
-				LCD_ALERTMESSAGEPGM("Err: PRINT FAN ERROR");
-			}
+		fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), PSTR("Err: PRINT FAN ERROR") );
 		break;
 		break;
 	}
 	}
 }
 }
@@ -1046,11 +1059,6 @@ static void updateTemperaturesFromRawValues()
       redundant_temperature = analog2temp(redundant_temperature_raw, 1);
       redundant_temperature = analog2temp(redundant_temperature_raw, 1);
     #endif
     #endif
 
 
-    //Reset the watchdog after we know we have a temperature measurement.
-#ifdef WATCHDOG
-    wdt_reset();
-#endif //WATCHDOG
-
     CRITICAL_SECTION_START;
     CRITICAL_SECTION_START;
     temp_meas_ready = false;
     temp_meas_ready = false;
     CRITICAL_SECTION_END;
     CRITICAL_SECTION_END;
@@ -1240,6 +1248,7 @@ void setWatch()
 #if (defined (TEMP_RUNAWAY_BED_HYSTERESIS) && TEMP_RUNAWAY_BED_TIMEOUT > 0) || (defined (TEMP_RUNAWAY_EXTRUDER_HYSTERESIS) && TEMP_RUNAWAY_EXTRUDER_TIMEOUT > 0)
 #if (defined (TEMP_RUNAWAY_BED_HYSTERESIS) && TEMP_RUNAWAY_BED_TIMEOUT > 0) || (defined (TEMP_RUNAWAY_EXTRUDER_HYSTERESIS) && TEMP_RUNAWAY_EXTRUDER_TIMEOUT > 0)
 void temp_runaway_check(int _heater_id, float _target_temperature, float _current_temperature, float _output, bool _isbed)
 void temp_runaway_check(int _heater_id, float _target_temperature, float _current_temperature, float _output, bool _isbed)
 {
 {
+     float __delta;
 	float __hysteresis = 0;
 	float __hysteresis = 0;
 	int __timeout = 0;
 	int __timeout = 0;
 	bool temp_runaway_check_active = false;
 	bool temp_runaway_check_active = false;
@@ -1299,9 +1308,20 @@ void temp_runaway_check(int _heater_id, float _target_temperature, float _curren
 				SERIAL_ECHOPGM(" T:");
 				SERIAL_ECHOPGM(" T:");
 				MYSERIAL.print(_current_temperature);
 				MYSERIAL.print(_current_temperature);
 				SERIAL_ECHOPGM(" Tstart:");
 				SERIAL_ECHOPGM(" Tstart:");
-				MYSERIAL.print(__preheat_start[_heater_id]);*/
+				MYSERIAL.print(__preheat_start[_heater_id]);
+				SERIAL_ECHOPGM(" delta:");
+				MYSERIAL.print(_current_temperature-__preheat_start[_heater_id]);*/
 				
 				
-				if (_current_temperature - __preheat_start[_heater_id] < 2) {
+//-//				if (_current_temperature - __preheat_start[_heater_id] < 2) {
+//-//				if (_current_temperature - __preheat_start[_heater_id] < ((_isbed && (_current_temperature>105.0))?0.6:2.0)) {
+                    __delta=2.0;
+                    if(_isbed)
+                         {
+                         __delta=3.0;
+                         if(_current_temperature>90.0) __delta=2.0;
+                         if(_current_temperature>105.0) __delta=0.6;
+                         }
+				if (_current_temperature - __preheat_start[_heater_id] < __delta) {
 					__preheat_errors[_heater_id]++;
 					__preheat_errors[_heater_id]++;
 					/*SERIAL_ECHOPGM(" Preheat errors:");
 					/*SERIAL_ECHOPGM(" Preheat errors:");
 					MYSERIAL.println(__preheat_errors[_heater_id]);*/
 					MYSERIAL.println(__preheat_errors[_heater_id]);*/
@@ -1311,7 +1331,7 @@ void temp_runaway_check(int _heater_id, float _target_temperature, float _curren
 					__preheat_errors[_heater_id] = 0;
 					__preheat_errors[_heater_id] = 0;
 				}
 				}
 
 
-				if (__preheat_errors[_heater_id] > ((_isbed) ? 2 : 5)) 
+				if (__preheat_errors[_heater_id] > ((_isbed) ? 3 : 5)) 
 				{
 				{
 					if (farm_mode) { prusa_statistics(0); }
 					if (farm_mode) { prusa_statistics(0); }
 					temp_runaway_stop(true, _isbed);
 					temp_runaway_stop(true, _isbed);
@@ -1322,10 +1342,15 @@ void temp_runaway_check(int _heater_id, float _target_temperature, float _curren
 			}
 			}
 		}
 		}
 
 
-		if (_current_temperature >= _target_temperature  && temp_runaway_status[_heater_id] == TempRunaway_PREHEAT)
+//-//		if (_current_temperature >= _target_temperature  && temp_runaway_status[_heater_id] == TempRunaway_PREHEAT)
+		if ((_current_temperature > (_target_temperature - __hysteresis))  && temp_runaway_status[_heater_id] == TempRunaway_PREHEAT)
 		{
 		{
+			/*SERIAL_ECHOPGM("Heater:");
+			MYSERIAL.print(_heater_id);
+			MYSERIAL.println(" ->tempRunaway");*/
 			temp_runaway_status[_heater_id] = TempRunaway_ACTIVE;
 			temp_runaway_status[_heater_id] = TempRunaway_ACTIVE;
 			temp_runaway_check_active = false;
 			temp_runaway_check_active = false;
+			temp_runaway_error_counter[_heater_id] = 0;
 		}
 		}
 
 
 		if (_output > 0)
 		if (_output > 0)
@@ -1452,6 +1477,15 @@ void disable_heater()
     #endif
     #endif
   #endif 
   #endif 
 }
 }
+//! codes of alert messages for the LCD - it is shorter to compare an uin8_t
+//! than raw const char * of the messages themselves.
+//! Could be used for MAXTEMP situations too - after reaching MAXTEMP and turning off the heater automagically
+//! the heater/bed may cool down and a similar alert message like "MAXTERM fixed..." may be displayed.
+enum { LCDALERT_NONE = 0, LCDALERT_HEATERMINTEMP, LCDALERT_BEDMINTEMP, LCDALERT_MINTEMPFIXED, LCDALERT_PLEASERESTART };
+
+//! remember the last alert message sent to the LCD
+//! to prevent flicker and improve speed
+uint8_t last_alert_sent_to_lcd = LCDALERT_NONE;
 
 
 void max_temp_error(uint8_t e) {
 void max_temp_error(uint8_t e) {
   disable_heater();
   disable_heater();
@@ -1485,13 +1519,23 @@ void min_temp_error(uint8_t e) {
 #endif
 #endif
 //if (current_temperature_ambient < MINTEMP_MINAMBIENT) return;
 //if (current_temperature_ambient < MINTEMP_MINAMBIENT) return;
   disable_heater();
   disable_heater();
+	static const char err[] PROGMEM = "Err: MINTEMP";
   if(IsStopped() == false) {
   if(IsStopped() == false) {
     SERIAL_ERROR_START;
     SERIAL_ERROR_START;
     SERIAL_ERRORLN((int)e);
     SERIAL_ERRORLN((int)e);
     SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !");
     SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !");
-    LCD_ALERTMESSAGEPGM("Err: MINTEMP");
+    lcd_setalertstatuspgm(err);
+    last_alert_sent_to_lcd = LCDALERT_HEATERMINTEMP;
+  } else if( last_alert_sent_to_lcd != LCDALERT_HEATERMINTEMP ){ // only update, if the lcd message is to be changed (i.e. not the same as last time)
+	// we are already stopped due to some error, only update the status message without flickering
+	lcd_updatestatuspgm(err);
+	last_alert_sent_to_lcd = LCDALERT_HEATERMINTEMP;
   }
   }
   #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
   #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
+//	if( last_alert_sent_to_lcd != LCDALERT_HEATERMINTEMP ){
+//		last_alert_sent_to_lcd = LCDALERT_HEATERMINTEMP;
+//		lcd_print_stop();
+//	}
   Stop();
   Stop();
   #endif
   #endif
   if (farm_mode) { prusa_statistics(92); }
   if (farm_mode) { prusa_statistics(92); }
@@ -1521,10 +1565,16 @@ void bed_min_temp_error(void) {
 #if HEATER_BED_PIN > -1
 #if HEATER_BED_PIN > -1
     WRITE(HEATER_BED_PIN, 0);
     WRITE(HEATER_BED_PIN, 0);
 #endif
 #endif
+	static const char err[] PROGMEM = "Err: MINTEMP BED";
     if(IsStopped() == false) {
     if(IsStopped() == false) {
         SERIAL_ERROR_START;
         SERIAL_ERROR_START;
         SERIAL_ERRORLNPGM("Temperature heated bed switched off. MINTEMP triggered !");
         SERIAL_ERRORLNPGM("Temperature heated bed switched off. MINTEMP triggered !");
-        LCD_ALERTMESSAGEPGM("Err: MINTEMP BED");
+		lcd_setalertstatuspgm(err);
+		last_alert_sent_to_lcd = LCDALERT_BEDMINTEMP;
+	} else if( last_alert_sent_to_lcd != LCDALERT_BEDMINTEMP ){ // only update, if the lcd message is to be changed (i.e. not the same as last time)
+		// we are already stopped due to some error, only update the status message without flickering
+		lcd_updatestatuspgm(err);
+		last_alert_sent_to_lcd = LCDALERT_BEDMINTEMP;
     }
     }
 #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
 #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
     Stop();
     Stop();
@@ -1681,13 +1731,16 @@ ISR(TIMER0_COMPB_vect)
     soft_pwm_2 = soft_pwm[2];
     soft_pwm_2 = soft_pwm[2];
     if(soft_pwm_2 > 0) WRITE(HEATER_2_PIN,1); else WRITE(HEATER_2_PIN,0);
     if(soft_pwm_2 > 0) WRITE(HEATER_2_PIN,1); else WRITE(HEATER_2_PIN,0);
 #endif
 #endif
+  }
 #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
 #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
-    soft_pwm_b = soft_pwm_bed;
+  if ((pwm_count & ((1 << HEATER_BED_SOFT_PWM_BITS) - 1)) == 0)
+  {
+    soft_pwm_b = soft_pwm_bed >> (7 - HEATER_BED_SOFT_PWM_BITS);
 #ifndef SYSTEM_TIMER_2
 #ifndef SYSTEM_TIMER_2
 	if(soft_pwm_b > 0) WRITE(HEATER_BED_PIN,1); else WRITE(HEATER_BED_PIN,0);
 	if(soft_pwm_b > 0) WRITE(HEATER_BED_PIN,1); else WRITE(HEATER_BED_PIN,0);
 #endif //SYSTEM_TIMER_2
 #endif //SYSTEM_TIMER_2
-#endif
   }
   }
+#endif
 #ifdef FAN_SOFT_PWM
 #ifdef FAN_SOFT_PWM
   if ((pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1)) == 0)
   if ((pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1)) == 0)
   {
   {
@@ -1710,7 +1763,7 @@ ISR(TIMER0_COMPB_vect)
   if(soft_pwm_2 < pwm_count) WRITE(HEATER_2_PIN,0);
   if(soft_pwm_2 < pwm_count) WRITE(HEATER_2_PIN,0);
 #endif
 #endif
 #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
 #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
-  if(soft_pwm_b < pwm_count) WRITE(HEATER_BED_PIN,0);
+  if (soft_pwm_b < (pwm_count & ((1 << HEATER_BED_SOFT_PWM_BITS) - 1))) WRITE(HEATER_BED_PIN,0);
 #endif
 #endif
 #ifdef FAN_SOFT_PWM
 #ifdef FAN_SOFT_PWM
   if (soft_pwm_fan < (pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1))) WRITE(FAN_PIN,0);
   if (soft_pwm_fan < (pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1))) WRITE(FAN_PIN,0);
@@ -1995,6 +2048,58 @@ void check_max_temp()
 #endif
 #endif
 
 
 }
 }
+//! number of repeating the same state with consecutive step() calls
+//! used to slow down text switching
+struct alert_automaton_mintemp {
+private:
+	enum { ALERT_AUTOMATON_SPEED_DIV = 5 };
+	enum class States : uint8_t { Init = 0, TempAboveMintemp, ShowPleaseRestart, ShowMintemp };
+	States state = States::Init;
+	uint8_t repeat = ALERT_AUTOMATON_SPEED_DIV;
+
+	void substep(States next_state){
+		if( repeat == 0 ){
+			state = next_state; // advance to the next state
+			repeat = ALERT_AUTOMATON_SPEED_DIV; // and prepare repeating for it too
+		} else {
+			--repeat;
+		}
+	}
+public:
+	//! brief state automaton step routine
+	//! @param current_temp current hotend/bed temperature (for computing simple hysteresis)
+	//! @param mintemp minimal temperature including hysteresis to check current_temp against
+	void step(float current_temp, float mintemp){
+		static const char m2[] PROGMEM = "MINTEMP fixed";
+		static const char m1[] PROGMEM = "Please restart";
+		switch(state){
+		case States::Init: // initial state - check hysteresis
+			if( current_temp > mintemp ){
+				state = States::TempAboveMintemp;
+			}
+			// otherwise keep the Err MINTEMP alert message on the display,
+			// i.e. do not transfer to state 1
+			break;
+		case States::TempAboveMintemp: // the temperature has risen above the hysteresis check
+			lcd_setalertstatuspgm(m2);
+			substep(States::ShowMintemp);
+			last_alert_sent_to_lcd = LCDALERT_MINTEMPFIXED;
+			break;
+		case States::ShowPleaseRestart: // displaying "Please restart"
+			lcd_updatestatuspgm(m1);
+			substep(States::ShowMintemp);
+			last_alert_sent_to_lcd = LCDALERT_PLEASERESTART;
+			break;
+		case States::ShowMintemp: // displaying "MINTEMP fixed"
+			lcd_updatestatuspgm(m2);
+			substep(States::ShowPleaseRestart);
+			last_alert_sent_to_lcd = LCDALERT_MINTEMPFIXED;
+			break;
+		}
+	}
+};
+
+static alert_automaton_mintemp alert_automaton_hotend, alert_automaton_bed;
 
 
 void check_min_temp_heater0()
 void check_min_temp_heater0()
 {
 {
@@ -2004,7 +2109,17 @@ void check_min_temp_heater0()
 #else
 #else
 	if (current_temperature_raw[0] <= minttemp_raw[0]) {
 	if (current_temperature_raw[0] <= minttemp_raw[0]) {
 #endif
 #endif
+		menu_set_serious_error(SERIOUS_ERR_MINTEMP_HEATER);
 		min_temp_error(0);
 		min_temp_error(0);
+	} else if( menu_is_serious_error(SERIOUS_ERR_MINTEMP_HEATER) ) {
+		// no recovery, just force the user to restart the printer
+		// which is a safer variant than just continuing printing
+		// The automaton also checks for hysteresis - the temperature must have reached a few degrees above the MINTEMP, before
+		// we shall signalize, that MINTEMP has been fixed
+		// Code notice: normally the alert_automaton instance would have been placed here 
+		// as static alert_automaton_mintemp alert_automaton_hotend, but
+		// due to stupid compiler that takes 16 more bytes.
+		alert_automaton_hotend.step(current_temperature[0], minttemp[0] + TEMP_HYSTERESIS);
 	}
 	}
 }
 }
 
 
@@ -2015,7 +2130,12 @@ void check_min_temp_bed()
 #else
 #else
 	if (current_temperature_bed_raw <= bed_minttemp_raw) {
 	if (current_temperature_bed_raw <= bed_minttemp_raw) {
 #endif
 #endif
+		menu_set_serious_error(SERIOUS_ERR_MINTEMP_BED);
 		bed_min_temp_error();
 		bed_min_temp_error();
+	} else if( menu_is_serious_error(SERIOUS_ERR_MINTEMP_BED) ){
+		// no recovery, just force the user to restart the printer
+		// which is a safer variant than just continuing printing
+		alert_automaton_bed.step(current_temperature_bed, BED_MINTEMP + TEMP_HYSTERESIS);
 	}
 	}
 }
 }
 
 

+ 7 - 0
Firmware/temperature.h

@@ -238,6 +238,13 @@ void checkExtruderAutoFans();
 
 
 #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 > -1))
 #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 > -1))
 
 
+enum { 
+	EFCE_OK = 0,   //!< normal operation, both fans are ok
+	EFCE_DETECTED, //!< fan error detected, but not reported yet
+	EFCE_REPORTED  //!< fan error detected and reported to LCD and serial
+};
+extern volatile uint8_t fan_check_error;
+
 void countFanSpeed();
 void countFanSpeed();
 void checkFanSpeed();
 void checkFanSpeed();
 void fanSpeedError(unsigned char _fan);
 void fanSpeedError(unsigned char _fan);

+ 7 - 0
Firmware/timer02.c

@@ -2,6 +2,11 @@
 // use atmega timer2 as main system timer instead of timer0
 // use atmega timer2 as main system timer instead of timer0
 // timer0 is used for fast pwm (OC0B output)
 // timer0 is used for fast pwm (OC0B output)
 // original OVF handler is disabled
 // original OVF handler is disabled
+
+#include "system_timer.h"
+
+#ifdef SYSTEM_TIMER_2
+
 #include <avr/io.h>
 #include <avr/io.h>
 #include <avr/interrupt.h>
 #include <avr/interrupt.h>
 #include "Arduino.h"
 #include "Arduino.h"
@@ -166,3 +171,5 @@ void noTone2(__attribute__((unused)) uint8_t _pin)
 {
 {
 	PIN_CLR(BEEPER);
 	PIN_CLR(BEEPER);
 }
 }
+
+#endif //SYSTEM_TIMER_2

+ 8 - 5
Firmware/tmc2130.cpp

@@ -158,7 +158,7 @@ void tmc2130_init()
 	SET_INPUT(Y_TMC2130_DIAG);
 	SET_INPUT(Y_TMC2130_DIAG);
 	SET_INPUT(Z_TMC2130_DIAG);
 	SET_INPUT(Z_TMC2130_DIAG);
 	SET_INPUT(E0_TMC2130_DIAG);
 	SET_INPUT(E0_TMC2130_DIAG);
-	for (int axis = 0; axis < 2; axis++) // X Y axes
+	for (uint_least8_t axis = 0; axis < 2; axis++) // X Y axes
 	{
 	{
 		tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]);
 		tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]);
 		tmc2130_wr(axis, TMC2130_REG_TPOWERDOWN, 0x00000000);
 		tmc2130_wr(axis, TMC2130_REG_TPOWERDOWN, 0x00000000);
@@ -169,7 +169,7 @@ void tmc2130_init()
 		tmc2130_wr_TPWMTHRS(axis, TMC2130_TPWMTHRS);
 		tmc2130_wr_TPWMTHRS(axis, TMC2130_TPWMTHRS);
 		//tmc2130_wr_THIGH(axis, TMC2130_THIGH);
 		//tmc2130_wr_THIGH(axis, TMC2130_THIGH);
 	}
 	}
-	for (int axis = 2; axis < 3; axis++) // Z axis
+	for (uint_least8_t axis = 2; axis < 3; axis++) // Z axis
 	{
 	{
 		tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]);
 		tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]);
 		tmc2130_wr(axis, TMC2130_REG_TPOWERDOWN, 0x00000000);
 		tmc2130_wr(axis, TMC2130_REG_TPOWERDOWN, 0x00000000);
@@ -183,7 +183,7 @@ void tmc2130_init()
 		tmc2130_wr_TPWMTHRS(axis, TMC2130_TPWMTHRS);
 		tmc2130_wr_TPWMTHRS(axis, TMC2130_TPWMTHRS);
 #endif //TMC2130_STEALTH_Z
 #endif //TMC2130_STEALTH_Z
 	}
 	}
-	for (int axis = 3; axis < 4; axis++) // E axis
+	for (uint_least8_t axis = 3; axis < 4; axis++) // E axis
 	{
 	{
 		tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]);
 		tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]);
 		tmc2130_wr(axis, TMC2130_REG_TPOWERDOWN, 0x00000000);
 		tmc2130_wr(axis, TMC2130_REG_TPOWERDOWN, 0x00000000);
@@ -383,7 +383,7 @@ void tmc2130_check_overtemp()
 	static uint32_t checktime = 0;
 	static uint32_t checktime = 0;
 	if (_millis() - checktime > 1000 )
 	if (_millis() - checktime > 1000 )
 	{
 	{
-		for (int i = 0; i < 4; i++)
+		for (uint_least8_t i = 0; i < 4; i++)
 		{
 		{
 			uint32_t drv_status = 0;
 			uint32_t drv_status = 0;
 			skip_debug_msg = true;
 			skip_debug_msg = true;
@@ -392,7 +392,7 @@ void tmc2130_check_overtemp()
 			{ // BIT 26 - over temp prewarning ~120C (+-20C)
 			{ // BIT 26 - over temp prewarning ~120C (+-20C)
 				SERIAL_ERRORRPGM(MSG_TMC_OVERTEMP);
 				SERIAL_ERRORRPGM(MSG_TMC_OVERTEMP);
 				SERIAL_ECHOLN(i);
 				SERIAL_ECHOLN(i);
-				for (int j = 0; j < 4; j++)
+				for (uint_least8_t j = 0; j < 4; j++)
 					tmc2130_wr(j, TMC2130_REG_CHOPCONF, 0x00010000);
 					tmc2130_wr(j, TMC2130_REG_CHOPCONF, 0x00010000);
 				kill(MSG_TMC_OVERTEMP);
 				kill(MSG_TMC_OVERTEMP);
 			}
 			}
@@ -715,6 +715,9 @@ uint8_t tmc2130_get_pwr(uint8_t axis)
 	return 0;
 	return 0;
 }
 }
 
 
+//! @par pwr motor power
+//!  * 0 disabled
+//!  * non-zero enabled
 void tmc2130_set_pwr(uint8_t axis, uint8_t pwr)
 void tmc2130_set_pwr(uint8_t axis, uint8_t pwr)
 {
 {
 	switch (axis)
 	switch (axis)

+ 772 - 770
Firmware/ultralcd.cpp

@@ -40,6 +40,7 @@
 
 
 #include "static_assert.h"
 #include "static_assert.h"
 #include "io_atmega2560.h"
 #include "io_atmega2560.h"
+#include "first_lay_cal.h"
 
 
 
 
 int scrollstuff = 0;
 int scrollstuff = 0;
@@ -73,10 +74,10 @@ extern void crashdet_disable();
 bool presort_flag = false;
 bool presort_flag = false;
 #endif
 #endif
 
 
-int lcd_commands_type = LCD_COMMAND_IDLE;
-int lcd_commands_step = 0;
+LcdCommands lcd_commands_type = LcdCommands::Idle;
+static uint8_t lcd_commands_step = 0;
 
 
-unsigned int custom_message_type = CUSTOM_MSG_TYPE_STATUS;
+CustomMsg custom_message_type = CustomMsg::Status;
 unsigned int custom_message_state = 0;
 unsigned int custom_message_state = 0;
 
 
 
 
@@ -84,7 +85,7 @@ bool isPrintPaused = false;
 uint8_t farm_mode = 0;
 uint8_t farm_mode = 0;
 int farm_no = 0;
 int farm_no = 0;
 int farm_timer = 8;
 int farm_timer = 8;
-int farm_status = 0;
+uint8_t farm_status = 0;
 bool printer_connected = true;
 bool printer_connected = true;
 
 
 unsigned long display_time; //just timer for showing pid finished message on lcd;
 unsigned long display_time; //just timer for showing pid finished message on lcd;
@@ -130,6 +131,7 @@ static void lcd_control_volumetric_menu();
 static void lcd_settings_linearity_correction_menu_save();
 static void lcd_settings_linearity_correction_menu_save();
 static void prusa_stat_printerstatus(int _status);
 static void prusa_stat_printerstatus(int _status);
 static void prusa_stat_farm_number();
 static void prusa_stat_farm_number();
+static void prusa_stat_diameter();
 static void prusa_stat_temperatures();
 static void prusa_stat_temperatures();
 static void prusa_stat_printinfo();
 static void prusa_stat_printinfo();
 static void lcd_farm_no();
 static void lcd_farm_no();
@@ -165,47 +167,66 @@ static bool lcd_selfcheck_pulleys(int axis);
 #endif //TMC2130
 #endif //TMC2130
 
 
 static bool lcd_selfcheck_check_heater(bool _isbed);
 static bool lcd_selfcheck_check_heater(bool _isbed);
-enum class testScreen : uint_least8_t
-{
-    extruderFan,
-    printFan,
-    fansOk,
-    endStops,
-    axisX,
-    axisY,
-    axisZ,
-    bed,
-    hotend,
-    hotendOk,
-    fsensor,
-    fsensorOk,
-    allCorrect,
-    failed,
-    home,
+enum class TestScreen : uint_least8_t
+{
+    ExtruderFan,
+    PrintFan,
+    FansOk,
+    EndStops,
+    AxisX,
+    AxisY,
+    AxisZ,
+    Bed,
+    Hotend,
+    HotendOk,
+    Fsensor,
+    FsensorOk,
+    AllCorrect,
+    Failed,
+    Home,
 };
 };
 
 
 enum class TestError : uint_least8_t
 enum class TestError : uint_least8_t
 {
 {
-    heater,
-    bed,
-    endstops,
-    motor,
-    endstop,
-    printFan,
-    extruderFan,
-    pulley,
-    axis,
-    swappedFan,
-    wiringFsensor,
-    triggeringFsensor,
+    Heater,
+    Bed,
+    Endstops,
+    Motor,
+    Endstop,
+    PrintFan,
+    ExtruderFan,
+    Pulley,
+    Axis,
+    SwappedFan,
+    WiringFsensor,
+    TriggeringFsensor,
 };
 };
 
 
-static int  lcd_selftest_screen(testScreen screen, int _progress, int _progress_scale, bool _clear, int _delay);
+static int  lcd_selftest_screen(TestScreen screen, int _progress, int _progress_scale, bool _clear, int _delay);
 static void lcd_selftest_screen_step(int _row, int _col, int _state, const char *_name, const char *_indicator);
 static void lcd_selftest_screen_step(int _row, int _col, int _state, const char *_name, const char *_indicator);
-static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite);
+static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite,
+	bool _default=false);
+
 #ifdef FANCHECK
 #ifdef FANCHECK
-static bool lcd_selftest_fan_dialog(int _fan);
+/** Enumerate for lcd_selftest_fan_auto function.
+ */
+enum class FanCheck : uint_least8_t {
+    Success,
+    PrintFan,
+    ExtruderFan,
+    SwappedFan,
+};
+
+/**
+ * Try to check fan working and wiring.
+ *
+ * @param _fan i fan number 0 means extruder fan, 1 means print fan.
+ *
+ * @returns a TestError noerror, extruderFan, printFan or swappedFan.
+ */
+static FanCheck lcd_selftest_fan_auto(int _fan);
 #endif //FANCHECK
 #endif //FANCHECK
+
 #ifdef PAT9125
 #ifdef PAT9125
 static bool lcd_selftest_fsensor();
 static bool lcd_selftest_fsensor();
 #endif //PAT9125
 #endif //PAT9125
@@ -226,13 +247,13 @@ static char snmm_stop_print_menu();
 #ifdef SDCARD_SORT_ALPHA
 #ifdef SDCARD_SORT_ALPHA
  static void lcd_sort_type_set();
  static void lcd_sort_type_set();
 #endif
 #endif
-static float count_e(float layer_heigth, float extrusion_width, float extrusion_length);
 static void lcd_babystep_z();
 static void lcd_babystep_z();
 static void lcd_send_status();
 static void lcd_send_status();
 #ifdef FARM_CONNECT_MESSAGE
 #ifdef FARM_CONNECT_MESSAGE
 static void lcd_connect_printer();
 static void lcd_connect_printer();
 #endif //FARM_CONNECT_MESSAGE
 #endif //FARM_CONNECT_MESSAGE
 
 
+//! Beware: has side effects - forces lcd_draw_update to 2, which means clear the display
 void lcd_finishstatus();
 void lcd_finishstatus();
 
 
 static void lcd_sdcard_menu();
 static void lcd_sdcard_menu();
@@ -297,7 +318,7 @@ static void lcd_implementation_drawmenu_sdfile_selected(uint8_t row, char* longF
     char c;
     char c;
     int enc_dif = lcd_encoder_diff;
     int enc_dif = lcd_encoder_diff;
     uint8_t n = LCD_WIDTH - 1;
     uint8_t n = LCD_WIDTH - 1;
-    for(int g = 0; g<4;g++){
+    for(uint_least8_t g = 0; g<4;g++){
       lcd_set_cursor(0, g);
       lcd_set_cursor(0, g);
     lcd_print(' ');
     lcd_print(' ');
     }
     }
@@ -545,7 +566,7 @@ void lcdui_print_temp(char type, int val_current, int val_target)
 // Print Z-coordinate (8 chars total)
 // Print Z-coordinate (8 chars total)
 void lcdui_print_Z_coord(void)
 void lcdui_print_Z_coord(void)
 {
 {
-    if (custom_message_type == CUSTOM_MSG_TYPE_MESHBL)
+    if (custom_message_type == CustomMsg::MeshBedLeveling)
         lcd_puts_P(_N("Z   --- "));
         lcd_puts_P(_N("Z   --- "));
     else
     else
 		lcd_printf_P(_N("Z%6.2f "), current_position[Z_AXIS]);
 		lcd_printf_P(_N("Z%6.2f "), current_position[Z_AXIS]);
@@ -740,7 +761,7 @@ void lcdui_print_status_line(void)
 			break;
 			break;
 		}
 		}
 	}
 	}
-	else if ((IS_SD_PRINTING) && (custom_message_type == CUSTOM_MSG_TYPE_STATUS))
+	else if ((IS_SD_PRINTING) && (custom_message_type == CustomMsg::Status))
 	{ // If printing from SD, show what we are printing
 	{ // If printing from SD, show what we are printing
 		if(strlen(card.longFilename) > LCD_WIDTH)
 		if(strlen(card.longFilename) > LCD_WIDTH)
 		{
 		{
@@ -774,10 +795,10 @@ void lcdui_print_status_line(void)
 	{ // Otherwise check for other special events
 	{ // Otherwise check for other special events
    		switch (custom_message_type)
    		switch (custom_message_type)
 		{
 		{
-		case CUSTOM_MSG_TYPE_STATUS: // Nothing special, print status message normally
+		case CustomMsg::Status: // Nothing special, print status message normally
 			lcd_print(lcd_status_message);
 			lcd_print(lcd_status_message);
 			break;
 			break;
-		case CUSTOM_MSG_TYPE_MESHBL: // If mesh bed leveling in progress, show the status
+		case CustomMsg::MeshBedLeveling: // If mesh bed leveling in progress, show the status
 			if (custom_message_state > 10)
 			if (custom_message_state > 10)
 			{
 			{
 				lcd_set_cursor(0, 3);
 				lcd_set_cursor(0, 3);
@@ -793,22 +814,22 @@ void lcdui_print_status_line(void)
 				{
 				{
 					lcd_puts_P(_T(WELCOME_MSG));
 					lcd_puts_P(_T(WELCOME_MSG));
 					lcd_setstatuspgm(_T(WELCOME_MSG));
 					lcd_setstatuspgm(_T(WELCOME_MSG));
-					custom_message_type = CUSTOM_MSG_TYPE_STATUS;
+					custom_message_type = CustomMsg::Status;
 				}
 				}
 				if (custom_message_state > 3 && custom_message_state <= 10 )
 				if (custom_message_state > 3 && custom_message_state <= 10 )
 				{
 				{
 					lcd_set_cursor(0, 3);
 					lcd_set_cursor(0, 3);
 					lcd_puts_P(PSTR("                   "));
 					lcd_puts_P(PSTR("                   "));
 					lcd_set_cursor(0, 3);
 					lcd_set_cursor(0, 3);
-					lcd_puts_P(_i("Calibration done"));////MSG_HOMEYZ_DONE c=0 r=0
+					lcd_puts_P(_i("Calibration done"));////MSG_HOMEYZ_DONE
 					custom_message_state--;
 					custom_message_state--;
 				}
 				}
 			}
 			}
 			break;
 			break;
-		case CUSTOM_MSG_TYPE_F_LOAD: // If loading filament, print status
+		case CustomMsg::FilamentLoading: // If loading filament, print status
 			lcd_print(lcd_status_message);
 			lcd_print(lcd_status_message);
 			break;
 			break;
-		case CUSTOM_MSG_TYPE_PIDCAL: // PID tuning in progress
+		case CustomMsg::PidCal: // PID tuning in progress
 			lcd_print(lcd_status_message);
 			lcd_print(lcd_status_message);
 			if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0)
 			if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0)
 			{
 			{
@@ -818,7 +839,7 @@ void lcdui_print_status_line(void)
 				lcd_print(itostr3left(pid_number_of_cycles));
 				lcd_print(itostr3left(pid_number_of_cycles));
 			}
 			}
 			break;
 			break;
-		case CUSTOM_MSG_TYPE_TEMCAL: // PINDA temp calibration in progress
+		case CustomMsg::TempCal: // PINDA temp calibration in progress
 			{
 			{
 				char progress[4];
 				char progress[4];
 				lcd_set_cursor(0, 3);
 				lcd_set_cursor(0, 3);
@@ -828,7 +849,7 @@ void lcdui_print_status_line(void)
 				lcd_print(progress);
 				lcd_print(progress);
 			}
 			}
 			break;
 			break;
-		case CUSTOM_MSG_TYPE_TEMPRE: // temp compensation preheat
+		case CustomMsg::TempCompPreheat: // temp compensation preheat
 			lcd_set_cursor(0, 3);
 			lcd_set_cursor(0, 3);
 			lcd_puts_P(_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)
 			if (custom_message_state <= PINDA_HEAT_T)
@@ -976,7 +997,7 @@ static void lcd_status_screen()
 		} // end of farm_mode
 		} // end of farm_mode
 
 
 		lcd_status_update_delay = 10;   /* redraw the main screen every second. This is easier then trying keep track of all things that change on the screen */
 		lcd_status_update_delay = 10;   /* redraw the main screen every second. This is easier then trying keep track of all things that change on the screen */
-		if (lcd_commands_type != LCD_COMMAND_IDLE)
+		if (lcd_commands_type != LcdCommands::Idle)
 			lcd_commands();
 			lcd_commands();
 	} // end of lcd_draw_update
 	} // end of lcd_draw_update
 
 
@@ -999,7 +1020,10 @@ static void lcd_status_screen()
 		}
 		}
 	}
 	}
 
 
-	if (current_click && (lcd_commands_type != LCD_COMMAND_STOP_PRINT)) //click is aborted unless stop print finishes
+	if (current_click
+		&& (lcd_commands_type != LcdCommands::StopPrint) //click is aborted unless stop print finishes
+		&& ( menu_block_entering_on_serious_errors == SERIOUS_ERR_NONE ) // or a serious error blocks entering the menu
+	)
 	{
 	{
 		menu_depth = 0; //redundant, as already done in lcd_return_to_status(), just to be sure
 		menu_depth = 0; //redundant, as already done in lcd_return_to_status(), just to be sure
 		menu_submenu(lcd_main_menu);
 		menu_submenu(lcd_main_menu);
@@ -1037,23 +1061,25 @@ static void lcd_status_screen()
 		feedmultiply = 999;
 		feedmultiply = 999;
 }
 }
 
 
-
 void lcd_commands()
 void lcd_commands()
 {	
 {	
-	if (lcd_commands_type == LCD_COMMAND_LONG_PAUSE)
+	if (lcd_commands_type == LcdCommands::LongPause)
 	{
 	{
 		if (!blocks_queued() && !homing_flag)
 		if (!blocks_queued() && !homing_flag)
 		{
 		{
 			lcd_setstatuspgm(_i("Print paused"));////MSG_PRINT_PAUSED c=20 r=1
 			lcd_setstatuspgm(_i("Print paused"));////MSG_PRINT_PAUSED c=20 r=1
 			long_pause();
 			long_pause();
-			lcd_commands_type = 0;
-			lcd_commands_step = 0;
+               if (lcd_commands_type == LcdCommands::LongPause) // !!! because "lcd_commands_type" can be changed during/inside "long_pause()"
+               {
+                    lcd_commands_type = LcdCommands::Idle;
+                    lcd_commands_step = 0;
+               }
 		}
 		}
 	}
 	}
 
 
 
 
 #ifdef SNMM
 #ifdef SNMM
-	if (lcd_commands_type == LCD_COMMAND_V2_CAL)
+	if (lcd_commands_type == LcdCommands::Layer1Cal)
 	{
 	{
 		char cmd1[30];
 		char cmd1[30];
 		float width = 0.4;
 		float width = 0.4;
@@ -1318,300 +1344,115 @@ void lcd_commands()
 
 
 #else //if not SNMM
 #else //if not SNMM
 
 
-	if (lcd_commands_type == LCD_COMMAND_V2_CAL)
+	if (lcd_commands_type == LcdCommands::Layer1Cal)
 	{
 	{
 		char cmd1[30];
 		char cmd1[30];
 		static uint8_t filament = 0;
 		static uint8_t filament = 0;
-		float width = 0.4;
-		float length = 20 - width;
-		float extr = count_e(0.2, width, length);
-		float extr_short_segment = count_e(0.2, width, width);
-		if(lcd_commands_step>1) lcd_timeoutToStatus.start(); //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
 
 
-		if (lcd_commands_step == 0 && !blocks_queued() && cmd_buffer_empty())
-		{
-			lcd_commands_step = 10;
-		}
-		if (lcd_commands_step == 20 && !blocks_queued() && cmd_buffer_empty())
-		{
-            filament = 0;
-            lcd_commands_step = 10;
-		}
-        if (lcd_commands_step == 21 && !blocks_queued() && cmd_buffer_empty())
-        {
-            filament = 1;
-            lcd_commands_step = 10;
-        }
-        if (lcd_commands_step == 22 && !blocks_queued() && cmd_buffer_empty())
-        {
-            filament = 2;
-            lcd_commands_step = 10;
-        }
-        if (lcd_commands_step == 23 && !blocks_queued() && cmd_buffer_empty())
-        {
-            filament = 3;
-            lcd_commands_step = 10;
-        }
-        if (lcd_commands_step == 24 && !blocks_queued() && cmd_buffer_empty())
-        {
-            filament = 4;
-            lcd_commands_step = 10;
-        }
-
-		if (lcd_commands_step == 10)
-		{
-			enquecommand_P(PSTR("M107"));
-			enquecommand_P(PSTR("M104 S" STRINGIFY(PLA_PREHEAT_HOTEND_TEMP)));
-			enquecommand_P(PSTR("M140 S" STRINGIFY(PLA_PREHEAT_HPB_TEMP)));
-			enquecommand_P(PSTR("M190 S" STRINGIFY(PLA_PREHEAT_HPB_TEMP)));
-            enquecommand_P(PSTR("M109 S" STRINGIFY(PLA_PREHEAT_HOTEND_TEMP)));
-			enquecommand_P(_T(MSG_M117_V2_CALIBRATION));
-			enquecommand_P(PSTR("G28"));
-			enquecommand_P(PSTR("G92 E0.0"));
+		if(lcd_commands_step>1) lcd_timeoutToStatus.start(); //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
 
 
-            lcd_commands_step = 9;
-		}
-        if (lcd_commands_step == 9 && !blocks_queued() && cmd_buffer_empty())
+        if (!blocks_queued() && cmd_buffer_empty())
         {
         {
-            lcd_clear();
-            menu_depth = 0;
-            menu_submenu(lcd_babystep_z);
-
-            if (mmu_enabled)
-            {
-                enquecommand_P(PSTR("M83")); //intro line
-                enquecommand_P(PSTR("G1 Y-3.0 F1000.0")); //intro line
-                enquecommand_P(PSTR("G1 Z0.4 F1000.0")); //intro line
-                strcpy(cmd1, "T");
-                strcat(cmd1, itostr3left(filament));
-                enquecommand(cmd1);
-                enquecommand_P(PSTR("G1 X55.0 E32.0 F1073.0")); //intro line
-                enquecommand_P(PSTR("G1 X5.0 E32.0 F1800.0")); //intro line
-                enquecommand_P(PSTR("G1 X55.0 E8.0 F2000.0")); //intro line
-                enquecommand_P(PSTR("G1 Z0.3 F1000.0")); //intro line
-                enquecommand_P(PSTR("G92 E0.0")); //intro line
-                enquecommand_P(PSTR("G1 X240.0 E25.0  F2200.0")); //intro line
-                enquecommand_P(PSTR("G1 Y-2.0 F1000.0")); //intro line
-                enquecommand_P(PSTR("G1 X55.0 E25 F1400.0")); //intro line
-                enquecommand_P(PSTR("G1 Z0.20 F1000.0")); //intro line
-                enquecommand_P(PSTR("G1 X5.0 E4.0 F1000.0")); //intro line
-
-            } else
+            switch(lcd_commands_step)
             {
             {
-                enquecommand_P(PSTR("G1 X60.0 E9.0 F1000.0")); //intro line
-                enquecommand_P(PSTR("G1 X100.0 E12.5 F1000.0")); //intro line
+            case 0:
+                lcd_commands_step = 10;
+                break;
+            case 20:
+                filament = 0;
+                lcd_commands_step = 10;
+                break;
+            case 21:
+                filament = 1;
+                lcd_commands_step = 10;
+                break;
+            case 22:
+                filament = 2;
+                lcd_commands_step = 10;
+                break;
+            case 23:
+                filament = 3;
+                lcd_commands_step = 10;
+                break;
+            case 24:
+                filament = 4;
+                lcd_commands_step = 10;
+                break;
+            case 10:
+                lay1cal_preheat();
+                lcd_commands_step = 9;
+                break;
+            case 9:
+                lcd_clear();
+                menu_depth = 0;
+                menu_submenu(lcd_babystep_z);
+                lay1cal_intro_line(cmd1, filament);
+                lcd_commands_step = 8;
+                break;
+            case 8:
+                lay1cal_before_meander();
+                lcd_commands_step = 7;
+                break;
+            case 7:
+                lay1cal_meander(cmd1);
+                lcd_commands_step = 6;
+                break;
+            case 6:
+                for (uint8_t i = 0; i < 4; i++)
+                {
+                    lay1cal_square(cmd1, i);
+                }
+                lcd_commands_step = 5;
+                break;
+            case 5:
+                for (uint8_t i = 4; i < 8; i++)
+                {
+                    lay1cal_square(cmd1, i);
+                }
+                lcd_commands_step = 4;
+                break;
+            case 4:
+                for (uint8_t i = 8; i < 12; i++)
+                {
+                    lay1cal_square(cmd1, i);
+                }
+                lcd_commands_step = 3;
+                break;
+            case 3:
+                for (uint8_t i = 12; i < 16; i++)
+                {
+                    lay1cal_square(cmd1, i);
+                }
+                lcd_commands_step = 2;
+                break;
+            case 2:
+                enquecommand_P(PSTR("M107")); //turn off printer fan
+                enquecommand_P(PSTR("G1 E-0.07500 F2100.00000")); //retract
+                enquecommand_P(PSTR("M104 S0")); // turn off temperature
+                enquecommand_P(PSTR("M140 S0")); // turn off heatbed
+                enquecommand_P(PSTR("G1 Z10 F1300.000")); //lift Z
+                enquecommand_P(PSTR("G1 X10 Y180 F4000")); //Go to parking position
+                if (mmu_enabled) enquecommand_P(PSTR("M702 C")); //unload from nozzle
+                enquecommand_P(PSTR("M84"));// disable motors
+                forceMenuExpire = true; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
+                lcd_commands_step = 1;
+                break;
+            case 1:
+                lcd_setstatuspgm(_T(WELCOME_MSG));
+                lcd_commands_step = 0;
+                lcd_commands_type = LcdCommands::Idle;
+                if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1)
+                {
+                    lcd_wizard(WizState::RepeatLay1Cal);
+                }
+                break;
             }
             }
-
-            lcd_commands_step = 8;
         }
         }
-		if (lcd_commands_step == 8 && !blocks_queued() && cmd_buffer_empty())
-		{
-
-			enquecommand_P(PSTR("G92 E0.0"));
-			enquecommand_P(PSTR("G21")); //set units to millimeters
-			enquecommand_P(PSTR("G90")); //use absolute coordinates
-			enquecommand_P(PSTR("M83")); //use relative distances for extrusion
-			enquecommand_P(PSTR("G1 E-1.50000 F2100.00000"));
-			enquecommand_P(PSTR("G1 Z5 F7200.000"));
-			enquecommand_P(PSTR("M204 S1000")); //set acceleration
-			enquecommand_P(PSTR("G1 F4000"));
-			lcd_commands_step = 7;
-		}
-		if (lcd_commands_step == 7 && !blocks_queued() && cmd_buffer_empty()) //draw meander
-		{
-			lcd_timeoutToStatus.start();
-
-
-			//just opposite direction
-			/*enquecommand_P(PSTR("G1 X50 Y55"));
-			enquecommand_P(PSTR("G1 F1080"));
-			enquecommand_P(PSTR("G1 X200 Y55 E3.62773"));
-			enquecommand_P(PSTR("G1 X200 Y75 E0.49386"));
-			enquecommand_P(PSTR("G1 X50 Y75 E3.62773"));
-			enquecommand_P(PSTR("G1 X50 Y95 E0.49386"));
-			enquecommand_P(PSTR("G1 X200 Y95 E3.62773"));
-			enquecommand_P(PSTR("G1 X200 Y115 E0.49386"));
-			enquecommand_P(PSTR("G1 X50 Y115 E3.62773"));
-			enquecommand_P(PSTR("G1 X50 Y135 E0.49386"));
-			enquecommand_P(PSTR("G1 X200 Y135 E3.62773"));
-			enquecommand_P(PSTR("G1 X200 Y155 E0.66174"));
-			enquecommand_P(PSTR("G1 X100 Y155 E2.62773"));
-			enquecommand_P(PSTR("G1 X75 Y155 E2"));
-			enquecommand_P(PSTR("G1 X50 Y155 E2.5"));
-			enquecommand_P(PSTR("G1 E - 0.07500 F2100.00000"));*/
-
-
-			enquecommand_P(PSTR("G1 X50 Y155"));
-			enquecommand_P(PSTR("G1 Z0.150 F7200.000"));
-			enquecommand_P(PSTR("G1 F1080"));
-			enquecommand_P(PSTR("G1 X75 Y155 E2.5"));
-			enquecommand_P(PSTR("G1 X100 Y155 E2"));
-			enquecommand_P(PSTR("G1 X200 Y155 E2.62773"));
-			enquecommand_P(PSTR("G1 X200 Y135 E0.66174"));
-			enquecommand_P(PSTR("G1 X50 Y135 E3.62773"));
-			enquecommand_P(PSTR("G1 X50 Y115 E0.49386"));
-			enquecommand_P(PSTR("G1 X200 Y115 E3.62773"));
-			enquecommand_P(PSTR("G1 X200 Y95 E0.49386"));
-			enquecommand_P(PSTR("G1 X50 Y95 E3.62773"));
-			enquecommand_P(PSTR("G1 X50 Y75 E0.49386"));
-			enquecommand_P(PSTR("G1 X200 Y75 E3.62773"));
-			enquecommand_P(PSTR("G1 X200 Y55 E0.49386"));
-			enquecommand_P(PSTR("G1 X50 Y55 E3.62773"));
-
-			strcpy(cmd1, "G1 X50 Y35 E");
-			strcat(cmd1, ftostr43(extr));
-			enquecommand(cmd1);
-
-			lcd_commands_step = 6;
-		}
-
-		if (lcd_commands_step == 6 && !blocks_queued() && cmd_buffer_empty())
-		{
-
-			lcd_timeoutToStatus.start();
-
-			for (int i = 0; i < 4; i++) {
-				strcpy(cmd1, "G1 X70 Y");
-				strcat(cmd1, ftostr32(35 - i*width * 2));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 Y");
-				strcat(cmd1, ftostr32(35 - (2 * i + 1)*width));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr_short_segment));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 X50 Y");
-				strcat(cmd1, ftostr32(35 - (2 * i + 1)*width));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 Y");
-				strcat(cmd1, ftostr32(35 - (i + 1)*width * 2));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr_short_segment));
-				enquecommand(cmd1);
-			}
-
-			lcd_commands_step = 5;
-		}
-
-		if (lcd_commands_step == 5 && !blocks_queued() && cmd_buffer_empty())
-		{
-			lcd_timeoutToStatus.start();
-			for (int i = 4; i < 8; i++) {
-				strcpy(cmd1, "G1 X70 Y");
-				strcat(cmd1, ftostr32(35 - i*width * 2));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 Y");
-				strcat(cmd1, ftostr32(35 - (2 * i + 1)*width));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr_short_segment));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 X50 Y");
-				strcat(cmd1, ftostr32(35 - (2 * i + 1)*width));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 Y");
-				strcat(cmd1, ftostr32(35 - (i + 1)*width * 2));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr_short_segment));
-				enquecommand(cmd1);
-			}
-
-			lcd_commands_step = 4;
-		}
-
-		if (lcd_commands_step == 4 && !blocks_queued() && cmd_buffer_empty())
-		{
-			lcd_timeoutToStatus.start();
-			for (int i = 8; i < 12; i++) {
-				strcpy(cmd1, "G1 X70 Y");
-				strcat(cmd1, ftostr32(35 - i*width * 2));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 Y");
-				strcat(cmd1, ftostr32(35 - (2 * i + 1)*width));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr_short_segment));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 X50 Y");
-				strcat(cmd1, ftostr32(35 - (2 * i + 1)*width));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 Y");
-				strcat(cmd1, ftostr32(35 - (i + 1)*width * 2));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr_short_segment));
-				enquecommand(cmd1);
-			}
-
-			lcd_commands_step = 3;
-		}
-
-		if (lcd_commands_step == 3 && !blocks_queued() && cmd_buffer_empty())
-		{
-			lcd_timeoutToStatus.start();
-			for (int i = 12; i < 16; i++) {
-				strcpy(cmd1, "G1 X70 Y");
-				strcat(cmd1, ftostr32(35 - i*width * 2));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 Y");
-				strcat(cmd1, ftostr32(35 - (2 * i + 1)*width));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr_short_segment));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 X50 Y");
-				strcat(cmd1, ftostr32(35 - (2 * i + 1)*width));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr));
-				enquecommand(cmd1);
-				strcpy(cmd1, "G1 Y");
-				strcat(cmd1, ftostr32(35 - (i + 1)*width * 2));
-				strcat(cmd1, " E");
-				strcat(cmd1, ftostr43(extr_short_segment));
-				enquecommand(cmd1);
-			}
-
-			lcd_commands_step = 2;
-		}
-
-		if (lcd_commands_step == 2 && !blocks_queued() && cmd_buffer_empty())
-		{
-			lcd_timeoutToStatus.start();
-			enquecommand_P(PSTR("M107")); //turn off printer fan			
-			enquecommand_P(PSTR("G1 E-0.07500 F2100.00000")); //retract
-			enquecommand_P(PSTR("M104 S0")); // turn off temperature
-			enquecommand_P(PSTR("M140 S0")); // turn off heatbed
-			enquecommand_P(PSTR("G1 Z10 F1300.000")); //lift Z
-			enquecommand_P(PSTR("G1 X10 Y180 F4000")); //Go to parking position
-			if (mmu_enabled) enquecommand_P(PSTR("M702 C")); //unload from nozzle
-			enquecommand_P(PSTR("M84"));// disable motors
-			forceMenuExpire = true; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
-			lcd_commands_step = 1;
-		}
-		if (lcd_commands_step == 1 && !blocks_queued() && cmd_buffer_empty())
-		{
-			lcd_setstatuspgm(_T(WELCOME_MSG));
-			lcd_commands_step = 0;
-			lcd_commands_type = 0;			
-			if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1) {
-				lcd_wizard(WizState::RepeatLay1Cal);
-			}
-		}
-
 	}
 	}
 
 
 #endif // not SNMM
 #endif // not SNMM
 
 
-	if (lcd_commands_type == LCD_COMMAND_STOP_PRINT)   /// stop print
+	if (lcd_commands_type == LcdCommands::StopPrint)   /// stop print
 	{
 	{
 		
 		
 
 
@@ -1623,9 +1464,9 @@ void lcd_commands()
 		if (lcd_commands_step == 1 && !blocks_queued())
 		if (lcd_commands_step == 1 && !blocks_queued())
 		{
 		{
 			lcd_commands_step = 0;
 			lcd_commands_step = 0;
-			lcd_commands_type = 0;
+			lcd_commands_type = LcdCommands::Idle;
 			lcd_setstatuspgm(_T(WELCOME_MSG));
 			lcd_setstatuspgm(_T(WELCOME_MSG));
-			custom_message_type = CUSTOM_MSG_TYPE_STATUS;
+			custom_message_type = CustomMsg::Status;
 			isPrintPaused = false;
 			isPrintPaused = false;
 		}
 		}
 		if (lcd_commands_step == 2 && !blocks_queued())
 		if (lcd_commands_step == 2 && !blocks_queued())
@@ -1681,7 +1522,7 @@ void lcd_commands()
 			if (mmu_enabled)
 			if (mmu_enabled)
 				setAllTargetHotends(0);
 				setAllTargetHotends(0);
 			manage_heater();
 			manage_heater();
-			custom_message_type = CUSTOM_MSG_TYPE_F_LOAD;
+			custom_message_type = CustomMsg::FilamentLoading;
 			lcd_commands_step = 5;
 			lcd_commands_step = 5;
 		}
 		}
 		if (lcd_commands_step == 7 && !blocks_queued())
 		if (lcd_commands_step == 7 && !blocks_queued())
@@ -1703,12 +1544,7 @@ void lcd_commands()
 		}
 		}
 	}
 	}
 
 
-	if (lcd_commands_type == 3)
-	{
-		lcd_commands_type = 0;
-	}
-
-	if (lcd_commands_type == LCD_COMMAND_FARM_MODE_CONFIRM)   /// farm mode confirm
+	if (lcd_commands_type == LcdCommands::FarmModeConfirm)   /// farm mode confirm
 	{
 	{
 
 
 		if (lcd_commands_step == 0) { lcd_commands_step = 6; }
 		if (lcd_commands_step == 0) { lcd_commands_step = 6; }
@@ -1717,7 +1553,7 @@ void lcd_commands()
 		{
 		{
 			lcd_confirm_print();
 			lcd_confirm_print();
 			lcd_commands_step = 0;
 			lcd_commands_step = 0;
-			lcd_commands_type = 0;
+			lcd_commands_type = LcdCommands::Idle;
 		}
 		}
 		if (lcd_commands_step == 2 && !blocks_queued())
 		if (lcd_commands_step == 2 && !blocks_queued())
 		{
 		{
@@ -1750,11 +1586,11 @@ void lcd_commands()
 		}
 		}
 
 
 	}
 	}
-	if (lcd_commands_type == LCD_COMMAND_PID_EXTRUDER) {
+	if (lcd_commands_type == LcdCommands::PidExtruder) {
 		char cmd1[30];
 		char cmd1[30];
 		
 		
 		if (lcd_commands_step == 0) {
 		if (lcd_commands_step == 0) {
-			custom_message_type = CUSTOM_MSG_TYPE_PIDCAL;
+			custom_message_type = CustomMsg::PidCal;
 			custom_message_state = 1;
 			custom_message_state = 1;
 			lcd_draw_update = 3;
 			lcd_draw_update = 3;
 			lcd_commands_step = 3;
 			lcd_commands_step = 3;
@@ -1762,6 +1598,7 @@ void lcd_commands()
 		if (lcd_commands_step == 3 && !blocks_queued()) { //PID calibration
 		if (lcd_commands_step == 3 && !blocks_queued()) { //PID calibration
 			strcpy(cmd1, "M303 E0 S");
 			strcpy(cmd1, "M303 E0 S");
 			strcat(cmd1, ftostr3(pid_temp));
 			strcat(cmd1, ftostr3(pid_temp));
+			// setting the correct target temperature (for visualization) is done in PID_autotune
 			enquecommand(cmd1);
 			enquecommand(cmd1);
 			lcd_setstatuspgm(_i("PID cal.           "));////MSG_PID_RUNNING c=20 r=1
 			lcd_setstatuspgm(_i("PID cal.           "));////MSG_PID_RUNNING c=20 r=1
 			lcd_commands_step = 2;
 			lcd_commands_step = 2;
@@ -1770,6 +1607,7 @@ void lcd_commands()
 			pid_tuning_finished = false;
 			pid_tuning_finished = false;
 			custom_message_state = 0;
 			custom_message_state = 0;
 			lcd_setstatuspgm(_i("PID cal. finished"));////MSG_PID_FINISHED c=20 r=1
 			lcd_setstatuspgm(_i("PID cal. finished"));////MSG_PID_FINISHED c=20 r=1
+			setAllTargetHotends(0);  // reset all hotends temperature including the number displayed on the main screen
 			if (_Kp != 0 || _Ki != 0 || _Kd != 0) {
 			if (_Kp != 0 || _Ki != 0 || _Kd != 0) {
 			strcpy(cmd1, "M301 P");
 			strcpy(cmd1, "M301 P");
 			strcat(cmd1, ftostr32(_Kp));
 			strcat(cmd1, ftostr32(_Kp));
@@ -1788,28 +1626,22 @@ void lcd_commands()
 		}
 		}
 		if ((lcd_commands_step == 1) && ((_millis()- display_time)>2000)) { //calibration finished message
 		if ((lcd_commands_step == 1) && ((_millis()- display_time)>2000)) { //calibration finished message
 			lcd_setstatuspgm(_T(WELCOME_MSG));
 			lcd_setstatuspgm(_T(WELCOME_MSG));
-			custom_message_type = CUSTOM_MSG_TYPE_STATUS;
+			custom_message_type = CustomMsg::Status;
 			pid_temp = DEFAULT_PID_TEMP;
 			pid_temp = DEFAULT_PID_TEMP;
 			lcd_commands_step = 0;
 			lcd_commands_step = 0;
-			lcd_commands_type = 0;
+			lcd_commands_type = LcdCommands::Idle;
 		}
 		}
 	}
 	}
 
 
 
 
 }
 }
 
 
-static float count_e(float layer_heigth, float extrusion_width, float extrusion_length) {
-	//returns filament length in mm which needs to be extrude to form line with extrusion_length * extrusion_width * layer heigth dimensions
-	float extr = extrusion_length * layer_heigth * extrusion_width / (M_PI * pow(1.75, 2) / 4);
-	return extr;
-}
-
 void lcd_return_to_status()
 void lcd_return_to_status()
 {
 {
 	lcd_refresh(); // to maybe revive the LCD if static electricity killed it.
 	lcd_refresh(); // to maybe revive the LCD if static electricity killed it.
 	menu_goto(lcd_status_screen, 0, false, true);
 	menu_goto(lcd_status_screen, 0, false, true);
 	menu_depth = 0;
 	menu_depth = 0;
-     eFilamentAction=e_FILAMENT_ACTION_none; // i.e. non-autoLoad
+     eFilamentAction=FilamentAction::None; // i.e. non-autoLoad
 }
 }
 
 
 //! @brief Pause print, disable nozzle heater, move to park position
 //! @brief Pause print, disable nozzle heater, move to park position
@@ -1819,9 +1651,9 @@ void lcd_pause_print()
     stop_and_save_print_to_ram(0.0,0.0);
     stop_and_save_print_to_ram(0.0,0.0);
     setAllTargetHotends(0);
     setAllTargetHotends(0);
     isPrintPaused = true;
     isPrintPaused = true;
-    if (LCD_COMMAND_IDLE == lcd_commands_type)
+    if (LcdCommands::Idle == lcd_commands_type)
     {
     {
-        lcd_commands_type = LCD_COMMAND_LONG_PAUSE;
+        lcd_commands_type = LcdCommands::LongPause;
     }
     }
 }
 }
 
 
@@ -1962,7 +1794,7 @@ void lcd_menu_extruder_info()                     // NOT static due to using ins
 			lcd_puts_P(_N("Filament sensor\n" "is disabled."));
 			lcd_puts_P(_N("Filament sensor\n" "is disabled."));
 		else
 		else
 		{
 		{
-			if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LCD_COMMAND_V2_CAL))
+			if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
 				pat9125_update();
 				pat9125_update();
 			lcd_printf_P(_N(
 			lcd_printf_P(_N(
 				"Fil. Xd:%3d Yd:%3d\n"
 				"Fil. Xd:%3d Yd:%3d\n"
@@ -2187,7 +2019,6 @@ static void lcd_preheat_menu()
 	  MENU_ITEM_FUNCTION_P(PSTR("farm   -  " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FARM_PREHEAT_HPB_TEMP)), lcd_preheat_farm);
 	  MENU_ITEM_FUNCTION_P(PSTR("farm   -  " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FARM_PREHEAT_HPB_TEMP)), lcd_preheat_farm);
 	  MENU_ITEM_FUNCTION_P(PSTR("nozzle -  " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/0"), lcd_preheat_farm_nozzle);
 	  MENU_ITEM_FUNCTION_P(PSTR("nozzle -  " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/0"), lcd_preheat_farm_nozzle);
 	  MENU_ITEM_FUNCTION_P(_T(MSG_COOLDOWN), lcd_cooldown);
 	  MENU_ITEM_FUNCTION_P(_T(MSG_COOLDOWN), lcd_cooldown);
-	  MENU_ITEM_FUNCTION_P(PSTR("ABS    -  " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(ABS_PREHEAT_HPB_TEMP)), lcd_preheat_abs);
   } else {
   } else {
 	  MENU_ITEM_FUNCTION_P(PSTR("PLA  -  " STRINGIFY(PLA_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PLA_PREHEAT_HPB_TEMP)), lcd_preheat_pla);
 	  MENU_ITEM_FUNCTION_P(PSTR("PLA  -  " STRINGIFY(PLA_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PLA_PREHEAT_HPB_TEMP)), lcd_preheat_pla);
 	  MENU_ITEM_FUNCTION_P(PSTR("PET  -  " STRINGIFY(PET_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PET_PREHEAT_HPB_TEMP)), lcd_preheat_pet);
 	  MENU_ITEM_FUNCTION_P(PSTR("PET  -  " STRINGIFY(PET_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PET_PREHEAT_HPB_TEMP)), lcd_preheat_pet);
@@ -2249,9 +2080,9 @@ static void lcd_support_menu()
       MENU_ITEM_BACK_P(PSTR("FW - " FW_version));
       MENU_ITEM_BACK_P(PSTR("FW - " FW_version));
   }*/
   }*/
       
       
-  MENU_ITEM_BACK_P(_i("prusa3d.com"));////MSG_PRUSA3D c=0 r=0
-  MENU_ITEM_BACK_P(_i("forum.prusa3d.com"));////MSG_PRUSA3D_FORUM c=0 r=0
-  MENU_ITEM_BACK_P(_i("howto.prusa3d.com"));////MSG_PRUSA3D_HOWTO c=0 r=0
+  MENU_ITEM_BACK_P(_i("prusa3d.com"));////MSG_PRUSA3D
+  MENU_ITEM_BACK_P(_i("forum.prusa3d.com"));////MSG_PRUSA3D_FORUM
+  MENU_ITEM_BACK_P(_i("howto.prusa3d.com"));////MSG_PRUSA3D_HOWTO
   MENU_ITEM_BACK_P(STR_SEPARATOR);
   MENU_ITEM_BACK_P(STR_SEPARATOR);
   MENU_ITEM_BACK_P(PSTR(FILAMENT_SIZE));
   MENU_ITEM_BACK_P(PSTR(FILAMENT_SIZE));
   MENU_ITEM_BACK_P(PSTR(ELECTRONICS));
   MENU_ITEM_BACK_P(PSTR(ELECTRONICS));
@@ -2318,13 +2149,22 @@ void lcd_set_fan_check() {
 #ifdef MMU_HAS_CUTTER
 #ifdef MMU_HAS_CUTTER
 void lcd_cutter_enabled()
 void lcd_cutter_enabled()
 {
 {
-    if (1 == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
+    if (EEPROM_MMU_CUTTER_ENABLED_enabled == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
+    {
+#ifndef MMU_ALWAYS_CUT
+        eeprom_update_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED, 0);
+    }
+#else //MMU_ALWAYS_CUT
+        eeprom_update_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED, EEPROM_MMU_CUTTER_ENABLED_always);
+    }
+    else if (EEPROM_MMU_CUTTER_ENABLED_always == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
     {
     {
         eeprom_update_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED, 0);
         eeprom_update_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED, 0);
     }
     }
+#endif //MMU_ALWAYS_CUT
     else
     else
     {
     {
-        eeprom_update_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED, 1);
+        eeprom_update_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED, EEPROM_MMU_CUTTER_ENABLED_enabled);
     }
     }
 }
 }
 #endif //MMU_HAS_CUTTER
 #endif //MMU_HAS_CUTTER
@@ -2339,7 +2179,7 @@ void lcd_set_filament_oq_meass()
 }
 }
 
 
 
 
-eFILAMENT_ACTION eFilamentAction=e_FILAMENT_ACTION_none; // must be initialized as 'non-autoLoad'
+FilamentAction eFilamentAction=FilamentAction::None; // must be initialized as 'non-autoLoad'
 bool bFilamentFirstRun;
 bool bFilamentFirstRun;
 bool bFilamentPreheatState;
 bool bFilamentPreheatState;
 bool bFilamentAction=false;
 bool bFilamentAction=false;
@@ -2356,18 +2196,18 @@ lcd_puts_P(_i("Press the knob"));                 ////MSG_ c=20 r=1
 lcd_set_cursor(0,3);
 lcd_set_cursor(0,3);
 switch(eFilamentAction)
 switch(eFilamentAction)
      {
      {
-     case e_FILAMENT_ACTION_Load:
-     case e_FILAMENT_ACTION_autoLoad:
-     case e_FILAMENT_ACTION_mmuLoad:
+     case FilamentAction::Load:
+     case FilamentAction::AutoLoad:
+     case FilamentAction::MmuLoad:
           lcd_puts_P(_i("to load filament"));     ////MSG_ c=20 r=1
           lcd_puts_P(_i("to load filament"));     ////MSG_ c=20 r=1
           break;
           break;
-     case e_FILAMENT_ACTION_unLoad:
-     case e_FILAMENT_ACTION_mmuUnLoad:
+     case FilamentAction::UnLoad:
+     case FilamentAction::MmuUnLoad:
           lcd_puts_P(_i("to unload filament"));   ////MSG_ c=20 r=1
           lcd_puts_P(_i("to unload filament"));   ////MSG_ c=20 r=1
           break;
           break;
-     case e_FILAMENT_ACTION_mmuEject:
-     case e_FILAMENT_ACTION_mmuCut:
-     case e_FILAMENT_ACTION_none:
+     case FilamentAction::MmuEject:
+     case FilamentAction::MmuCut:
+     case FilamentAction::None:
           break;
           break;
      }
      }
 if(lcd_clicked())
 if(lcd_clicked())
@@ -2381,21 +2221,21 @@ if(lcd_clicked())
      menu_back(nLevel);
      menu_back(nLevel);
      switch(eFilamentAction)
      switch(eFilamentAction)
           {
           {
-          case e_FILAMENT_ACTION_autoLoad:
-               eFilamentAction=e_FILAMENT_ACTION_none; // i.e. non-autoLoad
+          case FilamentAction::AutoLoad:
+               eFilamentAction=FilamentAction::None; // i.e. non-autoLoad
                // no break
                // no break
-          case e_FILAMENT_ACTION_Load:
+          case FilamentAction::Load:
                loading_flag=true;
                loading_flag=true;
                enquecommand_P(PSTR("M701"));      // load filament
                enquecommand_P(PSTR("M701"));      // load filament
                break;
                break;
-          case e_FILAMENT_ACTION_unLoad:
+          case FilamentAction::UnLoad:
                enquecommand_P(PSTR("M702"));      // unload filament
                enquecommand_P(PSTR("M702"));      // unload filament
                break;
                break;
-          case e_FILAMENT_ACTION_mmuLoad:
-          case e_FILAMENT_ACTION_mmuUnLoad:
-          case e_FILAMENT_ACTION_mmuEject:
-          case e_FILAMENT_ACTION_mmuCut:
-          case e_FILAMENT_ACTION_none:
+          case FilamentAction::MmuLoad:
+          case FilamentAction::MmuUnLoad:
+          case FilamentAction::MmuEject:
+          case FilamentAction::MmuCut:
+          case FilamentAction::None:
                break;
                break;
           }
           }
      }
      }
@@ -2419,19 +2259,19 @@ lcdui_print_temp(LCD_STR_THERMOMETER[0],(int)degHotend(0),(int)degTargetHotend(0
 lcd_set_cursor(0,1);
 lcd_set_cursor(0,1);
 switch(eFilamentAction)
 switch(eFilamentAction)
      {
      {
-     case e_FILAMENT_ACTION_Load:
-     case e_FILAMENT_ACTION_autoLoad:
-     case e_FILAMENT_ACTION_mmuLoad:
+     case eFILAMENT_ACTION::load:
+     case eFILAMENT_ACTION::autoLoad:
+     case eFILAMENT_ACTION::mmuLoad:
           lcd_puts_P(_i("Preheating to load"));   ////MSG_ c=20 r=1
           lcd_puts_P(_i("Preheating to load"));   ////MSG_ c=20 r=1
           break;
           break;
-     case e_FILAMENT_ACTION_unLoad:
-     case e_FILAMENT_ACTION_mmuUnLoad:
+     case eFILAMENT_ACTION::unLoad:
+     case eFILAMENT_ACTION::mmuUnLoad:
           lcd_puts_P(_i("Preheating to unload")); ////MSG_ c=20 r=1
           lcd_puts_P(_i("Preheating to unload")); ////MSG_ c=20 r=1
           break;
           break;
-     case e_FILAMENT_ACTION_mmuEject:
+     case eFILAMENT_ACTION::mmuEject:
           lcd_puts_P(_i("Preheating to eject"));  ////MSG_ c=20 r=1
           lcd_puts_P(_i("Preheating to eject"));  ////MSG_ c=20 r=1
           break;
           break;
-     case e_FILAMENT_ACTION_mmuCut:
+     case eFILAMENT_ACTION::mmuCut:
           lcd_puts_P(_i("Preheating to cut"));  ////MSG_ c=20 r=1
           lcd_puts_P(_i("Preheating to cut"));  ////MSG_ c=20 r=1
           break;
           break;
      }
      }
@@ -2450,20 +2290,20 @@ if(lcd_clicked())
           setTargetBed((float)nTargetBedOld);
           setTargetBed((float)nTargetBedOld);
           }
           }
      menu_back();
      menu_back();
-     if(eFilamentAction==e_FILAMENT_ACTION_autoLoad)
-          eFilamentAction=e_FILAMENT_ACTION_none; // i.e. non-autoLoad
+     if(eFilamentAction==eFILAMENT_ACTION::autoLoad)
+          eFilamentAction=eFILAMENT_ACTION::none; // i.e. non-autoLoad
      }
      }
 else {
 else {
      if(current_temperature[0]>(target_temperature[0]*0.95))
      if(current_temperature[0]>(target_temperature[0]*0.95))
           {
           {
           switch(eFilamentAction)
           switch(eFilamentAction)
                {
                {
-               case e_FILAMENT_ACTION_Load:
-               case e_FILAMENT_ACTION_autoLoad:
-               case e_FILAMENT_ACTION_unLoad:
+               case eFILAMENT_ACTION::load:
+               case eFILAMENT_ACTION::autoLoad:
+               case eFILAMENT_ACTION::unLoad:
                     menu_submenu(mFilamentPrompt);
                     menu_submenu(mFilamentPrompt);
                     break;
                     break;
-               case e_FILAMENT_ACTION_mmuLoad:
+               case eFILAMENT_ACTION::mmuLoad:
                     nLevel=1;
                     nLevel=1;
                     if(!bFilamentPreheatState)
                     if(!bFilamentPreheatState)
                          nLevel++;
                          nLevel++;
@@ -2471,7 +2311,7 @@ else {
                     menu_back(nLevel);
                     menu_back(nLevel);
                     menu_submenu(mmu_load_to_nozzle_menu);
                     menu_submenu(mmu_load_to_nozzle_menu);
                     break;
                     break;
-               case e_FILAMENT_ACTION_mmuUnLoad:
+               case eFILAMENT_ACTION::mmuUnLoad:
                     nLevel=1;
                     nLevel=1;
                     if(!bFilamentPreheatState)
                     if(!bFilamentPreheatState)
                          nLevel++;
                          nLevel++;
@@ -2479,7 +2319,7 @@ else {
                     menu_back(nLevel);
                     menu_back(nLevel);
                     extr_unload();
                     extr_unload();
                     break;
                     break;
-               case e_FILAMENT_ACTION_mmuEject:
+               case eFILAMENT_ACTION::mmuEject:
                     nLevel=1;
                     nLevel=1;
                     if(!bFilamentPreheatState)
                     if(!bFilamentPreheatState)
                          nLevel++;
                          nLevel++;
@@ -2487,7 +2327,7 @@ else {
                     menu_back(nLevel);
                     menu_back(nLevel);
                     menu_submenu(mmu_fil_eject_menu);
                     menu_submenu(mmu_fil_eject_menu);
                     break;
                     break;
-               case e_FILAMENT_ACTION_mmuCut:
+               case eFILAMENT_ACTION::mmuCut:
                     nLevel=1;
                     nLevel=1;
                     if(!bFilamentPreheatState)
                     if(!bFilamentPreheatState)
                          nLevel++;
                          nLevel++;
@@ -2520,44 +2360,44 @@ if(current_temperature[0]>(target_temperature[0]*0.95))
      {
      {
      switch(eFilamentAction)
      switch(eFilamentAction)
           {
           {
-          case e_FILAMENT_ACTION_Load:
-          case e_FILAMENT_ACTION_autoLoad:
-          case e_FILAMENT_ACTION_unLoad:
+          case FilamentAction::Load:
+          case FilamentAction::AutoLoad:
+          case FilamentAction::UnLoad:
                if(bFilamentWaitingFlag)
                if(bFilamentWaitingFlag)
                     menu_submenu(mFilamentPrompt);
                     menu_submenu(mFilamentPrompt);
                else {
                else {
                     nLevel=bFilamentPreheatState?1:2;
                     nLevel=bFilamentPreheatState?1:2;
                     menu_back(nLevel);
                     menu_back(nLevel);
-                    if((eFilamentAction==e_FILAMENT_ACTION_Load)||(eFilamentAction==e_FILAMENT_ACTION_autoLoad))
+                    if((eFilamentAction==FilamentAction::Load)||(eFilamentAction==FilamentAction::AutoLoad))
                          {
                          {
                          loading_flag=true;
                          loading_flag=true;
                          enquecommand_P(PSTR("M701")); // load filament
                          enquecommand_P(PSTR("M701")); // load filament
-                         if(eFilamentAction==e_FILAMENT_ACTION_autoLoad)
-                              eFilamentAction=e_FILAMENT_ACTION_none; // i.e. non-autoLoad
+                         if(eFilamentAction==FilamentAction::AutoLoad)
+                              eFilamentAction=FilamentAction::None; // i.e. non-autoLoad
                          }
                          }
-                    if(eFilamentAction==e_FILAMENT_ACTION_unLoad)
+                    if(eFilamentAction==FilamentAction::UnLoad)
                          enquecommand_P(PSTR("M702")); // unload filament
                          enquecommand_P(PSTR("M702")); // unload filament
                     }
                     }
                break;
                break;
-          case e_FILAMENT_ACTION_mmuLoad:
+          case FilamentAction::MmuLoad:
                nLevel=bFilamentPreheatState?1:2;
                nLevel=bFilamentPreheatState?1:2;
                bFilamentAction=true;
                bFilamentAction=true;
                menu_back(nLevel);
                menu_back(nLevel);
                menu_submenu(mmu_load_to_nozzle_menu);
                menu_submenu(mmu_load_to_nozzle_menu);
                break;
                break;
-          case e_FILAMENT_ACTION_mmuUnLoad:
+          case FilamentAction::MmuUnLoad:
                nLevel=bFilamentPreheatState?1:2;
                nLevel=bFilamentPreheatState?1:2;
                bFilamentAction=true;
                bFilamentAction=true;
                menu_back(nLevel);
                menu_back(nLevel);
                extr_unload();
                extr_unload();
                break;
                break;
-          case e_FILAMENT_ACTION_mmuEject:
+          case FilamentAction::MmuEject:
                nLevel=bFilamentPreheatState?1:2;
                nLevel=bFilamentPreheatState?1:2;
                bFilamentAction=true;
                bFilamentAction=true;
                menu_back(nLevel);
                menu_back(nLevel);
                menu_submenu(mmu_fil_eject_menu);
                menu_submenu(mmu_fil_eject_menu);
                break;
                break;
-          case e_FILAMENT_ACTION_mmuCut:
+          case FilamentAction::MmuCut:
 #ifdef MMU_HAS_CUTTER
 #ifdef MMU_HAS_CUTTER
                nLevel=bFilamentPreheatState?1:2;
                nLevel=bFilamentPreheatState?1:2;
                bFilamentAction=true;
                bFilamentAction=true;
@@ -2565,7 +2405,7 @@ if(current_temperature[0]>(target_temperature[0]*0.95))
                menu_submenu(mmu_cut_filament_menu);
                menu_submenu(mmu_cut_filament_menu);
 #endif //MMU_HAS_CUTTER
 #endif //MMU_HAS_CUTTER
                break;
                break;
-          case e_FILAMENT_ACTION_none:
+          case FilamentAction::None:
                break;
                break;
           }
           }
      if(bFilamentWaitingFlag)
      if(bFilamentWaitingFlag)
@@ -2579,22 +2419,22 @@ else {
      lcd_set_cursor(0,1);
      lcd_set_cursor(0,1);
      switch(eFilamentAction)
      switch(eFilamentAction)
           {
           {
-          case e_FILAMENT_ACTION_Load:
-          case e_FILAMENT_ACTION_autoLoad:
-          case e_FILAMENT_ACTION_mmuLoad:
+          case FilamentAction::Load:
+          case FilamentAction::AutoLoad:
+          case FilamentAction::MmuLoad:
                lcd_puts_P(_i("Preheating to load")); ////MSG_ c=20 r=1
                lcd_puts_P(_i("Preheating to load")); ////MSG_ c=20 r=1
                break;
                break;
-          case e_FILAMENT_ACTION_unLoad:
-          case e_FILAMENT_ACTION_mmuUnLoad:
+          case FilamentAction::UnLoad:
+          case FilamentAction::MmuUnLoad:
                lcd_puts_P(_i("Preheating to unload")); ////MSG_ c=20 r=1
                lcd_puts_P(_i("Preheating to unload")); ////MSG_ c=20 r=1
                break;
                break;
-          case e_FILAMENT_ACTION_mmuEject:
+          case FilamentAction::MmuEject:
                lcd_puts_P(_i("Preheating to eject")); ////MSG_ c=20 r=1
                lcd_puts_P(_i("Preheating to eject")); ////MSG_ c=20 r=1
                break;
                break;
-          case e_FILAMENT_ACTION_mmuCut:
+          case FilamentAction::MmuCut:
                lcd_puts_P(_i("Preheating to cut")); ////MSG_ c=20 r=1
                lcd_puts_P(_i("Preheating to cut")); ////MSG_ c=20 r=1
                break;
                break;
-          case e_FILAMENT_ACTION_none:
+          case FilamentAction::None:
                break;
                break;
           }
           }
      lcd_set_cursor(0,3);
      lcd_set_cursor(0,3);
@@ -2613,8 +2453,8 @@ else {
                setTargetBed((float)nTargetBedOld);
                setTargetBed((float)nTargetBedOld);
                }
                }
           menu_back();
           menu_back();
-          if(eFilamentAction==e_FILAMENT_ACTION_autoLoad)
-               eFilamentAction=e_FILAMENT_ACTION_none; // i.e. non-autoLoad
+          if(eFilamentAction==FilamentAction::AutoLoad)
+               eFilamentAction=FilamentAction::None; // i.e. non-autoLoad
           }
           }
      }
      }
 }
 }
@@ -2659,8 +2499,8 @@ mFilamentItem(FLEX_PREHEAT_HOTEND_TEMP,FLEX_PREHEAT_HPB_TEMP);
 void mFilamentBack()
 void mFilamentBack()
 {
 {
 menu_back();
 menu_back();
-if(eFilamentAction==e_FILAMENT_ACTION_autoLoad)
-     eFilamentAction=e_FILAMENT_ACTION_none; // i.e. non-autoLoad
+if(eFilamentAction==FilamentAction::AutoLoad)
+     eFilamentAction=FilamentAction::None; // i.e. non-autoLoad
 }
 }
 
 
 void mFilamentMenu()
 void mFilamentMenu()
@@ -2691,7 +2531,7 @@ if(0)
      enquecommand_P(PSTR("M702"));                // unload filament
      enquecommand_P(PSTR("M702"));                // unload filament
      }
      }
 else {
 else {
-     eFilamentAction=e_FILAMENT_ACTION_unLoad;
+     eFilamentAction=FilamentAction::UnLoad;
      bFilamentFirstRun=false;
      bFilamentFirstRun=false;
      if(target_temperature[0]>=EXTRUDE_MINTEMP)
      if(target_temperature[0]>=EXTRUDE_MINTEMP)
           {
           {
@@ -2711,11 +2551,11 @@ void lcd_wait_interact() {
 #ifdef SNMM 
 #ifdef SNMM 
   lcd_puts_P(_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
 #else
-  lcd_puts_P(_i("Insert filament"));////MSG_INSERT_FILAMENT c=20 r=0
+  lcd_puts_P(_i("Insert filament"));////MSG_INSERT_FILAMENT c=20
 #endif
 #endif
   if (!fsensor_autoload_enabled) {
   if (!fsensor_autoload_enabled) {
 	  lcd_set_cursor(0, 2);
 	  lcd_set_cursor(0, 2);
-	  lcd_puts_P(_i("and press the knob"));////MSG_PRESS c=20 r=0
+	  lcd_puts_P(_i("and press the knob"));////MSG_PRESS c=20
   }
   }
 }
 }
 
 
@@ -2726,18 +2566,18 @@ void lcd_change_success() {
 
 
   lcd_set_cursor(0, 2);
   lcd_set_cursor(0, 2);
 
 
-  lcd_puts_P(_i("Change success!"));////MSG_CHANGE_SUCCESS c=0 r=0
+  lcd_puts_P(_i("Change success!"));////MSG_CHANGE_SUCCESS
 
 
 
 
 }
 }
 
 
 static void lcd_loading_progress_bar(uint16_t loading_time_ms) { 
 static void lcd_loading_progress_bar(uint16_t loading_time_ms) { 
 	
 	
-	for (int i = 0; i < 20; i++) {
+	for (uint_least8_t i = 0; i < 20; i++) {
 		lcd_set_cursor(i, 3);
 		lcd_set_cursor(i, 3);
 		lcd_print(".");
 		lcd_print(".");
 		//loading_time_ms/20 delay
 		//loading_time_ms/20 delay
-		for (int j = 0; j < 5; j++) {
+		for (uint_least8_t j = 0; j < 5; j++) {
 			delay_keep_alive(loading_time_ms / 100);
 			delay_keep_alive(loading_time_ms / 100);
 		}
 		}
 	}
 	}
@@ -2751,7 +2591,7 @@ void lcd_loading_color() {
 
 
   lcd_set_cursor(0, 0);
   lcd_set_cursor(0, 0);
 
 
-  lcd_puts_P(_i("Loading color"));////MSG_LOADING_COLOR c=0 r=0
+  lcd_puts_P(_i("Loading color"));////MSG_LOADING_COLOR
   lcd_set_cursor(0, 2);
   lcd_set_cursor(0, 2);
   lcd_puts_P(_T(MSG_PLEASE_WAIT));
   lcd_puts_P(_T(MSG_PLEASE_WAIT));
   lcd_loading_progress_bar((FILAMENTCHANGE_FINALFEED * 1000ul) / FILAMENTCHANGE_EFEED_FINAL); //show progress bar during filament loading slow sequence
   lcd_loading_progress_bar((FILAMENTCHANGE_FINALFEED * 1000ul) / FILAMENTCHANGE_EFEED_FINAL); //show progress bar during filament loading slow sequence
@@ -2803,7 +2643,7 @@ void lcd_alright() {
 
 
   lcd_set_cursor(0, 0);
   lcd_set_cursor(0, 0);
 
 
-  lcd_puts_P(_i("Changed correctly?"));////MSG_CORRECTLY c=20 r=0
+  lcd_puts_P(_i("Changed correctly?"));////MSG_CORRECTLY c=20
 
 
   lcd_set_cursor(1, 1);
   lcd_set_cursor(1, 1);
 
 
@@ -2811,11 +2651,11 @@ void lcd_alright() {
 
 
   lcd_set_cursor(1, 2);
   lcd_set_cursor(1, 2);
 
 
-  lcd_puts_P(_i("Filament not loaded"));////MSG_NOT_LOADED c=19 r=0
+  lcd_puts_P(_i("Filament not loaded"));////MSG_NOT_LOADED c=19
 
 
 
 
   lcd_set_cursor(1, 3);
   lcd_set_cursor(1, 3);
-  lcd_puts_P(_i("Color not correct"));////MSG_NOT_COLOR c=0 r=0
+  lcd_puts_P(_i("Color not correct"));////MSG_NOT_COLOR
 
 
 
 
   lcd_set_cursor(0, 1);
   lcd_set_cursor(0, 1);
@@ -2918,7 +2758,7 @@ static void lcd_LoadFilament()
 if(0)
 if(0)
   {
   {
 //      menu_back();                                // not necessary (see "lcd_return_to_status()" below)
 //      menu_back();                                // not necessary (see "lcd_return_to_status()" below)
-      custom_message_type = CUSTOM_MSG_TYPE_F_LOAD;
+      custom_message_type = CustomMsg::FilamentLoading;
       loading_flag = true;
       loading_flag = true;
       enquecommand_P(PSTR("M701")); //load filament
       enquecommand_P(PSTR("M701")); //load filament
       SERIAL_ECHOLN("Loading filament");
       SERIAL_ECHOLN("Loading filament");
@@ -2926,7 +2766,7 @@ if(0)
   }
   }
   else
   else
   {
   {
-     eFilamentAction=e_FILAMENT_ACTION_Load;
+     eFilamentAction=FilamentAction::Load;
      bFilamentFirstRun=false;
      bFilamentFirstRun=false;
      if(target_temperature[0]>=EXTRUDE_MINTEMP)
      if(target_temperature[0]>=EXTRUDE_MINTEMP)
           {
           {
@@ -3055,7 +2895,7 @@ static void _lcd_move(const char *name, int axis, int min, int max)
 	if (lcd_draw_update)
 	if (lcd_draw_update)
 	{
 	{
 	    lcd_set_cursor(0, 1);
 	    lcd_set_cursor(0, 1);
-		menu_draw_float31(' ', name, current_position[axis]);
+		menu_draw_float31(name, current_position[axis]);
 	}
 	}
 	if (menu_leaving || LCD_CLICKED) (void)enable_endstops(_md->endstopsEnabledPrevious);
 	if (menu_leaving || LCD_CLICKED) (void)enable_endstops(_md->endstopsEnabledPrevious);
 	if (LCD_CLICKED) menu_back();
 	if (LCD_CLICKED) menu_back();
@@ -3080,7 +2920,9 @@ static void lcd_move_e()
 		if (lcd_draw_update)
 		if (lcd_draw_update)
 		{
 		{
 		    lcd_set_cursor(0, 1);
 		    lcd_set_cursor(0, 1);
-			menu_draw_float31(' ', PSTR("Extruder"), current_position[E_AXIS]);
+			// Note: the colon behind the text is necessary to greatly shorten
+			// the implementation of menu_draw_float31
+			menu_draw_float31(PSTR("Extruder:"), current_position[E_AXIS]);
 		}
 		}
 		if (LCD_CLICKED) menu_back();
 		if (LCD_CLICKED) menu_back();
 	}
 	}
@@ -3167,7 +3009,7 @@ static void lcd_menu_xyz_skew()
 static void lcd_menu_xyz_offset()
 static void lcd_menu_xyz_offset()
 {
 {
     lcd_set_cursor(0,0);
     lcd_set_cursor(0,0);
-    lcd_puts_P(_i("[0;0] point offset"));////MSG_MEASURED_OFFSET c=0 r=0
+    lcd_puts_P(_i("[0;0] point offset"));////MSG_MEASURED_OFFSET
     lcd_puts_at_P(0, 1, separator);
     lcd_puts_at_P(0, 1, separator);
     lcd_puts_at_P(0, 2, PSTR("X"));
     lcd_puts_at_P(0, 2, PSTR("X"));
     lcd_puts_at_P(0, 3, PSTR("Y"));
     lcd_puts_at_P(0, 3, PSTR("Y"));
@@ -3177,7 +3019,7 @@ static void lcd_menu_xyz_offset()
     float cntr[2];
     float cntr[2];
     world2machine_read_valid(vec_x, vec_y, cntr);
     world2machine_read_valid(vec_x, vec_y, cntr);
 
 
-    for (int i = 0; i < 2; i++)
+    for (uint_least8_t i = 0; i < 2; i++)
     {
     {
         lcd_puts_at_P(11, i + 2, PSTR(""));
         lcd_puts_at_P(11, i + 2, PSTR(""));
         lcd_print(cntr[i]);
         lcd_print(cntr[i]);
@@ -3200,14 +3042,16 @@ void EEPROM_read_B(int pos, int* value)
 }
 }
 
 
 
 
+// Note: the colon behind the text (X, Y, Z) is necessary to greatly shorten
+// the implementation of menu_draw_float31
 static void lcd_move_x() {
 static void lcd_move_x() {
-  _lcd_move(PSTR("X"), X_AXIS, X_MIN_POS, X_MAX_POS);
+  _lcd_move(PSTR("X:"), X_AXIS, X_MIN_POS, X_MAX_POS);
 }
 }
 static void lcd_move_y() {
 static void lcd_move_y() {
-  _lcd_move(PSTR("Y"), Y_AXIS, Y_MIN_POS, Y_MAX_POS);
+  _lcd_move(PSTR("Y:"), Y_AXIS, Y_MIN_POS, Y_MAX_POS);
 }
 }
 static void lcd_move_z() {
 static void lcd_move_z() {
-  _lcd_move(PSTR("Z"), Z_AXIS, Z_MIN_POS, Z_MAX_POS);
+  _lcd_move(PSTR("Z:"), Z_AXIS, Z_MIN_POS, Z_MAX_POS);
 }
 }
 
 
 
 
@@ -3280,7 +3124,7 @@ static void _lcd_babystep(int axis, const char *msg)
 	if (lcd_draw_update)
 	if (lcd_draw_update)
 	{
 	{
 	    lcd_set_cursor(0, 1);
 	    lcd_set_cursor(0, 1);
-		menu_draw_float13(' ', msg, _md->babystepMemMM[axis]);
+		menu_draw_float13(msg, _md->babystepMemMM[axis]);
 	}
 	}
 	if (LCD_CLICKED || menu_leaving)
 	if (LCD_CLICKED || menu_leaving)
 	{
 	{
@@ -3296,7 +3140,7 @@ static void _lcd_babystep(int axis, const char *msg)
 
 
 static void lcd_babystep_z()
 static void lcd_babystep_z()
 {
 {
-	_lcd_babystep(Z_AXIS, (_i("Adjusting Z")));////MSG_BABYSTEPPING_Z c=20 r=0
+	_lcd_babystep(Z_AXIS, (_i("Adjusting Z:")));////MSG_BABYSTEPPING_Z c=15 Beware: must include the ':' as its last character
 }
 }
 
 
 
 
@@ -3343,20 +3187,19 @@ void lcd_adjust_bed(void)
     }
     }
     MENU_BEGIN();
     MENU_BEGIN();
 	// leaving menu - this condition must be immediately before MENU_ITEM_BACK_P
 	// leaving menu - this condition must be immediately before MENU_ITEM_BACK_P
-	if (((menu_item == menu_line) && menu_clicked && (lcd_encoder == menu_item)) || menu_leaving)
-	{
+    ON_MENU_LEAVE(
         eeprom_update_int8((unsigned char*)EEPROM_BED_CORRECTION_LEFT,  _md->left);
         eeprom_update_int8((unsigned char*)EEPROM_BED_CORRECTION_LEFT,  _md->left);
         eeprom_update_int8((unsigned char*)EEPROM_BED_CORRECTION_RIGHT, _md->right);
         eeprom_update_int8((unsigned char*)EEPROM_BED_CORRECTION_RIGHT, _md->right);
         eeprom_update_int8((unsigned char*)EEPROM_BED_CORRECTION_FRONT, _md->front);
         eeprom_update_int8((unsigned char*)EEPROM_BED_CORRECTION_FRONT, _md->front);
         eeprom_update_int8((unsigned char*)EEPROM_BED_CORRECTION_REAR,  _md->rear);
         eeprom_update_int8((unsigned char*)EEPROM_BED_CORRECTION_REAR,  _md->rear);
         eeprom_update_byte((unsigned char*)EEPROM_BED_CORRECTION_VALID, 1);
         eeprom_update_byte((unsigned char*)EEPROM_BED_CORRECTION_VALID, 1);
-	}
-	MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
+    );
+    MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
 	MENU_ITEM_EDIT_int3_P(_i("Left side [um]"),  &_md->left,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_LEFT c=14 r=1
 	MENU_ITEM_EDIT_int3_P(_i("Left side [um]"),  &_md->left,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_LEFT c=14 r=1
     MENU_ITEM_EDIT_int3_P(_i("Right side[um]"), &_md->right, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_RIGHT c=14 r=1
     MENU_ITEM_EDIT_int3_P(_i("Right side[um]"), &_md->right, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_RIGHT c=14 r=1
     MENU_ITEM_EDIT_int3_P(_i("Front side[um]"), &_md->front, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_FRONT c=14 r=1
     MENU_ITEM_EDIT_int3_P(_i("Front side[um]"), &_md->front, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_FRONT c=14 r=1
     MENU_ITEM_EDIT_int3_P(_i("Rear side [um]"),  &_md->rear,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_REAR c=14 r=1
     MENU_ITEM_EDIT_int3_P(_i("Rear side [um]"),  &_md->rear,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_REAR c=14 r=1
-    MENU_ITEM_FUNCTION_P(_i("Reset"), lcd_adjust_bed_reset);////MSG_BED_CORRECTION_RESET c=0 r=0
+    MENU_ITEM_FUNCTION_P(_i("Reset"), lcd_adjust_bed_reset);////MSG_BED_CORRECTION_RESET
     MENU_END();
     MENU_END();
 }
 }
 
 
@@ -3372,7 +3215,7 @@ void pid_extruder()
 	lcd_set_cursor(1, 2);
 	lcd_set_cursor(1, 2);
 	lcd_print(ftostr3(pid_temp));
 	lcd_print(ftostr3(pid_temp));
 	if (lcd_clicked()) {
 	if (lcd_clicked()) {
-		lcd_commands_type = LCD_COMMAND_PID_EXTRUDER;
+		lcd_commands_type = LcdCommands::PidExtruder;
 		lcd_return_to_status();
 		lcd_return_to_status();
 		lcd_update(2);
 		lcd_update(2);
 	}
 	}
@@ -3389,7 +3232,7 @@ void lcd_adjust_z() {
 
 
   lcd_clear();
   lcd_clear();
   lcd_set_cursor(0, 0);
   lcd_set_cursor(0, 0);
-  lcd_puts_P(_i("Auto adjust Z?"));////MSG_ADJUSTZ c=0 r=0
+  lcd_puts_P(_i("Auto adjust Z?"));////MSG_ADJUSTZ
   lcd_set_cursor(1, 1);
   lcd_set_cursor(1, 1);
   lcd_puts_P(_T(MSG_YES));
   lcd_puts_P(_T(MSG_YES));
 
 
@@ -3977,7 +3820,7 @@ void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, ui
 
 
 void lcd_temp_cal_show_result(bool result) {
 void lcd_temp_cal_show_result(bool result) {
 	
 	
-	custom_message_type = CUSTOM_MSG_TYPE_STATUS;
+	custom_message_type = CustomMsg::Status;
 	disable_x();
 	disable_x();
 	disable_y();
 	disable_y();
 	disable_z();
 	disable_z();
@@ -4135,6 +3978,7 @@ void prusa_statistics(int _message, uint8_t _fil_nr) {
 			SERIAL_ECHO("{");
 			SERIAL_ECHO("{");
 			prusa_stat_printerstatus(1);
 			prusa_stat_printerstatus(1);
 			prusa_stat_farm_number();
 			prusa_stat_farm_number();
+			prusa_stat_diameter();
 			SERIAL_ECHOLN("}");
 			SERIAL_ECHOLN("}");
 			status_number = 1;
 			status_number = 1;
 		}
 		}
@@ -4289,6 +4133,12 @@ static void prusa_stat_farm_number() {
 	SERIAL_ECHO("]");
 	SERIAL_ECHO("]");
 }
 }
 
 
+static void prusa_stat_diameter() {
+	SERIAL_ECHO("[DIA:");
+	SERIAL_ECHO(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM));
+	SERIAL_ECHO("]");
+}
+
 static void prusa_stat_temperatures()
 static void prusa_stat_temperatures()
 {
 {
 	SERIAL_ECHO("[ST0:");
 	SERIAL_ECHO("[ST0:");
@@ -4324,6 +4174,7 @@ static void prusa_stat_printinfo()
 	SERIAL_ECHO("][FWR:");
 	SERIAL_ECHO("][FWR:");
 	SERIAL_ECHO(FW_VERSION);
 	SERIAL_ECHO(FW_VERSION);
 	SERIAL_ECHO("]");
 	SERIAL_ECHO("]");
+     prusa_stat_diameter();
 }
 }
 
 
 /*
 /*
@@ -4339,7 +4190,7 @@ void lcd_pick_babystep(){
     
     
     lcd_set_cursor(0, 0);
     lcd_set_cursor(0, 0);
     
     
-    lcd_puts_P(_i("Pick print"));////MSG_PICK_Z c=0 r=0
+    lcd_puts_P(_i("Pick print"));////MSG_PICK_Z
     
     
     
     
     lcd_set_cursor(3, 2);
     lcd_set_cursor(3, 2);
@@ -4433,10 +4284,10 @@ void lcd_move_menu_axis()
 {
 {
 	MENU_BEGIN();
 	MENU_BEGIN();
 	MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
 	MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
-	MENU_ITEM_SUBMENU_P(_i("Move X"), lcd_move_x);////MSG_MOVE_X c=0 r=0
-	MENU_ITEM_SUBMENU_P(_i("Move Y"), lcd_move_y);////MSG_MOVE_Y c=0 r=0
-	MENU_ITEM_SUBMENU_P(_i("Move Z"), lcd_move_z);////MSG_MOVE_Z c=0 r=0
-	MENU_ITEM_SUBMENU_P(_i("Extruder"), lcd_move_e);////MSG_MOVE_E c=0 r=0
+	MENU_ITEM_SUBMENU_P(_i("Move X"), lcd_move_x);////MSG_MOVE_X
+	MENU_ITEM_SUBMENU_P(_i("Move Y"), lcd_move_y);////MSG_MOVE_Y
+	MENU_ITEM_SUBMENU_P(_i("Move Z"), lcd_move_z);////MSG_MOVE_Z
+	MENU_ITEM_SUBMENU_P(_i("Extruder"), lcd_move_e);////MSG_MOVE_E
 	MENU_END();
 	MENU_END();
 }
 }
 
 
@@ -4598,7 +4449,7 @@ static void lcd_crash_mode_set()
     }else{
     }else{
         crashdet_enable();
         crashdet_enable();
     }
     }
-	if (IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL)) menu_goto(lcd_tune_menu, 9, true, true);
+	if (IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LcdCommands::Layer1Cal)) menu_goto(lcd_tune_menu, 9, true, true);
 	else menu_goto(lcd_settings_menu, 9, true, true);
 	else menu_goto(lcd_settings_menu, 9, true, true);
     
     
 }
 }
@@ -4835,19 +4686,19 @@ void lcd_v2_calibration()
 	    if (filament < 5)
 	    if (filament < 5)
 	    {
 	    {
 	        lcd_commands_step = 20 + filament;
 	        lcd_commands_step = 20 + filament;
-	        lcd_commands_type = LCD_COMMAND_V2_CAL;
+	        lcd_commands_type = LcdCommands::Layer1Cal;
 	    }
 	    }
 	}
 	}
 	else
 	else
 	{
 	{
 		bool loaded = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Is PLA filament loaded?"), false, true);////MSG_PLA_FILAMENT_LOADED c=20 r=2
 		bool loaded = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Is PLA filament loaded?"), false, true);////MSG_PLA_FILAMENT_LOADED c=20 r=2
 		if (loaded) {
 		if (loaded) {
-			lcd_commands_type = LCD_COMMAND_V2_CAL;
+			lcd_commands_type = LcdCommands::Layer1Cal;
 		}
 		}
 		else {
 		else {
 			lcd_display_message_fullscreen_P(_i("Please load PLA filament first."));////MSG_PLEASE_LOAD_PLA c=20 r=4
 			lcd_display_message_fullscreen_P(_i("Please load PLA filament first."));////MSG_PLEASE_LOAD_PLA c=20 r=4
 			lcd_consume_click();
 			lcd_consume_click();
-			for (int i = 0; i < 20; i++) { //wait max. 2s
+			for (uint_least8_t i = 0; i < 20; i++) { //wait max. 2s
 				delay_keep_alive(100);
 				delay_keep_alive(100);
 				if (lcd_clicked()) {
 				if (lcd_clicked()) {
 					break;
 					break;
@@ -5102,7 +4953,7 @@ void lcd_wizard(WizState state)
 		case S::Lay1Cal:
 		case S::Lay1Cal:
 			lcd_show_fullscreen_message_and_wait_P(_i("Now I will calibrate distance between tip of the nozzle and heatbed surface."));////MSG_WIZARD_V2_CAL c=20 r=8
 			lcd_show_fullscreen_message_and_wait_P(_i("Now I will calibrate distance between tip of the nozzle and heatbed surface."));////MSG_WIZARD_V2_CAL c=20 r=8
 			lcd_show_fullscreen_message_and_wait_P(_i("I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."));////MSG_WIZARD_V2_CAL_2 c=20 r=12
 			lcd_show_fullscreen_message_and_wait_P(_i("I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."));////MSG_WIZARD_V2_CAL_2 c=20 r=12
-			lcd_commands_type = LCD_COMMAND_V2_CAL;
+			lcd_commands_type = LcdCommands::Layer1Cal;
 			lcd_return_to_status();
 			lcd_return_to_status();
 			end = true;
 			end = true;
 			break;
 			break;
@@ -5160,20 +5011,19 @@ void lcd_wizard(WizState state)
 void lcd_settings_linearity_correction_menu(void)
 void lcd_settings_linearity_correction_menu(void)
 {
 {
 	MENU_BEGIN();
 	MENU_BEGIN();
+    ON_MENU_LEAVE(
+        lcd_settings_linearity_correction_menu_save();
+    );
 	MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
 	MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
 #ifdef TMC2130_LINEARITY_CORRECTION_XYZ
 #ifdef TMC2130_LINEARITY_CORRECTION_XYZ
 	//tmc2130_wave_fac[X_AXIS]
 	//tmc2130_wave_fac[X_AXIS]
 
 
-	MENU_ITEM_EDIT_int3_P(_i("X-correct"),  &tmc2130_wave_fac[X_AXIS],  TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0
-	MENU_ITEM_EDIT_int3_P(_i("Y-correct"),  &tmc2130_wave_fac[Y_AXIS],  TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0
-	MENU_ITEM_EDIT_int3_P(_i("Z-correct"),  &tmc2130_wave_fac[Z_AXIS],  TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0
+	MENU_ITEM_EDIT_int3_P(_i("X-correct:"),  &tmc2130_wave_fac[X_AXIS],  TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=10
+	MENU_ITEM_EDIT_int3_P(_i("Y-correct:"),  &tmc2130_wave_fac[Y_AXIS],  TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=10
+	MENU_ITEM_EDIT_int3_P(_i("Z-correct:"),  &tmc2130_wave_fac[Z_AXIS],  TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=10
 #endif //TMC2130_LINEARITY_CORRECTION_XYZ
 #endif //TMC2130_LINEARITY_CORRECTION_XYZ
-	MENU_ITEM_EDIT_int3_P(_i("E-correct"),  &tmc2130_wave_fac[E_AXIS],  TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0
+	MENU_ITEM_EDIT_int3_P(_i("E-correct:"),  &tmc2130_wave_fac[E_AXIS],  TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=10
 	MENU_END();
 	MENU_END();
-	if(menu_leaving)
-	{
-	    lcd_settings_linearity_correction_menu_save();
-	}
 }
 }
 #endif // TMC2130
 #endif // TMC2130
 
 
@@ -5186,7 +5036,7 @@ do\
         if (fsensor_not_responding && (mmu_enabled == false))\
         if (fsensor_not_responding && (mmu_enabled == false))\
         {\
         {\
             /* Filament sensor not working*/\
             /* Filament sensor not working*/\
-            MENU_ITEM_FUNCTION_P(_i("Fil. sensor [N/A]"), lcd_fsensor_state_set);/*////MSG_FSENSOR_NA c=0 r=0*/\
+            MENU_ITEM_FUNCTION_P(_i("Fil. sensor [N/A]"), lcd_fsensor_state_set);/*////MSG_FSENSOR_NA*/\
             MENU_ITEM_SUBMENU_P(_T(MSG_FSENS_AUTOLOAD_NA), lcd_fsensor_fail);\
             MENU_ITEM_SUBMENU_P(_T(MSG_FSENS_AUTOLOAD_NA), lcd_fsensor_fail);\
         }\
         }\
         else\
         else\
@@ -5260,10 +5110,16 @@ static bool settingsCutter()
 {
 {
     if (mmu_enabled)
     if (mmu_enabled)
     {
     {
-        if (1 == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
+        if (EEPROM_MMU_CUTTER_ENABLED_enabled == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
         {
         {
             if (menu_item_function_P(_i("Cutter       [on]"), lcd_cutter_enabled)) return true;//// c=17 r=1
             if (menu_item_function_P(_i("Cutter       [on]"), lcd_cutter_enabled)) return true;//// c=17 r=1
         }
         }
+#ifdef MMU_ALWAYS_CUT
+        else if (EEPROM_MMU_CUTTER_ENABLED_always == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
+        {
+            if (menu_item_function_P(_i("Cutter   [always]"), lcd_cutter_enabled)) return true;//// c=17 r=1
+        }
+#endif
         else
         else
         {
         {
             if (menu_item_function_P(_i("Cutter      [off]"), lcd_cutter_enabled)) return true;//// c=17 r=1
             if (menu_item_function_P(_i("Cutter      [off]"), lcd_cutter_enabled)) return true;//// c=17 r=1
@@ -5427,17 +5283,112 @@ do\
 }\
 }\
 while (0)
 while (0)
 
 
+//-//
+static void lcd_check_mode_set(void)
+{
+switch(eCheckMode)
+     {
+     case e_CHECK_MODE_none:
+          eCheckMode=e_CHECK_MODE_warn;
+          break;
+     case e_CHECK_MODE_warn:
+          eCheckMode=e_CHECK_MODE_strict;
+          break;
+     case e_CHECK_MODE_strict:
+          eCheckMode=e_CHECK_MODE_none;
+          break;
+     default:
+          eCheckMode=e_CHECK_MODE_none;
+     }
+eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)eCheckMode);
+}
+
+static void lcd_nozzle_diameter_set(void)
+{
+uint16_t nDiameter;
+
+switch(eNozzleDiameter)
+     {
+     case e_NOZZLE_DIAMETER_250:
+          eNozzleDiameter=e_NOZZLE_DIAMETER_400;
+          nDiameter=400;
+          break;
+     case e_NOZZLE_DIAMETER_400:
+          eNozzleDiameter=e_NOZZLE_DIAMETER_600;
+          nDiameter=600;
+          break;
+     case e_NOZZLE_DIAMETER_600:
+          eNozzleDiameter=e_NOZZLE_DIAMETER_250;
+          nDiameter=250;
+          break;
+     default:
+          eNozzleDiameter=e_NOZZLE_DIAMETER_400;
+          nDiameter=400;
+     }
+eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)eNozzleDiameter);
+eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,nDiameter);
+}
+
+#define SETTINGS_MODE \
+do\
+{\
+    switch(eCheckMode)\
+         {\
+         case e_CHECK_MODE_none:\
+              MENU_ITEM_FUNCTION_P(_i("Action     [none]"),lcd_check_mode_set);\
+              break;\
+         case e_CHECK_MODE_warn:\
+              MENU_ITEM_FUNCTION_P(_i("Action     [warn]"),lcd_check_mode_set);\
+              break;\
+         case e_CHECK_MODE_strict:\
+              MENU_ITEM_FUNCTION_P(_i("Action   [strict]"),lcd_check_mode_set);\
+              break;\
+         default:\
+              MENU_ITEM_FUNCTION_P(_i("Action     [none]"),lcd_check_mode_set);\
+         }\
+}\
+while (0)
+
+#define SETTINGS_NOZZLE \
+do\
+{\
+    switch(eNozzleDiameter)\
+         {\
+         case e_NOZZLE_DIAMETER_250:\
+              MENU_ITEM_FUNCTION_P(_i("Nozzle     [0.25]"),lcd_nozzle_diameter_set);\
+              break;\
+         case e_NOZZLE_DIAMETER_400:\
+              MENU_ITEM_FUNCTION_P(_i("Nozzle     [0.40]"),lcd_nozzle_diameter_set);\
+              break;\
+         case e_NOZZLE_DIAMETER_600:\
+              MENU_ITEM_FUNCTION_P(_i("Nozzle     [0.60]"),lcd_nozzle_diameter_set);\
+              break;\
+         default:\
+              MENU_ITEM_FUNCTION_P(_i("Nozzle     [0.40]"),lcd_nozzle_diameter_set);\
+         }\
+}\
+while (0)
+
+static void lcd_checking_menu()
+{
+MENU_BEGIN();
+MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
+SETTINGS_MODE;
+SETTINGS_NOZZLE;
+MENU_END();
+}
+
 static void lcd_settings_menu()
 static void lcd_settings_menu()
 {
 {
 	EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu));
 	EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu));
 	MENU_BEGIN();
 	MENU_BEGIN();
 	MENU_ITEM_BACK_P(_T(MSG_MAIN));
 	MENU_ITEM_BACK_P(_T(MSG_MAIN));
 
 
-	MENU_ITEM_SUBMENU_P(_i("Temperature"), lcd_control_temperature_menu);////MSG_TEMPERATURE c=0 r=0
+	MENU_ITEM_SUBMENU_P(_i("Temperature"), lcd_control_temperature_menu);////MSG_TEMPERATURE
 	if (!homing_flag)
 	if (!homing_flag)
-	    MENU_ITEM_SUBMENU_P(_i("Move axis"), lcd_move_menu_1mm);////MSG_MOVE_AXIS c=0 r=0
+	    MENU_ITEM_SUBMENU_P(_i("Move axis"), lcd_move_menu_1mm);////MSG_MOVE_AXIS
 	if (!isPrintPaused)
 	if (!isPrintPaused)
-	    MENU_ITEM_GCODE_P(_i("Disable steppers"), PSTR("M84"));////MSG_DISABLE_STEPPERS c=0 r=0
+	    MENU_ITEM_GCODE_P(_i("Disable steppers"), PSTR("M84"));////MSG_DISABLE_STEPPERS
 
 
 	SETTINGS_FILAMENT_SENSOR;
 	SETTINGS_FILAMENT_SENSOR;
 
 
@@ -5475,9 +5426,12 @@ static void lcd_settings_menu()
 		MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);
 		MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);
 
 
 #if (LANG_MODE != 0)
 #if (LANG_MODE != 0)
-	MENU_ITEM_SUBMENU_P(_i("Select language"), lcd_language_menu);////MSG_LANGUAGE_SELECT c=0 r=0
+	MENU_ITEM_SUBMENU_P(_i("Select language"), lcd_language_menu);////MSG_LANGUAGE_SELECT
 #endif //(LANG_MODE != 0)
 #endif //(LANG_MODE != 0)
 
 
+	if (!farm_mode)
+          MENU_ITEM_SUBMENU_P(_i("Print checking"), lcd_checking_menu);
+
 	SETTINGS_SD;
 	SETTINGS_SD;
 	SETTINGS_SOUND;
 	SETTINGS_SOUND;
 
 
@@ -5526,31 +5480,31 @@ static void lcd_calibration_menu()
 	MENU_ITEM_FUNCTION_P(_i("Wizard"), lcd_wizard);////MSG_WIZARD c=17 r=1
 	MENU_ITEM_FUNCTION_P(_i("Wizard"), lcd_wizard);////MSG_WIZARD c=17 r=1
 	MENU_ITEM_SUBMENU_P(_i("First layer cal."), lcd_v2_calibration);////MSG_V2_CALIBRATION c=17 r=1
 	MENU_ITEM_SUBMENU_P(_i("First layer cal."), lcd_v2_calibration);////MSG_V2_CALIBRATION c=17 r=1
 	MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME), PSTR("G28 W"));
 	MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME), PSTR("G28 W"));
-	MENU_ITEM_FUNCTION_P(_i("Selftest         "), lcd_selftest_v);////MSG_SELFTEST c=0 r=0
+	MENU_ITEM_FUNCTION_P(_i("Selftest         "), lcd_selftest_v);////MSG_SELFTEST
 #ifdef MK1BP
 #ifdef MK1BP
     // MK1
     // MK1
     // "Calibrate Z"
     // "Calibrate Z"
     MENU_ITEM_GCODE_P(_T(MSG_HOMEYZ), PSTR("G28 Z"));
     MENU_ITEM_GCODE_P(_T(MSG_HOMEYZ), PSTR("G28 Z"));
 #else //MK1BP
 #else //MK1BP
     // MK2
     // MK2
-    MENU_ITEM_FUNCTION_P(_i("Calibrate XYZ"), lcd_mesh_calibration);////MSG_CALIBRATE_BED c=0 r=0
+    MENU_ITEM_FUNCTION_P(_i("Calibrate XYZ"), lcd_mesh_calibration);////MSG_CALIBRATE_BED
     // "Calibrate Z" with storing the reference values to EEPROM.
     // "Calibrate Z" with storing the reference values to EEPROM.
     MENU_ITEM_SUBMENU_P(_T(MSG_HOMEYZ), lcd_mesh_calibration_z);
     MENU_ITEM_SUBMENU_P(_T(MSG_HOMEYZ), lcd_mesh_calibration_z);
 #ifndef SNMM
 #ifndef SNMM
 	//MENU_ITEM_FUNCTION_P(_i("Calibrate E"), lcd_calibrate_extruder);////MSG_CALIBRATE_E c=20 r=1
 	//MENU_ITEM_FUNCTION_P(_i("Calibrate E"), lcd_calibrate_extruder);////MSG_CALIBRATE_E c=20 r=1
 #endif
 #endif
     // "Mesh Bed Leveling"
     // "Mesh Bed Leveling"
-    MENU_ITEM_SUBMENU_P(_i("Mesh Bed Leveling"), lcd_mesh_bedleveling);////MSG_MESH_BED_LEVELING c=0 r=0
+    MENU_ITEM_SUBMENU_P(_i("Mesh Bed Leveling"), lcd_mesh_bedleveling);////MSG_MESH_BED_LEVELING
 	
 	
 #endif //MK1BP
 #endif //MK1BP
 
 
-    MENU_ITEM_SUBMENU_P(_i("Bed level correct"), lcd_adjust_bed);////MSG_BED_CORRECTION_MENU c=0 r=0
+    MENU_ITEM_SUBMENU_P(_i("Bed level correct"), lcd_adjust_bed);////MSG_BED_CORRECTION_MENU
 	MENU_ITEM_SUBMENU_P(_i("PID calibration"), pid_extruder);////MSG_PID_EXTRUDER c=17 r=1
 	MENU_ITEM_SUBMENU_P(_i("PID calibration"), pid_extruder);////MSG_PID_EXTRUDER c=17 r=1
 #ifndef TMC2130
 #ifndef TMC2130
     MENU_ITEM_SUBMENU_P(_i("Show end stops"), menu_show_end_stops);////MSG_SHOW_END_STOPS c=17 r=1
     MENU_ITEM_SUBMENU_P(_i("Show end stops"), menu_show_end_stops);////MSG_SHOW_END_STOPS c=17 r=1
 #endif
 #endif
 #ifndef MK1BP
 #ifndef MK1BP
-    MENU_ITEM_GCODE_P(_i("Reset XYZ calibr."), PSTR("M44"));////MSG_CALIBRATE_BED_RESET c=0 r=0
+    MENU_ITEM_GCODE_P(_i("Reset XYZ calibr."), PSTR("M44"));////MSG_CALIBRATE_BED_RESET
 #endif //MK1BP
 #endif //MK1BP
 #ifndef SNMM
 #ifndef SNMM
 	//MENU_ITEM_FUNCTION_P(MSG_RESET_CALIBRATE_E, lcd_extr_cal_reset);
 	//MENU_ITEM_FUNCTION_P(MSG_RESET_CALIBRATE_E, lcd_extr_cal_reset);
@@ -5569,7 +5523,7 @@ void bowden_menu() {
 	lcd_clear();
 	lcd_clear();
 	lcd_set_cursor(0, 0);
 	lcd_set_cursor(0, 0);
 	lcd_print(">");
 	lcd_print(">");
-	for (int i = 0; i < 4; i++) {
+	for (uint_least8_t i = 0; i < 4; i++) {
 		lcd_set_cursor(1, i);
 		lcd_set_cursor(1, i);
 		lcd_print("Extruder ");
 		lcd_print("Extruder ");
 		lcd_print(i);
 		lcd_print(i);
@@ -5657,7 +5611,7 @@ void bowden_menu() {
 						enc_dif = lcd_encoder_diff;
 						enc_dif = lcd_encoder_diff;
 						lcd_set_cursor(0, cursor_pos);
 						lcd_set_cursor(0, cursor_pos);
 						lcd_print(">");
 						lcd_print(">");
-						for (int i = 0; i < 4; i++) {
+						for (uint_least8_t i = 0; i < 4; i++) {
 							lcd_set_cursor(1, i);
 							lcd_set_cursor(1, i);
 							lcd_print("Extruder ");
 							lcd_print("Extruder ");
 							lcd_print(i);
 							lcd_print(i);
@@ -5784,14 +5738,14 @@ uint8_t choose_menu_P(const char *header, const char *item, const char *last_ite
         if (header) lcd_puts_at_P(0,0,header);
         if (header) lcd_puts_at_P(0,0,header);
 
 
         const bool last_visible = (first == items_no - 3);
         const bool last_visible = (first == items_no - 3);
-        const int8_t ordinary_items = (last_item&&last_visible)?2:3;
+        const uint_least8_t ordinary_items = (last_item&&last_visible)?2:3;
 
 
-        for (int i = 0; i < ordinary_items; i++)
+        for (uint_least8_t i = 0; i < ordinary_items; i++)
         {
         {
             if (item) lcd_puts_at_P(1, i + 1, item);
             if (item) lcd_puts_at_P(1, i + 1, item);
         }
         }
 
 
-        for (int i = 0; i < ordinary_items; i++)
+        for (uint_least8_t i = 0; i < ordinary_items; i++)
         {
         {
             lcd_set_cursor(2 + item_len, i+1);
             lcd_set_cursor(2 + item_len, i+1);
             lcd_print(first + i + 1);
             lcd_print(first + i + 1);
@@ -5845,7 +5799,7 @@ char reset_menu() {
 	lcd_consume_click();
 	lcd_consume_click();
 	while (1) {		
 	while (1) {		
 
 
-		for (int i = 0; i < 4; i++) {
+		for (uint_least8_t i = 0; i < 4; i++) {
 			lcd_set_cursor(1, i);
 			lcd_set_cursor(1, i);
 			lcd_print(item[first + i]);
 			lcd_print(item[first + i]);
 		}
 		}
@@ -5920,54 +5874,48 @@ static void lcd_disable_farm_mode()
 
 
 static void fil_load_menu()
 static void fil_load_menu()
 {
 {
-	MENU_BEGIN();
-	MENU_ITEM_BACK_P(_T(MSG_MAIN));
-	MENU_ITEM_FUNCTION_P(_i("Load all"), load_all);////MSG_LOAD_ALL c=17 r=0
-	MENU_ITEM_FUNCTION_P(_i("Load filament 1"), extr_adj_0);////MSG_LOAD_FILAMENT_1 c=17 r=0
-	MENU_ITEM_FUNCTION_P(_i("Load filament 2"), extr_adj_1);////MSG_LOAD_FILAMENT_2 c=17 r=0
-	MENU_ITEM_FUNCTION_P(_i("Load filament 3"), extr_adj_2);////MSG_LOAD_FILAMENT_3 c=17 r=0
-	MENU_ITEM_FUNCTION_P(_i("Load filament 4"), extr_adj_3);////MSG_LOAD_FILAMENT_4 c=17 r=0
-
-	if (mmu_enabled)
-		MENU_ITEM_FUNCTION_P(_i("Load filament 5"), extr_adj_4);
-
-	MENU_END();
-}
+    MENU_BEGIN();
+    MENU_ITEM_BACK_P(_T(MSG_MAIN));
+    MENU_ITEM_FUNCTION_P(_i("Load all"), load_all); ////MSG_LOAD_ALL c=17
+    MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), '1', extr_adj, 0); ////MSG_LOAD_FILAMENT_1 c=16
+    MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), '2', extr_adj, 1); ////MSG_LOAD_FILAMENT_2 c=17
+    MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), '3', extr_adj, 2); ////MSG_LOAD_FILAMENT_3 c=17
+    MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), '4', extr_adj, 3); ////MSG_LOAD_FILAMENT_4 c=17
 
 
-template <uint8_t filament>
-static void mmu_load_to_nozzle()
-{
-    menu_back();
-    lcd_mmu_load_to_nozzle(filament);
+    if (mmu_enabled)
+    {
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), '5', extr_adj, 4);
+    }
+    MENU_END();
 }
 }
 
 
 static void mmu_load_to_nozzle_menu()
 static void mmu_load_to_nozzle_menu()
 {
 {
-if(bFilamentAction)
-{
-	MENU_BEGIN();
-	MENU_ITEM_BACK_P(_T(MSG_MAIN));
-	MENU_ITEM_FUNCTION_P(_i("Load filament 1"), mmu_load_to_nozzle<0>);
-	MENU_ITEM_FUNCTION_P(_i("Load filament 2"), mmu_load_to_nozzle<1>);
-	MENU_ITEM_FUNCTION_P(_i("Load filament 3"), mmu_load_to_nozzle<2>);
-	MENU_ITEM_FUNCTION_P(_i("Load filament 4"), mmu_load_to_nozzle<3>);
-	MENU_ITEM_FUNCTION_P(_i("Load filament 5"), mmu_load_to_nozzle<4>);
-	MENU_END();
-}
-else {
-     eFilamentAction=e_FILAMENT_ACTION_mmuLoad;
-     bFilamentFirstRun=false;
-     if(target_temperature[0]>=EXTRUDE_MINTEMP)
-          {
-          bFilamentPreheatState=true;
-          mFilamentItem(target_temperature[0],target_temperature_bed);
-          }
-     else mFilamentMenu();
-     }
+    if (bFilamentAction)
+    {
+        MENU_BEGIN();
+        MENU_ITEM_BACK_P(_T(MSG_MAIN));
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), '1', lcd_mmu_load_to_nozzle, 0);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), '2', lcd_mmu_load_to_nozzle, 1);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), '3', lcd_mmu_load_to_nozzle, 2);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), '4', lcd_mmu_load_to_nozzle, 3);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), '5', lcd_mmu_load_to_nozzle, 4);
+        MENU_END();
+    }
+    else
+    {
+        eFilamentAction = FilamentAction::MmuLoad;
+        bFilamentFirstRun = false;
+        if (target_temperature[0] >= EXTRUDE_MINTEMP)
+        {
+            bFilamentPreheatState = true;
+            mFilamentItem(target_temperature[0], target_temperature_bed);
+        }
+        else mFilamentMenu();
+    }
 }
 }
 
 
-template <uint8_t filament>
-static void mmu_eject_filament()
+static void mmu_eject_filament(uint8_t filament)
 {
 {
     menu_back();
     menu_back();
     mmu_eject_filament(filament, true);
     mmu_eject_filament(filament, true);
@@ -5975,61 +5923,56 @@ static void mmu_eject_filament()
 
 
 static void mmu_fil_eject_menu()
 static void mmu_fil_eject_menu()
 {
 {
-    if(bFilamentAction)
+    if (bFilamentAction)
     {
     {
         MENU_BEGIN();
         MENU_BEGIN();
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
         MENU_ITEM_BACK_P(_T(MSG_MAIN));
-        MENU_ITEM_FUNCTION_P(_i("Eject filament 1"), mmu_eject_filament<0>);
-        MENU_ITEM_FUNCTION_P(_i("Eject filament 2"), mmu_eject_filament<1>);
-        MENU_ITEM_FUNCTION_P(_i("Eject filament 3"), mmu_eject_filament<2>);
-        MENU_ITEM_FUNCTION_P(_i("Eject filament 4"), mmu_eject_filament<3>);
-        MENU_ITEM_FUNCTION_P(_i("Eject filament 5"), mmu_eject_filament<4>);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_EJECT_FILAMENT), '1', mmu_eject_filament, 0);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_EJECT_FILAMENT), '2', mmu_eject_filament, 1);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_EJECT_FILAMENT), '3', mmu_eject_filament, 2);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_EJECT_FILAMENT), '4', mmu_eject_filament, 3);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_EJECT_FILAMENT), '5', mmu_eject_filament, 4);
         MENU_END();
         MENU_END();
     }
     }
     else
     else
     {
     {
-        eFilamentAction=e_FILAMENT_ACTION_mmuEject;
-        bFilamentFirstRun=false;
-        if(target_temperature[0]>=EXTRUDE_MINTEMP)
+        eFilamentAction = FilamentAction::MmuEject;
+        bFilamentFirstRun = false;
+        if (target_temperature[0] >= EXTRUDE_MINTEMP)
         {
         {
-            bFilamentPreheatState=true;
-            mFilamentItem(target_temperature[0],target_temperature_bed);
+            bFilamentPreheatState = true;
+            mFilamentItem(target_temperature[0], target_temperature_bed);
         }
         }
         else mFilamentMenu();
         else mFilamentMenu();
     }
     }
 }
 }
 
 
 #ifdef MMU_HAS_CUTTER
 #ifdef MMU_HAS_CUTTER
-template <uint8_t filament>
-static void mmu_cut_filament()
-{
-    menu_back();
-    mmu_cut_filament(filament);
-}
 
 
 static void mmu_cut_filament_menu()
 static void mmu_cut_filament_menu()
 {
 {
-if(bFilamentAction)
-{
-    MENU_BEGIN();
-    MENU_ITEM_BACK_P(_T(MSG_MAIN));
-    MENU_ITEM_FUNCTION_P(_i("Cut filament 1"), mmu_cut_filament<0>);
-    MENU_ITEM_FUNCTION_P(_i("Cut filament 2"), mmu_cut_filament<1>);
-    MENU_ITEM_FUNCTION_P(_i("Cut filament 3"), mmu_cut_filament<2>);
-    MENU_ITEM_FUNCTION_P(_i("Cut filament 4"), mmu_cut_filament<3>);
-    MENU_ITEM_FUNCTION_P(_i("Cut filament 5"), mmu_cut_filament<4>);
-    MENU_END();
-}
-else {
-     eFilamentAction=e_FILAMENT_ACTION_mmuCut;
-     bFilamentFirstRun=false;
-     if(target_temperature[0]>=EXTRUDE_MINTEMP)
-          {
-          bFilamentPreheatState=true;
-          mFilamentItem(target_temperature[0],target_temperature_bed);
-          }
-     else mFilamentMenu();
-     }
+    if(bFilamentAction)
+    {
+        MENU_BEGIN();
+        MENU_ITEM_BACK_P(_T(MSG_MAIN));
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_CUT_FILAMENT), '1', mmu_cut_filament, 0);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_CUT_FILAMENT), '2', mmu_cut_filament, 1);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_CUT_FILAMENT), '3', mmu_cut_filament, 2);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_CUT_FILAMENT), '4', mmu_cut_filament, 3);
+        MENU_ITEM_FUNCTION_NR_P(_T(MSG_CUT_FILAMENT), '5', mmu_cut_filament, 4);
+        MENU_END();
+    }
+    else
+    {
+        eFilamentAction=FilamentAction::MmuCut;
+        bFilamentFirstRun=false;
+        if(target_temperature[0]>=EXTRUDE_MINTEMP)
+        {
+            bFilamentPreheatState=true;
+            mFilamentItem(target_temperature[0],target_temperature_bed);
+        }
+        else mFilamentMenu();
+    }
 }
 }
 #endif //MMU_HAS_CUTTER
 #endif //MMU_HAS_CUTTER
 
 
@@ -6038,14 +5981,14 @@ static void fil_unload_menu()
 {
 {
 	MENU_BEGIN();
 	MENU_BEGIN();
 	MENU_ITEM_BACK_P(_T(MSG_MAIN));
 	MENU_ITEM_BACK_P(_T(MSG_MAIN));
-	MENU_ITEM_FUNCTION_P(_i("Unload all"), extr_unload_all);////MSG_UNLOAD_ALL c=17 r=0
-	MENU_ITEM_FUNCTION_P(_i("Unload filament 1"), extr_unload_0);////MSG_UNLOAD_FILAMENT_1 c=17 r=0
-	MENU_ITEM_FUNCTION_P(_i("Unload filament 2"), extr_unload_1);////MSG_UNLOAD_FILAMENT_2 c=17 r=0
-	MENU_ITEM_FUNCTION_P(_i("Unload filament 3"), extr_unload_2);////MSG_UNLOAD_FILAMENT_3 c=17 r=0
-	MENU_ITEM_FUNCTION_P(_i("Unload filament 4"), extr_unload_3);////MSG_UNLOAD_FILAMENT_4 c=17 r=0
+	MENU_ITEM_FUNCTION_P(_i("Unload all"), extr_unload_all);////MSG_UNLOAD_ALL c=17
+	MENU_ITEM_FUNCTION_P(_i("Unload filament 1"), extr_unload_0);////MSG_UNLOAD_FILAMENT_1 c=17
+	MENU_ITEM_FUNCTION_P(_i("Unload filament 2"), extr_unload_1);////MSG_UNLOAD_FILAMENT_2 c=17
+	MENU_ITEM_FUNCTION_P(_i("Unload filament 3"), extr_unload_2);////MSG_UNLOAD_FILAMENT_3 c=17
+	MENU_ITEM_FUNCTION_P(_i("Unload filament 4"), extr_unload_3);////MSG_UNLOAD_FILAMENT_4 c=17
 
 
 	if (mmu_enabled)
 	if (mmu_enabled)
-		MENU_ITEM_FUNCTION_P(_i("Unload filament 5"), extr_unload_4);////MSG_UNLOAD_FILAMENT_5 c=17 r=0
+		MENU_ITEM_FUNCTION_P(_i("Unload filament 5"), extr_unload_4);////MSG_UNLOAD_FILAMENT_5 c=17
 
 
 	MENU_END();
 	MENU_END();
 }
 }
@@ -6066,7 +6009,7 @@ static void change_extr_menu(){
 //unload filament for single material printer (used in M702 gcode)
 //unload filament for single material printer (used in M702 gcode)
 void unload_filament()
 void unload_filament()
 {
 {
-	custom_message_type = CUSTOM_MSG_TYPE_F_LOAD;
+	custom_message_type = CustomMsg::FilamentLoading;
 	lcd_setstatuspgm(_T(MSG_UNLOADING_FILAMENT));
 	lcd_setstatuspgm(_T(MSG_UNLOADING_FILAMENT));
 
 
 	//		extr_unload2();
 	//		extr_unload2();
@@ -6101,7 +6044,7 @@ void unload_filament()
 	lcd_update_enable(true);
 	lcd_update_enable(true);
 
 
 	lcd_setstatuspgm(_T(WELCOME_MSG));
 	lcd_setstatuspgm(_T(WELCOME_MSG));
-	custom_message_type = CUSTOM_MSG_TYPE_STATUS;
+	custom_message_type = CustomMsg::Status;
 
 
 }
 }
 
 
@@ -6182,7 +6125,7 @@ unsigned char lcd_choose_color() {
 	item[0] = "Orange";
 	item[0] = "Orange";
 	item[1] = "Black";
 	item[1] = "Black";
 	//-----------------------------------------------------
 	//-----------------------------------------------------
-	unsigned char active_rows;
+	uint_least8_t active_rows;
 	static int first = 0;
 	static int first = 0;
 	int enc_dif = 0;
 	int enc_dif = 0;
 	unsigned char cursor_pos = 1;
 	unsigned char cursor_pos = 1;
@@ -6195,7 +6138,7 @@ unsigned char lcd_choose_color() {
 	lcd_consume_click();
 	lcd_consume_click();
 	while (1) {
 	while (1) {
 		lcd_puts_at_P(0, 0, PSTR("Choose color:"));
 		lcd_puts_at_P(0, 0, PSTR("Choose color:"));
-		for (int i = 0; i < active_rows; i++) {
+		for (uint_least8_t i = 0; i < active_rows; i++) {
 			lcd_set_cursor(1, i+1);
 			lcd_set_cursor(1, i+1);
 			lcd_print(item[first + i]);
 			lcd_print(item[first + i]);
 		}
 		}
@@ -6301,10 +6244,11 @@ void lcd_confirm_print()
 		}
 		}
 		if (lcd_clicked())
 		if (lcd_clicked())
 		{
 		{
+               filament_type = FARM_FILAMENT_COLOR_NONE;
 			if (cursor_pos == 1)
 			if (cursor_pos == 1)
 			{
 			{
 				_ret = 1;
 				_ret = 1;
-				filament_type = lcd_choose_color();
+//				filament_type = lcd_choose_color();
 				prusa_statistics(4, filament_type);
 				prusa_statistics(4, filament_type);
 				no_response = true; //we need confirmation by recieving PRUSA thx
 				no_response = true; //we need confirmation by recieving PRUSA thx
 				important_status = 4;
 				important_status = 4;
@@ -6314,7 +6258,7 @@ void lcd_confirm_print()
 			if (cursor_pos == 2)
 			if (cursor_pos == 2)
 			{
 			{
 				_ret = 2;
 				_ret = 2;
-				filament_type = lcd_choose_color();
+//				filament_type = lcd_choose_color();
 				prusa_statistics(5, filament_type);
 				prusa_statistics(5, filament_type);
 				no_response = true; //we need confirmation by recieving PRUSA thx
 				no_response = true; //we need confirmation by recieving PRUSA thx
 				important_status = 5;				
 				important_status = 5;				
@@ -6428,43 +6372,43 @@ static void lcd_main_menu()
         
         
     }*/
     }*/
  
  
-  if ( ( IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL)) && (current_position[Z_AXIS] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU) && !homing_flag && !mesh_bed_leveling_flag)
+  if ( ( IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LcdCommands::Layer1Cal)) && (current_position[Z_AXIS] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU) && !homing_flag && !mesh_bed_leveling_flag)
   {
   {
 	MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);//8
 	MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);//8
   }
   }
 
 
 
 
-  if ( moves_planned() || IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL))
+  if ( moves_planned() || IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LcdCommands::Layer1Cal))
   {
   {
-    MENU_ITEM_SUBMENU_P(_i("Tune"), lcd_tune_menu);////MSG_TUNE c=0 r=0
+    MENU_ITEM_SUBMENU_P(_i("Tune"), lcd_tune_menu);////MSG_TUNE
   } else 
   } else 
   {
   {
-    MENU_ITEM_SUBMENU_P(_i("Preheat"), lcd_preheat_menu);////MSG_PREHEAT c=0 r=0
+    MENU_ITEM_SUBMENU_P(_i("Preheat"), lcd_preheat_menu);////MSG_PREHEAT
   }
   }
 
 
 #ifdef SDSUPPORT
 #ifdef SDSUPPORT
-  if (card.cardOK || lcd_commands_type == LCD_COMMAND_V2_CAL)
+  if (card.cardOK || lcd_commands_type == LcdCommands::Layer1Cal)
   {
   {
     if (card.isFileOpen())
     if (card.isFileOpen())
     {
     {
 		if (mesh_bed_leveling_flag == false && homing_flag == false) {
 		if (mesh_bed_leveling_flag == false && homing_flag == false) {
 			if (card.sdprinting)
 			if (card.sdprinting)
 			{
 			{
-				MENU_ITEM_FUNCTION_P(_i("Pause print"), lcd_pause_print);////MSG_PAUSE_PRINT c=0 r=0
+				MENU_ITEM_FUNCTION_P(_i("Pause print"), lcd_pause_print);////MSG_PAUSE_PRINT
 			}
 			}
 			else
 			else
 			{
 			{
-			    MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT c=0 r=0
+			    MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT
 			}
 			}
 			MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop);
 			MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop);
 		}
 		}
 	}
 	}
-	else if (lcd_commands_type == LCD_COMMAND_V2_CAL && mesh_bed_leveling_flag == false && homing_flag == false) {
+	else if (lcd_commands_type == LcdCommands::Layer1Cal && mesh_bed_leveling_flag == false && homing_flag == false) {
 		//MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop);
 		//MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop);
 	}
 	}
 	else
 	else
 	{
 	{
-		if (!is_usb_printing && (lcd_commands_type != LCD_COMMAND_V2_CAL))
+		if (!is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
 		{
 		{
 			//if (farm_mode) MENU_ITEM_SUBMENU_P(MSG_FARM_CARD_MENU, lcd_farm_sdcard_menu);
 			//if (farm_mode) MENU_ITEM_SUBMENU_P(MSG_FARM_CARD_MENU, lcd_farm_sdcard_menu);
 			/*else*/ {
 			/*else*/ {
@@ -6473,22 +6417,22 @@ static void lcd_main_menu()
                         }
                         }
 		}
 		}
 #if SDCARDDETECT < 1
 #if SDCARDDETECT < 1
-      MENU_ITEM_GCODE_P(_i("Change SD card"), PSTR("M21"));  // SD-card changed by user////MSG_CNG_SDCARD c=0 r=0
+      MENU_ITEM_GCODE_P(_i("Change SD card"), PSTR("M21"));  // SD-card changed by user////MSG_CNG_SDCARD
 #endif
 #endif
     }
     }
 	
 	
   } else 
   } else 
   {
   {
     bMain=true;                                   // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
     bMain=true;                                   // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
-    MENU_ITEM_SUBMENU_P(_i("No SD card"), lcd_sdcard_menu);////MSG_NO_CARD c=0 r=0
+    MENU_ITEM_SUBMENU_P(_i("No SD card"), lcd_sdcard_menu);////MSG_NO_CARD
 #if SDCARDDETECT < 1
 #if SDCARDDETECT < 1
-    MENU_ITEM_GCODE_P(_i("Init. SD card"), PSTR("M21")); // Manually initialize the SD-card via user interface////MSG_INIT_SDCARD c=0 r=0
+    MENU_ITEM_GCODE_P(_i("Init. SD card"), PSTR("M21")); // Manually initialize the SD-card via user interface////MSG_INIT_SDCARD
 #endif
 #endif
   }
   }
 #endif
 #endif
 
 
 
 
-  if (IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL))
+  if (IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LcdCommands::Layer1Cal))
   {
   {
 	  if (farm_mode)
 	  if (farm_mode)
 	  {
 	  {
@@ -6517,7 +6461,7 @@ static void lcd_main_menu()
 #endif
 #endif
 #ifdef FILAMENT_SENSOR
 #ifdef FILAMENT_SENSOR
 		if ((fsensor_autoload_enabled == true) && (fsensor_enabled == true) && (mmu_enabled == false))
 		if ((fsensor_autoload_enabled == true) && (fsensor_enabled == true) && (mmu_enabled == false))
-			MENU_ITEM_SUBMENU_P(_i("AutoLoad filament"), lcd_menu_AutoLoadFilament);////MSG_AUTOLOAD_FILAMENT c=17 r=0
+			MENU_ITEM_SUBMENU_P(_i("AutoLoad filament"), lcd_menu_AutoLoadFilament);////MSG_AUTOLOAD_FILAMENT c=17
 		else
 		else
 #endif //FILAMENT_SENSOR
 #endif //FILAMENT_SENSOR
           {
           {
@@ -6532,9 +6476,9 @@ static void lcd_main_menu()
 
 
   }
   }
 
 
-  if (!is_usb_printing && (lcd_commands_type != LCD_COMMAND_V2_CAL))
+  if (!is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
   {
   {
-	  MENU_ITEM_SUBMENU_P(_i("Statistics  "), lcd_menu_statistics);////MSG_STATISTICS c=0 r=0
+	  MENU_ITEM_SUBMENU_P(_i("Statistics  "), lcd_menu_statistics);////MSG_STATISTICS
   }
   }
     
     
 #if defined(TMC2130) || defined(FILAMENT_SENSOR)
 #if defined(TMC2130) || defined(FILAMENT_SENSOR)
@@ -6543,9 +6487,9 @@ static void lcd_main_menu()
   if (mmu_enabled) {
   if (mmu_enabled) {
 	  MENU_ITEM_SUBMENU_P(_i("Fail stats MMU"), lcd_menu_fails_stats_mmu);
 	  MENU_ITEM_SUBMENU_P(_i("Fail stats MMU"), lcd_menu_fails_stats_mmu);
   }
   }
-  MENU_ITEM_SUBMENU_P(_i("Support"), lcd_support_menu);////MSG_SUPPORT c=0 r=0
+  MENU_ITEM_SUBMENU_P(_i("Support"), lcd_support_menu);////MSG_SUPPORT
 #ifdef LCD_TEST
 #ifdef LCD_TEST
-    MENU_ITEM_SUBMENU_P(_i("W25x20CL init"), lcd_test_menu);////MSG_SUPPORT c=0 r=0
+    MENU_ITEM_SUBMENU_P(_i("W25x20CL init"), lcd_test_menu);////MSG_SUPPORT
 #endif //LCD_TEST
 #endif //LCD_TEST
 
 
   MENU_END();
   MENU_END();
@@ -6588,7 +6532,7 @@ static void lcd_colorprint_change() {
 	
 	
 	enquecommand_P(PSTR("M600"));
 	enquecommand_P(PSTR("M600"));
 	
 	
-	custom_message_type = CUSTOM_MSG_TYPE_F_LOAD; //just print status message
+	custom_message_type = CustomMsg::FilamentLoading; //just print status message
 	lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
 	lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
 	lcd_return_to_status();
 	lcd_return_to_status();
 	lcd_draw_update = 3;
 	lcd_draw_update = 3;
@@ -6625,13 +6569,13 @@ static void lcd_tune_menu()
 
 
 	MENU_BEGIN();
 	MENU_BEGIN();
 	MENU_ITEM_BACK_P(_T(MSG_MAIN)); //1
 	MENU_ITEM_BACK_P(_T(MSG_MAIN)); //1
-	MENU_ITEM_EDIT_int3_P(_i("Speed"), &feedmultiply, 10, 999);//2////MSG_SPEED c=0 r=0
+	MENU_ITEM_EDIT_int3_P(_i("Speed"), &feedmultiply, 10, 999);//2////MSG_SPEED
 
 
 	MENU_ITEM_EDIT_int3_P(_T(MSG_NOZZLE), &target_temperature[0], 0, HEATER_0_MAXTEMP - 10);//3
 	MENU_ITEM_EDIT_int3_P(_T(MSG_NOZZLE), &target_temperature[0], 0, HEATER_0_MAXTEMP - 10);//3
 	MENU_ITEM_EDIT_int3_P(_T(MSG_BED), &target_temperature_bed, 0, BED_MAXTEMP - 10);//4
 	MENU_ITEM_EDIT_int3_P(_T(MSG_BED), &target_temperature_bed, 0, BED_MAXTEMP - 10);//4
 
 
 	MENU_ITEM_EDIT_int3_P(_T(MSG_FAN_SPEED), &fanSpeed, 0, 255);//5
 	MENU_ITEM_EDIT_int3_P(_T(MSG_FAN_SPEED), &fanSpeed, 0, 255);//5
-	MENU_ITEM_EDIT_int3_P(_i("Flow"), &extrudemultiply, 10, 999);//6////MSG_FLOW c=0 r=0
+	MENU_ITEM_EDIT_int3_P(_i("Flow"), &extrudemultiply, 10, 999);//6////MSG_FLOW
 #ifdef FILAMENTCHANGEENABLE
 #ifdef FILAMENTCHANGEENABLE
 	MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//7
 	MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//7
 #endif
 #endif
@@ -6649,6 +6593,14 @@ static void lcd_tune_menu()
 
 
 	SETTINGS_CUTTER;
 	SETTINGS_CUTTER;
 
 
+     if(farm_mode)
+     {
+          if (fans_check_enabled == true)
+               MENU_ITEM_FUNCTION_P(_i("Fans check   [on]"), lcd_set_fan_check);////MSG_FANS_CHECK_ON c=17 r=1
+          else
+               MENU_ITEM_FUNCTION_P(_i("Fans check  [off]"), lcd_set_fan_check);////MSG_FANS_CHECK_OFF c=17 r=1
+     }
+
 #ifdef TMC2130
 #ifdef TMC2130
      if(!farm_mode)
      if(!farm_mode)
      {
      {
@@ -6726,18 +6678,18 @@ static void lcd_mesh_bed_leveling_settings()
 
 
 	MENU_BEGIN();
 	MENU_BEGIN();
 	MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); 
 	MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); 
-	if(points_nr == 3) MENU_ITEM_FUNCTION_P(_i("Mesh         [3x3]"), mbl_mesh_toggle); ////MSG_MESH_3x3 c=18 r=0
-	else			   MENU_ITEM_FUNCTION_P(_i("Mesh         [7x7]"), mbl_mesh_toggle); ////MSG_MESH_7x7 c=18 r=0
+	if(points_nr == 3) MENU_ITEM_FUNCTION_P(_i("Mesh         [3x3]"), mbl_mesh_toggle); ////MSG_MESH_3x3 c=18
+	else			   MENU_ITEM_FUNCTION_P(_i("Mesh         [7x7]"), mbl_mesh_toggle); ////MSG_MESH_7x7 c=18
 	switch (mbl_z_probe_nr) {
 	switch (mbl_z_probe_nr) {
-		case 1: MENU_ITEM_FUNCTION_P(_i("Z-probe nr.    [1]"), mbl_probe_nr_toggle); break; ////MSG_Z_PROBE_NR_1 c=18 r=0
-		case 5: MENU_ITEM_FUNCTION_P(_i("Z-probe nr.    [5]"), mbl_probe_nr_toggle); break; ////MSG_Z_PROBE_NR_1 c=18 r=0
-		default: MENU_ITEM_FUNCTION_P(_i("Z-probe nr.    [3]"), mbl_probe_nr_toggle); break; ////MSG_Z_PROBE_NR_1 c=18 r=0
+		case 1: MENU_ITEM_FUNCTION_P(_i("Z-probe nr.    [1]"), mbl_probe_nr_toggle); break; ////MSG_Z_PROBE_NR_1 c=18
+		case 5: MENU_ITEM_FUNCTION_P(_i("Z-probe nr.    [5]"), mbl_probe_nr_toggle); break; ////MSG_Z_PROBE_NR_1 c=18
+		default: MENU_ITEM_FUNCTION_P(_i("Z-probe nr.    [3]"), mbl_probe_nr_toggle); break; ////MSG_Z_PROBE_NR_1 c=18
 	}
 	}
 	if (points_nr == 7) {
 	if (points_nr == 7) {
-		if (magnet_elimination) MENU_ITEM_FUNCTION_P(_i("Magnets comp. [On]"), mbl_magnets_elimination_toggle); ////MSG_MAGNETS_COMP_ON c=18 r=0
-		else				    MENU_ITEM_FUNCTION_P(_i("Magnets comp.[Off]"), mbl_magnets_elimination_toggle); ////MSG_MAGNETS_COMP_OFF c=18 r=0
+		if (magnet_elimination) MENU_ITEM_FUNCTION_P(_i("Magnets comp. [On]"), mbl_magnets_elimination_toggle); ////MSG_MAGNETS_COMP_ON c=18
+		else				    MENU_ITEM_FUNCTION_P(_i("Magnets comp.[Off]"), mbl_magnets_elimination_toggle); ////MSG_MAGNETS_COMP_OFF c=18
 	}
 	}
-	else					        menu_item_text_P(_i("Magnets comp.[N/A]")); ////MSG_MAGNETS_COMP_NA c=18 r=0
+	else					        menu_item_text_P(_i("Magnets comp.[N/A]")); ////MSG_MAGNETS_COMP_NA c=18
 	MENU_END();
 	MENU_END();
 	//SETTINGS_MBL_MODE;
 	//SETTINGS_MBL_MODE;
 }
 }
@@ -6756,10 +6708,10 @@ static void lcd_control_temperature_menu()
   MENU_ITEM_EDIT_int3_P(_T(MSG_NOZZLE), &target_temperature[0], 0, HEATER_0_MAXTEMP - 10);
   MENU_ITEM_EDIT_int3_P(_T(MSG_NOZZLE), &target_temperature[0], 0, HEATER_0_MAXTEMP - 10);
 #endif
 #endif
 #if TEMP_SENSOR_1 != 0
 #if TEMP_SENSOR_1 != 0
-  MENU_ITEM_EDIT_int3_P(_i("Nozzle2"), &target_temperature[1], 0, HEATER_1_MAXTEMP - 10);////MSG_NOZZLE1 c=0 r=0
+  MENU_ITEM_EDIT_int3_P(_i("Nozzle2"), &target_temperature[1], 0, HEATER_1_MAXTEMP - 10);////MSG_NOZZLE1
 #endif
 #endif
 #if TEMP_SENSOR_2 != 0
 #if TEMP_SENSOR_2 != 0
-  MENU_ITEM_EDIT_int3_P(_i("Nozzle3"), &target_temperature[2], 0, HEATER_2_MAXTEMP - 10);////MSG_NOZZLE2 c=0 r=0
+  MENU_ITEM_EDIT_int3_P(_i("Nozzle3"), &target_temperature[2], 0, HEATER_2_MAXTEMP - 10);////MSG_NOZZLE2
 #endif
 #endif
 #if TEMP_SENSOR_BED != 0
 #if TEMP_SENSOR_BED != 0
   MENU_ITEM_EDIT_int3_P(_T(MSG_BED), &target_temperature_bed, 0, BED_MAXTEMP - 3);
   MENU_ITEM_EDIT_int3_P(_T(MSG_BED), &target_temperature_bed, 0, BED_MAXTEMP - 3);
@@ -6768,9 +6720,9 @@ static void lcd_control_temperature_menu()
 #if defined AUTOTEMP && (TEMP_SENSOR_0 != 0)
 #if defined AUTOTEMP && (TEMP_SENSOR_0 != 0)
 //MENU_ITEM_EDIT removed, following code must be redesigned if AUTOTEMP enabled
 //MENU_ITEM_EDIT removed, following code must be redesigned if AUTOTEMP enabled
   MENU_ITEM_EDIT(bool, MSG_AUTOTEMP, &autotemp_enabled);
   MENU_ITEM_EDIT(bool, MSG_AUTOTEMP, &autotemp_enabled);
-  MENU_ITEM_EDIT(float3, _i(" \002 Min"), &autotemp_min, 0, HEATER_0_MAXTEMP - 10);////MSG_MIN c=0 r=0
-  MENU_ITEM_EDIT(float3, _i(" \002 Max"), &autotemp_max, 0, HEATER_0_MAXTEMP - 10);////MSG_MAX c=0 r=0
-  MENU_ITEM_EDIT(float32, _i(" \002 Fact"), &autotemp_factor, 0.0, 1.0);////MSG_FACTOR c=0 r=0
+  MENU_ITEM_EDIT(float3, _i(" \002 Min"), &autotemp_min, 0, HEATER_0_MAXTEMP - 10);////MSG_MIN
+  MENU_ITEM_EDIT(float3, _i(" \002 Max"), &autotemp_max, 0, HEATER_0_MAXTEMP - 10);////MSG_MAX
+  MENU_ITEM_EDIT(float32, _i(" \002 Fact"), &autotemp_factor, 0.0, 1.0);////MSG_FACTOR
 #endif
 #endif
 
 
   MENU_END();
   MENU_END();
@@ -6792,6 +6744,12 @@ static void lcd_sd_updir()
 
 
 void lcd_print_stop()
 void lcd_print_stop()
 {
 {
+//-//
+     if(!card.sdprinting)
+          {
+          SERIAL_ECHOLNPGM("// action:cancel");   // for Octoprint
+          return;
+          }
 	saved_printing = false;
 	saved_printing = false;
 	cancel_heatup = true;
 	cancel_heatup = true;
 #ifdef MESH_BED_LEVELING
 #ifdef MESH_BED_LEVELING
@@ -6817,7 +6775,7 @@ void lcd_print_stop()
 	lcd_return_to_status();
 	lcd_return_to_status();
 	lcd_ignore_click(true);
 	lcd_ignore_click(true);
 	lcd_commands_step = 0;
 	lcd_commands_step = 0;
-	lcd_commands_type = LCD_COMMAND_STOP_PRINT;
+	lcd_commands_type = LcdCommands::StopPrint;
 	// Turn off the print fan
 	// Turn off the print fan
 	SET_OUTPUT(FAN_PIN);
 	SET_OUTPUT(FAN_PIN);
 	WRITE(FAN_PIN, 0);
 	WRITE(FAN_PIN, 0);
@@ -6920,45 +6878,80 @@ bool lcd_selftest()
 {
 {
 	int _progress = 0;
 	int _progress = 0;
 	bool _result = true;
 	bool _result = true;
+	bool _swapped_fan = false;
 	lcd_wait_for_cool_down();
 	lcd_wait_for_cool_down();
 	lcd_clear();
 	lcd_clear();
-	lcd_set_cursor(0, 0); lcd_puts_P(_i("Self test start  "));////MSG_SELFTEST_START c=20 r=0
+	lcd_set_cursor(0, 0); lcd_puts_P(_i("Self test start  "));////MSG_SELFTEST_START c=20
 	#ifdef TMC2130
 	#ifdef TMC2130
 	  FORCE_HIGH_POWER_START;
 	  FORCE_HIGH_POWER_START;
 	#endif // TMC2130
 	#endif // TMC2130
 	_delay(2000);
 	_delay(2000);
 	KEEPALIVE_STATE(IN_HANDLER);
 	KEEPALIVE_STATE(IN_HANDLER);
 
 
-	_progress = lcd_selftest_screen(testScreen::extruderFan, _progress, 3, true, 2000);
+	_progress = lcd_selftest_screen(TestScreen::ExtruderFan, _progress, 3, true, 2000);
 #if (defined(FANCHECK) && defined(TACH_0))
 #if (defined(FANCHECK) && defined(TACH_0))
-	_result = lcd_selftest_fan_dialog(0);
+	switch (lcd_selftest_fan_auto(0)){		// check extruder Fan
+		case FanCheck::ExtruderFan:
+			_result = false;
+			break;
+		case FanCheck::SwappedFan:
+			_swapped_fan = true;
+			// no break
+		default:
+			_result = true;
+			break;
+	}
 #else //defined(TACH_0)
 #else //defined(TACH_0)
 	_result = lcd_selftest_manual_fan_check(0, false);
 	_result = lcd_selftest_manual_fan_check(0, false);
+#endif //defined(TACH_0)
 	if (!_result)
 	if (!_result)
 	{
 	{
-		lcd_selftest_error(TestError::extruderFan, "", "");
+		lcd_selftest_error(TestError::ExtruderFan, "", "");
 	}
 	}
-#endif //defined(TACH_0)
-	
 
 
 	if (_result)
 	if (_result)
 	{
 	{
-		_progress = lcd_selftest_screen(testScreen::printFan, _progress, 3, true, 2000);
-#if (defined(FANCHECK) && defined(TACH_1)) 		
-		_result = lcd_selftest_fan_dialog(1);
+		_progress = lcd_selftest_screen(TestScreen::PrintFan, _progress, 3, true, 2000);
+#if (defined(FANCHECK) && defined(TACH_1))
+	switch (lcd_selftest_fan_auto(1)){		// check print fan
+		case FanCheck::PrintFan:
+			_result = false;
+			break;
+		case FanCheck::SwappedFan:
+			_swapped_fan = true;
+			// no break
+		default:
+			_result = true;
+			break;
+	}
 #else //defined(TACH_1)
 #else //defined(TACH_1)
 		_result = lcd_selftest_manual_fan_check(1, false);
 		_result = lcd_selftest_manual_fan_check(1, false);
+#endif //defined(TACH_1)
 		if (!_result)
 		if (!_result)
-		{			
-			lcd_selftest_error(TestError::printFan, "", ""); //print fan not spinning
+		{
+			lcd_selftest_error(TestError::PrintFan, "", ""); //print fan not spinning
 		}
 		}
+	}
 
 
-#endif //defined(TACH_1)
+	if (_swapped_fan) {
+		//turn on print fan and check that left extruder fan is not spinning
+		_result = lcd_selftest_manual_fan_check(1, true);
+		if (_result) {
+			//print fan is stil turned on; check that it is spinning
+			_result = lcd_selftest_manual_fan_check(1, false, true);
+			if (!_result){
+				lcd_selftest_error(TestError::PrintFan, "", "");
+			}
+		}
+		else {
+			// fans are swapped
+			lcd_selftest_error(TestError::SwappedFan, "", "");
+		}
 	}
 	}
 
 
 	if (_result)
 	if (_result)
 	{
 	{
-		_progress = lcd_selftest_screen(testScreen::fansOk, _progress, 3, true, 2000);
+		_progress = lcd_selftest_screen(TestScreen::FansOk, _progress, 3, true, 2000);
 #ifndef TMC2130
 #ifndef TMC2130
 		_result = lcd_selfcheck_endstops();
 		_result = lcd_selfcheck_endstops();
 #else
 #else
@@ -6969,7 +6962,7 @@ bool lcd_selftest()
 	if (_result)
 	if (_result)
 	{
 	{
 		//current_position[Z_AXIS] += 15;									//move Z axis higher to avoid false triggering of Z end stop in case that we are very low - just above heatbed
 		//current_position[Z_AXIS] += 15;									//move Z axis higher to avoid false triggering of Z end stop in case that we are very low - just above heatbed
-		_progress = lcd_selftest_screen(testScreen::axisX, _progress, 3, true, 2000);
+		_progress = lcd_selftest_screen(TestScreen::AxisX, _progress, 3, true, 2000);
 #ifdef TMC2130
 #ifdef TMC2130
         _result = lcd_selfcheck_axis_sg(X_AXIS);
         _result = lcd_selfcheck_axis_sg(X_AXIS);
 #else
 #else
@@ -6982,7 +6975,7 @@ bool lcd_selftest()
 
 
 	if (_result)
 	if (_result)
 	{
 	{
-		_progress = lcd_selftest_screen(testScreen::axisX, _progress, 3, true, 0);
+		_progress = lcd_selftest_screen(TestScreen::AxisX, _progress, 3, true, 0);
 
 
 #ifndef TMC2130
 #ifndef TMC2130
 		_result = lcd_selfcheck_pulleys(X_AXIS);
 		_result = lcd_selfcheck_pulleys(X_AXIS);
@@ -6992,7 +6985,7 @@ bool lcd_selftest()
 
 
 	if (_result)
 	if (_result)
 	{
 	{
-		_progress = lcd_selftest_screen(testScreen::axisY, _progress, 3, true, 1500);
+		_progress = lcd_selftest_screen(TestScreen::AxisY, _progress, 3, true, 1500);
 #ifdef TMC2130
 #ifdef TMC2130
 		_result = lcd_selfcheck_axis_sg(Y_AXIS);
 		_result = lcd_selfcheck_axis_sg(Y_AXIS);
 #else
 #else
@@ -7002,7 +6995,7 @@ bool lcd_selftest()
 
 
 	if (_result)
 	if (_result)
 	{
 	{
-		_progress = lcd_selftest_screen(testScreen::axisZ, _progress, 3, true, 0);
+		_progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 0);
 #ifndef TMC2130
 #ifndef TMC2130
 		_result = lcd_selfcheck_pulleys(Y_AXIS);
 		_result = lcd_selfcheck_pulleys(Y_AXIS);
 #endif // TMC2130
 #endif // TMC2130
@@ -7023,7 +7016,7 @@ bool lcd_selftest()
 		current_position[Z_AXIS] = current_position[Z_AXIS] + 10;
 		current_position[Z_AXIS] = current_position[Z_AXIS] + 10;
 		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder);
 		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder);
 		st_synchronize();
 		st_synchronize();
-		_progress = lcd_selftest_screen(testScreen::axisZ, _progress, 3, true, 1500);
+		_progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 1500);
 		_result = lcd_selfcheck_axis(2, Z_MAX_POS);
 		_result = lcd_selfcheck_axis(2, Z_MAX_POS);
 		if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) != 1) {
 		if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) != 1) {
 			enquecommand_P(PSTR("G28 W"));
 			enquecommand_P(PSTR("G28 W"));
@@ -7037,11 +7030,11 @@ bool lcd_selftest()
 		current_position[Z_AXIS] = current_position[Z_AXIS] + 10;
 		current_position[Z_AXIS] = current_position[Z_AXIS] + 10;
 		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder);
 		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder);
 		st_synchronize();
 		st_synchronize();
-		_progress = lcd_selftest_screen(testScreen::home, 0, 2, true, 0);
+		_progress = lcd_selftest_screen(TestScreen::Home, 0, 2, true, 0);
 		bool bres = tmc2130_home_calibrate(X_AXIS);
 		bool bres = tmc2130_home_calibrate(X_AXIS);
-		_progress = lcd_selftest_screen(testScreen::home, 1, 2, true, 0);
+		_progress = lcd_selftest_screen(TestScreen::Home, 1, 2, true, 0);
 		bres &= tmc2130_home_calibrate(Y_AXIS);
 		bres &= tmc2130_home_calibrate(Y_AXIS);
-		_progress = lcd_selftest_screen(testScreen::home, 2, 2, true, 0);
+		_progress = lcd_selftest_screen(TestScreen::Home, 2, 2, true, 0);
 		if (bres)
 		if (bres)
 			eeprom_update_byte((uint8_t*)EEPROM_TMC2130_HOME_ENABLED, 1);
 			eeprom_update_byte((uint8_t*)EEPROM_TMC2130_HOME_ENABLED, 1);
 		_result = bres;
 		_result = bres;
@@ -7050,18 +7043,18 @@ bool lcd_selftest()
 
 
 	if (_result)
 	if (_result)
 	{
 	{
-		_progress = lcd_selftest_screen(testScreen::bed, _progress, 3, true, 2000);
+		_progress = lcd_selftest_screen(TestScreen::Bed, _progress, 3, true, 2000);
 		_result = lcd_selfcheck_check_heater(true);
 		_result = lcd_selfcheck_check_heater(true);
 	}
 	}
 
 
     if (_result)
     if (_result)
     {
     {
-        _progress = lcd_selftest_screen(testScreen::hotend, _progress, 3, true, 1000);
+        _progress = lcd_selftest_screen(TestScreen::Hotend, _progress, 3, true, 1000);
         _result = lcd_selfcheck_check_heater(false);
         _result = lcd_selfcheck_check_heater(false);
     }
     }
 	if (_result)
 	if (_result)
 	{
 	{
-		_progress = lcd_selftest_screen(testScreen::hotendOk, _progress, 3, true, 2000); //nozzle ok
+		_progress = lcd_selftest_screen(TestScreen::HotendOk, _progress, 3, true, 2000); //nozzle ok
 	}
 	}
 #ifdef FILAMENT_SENSOR
 #ifdef FILAMENT_SENSOR
     if (_result)
     if (_result)
@@ -7069,20 +7062,20 @@ bool lcd_selftest()
 
 
         if (mmu_enabled)
         if (mmu_enabled)
         {        
         {        
-			_progress = lcd_selftest_screen(testScreen::fsensor, _progress, 3, true, 2000); //check filaments sensor
+			_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor
             _result = selftest_irsensor();
             _result = selftest_irsensor();
 		    if (_result)
 		    if (_result)
 			{
 			{
-				_progress = lcd_selftest_screen(testScreen::fsensorOk, _progress, 3, true, 2000); //fil sensor OK
+				_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK
 			}
 			}
         } else
         } else
         {
         {
 #ifdef PAT9125
 #ifdef PAT9125
-			_progress = lcd_selftest_screen(testScreen::fsensor, _progress, 3, true, 2000); //check filaments sensor
+			_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor
             _result = lcd_selftest_fsensor();
             _result = lcd_selftest_fsensor();
 			if (_result)
 			if (_result)
 			{
 			{
-				_progress = lcd_selftest_screen(testScreen::fsensorOk, _progress, 3, true, 2000); //fil sensor OK
+				_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK
 			}
 			}
 #endif //PAT9125
 #endif //PAT9125
         }
         }
@@ -7090,11 +7083,11 @@ bool lcd_selftest()
 #endif //FILAMENT_SENSOR
 #endif //FILAMENT_SENSOR
 	if (_result)
 	if (_result)
 	{
 	{
-		_progress = lcd_selftest_screen(testScreen::allCorrect, _progress, 3, true, 5000); //all correct
+		_progress = lcd_selftest_screen(TestScreen::AllCorrect, _progress, 3, true, 5000); //all correct
 	}
 	}
 	else
 	else
 	{
 	{
-		_progress = lcd_selftest_screen(testScreen::failed, _progress, 3, true, 5000);
+		_progress = lcd_selftest_screen(TestScreen::Failed, _progress, 3, true, 5000);
 	}
 	}
 	lcd_reset_alert_level();
 	lcd_reset_alert_level();
 	enquecommand_P(PSTR("M84"));
 	enquecommand_P(PSTR("M84"));
@@ -7102,7 +7095,7 @@ bool lcd_selftest()
 	
 	
 	if (_result)
 	if (_result)
 	{
 	{
-		LCD_ALERTMESSAGERPGM(_i("Self test OK"));////MSG_SELFTEST_OK c=0 r=0
+		LCD_ALERTMESSAGERPGM(_i("Self test OK"));////MSG_SELFTEST_OK
 	}
 	}
 	else
 	else
 	{
 	{
@@ -7197,7 +7190,7 @@ static bool lcd_selfcheck_axis_sg(unsigned char axis) {
 
 
 //end of second measurement, now check for possible errors:
 //end of second measurement, now check for possible errors:
 
 
-	for(int i = 0; i < 2; i++){ //check if measured axis length corresponds to expected length
+	for(uint_least8_t i = 0; i < 2; i++){ //check if measured axis length corresponds to expected length
 		printf_P(_N("Measured axis length:%.3f\n"), measured_axis_length[i]);
 		printf_P(_N("Measured axis length:%.3f\n"), measured_axis_length[i]);
 		if (abs(measured_axis_length[i] - axis_length) > max_error_mm) {
 		if (abs(measured_axis_length[i] - axis_length) > max_error_mm) {
 			enable_endstops(false);
 			enable_endstops(false);
@@ -7208,7 +7201,7 @@ static bool lcd_selfcheck_axis_sg(unsigned char axis) {
 			if (axis == Y_AXIS) _error_1 = "Y";
 			if (axis == Y_AXIS) _error_1 = "Y";
 			if (axis == Z_AXIS) _error_1 = "Z";
 			if (axis == Z_AXIS) _error_1 = "Z";
 
 
-			lcd_selftest_error(TestError::axis, _error_1, "");
+			lcd_selftest_error(TestError::Axis, _error_1, "");
 			current_position[axis] = 0;
 			current_position[axis] = 0;
 			plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
 			plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
 			reset_crash_det(axis);
 			reset_crash_det(axis);
@@ -7226,7 +7219,7 @@ static bool lcd_selfcheck_axis_sg(unsigned char axis) {
 			if (axis == Y_AXIS) _error_1 = "Y";
 			if (axis == Y_AXIS) _error_1 = "Y";
 			if (axis == Z_AXIS) _error_1 = "Z";
 			if (axis == Z_AXIS) _error_1 = "Z";
 
 
-			lcd_selftest_error(TestError::pulley, _error_1, "");
+			lcd_selftest_error(TestError::Pulley, _error_1, "");
 			current_position[axis] = 0;
 			current_position[axis] = 0;
 			plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
 			plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
 			reset_crash_det(axis);
 			reset_crash_det(axis);
@@ -7301,7 +7294,7 @@ static bool lcd_selfcheck_axis(int _axis, int _travel)
 		}
 		}
 		else
 		else
 		{
 		{
-			_progress = lcd_selftest_screen(static_cast<testScreen>(static_cast<int>(testScreen::axisX) + _axis), _progress, 3, false, 0);
+			_progress = lcd_selftest_screen(static_cast<TestScreen>(static_cast<int>(TestScreen::AxisX) + _axis), _progress, 3, false, 0);
 			_lcd_refresh = 0;
 			_lcd_refresh = 0;
 		}
 		}
 
 
@@ -7333,11 +7326,11 @@ static bool lcd_selfcheck_axis(int _axis, int _travel)
 
 
 		if (_travel_done >= _travel)
 		if (_travel_done >= _travel)
 		{
 		{
-			lcd_selftest_error(TestError::endstop, _error_1, _error_2);
+			lcd_selftest_error(TestError::Endstop, _error_1, _error_2);
 		}
 		}
 		else
 		else
 		{
 		{
-			lcd_selftest_error(TestError::motor, _error_1, _error_2);
+			lcd_selftest_error(TestError::Motor, _error_1, _error_2);
 		}
 		}
 	}
 	}
 
 
@@ -7377,7 +7370,7 @@ static bool lcd_selfcheck_pulleys(int axis)
 		st_synchronize();
 		st_synchronize();
 		if (((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
 		if (((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
 			((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1)) {
 			((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1)) {
-			lcd_selftest_error(TestError::pulley, (axis == 0) ? "X" : "Y", "");
+			lcd_selftest_error(TestError::Pulley, (axis == 0) ? "X" : "Y", "");
 			return(false);
 			return(false);
 		}
 		}
 	}
 	}
@@ -7395,7 +7388,7 @@ static bool lcd_selfcheck_pulleys(int axis)
 				return(true);
 				return(true);
 			}
 			}
 			else {
 			else {
-				lcd_selftest_error(TestError::pulley, (axis == 0) ? "X" : "Y", "");
+				lcd_selftest_error(TestError::Pulley, (axis == 0) ? "X" : "Y", "");
 				return(false);
 				return(false);
 			}
 			}
 		}
 		}
@@ -7404,7 +7397,7 @@ static bool lcd_selfcheck_pulleys(int axis)
 			plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder);
 			plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder);
 			st_synchronize();
 			st_synchronize();
 			if (_millis() > timeout_counter) {
 			if (_millis() > timeout_counter) {
-				lcd_selftest_error(TestError::pulley, (axis == 0) ? "X" : "Y", "");
+				lcd_selftest_error(TestError::Pulley, (axis == 0) ? "X" : "Y", "");
 				return(false);
 				return(false);
 			}
 			}
 		}
 		}
@@ -7437,7 +7430,7 @@ static bool lcd_selfcheck_endstops()
 		if ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "X");
 		if ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "X");
 		if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Y");
 		if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Y");
 		if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Z");
 		if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Z");
-		lcd_selftest_error(TestError::endstops, _error, "");
+		lcd_selftest_error(TestError::Endstops, _error, "");
 	}
 	}
 	manage_heater();
 	manage_heater();
 	manage_inactivity(true);
 	manage_inactivity(true);
@@ -7468,7 +7461,7 @@ static bool lcd_selfcheck_check_heater(bool _isbed)
 
 
 		manage_heater();
 		manage_heater();
 		manage_inactivity(true);
 		manage_inactivity(true);
-		_progress = (_isbed) ? lcd_selftest_screen(testScreen::bed, _progress, 2, false, 400) : lcd_selftest_screen(testScreen::hotend, _progress, 2, false, 400);
+		_progress = (_isbed) ? lcd_selftest_screen(TestScreen::Bed, _progress, 2, false, 400) : lcd_selftest_screen(TestScreen::Hotend, _progress, 2, false, 400);
 		/*if (_isbed) {
 		/*if (_isbed) {
 			MYSERIAL.print("Bed temp:");
 			MYSERIAL.print("Bed temp:");
 			MYSERIAL.println(degBed());
 			MYSERIAL.println(degBed());
@@ -7503,12 +7496,12 @@ static bool lcd_selfcheck_check_heater(bool _isbed)
 		}
 		}
 		else
 		else
 		{
 		{
-			lcd_selftest_error(TestError::heater, "", "");
+			lcd_selftest_error(TestError::Heater, "", "");
 		}
 		}
 	}
 	}
 	else
 	else
 	{
 	{
-		lcd_selftest_error(TestError::bed, "", "");
+		lcd_selftest_error(TestError::Bed, "", "");
 	}
 	}
 
 
 	manage_heater();
 	manage_heater();
@@ -7529,43 +7522,43 @@ static void lcd_selftest_error(TestError testError, const char *_error_1, const
 	lcd_clear();
 	lcd_clear();
 
 
 	lcd_set_cursor(0, 0);
 	lcd_set_cursor(0, 0);
-	lcd_puts_P(_i("Selftest error !"));////MSG_SELFTEST_ERROR c=0 r=0
+	lcd_puts_P(_i("Selftest error !"));////MSG_SELFTEST_ERROR
 	lcd_set_cursor(0, 1);
 	lcd_set_cursor(0, 1);
-	lcd_puts_P(_i("Please check :"));////MSG_SELFTEST_PLEASECHECK c=0 r=0
+	lcd_puts_P(_i("Please check :"));////MSG_SELFTEST_PLEASECHECK
 
 
 	switch (testError)
 	switch (testError)
 	{
 	{
-	case TestError::heater:
+	case TestError::Heater:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
-		lcd_puts_P(_i("Heater/Thermistor"));////MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
+		lcd_puts_P(_i("Heater/Thermistor"));////MSG_SELFTEST_HEATERTHERMISTOR
 		lcd_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
-		lcd_puts_P(_i("Not connected"));////MSG_SELFTEST_NOTCONNECTED c=0 r=0
+		lcd_puts_P(_i("Not connected"));////MSG_SELFTEST_NOTCONNECTED
 		break;
 		break;
-	case TestError::bed:
+	case TestError::Bed:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
-		lcd_puts_P(_i("Bed / Heater"));////MSG_SELFTEST_BEDHEATER c=0 r=0
+		lcd_puts_P(_i("Bed / Heater"));////MSG_SELFTEST_BEDHEATER
 		lcd_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
 		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		break;
 		break;
-	case TestError::endstops:
+	case TestError::Endstops:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
-		lcd_puts_P(_i("Endstops"));////MSG_SELFTEST_ENDSTOPS c=0 r=0
+		lcd_puts_P(_i("Endstops"));////MSG_SELFTEST_ENDSTOPS
 		lcd_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
 		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		lcd_set_cursor(17, 3);
 		lcd_set_cursor(17, 3);
 		lcd_print(_error_1);
 		lcd_print(_error_1);
 		break;
 		break;
-	case TestError::motor:
+	case TestError::Motor:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
 		lcd_puts_P(_T(MSG_SELFTEST_MOTOR));
 		lcd_puts_P(_T(MSG_SELFTEST_MOTOR));
 		lcd_set_cursor(18, 2);
 		lcd_set_cursor(18, 2);
 		lcd_print(_error_1);
 		lcd_print(_error_1);
 		lcd_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
-		lcd_puts_P(_i("Endstop"));////MSG_SELFTEST_ENDSTOP c=0 r=0
+		lcd_puts_P(_i("Endstop"));////MSG_SELFTEST_ENDSTOP
 		lcd_set_cursor(18, 3);
 		lcd_set_cursor(18, 3);
 		lcd_print(_error_2);
 		lcd_print(_error_2);
 		break;
 		break;
-	case TestError::endstop:
+	case TestError::Endstop:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
 		lcd_puts_P(_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_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
@@ -7573,7 +7566,7 @@ static void lcd_selftest_error(TestError testError, const char *_error_1, const
 		lcd_set_cursor(18, 3);
 		lcd_set_cursor(18, 3);
 		lcd_print(_error_1);
 		lcd_print(_error_1);
 		break;
 		break;
-	case TestError::printFan:
+	case TestError::PrintFan:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
 		lcd_puts_P(_T(MSG_SELFTEST_COOLING_FAN));
 		lcd_puts_P(_T(MSG_SELFTEST_COOLING_FAN));
 		lcd_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
@@ -7581,7 +7574,7 @@ static void lcd_selftest_error(TestError testError, const char *_error_1, const
 		lcd_set_cursor(18, 3);
 		lcd_set_cursor(18, 3);
 		lcd_print(_error_1);
 		lcd_print(_error_1);
 		break;
 		break;
-	case TestError::extruderFan:
+	case TestError::ExtruderFan:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
 		lcd_puts_P(_T(MSG_SELFTEST_EXTRUDER_FAN));
 		lcd_puts_P(_T(MSG_SELFTEST_EXTRUDER_FAN));
 		lcd_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
@@ -7589,7 +7582,7 @@ static void lcd_selftest_error(TestError testError, const char *_error_1, const
 		lcd_set_cursor(18, 3);
 		lcd_set_cursor(18, 3);
 		lcd_print(_error_1);
 		lcd_print(_error_1);
 		break;
 		break;
-	case TestError::pulley:
+	case TestError::Pulley:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
 		lcd_puts_P(_i("Loose pulley"));////MSG_LOOSE_PULLEY c=20 r=1
 		lcd_puts_P(_i("Loose pulley"));////MSG_LOOSE_PULLEY c=20 r=1
 		lcd_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
@@ -7597,33 +7590,33 @@ static void lcd_selftest_error(TestError testError, const char *_error_1, const
 		lcd_set_cursor(18, 3);
 		lcd_set_cursor(18, 3);
 		lcd_print(_error_1);
 		lcd_print(_error_1);
 		break;
 		break;
-	case TestError::axis:
+	case TestError::Axis:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
-		lcd_puts_P(_i("Axis length"));////MSG_SELFTEST_AXIS_LENGTH c=0 r=0
+		lcd_puts_P(_i("Axis length"));////MSG_SELFTEST_AXIS_LENGTH
 		lcd_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
-		lcd_puts_P(_i("Axis"));////MSG_SELFTEST_AXIS c=0 r=0
+		lcd_puts_P(_i("Axis"));////MSG_SELFTEST_AXIS
 		lcd_set_cursor(18, 3);
 		lcd_set_cursor(18, 3);
 		lcd_print(_error_1);
 		lcd_print(_error_1);
 		break;
 		break;
-	case TestError::swappedFan:
+	case TestError::SwappedFan:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
-		lcd_puts_P(_i("Front/left fans"));////MSG_SELFTEST_FANS c=0 r=0
+		lcd_puts_P(_i("Front/left fans"));////MSG_SELFTEST_FANS
 		lcd_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
-		lcd_puts_P(_i("Swapped"));////MSG_SELFTEST_SWAPPED c=0 r=0
+		lcd_puts_P(_i("Swapped"));////MSG_SELFTEST_SWAPPED
 		lcd_set_cursor(18, 3);
 		lcd_set_cursor(18, 3);
 		lcd_print(_error_1);
 		lcd_print(_error_1);
 		break;
 		break;
-	case TestError::wiringFsensor:
+	case TestError::WiringFsensor:
 		lcd_set_cursor(0, 2);
 		lcd_set_cursor(0, 2);
 		lcd_puts_P(_T(MSG_SELFTEST_FILAMENT_SENSOR));
 		lcd_puts_P(_T(MSG_SELFTEST_FILAMENT_SENSOR));
 		lcd_set_cursor(0, 3);
 		lcd_set_cursor(0, 3);
 		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
 		break;
 		break;
-	case TestError::triggeringFsensor:
+	case TestError::TriggeringFsensor:
 	    lcd_set_cursor(0, 2);
 	    lcd_set_cursor(0, 2);
         lcd_puts_P(_T(MSG_SELFTEST_FILAMENT_SENSOR));
         lcd_puts_P(_T(MSG_SELFTEST_FILAMENT_SENSOR));
         lcd_set_cursor(0, 3);
         lcd_set_cursor(0, 3);
-        lcd_puts_P(_i("False triggering"));////c=20 r=0
+        lcd_puts_P(_i("False triggering"));////c=20
         break;
         break;
 	}
 	}
 
 
@@ -7648,7 +7641,7 @@ static bool lcd_selftest_fsensor(void)
 	fsensor_init();
 	fsensor_init();
 	if (fsensor_not_responding)
 	if (fsensor_not_responding)
 	{
 	{
-		lcd_selftest_error(TestError::wiringFsensor, "", "");
+		lcd_selftest_error(TestError::WiringFsensor, "", "");
 	}
 	}
 	return (!fsensor_not_responding);
 	return (!fsensor_not_responding);
 }
 }
@@ -7686,23 +7679,23 @@ static bool selftest_irsensor()
         TempBackup tempBackup;
         TempBackup tempBackup;
         setTargetHotend(ABS_PREHEAT_HOTEND_TEMP,active_extruder);
         setTargetHotend(ABS_PREHEAT_HOTEND_TEMP,active_extruder);
         mmu_wait_for_heater_blocking();
         mmu_wait_for_heater_blocking();
-        progress = lcd_selftest_screen(testScreen::fsensor, 0, 1, true, 0);
+        progress = lcd_selftest_screen(TestScreen::Fsensor, 0, 1, true, 0);
         mmu_filament_ramming();
         mmu_filament_ramming();
     }
     }
-    progress = lcd_selftest_screen(testScreen::fsensor, progress, 1, true, 0);
+    progress = lcd_selftest_screen(TestScreen::Fsensor, progress, 1, true, 0);
     mmu_command(MmuCmd::U0);
     mmu_command(MmuCmd::U0);
     manage_response(false, false);
     manage_response(false, false);
 
 
     for(uint_least8_t i = 0; i < 200; ++i)
     for(uint_least8_t i = 0; i < 200; ++i)
     {
     {
-        if (0 == (i % 32)) progress = lcd_selftest_screen(testScreen::fsensor, progress, 1, true, 0);
+        if (0 == (i % 32)) progress = lcd_selftest_screen(TestScreen::Fsensor, progress, 1, true, 0);
 
 
         mmu_load_step(false);
         mmu_load_step(false);
         while (blocks_queued())
         while (blocks_queued())
         {
         {
             if (PIN_GET(IR_SENSOR_PIN) == 0)
             if (PIN_GET(IR_SENSOR_PIN) == 0)
             {
             {
-                lcd_selftest_error(TestError::triggeringFsensor, "", "");
+                lcd_selftest_error(TestError::TriggeringFsensor, "", "");
                 return false;
                 return false;
             }
             }
 #ifdef TMC2130
 #ifdef TMC2130
@@ -7723,19 +7716,20 @@ static bool selftest_irsensor()
 }
 }
 #endif //FILAMENT_SENSOR
 #endif //FILAMENT_SENSOR
 
 
-static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite)
+static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite,
+	bool _default)
 {
 {
 
 
 	bool _result = check_opposite;
 	bool _result = check_opposite;
 	lcd_clear();
 	lcd_clear();
 
 
 	lcd_set_cursor(0, 0); lcd_puts_P(_T(MSG_SELFTEST_FAN));
 	lcd_set_cursor(0, 0); lcd_puts_P(_T(MSG_SELFTEST_FAN));
-	
+
 	switch (_fan)
 	switch (_fan)
 	{
 	{
 	case 0:
 	case 0:
 		// extruder cooling fan
 		// extruder cooling fan
-		lcd_set_cursor(0, 1); 
+		lcd_set_cursor(0, 1);
 		if(check_opposite == true) lcd_puts_P(_T(MSG_SELFTEST_COOLING_FAN)); 
 		if(check_opposite == true) lcd_puts_P(_T(MSG_SELFTEST_COOLING_FAN)); 
 		else lcd_puts_P(_T(MSG_SELFTEST_EXTRUDER_FAN));
 		else lcd_puts_P(_T(MSG_SELFTEST_EXTRUDER_FAN));
 		SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN);
 		SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN);
@@ -7761,10 +7755,11 @@ static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite)
 	lcd_set_cursor(0, 3); lcd_print(">");
 	lcd_set_cursor(0, 3); lcd_print(">");
 	lcd_set_cursor(1, 3); lcd_puts_P(_T(MSG_SELFTEST_FAN_NO));
 	lcd_set_cursor(1, 3); lcd_puts_P(_T(MSG_SELFTEST_FAN_NO));
 
 
-	int8_t enc_dif = 0;
+	int8_t enc_dif = int(_default)*3;
+
 	KEEPALIVE_STATE(PAUSED_FOR_USER);
 	KEEPALIVE_STATE(PAUSED_FOR_USER);
 
 
-	lcd_button_pressed = false; 
+	lcd_button_pressed = false;
 	do
 	do
 	{
 	{
 		switch (_fan)
 		switch (_fan)
@@ -7784,7 +7779,6 @@ static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite)
 #endif //FAN_SOFT_PWM
 #endif //FAN_SOFT_PWM
 			break;
 			break;
 		}
 		}
-
 		if (abs((enc_dif - lcd_encoder_diff)) > 2) {
 		if (abs((enc_dif - lcd_encoder_diff)) > 2) {
 			if (enc_dif > lcd_encoder_diff) {
 			if (enc_dif > lcd_encoder_diff) {
 				_result = !check_opposite;
 				_result = !check_opposite;
@@ -7823,14 +7817,11 @@ static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite)
 	manage_heater();
 	manage_heater();
 
 
 	return _result;
 	return _result;
-
 }
 }
 
 
 #ifdef FANCHECK
 #ifdef FANCHECK
-static bool lcd_selftest_fan_dialog(int _fan)
+static FanCheck lcd_selftest_fan_auto(int _fan)
 {
 {
-	bool _result = true;
-	TestError testError = TestError::extruderFan;
 	switch (_fan) {
 	switch (_fan) {
 	case 0:
 	case 0:
 		fanSpeed = 0;
 		fanSpeed = 0;
@@ -7843,23 +7834,26 @@ static bool lcd_selftest_fan_dialog(int _fan)
 		_delay(2000);				//delay_keep_alive would turn off extruder fan, because temerature is too low
 		_delay(2000);				//delay_keep_alive would turn off extruder fan, because temerature is too low
 
 
 		manage_heater();			//count average fan speed from 2s delay and turn off fans
 		manage_heater();			//count average fan speed from 2s delay and turn off fans
-		if (!fan_speed[0]) _result = false;
 
 
-		
 		printf_P(PSTR("Test 1:\n"));
 		printf_P(PSTR("Test 1:\n"));
 		printf_P(PSTR("Print fan speed: %d \n"), fan_speed[1]);
 		printf_P(PSTR("Print fan speed: %d \n"), fan_speed[1]);
 		printf_P(PSTR("Extr fan speed: %d \n"), fan_speed[0]);
 		printf_P(PSTR("Extr fan speed: %d \n"), fan_speed[0]);
-		//SERIAL_ECHOPGM("Extruder fan speed: ");
-		//MYSERIAL.println(fan_speed[0]);
-		//SERIAL_ECHOPGM("Print fan speed: ");
-		//MYSERIAL.print(fan_speed[1]);
+
+		if (!fan_speed[0]) {
+			return FanCheck::ExtruderFan;
+		}
+#ifdef FAN_SOFT_PWM
+		else if (fan_speed[0] > 50 ) { // printerFan is faster
+			return FanCheck::SwappedFan;
+		}
 		break;
 		break;
+#endif
 
 
 	case 1:
 	case 1:
 		//will it work with Thotend > 50 C ?
 		//will it work with Thotend > 50 C ?
-#ifdef FAN_SOFT_PWM		
-		fanSpeed = 255;	
-		fanSpeedSoftPwm = 255;	
+#ifdef FAN_SOFT_PWM
+		fanSpeed = 255;
+		fanSpeedSoftPwm = 255;
 		extruder_autofan_last_check = _millis(); //store time when measurement starts
 		extruder_autofan_last_check = _millis(); //store time when measurement starts
 		fan_measuring = true; //start fan measuring, rest is on manage_heater
 		fan_measuring = true; //start fan measuring, rest is on manage_heater
 #else //FAN_SOFT_PWM
 #else //FAN_SOFT_PWM
@@ -7873,11 +7867,11 @@ static bool lcd_selftest_fan_dialog(int _fan)
 			lcd_set_cursor(18, 3);
 			lcd_set_cursor(18, 3);
 			lcd_print("|");
 			lcd_print("|");
 		}
 		}
-#ifdef FAN_SOFT_PWM
 		fanSpeed = 0;
 		fanSpeed = 0;
-		fanSpeedSoftPwm = 0;	
+
+#ifdef FAN_SOFT_PWM
+		fanSpeedSoftPwm = 0;
 #else //FAN_SOFT_PWM
 #else //FAN_SOFT_PWM
-		fanSpeed = 0;
 		manage_heater();			//turn off fan
 		manage_heater();			//turn off fan
 		manage_inactivity(true);	//to turn off print fan
 		manage_inactivity(true);	//to turn off print fan
 #endif //FAN_SOFT_PWM
 #endif //FAN_SOFT_PWM
@@ -7885,40 +7879,42 @@ static bool lcd_selftest_fan_dialog(int _fan)
 		printf_P(PSTR("Print fan speed: %d \n"), fan_speed[1]);
 		printf_P(PSTR("Print fan speed: %d \n"), fan_speed[1]);
 		printf_P(PSTR("Extr fan speed: %d \n"), fan_speed[0]);
 		printf_P(PSTR("Extr fan speed: %d \n"), fan_speed[0]);
 		if (!fan_speed[1]) {
 		if (!fan_speed[1]) {
-			_result = false; testError = TestError::printFan;
+			return FanCheck::PrintFan;
 		}
 		}
-#ifdef FAN_SOFT_PWM 
-		else {
-#else //FAN_SOFT_PWM
-		else if (fan_speed[1] < 34) { //fan is spinning, but measured RPM are too low for print fan, it must be left extruder fan
-#endif //FAN_SOFT_PWM
-			//check fans manually
-			_result = lcd_selftest_manual_fan_check(1, true); //turn on print fan and check that left extruder fan is not spinning
-			if (_result) {
-				_result = lcd_selftest_manual_fan_check(1, false); //print fan is stil turned on; check that it is spinning
-				if (!_result) testError = TestError::printFan;
-			}
-			else {
-			    testError = TestError::swappedFan;
-			}
+
+#ifdef FAN_SOFT_PWM
+		fanSpeed = 80;
+		fanSpeedSoftPwm = 80;
+
+		for (uint8_t i = 0; i < 5; i++) {
+			delay_keep_alive(1000);
+			lcd_set_cursor(18, 3);
+			lcd_print("-");
+			delay_keep_alive(1000);
+			lcd_set_cursor(18, 3);
+			lcd_print("|");
 		}
 		}
+		fanSpeed = 0;
 
 
-		//SERIAL_ECHOPGM("Extruder fan speed: ");
-		//MYSERIAL.println(fan_speed[0]);
-		//SERIAL_ECHOPGM("Print fan speed: ");
-		//MYSERIAL.println(fan_speed[1]);
+		// noctua speed is between 17 and 24, turbine more then 30
+		if (fan_speed[1] < 30) {
+			return FanCheck::SwappedFan;
+		}
+#else
+		// fan is spinning, but measured RPM are too low for print fan, it must
+		// be left extruder fan
+		else if (fan_speed[1] < 34) {
+			return FanCheck::SwappedFan;
+		}
+#endif //FAN_SOFT_PWM
 		break;
 		break;
 	}
 	}
-	if (!_result)
-	{
-		lcd_selftest_error(testError, "", "");
-	}
-	return _result;
+	return FanCheck::Success;
 }
 }
 
 
 #endif //FANCHECK
 #endif //FANCHECK
 
 
-static int lcd_selftest_screen(testScreen screen, int _progress, int _progress_scale, bool _clear, int _delay)
+static int lcd_selftest_screen(TestScreen screen, int _progress, int _progress_scale, bool _clear, int _delay)
 {
 {
 
 
     lcd_update_enable(false);
     lcd_update_enable(false);
@@ -7930,58 +7926,58 @@ static int lcd_selftest_screen(testScreen screen, int _progress, int _progress_s
 
 
 	lcd_set_cursor(0, 0);
 	lcd_set_cursor(0, 0);
 
 
-	if (screen == testScreen::extruderFan) lcd_puts_P(_T(MSG_SELFTEST_FAN));
-	if (screen == testScreen::printFan) lcd_puts_P(_T(MSG_SELFTEST_FAN));
-	if (screen == testScreen::fansOk) lcd_puts_P(_T(MSG_SELFTEST_FAN));
-	if (screen == testScreen::endStops) lcd_puts_P(_i("Checking endstops"));////MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
-	if (screen == testScreen::axisX) lcd_puts_P(_i("Checking X axis  "));////MSG_SELFTEST_CHECK_X c=20 r=0
-	if (screen == testScreen::axisY) lcd_puts_P(_i("Checking Y axis  "));////MSG_SELFTEST_CHECK_Y c=20 r=0
-	if (screen == testScreen::axisZ) lcd_puts_P(_i("Checking Z axis  "));////MSG_SELFTEST_CHECK_Z c=20 r=0
-	if (screen == testScreen::bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED));
-	if (screen == testScreen::hotend
-	    || screen == testScreen::hotendOk) lcd_puts_P(_i("Checking hotend  "));////MSG_SELFTEST_CHECK_HOTEND c=20 r=0
-	if (screen == testScreen::fsensor) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
-	if (screen == testScreen::fsensorOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
-	if (screen == testScreen::allCorrect) lcd_puts_P(_i("All correct      "));////MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
-	if (screen == testScreen::failed) lcd_puts_P(_T(MSG_SELFTEST_FAILED));
-	if (screen == testScreen::home) lcd_puts_P(_i("Calibrating home"));////c=20 r=1
+	if (screen == TestScreen::ExtruderFan) lcd_puts_P(_T(MSG_SELFTEST_FAN));
+	if (screen == TestScreen::PrintFan) lcd_puts_P(_T(MSG_SELFTEST_FAN));
+	if (screen == TestScreen::FansOk) lcd_puts_P(_T(MSG_SELFTEST_FAN));
+	if (screen == TestScreen::EndStops) lcd_puts_P(_i("Checking endstops"));////MSG_SELFTEST_CHECK_ENDSTOPS c=20
+	if (screen == TestScreen::AxisX) lcd_puts_P(_i("Checking X axis  "));////MSG_SELFTEST_CHECK_X c=20
+	if (screen == TestScreen::AxisY) lcd_puts_P(_i("Checking Y axis  "));////MSG_SELFTEST_CHECK_Y c=20
+	if (screen == TestScreen::AxisZ) lcd_puts_P(_i("Checking Z axis  "));////MSG_SELFTEST_CHECK_Z c=20
+	if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED));
+	if (screen == TestScreen::Hotend
+	    || screen == TestScreen::HotendOk) lcd_puts_P(_i("Checking hotend  "));////MSG_SELFTEST_CHECK_HOTEND c=20
+	if (screen == TestScreen::Fsensor) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
+	if (screen == TestScreen::FsensorOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
+	if (screen == TestScreen::AllCorrect) lcd_puts_P(_i("All correct      "));////MSG_SELFTEST_CHECK_ALLCORRECT c=20
+	if (screen == TestScreen::Failed) lcd_puts_P(_T(MSG_SELFTEST_FAILED));
+	if (screen == TestScreen::Home) lcd_puts_P(_i("Calibrating home"));////c=20 r=1
 
 
 	lcd_set_cursor(0, 1);
 	lcd_set_cursor(0, 1);
 	lcd_puts_P(separator);
 	lcd_puts_P(separator);
-	if ((screen >= testScreen::extruderFan) && (screen <= testScreen::fansOk))
+	if ((screen >= TestScreen::ExtruderFan) && (screen <= TestScreen::FansOk))
 	{
 	{
 		//SERIAL_ECHOLNPGM("Fan test");
 		//SERIAL_ECHOLNPGM("Fan test");
-		lcd_puts_at_P(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
 		lcd_set_cursor(18, 2);
 		lcd_set_cursor(18, 2);
-		(screen < testScreen::printFan) ? lcd_print(_indicator) : lcd_print("OK");
-		lcd_puts_at_P(0, 3, _i("Print fan:"));////MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
+		(screen < TestScreen::PrintFan) ? lcd_print(_indicator) : lcd_print("OK");
+		lcd_puts_at_P(0, 3, _i("Print fan:"));////MSG_SELFTEST_PRINT_FAN_SPEED c=18
 		lcd_set_cursor(18, 3);
 		lcd_set_cursor(18, 3);
-		(screen < testScreen::fansOk) ? lcd_print(_indicator) : lcd_print("OK");
+		(screen < TestScreen::FansOk) ? lcd_print(_indicator) : lcd_print("OK");
 	}
 	}
-	else if (screen >= testScreen::fsensor && screen <= testScreen::fsensorOk)
+	else if (screen >= TestScreen::Fsensor && screen <= TestScreen::FsensorOk)
 	{
 	{
 		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR));
 		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR));
 		lcd_putc(':');
 		lcd_putc(':');
 		lcd_set_cursor(18, 2);
 		lcd_set_cursor(18, 2);
-		(screen == testScreen::fsensor) ? lcd_print(_indicator) : lcd_print("OK");
+		(screen == TestScreen::Fsensor) ? lcd_print(_indicator) : lcd_print("OK");
 	}
 	}
-	else if (screen < testScreen::fsensor)
+	else if (screen < TestScreen::Fsensor)
 	{
 	{
 		//SERIAL_ECHOLNPGM("Other tests");
 		//SERIAL_ECHOLNPGM("Other tests");
 
 
-	    testScreen _step_block = testScreen::axisX;
+	    TestScreen _step_block = TestScreen::AxisX;
 		lcd_selftest_screen_step(2, 2, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), "X", _indicator);
 		lcd_selftest_screen_step(2, 2, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), "X", _indicator);
 
 
-		_step_block = testScreen::axisY;
+		_step_block = TestScreen::AxisY;
 		lcd_selftest_screen_step(2, 8, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), "Y", _indicator);
 		lcd_selftest_screen_step(2, 8, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), "Y", _indicator);
 
 
-		_step_block = testScreen::axisZ;
+		_step_block = TestScreen::AxisZ;
 		lcd_selftest_screen_step(2, 14, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), "Z", _indicator);
 		lcd_selftest_screen_step(2, 14, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), "Z", _indicator);
 
 
-		_step_block = testScreen::bed;
+		_step_block = TestScreen::Bed;
 		lcd_selftest_screen_step(3, 0, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), "Bed", _indicator);
 		lcd_selftest_screen_step(3, 0, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), "Bed", _indicator);
 
 
-        _step_block = testScreen::hotend;
+        _step_block = TestScreen::Hotend;
         lcd_selftest_screen_step(3, 9, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), "Hotend", _indicator);
         lcd_selftest_screen_step(3, 9, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), "Hotend", _indicator);
 	}
 	}
 
 
@@ -8058,7 +8054,7 @@ static void menu_action_sdfile(const char* filename)
   const char end[5] = ".gco";
   const char end[5] = ".gco";
 
 
   //we are storing just first 8 characters of 8.3 filename assuming that extension is always ".gco"
   //we are storing just first 8 characters of 8.3 filename assuming that extension is always ".gco"
-  for (int i = 0; i < 8; i++) {
+  for (uint_least8_t i = 0; i < 8; i++) {
 	  if (strcmp((cmd + i + 4), end) == 0) { 
 	  if (strcmp((cmd + i + 4), end) == 0) { 
 		  //filename is shorter then 8.3, store '\0' character on position where ".gco" string was found to terminate stored string properly
 		  //filename is shorter then 8.3, store '\0' character on position where ".gco" string was found to terminate stored string properly
  		  eeprom_write_byte((uint8_t*)EEPROM_FILENAME + i, '\0');
  		  eeprom_write_byte((uint8_t*)EEPROM_FILENAME + i, '\0');
@@ -8072,8 +8068,8 @@ static void menu_action_sdfile(const char* filename)
   uint8_t depth = (uint8_t)card.getWorkDirDepth();
   uint8_t depth = (uint8_t)card.getWorkDirDepth();
   eeprom_write_byte((uint8_t*)EEPROM_DIR_DEPTH, depth);
   eeprom_write_byte((uint8_t*)EEPROM_DIR_DEPTH, depth);
 
 
-  for (uint8_t i = 0; i < depth; i++) {
-	  for (int j = 0; j < 8; j++) {
+  for (uint_least8_t i = 0; i < depth; i++) {
+	  for (uint_least8_t j = 0; j < 8; j++) {
 		  eeprom_write_byte((uint8_t*)EEPROM_DIRS + j + 8 * i, dir_names[i][j]);
 		  eeprom_write_byte((uint8_t*)EEPROM_DIRS + j + 8 * i, dir_names[i][j]);
 	  }
 	  }
   }
   }
@@ -8226,13 +8222,19 @@ void lcd_setstatus(const char* message)
   strncpy(lcd_status_message, message, LCD_WIDTH);
   strncpy(lcd_status_message, message, LCD_WIDTH);
   lcd_finishstatus();
   lcd_finishstatus();
 }
 }
+void lcd_updatestatuspgm(const char *message){
+	strncpy_P(lcd_status_message, message, LCD_WIDTH);
+	lcd_status_message[LCD_WIDTH] = 0;
+	lcd_finishstatus();
+	// hack lcd_draw_update to 1, i.e. without clear
+	lcd_draw_update = 1;
+}
+
 void lcd_setstatuspgm(const char* message)
 void lcd_setstatuspgm(const char* message)
 {
 {
   if (lcd_status_message_level > 0)
   if (lcd_status_message_level > 0)
     return;
     return;
-  strncpy_P(lcd_status_message, message, LCD_WIDTH);
-  lcd_status_message[LCD_WIDTH] = 0;
-  lcd_finishstatus();
+  lcd_updatestatuspgm(message);
 }
 }
 void lcd_setalertstatuspgm(const char* message)
 void lcd_setalertstatuspgm(const char* message)
 {
 {
@@ -8305,7 +8307,7 @@ void menu_lcd_lcdupdate_func(void)
                if(menu_menu==lcd_sdcard_menu)
                if(menu_menu==lcd_sdcard_menu)
                     menu_back();
                     menu_back();
 			card.release();
 			card.release();
-			LCD_MESSAGERPGM(_i("Card removed"));////MSG_SD_REMOVED c=0 r=0
+			LCD_MESSAGERPGM(_i("Card removed"));////MSG_SD_REMOVED
 		}
 		}
 	}
 	}
 #endif//CARDINSERTED
 #endif//CARDINSERTED
@@ -8346,5 +8348,5 @@ void menu_lcd_lcdupdate_func(void)
 	if (!SdFatUtil::test_stack_integrity()) stack_error();
 	if (!SdFatUtil::test_stack_integrity()) stack_error();
 	lcd_ping(); //check that we have received ping command if we are in farm mode
 	lcd_ping(); //check that we have received ping command if we are in farm mode
 	lcd_send_status();
 	lcd_send_status();
-	if (lcd_commands_type == LCD_COMMAND_V2_CAL) lcd_commands();
+	if (lcd_commands_type == LcdCommands::Layer1Cal) lcd_commands();
 }
 }

+ 44 - 29
Firmware/ultralcd.h

@@ -18,7 +18,16 @@ extern void menu_lcd_lcdupdate_func(void);
 void ultralcd_init();
 void ultralcd_init();
 void lcd_setstatus(const char* message);
 void lcd_setstatus(const char* message);
 void lcd_setstatuspgm(const char* message);
 void lcd_setstatuspgm(const char* message);
+//! return to the main status screen and display the alert message
+//! Beware - it has sideeffects:
+//! - always returns the display to the main status screen
+//! - always makes lcd_reset (which is slow and causes flicker)
+//! - does not update the message if there is already one (i.e. lcd_status_message_level > 0)
 void lcd_setalertstatuspgm(const char* message);
 void lcd_setalertstatuspgm(const char* message);
+//! only update the alert message on the main status screen
+//! has no sideeffects, may be called multiple times
+void lcd_updatestatuspgm(const char *message);
+
 void lcd_reset_alert_level();
 void lcd_reset_alert_level();
 uint8_t get_message_level();
 uint8_t get_message_level();
 void lcd_adjust_z();
 void lcd_adjust_z();
@@ -80,31 +89,37 @@ extern void lcd_diag_show_end_stops();
 
 
 
 
 // To be used in lcd_commands_type.
 // To be used in lcd_commands_type.
-#define LCD_COMMAND_IDLE 0
-#define LCD_COMMAND_LOAD_FILAMENT 1
-#define LCD_COMMAND_STOP_PRINT 2
-#define LCD_COMMAND_FARM_MODE_CONFIRM 4
-#define LCD_COMMAND_LONG_PAUSE 5
-#define LCD_COMMAND_PID_EXTRUDER 7 
-#define LCD_COMMAND_V2_CAL 8
-
-extern int lcd_commands_type;
+enum class LcdCommands : uint_least8_t
+{
+	Idle,
+	LoadFilament,
+	StopPrint,
+	FarmModeConfirm,
+	LongPause,
+	PidExtruder,
+	Layer1Cal,
+};
+
+extern LcdCommands lcd_commands_type;
 extern int8_t FSensorStateMenu;
 extern int8_t FSensorStateMenu;
 
 
-#define CUSTOM_MSG_TYPE_STATUS 0 // status message from lcd_status_message variable
-#define CUSTOM_MSG_TYPE_MESHBL 1 // Mesh bed leveling in progress
-#define CUSTOM_MSG_TYPE_F_LOAD 2 // Loading filament in progress
-#define CUSTOM_MSG_TYPE_PIDCAL 3 // PID tuning in progress
-#define CUSTOM_MSG_TYPE_TEMCAL 4 // PINDA temp calibration
-#define CUSTOM_MSG_TYPE_TEMPRE 5 // Temp compensation preheat
+enum class CustomMsg : uint_least8_t
+{
+	Status,          //!< status message from lcd_status_message variable
+	MeshBedLeveling, //!< Mesh bed leveling in progress
+	FilamentLoading, //!< Loading filament in progress
+	PidCal,          //!< PID tuning in progress
+	TempCal,         //!< PINDA temperature calibration
+	TempCompPreheat, //!< Temperature compensation preheat
+};
 
 
-extern unsigned int custom_message_type;
+extern CustomMsg custom_message_type;
 extern unsigned int custom_message_state;
 extern unsigned int custom_message_state;
 
 
 extern uint8_t farm_mode;
 extern uint8_t farm_mode;
 extern int farm_no;
 extern int farm_no;
 extern int farm_timer;
 extern int farm_timer;
-extern int farm_status;
+extern uint8_t farm_status;
 
 
 #ifdef TMC2130
 #ifdef TMC2130
 #define SILENT_MODE_NORMAL 0
 #define SILENT_MODE_NORMAL 0
@@ -129,7 +144,6 @@ void lcd_commands();
 
 
 
 
 void change_extr(int extr);
 void change_extr(int extr);
-void extr_adj(int extruder);
 
 
 #ifdef SNMM
 #ifdef SNMM
 void extr_unload_all(); 
 void extr_unload_all(); 
@@ -137,18 +151,19 @@ void extr_unload_used();
 #endif //SNMM
 #endif //SNMM
 void extr_unload();
 void extr_unload();
 
 
-typedef enum
+enum class FilamentAction : uint_least8_t
 {
 {
-    e_FILAMENT_ACTION_none, //!< 'none' state is used as flag for (filament) autoLoad (i.e. opposite for 'autoLoad' state)
-    e_FILAMENT_ACTION_Load,
-    e_FILAMENT_ACTION_autoLoad,
-    e_FILAMENT_ACTION_unLoad,
-    e_FILAMENT_ACTION_mmuLoad,
-    e_FILAMENT_ACTION_mmuUnLoad,
-    e_FILAMENT_ACTION_mmuEject,
-    e_FILAMENT_ACTION_mmuCut,
-} eFILAMENT_ACTION;
-extern eFILAMENT_ACTION eFilamentAction;
+    None, //!< 'none' state is used as flag for (filament) autoLoad (i.e. opposite for 'autoLoad' state)
+    Load,
+    AutoLoad,
+    UnLoad,
+    MmuLoad,
+    MmuUnLoad,
+    MmuEject,
+    MmuCut,
+};
+
+extern FilamentAction eFilamentAction;
 extern bool bFilamentFirstRun;
 extern bool bFilamentFirstRun;
 extern bool bFilamentPreheatState;
 extern bool bFilamentPreheatState;
 extern bool bFilamentAction;
 extern bool bFilamentAction;

+ 45 - 2
Firmware/util.cpp

@@ -229,7 +229,7 @@ inline bool parse_version_P(const char *str, uint16_t version[4])
 // 1 - yes, 0 - false, -1 - error;
 // 1 - yes, 0 - false, -1 - error;
 inline int8_t is_provided_version_newer(const char *version_string)
 inline int8_t is_provided_version_newer(const char *version_string)
 {
 {
-    uint16_t ver_gcode[3], ver_current[3];
+    uint16_t ver_gcode[4], ver_current[4];
     if (! parse_version(version_string, ver_gcode))
     if (! parse_version(version_string, ver_gcode))
         return -1;
         return -1;
     if (! parse_version_P(FW_VERSION_STR, ver_current))
     if (! parse_version_P(FW_VERSION_STR, ver_current))
@@ -294,7 +294,7 @@ bool show_upgrade_dialog_if_version_newer(const char *version_string)
         lcd_puts_at_P(0, 2, PSTR(""));
         lcd_puts_at_P(0, 2, PSTR(""));
         for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c)
         for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c)
             lcd_putc(*c);
             lcd_putc(*c);
-        lcd_puts_at_P(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
 if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
         _tone(BEEPER, 1000);
         _tone(BEEPER, 1000);
         delay_keep_alive(50);
         delay_keep_alive(50);
@@ -327,3 +327,46 @@ void update_current_firmware_version_to_eeprom()
         eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR,   ver_current[3]);
         eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR,   ver_current[3]);
     }
     }
 }
 }
+
+
+//-//
+eNOZZLE_DIAMETER eNozzleDiameter=e_NOZZLE_DIAMETER_400;
+eCHECK_MODE eCheckMode=e_CHECK_MODE_none;
+
+void fCheckModeInit()
+{
+eCheckMode=(eCHECK_MODE)eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODE);
+if(eCheckMode==e_CHECK_MODE_NULL)
+     {
+     eCheckMode=e_CHECK_MODE_warn;
+     eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)eCheckMode);
+     }
+if(farm_mode)
+     eCheckMode=e_CHECK_MODE_strict;
+eNozzleDiameter=(eNOZZLE_DIAMETER)eeprom_read_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER);
+if((eNozzleDiameter==e_NOZZLE_DIAMETER_NULL)&& !farm_mode)
+     {
+     eNozzleDiameter=e_NOZZLE_DIAMETER_400;
+     eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)eNozzleDiameter);
+     eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,400);
+     }
+}
+
+void nozzle_diameter_check(uint16_t nDiameter)
+{
+uint16_t nDiameter_um;
+
+nDiameter_um=eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM);
+if(nDiameter==nDiameter_um)
+     return;
+switch(eCheckMode)
+     {
+     case e_CHECK_MODE_warn:
+          lcd_show_fullscreen_message_and_wait_P(_i("Nozzle diameter doesn't match! Press the knob to continue."));
+          break;
+     case e_CHECK_MODE_strict:
+          lcd_show_fullscreen_message_and_wait_P(_i("Nozzle diameter doesn't match! Print is aborted, press the knob."));
+          lcd_print_stop();
+          break;
+     }
+}

+ 25 - 0
Firmware/util.h

@@ -33,4 +33,29 @@ inline void eeprom_update_int8(unsigned char* addr, int8_t v) {
 	eeprom_update_byte(addr, *reinterpret_cast<uint8_t*>(&v));
 	eeprom_update_byte(addr, *reinterpret_cast<uint8_t*>(&v));
 }
 }
 
 
+
+//-//
+#define e_CHECK_MODE_NULL 0xFF
+#define e_NOZZLE_DIAMETER_NULL 0xFF
+
+typedef enum
+{
+    e_NOZZLE_DIAMETER_250,
+    e_NOZZLE_DIAMETER_400,
+    e_NOZZLE_DIAMETER_600
+} eNOZZLE_DIAMETER;
+
+typedef enum
+{
+    e_CHECK_MODE_none,
+    e_CHECK_MODE_warn,
+    e_CHECK_MODE_strict
+} eCHECK_MODE;
+
+extern eNOZZLE_DIAMETER eNozzleDiameter;
+extern eCHECK_MODE eCheckMode;
+
+void fCheckModeInit();
+void nozzle_diameter_check(uint16_t nDiameter);
+
 #endif /* UTIL_H */
 #endif /* UTIL_H */

+ 5 - 1
Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h

@@ -97,6 +97,9 @@ AXIS SETTINGS
 // New XYZ calibration
 // New XYZ calibration
 //#define NEW_XYZCAL
 //#define NEW_XYZCAL
 
 
+// Watchdog support
+#define WATCHDOG
+
 
 
 /*------------------------------------
 /*------------------------------------
 EXTRUDER SETTINGS
 EXTRUDER SETTINGS
@@ -312,7 +315,7 @@ PREHEAT SETTINGS
 *------------------------------------*/
 *------------------------------------*/
 
 
 #define FARM_PREHEAT_HOTEND_TEMP 250
 #define FARM_PREHEAT_HOTEND_TEMP 250
-#define FARM_PREHEAT_HPB_TEMP 40
+#define FARM_PREHEAT_HPB_TEMP 80
 #define FARM_PREHEAT_FAN_SPEED 0
 #define FARM_PREHEAT_FAN_SPEED 0
 
 
 #define PLA_PREHEAT_HOTEND_TEMP 215
 #define PLA_PREHEAT_HOTEND_TEMP 215
@@ -435,6 +438,7 @@ THERMISTORS SETTINGS
 // Safety timer
 // Safety timer
 #define SAFETYTIMER
 #define SAFETYTIMER
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
+#define FARM_DEFAULT_SAFETYTIMER_TIME_ms (45*60*1000ul)
 
 
 #define M600_TIMEOUT 600  //seconds
 #define M600_TIMEOUT 600  //seconds
 
 

+ 4 - 1
Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h

@@ -97,6 +97,8 @@ AXIS SETTINGS
 // New XYZ calibration
 // New XYZ calibration
 //#define NEW_XYZCAL
 //#define NEW_XYZCAL
 
 
+// Watchdog support
+#define WATCHDOG
 
 
 /*------------------------------------
 /*------------------------------------
 EXTRUDER SETTINGS
 EXTRUDER SETTINGS
@@ -312,7 +314,7 @@ PREHEAT SETTINGS
 *------------------------------------*/
 *------------------------------------*/
 
 
 #define FARM_PREHEAT_HOTEND_TEMP 250
 #define FARM_PREHEAT_HOTEND_TEMP 250
-#define FARM_PREHEAT_HPB_TEMP 40
+#define FARM_PREHEAT_HPB_TEMP 80
 #define FARM_PREHEAT_FAN_SPEED 0
 #define FARM_PREHEAT_FAN_SPEED 0
 
 
 #define PLA_PREHEAT_HOTEND_TEMP 215
 #define PLA_PREHEAT_HOTEND_TEMP 215
@@ -435,6 +437,7 @@ THERMISTORS SETTINGS
 // Safety timer
 // Safety timer
 #define SAFETYTIMER
 #define SAFETYTIMER
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
+#define FARM_DEFAULT_SAFETYTIMER_TIME_ms (45*60*1000ul)
 
 
 #define M600_TIMEOUT 600  //seconds
 #define M600_TIMEOUT 600  //seconds
 
 

+ 5 - 1
Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h

@@ -103,12 +103,16 @@
 // New XYZ calibration
 // New XYZ calibration
 #define NEW_XYZCAL
 #define NEW_XYZCAL
 
 
+// Watchdog support
+#define WATCHDOG
+
 // Fan check
 // Fan check
 #define FANCHECK
 #define FANCHECK
 
 
 // Safety timer
 // Safety timer
 #define SAFETYTIMER
 #define SAFETYTIMER
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
+#define FARM_DEFAULT_SAFETYTIMER_TIME_ms (45*60*1000ul)
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
@@ -368,7 +372,7 @@
  *------------------------------------*/
  *------------------------------------*/
 
 
 #define FARM_PREHEAT_HOTEND_TEMP 250
 #define FARM_PREHEAT_HOTEND_TEMP 250
-#define FARM_PREHEAT_HPB_TEMP 40
+#define FARM_PREHEAT_HPB_TEMP 80
 #define FARM_PREHEAT_FAN_SPEED 0
 #define FARM_PREHEAT_FAN_SPEED 0
 
 
 #define PLA_PREHEAT_HOTEND_TEMP 215
 #define PLA_PREHEAT_HOTEND_TEMP 215

+ 5 - 1
Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h

@@ -104,12 +104,16 @@
 // New XYZ calibration
 // New XYZ calibration
 #define NEW_XYZCAL
 #define NEW_XYZCAL
 
 
+// Watchdog support
+#define WATCHDOG
+
 // Fan check
 // Fan check
 #define FANCHECK
 #define FANCHECK
 
 
 // Safety timer
 // Safety timer
 #define SAFETYTIMER
 #define SAFETYTIMER
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
+#define FARM_DEFAULT_SAFETYTIMER_TIME_ms (45*60*1000ul)
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
@@ -369,7 +373,7 @@
  *------------------------------------*/
  *------------------------------------*/
 
 
 #define FARM_PREHEAT_HOTEND_TEMP 250
 #define FARM_PREHEAT_HOTEND_TEMP 250
-#define FARM_PREHEAT_HPB_TEMP 40
+#define FARM_PREHEAT_HPB_TEMP 80
 #define FARM_PREHEAT_FAN_SPEED 0
 #define FARM_PREHEAT_FAN_SPEED 0
 
 
 #define PLA_PREHEAT_HOTEND_TEMP 215
 #define PLA_PREHEAT_HOTEND_TEMP 215

+ 12 - 1
Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h

@@ -103,12 +103,16 @@
 // New XYZ calibration
 // New XYZ calibration
 #define NEW_XYZCAL
 #define NEW_XYZCAL
 
 
+// Watchdog support
+#define WATCHDOG
+
 // Fan check
 // Fan check
 #define FANCHECK
 #define FANCHECK
 
 
 // Safety timer
 // Safety timer
 #define SAFETYTIMER
 #define SAFETYTIMER
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
+#define FARM_DEFAULT_SAFETYTIMER_TIME_ms (45*60*1000ul)
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
@@ -368,7 +372,7 @@
  *------------------------------------*/
  *------------------------------------*/
 
 
 #define FARM_PREHEAT_HOTEND_TEMP 250
 #define FARM_PREHEAT_HOTEND_TEMP 250
-#define FARM_PREHEAT_HPB_TEMP 40
+#define FARM_PREHEAT_HPB_TEMP 80
 #define FARM_PREHEAT_FAN_SPEED 0
 #define FARM_PREHEAT_FAN_SPEED 0
 
 
 #define PLA_PREHEAT_HOTEND_TEMP 215
 #define PLA_PREHEAT_HOTEND_TEMP 215
@@ -502,6 +506,13 @@
 #define MMU_DEBUG //print communication between MMU2 and printer on serial
 #define MMU_DEBUG //print communication between MMU2 and printer on serial
 //#define MMU_HAS_CUTTER
 //#define MMU_HAS_CUTTER
 
 
+// This is experimental feature requested by our test department.
+// There is no known use for ordinary user. If enabled by this macro
+// and enabled from printer menu (not enabled by default). It cuts filament
+// every time when switching filament from gcode. MMU_HAS_CUTTER needs to be
+// defined.
+
+//#define MMU_ALWAYS_CUT
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 
 
 #endif //__CONFIGURATION_PRUSA_H
 #endif //__CONFIGURATION_PRUSA_H

+ 12 - 1
Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h

@@ -104,12 +104,16 @@
 // New XYZ calibration
 // New XYZ calibration
 #define NEW_XYZCAL
 #define NEW_XYZCAL
 
 
+// Watchdog support
+#define WATCHDOG
+
 // Fan check
 // Fan check
 #define FANCHECK
 #define FANCHECK
 
 
 // Safety timer
 // Safety timer
 #define SAFETYTIMER
 #define SAFETYTIMER
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
+#define FARM_DEFAULT_SAFETYTIMER_TIME_ms (45*60*1000ul)
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
@@ -369,7 +373,7 @@
  *------------------------------------*/
  *------------------------------------*/
 
 
 #define FARM_PREHEAT_HOTEND_TEMP 250
 #define FARM_PREHEAT_HOTEND_TEMP 250
-#define FARM_PREHEAT_HPB_TEMP 40
+#define FARM_PREHEAT_HPB_TEMP 80
 #define FARM_PREHEAT_FAN_SPEED 0
 #define FARM_PREHEAT_FAN_SPEED 0
 
 
 #define PLA_PREHEAT_HOTEND_TEMP 215
 #define PLA_PREHEAT_HOTEND_TEMP 215
@@ -503,6 +507,13 @@
 #define MMU_DEBUG //print communication between MMU2 and printer on serial
 #define MMU_DEBUG //print communication between MMU2 and printer on serial
 //#define MMU_HAS_CUTTER
 //#define MMU_HAS_CUTTER
 
 
+// This is experimental feature requested by our test department.
+// There is no known use for ordinary user. If enabled by this macro
+// and enabled from printer menu (not enabled by default). It cuts filament
+// every time when switching filament from gcode. MMU_HAS_CUTTER needs to be
+// defined.
+
+//#define MMU_ALWAYS_CUT
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 
 
 #endif //__CONFIGURATION_PRUSA_H
 #endif //__CONFIGURATION_PRUSA_H

+ 3 - 2
Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h

@@ -131,6 +131,7 @@
 // Safety timer
 // Safety timer
 #define SAFETYTIMER
 #define SAFETYTIMER
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
+#define FARM_DEFAULT_SAFETYTIMER_TIME_ms (45*60*1000ul)
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
@@ -190,7 +191,7 @@
 #define LINEARITY_CORRECTION
 #define LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION_XYZ
 #define TMC2130_LINEARITY_CORRECTION_XYZ
-//#define TMC2130_VARIABLE_RESOLUTION
+#define TMC2130_VARIABLE_RESOLUTION
 
 
 
 
 
 
@@ -480,7 +481,7 @@
  *------------------------------------*/
  *------------------------------------*/
 
 
 #define FARM_PREHEAT_HOTEND_TEMP 250
 #define FARM_PREHEAT_HOTEND_TEMP 250
-#define FARM_PREHEAT_HPB_TEMP 60
+#define FARM_PREHEAT_HPB_TEMP 80
 #define FARM_PREHEAT_FAN_SPEED 0
 #define FARM_PREHEAT_FAN_SPEED 0
 
 
 #define PLA_PREHEAT_HOTEND_TEMP 215
 #define PLA_PREHEAT_HOTEND_TEMP 215

+ 11 - 2
Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h

@@ -131,6 +131,7 @@
 // Safety timer
 // Safety timer
 #define SAFETYTIMER
 #define SAFETYTIMER
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
 #define DEFAULT_SAFETYTIMER_TIME_MINS 30
+#define FARM_DEFAULT_SAFETYTIMER_TIME_ms (45*60*1000ul)
 
 
 // Filament sensor
 // Filament sensor
 #define FILAMENT_SENSOR
 #define FILAMENT_SENSOR
@@ -190,7 +191,7 @@
 #define LINEARITY_CORRECTION
 #define LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION
 #define TMC2130_LINEARITY_CORRECTION_XYZ
 #define TMC2130_LINEARITY_CORRECTION_XYZ
-//#define TMC2130_VARIABLE_RESOLUTION
+#define TMC2130_VARIABLE_RESOLUTION
 
 
 
 
 
 
@@ -480,7 +481,7 @@
  *------------------------------------*/
  *------------------------------------*/
 
 
 #define FARM_PREHEAT_HOTEND_TEMP 250
 #define FARM_PREHEAT_HOTEND_TEMP 250
-#define FARM_PREHEAT_HPB_TEMP 60
+#define FARM_PREHEAT_HPB_TEMP 80
 #define FARM_PREHEAT_FAN_SPEED 0
 #define FARM_PREHEAT_FAN_SPEED 0
 
 
 #define PLA_PREHEAT_HOTEND_TEMP 215
 #define PLA_PREHEAT_HOTEND_TEMP 215
@@ -627,6 +628,14 @@
 #define MMU_HWRESET
 #define MMU_HWRESET
 #define MMU_DEBUG //print communication between MMU2 and printer on serial
 #define MMU_DEBUG //print communication between MMU2 and printer on serial
 //#define MMU_HAS_CUTTER
 //#define MMU_HAS_CUTTER
+
+// This is experimental feature requested by our test department.
+// There is no known use for ordinary user. If enabled by this macro
+// and enabled from printer menu (not enabled by default). It cuts filament
+// every time when switching filament from gcode. MMU_HAS_CUTTER needs to be
+// defined.
+
+//#define MMU_ALWAYS_CUT
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 #define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
 
 
 #endif //__CONFIGURATION_PRUSA_H
 #endif //__CONFIGURATION_PRUSA_H

+ 25 - 25
PF-build.sh

@@ -1,12 +1,12 @@
 #!/bin/bash 
 #!/bin/bash 
-# This bash script is used to compile automatically the Prusa firmware with a dedecated build enviroment and settings
+# This bash script is used to compile automatically the Prusa firmware with a dedicated build environment and settings
 # 
 # 
 # Supported OS: Windows 10, Linux64 bit
 # Supported OS: Windows 10, Linux64 bit
 #
 #
 # Linux:
 # Linux:
 #
 #
 # Windows:
 # Windows:
-# To excecute this sciprt you gonna need few things on your Windows machine
+# To execute this script you gonna need few things on your Windows machine
 #
 #
 # Linux Subsystem Ubuntu
 # Linux Subsystem Ubuntu
 # 1. Follow these instructions
 # 1. Follow these instructions
@@ -28,15 +28,15 @@
 # 4. Run git Bash under Administrator privilege and navigate to the directory /c/Program Files/Git/mingw64/bin,
 # 4. Run git Bash under Administrator privilege and navigate to the directory /c/Program Files/Git/mingw64/bin,
 #    you can run the command ln -s /c/Program Files/7-Zip/7z.exe zip.exe
 #    you can run the command ln -s /c/Program Files/7-Zip/7z.exe zip.exe
 #
 #
-# Usefull things to edit and compare your custom Firmware
+# Useful things to edit and compare your custom Firmware
 # 1. Download and install current and correct (64bit or 32bit) Notepad++ version https://notepad-plus-plus.org/download
 # 1. Download and install current and correct (64bit or 32bit) Notepad++ version https://notepad-plus-plus.org/download
 # 2. Another great tool to compare your custom mod and stock firmware is WinMerge http://winmerge.org/downloads/?lang=en
 # 2. Another great tool to compare your custom mod and stock firmware is WinMerge http://winmerge.org/downloads/?lang=en
 # 
 # 
-# Example for MK3: open git bash and chage to your Firmware directory 
+# Example for MK3: open git bash and change to your Firmware directory 
 # <username>@<machinename> MINGW64 /<drive>/path
 # <username>@<machinename> MINGW64 /<drive>/path
 # bash build.sh 1_75mm_MK3-EINSy10a-E3Dv6full
 # bash build.sh 1_75mm_MK3-EINSy10a-E3Dv6full
 #
 #
-# Example for MK25: open git bash and chage to your directory 
+# Example for MK25: open git bash and change to your directory 
 # gussner@WIN01 MINGW64 /d/Data/Prusa-Firmware/MK3
 # gussner@WIN01 MINGW64 /d/Data/Prusa-Firmware/MK3
 # bash build.sh 1_75mm_MK25-RAMBo13a-E3Dv6full
 # bash build.sh 1_75mm_MK25-RAMBo13a-E3Dv6full
 #
 #
@@ -47,7 +47,7 @@
 # Version: 1.0.1-Build_8
 # Version: 1.0.1-Build_8
 # Change log:
 # Change log:
 # 12 Jan 2019, 3d-gussner, Fixed "compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections" in 'platform.txt'
 # 12 Jan 2019, 3d-gussner, Fixed "compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections" in 'platform.txt'
-# 16 Jan 2019, 3d-gussner, Build_2, Added development check to modify 'Configuration.h' to prevent unwanted LCD messages that Firmware is uknown
+# 16 Jan 2019, 3d-gussner, Build_2, Added development check to modify 'Configuration.h' to prevent unwanted LCD messages that Firmware is unknown
 # 17 Jan 2019, 3d-gussner, Build_3, Check for OS Windows or Linux and use the right build enviroment
 # 17 Jan 2019, 3d-gussner, Build_3, Check for OS Windows or Linux and use the right build enviroment
 # 10 Feb 2019, ropaha, Pull Request, Select variant from list while using build.sh
 # 10 Feb 2019, ropaha, Pull Request, Select variant from list while using build.sh
 # 10 Feb 2019, ropaha, change FW_DEV_VERSION automatically depending on FW_VERSION RC/BETA/ALPHA
 # 10 Feb 2019, ropaha, change FW_DEV_VERSION automatically depending on FW_VERSION RC/BETA/ALPHA
@@ -96,7 +96,7 @@ else
 	exit
 	exit
 fi
 fi
 sleep 2
 sleep 2
-###Prepare bash enviroment and check if wget and zip are availible
+###Prepare bash enviroment and check if wget and zip are available
 if ! type wget > /dev/null; then
 if ! type wget > /dev/null; then
 	echo "$(tput setaf 1)Missing 'wget' which is important to run this script"
 	echo "$(tput setaf 1)Missing 'wget' which is important to run this script"
 	echo "Please follow these instructions https://gist.github.com/evanwill/0207876c3243bbb6863e65ec5dc3f058 to install wget$(tput sgr0)"
 	echo "Please follow these instructions https://gist.github.com/evanwill/0207876c3243bbb6863e65ec5dc3f058 to install wget$(tput sgr0)"
@@ -139,7 +139,7 @@ fi
 cd ../build-env || exit 3
 cd ../build-env || exit 3
 
 
 # Check if PF-build-env-<version> exists and downloads + creates it if not
 # Check if PF-build-env-<version> exists and downloads + creates it if not
-# The build enviroment is based on the Arduino IDE 1.8.5 portal vesion with some changes
+# The build enviroment is based on the Arduino IDE 1.8.5 portal version with some changes
 if [ ! -d "../PF-build-env-$BUILD_ENV" ]; then
 if [ ! -d "../PF-build-env-$BUILD_ENV" ]; then
 	echo "$(tput setaf 6)PF-build-env-$BUILD_ENV is missing ... creating it now for you$(tput sgr 0)"
 	echo "$(tput setaf 6)PF-build-env-$BUILD_ENV is missing ... creating it now for you$(tput sgr 0)"
 	mkdir ../PF-build-env-$BUILD_ENV
 	mkdir ../PF-build-env-$BUILD_ENV
@@ -148,14 +148,14 @@ fi
 
 
 if [ $OSTYPE == "msys" ]; then
 if [ $OSTYPE == "msys" ]; then
 	if [ ! -f "PF-build-env-Win-$BUILD_ENV.zip" ]; then
 	if [ ! -f "PF-build-env-Win-$BUILD_ENV.zip" ]; then
-		echo "$(tput setaf 6)Downloding Windows build enviroment...$(tput setaf 2)"
+		echo "$(tput setaf 6)Downloading Windows build environment...$(tput setaf 2)"
 		sleep 2
 		sleep 2
 		wget https://github.com/3d-gussner/PF-build-env/releases/download/Win-$BUILD_ENV/PF-build-env-Win-$BUILD_ENV.zip || exit 4
 		wget https://github.com/3d-gussner/PF-build-env/releases/download/Win-$BUILD_ENV/PF-build-env-Win-$BUILD_ENV.zip || exit 4
 		#cp -f ../../PF-build-env/PF-build-env-Win-$BUILD_ENV.zip PF-build-env-Win-$BUILD_ENV.zip || exit4
 		#cp -f ../../PF-build-env/PF-build-env-Win-$BUILD_ENV.zip PF-build-env-Win-$BUILD_ENV.zip || exit4
 		echo "$(tput sgr 0)"
 		echo "$(tput sgr 0)"
 	fi
 	fi
 	if [ ! -d "../PF-build-env-$BUILD_ENV/$OSTYPE" ]; then
 	if [ ! -d "../PF-build-env-$BUILD_ENV/$OSTYPE" ]; then
-		echo "$(tput setaf 6)Unzipping Windows build enviroment...$(tput setaf 2)"
+		echo "$(tput setaf 6)Unzipping Windows build environment...$(tput setaf 2)"
 		sleep 2
 		sleep 2
 		unzip PF-build-env-Win-$BUILD_ENV.zip -d ../PF-build-env-$BUILD_ENV/$OSTYPE || exit 4
 		unzip PF-build-env-Win-$BUILD_ENV.zip -d ../PF-build-env-$BUILD_ENV/$OSTYPE || exit 4
 		echo "$(tput sgr0)"
 		echo "$(tput sgr0)"
@@ -165,7 +165,7 @@ fi
 
 
 if [ $OSTYPE == "linux-gnu" ]; then
 if [ $OSTYPE == "linux-gnu" ]; then
 	if [ ! -f "PF-build-env-Linux64-$BUILD_ENV.zip" ]; then
 	if [ ! -f "PF-build-env-Linux64-$BUILD_ENV.zip" ]; then
-		echo "$(tput setaf 6)Downloading Linux 64 build enviroment...$(tput setaf 2)"
+		echo "$(tput setaf 6)Downloading Linux 64 build environment...$(tput setaf 2)"
 		sleep 2
 		sleep 2
 		wget https://github.com/mkbel/PF-build-env/releases/download/$BUILD_ENV/PF-build-env-Linux64-$BUILD_ENV.zip || exit 3
 		wget https://github.com/mkbel/PF-build-env/releases/download/$BUILD_ENV/PF-build-env-Linux64-$BUILD_ENV.zip || exit 3
 		echo "$(tput sgr0)"
 		echo "$(tput sgr0)"
@@ -180,9 +180,9 @@ if [ $OSTYPE == "linux-gnu" ]; then
 fi
 fi
 cd $SCRIPT_PATH
 cd $SCRIPT_PATH
 
 
-# First argument defines which varaint of the Prusa Firmware will be compiled 
+# First argument defines which variant of the Prusa Firmware will be compiled 
 if [ -z "$1" ] ; then
 if [ -z "$1" ] ; then
-	# Select which varaint of the Prusa Firmware will be compiled, like
+	# Select which variant of the Prusa Firmware will be compiled, like
 	PS3="Select a variant: "
 	PS3="Select a variant: "
 	while IFS= read -r -d $'\0' f; do
 	while IFS= read -r -d $'\0' f; do
 		options[i++]="$f"
 		options[i++]="$f"
@@ -248,7 +248,7 @@ else
 	if [[ "$2" == "ALL" || "$2" == "EN_ONLY" ]] ; then
 	if [[ "$2" == "ALL" || "$2" == "EN_ONLY" ]] ; then
 		LANGUAGES=$2
 		LANGUAGES=$2
 	else
 	else
-		echo "$(tput setaf 1)Language agrument is wrong!$(tput sgr0)"
+		echo "$(tput setaf 1)Language argument is wrong!$(tput sgr0)"
 		echo "Only $(tput setaf 2)'ALL'$(tput sgr0) or $(tput setaf 2)'EN_ONLY'$(tput sgr0) are allowed as 2nd argument!"
 		echo "Only $(tput setaf 2)'ALL'$(tput sgr0) or $(tput setaf 2)'EN_ONLY'$(tput sgr0) are allowed as 2nd argument!"
 		exit
 		exit
 	fi
 	fi
@@ -270,7 +270,7 @@ BUILD_ENV_PATH="$( pwd -P )"
 
 
 cd ../..
 cd ../..
 
 
-#Checkif BUILD_PATH exisits and if not creates it
+#Checkif BUILD_PATH exists and if not creates it
 if [ ! -d "Prusa-Firmware-build" ]; then
 if [ ! -d "Prusa-Firmware-build" ]; then
     mkdir Prusa-Firmware-build  || exit 6
     mkdir Prusa-Firmware-build  || exit 6
 fi
 fi
@@ -286,7 +286,7 @@ do
 	FW=$(grep --max-count=1 "\bFW_VERSION\b" $SCRIPT_PATH/Firmware/Configuration.h | sed -e's/  */ /g'|cut -d '"' -f2|sed 's/\.//g')
 	FW=$(grep --max-count=1 "\bFW_VERSION\b" $SCRIPT_PATH/Firmware/Configuration.h | sed -e's/  */ /g'|cut -d '"' -f2|sed 's/\.//g')
 	# Find build version in Configuration.h file and use it to generate the hex filename
 	# Find build version in Configuration.h file and use it to generate the hex filename
 	BUILD=$(grep --max-count=1 "\bFW_COMMIT_NR\b" $SCRIPT_PATH/Firmware/Configuration.h | sed -e's/  */ /g'|cut -d ' ' -f3)
 	BUILD=$(grep --max-count=1 "\bFW_COMMIT_NR\b" $SCRIPT_PATH/Firmware/Configuration.h | sed -e's/  */ /g'|cut -d ' ' -f3)
-	# Check if the motherboard is an EINSY and if so the only one hex file will generated
+	# Check if the motherboard is an EINSY and if so only one hex file will generated
 	MOTHERBOARD=$(grep --max-count=1 "\bMOTHERBOARD\b" $SCRIPT_PATH/Firmware/variants/$VARIANT.h | sed -e's/  */ /g' |cut -d ' ' -f3)
 	MOTHERBOARD=$(grep --max-count=1 "\bMOTHERBOARD\b" $SCRIPT_PATH/Firmware/variants/$VARIANT.h | sed -e's/  */ /g' |cut -d ' ' -f3)
 	# Check development status
 	# Check development status
 	DEV_CHECK=$(grep --max-count=1 "\bFW_VERSION\b" $SCRIPT_PATH/Firmware/Configuration.h | sed -e's/  */ /g'|cut -d '"' -f2|sed 's/\.//g'|cut -d '-' -f2)
 	DEV_CHECK=$(grep --max-count=1 "\bFW_VERSION\b" $SCRIPT_PATH/Firmware/Configuration.h | sed -e's/  */ /g'|cut -d '"' -f2|sed 's/\.//g'|cut -d '-' -f2)
@@ -333,22 +333,22 @@ do
 	fi
 	fi
 	OUTPUT_FOLDER="Hex-files/FW$FW-Build$BUILD/$MOTHERBOARD"
 	OUTPUT_FOLDER="Hex-files/FW$FW-Build$BUILD/$MOTHERBOARD"
 	
 	
-	#Check if exacly the same hexfile already exsits
+	#Check if exactly the same hexfile already exists
 	if [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.hex"  &&  "$LANGUAGES" == "ALL" ]]; then
 	if [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.hex"  &&  "$LANGUAGES" == "ALL" ]]; then
 		echo ""
 		echo ""
 		ls -1 $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.hex | xargs -n1 basename
 		ls -1 $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.hex | xargs -n1 basename
-		echo "$(tput setaf 6)This hex file to be comiled already exsits! To cancle this process press CRTL+C and rename existing hex file.$(tput sgr 0)"
+		echo "$(tput setaf 6)This hex file to be compiled already exists! To cancel this process press CRTL+C and rename existing hex file.$(tput sgr 0)"
 		read -t 10 -p "Press Enter to continue..."
 		read -t 10 -p "Press Enter to continue..."
 	elif [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-EN_ONLY.hex"  &&  "$LANGUAGES" == "EN_ONLY" ]]; then
 	elif [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-EN_ONLY.hex"  &&  "$LANGUAGES" == "EN_ONLY" ]]; then
 		echo ""
 		echo ""
 		ls -1 $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-EN_ONLY.hex | xargs -n1 basename
 		ls -1 $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-EN_ONLY.hex | xargs -n1 basename
-		echo "$(tput setaf 6)This hex file to be comiled already exsits! To cancle this process press CRTL+C and rename existing hex file.$(tput sgr 0)"
+		echo "$(tput setaf 6)This hex file to be compiled already exists! To cancel this process press CRTL+C and rename existing hex file.$(tput sgr 0)"
 		read -t 10 -p "Press Enter to continue..."
 		read -t 10 -p "Press Enter to continue..."
 	fi
 	fi
 	if [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.zip"  &&  "$LANGUAGES" == "ALL" ]]; then
 	if [[ -f "$SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.zip"  &&  "$LANGUAGES" == "ALL" ]]; then
 		echo ""
 		echo ""
 		ls -1 $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.zip | xargs -n1 basename
 		ls -1 $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT.zip | xargs -n1 basename
-		echo "$(tput setaf 6)This zip file to be comiled already exsits! To cancle this process press CRTL+C and rename existing hex file.$(tput sgr 0)"
+		echo "$(tput setaf 6)This zip file to be compiled already exists! To cancel this process press CRTL+C and rename existing hex file.$(tput sgr 0)"
 		read -t 10 -p "Press Enter to continue..."
 		read -t 10 -p "Press Enter to continue..."
 	fi
 	fi
 	
 	
@@ -382,11 +382,11 @@ do
 	#Prepare english only or multilanguage version to be build
 	#Prepare english only or multilanguage version to be build
 	if [ $LANGUAGES == "ALL" ]; then
 	if [ $LANGUAGES == "ALL" ]; then
 		echo " "
 		echo " "
-		echo "Multi-language firmware will be build"
+		echo "Multi-language firmware will be built"
 		echo " "
 		echo " "
 	else
 	else
 		echo " "
 		echo " "
-		echo "English only language firmware will be build"
+		echo "English only language firmware will be built"
 		echo " "
 		echo " "
 	fi
 	fi
 		
 		
@@ -439,14 +439,14 @@ do
 
 
 	if [ $LANGUAGES ==  "ALL" ]; then
 	if [ $LANGUAGES ==  "ALL" ]; then
 		echo "$(tput setaf 2)"
 		echo "$(tput setaf 2)"
-		echo "Building mutli language firmware" $MULTI_LANGUAGE_CHECK
+		echo "Building multi language firmware" $MULTI_LANGUAGE_CHECK
 		echo "$(tput sgr 0)"
 		echo "$(tput sgr 0)"
 		sleep 2
 		sleep 2
 		cd $SCRIPT_PATH/lang
 		cd $SCRIPT_PATH/lang
 		echo "$(tput setaf 3)"
 		echo "$(tput setaf 3)"
 		./config.sh || exit 15
 		./config.sh || exit 15
 		echo "$(tput sgr 0)"
 		echo "$(tput sgr 0)"
-		# Check if privious languages and firmware build exist and if so clean them up
+		# Check if previous languages and firmware build exist and if so clean them up
 		if [ -f "lang_en.tmp" ]; then
 		if [ -f "lang_en.tmp" ]; then
 			echo ""
 			echo ""
 			echo "$(tput setaf 6)Previous lang build files already exist these will be cleaned up in 10 seconds.$(tput sgr 0)"
 			echo "$(tput setaf 6)Previous lang build files already exist these will be cleaned up in 10 seconds.$(tput sgr 0)"
@@ -469,7 +469,7 @@ do
 		# Combine compiled firmware with languages 
 		# Combine compiled firmware with languages 
 		./fw-build.sh || exit 17
 		./fw-build.sh || exit 17
 		echo "$(tput sgr 0)"
 		echo "$(tput sgr 0)"
-		# Check if the motherboard is an EINSY and if so the only one hex file will generated
+		# Check if the motherboard is an EINSY and if so only one hex file will generated
 		MOTHERBOARD=$(grep --max-count=1 "\bMOTHERBOARD\b" $SCRIPT_PATH/Firmware/variants/$VARIANT.h | sed -e's/  */ /g' |cut -d ' ' -f3)
 		MOTHERBOARD=$(grep --max-count=1 "\bMOTHERBOARD\b" $SCRIPT_PATH/Firmware/variants/$VARIANT.h | sed -e's/  */ /g' |cut -d ' ' -f3)
 		# If the motherboard is an EINSY just copy one hexfile
 		# If the motherboard is an EINSY just copy one hexfile
 		if [ "$MOTHERBOARD" = "BOARD_EINSY_1_0a" ]; then
 		if [ "$MOTHERBOARD" = "BOARD_EINSY_1_0a" ]; then

+ 24 - 0
README.md

@@ -8,6 +8,7 @@
      * [Using Git-bash](#using-git-bash-under-windows-10-64-bit)
      * [Using Git-bash](#using-git-bash-under-windows-10-64-bit)
    * [Automated tests](#3-automated-tests)
    * [Automated tests](#3-automated-tests)
    * [Documentation](#4-documentation)
    * [Documentation](#4-documentation)
+   * [FAQ](#5-faq)
 <!--te-->
 <!--te-->
 
 
 
 
@@ -52,6 +53,9 @@ _(after installation, the item is labeled as `"INSTALLED"` and can then be used
 add "-Wl,-u,vfprintf -lprintf_flt -lm" to "compiler.c.elf.flags=" before existing flag "-Wl,--gc-sections"  
 add "-Wl,-u,vfprintf -lprintf_flt -lm" to "compiler.c.elf.flags=" before existing flag "-Wl,--gc-sections"  
 example:  
 example:  
 `"compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections"`
 `"compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections"`
+The file can be found in Arduino instalation directory, or after Arduino has been updated at:  
+"C:\Users\(user)\AppData\Local\Arduino15\packages\arduino\hardware\avr\(version)"
+If you can locate the file in both places, file from user profile is probably used.
 
 
 #### 2. Source code compilation
 #### 2. Source code compilation
 
 
@@ -106,6 +110,9 @@ Now your Ubuntu subsystem is ready to use the automatic `PF-build.sh` script and
   - Example: You files are under `C:\Users\<your-username>\Downloads\Prusa-Firmware-MK3`
   - Example: You files are under `C:\Users\<your-username>\Downloads\Prusa-Firmware-MK3`
   - use under Ubuntu the following command `cd /mnt/c/Users/<your-username>/Downloads/Prusa-Firmware-MK3`
   - use under Ubuntu the following command `cd /mnt/c/Users/<your-username>/Downloads/Prusa-Firmware-MK3`
     to change to the right folder
     to change to the right folder
+- Unix and windows have different line endings (LF vs CRLF), try dos2unix to convert
+  - This should fix the `"$'\r': command not found"` error
+  - to install run `apt-get install dos2unix`
 
 
 #### Compile Prusa-firmware with Ubuntu Linux subsystem installed
 #### Compile Prusa-firmware with Ubuntu Linux subsystem installed
 - open Ubuntu bash
 - open Ubuntu bash
@@ -170,3 +177,20 @@ Example:
 
 
 # 4. Documentation
 # 4. Documentation
 run [doxygen](http://www.doxygen.nl/) in Firmware folder
 run [doxygen](http://www.doxygen.nl/) in Firmware folder
+
+# 5. FAQ
+Q:I built firmware using Arduino and I see "?" instead of numbers in printer user interface.
+
+A:Step 1.c was ommited or you updated Arduino and now platform.txt located somewhere in your user profile is used.
+
+Q:I built firmware using Arduino and printer now speaks Klingon (nonsense characters and symbols are displayed @^#$&*°;~ÿ)
+
+A:Step 2.c was omitted.
+
+Q:What environment does Prusa use to build the firmware in the first place?
+
+A:Our production builds are 99.9% equivalent to https://github.com/prusa3d/Prusa-Firmware#linux this is also easiest way to build as only one step is needed - run single script, which downloads patched Arduino from github, builds using it, then extracts translated strings and creates language variants (for MK2x) or language hex file for external SPI flash (MK3x). But you need Linux or Linux in virtual machine. This is also what happens when you open pull request to our repository - all variants are built by Travis http://travis-ci.org/ (to check for compilation errors). You can see, what is happening in .travis.yml. It would be also possible to get hex built by travis, only deploy step is missing in .travis.yml. You can get inspiration how to deploy hex by travis and how to setup travis in https://github.com/prusa3d/MM-control-01/ repository. Final hex is located in ./lang/firmware.hex Community reproduced this for Windows in https://github.com/prusa3d/Prusa-Firmware#using-linux-subsystem-under-windows-10-64-bit or https://github.com/prusa3d/Prusa-Firmware#using-git-bash-under-windows-10-64-bit .
+
+Q:Why are build instructions for Arduino mess.
+
+Y:We are too lazy to ship proper board definition for Arduino. We plan to swich to cmake + ninja to be inherently multiplatform, easily integrate build tools, suport more IDEs, get 10 times shorter build times and be able to update compiler whenewer we want.

+ 1 - 1
build.sh

@@ -31,7 +31,7 @@ if [ ! -f "$SCRIPT_PATH/Firmware/Configuration_prusa.h" ]; then
     cp $SCRIPT_PATH/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h $SCRIPT_PATH/Firmware/Configuration_prusa.h || exit 8
     cp $SCRIPT_PATH/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h $SCRIPT_PATH/Firmware/Configuration_prusa.h || exit 8
 fi
 fi
 
 
-$BUILD_ENV_PATH/arduino $SCRIPT_PATH/Firmware/Firmware.ino --verify --board rambo:avr:rambo --pref build.path=$BUILD_PATH || exit 9
+$BUILD_ENV_PATH/arduino $SCRIPT_PATH/Firmware/Firmware.ino --verify --board rambo:avr:rambo --pref build.path=$BUILD_PATH --pref compiler.warning_level=all || exit 9
 
 
 export ARDUINO=$BUILD_ENV_PATH
 export ARDUINO=$BUILD_ENV_PATH
 
 

+ 0 - 0
lang/config.sh


+ 6 - 6
lang/fw-build.sh

@@ -136,32 +136,32 @@ else
  if [ -e lang_cz.bin ]; then
  if [ -e lang_cz.bin ]; then
   echo -n " Czech  : " >&2
   echo -n " Czech  : " >&2
   ./update_lang.sh cz 2>./update_lang_cz.out 1>/dev/null
   ./update_lang.sh cz 2>./update_lang_cz.out 1>/dev/null
-  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; fi
+  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; finish 1; fi
  fi
  fi
  if [ -e lang_de.bin ]; then
  if [ -e lang_de.bin ]; then
   echo -n " German : " >&2
   echo -n " German : " >&2
   ./update_lang.sh de 2>./update_lang_de.out 1>/dev/null
   ./update_lang.sh de 2>./update_lang_de.out 1>/dev/null
-  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; fi
+  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; finish 1; fi
  fi
  fi
  if [ -e lang_it.bin ]; then
  if [ -e lang_it.bin ]; then
   echo -n " Italian: " >&2
   echo -n " Italian: " >&2
   ./update_lang.sh it 2>./update_lang_it.out 1>/dev/null
   ./update_lang.sh it 2>./update_lang_it.out 1>/dev/null
-  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; fi
+  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; finish 1; fi
  fi
  fi
  if [ -e lang_es.bin ]; then
  if [ -e lang_es.bin ]; then
   echo -n " Spanish: " >&2
   echo -n " Spanish: " >&2
   ./update_lang.sh es 2>./update_lang_es.out 1>/dev/null
   ./update_lang.sh es 2>./update_lang_es.out 1>/dev/null
-  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; fi
+  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; finish 1; fi
  fi
  fi
  if [ -e lang_fr.bin ]; then
  if [ -e lang_fr.bin ]; then
   echo -n " French : " >&2
   echo -n " French : " >&2
   ./update_lang.sh fr 2>./update_lang_fr.out 1>/dev/null
   ./update_lang.sh fr 2>./update_lang_fr.out 1>/dev/null
-  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; fi
+  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; finish 1; fi
  fi
  fi
  if [ -e lang_pl.bin ]; then
  if [ -e lang_pl.bin ]; then
   echo -n " Polish : " >&2
   echo -n " Polish : " >&2
   ./update_lang.sh pl 2>./update_lang_pl.out 1>/dev/null
   ./update_lang.sh pl 2>./update_lang_pl.out 1>/dev/null
-  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; fi
+  if [ $? -eq 0 ]; then echo 'OK' >&2; else echo 'NG!' >&2; finish 1; fi
  fi
  fi
 # echo "skipped" >&2
 # echo "skipped" >&2
 fi
 fi

+ 0 - 0
lang/fw-clean.sh


+ 0 - 0
lang/lang-add.sh


+ 2 - 0
lang/lang-build.sh

@@ -81,6 +81,8 @@ generate_binary()
  rm -f lang_$1.tmp
  rm -f lang_$1.tmp
  rm -f lang_$1.dat
  rm -f lang_$1.dat
  LNG=$1
  LNG=$1
+ #check lang dictionary
+ /usr/bin/env python lang-check.py $1
  #create lang_xx.tmp - different processing for 'en' language
  #create lang_xx.tmp - different processing for 'en' language
  if [ "$1" = "en" ]; then
  if [ "$1" = "en" ]; then
   #remove comments and empty lines
   #remove comments and empty lines

+ 75 - 0
lang/lang-check.py

@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+"""Check lang files."""
+from argparse import ArgumentParser
+from traceback import print_exc
+from sys import stderr
+
+
+def parse_txt(lang, no_warning):
+    """Parse txt file and check strings to display definition."""
+    if lang == "en":
+        file_path = "lang_en.txt"
+    else:
+        file_path = "lang_en_%s.txt" % lang
+
+    lines = 1
+    with open(file_path) as src:
+        while True:
+            comment = src.readline().split(' ')
+            src.readline()  # source
+            translation = src.readline()[:-1]
+
+            cols = None
+            rows = None
+            for item in comment[1:]:
+                key, val = item.split('=')
+                if key == 'c':
+                    cols = int(val)
+                elif key == 'r':
+                    rows = int(val)
+                else:
+                    raise RuntimeError(
+                        "Unknown display definition %s on line %d" %
+                        (' '.join(comment), lines))
+            if cols is None and rows is None:
+                if not no_warning:
+                    print("[W]: No display definition on line %d" % lines)
+                cols = len(translation)     # propably fullscreen
+            if rows is None:
+                rows = 1
+
+            if len(translation)-2 > cols*rows:
+                stderr.write(
+                    "[E]: Text %s is longer then definiton on line %d\n" %
+                    (translation, lines))
+                stderr.flush()
+
+            if len(src.readline()) != 1:  # empty line
+                break
+            lines += 4
+
+
+def main():
+    """Main function."""
+    parser = ArgumentParser(
+        description=__doc__,
+        usage="$(prog)s lang")
+    parser.add_argument(
+        "lang", nargs='?', default="en", type=str,
+        help="Check lang file (en|cs|de|es|fr|it|pl)")
+    parser.add_argument(
+        "--no-warning", action="store_true",
+        help="Disable warnings")
+
+    args = parser.parse_args()
+    try:
+        parse_txt(args.lang, args.no_warning)
+        return 0
+    except Exception as exc:
+        print_exc()
+        parser.error("%s" % exc)
+        return 1
+
+
+if __name__ == "__main__":
+    exit(main())

+ 0 - 0
lang/lang-check.sh


+ 0 - 0
lang/lang-clean.sh


+ 0 - 0
lang/lang-export.sh


+ 0 - 0
lang/lang-import.sh


+ 127 - 235
lang/lang_en.txt

@@ -1,10 +1,10 @@
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
+#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
 " of 4"
 " of 4"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14
 " of 9"
 " of 9"
 
 
-#MSG_MEASURED_OFFSET c=0 r=0
+#MSG_MEASURED_OFFSET
 "[0;0] point offset"
 "[0;0] point offset"
 
 
 #MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 #MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
@@ -16,10 +16,10 @@
 #
 #
 ">Cancel"
 ">Cancel"
 
 
-#MSG_BABYSTEPPING_Z c=20 r=0
-"Adjusting Z"
+#MSG_BABYSTEPPING_Z c=15
+"Adjusting Z:"
 
 
-#MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
+#MSG_SELFTEST_CHECK_ALLCORRECT c=20
 "All correct      "
 "All correct      "
 
 
 #MSG_WIZARD_DONE c=20 r=8
 #MSG_WIZARD_DONE c=20 r=8
@@ -28,7 +28,7 @@
 #
 #
 "Ambient"
 "Ambient"
 
 
-#MSG_PRESS c=20 r=0
+#MSG_PRESS c=20
 "and press the knob"
 "and press the knob"
 
 
 #MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
 #MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
@@ -40,13 +40,13 @@
 #
 #
 "SpoolJoin   [N/A]"
 "SpoolJoin   [N/A]"
 
 
-# MSG_AUTO_DEPLETE_OFF c=17 r=1
+#MSG_AUTO_DEPLETE_OFF c=17 r=1
 "SpoolJoin   [off]"
 "SpoolJoin   [off]"
 
 
-#MSG_AUTO_HOME c=0 r=0
+#MSG_AUTO_HOME
 "Auto home"
 "Auto home"
 
 
-#MSG_AUTOLOAD_FILAMENT c=17 r=0
+#MSG_AUTOLOAD_FILAMENT c=17
 "AutoLoad filament"
 "AutoLoad filament"
 
 
 #MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
 #MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
@@ -55,34 +55,28 @@
 #MSG_AUTOLOADING_ENABLED c=20 r=4
 #MSG_AUTOLOADING_ENABLED c=20 r=4
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 
 
-#MSG_SELFTEST_AXIS_LENGTH c=0 r=0
+#MSG_SELFTEST_AXIS_LENGTH
 "Axis length"
 "Axis length"
 
 
-#MSG_SELFTEST_AXIS c=0 r=0
+#MSG_SELFTEST_AXIS
 "Axis"
 "Axis"
 
 
-#MSG_SELFTEST_BEDHEATER c=0 r=0
+#MSG_SELFTEST_BEDHEATER
 "Bed / Heater"
 "Bed / Heater"
 
 
-#MSG_BED_DONE c=0 r=0
+#MSG_BED_DONE
 "Bed done"
 "Bed done"
 
 
-#MSG_BED_HEATING c=0 r=0
+#MSG_BED_HEATING
 "Bed Heating"
 "Bed Heating"
 
 
-#MSG_BED_CORRECTION_MENU c=0 r=0
+#MSG_BED_CORRECTION_MENU
 "Bed level correct"
 "Bed level correct"
 
 
 #MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=4
 #MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=4
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 
 
-#MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED c=20 r=4
-"Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset."
-
-#MSG_BED_LEVELING_FAILED_POINT_HIGH c=20 r=4
-"Bed leveling failed. Sensor triggered too high. Waiting for reset."
-
-#MSG_BED c=0 r=0
+#MSG_BED
 "Bed"
 "Bed"
 
 
 #MSG_MENU_BELT_STATUS c=15 r=1
 #MSG_MENU_BELT_STATUS c=15 r=1
@@ -94,10 +88,10 @@
 #
 #
 "Calibrating home"
 "Calibrating home"
 
 
-#MSG_CALIBRATE_BED c=0 r=0
+#MSG_CALIBRATE_BED
 "Calibrate XYZ"
 "Calibrate XYZ"
 
 
-#MSG_HOMEYZ c=0 r=0
+#MSG_HOMEYZ
 "Calibrate Z"
 "Calibrate Z"
 
 
 #MSG_CALIBRATE_PINDA c=17 r=1
 #MSG_CALIBRATE_PINDA c=17 r=1
@@ -112,37 +106,34 @@
 #MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 
 
-#MSG_HOMEYZ_DONE c=0 r=0
+#MSG_HOMEYZ_DONE
 "Calibration done"
 "Calibration done"
 
 
-#MSG_MENU_CALIBRATION c=0 r=0
+#MSG_MENU_CALIBRATION
 "Calibration"
 "Calibration"
 
 
 #
 #
 "Cancel"
 "Cancel"
 
 
-#MSG_SD_INSERTED c=0 r=0
-"Card inserted"
-
-#MSG_SD_REMOVED c=0 r=0
+#MSG_SD_REMOVED
 "Card removed"
 "Card removed"
 
 
-#MSG_NOT_COLOR c=0 r=0
+#MSG_NOT_COLOR
 "Color not correct"
 "Color not correct"
 
 
-#MSG_COOLDOWN c=0 r=0
+#MSG_COOLDOWN
 "Cooldown"
 "Cooldown"
 
 
 #
 #
 "Copy selected language?"
 "Copy selected language?"
 
 
-#MSG_CRASHDETECT_ON c=0 r=0
+#MSG_CRASHDETECT_ON
 "Crash det.   [on]"
 "Crash det.   [on]"
 
 
-#MSG_CRASHDETECT_NA c=0 r=0
+#MSG_CRASHDETECT_NA
 "Crash det.  [N/A]"
 "Crash det.  [N/A]"
 
 
-#MSG_CRASHDETECT_OFF c=0 r=0
+#MSG_CRASHDETECT_OFF
 "Crash det.  [off]"
 "Crash det.  [off]"
 
 
 #MSG_CRASH_DETECTED c=20 r=1
 #MSG_CRASH_DETECTED c=20 r=1
@@ -160,7 +151,7 @@
 #MSG_DATE c=17 r=1
 #MSG_DATE c=17 r=1
 "Date:"
 "Date:"
 
 
-#MSG_DISABLE_STEPPERS c=0 r=0
+#MSG_DISABLE_STEPPERS
 "Disable steppers"
 "Disable steppers"
 
 
 #MSG_BABYSTEP_Z_NOT_SET c=20 r=12
 #MSG_BABYSTEP_Z_NOT_SET c=20 r=12
@@ -169,27 +160,12 @@
 #MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 
 
-#MSG_EXTRUDER_CORRECTION c=9 r=0
-"E-correct"
+#MSG_EXTRUDER_CORRECTION c=10
+"E-correct:"
 
 
 #MSG_EJECT_FILAMENT c=17 r=1
 #MSG_EJECT_FILAMENT c=17 r=1
 "Eject filament"
 "Eject filament"
 
 
-#MSG_EJECT_FILAMENT1 c=17 r=1
-"Eject filament 1"
-
-#MSG_EJECT_FILAMENT2 c=17 r=1
-"Eject filament 2"
-
-#MSG_EJECT_FILAMENT3 c=17 r=1
-"Eject filament 3"
-
-#MSG_EJECT_FILAMENT4 c=17 r=1
-"Eject filament 4"
-
-#MSG_EJECT_FILAMENT5 c=17 r=1
-"Eject filament 5"
-
 #
 #
 "Eject"
 "Eject"
 
 
@@ -199,10 +175,10 @@
 #MSG_SELFTEST_ENDSTOP_NOTHIT c=20 r=1
 #MSG_SELFTEST_ENDSTOP_NOTHIT c=20 r=1
 "Endstop not hit"
 "Endstop not hit"
 
 
-#MSG_SELFTEST_ENDSTOP c=0 r=0
+#MSG_SELFTEST_ENDSTOP
 "Endstop"
 "Endstop"
 
 
-#MSG_SELFTEST_ENDSTOPS c=0 r=0
+#MSG_SELFTEST_ENDSTOPS
 "Endstops"
 "Endstops"
 
 
 #MSG_STACK_ERROR c=20 r=4
 #MSG_STACK_ERROR c=20 r=4
@@ -211,31 +187,16 @@
 #MSG_FSENS_NOT_RESPONDING c=20 r=4
 #MSG_FSENS_NOT_RESPONDING c=20 r=4
 "ERROR: Filament sensor is not responding, please check connection."
 "ERROR: Filament sensor is not responding, please check connection."
 
 
-#MSG_ERROR c=0 r=0
+#MSG_ERROR
 "ERROR:"
 "ERROR:"
 
 
-#
-"External SPI flash W25X20CL not responding."
-
-#
-"Extruder 1"
-
-#
-"Extruder 2"
-
-#
-"Extruder 3"
-
-#
-"Extruder 4"
-
-#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 "Extruder fan:"
 "Extruder fan:"
 
 
 #MSG_INFO_EXTRUDER c=15 r=1
 #MSG_INFO_EXTRUDER c=15 r=1
 "Extruder info"
 "Extruder info"
 
 
-#MSG_MOVE_E c=0 r=0
+#MSG_MOVE_E
 "Extruder"
 "Extruder"
 
 
 #
 #
@@ -253,10 +214,10 @@
 #
 #
 "Fail stats"
 "Fail stats"
 
 
-#MSG_FAN_SPEED c=14 r=0
+#MSG_FAN_SPEED c=14
 "Fan speed"
 "Fan speed"
 
 
-#MSG_SELFTEST_FAN c=20 r=0
+#MSG_SELFTEST_FAN c=20
 "Fan test"
 "Fan test"
 
 
 #MSG_FANS_CHECK_ON c=17 r=1
 #MSG_FANS_CHECK_ON c=17 r=1
@@ -265,16 +226,13 @@
 #MSG_FANS_CHECK_OFF c=17 r=1
 #MSG_FANS_CHECK_OFF c=17 r=1
 "Fans check  [off]"
 "Fans check  [off]"
 
 
-#MSG_FSENSOR_ON c=0 r=0
+#MSG_FSENSOR_ON
 "Fil. sensor  [on]"
 "Fil. sensor  [on]"
 
 
-#MSG_RESPONSE_POOR c=20 r=2
-"Fil. sensor response is poor, disable it?"
-
-#MSG_FSENSOR_NA c=0 r=0
+#MSG_FSENSOR_NA
 "Fil. sensor [N/A]"
 "Fil. sensor [N/A]"
 
 
-#MSG_FSENSOR_OFF c=0 r=0
+#MSG_FSENSOR_OFF
 "Fil. sensor [off]"
 "Fil. sensor [off]"
 
 
 #
 #
@@ -283,15 +241,12 @@
 #MSG_FILAMENT_CLEAN c=20 r=2
 #MSG_FILAMENT_CLEAN c=20 r=2
 "Filament extruding & with correct color?"
 "Filament extruding & with correct color?"
 
 
-#MSG_NOT_LOADED c=19 r=0
+#MSG_NOT_LOADED c=19
 "Filament not loaded"
 "Filament not loaded"
 
 
-#MSG_FILAMENT_SENSOR c=20 r=0
+#MSG_FILAMENT_SENSOR c=20
 "Filament sensor"
 "Filament sensor"
 
 
-#MSG_SELFTEST_FILAMENT_SENSOR c=18 r=0
-"Filament sensor:"
-
 #MSG_FILAMENT_USED c=19 r=1
 #MSG_FILAMENT_USED c=19 r=1
 "Filament used"
 "Filament used"
 
 
@@ -313,70 +268,67 @@
 #
 #
 "Fix the issue and then press button on MMU unit."
 "Fix the issue and then press button on MMU unit."
 
 
-#MSG_FLOW c=0 r=0
+#MSG_FLOW
 "Flow"
 "Flow"
 
 
-#MSG_PRUSA3D_FORUM c=0 r=0
+#MSG_PRUSA3D_FORUM
 "forum.prusa3d.com"
 "forum.prusa3d.com"
 
 
-#MSG_SELFTEST_COOLING_FAN c=20 r=0
+#MSG_SELFTEST_COOLING_FAN c=20
 "Front print fan?"
 "Front print fan?"
 
 
 #MSG_BED_CORRECTION_FRONT c=14 r=1
 #MSG_BED_CORRECTION_FRONT c=14 r=1
 "Front side[um]"
 "Front side[um]"
 
 
-#MSG_SELFTEST_FANS c=0 r=0
+#MSG_SELFTEST_FANS
 "Front/left fans"
 "Front/left fans"
 
 
-#MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
+#MSG_SELFTEST_HEATERTHERMISTOR
 "Heater/Thermistor"
 "Heater/Thermistor"
 
 
-#MSG_BED_HEATING_SAFETY_DISABLED c=0 r=0
+#MSG_BED_HEATING_SAFETY_DISABLED
 "Heating disabled by safety timer."
 "Heating disabled by safety timer."
 
 
-#MSG_HEATING_COMPLETE c=20 r=0
+#MSG_HEATING_COMPLETE c=20
 "Heating done."
 "Heating done."
 
 
-#MSG_HEATING c=0 r=0
+#MSG_HEATING
 "Heating"
 "Heating"
 
 
 #MSG_WIZARD_WELCOME c=20 r=7
 #MSG_WIZARD_WELCOME c=20 r=7
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 
 
-#MSG_PRUSA3D_HOWTO c=0 r=0
+#MSG_PRUSA3D_HOWTO
 "howto.prusa3d.com"
 "howto.prusa3d.com"
 
 
-#
-"Change extruder"
-
-#MSG_FILAMENTCHANGE c=0 r=0
+#MSG_FILAMENTCHANGE
 "Change filament"
 "Change filament"
 
 
-#MSG_CHANGE_SUCCESS c=0 r=0
+#MSG_CHANGE_SUCCESS
 "Change success!"
 "Change success!"
 
 
-#MSG_CORRECTLY c=20 r=0
+#MSG_CORRECTLY c=20
 "Changed correctly?"
 "Changed correctly?"
 
 
-#MSG_SELFTEST_CHECK_BED c=20 r=0
+#MSG_SELFTEST_CHECK_BED c=20
 "Checking bed     "
 "Checking bed     "
 
 
-#MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
+#MSG_SELFTEST_CHECK_ENDSTOPS c=20
 "Checking endstops"
 "Checking endstops"
 
 
-#MSG_SELFTEST_CHECK_HOTEND c=20 r=0
+#MSG_SELFTEST_CHECK_HOTEND c=20
 "Checking hotend  "
 "Checking hotend  "
 
 
-#MSG_SELFTEST_CHECK_FSENSOR c=20 r=0
+#MSG_SELFTEST_CHECK_FSENSOR c=20
 "Checking sensors "
 "Checking sensors "
 
 
-#MSG_SELFTEST_CHECK_X c=20 r=0
+#MSG_SELFTEST_CHECK_X c=20
 "Checking X axis  "
 "Checking X axis  "
 
 
-#MSG_SELFTEST_CHECK_Y c=20 r=0
+#MSG_SELFTEST_CHECK_Y c=20
 "Checking Y axis  "
 "Checking Y axis  "
 
 
-#MSG_SELFTEST_CHECK_Z c=20 r=0
+#MSG_SELFTEST_CHECK_Z c=20
 "Checking Z axis  "
 "Checking Z axis  "
 
 
 #MSG_CHOOSE_EXTRUDER c=20 r=1
 #MSG_CHOOSE_EXTRUDER c=20 r=1
@@ -397,28 +349,13 @@
 #MSG_WIZARD_V2_CAL_2 c=20 r=12
 #MSG_WIZARD_V2_CAL_2 c=20 r=12
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 
 
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
-"Improving bed calibration point"
-
-#MSG_WATCH c=0 r=0
+#MSG_WATCH
 "Info screen"
 "Info screen"
 
 
-#MSG_FILAMENT_LOADING_T0 c=20 r=4
-"Insert filament into extruder 1. Click when done."
-
-#MSG_FILAMENT_LOADING_T1 c=20 r=4
-"Insert filament into extruder 2. Click when done."
-
-#MSG_FILAMENT_LOADING_T2 c=20 r=4
-"Insert filament into extruder 3. Click when done."
-
-#MSG_FILAMENT_LOADING_T3 c=20 r=4
-"Insert filament into extruder 4. Click when done."
-
 #
 #
 "Is filament 1 loaded?"
 "Is filament 1 loaded?"
 
 
-#MSG_INSERT_FILAMENT c=20 r=0
+#MSG_INSERT_FILAMENT c=20
 "Insert filament"
 "Insert filament"
 
 
 #MSG_WIZARD_FILAMENT_LOADED c=20 r=2
 #MSG_WIZARD_FILAMENT_LOADED c=20 r=2
@@ -433,16 +370,13 @@
 #MSG_STEEL_SHEET_CHECK c=20 r=2
 #MSG_STEEL_SHEET_CHECK c=20 r=2
 "Is steel sheet on heatbed?"
 "Is steel sheet on heatbed?"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
-"Iteration "
-
 #
 #
 "Last print failures"
 "Last print failures"
 
 
 #
 #
 "Last print"
 "Last print"
 
 
-#MSG_SELFTEST_EXTRUDER_FAN c=20 r=0
+#MSG_SELFTEST_EXTRUDER_FAN c=20
 "Left hotend fan?"
 "Left hotend fan?"
 
 
 #
 #
@@ -454,16 +388,16 @@
 #
 #
 "Lin. correction"
 "Lin. correction"
 
 
-#MSG_BABYSTEP_Z c=0 r=0
+#MSG_BABYSTEP_Z
 "Live adjust Z"
 "Live adjust Z"
 
 
-#MSG_LOAD_FILAMENT c=17 r=0
+#MSG_LOAD_FILAMENT c=17
 "Load filament"
 "Load filament"
 
 
-#MSG_LOADING_COLOR c=0 r=0
+#MSG_LOADING_COLOR
 "Loading color"
 "Loading color"
 
 
-#MSG_LOADING_FILAMENT c=20 r=0
+#MSG_LOADING_FILAMENT c=20
 "Loading filament"
 "Loading filament"
 
 
 #MSG_LOOSE_PULLEY c=20 r=1
 #MSG_LOOSE_PULLEY c=20 r=1
@@ -475,13 +409,13 @@
 #MSG_M117_V2_CALIBRATION c=25 r=1
 #MSG_M117_V2_CALIBRATION c=25 r=1
 "M117 First layer cal."
 "M117 First layer cal."
 
 
-#MSG_MAIN c=0 r=0
+#MSG_MAIN
 "Main"
 "Main"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60
 "Measuring reference height of calibration point"
 "Measuring reference height of calibration point"
 
 
-#MSG_MESH_BED_LEVELING c=0 r=0
+#MSG_MESH_BED_LEVELING
 "Mesh Bed Leveling"
 "Mesh Bed Leveling"
 
 
 #MSG_MMU_OK_RESUMING_POSITION c=20 r=4
 #MSG_MMU_OK_RESUMING_POSITION c=20 r=4
@@ -505,10 +439,10 @@
 #MSG_MMU_OK_RESUMING c=20 r=4
 #MSG_MMU_OK_RESUMING c=20 r=4
 "MMU OK. Resuming..."
 "MMU OK. Resuming..."
 
 
-#MSG_STEALTH_MODE_OFF c=0 r=0
+#MSG_STEALTH_MODE_OFF
 "Mode     [Normal]"
 "Mode     [Normal]"
 
 
-#MSG_SILENT_MODE_ON c=0 r=0
+#MSG_SILENT_MODE_ON
 "Mode     [silent]"
 "Mode     [silent]"
 
 
 #
 #
@@ -517,55 +451,52 @@
 #
 #
 "MMU power fails"
 "MMU power fails"
 
 
-#MSG_STEALTH_MODE_ON c=0 r=0
+#MSG_STEALTH_MODE_ON
 "Mode    [Stealth]"
 "Mode    [Stealth]"
 
 
-#MSG_AUTO_MODE_ON c=0 r=0
+#MSG_AUTO_MODE_ON
 "Mode [auto power]"
 "Mode [auto power]"
 
 
-#MSG_SILENT_MODE_OFF c=0 r=0
+#MSG_SILENT_MODE_OFF
 "Mode [high power]"
 "Mode [high power]"
 
 
 #
 #
 "MMU2 connected"
 "MMU2 connected"
 
 
-#MSG_SELFTEST_MOTOR c=0 r=0
+#MSG_SELFTEST_MOTOR
 "Motor"
 "Motor"
 
 
-#MSG_MOVE_AXIS c=0 r=0
+#MSG_MOVE_AXIS
 "Move axis"
 "Move axis"
 
 
-#MSG_MOVE_X c=0 r=0
+#MSG_MOVE_X
 "Move X"
 "Move X"
 
 
-#MSG_MOVE_Y c=0 r=0
+#MSG_MOVE_Y
 "Move Y"
 "Move Y"
 
 
-#MSG_MOVE_Z c=0 r=0
+#MSG_MOVE_Z
 "Move Z"
 "Move Z"
 
 
-#MSG_NO_MOVE c=0 r=0
+#MSG_NO_MOVE
 "No move."
 "No move."
 
 
-#MSG_NO_CARD c=0 r=0
+#MSG_NO_CARD
 "No SD card"
 "No SD card"
 
 
 #
 #
 "N/A"
 "N/A"
 
 
-#MSG_NO c=0 r=0
+#MSG_NO
 "No"
 "No"
 
 
-#MSG_SELFTEST_NOTCONNECTED c=0 r=0
+#MSG_SELFTEST_NOTCONNECTED
 "Not connected"
 "Not connected"
 
 
 #
 #
 "New firmware version available:"
 "New firmware version available:"
 
 
-#
-"No "
-
-#MSG_SELFTEST_FAN_NO c=19 r=0
+#MSG_SELFTEST_FAN_NO c=19
 "Not spinning"
 "Not spinning"
 
 
 #MSG_WIZARD_V2_CAL c=20 r=8
 #MSG_WIZARD_V2_CAL c=20 r=8
@@ -574,7 +505,7 @@
 #MSG_WIZARD_WILL_PREHEAT c=20 r=4
 #MSG_WIZARD_WILL_PREHEAT c=20 r=4
 "Now I will preheat nozzle for PLA."
 "Now I will preheat nozzle for PLA."
 
 
-#MSG_NOZZLE c=0 r=0
+#MSG_NOZZLE
 "Nozzle"
 "Nozzle"
 
 
 #MSG_DEFAULT_SETTINGS_LOADED c=20 r=4
 #MSG_DEFAULT_SETTINGS_LOADED c=20 r=4
@@ -586,7 +517,7 @@
 #
 #
 "Nozzle FAN"
 "Nozzle FAN"
 
 
-#MSG_PAUSE_PRINT c=0 r=0
+#MSG_PAUSE_PRINT
 "Pause print"
 "Pause print"
 
 
 #MSG_PID_RUNNING c=20 r=1
 #MSG_PID_RUNNING c=20 r=1
@@ -610,7 +541,7 @@
 #MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 "Please clean the nozzle for calibration. Click when done."
 "Please clean the nozzle for calibration. Click when done."
 
 
-#MSG_SELFTEST_PLEASECHECK c=0 r=0
+#MSG_SELFTEST_PLEASECHECK
 "Please check :"
 "Please check :"
 
 
 #MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
@@ -649,16 +580,16 @@
 #MSG_UPDATE_MMU2_FW c=20 r=4
 #MSG_UPDATE_MMU2_FW c=20 r=4
 "Please update firmware in your MMU2. Waiting for reset."
 "Please update firmware in your MMU2. Waiting for reset."
 
 
-#MSG_PLEASE_WAIT c=20 r=0
+#MSG_PLEASE_WAIT c=20
 "Please wait"
 "Please wait"
 
 
 #
 #
 "Please remove shipping helpers first."
 "Please remove shipping helpers first."
 
 
-#MSG_PREHEAT_NOZZLE c=20 r=0
+#MSG_PREHEAT_NOZZLE c=20
 "Preheat the nozzle!"
 "Preheat the nozzle!"
 
 
-#MSG_PREHEAT c=0 r=0
+#MSG_PREHEAT
 "Preheat"
 "Preheat"
 
 
 #MSG_WIZARD_HEATING c=20 r=3
 #MSG_WIZARD_HEATING c=20 r=3
@@ -673,7 +604,7 @@
 #
 #
 "Power failures"
 "Power failures"
 
 
-#MSG_PRINT_ABORTED c=20 r=0
+#MSG_PRINT_ABORTED c=20
 "Print aborted"
 "Print aborted"
 
 
 #
 #
@@ -682,10 +613,10 @@
 #
 #
 "Preheating to unload"
 "Preheating to unload"
 
 
-#MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_PRINT_FAN_SPEED c=18
 "Print fan:"
 "Print fan:"
 
 
-#MSG_CARD_MENU c=0 r=0
+#MSG_CARD_MENU
 "Print from SD"
 "Print from SD"
 
 
 #
 #
@@ -703,13 +634,7 @@
 #
 #
 "Print FAN"
 "Print FAN"
 
 
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK2.5 ready."
-
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK3 ready."
-
-#MSG_PRUSA3D c=0 r=0
+#MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
 
 
 #MSG_BED_CORRECTION_REAR c=14 r=1
 #MSG_BED_CORRECTION_REAR c=14 r=1
@@ -724,16 +649,13 @@
 #
 #
 "Prusa i3 MK3S OK."
 "Prusa i3 MK3S OK."
 
 
-#
-"Prusa i3 MK2 ready."
-
-#MSG_CALIBRATE_BED_RESET c=0 r=0
+#MSG_CALIBRATE_BED_RESET
 "Reset XYZ calibr."
 "Reset XYZ calibr."
 
 
-#MSG_BED_CORRECTION_RESET c=0 r=0
+#MSG_BED_CORRECTION_RESET
 "Reset"
 "Reset"
 
 
-#MSG_RESUME_PRINT c=0 r=0
+#MSG_RESUME_PRINT
 "Resume print"
 "Resume print"
 
 
 #MSG_RESUMING_PRINT c=20 r=1
 #MSG_RESUMING_PRINT c=20 r=1
@@ -760,25 +682,25 @@
 #
 #
 "Right"
 "Right"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
+#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60
 "Searching bed calibration point"
 "Searching bed calibration point"
 
 
-#MSG_LANGUAGE_SELECT c=0 r=0
+#MSG_LANGUAGE_SELECT
 "Select language"
 "Select language"
 
 
-#MSG_SELFTEST_OK c=0 r=0
+#MSG_SELFTEST_OK
 "Self test OK"
 "Self test OK"
 
 
-#MSG_SELFTEST_START c=20 r=0
+#MSG_SELFTEST_START c=20
 "Self test start  "
 "Self test start  "
 
 
-#MSG_SELFTEST c=0 r=0
+#MSG_SELFTEST
 "Selftest         "
 "Selftest         "
 
 
-#MSG_SELFTEST_ERROR c=0 r=0
+#MSG_SELFTEST_ERROR
 "Selftest error !"
 "Selftest error !"
 
 
-#MSG_SELFTEST_FAILED c=20 r=0
+#MSG_SELFTEST_FAILED c=20
 "Selftest failed  "
 "Selftest failed  "
 
 
 #MSG_FORCE_SELFTEST c=20 r=8
 #MSG_FORCE_SELFTEST c=20 r=8
@@ -793,7 +715,7 @@
 #MSG_SET_TEMPERATURE c=19 r=1
 #MSG_SET_TEMPERATURE c=19 r=1
 "Set temperature:"
 "Set temperature:"
 
 
-#MSG_SETTINGS c=0 r=0
+#MSG_SETTINGS
 "Settings"
 "Settings"
 
 
 #MSG_SHOW_END_STOPS c=17 r=1
 #MSG_SHOW_END_STOPS c=17 r=1
@@ -802,26 +724,20 @@
 #
 #
 "Sensor state"
 "Sensor state"
 
 
-#
-"Sensors info"
-
-#
-"Show pinda state"
-
 #MSG_FILE_CNT c=20 r=4
 #MSG_FILE_CNT c=20 r=4
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 
 
 #MSG_SORT_NONE c=17 r=1
 #MSG_SORT_NONE c=17 r=1
-"Sort:      [none]"
+"Sort       [none]"
 
 
 #MSG_SORT_TIME c=17 r=1
 #MSG_SORT_TIME c=17 r=1
-"Sort:      [time]"
+"Sort       [time]"
 
 
 #
 #
 "Severe skew"
 "Severe skew"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
-"Sort:  [alphabet]"
+"Sort   [alphabet]"
 
 
 #MSG_SORTING c=20 r=1
 #MSG_SORTING c=20 r=1
 "Sorting files"
 "Sorting files"
@@ -844,28 +760,28 @@
 #MSG_SOUND_SILENT c=17 r=1
 #MSG_SOUND_SILENT c=17 r=1
 "Sound    [silent]"
 "Sound    [silent]"
 
 
-#MSG_SPEED c=0 r=0
+#MSG_SPEED
 "Speed"
 "Speed"
 
 
-#MSG_SELFTEST_FAN_YES c=19 r=0
+#MSG_SELFTEST_FAN_YES c=19
 "Spinning"
 "Spinning"
 
 
 #MSG_TEMP_CAL_WARNING c=20 r=4
 #MSG_TEMP_CAL_WARNING c=20 r=4
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 
 
-#MSG_STATISTICS c=0 r=0
+#MSG_STATISTICS
 "Statistics  "
 "Statistics  "
 
 
-#MSG_STOP_PRINT c=0 r=0
+#MSG_STOP_PRINT
 "Stop print"
 "Stop print"
 
 
-#MSG_STOPPED c=0 r=0
+#MSG_STOPPED
 "STOPPED. "
 "STOPPED. "
 
 
-#MSG_SUPPORT c=0 r=0
+#MSG_SUPPORT
 "Support"
 "Support"
 
 
-#MSG_SELFTEST_SWAPPED c=0 r=0
+#MSG_SELFTEST_SWAPPED
 "Swapped"
 "Swapped"
 
 
 #MSG_TEMP_CALIBRATION c=20 r=1
 #MSG_TEMP_CALIBRATION c=20 r=1
@@ -886,7 +802,7 @@
 #MSG_TEMP_CALIBRATION_DONE c=20 r=12
 #MSG_TEMP_CALIBRATION_DONE c=20 r=12
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 
 
-#MSG_TEMPERATURE c=0 r=0
+#MSG_TEMPERATURE
 "Temperature"
 "Temperature"
 
 
 #MSG_MENU_TEMPERATURES c=15 r=1
 #MSG_MENU_TEMPERATURES c=15 r=1
@@ -901,15 +817,12 @@
 #
 #
 "Total print time"
 "Total print time"
 
 
-#MSG_TUNE c=0 r=0
+#MSG_TUNE
 "Tune"
 "Tune"
 
 
 #
 #
 "Unload"
 "Unload"
 
 
-#
-"Unload all"
-
 #
 #
 "Total failures"
 "Total failures"
 
 
@@ -919,7 +832,7 @@
 #
 #
 "to unload filament"
 "to unload filament"
 
 
-#MSG_UNLOAD_FILAMENT c=17 r=0
+#MSG_UNLOAD_FILAMENT c=17
 "Unload filament"
 "Unload filament"
 
 
 #MSG_UNLOADING_FILAMENT c=20 r=1
 #MSG_UNLOADING_FILAMENT c=20 r=1
@@ -937,7 +850,7 @@
 #
 #
 "unknown"
 "unknown"
 
 
-#MSG_USERWAIT c=0 r=0
+#MSG_USERWAIT
 "Wait for user..."
 "Wait for user..."
 
 
 #MSG_WAITING_TEMP c=20 r=3
 #MSG_WAITING_TEMP c=20 r=3
@@ -961,7 +874,7 @@
 #MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #MSG_UNLOAD_SUCCESSFUL c=20 r=2
 "Was filament unload successful?"
 "Was filament unload successful?"
 
 
-#MSG_SELFTEST_WIRINGERROR c=0 r=0
+#MSG_SELFTEST_WIRINGERROR
 "Wiring error"
 "Wiring error"
 
 
 #MSG_WIZARD c=17 r=1
 #MSG_WIZARD c=17 r=1
@@ -973,7 +886,7 @@
 #MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED c=20 r=8
 "XYZ calibration failed. Please consult the manual."
 "XYZ calibration failed. Please consult the manual."
 
 
-#MSG_YES c=0 r=0
+#MSG_YES
 "Yes"
 "Yes"
 
 
 #MSG_WIZARD_QUIT c=20 r=8
 #MSG_WIZARD_QUIT c=20 r=8
@@ -986,7 +899,7 @@
 "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 
 
 #
 #
-"X-correct"
+"X-correct:"
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
@@ -997,44 +910,23 @@
 #MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 
 
-#MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-"XYZ calibration compromised. Left front calibration point not reachable."
-
-#MSG_LOAD_ALL c=17 r=0
+#MSG_LOAD_ALL c=17
 "Load all"
 "Load all"
 
 
-#MSG_LOAD_FILAMENT_1 c=17 r=0
-"Load filament 1"
-
 #
 #
 "XYZ calibration failed. Bed calibration point was not found."
 "XYZ calibration failed. Bed calibration point was not found."
 
 
 #
 #
 "XYZ calibration failed. Front calibration points not reachable."
 "XYZ calibration failed. Front calibration points not reachable."
 
 
-#
-"XYZ calibration failed. Left front calibration point not reachable."
-
-#MSG_LOAD_FILAMENT_2 c=17 r=0
-"Load filament 2"
-
 #
 #
 "XYZ calibration failed. Right front calibration point not reachable."
 "XYZ calibration failed. Right front calibration point not reachable."
 
 
-#MSG_LOAD_FILAMENT_3 c=17 r=0
-"Load filament 3"
-
 #
 #
 "Y distance from min"
 "Y distance from min"
 
 
 #
 #
-"Y-correct"
-
-#MSG_LOAD_FILAMENT_4 c=17 r=0
-"Load filament 4"
-
-#MSG_LOAD_FILAMENT_5 c=17 r=0
-"Load filament 5"
+"Y-correct:"
 
 
-#MSG_OFF c=0 r=0
+#MSG_OFF
 " [off]"
 " [off]"

+ 132 - 276
lang/lang_en_cz.txt

@@ -1,12 +1,12 @@
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
+#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
 " of 4"
 " of 4"
 " z 4"
 " z 4"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14
 " of 9"
 " of 9"
 " z 9"
 " z 9"
 
 
-#MSG_MEASURED_OFFSET c=0 r=0
+#MSG_MEASURED_OFFSET
 "[0;0] point offset"
 "[0;0] point offset"
 "[0;0] odsazeni bodu"
 "[0;0] odsazeni bodu"
 
 
@@ -22,11 +22,11 @@
 ">Cancel"
 ">Cancel"
 ">Zrusit"
 ">Zrusit"
 
 
-#MSG_BABYSTEPPING_Z c=20 r=0
-"Adjusting Z"
-"Dostavovani Z"
+#MSG_BABYSTEPPING_Z c=15
+"Adjusting Z:"
+"Dostavovani Z:"
 
 
-#MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
+#MSG_SELFTEST_CHECK_ALLCORRECT c=20
 "All correct      "
 "All correct      "
 "Vse OK "
 "Vse OK "
 
 
@@ -38,7 +38,7 @@
 "Ambient"
 "Ambient"
 "Okoli"
 "Okoli"
 
 
-#MSG_PRESS c=20 r=0
+#MSG_PRESS c=20
 "and press the knob"
 "and press the knob"
 "a stisknete tlacitko"
 "a stisknete tlacitko"
 
 
@@ -54,15 +54,15 @@
 "SpoolJoin   [N/A]"
 "SpoolJoin   [N/A]"
 "\x00"
 "\x00"
 
 
-# MSG_AUTO_DEPLETE_OFF c=17 r=1
+#MSG_AUTO_DEPLETE_OFF c=17 r=1
 "SpoolJoin   [off]"
 "SpoolJoin   [off]"
 "SpoolJoin   [vyp]"
 "SpoolJoin   [vyp]"
 
 
-#MSG_AUTO_HOME c=0 r=0
+#MSG_AUTO_HOME
 "Auto home"
 "Auto home"
 "\x00"
 "\x00"
 
 
-#MSG_AUTOLOAD_FILAMENT c=17 r=0
+#MSG_AUTOLOAD_FILAMENT c=17
 "AutoLoad filament"
 "AutoLoad filament"
 "AutoZavedeni fil."
 "AutoZavedeni fil."
 
 
@@ -74,27 +74,27 @@
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 "Automaticke zavadeni filamentu aktivni, stisknete tlacitko a vlozte filament..."
 "Automaticke zavadeni filamentu aktivni, stisknete tlacitko a vlozte filament..."
 
 
-#MSG_SELFTEST_AXIS_LENGTH c=0 r=0
+#MSG_SELFTEST_AXIS_LENGTH
 "Axis length"
 "Axis length"
 "Delka osy"
 "Delka osy"
 
 
-#MSG_SELFTEST_AXIS c=0 r=0
+#MSG_SELFTEST_AXIS
 "Axis"
 "Axis"
 "Osa"
 "Osa"
 
 
-#MSG_SELFTEST_BEDHEATER c=0 r=0
+#MSG_SELFTEST_BEDHEATER
 "Bed / Heater"
 "Bed / Heater"
 "Podlozka / Topeni"
 "Podlozka / Topeni"
 
 
-#MSG_BED_DONE c=0 r=0
+#MSG_BED_DONE
 "Bed done"
 "Bed done"
 "Bed OK."
 "Bed OK."
 
 
-#MSG_BED_HEATING c=0 r=0
+#MSG_BED_HEATING
 "Bed Heating"
 "Bed Heating"
 "Zahrivani bed"
 "Zahrivani bed"
 
 
-#MSG_BED_CORRECTION_MENU c=0 r=0
+#MSG_BED_CORRECTION_MENU
 "Bed level correct"
 "Bed level correct"
 "Korekce podlozky"
 "Korekce podlozky"
 
 
@@ -102,15 +102,7 @@
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset."
 "Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset."
 
 
-#MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED c=20 r=4
-"Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset."
-"Kalibrace Z selhala. Sensor je odpojeny nebo preruseny kabel. Cekam na reset."
-
-#MSG_BED_LEVELING_FAILED_POINT_HIGH c=20 r=4
-"Bed leveling failed. Sensor triggered too high. Waiting for reset."
-"Kalibrace Z selhala. Sensor sepnul prilis vysoko. Cekam na reset."
-
-#MSG_BED c=0 r=0
+#MSG_BED
 "Bed"
 "Bed"
 "Podlozka"
 "Podlozka"
 
 
@@ -126,11 +118,11 @@
 "Calibrating home"
 "Calibrating home"
 "Kalibruji vychozi poz."
 "Kalibruji vychozi poz."
 
 
-#MSG_CALIBRATE_BED c=0 r=0
+#MSG_CALIBRATE_BED
 "Calibrate XYZ"
 "Calibrate XYZ"
 "Kalibrace XYZ"
 "Kalibrace XYZ"
 
 
-#MSG_HOMEYZ c=0 r=0
+#MSG_HOMEYZ
 "Calibrate Z"
 "Calibrate Z"
 "Kalibrovat Z"
 "Kalibrovat Z"
 
 
@@ -150,11 +142,11 @@
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Kalibrace Z. Otacenim tlacitka posunte Z osu az k~hornimu dorazu. Potvrdte tlacitkem."
 "Kalibrace Z. Otacenim tlacitka posunte Z osu az k~hornimu dorazu. Potvrdte tlacitkem."
 
 
-#MSG_HOMEYZ_DONE c=0 r=0
+#MSG_HOMEYZ_DONE
 "Calibration done"
 "Calibration done"
 "Kalibrace OK"
 "Kalibrace OK"
 
 
-#MSG_MENU_CALIBRATION c=0 r=0
+#MSG_MENU_CALIBRATION
 "Calibration"
 "Calibration"
 "Kalibrace"
 "Kalibrace"
 
 
@@ -162,19 +154,15 @@
 "Cancel"
 "Cancel"
 "Zrusit"
 "Zrusit"
 
 
-#MSG_SD_INSERTED c=0 r=0
-"Card inserted"
-"Karta vlozena"
-
-#MSG_SD_REMOVED c=0 r=0
+#MSG_SD_REMOVED
 "Card removed"
 "Card removed"
 "Karta vyjmuta"
 "Karta vyjmuta"
 
 
-#MSG_NOT_COLOR c=0 r=0
+#MSG_NOT_COLOR
 "Color not correct"
 "Color not correct"
 "Barva neni cista"
 "Barva neni cista"
 
 
-#MSG_COOLDOWN c=0 r=0
+#MSG_COOLDOWN
 "Cooldown"
 "Cooldown"
 "Zchladit"
 "Zchladit"
 
 
@@ -182,15 +170,15 @@
 "Copy selected language?"
 "Copy selected language?"
 "Kopirovat vybrany jazyk?"
 "Kopirovat vybrany jazyk?"
 
 
-#MSG_CRASHDETECT_ON c=0 r=0
+#MSG_CRASHDETECT_ON
 "Crash det.   [on]"
 "Crash det.   [on]"
 "Crash det.  [zap]"
 "Crash det.  [zap]"
 
 
-#MSG_CRASHDETECT_NA c=0 r=0
+#MSG_CRASHDETECT_NA
 "Crash det.  [N/A]"
 "Crash det.  [N/A]"
 "\x00"
 "\x00"
 
 
-#MSG_CRASHDETECT_OFF c=0 r=0
+#MSG_CRASHDETECT_OFF
 "Crash det.  [off]"
 "Crash det.  [off]"
 "Crash det.  [vyp]"
 "Crash det.  [vyp]"
 
 
@@ -214,7 +202,7 @@
 "Date:"
 "Date:"
 "Datum:"
 "Datum:"
 
 
-#MSG_DISABLE_STEPPERS c=0 r=0
+#MSG_DISABLE_STEPPERS
 "Disable steppers"
 "Disable steppers"
 "Vypnout motory"
 "Vypnout motory"
 
 
@@ -226,34 +214,14 @@
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Chcete opakovat posledni krok a pozmenit vzdalenost mezi tryskou a podlozkou?"
 "Chcete opakovat posledni krok a pozmenit vzdalenost mezi tryskou a podlozkou?"
 
 
-#MSG_EXTRUDER_CORRECTION c=9 r=0
-"E-correct"
-"Korekce E"
+#MSG_EXTRUDER_CORRECTION c=10
+"E-correct:"
+"Korekce E:"
 
 
 #MSG_EJECT_FILAMENT c=17 r=1
 #MSG_EJECT_FILAMENT c=17 r=1
 "Eject filament"
 "Eject filament"
 "Vysunout filament"
 "Vysunout filament"
 
 
-#MSG_EJECT_FILAMENT1 c=17 r=1
-"Eject filament 1"
-"Vysunout filament 1"
-
-#MSG_EJECT_FILAMENT2 c=17 r=1
-"Eject filament 2"
-"Vysunout filament 2"
-
-#MSG_EJECT_FILAMENT3 c=17 r=1
-"Eject filament 3"
-"Vysunout filament 3"
-
-#MSG_EJECT_FILAMENT4 c=17 r=1
-"Eject filament 4"
-"Vysunout filament 4"
-
-#MSG_EJECT_FILAMENT5 c=17 r=1
-"Eject filament 5"
-"Vysunout filament 5"
-
 #
 #
 "Eject"
 "Eject"
 "Vysunout"
 "Vysunout"
@@ -266,11 +234,11 @@
 "Endstop not hit"
 "Endstop not hit"
 "Kon. spinac nesepnut"
 "Kon. spinac nesepnut"
 
 
-#MSG_SELFTEST_ENDSTOP c=0 r=0
+#MSG_SELFTEST_ENDSTOP
 "Endstop"
 "Endstop"
 "Koncovy spinac"
 "Koncovy spinac"
 
 
-#MSG_SELFTEST_ENDSTOPS c=0 r=0
+#MSG_SELFTEST_ENDSTOPS
 "Endstops"
 "Endstops"
 "Konc. spinace"
 "Konc. spinace"
 
 
@@ -282,31 +250,11 @@
 "ERROR: Filament sensor is not responding, please check connection."
 "ERROR: Filament sensor is not responding, please check connection."
 "CHYBA: Filament senzor nereaguje, zkontrolujte zapojeni."
 "CHYBA: Filament senzor nereaguje, zkontrolujte zapojeni."
 
 
-#MSG_ERROR c=0 r=0
+#MSG_ERROR
 "ERROR:"
 "ERROR:"
 "CHYBA:"
 "CHYBA:"
 
 
-#
-"External SPI flash W25X20CL not responding."
-"Externi SPI flash W25X20CL neodpovida."
-
-#
-"Extruder 1"
-"\x00"
-
-#
-"Extruder 2"
-"\x00"
-
-#
-"Extruder 3"
-"\x00"
-
-#
-"Extruder 4"
-"\x00"
-
-#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 "Extruder fan:"
 "Extruder fan:"
 "Levy vent.:"
 "Levy vent.:"
 
 
@@ -314,7 +262,7 @@
 "Extruder info"
 "Extruder info"
 "\x00"
 "\x00"
 
 
-#MSG_MOVE_E c=0 r=0
+#MSG_MOVE_E
 "Extruder"
 "Extruder"
 "\x00"
 "\x00"
 
 
@@ -338,11 +286,11 @@
 "Fail stats"
 "Fail stats"
 "Selhani"
 "Selhani"
 
 
-#MSG_FAN_SPEED c=14 r=0
+#MSG_FAN_SPEED c=14
 "Fan speed"
 "Fan speed"
 "Rychlost vent."
 "Rychlost vent."
 
 
-#MSG_SELFTEST_FAN c=20 r=0
+#MSG_SELFTEST_FAN c=20
 "Fan test"
 "Fan test"
 "Test ventilatoru"
 "Test ventilatoru"
 
 
@@ -354,19 +302,15 @@
 "Fans check  [off]"
 "Fans check  [off]"
 "Kontr. vent.[vyp]"
 "Kontr. vent.[vyp]"
 
 
-#MSG_FSENSOR_ON c=0 r=0
+#MSG_FSENSOR_ON
 "Fil. sensor  [on]"
 "Fil. sensor  [on]"
 "Fil. senzor [zap]"
 "Fil. senzor [zap]"
 
 
-#MSG_RESPONSE_POOR c=20 r=2
-"Fil. sensor response is poor, disable it?"
-"Senzor nerozpoznal filament, vypnout?"
-
-#MSG_FSENSOR_NA c=0 r=0
+#MSG_FSENSOR_NA
 "Fil. sensor [N/A]"
 "Fil. sensor [N/A]"
 "Fil. senzor [N/A]"
 "Fil. senzor [N/A]"
 
 
-#MSG_FSENSOR_OFF c=0 r=0
+#MSG_FSENSOR_OFF
 "Fil. sensor [off]"
 "Fil. sensor [off]"
 "Fil. senzor [vyp]"
 "Fil. senzor [vyp]"
 
 
@@ -378,18 +322,14 @@
 "Filament extruding & with correct color?"
 "Filament extruding & with correct color?"
 "Filament vytlacen a spravne barvy?"
 "Filament vytlacen a spravne barvy?"
 
 
-#MSG_NOT_LOADED c=19 r=0
+#MSG_NOT_LOADED c=19
 "Filament not loaded"
 "Filament not loaded"
 "Filament nezaveden"
 "Filament nezaveden"
 
 
-#MSG_FILAMENT_SENSOR c=20 r=0
+#MSG_FILAMENT_SENSOR c=20
 "Filament sensor"
 "Filament sensor"
 "Senzor filamentu"
 "Senzor filamentu"
 
 
-#MSG_SELFTEST_FILAMENT_SENSOR c=18 r=0
-"Filament sensor:"
-"Senzor filamentu:"
-
 #MSG_FILAMENT_USED c=19 r=1
 #MSG_FILAMENT_USED c=19 r=1
 "Filament used"
 "Filament used"
 "Spotrebovano filamentu"
 "Spotrebovano filamentu"
@@ -418,15 +358,15 @@
 "Fix the issue and then press button on MMU unit."
 "Fix the issue and then press button on MMU unit."
 "Opravte chybu a pote stisknete tlacitko na jednotce MMU."
 "Opravte chybu a pote stisknete tlacitko na jednotce MMU."
 
 
-#MSG_FLOW c=0 r=0
+#MSG_FLOW
 "Flow"
 "Flow"
 "Prutok"
 "Prutok"
 
 
-#MSG_PRUSA3D_FORUM c=0 r=0
+#MSG_PRUSA3D_FORUM
 "forum.prusa3d.com"
 "forum.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_COOLING_FAN c=20 r=0
+#MSG_SELFTEST_COOLING_FAN c=20
 "Front print fan?"
 "Front print fan?"
 "Predni tiskovy vent?"
 "Predni tiskovy vent?"
 
 
@@ -434,23 +374,23 @@
 "Front side[um]"
 "Front side[um]"
 "Vpredu [um]"
 "Vpredu [um]"
 
 
-#MSG_SELFTEST_FANS c=0 r=0
+#MSG_SELFTEST_FANS
 "Front/left fans"
 "Front/left fans"
 "Predni/levy vent."
 "Predni/levy vent."
 
 
-#MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
+#MSG_SELFTEST_HEATERTHERMISTOR
 "Heater/Thermistor"
 "Heater/Thermistor"
 "Topeni/Termistor"
 "Topeni/Termistor"
 
 
-#MSG_BED_HEATING_SAFETY_DISABLED c=0 r=0
+#MSG_BED_HEATING_SAFETY_DISABLED
 "Heating disabled by safety timer."
 "Heating disabled by safety timer."
 "Zahrivani preruseno bezpecnostnim casovacem."
 "Zahrivani preruseno bezpecnostnim casovacem."
 
 
-#MSG_HEATING_COMPLETE c=20 r=0
+#MSG_HEATING_COMPLETE c=20
 "Heating done."
 "Heating done."
 "Zahrivani OK."
 "Zahrivani OK."
 
 
-#MSG_HEATING c=0 r=0
+#MSG_HEATING
 "Heating"
 "Heating"
 "Zahrivani"
 "Zahrivani"
 
 
@@ -458,51 +398,47 @@
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Dobry den, jsem vase tiskarna Original Prusa i3. Chcete abych Vas provedla kalibracnim procesem?"
 "Dobry den, jsem vase tiskarna Original Prusa i3. Chcete abych Vas provedla kalibracnim procesem?"
 
 
-#MSG_PRUSA3D_HOWTO c=0 r=0
+#MSG_PRUSA3D_HOWTO
 "howto.prusa3d.com"
 "howto.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#
-"Change extruder"
-"Zmenit extruder"
-
-#MSG_FILAMENTCHANGE c=0 r=0
+#MSG_FILAMENTCHANGE
 "Change filament"
 "Change filament"
 "Vymenit filament"
 "Vymenit filament"
 
 
-#MSG_CHANGE_SUCCESS c=0 r=0
+#MSG_CHANGE_SUCCESS
 "Change success!"
 "Change success!"
 "Zmena uspesna!"
 "Zmena uspesna!"
 
 
-#MSG_CORRECTLY c=20 r=0
+#MSG_CORRECTLY c=20
 "Changed correctly?"
 "Changed correctly?"
 "Vymena ok?"
 "Vymena ok?"
 
 
-#MSG_SELFTEST_CHECK_BED c=20 r=0
+#MSG_SELFTEST_CHECK_BED c=20
 "Checking bed     "
 "Checking bed     "
 "Kontrola podlozky"
 "Kontrola podlozky"
 
 
-#MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
+#MSG_SELFTEST_CHECK_ENDSTOPS c=20
 "Checking endstops"
 "Checking endstops"
 "Kontrola endstopu"
 "Kontrola endstopu"
 
 
-#MSG_SELFTEST_CHECK_HOTEND c=20 r=0
+#MSG_SELFTEST_CHECK_HOTEND c=20
 "Checking hotend  "
 "Checking hotend  "
 "Kontrola hotend "
 "Kontrola hotend "
 
 
-#MSG_SELFTEST_CHECK_FSENSOR c=20 r=0
+#MSG_SELFTEST_CHECK_FSENSOR c=20
 "Checking sensors "
 "Checking sensors "
 "Kontrola senzoru"
 "Kontrola senzoru"
 
 
-#MSG_SELFTEST_CHECK_X c=20 r=0
+#MSG_SELFTEST_CHECK_X c=20
 "Checking X axis  "
 "Checking X axis  "
 "Kontrola osy X"
 "Kontrola osy X"
 
 
-#MSG_SELFTEST_CHECK_Y c=20 r=0
+#MSG_SELFTEST_CHECK_Y c=20
 "Checking Y axis  "
 "Checking Y axis  "
 "Kontrola osy Y"
 "Kontrola osy Y"
 
 
-#MSG_SELFTEST_CHECK_Z c=20 r=0
+#MSG_SELFTEST_CHECK_Z c=20
 "Checking Z axis  "
 "Checking Z axis  "
 "Kontrola osy Z"
 "Kontrola osy Z"
 
 
@@ -530,35 +466,15 @@
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "Zacnu tisknout linku a Vy budete postupne snizovat trysku otacenim tlacitka dokud nedosahnete optimalni vysky. Prohlednete si obrazky v nasi prirucce v kapitole Kalibrace."
 "Zacnu tisknout linku a Vy budete postupne snizovat trysku otacenim tlacitka dokud nedosahnete optimalni vysky. Prohlednete si obrazky v nasi prirucce v kapitole Kalibrace."
 
 
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
-"Improving bed calibration point"
-"Zlepsuji presnost kalibracniho bodu"
-
-#MSG_WATCH c=0 r=0
+#MSG_WATCH
 "Info screen"
 "Info screen"
 "Informace"
 "Informace"
 
 
-#MSG_FILAMENT_LOADING_T0 c=20 r=4
-"Insert filament into extruder 1. Click when done."
-"Vlozte filament do extruderu 1. Potvrdte tlacitkem."
-
-#MSG_FILAMENT_LOADING_T1 c=20 r=4
-"Insert filament into extruder 2. Click when done."
-"Vlozte filament do extruderu 2. Potvrdte tlacitkem."
-
-#MSG_FILAMENT_LOADING_T2 c=20 r=4
-"Insert filament into extruder 3. Click when done."
-"Vlozte filament do extruderu 3. Potvrdte tlacitkem."
-
-#MSG_FILAMENT_LOADING_T3 c=20 r=4
-"Insert filament into extruder 4. Click when done."
-"Vlozte filament do extruderu 4. Potvrdte tlacitkem."
-
 #
 #
 "Is filament 1 loaded?"
 "Is filament 1 loaded?"
 "Je filament 1 zaveden?"
 "Je filament 1 zaveden?"
 
 
-#MSG_INSERT_FILAMENT c=20 r=0
+#MSG_INSERT_FILAMENT c=20
 "Insert filament"
 "Insert filament"
 "Vlozte filament"
 "Vlozte filament"
 
 
@@ -578,10 +494,6 @@
 "Is steel sheet on heatbed?"
 "Is steel sheet on heatbed?"
 "Je tiskovy plat na podlozce?"
 "Je tiskovy plat na podlozce?"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
-"Iteration "
-"Iterace "
-
 #
 #
 "Last print failures"
 "Last print failures"
 "Selhani posl. tisku"
 "Selhani posl. tisku"
@@ -590,7 +502,7 @@
 "Last print"
 "Last print"
 "Posledni tisk"
 "Posledni tisk"
 
 
-#MSG_SELFTEST_EXTRUDER_FAN c=20 r=0
+#MSG_SELFTEST_EXTRUDER_FAN c=20
 "Left hotend fan?"
 "Left hotend fan?"
 "Levy vent na trysce?"
 "Levy vent na trysce?"
 
 
@@ -606,19 +518,19 @@
 "Lin. correction"
 "Lin. correction"
 "Korekce lin."
 "Korekce lin."
 
 
-#MSG_BABYSTEP_Z c=0 r=0
+#MSG_BABYSTEP_Z
 "Live adjust Z"
 "Live adjust Z"
 "Doladeni osy Z"
 "Doladeni osy Z"
 
 
-#MSG_LOAD_FILAMENT c=17 r=0
+#MSG_LOAD_FILAMENT c=17
 "Load filament"
 "Load filament"
 "Zavest filament"
 "Zavest filament"
 
 
-#MSG_LOADING_COLOR c=0 r=0
+#MSG_LOADING_COLOR
 "Loading color"
 "Loading color"
 "Cisteni barvy"
 "Cisteni barvy"
 
 
-#MSG_LOADING_FILAMENT c=20 r=0
+#MSG_LOADING_FILAMENT c=20
 "Loading filament"
 "Loading filament"
 "Zavadeni filamentu"
 "Zavadeni filamentu"
 
 
@@ -634,15 +546,15 @@
 "M117 First layer cal."
 "M117 First layer cal."
 "M117 Kal. prvni vrstvy"
 "M117 Kal. prvni vrstvy"
 
 
-#MSG_MAIN c=0 r=0
+#MSG_MAIN
 "Main"
 "Main"
 "Hlavni nabidka"
 "Hlavni nabidka"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60
 "Measuring reference height of calibration point"
 "Measuring reference height of calibration point"
 "Merim referencni vysku kalibracniho bodu"
 "Merim referencni vysku kalibracniho bodu"
 
 
-#MSG_MESH_BED_LEVELING c=0 r=0
+#MSG_MESH_BED_LEVELING
 "Mesh Bed Leveling"
 "Mesh Bed Leveling"
 "\x00"
 "\x00"
 
 
@@ -674,11 +586,11 @@
 "MMU OK. Resuming..."
 "MMU OK. Resuming..."
 "MMU OK. Pokracuji..."
 "MMU OK. Pokracuji..."
 
 
-#MSG_STEALTH_MODE_OFF c=0 r=0
+#MSG_STEALTH_MODE_OFF
 "Mode     [Normal]"
 "Mode     [Normal]"
 "Mod      [Normal]"
 "Mod      [Normal]"
 
 
-#MSG_SILENT_MODE_ON c=0 r=0
+#MSG_SILENT_MODE_ON
 "Mode     [silent]"
 "Mode     [silent]"
 "Mod       [tichy]"
 "Mod       [tichy]"
 
 
@@ -690,15 +602,15 @@
 "MMU power fails"
 "MMU power fails"
 "MMU vypadky proudu"
 "MMU vypadky proudu"
 
 
-#MSG_STEALTH_MODE_ON c=0 r=0
+#MSG_STEALTH_MODE_ON
 "Mode    [Stealth]"
 "Mode    [Stealth]"
 "Mod       [tichy]"
 "Mod       [tichy]"
 
 
-#MSG_AUTO_MODE_ON c=0 r=0
+#MSG_AUTO_MODE_ON
 "Mode [auto power]"
 "Mode [auto power]"
 "Mod [automaticky]"
 "Mod [automaticky]"
 
 
-#MSG_SILENT_MODE_OFF c=0 r=0
+#MSG_SILENT_MODE_OFF
 "Mode [high power]"
 "Mode [high power]"
 "Mod  [vys. vykon]"
 "Mod  [vys. vykon]"
 
 
@@ -706,31 +618,31 @@
 "MMU2 connected"
 "MMU2 connected"
 "MMU2 pripojeno"
 "MMU2 pripojeno"
 
 
-#MSG_SELFTEST_MOTOR c=0 r=0
+#MSG_SELFTEST_MOTOR
 "Motor"
 "Motor"
 "\x00"
 "\x00"
 
 
-#MSG_MOVE_AXIS c=0 r=0
+#MSG_MOVE_AXIS
 "Move axis"
 "Move axis"
 "Posunout osu"
 "Posunout osu"
 
 
-#MSG_MOVE_X c=0 r=0
+#MSG_MOVE_X
 "Move X"
 "Move X"
 "Posunout X"
 "Posunout X"
 
 
-#MSG_MOVE_Y c=0 r=0
+#MSG_MOVE_Y
 "Move Y"
 "Move Y"
 "Posunout Y"
 "Posunout Y"
 
 
-#MSG_MOVE_Z c=0 r=0
+#MSG_MOVE_Z
 "Move Z"
 "Move Z"
 "Posunout Z"
 "Posunout Z"
 
 
-#MSG_NO_MOVE c=0 r=0
+#MSG_NO_MOVE
 "No move."
 "No move."
 "Bez pohybu."
 "Bez pohybu."
 
 
-#MSG_NO_CARD c=0 r=0
+#MSG_NO_CARD
 "No SD card"
 "No SD card"
 "Zadna SD karta"
 "Zadna SD karta"
 
 
@@ -738,11 +650,11 @@
 "N/A"
 "N/A"
 "\x00"
 "\x00"
 
 
-#MSG_NO c=0 r=0
+#MSG_NO
 "No"
 "No"
 "Ne"
 "Ne"
 
 
-#MSG_SELFTEST_NOTCONNECTED c=0 r=0
+#MSG_SELFTEST_NOTCONNECTED
 "Not connected"
 "Not connected"
 "Nezapojeno "
 "Nezapojeno "
 
 
@@ -750,11 +662,7 @@
 "New firmware version available:"
 "New firmware version available:"
 "Vysla nova verze firmware:"
 "Vysla nova verze firmware:"
 
 
-#
-"No "
-"Ne"
-
-#MSG_SELFTEST_FAN_NO c=19 r=0
+#MSG_SELFTEST_FAN_NO c=19
 "Not spinning"
 "Not spinning"
 "Netoci se"
 "Netoci se"
 
 
@@ -766,7 +674,7 @@
 "Now I will preheat nozzle for PLA."
 "Now I will preheat nozzle for PLA."
 "Nyni predehreji trysku pro PLA."
 "Nyni predehreji trysku pro PLA."
 
 
-#MSG_NOZZLE c=0 r=0
+#MSG_NOZZLE
 "Nozzle"
 "Nozzle"
 "Tryska"
 "Tryska"
 
 
@@ -782,7 +690,7 @@
 "Nozzle FAN"
 "Nozzle FAN"
 "Trysk. vent."
 "Trysk. vent."
 
 
-#MSG_PAUSE_PRINT c=0 r=0
+#MSG_PAUSE_PRINT
 "Pause print"
 "Pause print"
 "Pozastavit tisk"
 "Pozastavit tisk"
 
 
@@ -814,7 +722,7 @@
 "Please clean the nozzle for calibration. Click when done."
 "Please clean the nozzle for calibration. Click when done."
 "Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem."
 "Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem."
 
 
-#MSG_SELFTEST_PLEASECHECK c=0 r=0
+#MSG_SELFTEST_PLEASECHECK
 "Please check :"
 "Please check :"
 "Zkontrolujte :"
 "Zkontrolujte :"
 
 
@@ -866,7 +774,7 @@
 "Please update firmware in your MMU2. Waiting for reset."
 "Please update firmware in your MMU2. Waiting for reset."
 "Prosim aktualizujte firmware ve vasi MMU2 jednotce. Cekam na reset."
 "Prosim aktualizujte firmware ve vasi MMU2 jednotce. Cekam na reset."
 
 
-#MSG_PLEASE_WAIT c=20 r=0
+#MSG_PLEASE_WAIT c=20
 "Please wait"
 "Please wait"
 "Prosim cekejte"
 "Prosim cekejte"
 
 
@@ -874,11 +782,11 @@
 "Please remove shipping helpers first."
 "Please remove shipping helpers first."
 "Nejprve prosim sundejte transportni soucastky."
 "Nejprve prosim sundejte transportni soucastky."
 
 
-#MSG_PREHEAT_NOZZLE c=20 r=0
+#MSG_PREHEAT_NOZZLE c=20
 "Preheat the nozzle!"
 "Preheat the nozzle!"
 "Predehrejte trysku!"
 "Predehrejte trysku!"
 
 
-#MSG_PREHEAT c=0 r=0
+#MSG_PREHEAT
 "Preheat"
 "Preheat"
 "Predehrev"
 "Predehrev"
 
 
@@ -898,7 +806,7 @@
 "Power failures"
 "Power failures"
 "Vypadky proudu"
 "Vypadky proudu"
 
 
-#MSG_PRINT_ABORTED c=20 r=0
+#MSG_PRINT_ABORTED c=20
 "Print aborted"
 "Print aborted"
 "Tisk prerusen"
 "Tisk prerusen"
 
 
@@ -910,11 +818,11 @@
 "Preheating to unload"
 "Preheating to unload"
 "Predehrivam k vyjmuti"
 "Predehrivam k vyjmuti"
 
 
-#MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_PRINT_FAN_SPEED c=18
 "Print fan:"
 "Print fan:"
 "Tiskovy vent.:"
 "Tiskovy vent.:"
 
 
-#MSG_CARD_MENU c=0 r=0
+#MSG_CARD_MENU
 "Print from SD"
 "Print from SD"
 "Tisk z SD"
 "Tisk z SD"
 
 
@@ -938,15 +846,7 @@
 "Print FAN"
 "Print FAN"
 "Tiskovy vent."
 "Tiskovy vent."
 
 
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK2.5 ready."
-"Prusa i3 MK2.5 ok."
-
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK3 ready."
-"Prusa i3 MK3 ok."
-
-#MSG_PRUSA3D c=0 r=0
+#MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
 "\x00"
 "\x00"
 
 
@@ -966,19 +866,15 @@
 "Prusa i3 MK3S OK."
 "Prusa i3 MK3S OK."
 "\x00"
 "\x00"
 
 
-#
-"Prusa i3 MK2 ready."
-"Prusa i3 MK2 ok."
-
-#MSG_CALIBRATE_BED_RESET c=0 r=0
+#MSG_CALIBRATE_BED_RESET
 "Reset XYZ calibr."
 "Reset XYZ calibr."
 "Reset XYZ kalibr."
 "Reset XYZ kalibr."
 
 
-#MSG_BED_CORRECTION_RESET c=0 r=0
+#MSG_BED_CORRECTION_RESET
 "Reset"
 "Reset"
 "\x00"
 "\x00"
 
 
-#MSG_RESUME_PRINT c=0 r=0
+#MSG_RESUME_PRINT
 "Resume print"
 "Resume print"
 "Pokracovat"
 "Pokracovat"
 
 
@@ -1014,31 +910,31 @@
 "Right"
 "Right"
 "Vpravo"
 "Vpravo"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
+#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60
 "Searching bed calibration point"
 "Searching bed calibration point"
 "Hledam kalibracni bod podlozky"
 "Hledam kalibracni bod podlozky"
 
 
-#MSG_LANGUAGE_SELECT c=0 r=0
+#MSG_LANGUAGE_SELECT
 "Select language"
 "Select language"
 "Vyber jazyka"
 "Vyber jazyka"
 
 
-#MSG_SELFTEST_OK c=0 r=0
+#MSG_SELFTEST_OK
 "Self test OK"
 "Self test OK"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_START c=20 r=0
+#MSG_SELFTEST_START c=20
 "Self test start  "
 "Self test start  "
 "Self test start "
 "Self test start "
 
 
-#MSG_SELFTEST c=0 r=0
+#MSG_SELFTEST
 "Selftest         "
 "Selftest         "
 "Selftest "
 "Selftest "
 
 
-#MSG_SELFTEST_ERROR c=0 r=0
+#MSG_SELFTEST_ERROR
 "Selftest error !"
 "Selftest error !"
 "Chyba Selftestu!"
 "Chyba Selftestu!"
 
 
-#MSG_SELFTEST_FAILED c=20 r=0
+#MSG_SELFTEST_FAILED c=20
 "Selftest failed  "
 "Selftest failed  "
 "Selftest selhal "
 "Selftest selhal "
 
 
@@ -1058,7 +954,7 @@
 "Set temperature:"
 "Set temperature:"
 "Nastavte teplotu:"
 "Nastavte teplotu:"
 
 
-#MSG_SETTINGS c=0 r=0
+#MSG_SETTINGS
 "Settings"
 "Settings"
 "Nastaveni"
 "Nastaveni"
 
 
@@ -1070,32 +966,24 @@
 "Sensor state"
 "Sensor state"
 "Stav senzoru"
 "Stav senzoru"
 
 
-#
-"Sensors info"
-"Senzor info"
-
-#
-"Show pinda state"
-"Zobrazit stav PINDA"
-
 #MSG_FILE_CNT c=20 r=4
 #MSG_FILE_CNT c=20 r=4
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Nektere soubory nebudou setrideny. Maximalni pocet souboru ve slozce pro setrideni je 100."
 "Nektere soubory nebudou setrideny. Maximalni pocet souboru ve slozce pro setrideni je 100."
 
 
 #MSG_SORT_NONE c=17 r=1
 #MSG_SORT_NONE c=17 r=1
-"Sort:      [none]"
+"Sort       [none]"
 "Trideni   [Zadne]"
 "Trideni   [Zadne]"
 
 
 #MSG_SORT_TIME c=17 r=1
 #MSG_SORT_TIME c=17 r=1
-"Sort:      [time]"
-"Trideni:    [cas]"
+"Sort       [time]"
+"Trideni     [cas]"
 
 
 #
 #
 "Severe skew"
 "Severe skew"
 "Tezke zkoseni"
 "Tezke zkoseni"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
-"Sort:  [alphabet]"
+"Sort   [alphabet]"
 "Trideni [Abeceda]"
 "Trideni [Abeceda]"
 
 
 #MSG_SORTING c=20 r=1
 #MSG_SORTING c=20 r=1
@@ -1126,11 +1014,11 @@
 "Sound    [silent]"
 "Sound    [silent]"
 "Zvuk      [tichy]"
 "Zvuk      [tichy]"
 
 
-#MSG_SPEED c=0 r=0
+#MSG_SPEED
 "Speed"
 "Speed"
 "Rychlost"
 "Rychlost"
 
 
-#MSG_SELFTEST_FAN_YES c=19 r=0
+#MSG_SELFTEST_FAN_YES c=19
 "Spinning"
 "Spinning"
 "Toci se"
 "Toci se"
 
 
@@ -1138,23 +1026,23 @@
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Je vyzadovana stabilni pokojova teplota 21-26C a pevna podlozka."
 "Je vyzadovana stabilni pokojova teplota 21-26C a pevna podlozka."
 
 
-#MSG_STATISTICS c=0 r=0
+#MSG_STATISTICS
 "Statistics  "
 "Statistics  "
 "Statistika "
 "Statistika "
 
 
-#MSG_STOP_PRINT c=0 r=0
+#MSG_STOP_PRINT
 "Stop print"
 "Stop print"
 "Zastavit tisk"
 "Zastavit tisk"
 
 
-#MSG_STOPPED c=0 r=0
+#MSG_STOPPED
 "STOPPED. "
 "STOPPED. "
 "ZASTAVENO."
 "ZASTAVENO."
 
 
-#MSG_SUPPORT c=0 r=0
+#MSG_SUPPORT
 "Support"
 "Support"
 "Podpora"
 "Podpora"
 
 
-#MSG_SELFTEST_SWAPPED c=0 r=0
+#MSG_SELFTEST_SWAPPED
 "Swapped"
 "Swapped"
 "Prohozene"
 "Prohozene"
 
 
@@ -1182,7 +1070,7 @@
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Teplotni kalibrace dokoncena a je nyni aktivni. Teplotni kalibraci je mozno deaktivovat v menu Nastaveni->Tepl. kal."
 "Teplotni kalibrace dokoncena a je nyni aktivni. Teplotni kalibraci je mozno deaktivovat v menu Nastaveni->Tepl. kal."
 
 
-#MSG_TEMPERATURE c=0 r=0
+#MSG_TEMPERATURE
 "Temperature"
 "Temperature"
 "Teplota"
 "Teplota"
 
 
@@ -1202,7 +1090,7 @@
 "Total print time"
 "Total print time"
 "Celkovy cas tisku"
 "Celkovy cas tisku"
 
 
-#MSG_TUNE c=0 r=0
+#MSG_TUNE
 "Tune"
 "Tune"
 "Ladit"
 "Ladit"
 
 
@@ -1210,10 +1098,6 @@
 "Unload"
 "Unload"
 "Vysunout"
 "Vysunout"
 
 
-#
-"Unload all"
-"Vyjmout vse"
-
 #
 #
 "Total failures"
 "Total failures"
 "Celkem selhani"
 "Celkem selhani"
@@ -1226,7 +1110,7 @@
 "to unload filament"
 "to unload filament"
 "k vyjmuti filamentu"
 "k vyjmuti filamentu"
 
 
-#MSG_UNLOAD_FILAMENT c=17 r=0
+#MSG_UNLOAD_FILAMENT c=17
 "Unload filament"
 "Unload filament"
 "Vyjmout filament"
 "Vyjmout filament"
 
 
@@ -1250,7 +1134,7 @@
 "unknown"
 "unknown"
 "neznamy"
 "neznamy"
 
 
-#MSG_USERWAIT c=0 r=0
+#MSG_USERWAIT
 "Wait for user..."
 "Wait for user..."
 "Ceka se na uzivatele..."
 "Ceka se na uzivatele..."
 
 
@@ -1282,7 +1166,7 @@
 "Was filament unload successful?"
 "Was filament unload successful?"
 "Bylo vysunuti filamentu uspesne?"
 "Bylo vysunuti filamentu uspesne?"
 
 
-#MSG_SELFTEST_WIRINGERROR c=0 r=0
+#MSG_SELFTEST_WIRINGERROR
 "Wiring error"
 "Wiring error"
 "Chyba zapojeni"
 "Chyba zapojeni"
 
 
@@ -1298,7 +1182,7 @@
 "XYZ calibration failed. Please consult the manual."
 "XYZ calibration failed. Please consult the manual."
 "Kalibrace XYZ selhala. Nahlednete do manualu."
 "Kalibrace XYZ selhala. Nahlednete do manualu."
 
 
-#MSG_YES c=0 r=0
+#MSG_YES
 "Yes"
 "Yes"
 "Ano"
 "Ano"
 
 
@@ -1315,8 +1199,8 @@
 "Kalibrace XYZ v poradku. X/Y osy mirne zkosene. Dobra prace!"
 "Kalibrace XYZ v poradku. X/Y osy mirne zkosene. Dobra prace!"
 
 
 #
 #
-"X-correct"
-"Korekce X"
+"X-correct:"
+"Korekce X:"
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
@@ -1330,18 +1214,10 @@
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 "Kalibrace XYZ nepresna. Pravy predni bod moc vpredu."
 "Kalibrace XYZ nepresna. Pravy predni bod moc vpredu."
 
 
-#MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-"XYZ calibration compromised. Left front calibration point not reachable."
-"Kalibrace XYZ nepresna. Levy predni bod moc vpredu."
-
-#MSG_LOAD_ALL c=17 r=0
+#MSG_LOAD_ALL c=17
 "Load all"
 "Load all"
 "Zavest vse"
 "Zavest vse"
 
 
-#MSG_LOAD_FILAMENT_1 c=17 r=0
-"Load filament 1"
-"Zavest filament 1"
-
 #
 #
 "XYZ calibration failed. Bed calibration point was not found."
 "XYZ calibration failed. Bed calibration point was not found."
 "Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen."
 "Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen."
@@ -1350,38 +1226,18 @@
 "XYZ calibration failed. Front calibration points not reachable."
 "XYZ calibration failed. Front calibration points not reachable."
 "Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu."
 "Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu."
 
 
-#
-"XYZ calibration failed. Left front calibration point not reachable."
-"Kalibrace XYZ selhala. Levy predni bod moc vpredu. Srovnejte tiskarnu."
-
-#MSG_LOAD_FILAMENT_2 c=17 r=0
-"Load filament 2"
-"Zavest filament 2"
-
 #
 #
 "XYZ calibration failed. Right front calibration point not reachable."
 "XYZ calibration failed. Right front calibration point not reachable."
 "Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu."
 "Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu."
 
 
-#MSG_LOAD_FILAMENT_3 c=17 r=0
-"Load filament 3"
-"Zavest filament 3"
-
 #
 #
 "Y distance from min"
 "Y distance from min"
 "Y vzdalenost od min"
 "Y vzdalenost od min"
 
 
 #
 #
-"Y-correct"
-"Korekce Y"
-
-#MSG_LOAD_FILAMENT_4 c=17 r=0
-"Load filament 4"
-"Zavest filament 4"
-
-#MSG_LOAD_FILAMENT_5 c=17 r=0
-"Load filament 5"
-"Zavest filament 5"
+"Y-correct:"
+"Korekce Y:"
 
 
-#MSG_OFF c=0 r=0
+#MSG_OFF
 " [off]"
 " [off]"
 "\x00"
 "\x00"

+ 134 - 277
lang/lang_en_de.txt

@@ -1,12 +1,12 @@
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
+#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
 " of 4"
 " of 4"
 " von 4"
 " von 4"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14
 " of 9"
 " of 9"
 " von 9"
 " von 9"
 
 
-#MSG_MEASURED_OFFSET c=0 r=0
+#MSG_MEASURED_OFFSET
 "[0;0] point offset"
 "[0;0] point offset"
 "[0;0] Punktversatz"
 "[0;0] Punktversatz"
 
 
@@ -22,11 +22,11 @@
 ">Cancel"
 ">Cancel"
 ">Abbruch"
 ">Abbruch"
 
 
-#MSG_BABYSTEPPING_Z c=20 r=0
-"Adjusting Z"
-"Z wurde eingestellt"
+#MSG_BABYSTEPPING_Z c=15
+"Adjusting Z:"
+"Z Einstellung:"
 
 
-#MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
+#MSG_SELFTEST_CHECK_ALLCORRECT c=20
 "All correct      "
 "All correct      "
 "Alles richtig "
 "Alles richtig "
 
 
@@ -38,7 +38,7 @@
 "Ambient"
 "Ambient"
 "Raumtemp."
 "Raumtemp."
 
 
-#MSG_PRESS c=20 r=0
+#MSG_PRESS c=20
 "and press the knob"
 "and press the knob"
 "und Knopf druecken"
 "und Knopf druecken"
 
 
@@ -54,15 +54,15 @@
 "SpoolJoin   [N/A]"
 "SpoolJoin   [N/A]"
 "SpoolJoin   [N/V]"
 "SpoolJoin   [N/V]"
 
 
-# MSG_AUTO_DEPLETE_OFF c=17 r=1
+#MSG_AUTO_DEPLETE_OFF c=17 r=1
 "SpoolJoin   [off]"
 "SpoolJoin   [off]"
 "SpoolJoin   [aus]"
 "SpoolJoin   [aus]"
 
 
-#MSG_AUTO_HOME c=0 r=0
+#MSG_AUTO_HOME
 "Auto home"
 "Auto home"
 "Startposition"
 "Startposition"
 
 
-#MSG_AUTOLOAD_FILAMENT c=17 r=0
+#MSG_AUTOLOAD_FILAMENT c=17
 "AutoLoad filament"
 "AutoLoad filament"
 "Auto-Laden Filament"
 "Auto-Laden Filament"
 
 
@@ -74,27 +74,27 @@
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 "Automatisches Laden Filament ist aktiv, Knopf druecken und Filament einlegen..."
 "Automatisches Laden Filament ist aktiv, Knopf druecken und Filament einlegen..."
 
 
-#MSG_SELFTEST_AXIS_LENGTH c=0 r=0
+#MSG_SELFTEST_AXIS_LENGTH
 "Axis length"
 "Axis length"
 "Achsenlaenge"
 "Achsenlaenge"
 
 
-#MSG_SELFTEST_AXIS c=0 r=0
+#MSG_SELFTEST_AXIS
 "Axis"
 "Axis"
 "Achse"
 "Achse"
 
 
-#MSG_SELFTEST_BEDHEATER c=0 r=0
+#MSG_SELFTEST_BEDHEATER
 "Bed / Heater"
 "Bed / Heater"
 "Bett / Heizung"
 "Bett / Heizung"
 
 
-#MSG_BED_DONE c=0 r=0
+#MSG_BED_DONE
 "Bed done"
 "Bed done"
 "Bett OK"
 "Bett OK"
 
 
-#MSG_BED_HEATING c=0 r=0
+#MSG_BED_HEATING
 "Bed Heating"
 "Bed Heating"
 "Bett aufwaermen"
 "Bett aufwaermen"
 
 
-#MSG_BED_CORRECTION_MENU c=0 r=0
+#MSG_BED_CORRECTION_MENU
 "Bed level correct"
 "Bed level correct"
 "Ausgleich Bett ok"
 "Ausgleich Bett ok"
 
 
@@ -102,15 +102,7 @@
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Z-Kal. fehlgeschlg. Sensor nicht ausgeloest. Schmutzige Duese? Warte auf Reset."
 "Z-Kal. fehlgeschlg. Sensor nicht ausgeloest. Schmutzige Duese? Warte auf Reset."
 
 
-#MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED c=20 r=4
-"Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset."
-"Z-Kalibrierung fehl- geschlagen. Sensor getrennt/Kabelbruch? Warte auf Reset."
-
-#MSG_BED_LEVELING_FAILED_POINT_HIGH c=20 r=4
-"Bed leveling failed. Sensor triggered too high. Waiting for reset."
-"Z-Kalibrierung fehl- geschlagen. Sensor zu hoch ausgeloest. Warte auf Reset."
-
-#MSG_BED c=0 r=0
+#MSG_BED
 "Bed"
 "Bed"
 "Bett"
 "Bett"
 
 
@@ -126,11 +118,11 @@
 "Calibrating home"
 "Calibrating home"
 "Kalibriere Start"
 "Kalibriere Start"
 
 
-#MSG_CALIBRATE_BED c=0 r=0
+#MSG_CALIBRATE_BED
 "Calibrate XYZ"
 "Calibrate XYZ"
 "Kalibrierung XYZ"
 "Kalibrierung XYZ"
 
 
-#MSG_HOMEYZ c=0 r=0
+#MSG_HOMEYZ
 "Calibrate Z"
 "Calibrate Z"
 "Kalibrierung Z"
 "Kalibrierung Z"
 
 
@@ -150,11 +142,11 @@
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Z Kalibrieren: Drehen Sie den Knopf bis der obere Anschlag erreicht wird. Anschliessend den Knopf druecken."
 "Z Kalibrieren: Drehen Sie den Knopf bis der obere Anschlag erreicht wird. Anschliessend den Knopf druecken."
 
 
-#MSG_HOMEYZ_DONE c=0 r=0
+#MSG_HOMEYZ_DONE
 "Calibration done"
 "Calibration done"
 "Kalibrierung OK"
 "Kalibrierung OK"
 
 
-#MSG_MENU_CALIBRATION c=0 r=0
+#MSG_MENU_CALIBRATION
 "Calibration"
 "Calibration"
 "Kalibrierung"
 "Kalibrierung"
 
 
@@ -162,19 +154,15 @@
 "Cancel"
 "Cancel"
 "Abbruch"
 "Abbruch"
 
 
-#MSG_SD_INSERTED c=0 r=0
-"Card inserted"
-"SD Karte eingesetzt"
-
-#MSG_SD_REMOVED c=0 r=0
+#MSG_SD_REMOVED
 "Card removed"
 "Card removed"
 "SD Karte entfernt"
 "SD Karte entfernt"
 
 
-#MSG_NOT_COLOR c=0 r=0
+#MSG_NOT_COLOR
 "Color not correct"
 "Color not correct"
 "Falsche Farbe"
 "Falsche Farbe"
 
 
-#MSG_COOLDOWN c=0 r=0
+#MSG_COOLDOWN
 "Cooldown"
 "Cooldown"
 "Abkuehlen"
 "Abkuehlen"
 
 
@@ -182,15 +170,15 @@
 "Copy selected language?"
 "Copy selected language?"
 "Gewaehlte Sprache kopieren?"
 "Gewaehlte Sprache kopieren?"
 
 
-#MSG_CRASHDETECT_ON c=0 r=0
+#MSG_CRASHDETECT_ON
 "Crash det.   [on]"
 "Crash det.   [on]"
 "Crash Erk.   [an]"
 "Crash Erk.   [an]"
 
 
-#MSG_CRASHDETECT_NA c=0 r=0
+#MSG_CRASHDETECT_NA
 "Crash det.  [N/A]"
 "Crash det.  [N/A]"
 "Crash Erk.   [nv]"
 "Crash Erk.   [nv]"
 
 
-#MSG_CRASHDETECT_OFF c=0 r=0
+#MSG_CRASHDETECT_OFF
 "Crash det.  [off]"
 "Crash det.  [off]"
 "Crash Erk.  [aus]"
 "Crash Erk.  [aus]"
 
 
@@ -214,7 +202,7 @@
 "Date:"
 "Date:"
 "Datum:"
 "Datum:"
 
 
-#MSG_DISABLE_STEPPERS c=0 r=0
+#MSG_DISABLE_STEPPERS
 "Disable steppers"
 "Disable steppers"
 "Motoren aus"
 "Motoren aus"
 
 
@@ -226,34 +214,14 @@
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Moechten Sie den letzten Schritt wiederholen, um den Abstand zwischen Duese und Druckbett neu einzustellen?"
 "Moechten Sie den letzten Schritt wiederholen, um den Abstand zwischen Duese und Druckbett neu einzustellen?"
 
 
-#MSG_EXTRUDER_CORRECTION c=9 r=0
-"E-correct"
-"E-Korrektur"
+#MSG_EXTRUDER_CORRECTION c=10
+"E-correct:"
+"E-Korrektur:"
 
 
 #MSG_EJECT_FILAMENT c=17 r=1
 #MSG_EJECT_FILAMENT c=17 r=1
 "Eject filament"
 "Eject filament"
 "Filamentauswurf"
 "Filamentauswurf"
 
 
-#MSG_EJECT_FILAMENT1 c=17 r=1
-"Eject filament 1"
-"Filamentauswurf 1"
-
-#MSG_EJECT_FILAMENT2 c=17 r=1
-"Eject filament 2"
-"Fil.2 auswerfen"
-
-#MSG_EJECT_FILAMENT3 c=17 r=1
-"Eject filament 3"
-"Fil.3 auswerfen"
-
-#MSG_EJECT_FILAMENT4 c=17 r=1
-"Eject filament 4"
-"Fil.4 auswerfen"
-
-#MSG_EJECT_FILAMENT5 c=17 r=1
-"Eject filament 5"
-"Fil.5 auswerfen"
-
 #
 #
 "Eject"
 "Eject"
 "Auswurf"
 "Auswurf"
@@ -266,11 +234,11 @@
 "Endstop not hit"
 "Endstop not hit"
 "Ende nicht getroffen"
 "Ende nicht getroffen"
 
 
-#MSG_SELFTEST_ENDSTOP c=0 r=0
+#MSG_SELFTEST_ENDSTOP
 "Endstop"
 "Endstop"
 "Endanschlag"
 "Endanschlag"
 
 
-#MSG_SELFTEST_ENDSTOPS c=0 r=0
+#MSG_SELFTEST_ENDSTOPS
 "Endstops"
 "Endstops"
 "Endschalter"
 "Endschalter"
 
 
@@ -282,31 +250,11 @@
 "ERROR: Filament sensor is not responding, please check connection."
 "ERROR: Filament sensor is not responding, please check connection."
 "FEHLER: Filament- sensor reagiert nicht, bitte Verbindung pruefen."
 "FEHLER: Filament- sensor reagiert nicht, bitte Verbindung pruefen."
 
 
-#MSG_ERROR c=0 r=0
+#MSG_ERROR
 "ERROR:"
 "ERROR:"
 "FEHLER:"
 "FEHLER:"
 
 
-#
-"External SPI flash W25X20CL not responding."
-"Der externe SPI Flash W25X20CL antwortet nicht."
-
-#
-"Extruder 1"
-"\x00"
-
-#
-"Extruder 2"
-"\x00"
-
-#
-"Extruder 3"
-"\x00"
-
-#
-"Extruder 4"
-"\x00"
-
-#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 "Extruder fan:"
 "Extruder fan:"
 "Extruder Luefter:"
 "Extruder Luefter:"
 
 
@@ -314,7 +262,7 @@
 "Extruder info"
 "Extruder info"
 "Extruder Info"
 "Extruder Info"
 
 
-#MSG_MOVE_E c=0 r=0
+#MSG_MOVE_E
 "Extruder"
 "Extruder"
 "\x00"
 "\x00"
 
 
@@ -338,11 +286,11 @@
 "Fail stats"
 "Fail stats"
 "Fehlerstatistik"
 "Fehlerstatistik"
 
 
-#MSG_FAN_SPEED c=14 r=0
+#MSG_FAN_SPEED c=14
 "Fan speed"
 "Fan speed"
 "Luefter-Tempo"
 "Luefter-Tempo"
 
 
-#MSG_SELFTEST_FAN c=20 r=0
+#MSG_SELFTEST_FAN c=20
 "Fan test"
 "Fan test"
 "Lueftertest"
 "Lueftertest"
 
 
@@ -354,19 +302,15 @@
 "Fans check  [off]"
 "Fans check  [off]"
 "Luefter Chk.[aus]"
 "Luefter Chk.[aus]"
 
 
-#MSG_FSENSOR_ON c=0 r=0
+#MSG_FSENSOR_ON
 "Fil. sensor  [on]"
 "Fil. sensor  [on]"
 "Fil. Sensor  [an]"
 "Fil. Sensor  [an]"
 
 
-#MSG_RESPONSE_POOR c=20 r=2
-"Fil. sensor response is poor, disable it?"
-"Fil. Sensorsignal ist schlecht, ausschalten?"
-
-#MSG_FSENSOR_NA c=0 r=0
+#MSG_FSENSOR_NA
 "Fil. sensor [N/A]"
 "Fil. sensor [N/A]"
 "Fil. Sensor  [nv]"
 "Fil. Sensor  [nv]"
 
 
-#MSG_FSENSOR_OFF c=0 r=0
+#MSG_FSENSOR_OFF
 "Fil. sensor [off]"
 "Fil. sensor [off]"
 "Fil. Sensor [aus]"
 "Fil. Sensor [aus]"
 
 
@@ -378,18 +322,14 @@
 "Filament extruding & with correct color?"
 "Filament extruding & with correct color?"
 "Filament extrudiert + richtige Farbe?"
 "Filament extrudiert + richtige Farbe?"
 
 
-#MSG_NOT_LOADED c=19 r=0
+#MSG_NOT_LOADED c=19
 "Filament not loaded"
 "Filament not loaded"
 "Fil. nicht geladen"
 "Fil. nicht geladen"
 
 
-#MSG_FILAMENT_SENSOR c=20 r=0
+#MSG_FILAMENT_SENSOR c=20
 "Filament sensor"
 "Filament sensor"
 "Filamentsensor"
 "Filamentsensor"
 
 
-#MSG_SELFTEST_FILAMENT_SENSOR c=18 r=0
-"Filament sensor:"
-"Filamentsensor:"
-
 #MSG_FILAMENT_USED c=19 r=1
 #MSG_FILAMENT_USED c=19 r=1
 "Filament used"
 "Filament used"
 "Filament benutzt"
 "Filament benutzt"
@@ -418,15 +358,15 @@
 "Fix the issue and then press button on MMU unit."
 "Fix the issue and then press button on MMU unit."
 "Beseitigen Sie das Problem und druecken Sie dann den Knopf am MMU."
 "Beseitigen Sie das Problem und druecken Sie dann den Knopf am MMU."
 
 
-#MSG_FLOW c=0 r=0
+#MSG_FLOW
 "Flow"
 "Flow"
 "Durchfluss"
 "Durchfluss"
 
 
-#MSG_PRUSA3D_FORUM c=0 r=0
+#MSG_PRUSA3D_FORUM
 "forum.prusa3d.com"
 "forum.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_COOLING_FAN c=20 r=0
+#MSG_SELFTEST_COOLING_FAN c=20
 "Front print fan?"
 "Front print fan?"
 "Vorderer Luefter?"
 "Vorderer Luefter?"
 
 
@@ -434,23 +374,23 @@
 "Front side[um]"
 "Front side[um]"
 "Vorne [um]"
 "Vorne [um]"
 
 
-#MSG_SELFTEST_FANS c=0 r=0
+#MSG_SELFTEST_FANS
 "Front/left fans"
 "Front/left fans"
 "Vorderer/linke Luefter"
 "Vorderer/linke Luefter"
 
 
-#MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
+#MSG_SELFTEST_HEATERTHERMISTOR
 "Heater/Thermistor"
 "Heater/Thermistor"
 "Heizung/Thermistor"
 "Heizung/Thermistor"
 
 
-#MSG_BED_HEATING_SAFETY_DISABLED c=0 r=0
+#MSG_BED_HEATING_SAFETY_DISABLED
 "Heating disabled by safety timer."
 "Heating disabled by safety timer."
 "Heizung durch Sicherheitstimer deaktiviert."
 "Heizung durch Sicherheitstimer deaktiviert."
 
 
-#MSG_HEATING_COMPLETE c=20 r=0
+#MSG_HEATING_COMPLETE c=20
 "Heating done."
 "Heating done."
 "Aufwaermen OK."
 "Aufwaermen OK."
 
 
-#MSG_HEATING c=0 r=0
+#MSG_HEATING
 "Heating"
 "Heating"
 "Aufwaermen"
 "Aufwaermen"
 
 
@@ -458,51 +398,47 @@
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Hallo, ich bin Ihr Original Prusa i3 Drucker. Moechten Sie, dass ich Sie durch den Einrich- tungsablauf fuehre?"
 "Hallo, ich bin Ihr Original Prusa i3 Drucker. Moechten Sie, dass ich Sie durch den Einrich- tungsablauf fuehre?"
 
 
-#MSG_PRUSA3D_HOWTO c=0 r=0
+#MSG_PRUSA3D_HOWTO
 "howto.prusa3d.com"
 "howto.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#
-"Change extruder"
-"Wechsel Extruder"
-
-#MSG_FILAMENTCHANGE c=0 r=0
+#MSG_FILAMENTCHANGE
 "Change filament"
 "Change filament"
 "Filament-Wechsel"
 "Filament-Wechsel"
 
 
-#MSG_CHANGE_SUCCESS c=0 r=0
+#MSG_CHANGE_SUCCESS
 "Change success!"
 "Change success!"
 "Wechsel erfolgr.!"
 "Wechsel erfolgr.!"
 
 
-#MSG_CORRECTLY c=20 r=0
+#MSG_CORRECTLY c=20
 "Changed correctly?"
 "Changed correctly?"
 "Wechsel ok?"
 "Wechsel ok?"
 
 
-#MSG_SELFTEST_CHECK_BED c=20 r=0
+#MSG_SELFTEST_CHECK_BED c=20
 "Checking bed     "
 "Checking bed     "
 "Pruefe Bett "
 "Pruefe Bett "
 
 
-#MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
+#MSG_SELFTEST_CHECK_ENDSTOPS c=20
 "Checking endstops"
 "Checking endstops"
 "Pruefe Endschalter"
 "Pruefe Endschalter"
 
 
-#MSG_SELFTEST_CHECK_HOTEND c=20 r=0
+#MSG_SELFTEST_CHECK_HOTEND c=20
 "Checking hotend  "
 "Checking hotend  "
 "Pruefe Duese  "
 "Pruefe Duese  "
 
 
-#MSG_SELFTEST_CHECK_FSENSOR c=20 r=0
+#MSG_SELFTEST_CHECK_FSENSOR c=20
 "Checking sensors "
 "Checking sensors "
 "Pruefe Sensoren "
 "Pruefe Sensoren "
 
 
-#MSG_SELFTEST_CHECK_X c=20 r=0
+#MSG_SELFTEST_CHECK_X c=20
 "Checking X axis  "
 "Checking X axis  "
 "Pruefe X Achse "
 "Pruefe X Achse "
 
 
-#MSG_SELFTEST_CHECK_Y c=20 r=0
+#MSG_SELFTEST_CHECK_Y c=20
 "Checking Y axis  "
 "Checking Y axis  "
 "Pruefe Y Achse "
 "Pruefe Y Achse "
 
 
-#MSG_SELFTEST_CHECK_Z c=20 r=0
+#MSG_SELFTEST_CHECK_Z c=20
 "Checking Z axis  "
 "Checking Z axis  "
 "Pruefe Z Achse "
 "Pruefe Z Achse "
 
 
@@ -530,35 +466,15 @@
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "Ich werde jetzt eine Linie drucken. Waehrend des Druckes koennen Sie die Duese allmaehlich senken, indem Sie den Knopf drehen, bis Sie die optimale Hoehe erreichen. Sehen Sie sich die Bilder in unserem Handbuch im Kapitel Kalibrierung an."
 "Ich werde jetzt eine Linie drucken. Waehrend des Druckes koennen Sie die Duese allmaehlich senken, indem Sie den Knopf drehen, bis Sie die optimale Hoehe erreichen. Sehen Sie sich die Bilder in unserem Handbuch im Kapitel Kalibrierung an."
 
 
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
-"Improving bed calibration point"
-"Verbessere Bett Kalibrierpunkt"
-
-#MSG_WATCH c=0 r=0
+#MSG_WATCH
 "Info screen"
 "Info screen"
 "Infoanzeige"
 "Infoanzeige"
 
 
-#MSG_FILAMENT_LOADING_T0 c=20 r=4
-"Insert filament into extruder 1. Click when done."
-"Filament in Extruder 1 einlegen. Klicken wenn fertig."
-
-#MSG_FILAMENT_LOADING_T1 c=20 r=4
-"Insert filament into extruder 2. Click when done."
-"Filament in Extruder 2 einlegen. Klicken wenn fertig."
-
-#MSG_FILAMENT_LOADING_T2 c=20 r=4
-"Insert filament into extruder 3. Click when done."
-"Filament in Extruder 3 einlegen. Klicken wenn fertig."
-
-#MSG_FILAMENT_LOADING_T3 c=20 r=4
-"Insert filament into extruder 4. Click when done."
-"Filament in Extruder 4 einlegen. Klicken wenn fertig."
-
 #
 #
 "Is filament 1 loaded?"
 "Is filament 1 loaded?"
 "Wurde Filament 1 geladen?"
 "Wurde Filament 1 geladen?"
 
 
-#MSG_INSERT_FILAMENT c=20 r=0
+#MSG_INSERT_FILAMENT c=20
 "Insert filament"
 "Insert filament"
 "Filament einlegen"
 "Filament einlegen"
 
 
@@ -578,10 +494,6 @@
 "Is steel sheet on heatbed?"
 "Is steel sheet on heatbed?"
 "Liegt das Stahlblech auf dem Heizbett?"
 "Liegt das Stahlblech auf dem Heizbett?"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
-"Iteration "
-"\x00"
-
 #
 #
 "Last print failures"
 "Last print failures"
 "Letzte Druckfehler"
 "Letzte Druckfehler"
@@ -590,7 +502,7 @@
 "Last print"
 "Last print"
 "Letzter Druck"
 "Letzter Druck"
 
 
-#MSG_SELFTEST_EXTRUDER_FAN c=20 r=0
+#MSG_SELFTEST_EXTRUDER_FAN c=20
 "Left hotend fan?"
 "Left hotend fan?"
 "Linker Luefter?"
 "Linker Luefter?"
 
 
@@ -606,19 +518,19 @@
 "Lin. correction"
 "Lin. correction"
 "Lineare Korrektur"
 "Lineare Korrektur"
 
 
-#MSG_BABYSTEP_Z c=0 r=0
+#MSG_BABYSTEP_Z
 "Live adjust Z"
 "Live adjust Z"
 "Z einstellen"
 "Z einstellen"
 
 
-#MSG_LOAD_FILAMENT c=17 r=0
+#MSG_LOAD_FILAMENT c=17
 "Load filament"
 "Load filament"
 "Filament laden"
 "Filament laden"
 
 
-#MSG_LOADING_COLOR c=0 r=0
+#MSG_LOADING_COLOR
 "Loading color"
 "Loading color"
 "Lade Farbe"
 "Lade Farbe"
 
 
-#MSG_LOADING_FILAMENT c=20 r=0
+#MSG_LOADING_FILAMENT c=20
 "Loading filament"
 "Loading filament"
 "Filament laedt"
 "Filament laedt"
 
 
@@ -634,15 +546,15 @@
 "M117 First layer cal."
 "M117 First layer cal."
 "M117 Erste-Schicht Kal."
 "M117 Erste-Schicht Kal."
 
 
-#MSG_MAIN c=0 r=0
+#MSG_MAIN
 "Main"
 "Main"
 "Hauptmenue"
 "Hauptmenue"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60
 "Measuring reference height of calibration point"
 "Measuring reference height of calibration point"
 "Messen der Referenzhoehe des Kalibrierpunktes"
 "Messen der Referenzhoehe des Kalibrierpunktes"
 
 
-#MSG_MESH_BED_LEVELING c=0 r=0
+#MSG_MESH_BED_LEVELING
 "Mesh Bed Leveling"
 "Mesh Bed Leveling"
 "Mesh Bett Ausgleich"
 "Mesh Bett Ausgleich"
 
 
@@ -674,11 +586,11 @@
 "MMU OK. Resuming..."
 "MMU OK. Resuming..."
 "MMU OK.  Weiterdrucken..."
 "MMU OK.  Weiterdrucken..."
 
 
-#MSG_STEALTH_MODE_OFF c=0 r=0
+#MSG_STEALTH_MODE_OFF
 "Mode     [Normal]"
 "Mode     [Normal]"
 "Modus    [Normal]"
 "Modus    [Normal]"
 
 
-#MSG_SILENT_MODE_ON c=0 r=0
+#MSG_SILENT_MODE_ON
 "Mode     [silent]"
 "Mode     [silent]"
 "Modus     [leise]"
 "Modus     [leise]"
 
 
@@ -690,15 +602,15 @@
 "MMU power fails"
 "MMU power fails"
 "MMU Netzfehler"
 "MMU Netzfehler"
 
 
-#MSG_STEALTH_MODE_ON c=0 r=0
+#MSG_STEALTH_MODE_ON
 "Mode    [Stealth]"
 "Mode    [Stealth]"
 "Modus   [Stealth]"
 "Modus   [Stealth]"
 
 
-#MSG_AUTO_MODE_ON c=0 r=0
+#MSG_AUTO_MODE_ON
 "Mode [auto power]"
 "Mode [auto power]"
 "Modus[Auto Power]"
 "Modus[Auto Power]"
 
 
-#MSG_SILENT_MODE_OFF c=0 r=0
+#MSG_SILENT_MODE_OFF
 "Mode [high power]"
 "Mode [high power]"
 "Modus[Hohe Leist]"
 "Modus[Hohe Leist]"
 
 
@@ -706,31 +618,31 @@
 "MMU2 connected"
 "MMU2 connected"
 "MMU2 verbunden"
 "MMU2 verbunden"
 
 
-#MSG_SELFTEST_MOTOR c=0 r=0
+#MSG_SELFTEST_MOTOR
 "Motor"
 "Motor"
 "\x00"
 "\x00"
 
 
-#MSG_MOVE_AXIS c=0 r=0
+#MSG_MOVE_AXIS
 "Move axis"
 "Move axis"
 "Achse bewegen"
 "Achse bewegen"
 
 
-#MSG_MOVE_X c=0 r=0
+#MSG_MOVE_X
 "Move X"
 "Move X"
 "Bewege X"
 "Bewege X"
 
 
-#MSG_MOVE_Y c=0 r=0
+#MSG_MOVE_Y
 "Move Y"
 "Move Y"
 "Bewege Y"
 "Bewege Y"
 
 
-#MSG_MOVE_Z c=0 r=0
+#MSG_MOVE_Z
 "Move Z"
 "Move Z"
 "Bewege Z"
 "Bewege Z"
 
 
-#MSG_NO_MOVE c=0 r=0
+#MSG_NO_MOVE
 "No move."
 "No move."
 "Keine Bewegung."
 "Keine Bewegung."
 
 
-#MSG_NO_CARD c=0 r=0
+#MSG_NO_CARD
 "No SD card"
 "No SD card"
 "Keine SD Karte"
 "Keine SD Karte"
 
 
@@ -738,11 +650,11 @@
 "N/A"
 "N/A"
 "N.V."
 "N.V."
 
 
-#MSG_NO c=0 r=0
+#MSG_NO
 "No"
 "No"
 "Nein"
 "Nein"
 
 
-#MSG_SELFTEST_NOTCONNECTED c=0 r=0
+#MSG_SELFTEST_NOTCONNECTED
 "Not connected"
 "Not connected"
 "Nicht angeschlossen"
 "Nicht angeschlossen"
 
 
@@ -750,11 +662,7 @@
 "New firmware version available:"
 "New firmware version available:"
 "Neue Firmware- Version verfuegbar:"
 "Neue Firmware- Version verfuegbar:"
 
 
-#
-"No "
-"Nein"
-
-#MSG_SELFTEST_FAN_NO c=19 r=0
+#MSG_SELFTEST_FAN_NO c=19
 "Not spinning"
 "Not spinning"
 "Dreht sich nicht"
 "Dreht sich nicht"
 
 
@@ -766,7 +674,7 @@
 "Now I will preheat nozzle for PLA."
 "Now I will preheat nozzle for PLA."
 "Jetzt werde ich die Duese fuer PLA vorheizen."
 "Jetzt werde ich die Duese fuer PLA vorheizen."
 
 
-#MSG_NOZZLE c=0 r=0
+#MSG_NOZZLE
 "Nozzle"
 "Nozzle"
 "Duese"
 "Duese"
 
 
@@ -782,7 +690,7 @@
 "Nozzle FAN"
 "Nozzle FAN"
 "Duesen Luefter"
 "Duesen Luefter"
 
 
-#MSG_PAUSE_PRINT c=0 r=0
+#MSG_PAUSE_PRINT
 "Pause print"
 "Pause print"
 "Druck pausieren"
 "Druck pausieren"
 
 
@@ -814,7 +722,7 @@
 "Please clean the nozzle for calibration. Click when done."
 "Please clean the nozzle for calibration. Click when done."
 "Bitte entfernen Sie ueberstehendes Filament von der Duese. Klicken wenn sauber."
 "Bitte entfernen Sie ueberstehendes Filament von der Duese. Klicken wenn sauber."
 
 
-#MSG_SELFTEST_PLEASECHECK c=0 r=0
+#MSG_SELFTEST_PLEASECHECK
 "Please check :"
 "Please check :"
 "Bitte pruefe:"
 "Bitte pruefe:"
 
 
@@ -866,7 +774,7 @@
 "Please update firmware in your MMU2. Waiting for reset."
 "Please update firmware in your MMU2. Waiting for reset."
 "Bitte aktualisieren Sie die Firmware in der MMU2. Warte auf Reset."
 "Bitte aktualisieren Sie die Firmware in der MMU2. Warte auf Reset."
 
 
-#MSG_PLEASE_WAIT c=20 r=0
+#MSG_PLEASE_WAIT c=20
 "Please wait"
 "Please wait"
 "Bitte warten"
 "Bitte warten"
 
 
@@ -874,11 +782,11 @@
 "Please remove shipping helpers first."
 "Please remove shipping helpers first."
 "Bitte zuerst Transportsicherungen entfernen."
 "Bitte zuerst Transportsicherungen entfernen."
 
 
-#MSG_PREHEAT_NOZZLE c=20 r=0
+#MSG_PREHEAT_NOZZLE c=20
 "Preheat the nozzle!"
 "Preheat the nozzle!"
 "Duese vorheizen!"
 "Duese vorheizen!"
 
 
-#MSG_PREHEAT c=0 r=0
+#MSG_PREHEAT
 "Preheat"
 "Preheat"
 "Vorheizen"
 "Vorheizen"
 
 
@@ -898,7 +806,7 @@
 "Power failures"
 "Power failures"
 "Netzfehler"
 "Netzfehler"
 
 
-#MSG_PRINT_ABORTED c=20 r=0
+#MSG_PRINT_ABORTED c=20
 "Print aborted"
 "Print aborted"
 "Druck abgebrochen"
 "Druck abgebrochen"
 
 
@@ -910,11 +818,11 @@
 "Preheating to unload"
 "Preheating to unload"
 "Heizen zum Entladen"
 "Heizen zum Entladen"
 
 
-#MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_PRINT_FAN_SPEED c=18
 "Print fan:"
 "Print fan:"
 "Druckvent.:"
 "Druckvent.:"
 
 
-#MSG_CARD_MENU c=0 r=0
+#MSG_CARD_MENU
 "Print from SD"
 "Print from SD"
 "Drucken von SD"
 "Drucken von SD"
 
 
@@ -938,15 +846,7 @@
 "Print FAN"
 "Print FAN"
 "Druckluefter"
 "Druckluefter"
 
 
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK2.5 ready."
-"Prusa i3 MK2.5 bereit."
-
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK3 ready."
-"Prusa i3 MK3 bereit."
-
-#MSG_PRUSA3D c=0 r=0
+#MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
 "\x00"
 "\x00"
 
 
@@ -966,19 +866,15 @@
 "Prusa i3 MK3S OK."
 "Prusa i3 MK3S OK."
 "\x00"
 "\x00"
 
 
-#
-"Prusa i3 MK2 ready."
-"Prusa i3 MK2 bereit."
-
-#MSG_CALIBRATE_BED_RESET c=0 r=0
+#MSG_CALIBRATE_BED_RESET
 "Reset XYZ calibr."
 "Reset XYZ calibr."
 "XYZ Kalibr. zuruecksetzen."
 "XYZ Kalibr. zuruecksetzen."
 
 
-#MSG_BED_CORRECTION_RESET c=0 r=0
+#MSG_BED_CORRECTION_RESET
 "Reset"
 "Reset"
 "Ruecksetzen"
 "Ruecksetzen"
 
 
-#MSG_RESUME_PRINT c=0 r=0
+#MSG_RESUME_PRINT
 "Resume print"
 "Resume print"
 "Druck fortsetzen"
 "Druck fortsetzen"
 
 
@@ -1014,31 +910,31 @@
 "Right"
 "Right"
 "Rechts"
 "Rechts"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
+#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60
 "Searching bed calibration point"
 "Searching bed calibration point"
 "Suche Bett Kalibrierpunkt"
 "Suche Bett Kalibrierpunkt"
 
 
-#MSG_LANGUAGE_SELECT c=0 r=0
+#MSG_LANGUAGE_SELECT
 "Select language"
 "Select language"
 "Waehle Sprache"
 "Waehle Sprache"
 
 
-#MSG_SELFTEST_OK c=0 r=0
+#MSG_SELFTEST_OK
 "Self test OK"
 "Self test OK"
 "Selbsttest OK"
 "Selbsttest OK"
 
 
-#MSG_SELFTEST_START c=20 r=0
+#MSG_SELFTEST_START c=20
 "Self test start  "
 "Self test start  "
 "Selbsttest start "
 "Selbsttest start "
 
 
-#MSG_SELFTEST c=0 r=0
+#MSG_SELFTEST
 "Selftest         "
 "Selftest         "
 "Selbsttest "
 "Selbsttest "
 
 
-#MSG_SELFTEST_ERROR c=0 r=0
+#MSG_SELFTEST_ERROR
 "Selftest error !"
 "Selftest error !"
 "Selbsttest Fehler!"
 "Selbsttest Fehler!"
 
 
-#MSG_SELFTEST_FAILED c=20 r=0
+#MSG_SELFTEST_FAILED c=20
 "Selftest failed  "
 "Selftest failed  "
 "Selbsttest misslung  "
 "Selbsttest misslung  "
 
 
@@ -1058,7 +954,7 @@
 "Set temperature:"
 "Set temperature:"
 "Temp. einstellen:"
 "Temp. einstellen:"
 
 
-#MSG_SETTINGS c=0 r=0
+#MSG_SETTINGS
 "Settings"
 "Settings"
 "Einstellungen"
 "Einstellungen"
 
 
@@ -1070,33 +966,25 @@
 "Sensor state"
 "Sensor state"
 "Sensorstatus"
 "Sensorstatus"
 
 
-#
-"Sensors info"
-"Sensoren Info"
-
-#
-"Show pinda state"
-"Pinda-Status anzeigen"
-
 #MSG_FILE_CNT c=20 r=4
 #MSG_FILE_CNT c=20 r=4
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Einige Dateien wur- den nicht sortiert. Max. Dateien pro Verzeichnis = 100."
 "Einige Dateien wur- den nicht sortiert. Max. Dateien pro Verzeichnis = 100."
 
 
 #MSG_SORT_NONE c=17 r=1
 #MSG_SORT_NONE c=17 r=1
-"Sort:      [none]"
-"Sort.:    [Keine]"
+"Sort       [none]"
+"Sort.     [Keine]"
 
 
 #MSG_SORT_TIME c=17 r=1
 #MSG_SORT_TIME c=17 r=1
-"Sort:      [time]"
-"Sort.:     [Zeit]"
+"Sort       [time]"
+"Sort.      [Zeit]"
 
 
 #
 #
 "Severe skew"
 "Severe skew"
 "Schwerer Schraeglauf"
 "Schwerer Schraeglauf"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
-"Sort:  [alphabet]"
-"Sort.: [Alphabet]"
+"Sort   [alphabet]"
+"Sort.  [Alphabet]"
 
 
 #MSG_SORTING c=20 r=1
 #MSG_SORTING c=20 r=1
 "Sorting files"
 "Sorting files"
@@ -1126,11 +1014,11 @@
 "Sound    [silent]"
 "Sound    [silent]"
 "Sound     [leise]"
 "Sound     [leise]"
 
 
-#MSG_SPEED c=0 r=0
+#MSG_SPEED
 "Speed"
 "Speed"
 "Geschwindigkeit"
 "Geschwindigkeit"
 
 
-#MSG_SELFTEST_FAN_YES c=19 r=0
+#MSG_SELFTEST_FAN_YES c=19
 "Spinning"
 "Spinning"
 "Dreht sich"
 "Dreht sich"
 
 
@@ -1138,23 +1026,23 @@
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Stabile Umgebungs- temperatur 21-26C und feste Stand- flaeche erforderlich"
 "Stabile Umgebungs- temperatur 21-26C und feste Stand- flaeche erforderlich"
 
 
-#MSG_STATISTICS c=0 r=0
+#MSG_STATISTICS
 "Statistics  "
 "Statistics  "
 "Statistiken "
 "Statistiken "
 
 
-#MSG_STOP_PRINT c=0 r=0
+#MSG_STOP_PRINT
 "Stop print"
 "Stop print"
 "Druck abbrechen"
 "Druck abbrechen"
 
 
-#MSG_STOPPED c=0 r=0
+#MSG_STOPPED
 "STOPPED. "
 "STOPPED. "
 "GESTOPPT. "
 "GESTOPPT. "
 
 
-#MSG_SUPPORT c=0 r=0
+#MSG_SUPPORT
 "Support"
 "Support"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_SWAPPED c=0 r=0
+#MSG_SELFTEST_SWAPPED
 "Swapped"
 "Swapped"
 "Ausgetauscht"
 "Ausgetauscht"
 
 
@@ -1182,7 +1070,7 @@
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Temp.kalibrierung ist fertig + aktiv. Temp.kalibrierung kann ausgeschaltet werden im Menu Einstellungen -> Temp.kal."
 "Temp.kalibrierung ist fertig + aktiv. Temp.kalibrierung kann ausgeschaltet werden im Menu Einstellungen -> Temp.kal."
 
 
-#MSG_TEMPERATURE c=0 r=0
+#MSG_TEMPERATURE
 "Temperature"
 "Temperature"
 "Temperatur"
 "Temperatur"
 
 
@@ -1202,7 +1090,7 @@
 "Total print time"
 "Total print time"
 "Gesamte Druckzeit"
 "Gesamte Druckzeit"
 
 
-#MSG_TUNE c=0 r=0
+#MSG_TUNE
 "Tune"
 "Tune"
 "Feineinstellung"
 "Feineinstellung"
 
 
@@ -1210,10 +1098,6 @@
 "Unload"
 "Unload"
 "Entladen"
 "Entladen"
 
 
-#
-"Unload all"
-"Alles entladen"
-
 #
 #
 "Total failures"
 "Total failures"
 "Gesamte Fehler"
 "Gesamte Fehler"
@@ -1226,7 +1110,7 @@
 "to unload filament"
 "to unload filament"
 "zum Filament entladen"
 "zum Filament entladen"
 
 
-#MSG_UNLOAD_FILAMENT c=17 r=0
+#MSG_UNLOAD_FILAMENT c=17
 "Unload filament"
 "Unload filament"
 "Filament entladen"
 "Filament entladen"
 
 
@@ -1250,7 +1134,7 @@
 "unknown"
 "unknown"
 "unbekannt"
 "unbekannt"
 
 
-#MSG_USERWAIT c=0 r=0
+#MSG_USERWAIT
 "Wait for user..."
 "Wait for user..."
 "Warte auf Benutzer.."
 "Warte auf Benutzer.."
 
 
@@ -1282,7 +1166,7 @@
 "Was filament unload successful?"
 "Was filament unload successful?"
 "Konnten Sie das Filament entnehmen?"
 "Konnten Sie das Filament entnehmen?"
 
 
-#MSG_SELFTEST_WIRINGERROR c=0 r=0
+#MSG_SELFTEST_WIRINGERROR
 "Wiring error"
 "Wiring error"
 "Verdrahtungsfehler"
 "Verdrahtungsfehler"
 
 
@@ -1298,7 +1182,7 @@
 "XYZ calibration failed. Please consult the manual."
 "XYZ calibration failed. Please consult the manual."
 "XYZ-Kalibrierung fehlgeschlagen. Bitte schauen Sie in das Handbuch."
 "XYZ-Kalibrierung fehlgeschlagen. Bitte schauen Sie in das Handbuch."
 
 
-#MSG_YES c=0 r=0
+#MSG_YES
 "Yes"
 "Yes"
 "Ja"
 "Ja"
 
 
@@ -1315,8 +1199,8 @@
 "XYZ Kalibrierung in Ordnung. X/Y Achsen sind etwas schraeg."
 "XYZ Kalibrierung in Ordnung. X/Y Achsen sind etwas schraeg."
 
 
 #
 #
-"X-correct"
-"X-Korrektur"
+"X-correct:"
+"X-Korrektur:"
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
@@ -1330,18 +1214,10 @@
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ-Kalibrierung beeintraechtigt. Rechter vorderer Kalibrierpunkt nicht erreichbar."
 "XYZ-Kalibrierung beeintraechtigt. Rechter vorderer Kalibrierpunkt nicht erreichbar."
 
 
-#MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-"XYZ calibration compromised. Left front calibration point not reachable."
-"XYZ-Kalibrierung beeintraechtigt. Linker vorderer Kalibrierpunkt nicht erreichbar."
-
-#MSG_LOAD_ALL c=17 r=0
+#MSG_LOAD_ALL c=17
 "Load all"
 "Load all"
 "Alle laden"
 "Alle laden"
 
 
-#MSG_LOAD_FILAMENT_1 c=17 r=0
-"Load filament 1"
-"Filament 1 laden"
-
 #
 #
 "XYZ calibration failed. Bed calibration point was not found."
 "XYZ calibration failed. Bed calibration point was not found."
 "XYZ-Kalibrierung fehlgeschlagen. Bett-Kalibrierpunkt nicht gefunden."
 "XYZ-Kalibrierung fehlgeschlagen. Bett-Kalibrierpunkt nicht gefunden."
@@ -1350,38 +1226,19 @@
 "XYZ calibration failed. Front calibration points not reachable."
 "XYZ calibration failed. Front calibration points not reachable."
 "XYZ-Kalibrierung fehlgeschlagen. Vordere Kalibrierpunkte nicht erreichbar."
 "XYZ-Kalibrierung fehlgeschlagen. Vordere Kalibrierpunkte nicht erreichbar."
 
 
-#
-"XYZ calibration failed. Left front calibration point not reachable."
-"XYZ-Kalibrierung fehlgeschlagen. Linker vorderer Kalibrierpunkt nicht erreichbar."
-
-#MSG_LOAD_FILAMENT_2 c=17 r=0
-"Load filament 2"
-"Filament 2 laden"
-
 #
 #
 "XYZ calibration failed. Right front calibration point not reachable."
 "XYZ calibration failed. Right front calibration point not reachable."
 "XYZ-Kalibrierung fehlgeschlagen. Rechter vorderer Kalibrierpunkt ist nicht erreichbar."
 "XYZ-Kalibrierung fehlgeschlagen. Rechter vorderer Kalibrierpunkt ist nicht erreichbar."
 
 
-#MSG_LOAD_FILAMENT_3 c=17 r=0
-"Load filament 3"
-"Filament 3 laden"
 
 
 #
 #
 "Y distance from min"
 "Y distance from min"
 "Y Entfernung vom Min"
 "Y Entfernung vom Min"
 
 
 #
 #
-"Y-correct"
-"Y-Korrektur"
-
-#MSG_LOAD_FILAMENT_4 c=17 r=0
-"Load filament 4"
-"Filament 4 laden"
-
-#MSG_LOAD_FILAMENT_5 c=17 r=0
-"Load filament 5"
-"Filament 5 laden"
+"Y-correct:"
+"Y-Korrektur:"
 
 
-#MSG_OFF c=0 r=0
+#MSG_OFF
 " [off]"
 " [off]"
 "\x00"
 "\x00"

+ 134 - 278
lang/lang_en_es.txt

@@ -1,12 +1,12 @@
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
+#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
 " of 4"
 " of 4"
 " de 4"
 " de 4"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14
 " of 9"
 " of 9"
 " de 9"
 " de 9"
 
 
-#MSG_MEASURED_OFFSET c=0 r=0
+#MSG_MEASURED_OFFSET
 "[0;0] point offset"
 "[0;0] point offset"
 "[0;0] punto offset"
 "[0;0] punto offset"
 
 
@@ -22,11 +22,11 @@
 ">Cancel"
 ">Cancel"
 ">Cancelar"
 ">Cancelar"
 
 
-#MSG_BABYSTEPPING_Z c=20 r=0
-"Adjusting Z"
-"Ajustar Z"
+#MSG_BABYSTEPPING_Z c=15
+"Adjusting Z:"
+"Ajustar Z:"
 
 
-#MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
+#MSG_SELFTEST_CHECK_ALLCORRECT c=20
 "All correct      "
 "All correct      "
 "Todo bien"
 "Todo bien"
 
 
@@ -38,7 +38,7 @@
 "Ambient"
 "Ambient"
 "Ambiente"
 "Ambiente"
 
 
-#MSG_PRESS c=20 r=0
+#MSG_PRESS c=20
 "and press the knob"
 "and press the knob"
 "Haz clic"
 "Haz clic"
 
 
@@ -54,15 +54,15 @@
 "SpoolJoin   [N/A]"
 "SpoolJoin   [N/A]"
 "\x00"
 "\x00"
 
 
-# MSG_AUTO_DEPLETE_OFF c=17 r=1
+#MSG_AUTO_DEPLETE_OFF c=17 r=1
 "SpoolJoin   [off]"
 "SpoolJoin   [off]"
 "\x00"
 "\x00"
 
 
-#MSG_AUTO_HOME c=0 r=0
+#MSG_AUTO_HOME
 "Auto home"
 "Auto home"
 "Llevar al origen"
 "Llevar al origen"
 
 
-#MSG_AUTOLOAD_FILAMENT c=17 r=0
+#MSG_AUTOLOAD_FILAMENT c=17
 "AutoLoad filament"
 "AutoLoad filament"
 "Carga automatica de filamento"
 "Carga automatica de filamento"
 
 
@@ -74,27 +74,27 @@
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 "La carga automatica de filamento esta activada, pulse el dial e inserte el filamento..."
 "La carga automatica de filamento esta activada, pulse el dial e inserte el filamento..."
 
 
-#MSG_SELFTEST_AXIS_LENGTH c=0 r=0
+#MSG_SELFTEST_AXIS_LENGTH
 "Axis length"
 "Axis length"
 "Longitud del eje"
 "Longitud del eje"
 
 
-#MSG_SELFTEST_AXIS c=0 r=0
+#MSG_SELFTEST_AXIS
 "Axis"
 "Axis"
 "Eje"
 "Eje"
 
 
-#MSG_SELFTEST_BEDHEATER c=0 r=0
+#MSG_SELFTEST_BEDHEATER
 "Bed / Heater"
 "Bed / Heater"
 "Base / Calentador"
 "Base / Calentador"
 
 
-#MSG_BED_DONE c=0 r=0
+#MSG_BED_DONE
 "Bed done"
 "Bed done"
 "Base preparada"
 "Base preparada"
 
 
-#MSG_BED_HEATING c=0 r=0
+#MSG_BED_HEATING
 "Bed Heating"
 "Bed Heating"
 "Calentando Base"
 "Calentando Base"
 
 
-#MSG_BED_CORRECTION_MENU c=0 r=0
+#MSG_BED_CORRECTION_MENU
 "Bed level correct"
 "Bed level correct"
 "Corr. de la cama"
 "Corr. de la cama"
 
 
@@ -102,15 +102,7 @@
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Nivelacion fallada. Sensor no funciona. Restos en boquilla? Esperando reset."
 "Nivelacion fallada. Sensor no funciona. Restos en boquilla? Esperando reset."
 
 
-#MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED c=20 r=4
-"Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset."
-"Nivelacion fallada. Sensor desconectado o cables danados. Esperando reset."
-
-#MSG_BED_LEVELING_FAILED_POINT_HIGH c=20 r=4
-"Bed leveling failed. Sensor triggered too high. Waiting for reset."
-"Nivelacion fallada. Sensor funciona demasiado pronto. Esperando reset."
-
-#MSG_BED c=0 r=0
+#MSG_BED
 "Bed"
 "Bed"
 "Base calefactable "
 "Base calefactable "
 
 
@@ -126,11 +118,11 @@
 "Calibrating home"
 "Calibrating home"
 "Calibrando posicion inicial"
 "Calibrando posicion inicial"
 
 
-#MSG_CALIBRATE_BED c=0 r=0
+#MSG_CALIBRATE_BED
 "Calibrate XYZ"
 "Calibrate XYZ"
 "Calibrar XYZ"
 "Calibrar XYZ"
 
 
-#MSG_HOMEYZ c=0 r=0
+#MSG_HOMEYZ
 "Calibrate Z"
 "Calibrate Z"
 "Calibrar Z"
 "Calibrar Z"
 
 
@@ -150,11 +142,11 @@
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrando Z. Gira el dial para subir el extrusor hasta tocar los topes superiores. Despues haz clic."
 "Calibrando Z. Gira el dial para subir el extrusor hasta tocar los topes superiores. Despues haz clic."
 
 
-#MSG_HOMEYZ_DONE c=0 r=0
+#MSG_HOMEYZ_DONE
 "Calibration done"
 "Calibration done"
 "Calibracion OK"
 "Calibracion OK"
 
 
-#MSG_MENU_CALIBRATION c=0 r=0
+#MSG_MENU_CALIBRATION
 "Calibration"
 "Calibration"
 "Calibracion"
 "Calibracion"
 
 
@@ -162,19 +154,15 @@
 "Cancel"
 "Cancel"
 "Cancelar"
 "Cancelar"
 
 
-#MSG_SD_INSERTED c=0 r=0
-"Card inserted"
-"Tarjeta insertada"
-
-#MSG_SD_REMOVED c=0 r=0
+#MSG_SD_REMOVED
 "Card removed"
 "Card removed"
 "Tarjeta retirada"
 "Tarjeta retirada"
 
 
-#MSG_NOT_COLOR c=0 r=0
+#MSG_NOT_COLOR
 "Color not correct"
 "Color not correct"
 "Color no homogeneo"
 "Color no homogeneo"
 
 
-#MSG_COOLDOWN c=0 r=0
+#MSG_COOLDOWN
 "Cooldown"
 "Cooldown"
 "Enfriar"
 "Enfriar"
 
 
@@ -182,15 +170,15 @@
 "Copy selected language?"
 "Copy selected language?"
 "Copiar idioma seleccionado?"
 "Copiar idioma seleccionado?"
 
 
-#MSG_CRASHDETECT_ON c=0 r=0
+#MSG_CRASHDETECT_ON
 "Crash det.   [on]"
 "Crash det.   [on]"
 "Det. choque [act]"
 "Det. choque [act]"
 
 
-#MSG_CRASHDETECT_NA c=0 r=0
+#MSG_CRASHDETECT_NA
 "Crash det.  [N/A]"
 "Crash det.  [N/A]"
 "Dec. choque [N/D]"
 "Dec. choque [N/D]"
 
 
-#MSG_CRASHDETECT_OFF c=0 r=0
+#MSG_CRASHDETECT_OFF
 "Crash det.  [off]"
 "Crash det.  [off]"
 "Det. choque [ina]"
 "Det. choque [ina]"
 
 
@@ -214,7 +202,7 @@
 "Date:"
 "Date:"
 "Fecha:"
 "Fecha:"
 
 
-#MSG_DISABLE_STEPPERS c=0 r=0
+#MSG_DISABLE_STEPPERS
 "Disable steppers"
 "Disable steppers"
 "Apagar motores"
 "Apagar motores"
 
 
@@ -226,34 +214,14 @@
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Quieres repetir el ultimo paso para reajustar la distancia boquilla-base?"
 "Quieres repetir el ultimo paso para reajustar la distancia boquilla-base?"
 
 
-#MSG_EXTRUDER_CORRECTION c=9 r=0
-"E-correct"
-"E-correcion"
+#MSG_EXTRUDER_CORRECTION c=10
+"E-correct:"
+"E-correcion:"
 
 
 #MSG_EJECT_FILAMENT c=17 r=1
 #MSG_EJECT_FILAMENT c=17 r=1
 "Eject filament"
 "Eject filament"
 "Expulsar filamento"
 "Expulsar filamento"
 
 
-#MSG_EJECT_FILAMENT1 c=17 r=1
-"Eject filament 1"
-"Expulsar filamento 1"
-
-#MSG_EJECT_FILAMENT2 c=17 r=1
-"Eject filament 2"
-"Expulsar filamento 2"
-
-#MSG_EJECT_FILAMENT3 c=17 r=1
-"Eject filament 3"
-"Expulsar filamento 3"
-
-#MSG_EJECT_FILAMENT4 c=17 r=1
-"Eject filament 4"
-"Expulsar filamento 4"
-
-#MSG_EJECT_FILAMENT5 c=17 r=1
-"Eject filament 5"
-"Expulsar filamento 5"
-
 #
 #
 "Eject"
 "Eject"
 "Expulsar"
 "Expulsar"
@@ -266,11 +234,11 @@
 "Endstop not hit"
 "Endstop not hit"
 "Endstop no alcanzado"
 "Endstop no alcanzado"
 
 
-#MSG_SELFTEST_ENDSTOP c=0 r=0
+#MSG_SELFTEST_ENDSTOP
 "Endstop"
 "Endstop"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_ENDSTOPS c=0 r=0
+#MSG_SELFTEST_ENDSTOPS
 "Endstops"
 "Endstops"
 "\x00"
 "\x00"
 
 
@@ -282,31 +250,11 @@
 "ERROR: Filament sensor is not responding, please check connection."
 "ERROR: Filament sensor is not responding, please check connection."
 "ERROR: El sensor de filamento no responde, por favor comprueba la conexion."
 "ERROR: El sensor de filamento no responde, por favor comprueba la conexion."
 
 
-#MSG_ERROR c=0 r=0
+#MSG_ERROR
 "ERROR:"
 "ERROR:"
 "\x00"
 "\x00"
 
 
-#
-"External SPI flash W25X20CL not responding."
-"No responde el flasheo externo SPI W25X20CL"
-
-#
-"Extruder 1"
-"Extrusor 1"
-
-#
-"Extruder 2"
-"Extrusor 2"
-
-#
-"Extruder 3"
-"Extrusor 3"
-
-#
-"Extruder 4"
-"Extrusor 4"
-
-#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 "Extruder fan:"
 "Extruder fan:"
 "Ventilador del extrusor:"
 "Ventilador del extrusor:"
 
 
@@ -314,7 +262,7 @@
 "Extruder info"
 "Extruder info"
 "Informacion del extrusor"
 "Informacion del extrusor"
 
 
-#MSG_MOVE_E c=0 r=0
+#MSG_MOVE_E
 "Extruder"
 "Extruder"
 "Extruir"
 "Extruir"
 
 
@@ -338,11 +286,11 @@
 "Fail stats"
 "Fail stats"
 "Estadistica de fallos"
 "Estadistica de fallos"
 
 
-#MSG_FAN_SPEED c=14 r=0
+#MSG_FAN_SPEED c=14
 "Fan speed"
 "Fan speed"
 "Velocidad Vent."
 "Velocidad Vent."
 
 
-#MSG_SELFTEST_FAN c=20 r=0
+#MSG_SELFTEST_FAN c=20
 "Fan test"
 "Fan test"
 "Test ventiladores"
 "Test ventiladores"
 
 
@@ -354,19 +302,15 @@
 "Fans check  [off]"
 "Fans check  [off]"
 "Comprob.vent[ina]"
 "Comprob.vent[ina]"
 
 
-#MSG_FSENSOR_ON c=0 r=0
+#MSG_FSENSOR_ON
 "Fil. sensor  [on]"
 "Fil. sensor  [on]"
 "Sensor Fil. [act]"
 "Sensor Fil. [act]"
 
 
-#MSG_RESPONSE_POOR c=20 r=2
-"Fil. sensor response is poor, disable it?"
-"La respuesta del sensor de fil es deficiente, ?desactivarlo?"
-
-#MSG_FSENSOR_NA c=0 r=0
+#MSG_FSENSOR_NA
 "Fil. sensor [N/A]"
 "Fil. sensor [N/A]"
 "Sensor Fil. [N/D]"
 "Sensor Fil. [N/D]"
 
 
-#MSG_FSENSOR_OFF c=0 r=0
+#MSG_FSENSOR_OFF
 "Fil. sensor [off]"
 "Fil. sensor [off]"
 "Sensor Fil. [ina]"
 "Sensor Fil. [ina]"
 
 
@@ -378,18 +322,14 @@
 "Filament extruding & with correct color?"
 "Filament extruding & with correct color?"
 "Es nitido el color nuevo?"
 "Es nitido el color nuevo?"
 
 
-#MSG_NOT_LOADED c=19 r=0
+#MSG_NOT_LOADED c=19
 "Filament not loaded"
 "Filament not loaded"
 "Fil. no introducido"
 "Fil. no introducido"
 
 
-#MSG_FILAMENT_SENSOR c=20 r=0
+#MSG_FILAMENT_SENSOR c=20
 "Filament sensor"
 "Filament sensor"
 "Sensor de filamento"
 "Sensor de filamento"
 
 
-#MSG_SELFTEST_FILAMENT_SENSOR c=18 r=0
-"Filament sensor:"
-"Sensor de filamento:"
-
 #MSG_FILAMENT_USED c=19 r=1
 #MSG_FILAMENT_USED c=19 r=1
 "Filament used"
 "Filament used"
 "Filamento usado"
 "Filamento usado"
@@ -418,15 +358,15 @@
 "Fix the issue and then press button on MMU unit."
 "Fix the issue and then press button on MMU unit."
 "Corrige el problema y pulsa el boton en la unidad MMU."
 "Corrige el problema y pulsa el boton en la unidad MMU."
 
 
-#MSG_FLOW c=0 r=0
+#MSG_FLOW
 "Flow"
 "Flow"
 "Flujo"
 "Flujo"
 
 
-#MSG_PRUSA3D_FORUM c=0 r=0
+#MSG_PRUSA3D_FORUM
 "forum.prusa3d.com"
 "forum.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_COOLING_FAN c=20 r=0
+#MSG_SELFTEST_COOLING_FAN c=20
 "Front print fan?"
 "Front print fan?"
 "Vent. frontal?"
 "Vent. frontal?"
 
 
@@ -434,23 +374,23 @@
 "Front side[um]"
 "Front side[um]"
 "Frontal [um]"
 "Frontal [um]"
 
 
-#MSG_SELFTEST_FANS c=0 r=0
+#MSG_SELFTEST_FANS
 "Front/left fans"
 "Front/left fans"
 "Ventiladores frontal/izquierdo"
 "Ventiladores frontal/izquierdo"
 
 
-#MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
+#MSG_SELFTEST_HEATERTHERMISTOR
 "Heater/Thermistor"
 "Heater/Thermistor"
 "Calentador/Termistor"
 "Calentador/Termistor"
 
 
-#MSG_BED_HEATING_SAFETY_DISABLED c=0 r=0
+#MSG_BED_HEATING_SAFETY_DISABLED
 "Heating disabled by safety timer."
 "Heating disabled by safety timer."
 "Calentadores desactivados por el temporizador de seguridad."
 "Calentadores desactivados por el temporizador de seguridad."
 
 
-#MSG_HEATING_COMPLETE c=20 r=0
+#MSG_HEATING_COMPLETE c=20
 "Heating done."
 "Heating done."
 "Calentamiento acabado."
 "Calentamiento acabado."
 
 
-#MSG_HEATING c=0 r=0
+#MSG_HEATING
 "Heating"
 "Heating"
 "Calentando..."
 "Calentando..."
 
 
@@ -458,51 +398,47 @@
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Hola, soy tu impresora Original Prusa i3. Quieres que te guie a traves de la configuracion?"
 "Hola, soy tu impresora Original Prusa i3. Quieres que te guie a traves de la configuracion?"
 
 
-#MSG_PRUSA3D_HOWTO c=0 r=0
+#MSG_PRUSA3D_HOWTO
 "howto.prusa3d.com"
 "howto.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#
-"Change extruder"
-"Cambiar extrusor."
-
-#MSG_FILAMENTCHANGE c=0 r=0
+#MSG_FILAMENTCHANGE
 "Change filament"
 "Change filament"
 "Cambiar filamento"
 "Cambiar filamento"
 
 
-#MSG_CHANGE_SUCCESS c=0 r=0
+#MSG_CHANGE_SUCCESS
 "Change success!"
 "Change success!"
 "Cambio correcto"
 "Cambio correcto"
 
 
-#MSG_CORRECTLY c=20 r=0
+#MSG_CORRECTLY c=20
 "Changed correctly?"
 "Changed correctly?"
 "Cambio correcto?"
 "Cambio correcto?"
 
 
-#MSG_SELFTEST_CHECK_BED c=20 r=0
+#MSG_SELFTEST_CHECK_BED c=20
 "Checking bed     "
 "Checking bed     "
 "Control base cal."
 "Control base cal."
 
 
-#MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
+#MSG_SELFTEST_CHECK_ENDSTOPS c=20
 "Checking endstops"
 "Checking endstops"
 "Control endstops"
 "Control endstops"
 
 
-#MSG_SELFTEST_CHECK_HOTEND c=20 r=0
+#MSG_SELFTEST_CHECK_HOTEND c=20
 "Checking hotend  "
 "Checking hotend  "
 "Control fusor"
 "Control fusor"
 
 
-#MSG_SELFTEST_CHECK_FSENSOR c=20 r=0
+#MSG_SELFTEST_CHECK_FSENSOR c=20
 "Checking sensors "
 "Checking sensors "
 "Comprobando los sensores"
 "Comprobando los sensores"
 
 
-#MSG_SELFTEST_CHECK_X c=20 r=0
+#MSG_SELFTEST_CHECK_X c=20
 "Checking X axis  "
 "Checking X axis  "
 "Control sensor X"
 "Control sensor X"
 
 
-#MSG_SELFTEST_CHECK_Y c=20 r=0
+#MSG_SELFTEST_CHECK_Y c=20
 "Checking Y axis  "
 "Checking Y axis  "
 "Control sensor Y"
 "Control sensor Y"
 
 
-#MSG_SELFTEST_CHECK_Z c=20 r=0
+#MSG_SELFTEST_CHECK_Z c=20
 "Checking Z axis  "
 "Checking Z axis  "
 "Control sensor Z"
 "Control sensor Z"
 
 
@@ -530,35 +466,15 @@
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "Voy a comenzar a imprimir la linea y tu bajaras el nozzle gradualmente al rotar el dial, hasta que llegues a la altura optima. Mira las imagenes del capitulo Calibracion en el manual."
 "Voy a comenzar a imprimir la linea y tu bajaras el nozzle gradualmente al rotar el dial, hasta que llegues a la altura optima. Mira las imagenes del capitulo Calibracion en el manual."
 
 
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
-"Improving bed calibration point"
-"Mejorando punto de calibracion base"
-
-#MSG_WATCH c=0 r=0
+#MSG_WATCH
 "Info screen"
 "Info screen"
 "Monitorizar"
 "Monitorizar"
 
 
-#MSG_FILAMENT_LOADING_T0 c=20 r=4
-"Insert filament into extruder 1. Click when done."
-"Insertar filamento en el extrusor 1. Haz clic una vez terminado."
-
-#MSG_FILAMENT_LOADING_T1 c=20 r=4
-"Insert filament into extruder 2. Click when done."
-"Insertar filamento en el extrusor 2. Haz clic una vez terminado."
-
-#MSG_FILAMENT_LOADING_T2 c=20 r=4
-"Insert filament into extruder 3. Click when done."
-"Insertar filamento en el extrusor 3. Haz clic una vez terminado."
-
-#MSG_FILAMENT_LOADING_T3 c=20 r=4
-"Insert filament into extruder 4. Click when done."
-"Insertar filamento en el extrusor 4. Haz clic una vez terminado."
-
 #
 #
 "Is filament 1 loaded?"
 "Is filament 1 loaded?"
 "?Esta cargado el filamento 1?"
 "?Esta cargado el filamento 1?"
 
 
-#MSG_INSERT_FILAMENT c=20 r=0
+#MSG_INSERT_FILAMENT c=20
 "Insert filament"
 "Insert filament"
 "Introducir filamento"
 "Introducir filamento"
 
 
@@ -578,10 +494,6 @@
 "Is steel sheet on heatbed?"
 "Is steel sheet on heatbed?"
 "?Esta colocada la lamina de acero sobre la base?"
 "?Esta colocada la lamina de acero sobre la base?"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
-"Iteration "
-"Reiteracion "
-
 #
 #
 "Last print failures"
 "Last print failures"
 "Ultimas impresiones fallidas"
 "Ultimas impresiones fallidas"
@@ -590,7 +502,7 @@
 "Last print"
 "Last print"
 "Ultima impresion"
 "Ultima impresion"
 
 
-#MSG_SELFTEST_EXTRUDER_FAN c=20 r=0
+#MSG_SELFTEST_EXTRUDER_FAN c=20
 "Left hotend fan?"
 "Left hotend fan?"
 "Vent. izquierdo?"
 "Vent. izquierdo?"
 
 
@@ -606,19 +518,19 @@
 "Lin. correction"
 "Lin. correction"
 "Correccion de Linealidad"
 "Correccion de Linealidad"
 
 
-#MSG_BABYSTEP_Z c=0 r=0
+#MSG_BABYSTEP_Z
 "Live adjust Z"
 "Live adjust Z"
 "Micropaso Eje Z"
 "Micropaso Eje Z"
 
 
-#MSG_LOAD_FILAMENT c=17 r=0
+#MSG_LOAD_FILAMENT c=17
 "Load filament"
 "Load filament"
 "Introducir filam."
 "Introducir filam."
 
 
-#MSG_LOADING_COLOR c=0 r=0
+#MSG_LOADING_COLOR
 "Loading color"
 "Loading color"
 "Cambiando color"
 "Cambiando color"
 
 
-#MSG_LOADING_FILAMENT c=20 r=0
+#MSG_LOADING_FILAMENT c=20
 "Loading filament"
 "Loading filament"
 "Introduciendo filam."
 "Introduciendo filam."
 
 
@@ -634,15 +546,15 @@
 "M117 First layer cal."
 "M117 First layer cal."
 "M117 Cal. primera cap."
 "M117 Cal. primera cap."
 
 
-#MSG_MAIN c=0 r=0
+#MSG_MAIN
 "Main"
 "Main"
 "Menu principal"
 "Menu principal"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60
 "Measuring reference height of calibration point"
 "Measuring reference height of calibration point"
 "Midiendo altura del punto de calibracion"
 "Midiendo altura del punto de calibracion"
 
 
-#MSG_MESH_BED_LEVELING c=0 r=0
+#MSG_MESH_BED_LEVELING
 "Mesh Bed Leveling"
 "Mesh Bed Leveling"
 "Nivelacion Mesh Level"
 "Nivelacion Mesh Level"
 
 
@@ -674,11 +586,11 @@
 "MMU OK. Resuming..."
 "MMU OK. Resuming..."
 "MMU OK. Resumiendo..."
 "MMU OK. Resumiendo..."
 
 
-#MSG_STEALTH_MODE_OFF c=0 r=0
+#MSG_STEALTH_MODE_OFF
 "Mode     [Normal]"
 "Mode     [Normal]"
 "Modo     [Normal]"
 "Modo     [Normal]"
 
 
-#MSG_SILENT_MODE_ON c=0 r=0
+#MSG_SILENT_MODE_ON
 "Mode     [silent]"
 "Mode     [silent]"
 "Modo   [silencio]"
 "Modo   [silencio]"
 
 
@@ -690,15 +602,15 @@
 "MMU power fails"
 "MMU power fails"
 "Fallo de energia en MMU"
 "Fallo de energia en MMU"
 
 
-#MSG_STEALTH_MODE_ON c=0 r=0
+#MSG_STEALTH_MODE_ON
 "Mode    [Stealth]"
 "Mode    [Stealth]"
 "Modo   [Silencio]"
 "Modo   [Silencio]"
 
 
-#MSG_AUTO_MODE_ON c=0 r=0
+#MSG_AUTO_MODE_ON
 "Mode [auto power]"
 "Mode [auto power]"
 "Modo[fuerza auto]"
 "Modo[fuerza auto]"
 
 
-#MSG_SILENT_MODE_OFF c=0 r=0
+#MSG_SILENT_MODE_OFF
 "Mode [high power]"
 "Mode [high power]"
 "Modo [rend.pleno]"
 "Modo [rend.pleno]"
 
 
@@ -706,31 +618,31 @@
 "MMU2 connected"
 "MMU2 connected"
 "MMU2 conectado"
 "MMU2 conectado"
 
 
-#MSG_SELFTEST_MOTOR c=0 r=0
+#MSG_SELFTEST_MOTOR
 "Motor"
 "Motor"
 "\x00"
 "\x00"
 
 
-#MSG_MOVE_AXIS c=0 r=0
+#MSG_MOVE_AXIS
 "Move axis"
 "Move axis"
 "Mover ejes"
 "Mover ejes"
 
 
-#MSG_MOVE_X c=0 r=0
+#MSG_MOVE_X
 "Move X"
 "Move X"
 "Mover X"
 "Mover X"
 
 
-#MSG_MOVE_Y c=0 r=0
+#MSG_MOVE_Y
 "Move Y"
 "Move Y"
 "Mover Y"
 "Mover Y"
 
 
-#MSG_MOVE_Z c=0 r=0
+#MSG_MOVE_Z
 "Move Z"
 "Move Z"
 "Mover Z"
 "Mover Z"
 
 
-#MSG_NO_MOVE c=0 r=0
+#MSG_NO_MOVE
 "No move."
 "No move."
 "Sin movimiento"
 "Sin movimiento"
 
 
-#MSG_NO_CARD c=0 r=0
+#MSG_NO_CARD
 "No SD card"
 "No SD card"
 "No hay tarjeta SD"
 "No hay tarjeta SD"
 
 
@@ -738,11 +650,11 @@
 "N/A"
 "N/A"
 "No disponible"
 "No disponible"
 
 
-#MSG_NO c=0 r=0
+#MSG_NO
 "No"
 "No"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_NOTCONNECTED c=0 r=0
+#MSG_SELFTEST_NOTCONNECTED
 "Not connected"
 "Not connected"
 "No hay conexion "
 "No hay conexion "
 
 
@@ -750,11 +662,7 @@
 "New firmware version available:"
 "New firmware version available:"
 "Nuevo firmware disponible:"
 "Nuevo firmware disponible:"
 
 
-#
-"No "
-"No"
-
-#MSG_SELFTEST_FAN_NO c=19 r=0
+#MSG_SELFTEST_FAN_NO c=19
 "Not spinning"
 "Not spinning"
 "Ventilador no gira"
 "Ventilador no gira"
 
 
@@ -766,7 +674,7 @@
 "Now I will preheat nozzle for PLA."
 "Now I will preheat nozzle for PLA."
 "Voy a precalentar la boquilla para PLA ahora."
 "Voy a precalentar la boquilla para PLA ahora."
 
 
-#MSG_NOZZLE c=0 r=0
+#MSG_NOZZLE
 "Nozzle"
 "Nozzle"
 "Boquilla"
 "Boquilla"
 
 
@@ -782,7 +690,7 @@
 "Nozzle FAN"
 "Nozzle FAN"
 "Ventilador de capa"
 "Ventilador de capa"
 
 
-#MSG_PAUSE_PRINT c=0 r=0
+#MSG_PAUSE_PRINT
 "Pause print"
 "Pause print"
 "Pausar impresion"
 "Pausar impresion"
 
 
@@ -814,7 +722,7 @@
 "Please clean the nozzle for calibration. Click when done."
 "Please clean the nozzle for calibration. Click when done."
 "Limpia boquilla para calibracion. Click cuando acabes."
 "Limpia boquilla para calibracion. Click cuando acabes."
 
 
-#MSG_SELFTEST_PLEASECHECK c=0 r=0
+#MSG_SELFTEST_PLEASECHECK
 "Please check :"
 "Please check :"
 "Controla :"
 "Controla :"
 
 
@@ -866,7 +774,7 @@
 "Please update firmware in your MMU2. Waiting for reset."
 "Please update firmware in your MMU2. Waiting for reset."
 "Por favor actualice el firmware en tu MMU2. Esperando el reseteo."
 "Por favor actualice el firmware en tu MMU2. Esperando el reseteo."
 
 
-#MSG_PLEASE_WAIT c=20 r=0
+#MSG_PLEASE_WAIT c=20
 "Please wait"
 "Please wait"
 "Por Favor Espere"
 "Por Favor Espere"
 
 
@@ -874,11 +782,11 @@
 "Please remove shipping helpers first."
 "Please remove shipping helpers first."
 "Por favor retira los soportes de envio primero."
 "Por favor retira los soportes de envio primero."
 
 
-#MSG_PREHEAT_NOZZLE c=20 r=0
+#MSG_PREHEAT_NOZZLE c=20
 "Preheat the nozzle!"
 "Preheat the nozzle!"
 "Precalienta extrusor!"
 "Precalienta extrusor!"
 
 
-#MSG_PREHEAT c=0 r=0
+#MSG_PREHEAT
 "Preheat"
 "Preheat"
 "Precalentar"
 "Precalentar"
 
 
@@ -898,7 +806,7 @@
 "Power failures"
 "Power failures"
 "Cortes de energia"
 "Cortes de energia"
 
 
-#MSG_PRINT_ABORTED c=20 r=0
+#MSG_PRINT_ABORTED c=20
 "Print aborted"
 "Print aborted"
 "Impresion cancelada"
 "Impresion cancelada"
 
 
@@ -910,11 +818,11 @@
 "Preheating to unload"
 "Preheating to unload"
 "Precalentar para descargar"
 "Precalentar para descargar"
 
 
-#MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_PRINT_FAN_SPEED c=18
 "Print fan:"
 "Print fan:"
 "Ventilador del fusor:"
 "Ventilador del fusor:"
 
 
-#MSG_CARD_MENU c=0 r=0
+#MSG_CARD_MENU
 "Print from SD"
 "Print from SD"
 "Menu tarjeta SD"
 "Menu tarjeta SD"
 
 
@@ -938,15 +846,7 @@
 "Print FAN"
 "Print FAN"
 "Ventilador del extrusor"
 "Ventilador del extrusor"
 
 
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK2.5 ready."
-"Preparado para Prusa i3 MK2.5."
-
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK3 ready."
-"Prusa i3 MK3 prep."
-
-#MSG_PRUSA3D c=0 r=0
+#MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
 "prusa3d.es"
 "prusa3d.es"
 
 
@@ -966,19 +866,15 @@
 "Prusa i3 MK3S OK."
 "Prusa i3 MK3S OK."
 "\x00"
 "\x00"
 
 
-#
-"Prusa i3 MK2 ready."
-"Preparado para i3 MK2."
-
-#MSG_CALIBRATE_BED_RESET c=0 r=0
+#MSG_CALIBRATE_BED_RESET
 "Reset XYZ calibr."
 "Reset XYZ calibr."
 "\x00"
 "\x00"
 
 
-#MSG_BED_CORRECTION_RESET c=0 r=0
+#MSG_BED_CORRECTION_RESET
 "Reset"
 "Reset"
 "\x00"
 "\x00"
 
 
-#MSG_RESUME_PRINT c=0 r=0
+#MSG_RESUME_PRINT
 "Resume print"
 "Resume print"
 "Reanudar impres."
 "Reanudar impres."
 
 
@@ -1014,31 +910,31 @@
 "Right"
 "Right"
 "Derecha"
 "Derecha"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
+#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60
 "Searching bed calibration point"
 "Searching bed calibration point"
 "Buscando punto de calibracion base"
 "Buscando punto de calibracion base"
 
 
-#MSG_LANGUAGE_SELECT c=0 r=0
+#MSG_LANGUAGE_SELECT
 "Select language"
 "Select language"
 "Cambiar el idioma"
 "Cambiar el idioma"
 
 
-#MSG_SELFTEST_OK c=0 r=0
+#MSG_SELFTEST_OK
 "Self test OK"
 "Self test OK"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_START c=20 r=0
+#MSG_SELFTEST_START c=20
 "Self test start  "
 "Self test start  "
 "Iniciar Selftest"
 "Iniciar Selftest"
 
 
-#MSG_SELFTEST c=0 r=0
+#MSG_SELFTEST
 "Selftest         "
 "Selftest         "
 "Selftest"
 "Selftest"
 
 
-#MSG_SELFTEST_ERROR c=0 r=0
+#MSG_SELFTEST_ERROR
 "Selftest error !"
 "Selftest error !"
 "Error Selftest !"
 "Error Selftest !"
 
 
-#MSG_SELFTEST_FAILED c=20 r=0
+#MSG_SELFTEST_FAILED c=20
 "Selftest failed  "
 "Selftest failed  "
 "Fallo Selftest"
 "Fallo Selftest"
 
 
@@ -1058,7 +954,7 @@
 "Set temperature:"
 "Set temperature:"
 "Establecer temp.:"
 "Establecer temp.:"
 
 
-#MSG_SETTINGS c=0 r=0
+#MSG_SETTINGS
 "Settings"
 "Settings"
 "Configuracion"
 "Configuracion"
 
 
@@ -1070,33 +966,25 @@
 "Sensor state"
 "Sensor state"
 "Estado del sensor"
 "Estado del sensor"
 
 
-#
-"Sensors info"
-"Informacion sensores"
-
-#
-"Show pinda state"
-"Mostrar estado pinda"
-
 #MSG_FILE_CNT c=20 r=4
 #MSG_FILE_CNT c=20 r=4
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Algunos archivos no se ordenaran. Maximo 100 archivos por carpeta para ordenar. "
 "Algunos archivos no se ordenaran. Maximo 100 archivos por carpeta para ordenar. "
 
 
 #MSG_SORT_NONE c=17 r=1
 #MSG_SORT_NONE c=17 r=1
-"Sort:      [none]"
-"Ordenar:   [nada]"
+"Sort       [none]"
+"Ordenar    [nada]"
 
 
 #MSG_SORT_TIME c=17 r=1
 #MSG_SORT_TIME c=17 r=1
-"Sort:      [time]"
-"Orden:    [Fecha]"
+"Sort       [time]"
+"Ordenar   [Fecha]"
 
 
 #
 #
 "Severe skew"
 "Severe skew"
 "Inclinacion severa"
 "Inclinacion severa"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
-"Sort:  [alphabet]"
-"Ordenar:[alfabet]"
+"Sort   [alphabet]"
+"Ordenar [alfabet]"
 
 
 #MSG_SORTING c=20 r=1
 #MSG_SORTING c=20 r=1
 "Sorting files"
 "Sorting files"
@@ -1126,11 +1014,11 @@
 "Sound    [silent]"
 "Sound    [silent]"
 "Sonido[silencios]"
 "Sonido[silencios]"
 
 
-#MSG_SPEED c=0 r=0
+#MSG_SPEED
 "Speed"
 "Speed"
 "Velocidad"
 "Velocidad"
 
 
-#MSG_SELFTEST_FAN_YES c=19 r=0
+#MSG_SELFTEST_FAN_YES c=19
 "Spinning"
 "Spinning"
 "Ventilador girando"
 "Ventilador girando"
 
 
@@ -1138,23 +1026,23 @@
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Se necesita una temperatura ambiente ente 21 y 26C y un soporte rigido."
 "Se necesita una temperatura ambiente ente 21 y 26C y un soporte rigido."
 
 
-#MSG_STATISTICS c=0 r=0
+#MSG_STATISTICS
 "Statistics  "
 "Statistics  "
 "Estadisticas "
 "Estadisticas "
 
 
-#MSG_STOP_PRINT c=0 r=0
+#MSG_STOP_PRINT
 "Stop print"
 "Stop print"
 "Detener impresion"
 "Detener impresion"
 
 
-#MSG_STOPPED c=0 r=0
+#MSG_STOPPED
 "STOPPED. "
 "STOPPED. "
 "PARADA"
 "PARADA"
 
 
-#MSG_SUPPORT c=0 r=0
+#MSG_SUPPORT
 "Support"
 "Support"
 "Soporte"
 "Soporte"
 
 
-#MSG_SELFTEST_SWAPPED c=0 r=0
+#MSG_SELFTEST_SWAPPED
 "Swapped"
 "Swapped"
 "Intercambiado"
 "Intercambiado"
 
 
@@ -1182,7 +1070,7 @@
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Calibracion temperatura terminada. Haz clic para continuar."
 "Calibracion temperatura terminada. Haz clic para continuar."
 
 
-#MSG_TEMPERATURE c=0 r=0
+#MSG_TEMPERATURE
 "Temperature"
 "Temperature"
 "Temperatura"
 "Temperatura"
 
 
@@ -1202,7 +1090,7 @@
 "Total print time"
 "Total print time"
 "Tiempo total :"
 "Tiempo total :"
 
 
-#MSG_TUNE c=0 r=0
+#MSG_TUNE
 "Tune"
 "Tune"
 "Ajustar"
 "Ajustar"
 
 
@@ -1210,10 +1098,6 @@
 "Unload"
 "Unload"
 "Descargar"
 "Descargar"
 
 
-#
-"Unload all"
-"Soltar todos fil."
-
 #
 #
 "Total failures"
 "Total failures"
 "Fallos totales"
 "Fallos totales"
@@ -1226,7 +1110,7 @@
 "to unload filament"
 "to unload filament"
 "para descargar el filamento"
 "para descargar el filamento"
 
 
-#MSG_UNLOAD_FILAMENT c=17 r=0
+#MSG_UNLOAD_FILAMENT c=17
 "Unload filament"
 "Unload filament"
 "Soltar filamento"
 "Soltar filamento"
 
 
@@ -1250,7 +1134,7 @@
 "unknown"
 "unknown"
 "desconocido"
 "desconocido"
 
 
-#MSG_USERWAIT c=0 r=0
+#MSG_USERWAIT
 "Wait for user..."
 "Wait for user..."
 "Esperando ordenes"
 "Esperando ordenes"
 
 
@@ -1282,7 +1166,7 @@
 "Was filament unload successful?"
 "Was filament unload successful?"
 "?Se cargocon exito el filamento?"
 "?Se cargocon exito el filamento?"
 
 
-#MSG_SELFTEST_WIRINGERROR c=0 r=0
+#MSG_SELFTEST_WIRINGERROR
 "Wiring error"
 "Wiring error"
 "Error de conexion"
 "Error de conexion"
 
 
@@ -1298,7 +1182,7 @@
 "XYZ calibration failed. Please consult the manual."
 "XYZ calibration failed. Please consult the manual."
 "Calibracion XYZ fallada. Consulta el manual por favor."
 "Calibracion XYZ fallada. Consulta el manual por favor."
 
 
-#MSG_YES c=0 r=0
+#MSG_YES
 "Yes"
 "Yes"
 "Si"
 "Si"
 
 
@@ -1315,8 +1199,8 @@
 "Calibracion XYZ correcta. Los ejes X / Y estan ligeramente inclinados. Buen trabajo!"
 "Calibracion XYZ correcta. Los ejes X / Y estan ligeramente inclinados. Buen trabajo!"
 
 
 #
 #
-"X-correct"
-"X-correcion"
+"X-correct:"
+"X-correcion:"
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
@@ -1330,18 +1214,10 @@
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 "Calibrazion XYZ comprometida. Punto frontal derecho no alcanzable."
 "Calibrazion XYZ comprometida. Punto frontal derecho no alcanzable."
 
 
-#MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-"XYZ calibration compromised. Left front calibration point not reachable."
-"Calibrazion XYZ comprometida. Punto frontal izquierdo no alcanzable."
-
-#MSG_LOAD_ALL c=17 r=0
+#MSG_LOAD_ALL c=17
 "Load all"
 "Load all"
 "Intr. todos fil."
 "Intr. todos fil."
 
 
-#MSG_LOAD_FILAMENT_1 c=17 r=0
-"Load filament 1"
-"Introducir fil. 1"
-
 #
 #
 "XYZ calibration failed. Bed calibration point was not found."
 "XYZ calibration failed. Bed calibration point was not found."
 "Calibracion XYZ fallada. Puntos de calibracion en la base no encontrados."
 "Calibracion XYZ fallada. Puntos de calibracion en la base no encontrados."
@@ -1350,38 +1226,18 @@
 "XYZ calibration failed. Front calibration points not reachable."
 "XYZ calibration failed. Front calibration points not reachable."
 "Calibracion XYZ fallada. Puntos frontales no alcanzables."
 "Calibracion XYZ fallada. Puntos frontales no alcanzables."
 
 
-#
-"XYZ calibration failed. Left front calibration point not reachable."
-"Calibracion XYZ fallada. Punto frontal izquierdo no alcanzable."
-
-#MSG_LOAD_FILAMENT_2 c=17 r=0
-"Load filament 2"
-"Introducir fil. 2"
-
 #
 #
 "XYZ calibration failed. Right front calibration point not reachable."
 "XYZ calibration failed. Right front calibration point not reachable."
 "Calibracion XYZ fallad. Punto frontal derecho no alcanzable."
 "Calibracion XYZ fallad. Punto frontal derecho no alcanzable."
 
 
-#MSG_LOAD_FILAMENT_3 c=17 r=0
-"Load filament 3"
-"Introducir fil. 3"
-
 #
 #
 "Y distance from min"
 "Y distance from min"
 "Distancia en Y desde el min"
 "Distancia en Y desde el min"
 
 
 #
 #
-"Y-correct"
-"Y-correcion"
-
-#MSG_LOAD_FILAMENT_4 c=17 r=0
-"Load filament 4"
-"Introducir fil. 4"
-
-#MSG_LOAD_FILAMENT_5 c=17 r=0
-"Load filament 5"
-"Cargar filamento 5"
+"Y-correct:"
+"Y-correcion:"
 
 
-#MSG_OFF c=0 r=0
+#MSG_OFF
 " [off]"
 " [off]"
 "\x00"
 "\x00"

+ 133 - 277
lang/lang_en_fr.txt

@@ -1,12 +1,12 @@
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
+#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
 " of 4"
 " of 4"
 "de 4"
 "de 4"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14
 " of 9"
 " of 9"
 "de 9"
 "de 9"
 
 
-#MSG_MEASURED_OFFSET c=0 r=0
+#MSG_MEASURED_OFFSET
 "[0;0] point offset"
 "[0;0] point offset"
 "Offset point [0;0]"
 "Offset point [0;0]"
 
 
@@ -22,11 +22,11 @@
 ">Cancel"
 ">Cancel"
 ">Annuler"
 ">Annuler"
 
 
-#MSG_BABYSTEPPING_Z c=20 r=0
-"Adjusting Z"
-"Ajustement de Z"
+#MSG_BABYSTEPPING_Z c=15
+"Adjusting Z:"
+"Ajust. de Z:"
 
 
-#MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
+#MSG_SELFTEST_CHECK_ALLCORRECT c=20
 "All correct      "
 "All correct      "
 "Tout est correct"
 "Tout est correct"
 
 
@@ -38,7 +38,7 @@
 "Ambient"
 "Ambient"
 "Ambiant"
 "Ambiant"
 
 
-#MSG_PRESS c=20 r=0
+#MSG_PRESS c=20
 "and press the knob"
 "and press the knob"
 "et pressez le bouton"
 "et pressez le bouton"
 
 
@@ -54,15 +54,15 @@
 "SpoolJoin   [N/A]"
 "SpoolJoin   [N/A]"
 "\x00"
 "\x00"
 
 
-# MSG_AUTO_DEPLETE_OFF c=17 r=1
+#MSG_AUTO_DEPLETE_OFF c=17 r=1
 "SpoolJoin   [off]"
 "SpoolJoin   [off]"
 "\x00"
 "\x00"
 
 
-#MSG_AUTO_HOME c=0 r=0
+#MSG_AUTO_HOME
 "Auto home"
 "Auto home"
 "Mise a 0 des axes"
 "Mise a 0 des axes"
 
 
-#MSG_AUTOLOAD_FILAMENT c=17 r=0
+#MSG_AUTOLOAD_FILAMENT c=17
 "AutoLoad filament"
 "AutoLoad filament"
 "AutoCharge du filament"
 "AutoCharge du filament"
 
 
@@ -74,27 +74,27 @@
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 "Chargement auto du filament actif, appuyez sur le btn et inserez le fil."
 "Chargement auto du filament actif, appuyez sur le btn et inserez le fil."
 
 
-#MSG_SELFTEST_AXIS_LENGTH c=0 r=0
+#MSG_SELFTEST_AXIS_LENGTH
 "Axis length"
 "Axis length"
 "Longueur de l'axe"
 "Longueur de l'axe"
 
 
-#MSG_SELFTEST_AXIS c=0 r=0
+#MSG_SELFTEST_AXIS
 "Axis"
 "Axis"
 "Axe"
 "Axe"
 
 
-#MSG_SELFTEST_BEDHEATER c=0 r=0
+#MSG_SELFTEST_BEDHEATER
 "Bed / Heater"
 "Bed / Heater"
 "Lit / Chauffage"
 "Lit / Chauffage"
 
 
-#MSG_BED_DONE c=0 r=0
+#MSG_BED_DONE
 "Bed done"
 "Bed done"
 "Plateau termine"
 "Plateau termine"
 
 
-#MSG_BED_HEATING c=0 r=0
+#MSG_BED_HEATING
 "Bed Heating"
 "Bed Heating"
 "Chauffe du lit"
 "Chauffe du lit"
 
 
-#MSG_BED_CORRECTION_MENU c=0 r=0
+#MSG_BED_CORRECTION_MENU
 "Bed level correct"
 "Bed level correct"
 "Corr. niveau plateau"
 "Corr. niveau plateau"
 
 
@@ -102,15 +102,7 @@
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Echec bed leveling. Capt. non declenche. Debris sur buse ? En attente d'un reset."
 "Echec bed leveling. Capt. non declenche. Debris sur buse ? En attente d'un reset."
 
 
-#MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED c=20 r=4
-"Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset."
-"Echec du nivellement Capteur deconnecte ou cable casse. En attente d'un reset."
-
-#MSG_BED_LEVELING_FAILED_POINT_HIGH c=20 r=4
-"Bed leveling failed. Sensor triggered too high. Waiting for reset."
-"Echec bed leveling. Capt. declenche trop trop haut. En attente d'un reset."
-
-#MSG_BED c=0 r=0
+#MSG_BED
 "Bed"
 "Bed"
 "Lit"
 "Lit"
 
 
@@ -126,11 +118,11 @@
 "Calibrating home"
 "Calibrating home"
 "Calib. mise a 0"
 "Calib. mise a 0"
 
 
-#MSG_CALIBRATE_BED c=0 r=0
+#MSG_CALIBRATE_BED
 "Calibrate XYZ"
 "Calibrate XYZ"
 "Calibrer XYZ"
 "Calibrer XYZ"
 
 
-#MSG_HOMEYZ c=0 r=0
+#MSG_HOMEYZ
 "Calibrate Z"
 "Calibrate Z"
 "Calibrer Z"
 "Calibrer Z"
 
 
@@ -150,11 +142,11 @@
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibration de Z. Tournez le bouton pour monter le chariot de l'axe Z jusqu'aux butees. Cliquez une fois fait."
 "Calibration de Z. Tournez le bouton pour monter le chariot de l'axe Z jusqu'aux butees. Cliquez une fois fait."
 
 
-#MSG_HOMEYZ_DONE c=0 r=0
+#MSG_HOMEYZ_DONE
 "Calibration done"
 "Calibration done"
 "Calibration terminee"
 "Calibration terminee"
 
 
-#MSG_MENU_CALIBRATION c=0 r=0
+#MSG_MENU_CALIBRATION
 "Calibration"
 "Calibration"
 "\x00"
 "\x00"
 
 
@@ -162,19 +154,15 @@
 "Cancel"
 "Cancel"
 "Annuler"
 "Annuler"
 
 
-#MSG_SD_INSERTED c=0 r=0
-"Card inserted"
-"Carte  inseree"
-
-#MSG_SD_REMOVED c=0 r=0
+#MSG_SD_REMOVED
 "Card removed"
 "Card removed"
 "Carte retiree"
 "Carte retiree"
 
 
-#MSG_NOT_COLOR c=0 r=0
+#MSG_NOT_COLOR
 "Color not correct"
 "Color not correct"
 "Couleur incorrecte"
 "Couleur incorrecte"
 
 
-#MSG_COOLDOWN c=0 r=0
+#MSG_COOLDOWN
 "Cooldown"
 "Cooldown"
 "Refroidissement"
 "Refroidissement"
 
 
@@ -182,15 +170,15 @@
 "Copy selected language?"
 "Copy selected language?"
 "Copier la langue selectionne ?"
 "Copier la langue selectionne ?"
 
 
-#MSG_CRASHDETECT_ON c=0 r=0
+#MSG_CRASHDETECT_ON
 "Crash det.   [on]"
 "Crash det.   [on]"
 "Detect. crash[on]"
 "Detect. crash[on]"
 
 
-#MSG_CRASHDETECT_NA c=0 r=0
+#MSG_CRASHDETECT_NA
 "Crash det.  [N/A]"
 "Crash det.  [N/A]"
 "Detect. crash [N/A]"
 "Detect. crash [N/A]"
 
 
-#MSG_CRASHDETECT_OFF c=0 r=0
+#MSG_CRASHDETECT_OFF
 "Crash det.  [off]"
 "Crash det.  [off]"
 "Detect. crash[off]"
 "Detect. crash[off]"
 
 
@@ -214,7 +202,7 @@
 "Date:"
 "Date:"
 "Date :"
 "Date :"
 
 
-#MSG_DISABLE_STEPPERS c=0 r=0
+#MSG_DISABLE_STEPPERS
 "Disable steppers"
 "Disable steppers"
 "Desactiver moteurs"
 "Desactiver moteurs"
 
 
@@ -226,34 +214,14 @@
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Voulez-vous repeter la derniere etape pour reajuster la distance entre la buse et le plateau chauffant ?"
 "Voulez-vous repeter la derniere etape pour reajuster la distance entre la buse et le plateau chauffant ?"
 
 
-#MSG_EXTRUDER_CORRECTION c=9 r=0
-"E-correct"
-"Correct-E"
+#MSG_EXTRUDER_CORRECTION c=10
+"E-correct:"
+"Correct-E:"
 
 
 #MSG_EJECT_FILAMENT c=17 r=1
 #MSG_EJECT_FILAMENT c=17 r=1
 "Eject filament"
 "Eject filament"
 "Ejecter le fil."
 "Ejecter le fil."
 
 
-#MSG_EJECT_FILAMENT1 c=17 r=1
-"Eject filament 1"
-"Ejecter fil. 1"
-
-#MSG_EJECT_FILAMENT2 c=17 r=1
-"Eject filament 2"
-"Ejecter fil. 2"
-
-#MSG_EJECT_FILAMENT3 c=17 r=1
-"Eject filament 3"
-"Ejecter fil. 3"
-
-#MSG_EJECT_FILAMENT4 c=17 r=1
-"Eject filament 4"
-"Ejecter fil. 4"
-
-#MSG_EJECT_FILAMENT5 c=17 r=1
-"Eject filament 5"
-"Ejecter fil. 5"
-
 #
 #
 "Eject"
 "Eject"
 "Ejecter"
 "Ejecter"
@@ -266,11 +234,11 @@
 "Endstop not hit"
 "Endstop not hit"
 "Butee non atteinte"
 "Butee non atteinte"
 
 
-#MSG_SELFTEST_ENDSTOP c=0 r=0
+#MSG_SELFTEST_ENDSTOP
 "Endstop"
 "Endstop"
 "Butee"
 "Butee"
 
 
-#MSG_SELFTEST_ENDSTOPS c=0 r=0
+#MSG_SELFTEST_ENDSTOPS
 "Endstops"
 "Endstops"
 "Butees"
 "Butees"
 
 
@@ -282,31 +250,11 @@
 "ERROR: Filament sensor is not responding, please check connection."
 "ERROR: Filament sensor is not responding, please check connection."
 "ERREUR : Le capteur de filament ne repond pas, verifiez le branchement."
 "ERREUR : Le capteur de filament ne repond pas, verifiez le branchement."
 
 
-#MSG_ERROR c=0 r=0
+#MSG_ERROR
 "ERROR:"
 "ERROR:"
 "ERREUR :"
 "ERREUR :"
 
 
-#
-"External SPI flash W25X20CL not responding."
-"La Flash SPI externe W25X20CL ne repond pas."
-
-#
-"Extruder 1"
-"Extrudeur 1"
-
-#
-"Extruder 2"
-"Extrudeur 2"
-
-#
-"Extruder 3"
-"Extrudeur 3"
-
-#
-"Extruder 4"
-"Extrudeur 4"
-
-#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 "Extruder fan:"
 "Extruder fan:"
 "Ventilo extrudeur:"
 "Ventilo extrudeur:"
 
 
@@ -314,7 +262,7 @@
 "Extruder info"
 "Extruder info"
 "Infos extrudeur"
 "Infos extrudeur"
 
 
-#MSG_MOVE_E c=0 r=0
+#MSG_MOVE_E
 "Extruder"
 "Extruder"
 "Extrudeur"
 "Extrudeur"
 
 
@@ -338,11 +286,11 @@
 "Fail stats"
 "Fail stats"
 "Statist. d'echec"
 "Statist. d'echec"
 
 
-#MSG_FAN_SPEED c=14 r=0
+#MSG_FAN_SPEED c=14
 "Fan speed"
 "Fan speed"
 "Vitesse ventil"
 "Vitesse ventil"
 
 
-#MSG_SELFTEST_FAN c=20 r=0
+#MSG_SELFTEST_FAN c=20
 "Fan test"
 "Fan test"
 "Test ventilateur"
 "Test ventilateur"
 
 
@@ -354,19 +302,15 @@
 "Fans check  [off]"
 "Fans check  [off]"
 "Verif venti [off]"
 "Verif venti [off]"
 
 
-#MSG_FSENSOR_ON c=0 r=0
+#MSG_FSENSOR_ON
 "Fil. sensor  [on]"
 "Fil. sensor  [on]"
 "Capteur Fil. [on]"
 "Capteur Fil. [on]"
 
 
-#MSG_RESPONSE_POOR c=20 r=2
-"Fil. sensor response is poor, disable it?"
-"Capteur de fil. non precis, desactiver ?"
-
-#MSG_FSENSOR_NA c=0 r=0
+#MSG_FSENSOR_NA
 "Fil. sensor [N/A]"
 "Fil. sensor [N/A]"
 "Capteur Fil. [N/A]"
 "Capteur Fil. [N/A]"
 
 
-#MSG_FSENSOR_OFF c=0 r=0
+#MSG_FSENSOR_OFF
 "Fil. sensor [off]"
 "Fil. sensor [off]"
 "Capteur Fil.[off]"
 "Capteur Fil.[off]"
 
 
@@ -378,18 +322,14 @@
 "Filament extruding & with correct color?"
 "Filament extruding & with correct color?"
 "Filament extrude et avec bonne couleur ?"
 "Filament extrude et avec bonne couleur ?"
 
 
-#MSG_NOT_LOADED c=19 r=0
+#MSG_NOT_LOADED c=19
 "Filament not loaded"
 "Filament not loaded"
 "Filament non charge"
 "Filament non charge"
 
 
-#MSG_FILAMENT_SENSOR c=20 r=0
+#MSG_FILAMENT_SENSOR c=20
 "Filament sensor"
 "Filament sensor"
 "Capteur de filament"
 "Capteur de filament"
 
 
-#MSG_SELFTEST_FILAMENT_SENSOR c=18 r=0
-"Filament sensor:"
-"Capteur filament :"
-
 #MSG_FILAMENT_USED c=19 r=1
 #MSG_FILAMENT_USED c=19 r=1
 "Filament used"
 "Filament used"
 "Filament utilise"
 "Filament utilise"
@@ -418,15 +358,15 @@
 "Fix the issue and then press button on MMU unit."
 "Fix the issue and then press button on MMU unit."
 "Corrigez le probleme et appuyez sur le bouton de l'unite MMU."
 "Corrigez le probleme et appuyez sur le bouton de l'unite MMU."
 
 
-#MSG_FLOW c=0 r=0
+#MSG_FLOW
 "Flow"
 "Flow"
 "Flux"
 "Flux"
 
 
-#MSG_PRUSA3D_FORUM c=0 r=0
+#MSG_PRUSA3D_FORUM
 "forum.prusa3d.com"
 "forum.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_COOLING_FAN c=20 r=0
+#MSG_SELFTEST_COOLING_FAN c=20
 "Front print fan?"
 "Front print fan?"
 "Ventilo impr avant ?"
 "Ventilo impr avant ?"
 
 
@@ -434,23 +374,23 @@
 "Front side[um]"
 "Front side[um]"
 "Avant [um]"
 "Avant [um]"
 
 
-#MSG_SELFTEST_FANS c=0 r=0
+#MSG_SELFTEST_FANS
 "Front/left fans"
 "Front/left fans"
 "Ventilos avt/gauche"
 "Ventilos avt/gauche"
 
 
-#MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
+#MSG_SELFTEST_HEATERTHERMISTOR
 "Heater/Thermistor"
 "Heater/Thermistor"
 "Chauffage/Thermistor"
 "Chauffage/Thermistor"
 
 
-#MSG_BED_HEATING_SAFETY_DISABLED c=0 r=0
+#MSG_BED_HEATING_SAFETY_DISABLED
 "Heating disabled by safety timer."
 "Heating disabled by safety timer."
 "Chauffe desactivee par le compteur de securite."
 "Chauffe desactivee par le compteur de securite."
 
 
-#MSG_HEATING_COMPLETE c=20 r=0
+#MSG_HEATING_COMPLETE c=20
 "Heating done."
 "Heating done."
 "Chauffe terminee."
 "Chauffe terminee."
 
 
-#MSG_HEATING c=0 r=0
+#MSG_HEATING
 "Heating"
 "Heating"
 "Chauffe"
 "Chauffe"
 
 
@@ -458,51 +398,47 @@
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Bonjour, je suis votre imprimante Original Prusa i3. Voulez-vous que je vous guide a travers le processus d'installation ?"
 "Bonjour, je suis votre imprimante Original Prusa i3. Voulez-vous que je vous guide a travers le processus d'installation ?"
 
 
-#MSG_PRUSA3D_HOWTO c=0 r=0
+#MSG_PRUSA3D_HOWTO
 "howto.prusa3d.com"
 "howto.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#
-"Change extruder"
-"Changer extrudeur"
-
-#MSG_FILAMENTCHANGE c=0 r=0
+#MSG_FILAMENTCHANGE
 "Change filament"
 "Change filament"
 "Changer filament"
 "Changer filament"
 
 
-#MSG_CHANGE_SUCCESS c=0 r=0
+#MSG_CHANGE_SUCCESS
 "Change success!"
 "Change success!"
 "Changement reussi!"
 "Changement reussi!"
 
 
-#MSG_CORRECTLY c=20 r=0
+#MSG_CORRECTLY c=20
 "Changed correctly?"
 "Changed correctly?"
 "Change correctement?"
 "Change correctement?"
 
 
-#MSG_SELFTEST_CHECK_BED c=20 r=0
+#MSG_SELFTEST_CHECK_BED c=20
 "Checking bed     "
 "Checking bed     "
 "Verification du lit"
 "Verification du lit"
 
 
-#MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
+#MSG_SELFTEST_CHECK_ENDSTOPS c=20
 "Checking endstops"
 "Checking endstops"
 "Verifications butees"
 "Verifications butees"
 
 
-#MSG_SELFTEST_CHECK_HOTEND c=20 r=0
+#MSG_SELFTEST_CHECK_HOTEND c=20
 "Checking hotend  "
 "Checking hotend  "
 "Verif. tete impr."
 "Verif. tete impr."
 
 
-#MSG_SELFTEST_CHECK_FSENSOR c=20 r=0
+#MSG_SELFTEST_CHECK_FSENSOR c=20
 "Checking sensors "
 "Checking sensors "
 "Verif. des capteurs"
 "Verif. des capteurs"
 
 
-#MSG_SELFTEST_CHECK_X c=20 r=0
+#MSG_SELFTEST_CHECK_X c=20
 "Checking X axis  "
 "Checking X axis  "
 "Verification axe X"
 "Verification axe X"
 
 
-#MSG_SELFTEST_CHECK_Y c=20 r=0
+#MSG_SELFTEST_CHECK_Y c=20
 "Checking Y axis  "
 "Checking Y axis  "
 "Verification axe Y"
 "Verification axe Y"
 
 
-#MSG_SELFTEST_CHECK_Z c=20 r=0
+#MSG_SELFTEST_CHECK_Z c=20
 "Checking Z axis  "
 "Checking Z axis  "
 "Verification axe Z"
 "Verification axe Z"
 
 
@@ -530,35 +466,15 @@
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "Je vais commencer a imprimer une ligne et vous baisserez au fur et a mesure la buse en tournant le bouton jusqu'a atteindre la hauteur optimale. Regardez les photos dans notre manuel au chapitre Calibration"
 "Je vais commencer a imprimer une ligne et vous baisserez au fur et a mesure la buse en tournant le bouton jusqu'a atteindre la hauteur optimale. Regardez les photos dans notre manuel au chapitre Calibration"
 
 
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
-"Improving bed calibration point"
-"Amelioration du point de calibration du lit"
-
-#MSG_WATCH c=0 r=0
+#MSG_WATCH
 "Info screen"
 "Info screen"
 "Ecran d'info"
 "Ecran d'info"
 
 
-#MSG_FILAMENT_LOADING_T0 c=20 r=4
-"Insert filament into extruder 1. Click when done."
-"Inserez le filament dans l'extrudeur 1. Cliquez une fois pret."
-
-#MSG_FILAMENT_LOADING_T1 c=20 r=4
-"Insert filament into extruder 2. Click when done."
-"Inserez le filament dans l'extrudeur 2. Cliquez une fois pret."
-
-#MSG_FILAMENT_LOADING_T2 c=20 r=4
-"Insert filament into extruder 3. Click when done."
-"Inserez le filament dans l'extrudeur 3. Cliquez une fois pret."
-
-#MSG_FILAMENT_LOADING_T3 c=20 r=4
-"Insert filament into extruder 4. Click when done."
-"Inserez le filament dans l'extrudeur 4. Cliquez une fois pret."
-
 #
 #
 "Is filament 1 loaded?"
 "Is filament 1 loaded?"
 "Le filament 1 est-il charge ?"
 "Le filament 1 est-il charge ?"
 
 
-#MSG_INSERT_FILAMENT c=20 r=0
+#MSG_INSERT_FILAMENT c=20
 "Insert filament"
 "Insert filament"
 "Inserez le filament"
 "Inserez le filament"
 
 
@@ -578,10 +494,6 @@
 "Is steel sheet on heatbed?"
 "Is steel sheet on heatbed?"
 "Feuille d'acier sur plateau chauffant ?"
 "Feuille d'acier sur plateau chauffant ?"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
-"Iteration "
-"\x00"
-
 #
 #
 "Last print failures"
 "Last print failures"
 "Echecs derniere impr"
 "Echecs derniere impr"
@@ -590,7 +502,7 @@
 "Last print"
 "Last print"
 "Derniere impression"
 "Derniere impression"
 
 
-#MSG_SELFTEST_EXTRUDER_FAN c=20 r=0
+#MSG_SELFTEST_EXTRUDER_FAN c=20
 "Left hotend fan?"
 "Left hotend fan?"
 "Ventilo tete gauche?"
 "Ventilo tete gauche?"
 
 
@@ -606,19 +518,19 @@
 "Lin. correction"
 "Lin. correction"
 "Correction lin."
 "Correction lin."
 
 
-#MSG_BABYSTEP_Z c=0 r=0
+#MSG_BABYSTEP_Z
 "Live adjust Z"
 "Live adjust Z"
 "Ajuster Z en direct"
 "Ajuster Z en direct"
 
 
-#MSG_LOAD_FILAMENT c=17 r=0
+#MSG_LOAD_FILAMENT c=17
 "Load filament"
 "Load filament"
 "Charger filament"
 "Charger filament"
 
 
-#MSG_LOADING_COLOR c=0 r=0
+#MSG_LOADING_COLOR
 "Loading color"
 "Loading color"
 "Chargement couleur"
 "Chargement couleur"
 
 
-#MSG_LOADING_FILAMENT c=20 r=0
+#MSG_LOADING_FILAMENT c=20
 "Loading filament"
 "Loading filament"
 "Chargement filament"
 "Chargement filament"
 
 
@@ -634,15 +546,15 @@
 "M117 First layer cal."
 "M117 First layer cal."
 "M117 Cal. 1ere couche"
 "M117 Cal. 1ere couche"
 
 
-#MSG_MAIN c=0 r=0
+#MSG_MAIN
 "Main"
 "Main"
 "Principal"
 "Principal"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60
 "Measuring reference height of calibration point"
 "Measuring reference height of calibration point"
 "Mesure de la hauteur de reference du point de calibration"
 "Mesure de la hauteur de reference du point de calibration"
 
 
-#MSG_MESH_BED_LEVELING c=0 r=0
+#MSG_MESH_BED_LEVELING
 "Mesh Bed Leveling"
 "Mesh Bed Leveling"
 "\x00"
 "\x00"
 
 
@@ -674,11 +586,11 @@
 "MMU OK. Resuming..."
 "MMU OK. Resuming..."
 "MMU OK. Reprise ..."
 "MMU OK. Reprise ..."
 
 
-#MSG_STEALTH_MODE_OFF c=0 r=0
+#MSG_STEALTH_MODE_OFF
 "Mode     [Normal]"
 "Mode     [Normal]"
 "\x00"
 "\x00"
 
 
-#MSG_SILENT_MODE_ON c=0 r=0
+#MSG_SILENT_MODE_ON
 "Mode     [silent]"
 "Mode     [silent]"
 "Mode [silencieux]"
 "Mode [silencieux]"
 
 
@@ -690,15 +602,15 @@
 "MMU power fails"
 "MMU power fails"
 "Echecs alim. MMU"
 "Echecs alim. MMU"
 
 
-#MSG_STEALTH_MODE_ON c=0 r=0
+#MSG_STEALTH_MODE_ON
 "Mode    [Stealth]"
 "Mode    [Stealth]"
 "Mode [Furtif]"
 "Mode [Furtif]"
 
 
-#MSG_AUTO_MODE_ON c=0 r=0
+#MSG_AUTO_MODE_ON
 "Mode [auto power]"
 "Mode [auto power]"
 "Mode [puiss.auto]"
 "Mode [puiss.auto]"
 
 
-#MSG_SILENT_MODE_OFF c=0 r=0
+#MSG_SILENT_MODE_OFF
 "Mode [high power]"
 "Mode [high power]"
 "Mode [haute puiss]"
 "Mode [haute puiss]"
 
 
@@ -706,31 +618,31 @@
 "MMU2 connected"
 "MMU2 connected"
 "MMU2 connecte"
 "MMU2 connecte"
 
 
-#MSG_SELFTEST_MOTOR c=0 r=0
+#MSG_SELFTEST_MOTOR
 "Motor"
 "Motor"
 "Moteur"
 "Moteur"
 
 
-#MSG_MOVE_AXIS c=0 r=0
+#MSG_MOVE_AXIS
 "Move axis"
 "Move axis"
 "Deplacer l'axe"
 "Deplacer l'axe"
 
 
-#MSG_MOVE_X c=0 r=0
+#MSG_MOVE_X
 "Move X"
 "Move X"
 "Deplacer X"
 "Deplacer X"
 
 
-#MSG_MOVE_Y c=0 r=0
+#MSG_MOVE_Y
 "Move Y"
 "Move Y"
 "Deplacer Y"
 "Deplacer Y"
 
 
-#MSG_MOVE_Z c=0 r=0
+#MSG_MOVE_Z
 "Move Z"
 "Move Z"
 "Deplacer Z"
 "Deplacer Z"
 
 
-#MSG_NO_MOVE c=0 r=0
+#MSG_NO_MOVE
 "No move."
 "No move."
 "Pas de mouvement."
 "Pas de mouvement."
 
 
-#MSG_NO_CARD c=0 r=0
+#MSG_NO_CARD
 "No SD card"
 "No SD card"
 "Pas de carte SD"
 "Pas de carte SD"
 
 
@@ -738,11 +650,11 @@
 "N/A"
 "N/A"
 "\x00"
 "\x00"
 
 
-#MSG_NO c=0 r=0
+#MSG_NO
 "No"
 "No"
 "Non"
 "Non"
 
 
-#MSG_SELFTEST_NOTCONNECTED c=0 r=0
+#MSG_SELFTEST_NOTCONNECTED
 "Not connected"
 "Not connected"
 "Non connecte"
 "Non connecte"
 
 
@@ -750,11 +662,7 @@
 "New firmware version available:"
 "New firmware version available:"
 "Nouvelle version de firmware disponible:"
 "Nouvelle version de firmware disponible:"
 
 
-#
-"No "
-"Non"
-
-#MSG_SELFTEST_FAN_NO c=19 r=0
+#MSG_SELFTEST_FAN_NO c=19
 "Not spinning"
 "Not spinning"
 "Ne tourne pas"
 "Ne tourne pas"
 
 
@@ -766,7 +674,7 @@
 "Now I will preheat nozzle for PLA."
 "Now I will preheat nozzle for PLA."
 "Maintenant je vais prechauffer la buse pour du PLA."
 "Maintenant je vais prechauffer la buse pour du PLA."
 
 
-#MSG_NOZZLE c=0 r=0
+#MSG_NOZZLE
 "Nozzle"
 "Nozzle"
 "Buse"
 "Buse"
 
 
@@ -782,7 +690,7 @@
 "Nozzle FAN"
 "Nozzle FAN"
 "Ventilateur buse"
 "Ventilateur buse"
 
 
-#MSG_PAUSE_PRINT c=0 r=0
+#MSG_PAUSE_PRINT
 "Pause print"
 "Pause print"
 "Pause de l'impr."
 "Pause de l'impr."
 
 
@@ -814,7 +722,7 @@
 "Please clean the nozzle for calibration. Click when done."
 "Please clean the nozzle for calibration. Click when done."
 "Nettoyez la buse pour la calibration. Cliquez une fois fait."
 "Nettoyez la buse pour la calibration. Cliquez une fois fait."
 
 
-#MSG_SELFTEST_PLEASECHECK c=0 r=0
+#MSG_SELFTEST_PLEASECHECK
 "Please check :"
 "Please check :"
 "Verifiez :"
 "Verifiez :"
 
 
@@ -866,7 +774,7 @@
 "Please update firmware in your MMU2. Waiting for reset."
 "Please update firmware in your MMU2. Waiting for reset."
 "Veuillez mettre a jour le firmware de votre MMU2. En attente d'un reset."
 "Veuillez mettre a jour le firmware de votre MMU2. En attente d'un reset."
 
 
-#MSG_PLEASE_WAIT c=20 r=0
+#MSG_PLEASE_WAIT c=20
 "Please wait"
 "Please wait"
 "Merci de patienter"
 "Merci de patienter"
 
 
@@ -874,11 +782,11 @@
 "Please remove shipping helpers first."
 "Please remove shipping helpers first."
 "Veuillez retirer d'abord les protections d'envoi."
 "Veuillez retirer d'abord les protections d'envoi."
 
 
-#MSG_PREHEAT_NOZZLE c=20 r=0
+#MSG_PREHEAT_NOZZLE c=20
 "Preheat the nozzle!"
 "Preheat the nozzle!"
 "Prechauffez la buse!"
 "Prechauffez la buse!"
 
 
-#MSG_PREHEAT c=0 r=0
+#MSG_PREHEAT
 "Preheat"
 "Preheat"
 "Prechauffage"
 "Prechauffage"
 
 
@@ -898,7 +806,7 @@
 "Power failures"
 "Power failures"
 "Coupures de courant"
 "Coupures de courant"
 
 
-#MSG_PRINT_ABORTED c=20 r=0
+#MSG_PRINT_ABORTED c=20
 "Print aborted"
 "Print aborted"
 "Impression annulee"
 "Impression annulee"
 
 
@@ -910,11 +818,11 @@
 "Preheating to unload"
 "Preheating to unload"
 "Chauffe pr decharger"
 "Chauffe pr decharger"
 
 
-#MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_PRINT_FAN_SPEED c=18
 "Print fan:"
 "Print fan:"
 "Ventilo impr. :"
 "Ventilo impr. :"
 
 
-#MSG_CARD_MENU c=0 r=0
+#MSG_CARD_MENU
 "Print from SD"
 "Print from SD"
 "Impr depuis la SD"
 "Impr depuis la SD"
 
 
@@ -938,15 +846,7 @@
 "Print FAN"
 "Print FAN"
 "Ventilo impression"
 "Ventilo impression"
 
 
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK2.5 ready."
-"Prusa i3 MK2.5 prete."
-
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK3 ready."
-"Prusa i3 MK3 prete."
-
-#MSG_PRUSA3D c=0 r=0
+#MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
 "\x00"
 "\x00"
 
 
@@ -966,19 +866,15 @@
 "Prusa i3 MK3S OK."
 "Prusa i3 MK3S OK."
 "\x00"
 "\x00"
 
 
-#
-"Prusa i3 MK2 ready."
-"Prusa i3 MK2 prete."
-
-#MSG_CALIBRATE_BED_RESET c=0 r=0
+#MSG_CALIBRATE_BED_RESET
 "Reset XYZ calibr."
 "Reset XYZ calibr."
 "Reinit. calibr. XYZ"
 "Reinit. calibr. XYZ"
 
 
-#MSG_BED_CORRECTION_RESET c=0 r=0
+#MSG_BED_CORRECTION_RESET
 "Reset"
 "Reset"
 "Reinitialiser"
 "Reinitialiser"
 
 
-#MSG_RESUME_PRINT c=0 r=0
+#MSG_RESUME_PRINT
 "Resume print"
 "Resume print"
 "Reprendre impression"
 "Reprendre impression"
 
 
@@ -1014,31 +910,31 @@
 "Right"
 "Right"
 "Droite"
 "Droite"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
+#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60
 "Searching bed calibration point"
 "Searching bed calibration point"
 "Recherche du point de calibration du lit"
 "Recherche du point de calibration du lit"
 
 
-#MSG_LANGUAGE_SELECT c=0 r=0
+#MSG_LANGUAGE_SELECT
 "Select language"
 "Select language"
 "Choisir langue"
 "Choisir langue"
 
 
-#MSG_SELFTEST_OK c=0 r=0
+#MSG_SELFTEST_OK
 "Self test OK"
 "Self test OK"
 "Auto-test OK"
 "Auto-test OK"
 
 
-#MSG_SELFTEST_START c=20 r=0
+#MSG_SELFTEST_START c=20
 "Self test start  "
 "Self test start  "
 "Debut auto-test"
 "Debut auto-test"
 
 
-#MSG_SELFTEST c=0 r=0
+#MSG_SELFTEST
 "Selftest         "
 "Selftest         "
 "Auto-test"
 "Auto-test"
 
 
-#MSG_SELFTEST_ERROR c=0 r=0
+#MSG_SELFTEST_ERROR
 "Selftest error !"
 "Selftest error !"
 "Erreur auto-test !"
 "Erreur auto-test !"
 
 
-#MSG_SELFTEST_FAILED c=20 r=0
+#MSG_SELFTEST_FAILED c=20
 "Selftest failed  "
 "Selftest failed  "
 "Echec de l'auto-test"
 "Echec de l'auto-test"
 
 
@@ -1058,7 +954,7 @@
 "Set temperature:"
 "Set temperature:"
 "Regler temp. :"
 "Regler temp. :"
 
 
-#MSG_SETTINGS c=0 r=0
+#MSG_SETTINGS
 "Settings"
 "Settings"
 "Reglages"
 "Reglages"
 
 
@@ -1070,33 +966,25 @@
 "Sensor state"
 "Sensor state"
 "Etat capteur"
 "Etat capteur"
 
 
-#
-"Sensors info"
-"Infos capteurs"
-
-#
-"Show pinda state"
-"Etat de la PINDA"
-
 #MSG_FILE_CNT c=20 r=4
 #MSG_FILE_CNT c=20 r=4
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Certains fichiers ne seront pas tries. Max 100 fichiers tries par dossier."
 "Certains fichiers ne seront pas tries. Max 100 fichiers tries par dossier."
 
 
 #MSG_SORT_NONE c=17 r=1
 #MSG_SORT_NONE c=17 r=1
-"Sort:      [none]"
+"Sort       [none]"
 "Tri :     [aucun]"
 "Tri :     [aucun]"
 
 
 #MSG_SORT_TIME c=17 r=1
 #MSG_SORT_TIME c=17 r=1
-"Sort:      [time]"
-"Tri :     [heure]"
+"Sort       [time]"
+"Tri       [heure]"
 
 
 #
 #
 "Severe skew"
 "Severe skew"
 "Deviation severe"
 "Deviation severe"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
-"Sort:  [alphabet]"
-"Tri : [alphabet]"
+"Sort   [alphabet]"
+"Tri    [alphabet]"
 
 
 #MSG_SORTING c=20 r=1
 #MSG_SORTING c=20 r=1
 "Sorting files"
 "Sorting files"
@@ -1126,11 +1014,11 @@
 "Sound    [silent]"
 "Sound    [silent]"
 "Son [silencieux]"
 "Son [silencieux]"
 
 
-#MSG_SPEED c=0 r=0
+#MSG_SPEED
 "Speed"
 "Speed"
 "Vitesse"
 "Vitesse"
 
 
-#MSG_SELFTEST_FAN_YES c=19 r=0
+#MSG_SELFTEST_FAN_YES c=19
 "Spinning"
 "Spinning"
 "Tourne"
 "Tourne"
 
 
@@ -1138,23 +1026,23 @@
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Une temperature ambiante stable de 21-26C et un support stable sont requis."
 "Une temperature ambiante stable de 21-26C et un support stable sont requis."
 
 
-#MSG_STATISTICS c=0 r=0
+#MSG_STATISTICS
 "Statistics  "
 "Statistics  "
 "Statistiques"
 "Statistiques"
 
 
-#MSG_STOP_PRINT c=0 r=0
+#MSG_STOP_PRINT
 "Stop print"
 "Stop print"
 "Arreter impression"
 "Arreter impression"
 
 
-#MSG_STOPPED c=0 r=0
+#MSG_STOPPED
 "STOPPED. "
 "STOPPED. "
 "ARRETE."
 "ARRETE."
 
 
-#MSG_SUPPORT c=0 r=0
+#MSG_SUPPORT
 "Support"
 "Support"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_SWAPPED c=0 r=0
+#MSG_SELFTEST_SWAPPED
 "Swapped"
 "Swapped"
 "Echange"
 "Echange"
 
 
@@ -1182,7 +1070,7 @@
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "La calibration en temperature est terminee et activee. La calibration en temperature peut etre desactivee dans le menu Reglages-> Cal. Temp."
 "La calibration en temperature est terminee et activee. La calibration en temperature peut etre desactivee dans le menu Reglages-> Cal. Temp."
 
 
-#MSG_TEMPERATURE c=0 r=0
+#MSG_TEMPERATURE
 "Temperature"
 "Temperature"
 "\x00"
 "\x00"
 
 
@@ -1202,7 +1090,7 @@
 "Total print time"
 "Total print time"
 "Temps total impr."
 "Temps total impr."
 
 
-#MSG_TUNE c=0 r=0
+#MSG_TUNE
 "Tune"
 "Tune"
 "Regler"
 "Regler"
 
 
@@ -1210,10 +1098,6 @@
 "Unload"
 "Unload"
 "Decharger"
 "Decharger"
 
 
-#
-"Unload all"
-"Decharger tout"
-
 #
 #
 "Total failures"
 "Total failures"
 "Total des echecs"
 "Total des echecs"
@@ -1226,7 +1110,7 @@
 "to unload filament"
 "to unload filament"
 "pour decharger fil."
 "pour decharger fil."
 
 
-#MSG_UNLOAD_FILAMENT c=17 r=0
+#MSG_UNLOAD_FILAMENT c=17
 "Unload filament"
 "Unload filament"
 "Decharger fil."
 "Decharger fil."
 
 
@@ -1250,7 +1134,7 @@
 "unknown"
 "unknown"
 "inconnu"
 "inconnu"
 
 
-#MSG_USERWAIT c=0 r=0
+#MSG_USERWAIT
 "Wait for user..."
 "Wait for user..."
 "Attente utilisateur..."
 "Attente utilisateur..."
 
 
@@ -1282,7 +1166,7 @@
 "Was filament unload successful?"
 "Was filament unload successful?"
 "Dechargement du filament reussi ?"
 "Dechargement du filament reussi ?"
 
 
-#MSG_SELFTEST_WIRINGERROR c=0 r=0
+#MSG_SELFTEST_WIRINGERROR
 "Wiring error"
 "Wiring error"
 "Erreur de cablage"
 "Erreur de cablage"
 
 
@@ -1298,7 +1182,7 @@
 "XYZ calibration failed. Please consult the manual."
 "XYZ calibration failed. Please consult the manual."
 "Echec calibration XYZ. Consultez le manuel."
 "Echec calibration XYZ. Consultez le manuel."
 
 
-#MSG_YES c=0 r=0
+#MSG_YES
 "Yes"
 "Yes"
 "Oui"
 "Oui"
 
 
@@ -1315,8 +1199,8 @@
 "Calibration XYZ OK. Les axes X/Y sont legerement non perpendiculaires. Bon boulot !"
 "Calibration XYZ OK. Les axes X/Y sont legerement non perpendiculaires. Bon boulot !"
 
 
 #
 #
-"X-correct"
-"Correction-X"
+"X-correct:"
+"Correct-X:"
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
@@ -1330,18 +1214,10 @@
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 "Calibration XYZ compromise. Le point de calibration avant droit n'est pas atteignable."
 "Calibration XYZ compromise. Le point de calibration avant droit n'est pas atteignable."
 
 
-#MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-"XYZ calibration compromised. Left front calibration point not reachable."
-"Calibration XYZ compromise. Le point  de calibration  avant gauche n'est  pas atteignable."
-
-#MSG_LOAD_ALL c=17 r=0
+#MSG_LOAD_ALL c=17
 "Load all"
 "Load all"
 "Tout charger"
 "Tout charger"
 
 
-#MSG_LOAD_FILAMENT_1 c=17 r=0
-"Load filament 1"
-"Charger fil. 1"
-
 #
 #
 "XYZ calibration failed. Bed calibration point was not found."
 "XYZ calibration failed. Bed calibration point was not found."
 "Echec calibration XYZ. Le point de calibration du plateau n'a pas ete trouve."
 "Echec calibration XYZ. Le point de calibration du plateau n'a pas ete trouve."
@@ -1350,38 +1226,18 @@
 "XYZ calibration failed. Front calibration points not reachable."
 "XYZ calibration failed. Front calibration points not reachable."
 "Echec calibration XYZ. Les points de calibration avant ne sont pas atteignables."
 "Echec calibration XYZ. Les points de calibration avant ne sont pas atteignables."
 
 
-#
-"XYZ calibration failed. Left front calibration point not reachable."
-"Echec calibration XYZ. Le point de calibration avant gauche n'est pas atteignable."
-
-#MSG_LOAD_FILAMENT_2 c=17 r=0
-"Load filament 2"
-"Charger fil. 2"
-
 #
 #
 "XYZ calibration failed. Right front calibration point not reachable."
 "XYZ calibration failed. Right front calibration point not reachable."
 "Echec calibration XYZ. Le point de calibration avant droit n'est pas atteignable."
 "Echec calibration XYZ. Le point de calibration avant droit n'est pas atteignable."
 
 
-#MSG_LOAD_FILAMENT_3 c=17 r=0
-"Load filament 3"
-"Charger fil. 3"
-
 #
 #
 "Y distance from min"
 "Y distance from min"
 "Distance Y du min"
 "Distance Y du min"
 
 
 #
 #
-"Y-correct"
-"Correction-Y"
-
-#MSG_LOAD_FILAMENT_4 c=17 r=0
-"Load filament 4"
-"Charger fil. 4"
-
-#MSG_LOAD_FILAMENT_5 c=17 r=0
-"Load filament 5"
-"Charger fil. 5"
+"Y-correct:"
+"Correct-Y:"
 
 
-#MSG_OFF c=0 r=0
+#MSG_OFF
 " [off]"
 " [off]"
 "\x00"
 "\x00"

+ 134 - 278
lang/lang_en_it.txt

@@ -1,12 +1,12 @@
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
+#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
 " of 4"
 " of 4"
 " su 4"
 " su 4"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14
 " of 9"
 " of 9"
 "su 9"
 "su 9"
 
 
-#MSG_MEASURED_OFFSET c=0 r=0
+#MSG_MEASURED_OFFSET
 "[0;0] point offset"
 "[0;0] point offset"
 "[0;0] punto offset"
 "[0;0] punto offset"
 
 
@@ -22,11 +22,11 @@
 ">Cancel"
 ">Cancel"
 ">Annulla"
 ">Annulla"
 
 
-#MSG_BABYSTEPPING_Z c=20 r=0
-"Adjusting Z"
-"Compensazione Z"
+#MSG_BABYSTEPPING_Z c=15
+"Adjusting Z:"
+"Compensaz. Z:"
 
 
-#MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
+#MSG_SELFTEST_CHECK_ALLCORRECT c=20
 "All correct      "
 "All correct      "
 "Nessun errore"
 "Nessun errore"
 
 
@@ -38,7 +38,7 @@
 "Ambient"
 "Ambient"
 "Ambiente"
 "Ambiente"
 
 
-#MSG_PRESS c=20 r=0
+#MSG_PRESS c=20
 "and press the knob"
 "and press the knob"
 "e cliccare manopola"
 "e cliccare manopola"
 
 
@@ -54,15 +54,15 @@
 "SpoolJoin   [N/A]"
 "SpoolJoin   [N/A]"
 "\x00"
 "\x00"
 
 
-# MSG_AUTO_DEPLETE_OFF c=17 r=1
+#MSG_AUTO_DEPLETE_OFF c=17 r=1
 "SpoolJoin   [off]"
 "SpoolJoin   [off]"
 "\x00"
 "\x00"
 
 
-#MSG_AUTO_HOME c=0 r=0
+#MSG_AUTO_HOME
 "Auto home"
 "Auto home"
 "Trova origine"
 "Trova origine"
 
 
-#MSG_AUTOLOAD_FILAMENT c=17 r=0
+#MSG_AUTOLOAD_FILAMENT c=17
 "AutoLoad filament"
 "AutoLoad filament"
 "Autocaric. filam."
 "Autocaric. filam."
 
 
@@ -74,27 +74,27 @@
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 "Il caricamento automatico e attivo, premete la manopola e inserite il filamento..."
 "Il caricamento automatico e attivo, premete la manopola e inserite il filamento..."
 
 
-#MSG_SELFTEST_AXIS_LENGTH c=0 r=0
+#MSG_SELFTEST_AXIS_LENGTH
 "Axis length"
 "Axis length"
 "Lunghezza dell'asse"
 "Lunghezza dell'asse"
 
 
-#MSG_SELFTEST_AXIS c=0 r=0
+#MSG_SELFTEST_AXIS
 "Axis"
 "Axis"
 "Assi"
 "Assi"
 
 
-#MSG_SELFTEST_BEDHEATER c=0 r=0
+#MSG_SELFTEST_BEDHEATER
 "Bed / Heater"
 "Bed / Heater"
 "Letto/Riscald."
 "Letto/Riscald."
 
 
-#MSG_BED_DONE c=0 r=0
+#MSG_BED_DONE
 "Bed done"
 "Bed done"
 "Piano fatto."
 "Piano fatto."
 
 
-#MSG_BED_HEATING c=0 r=0
+#MSG_BED_HEATING
 "Bed Heating"
 "Bed Heating"
 "Riscald. letto"
 "Riscald. letto"
 
 
-#MSG_BED_CORRECTION_MENU c=0 r=0
+#MSG_BED_CORRECTION_MENU
 "Bed level correct"
 "Bed level correct"
 "Correz. liv.letto"
 "Correz. liv.letto"
 
 
@@ -102,15 +102,7 @@
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Livellamento letto fallito.NoRispSensore.Residui su ugello? In attesa di reset."
 "Livellamento letto fallito.NoRispSensore.Residui su ugello? In attesa di reset."
 
 
-#MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED c=20 r=4
-"Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset."
-"Livellamento piano fallito. Sensore disconnesso o Cavo Danneggiato. In attesa di reset."
-
-#MSG_BED_LEVELING_FAILED_POINT_HIGH c=20 r=4
-"Bed leveling failed. Sensor triggered too high. Waiting for reset."
-"Livellamento piano fallito. Risposta sensore troppo presto. In attesa di reset."
-
-#MSG_BED c=0 r=0
+#MSG_BED
 "Bed"
 "Bed"
 "Letto"
 "Letto"
 
 
@@ -126,11 +118,11 @@
 "Calibrating home"
 "Calibrating home"
 "Calibrazione Home"
 "Calibrazione Home"
 
 
-#MSG_CALIBRATE_BED c=0 r=0
+#MSG_CALIBRATE_BED
 "Calibrate XYZ"
 "Calibrate XYZ"
 "Calibra XYZ"
 "Calibra XYZ"
 
 
-#MSG_HOMEYZ c=0 r=0
+#MSG_HOMEYZ
 "Calibrate Z"
 "Calibrate Z"
 "Calibra Z"
 "Calibra Z"
 
 
@@ -150,11 +142,11 @@
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrazione Z. Ruotare la manopola per alzare il carrello Z fino all'altezza massima. Click per terminare."
 "Calibrazione Z. Ruotare la manopola per alzare il carrello Z fino all'altezza massima. Click per terminare."
 
 
-#MSG_HOMEYZ_DONE c=0 r=0
+#MSG_HOMEYZ_DONE
 "Calibration done"
 "Calibration done"
 "Calibrazione completa"
 "Calibrazione completa"
 
 
-#MSG_MENU_CALIBRATION c=0 r=0
+#MSG_MENU_CALIBRATION
 "Calibration"
 "Calibration"
 "Calibrazione"
 "Calibrazione"
 
 
@@ -162,19 +154,15 @@
 "Cancel"
 "Cancel"
 "Annulla"
 "Annulla"
 
 
-#MSG_SD_INSERTED c=0 r=0
-"Card inserted"
-"SD inserita"
-
-#MSG_SD_REMOVED c=0 r=0
+#MSG_SD_REMOVED
 "Card removed"
 "Card removed"
 "SD rimossa"
 "SD rimossa"
 
 
-#MSG_NOT_COLOR c=0 r=0
+#MSG_NOT_COLOR
 "Color not correct"
 "Color not correct"
 "Colore non puro"
 "Colore non puro"
 
 
-#MSG_COOLDOWN c=0 r=0
+#MSG_COOLDOWN
 "Cooldown"
 "Cooldown"
 "Raffredda"
 "Raffredda"
 
 
@@ -182,15 +170,15 @@
 "Copy selected language?"
 "Copy selected language?"
 "Copiare la lingua selezionata?"
 "Copiare la lingua selezionata?"
 
 
-#MSG_CRASHDETECT_ON c=0 r=0
+#MSG_CRASHDETECT_ON
 "Crash det.   [on]"
 "Crash det.   [on]"
 "Rilevam.imp. [on]"
 "Rilevam.imp. [on]"
 
 
-#MSG_CRASHDETECT_NA c=0 r=0
+#MSG_CRASHDETECT_NA
 "Crash det.  [N/A]"
 "Crash det.  [N/A]"
 "Rilevam.imp.[N/A]"
 "Rilevam.imp.[N/A]"
 
 
-#MSG_CRASHDETECT_OFF c=0 r=0
+#MSG_CRASHDETECT_OFF
 "Crash det.  [off]"
 "Crash det.  [off]"
 "Rilevam.imp.[off]"
 "Rilevam.imp.[off]"
 
 
@@ -214,7 +202,7 @@
 "Date:"
 "Date:"
 "Data:"
 "Data:"
 
 
-#MSG_DISABLE_STEPPERS c=0 r=0
+#MSG_DISABLE_STEPPERS
 "Disable steppers"
 "Disable steppers"
 "Disabilita motori"
 "Disabilita motori"
 
 
@@ -226,34 +214,14 @@
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Desideri ripetere l'ultimo passaggio per migliorare la distanza fra ugello e piatto?"
 "Desideri ripetere l'ultimo passaggio per migliorare la distanza fra ugello e piatto?"
 
 
-#MSG_EXTRUDER_CORRECTION c=9 r=0
-"E-correct"
-"Correzione-E"
+#MSG_EXTRUDER_CORRECTION c=10
+"E-correct:"
+"Correzione-E:"
 
 
 #MSG_EJECT_FILAMENT c=17 r=1
 #MSG_EJECT_FILAMENT c=17 r=1
 "Eject filament"
 "Eject filament"
 "Espelli filamento "
 "Espelli filamento "
 
 
-#MSG_EJECT_FILAMENT1 c=17 r=1
-"Eject filament 1"
-"Espelli filamento 1"
-
-#MSG_EJECT_FILAMENT2 c=17 r=1
-"Eject filament 2"
-"Espellere filamento 2"
-
-#MSG_EJECT_FILAMENT3 c=17 r=1
-"Eject filament 3"
-"Espelli filamento 3"
-
-#MSG_EJECT_FILAMENT4 c=17 r=1
-"Eject filament 4"
-"Espellere filamento 4"
-
-#MSG_EJECT_FILAMENT5 c=17 r=1
-"Eject filament 5"
-"Espelli filamento 5"
-
 #
 #
 "Eject"
 "Eject"
 "Espellere"
 "Espellere"
@@ -266,11 +234,11 @@
 "Endstop not hit"
 "Endstop not hit"
 "Finecorsa fuori portata"
 "Finecorsa fuori portata"
 
 
-#MSG_SELFTEST_ENDSTOP c=0 r=0
+#MSG_SELFTEST_ENDSTOP
 "Endstop"
 "Endstop"
 "Finecorsa"
 "Finecorsa"
 
 
-#MSG_SELFTEST_ENDSTOPS c=0 r=0
+#MSG_SELFTEST_ENDSTOPS
 "Endstops"
 "Endstops"
 "Finecorsa"
 "Finecorsa"
 
 
@@ -282,31 +250,11 @@
 "ERROR: Filament sensor is not responding, please check connection."
 "ERROR: Filament sensor is not responding, please check connection."
 "ERRORE: il sensore filam. non risponde,Controllare conness."
 "ERRORE: il sensore filam. non risponde,Controllare conness."
 
 
-#MSG_ERROR c=0 r=0
+#MSG_ERROR
 "ERROR:"
 "ERROR:"
 "ERRORE:"
 "ERRORE:"
 
 
-#
-"External SPI flash W25X20CL not responding."
-"Flash SPI W25X20CL esterno non risponde."
-
-#
-"Extruder 1"
-"Estrusore 1"
-
-#
-"Extruder 2"
-"Estrusore 2"
-
-#
-"Extruder 3"
-"Estrusore 3"
-
-#
-"Extruder 4"
-"Estrusore 4"
-
-#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 "Extruder fan:"
 "Extruder fan:"
 "Ventola estrusore:"
 "Ventola estrusore:"
 
 
@@ -314,7 +262,7 @@
 "Extruder info"
 "Extruder info"
 "Info estrusore"
 "Info estrusore"
 
 
-#MSG_MOVE_E c=0 r=0
+#MSG_MOVE_E
 "Extruder"
 "Extruder"
 "Estrusore"
 "Estrusore"
 
 
@@ -338,11 +286,11 @@
 "Fail stats"
 "Fail stats"
 "Statistiche fallimenti"
 "Statistiche fallimenti"
 
 
-#MSG_FAN_SPEED c=14 r=0
+#MSG_FAN_SPEED c=14
 "Fan speed"
 "Fan speed"
 "Velocita ventola"
 "Velocita ventola"
 
 
-#MSG_SELFTEST_FAN c=20 r=0
+#MSG_SELFTEST_FAN c=20
 "Fan test"
 "Fan test"
 "Test ventola"
 "Test ventola"
 
 
@@ -354,19 +302,15 @@
 "Fans check  [off]"
 "Fans check  [off]"
 "Control.vent[off]"
 "Control.vent[off]"
 
 
-#MSG_FSENSOR_ON c=0 r=0
+#MSG_FSENSOR_ON
 "Fil. sensor  [on]"
 "Fil. sensor  [on]"
 "Sensor filam.[On]"
 "Sensor filam.[On]"
 
 
-#MSG_RESPONSE_POOR c=20 r=2
-"Fil. sensor response is poor, disable it?"
-"Risposta Sens. Fil. debole, disattivare? "
-
-#MSG_FSENSOR_NA c=0 r=0
+#MSG_FSENSOR_NA
 "Fil. sensor [N/A]"
 "Fil. sensor [N/A]"
 "Sensor filam[N/A]"
 "Sensor filam[N/A]"
 
 
-#MSG_FSENSOR_OFF c=0 r=0
+#MSG_FSENSOR_OFF
 "Fil. sensor [off]"
 "Fil. sensor [off]"
 "Sensor filam[off]"
 "Sensor filam[off]"
 
 
@@ -378,18 +322,14 @@
 "Filament extruding & with correct color?"
 "Filament extruding & with correct color?"
 "Filamento estruso & con il giusto colore?"
 "Filamento estruso & con il giusto colore?"
 
 
-#MSG_NOT_LOADED c=19 r=0
+#MSG_NOT_LOADED c=19
 "Filament not loaded"
 "Filament not loaded"
 "Fil. non caricato"
 "Fil. non caricato"
 
 
-#MSG_FILAMENT_SENSOR c=20 r=0
+#MSG_FILAMENT_SENSOR c=20
 "Filament sensor"
 "Filament sensor"
 "Sensore filam."
 "Sensore filam."
 
 
-#MSG_SELFTEST_FILAMENT_SENSOR c=18 r=0
-"Filament sensor:"
-"Sensore filam.:"
-
 #MSG_FILAMENT_USED c=19 r=1
 #MSG_FILAMENT_USED c=19 r=1
 "Filament used"
 "Filament used"
 "Filamento utilizzato"
 "Filamento utilizzato"
@@ -418,15 +358,15 @@
 "Fix the issue and then press button on MMU unit."
 "Fix the issue and then press button on MMU unit."
 "Risolvi il problema e quindi premi il bottone sull'unita MMU. "
 "Risolvi il problema e quindi premi il bottone sull'unita MMU. "
 
 
-#MSG_FLOW c=0 r=0
+#MSG_FLOW
 "Flow"
 "Flow"
 "Flusso"
 "Flusso"
 
 
-#MSG_PRUSA3D_FORUM c=0 r=0
+#MSG_PRUSA3D_FORUM
 "forum.prusa3d.com"
 "forum.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_COOLING_FAN c=20 r=0
+#MSG_SELFTEST_COOLING_FAN c=20
 "Front print fan?"
 "Front print fan?"
 "Ventola frontale?"
 "Ventola frontale?"
 
 
@@ -434,23 +374,23 @@
 "Front side[um]"
 "Front side[um]"
 "Fronte [um]"
 "Fronte [um]"
 
 
-#MSG_SELFTEST_FANS c=0 r=0
+#MSG_SELFTEST_FANS
 "Front/left fans"
 "Front/left fans"
 "Ventola frontale/sinistra"
 "Ventola frontale/sinistra"
 
 
-#MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
+#MSG_SELFTEST_HEATERTHERMISTOR
 "Heater/Thermistor"
 "Heater/Thermistor"
 "Riscald./Termist."
 "Riscald./Termist."
 
 
-#MSG_BED_HEATING_SAFETY_DISABLED c=0 r=0
+#MSG_BED_HEATING_SAFETY_DISABLED
 "Heating disabled by safety timer."
 "Heating disabled by safety timer."
 "Riscaldamento fermato dal timer di sicurezza."
 "Riscaldamento fermato dal timer di sicurezza."
 
 
-#MSG_HEATING_COMPLETE c=20 r=0
+#MSG_HEATING_COMPLETE c=20
 "Heating done."
 "Heating done."
 "Riscald. completo"
 "Riscald. completo"
 
 
-#MSG_HEATING c=0 r=0
+#MSG_HEATING
 "Heating"
 "Heating"
 "Riscaldamento..."
 "Riscaldamento..."
 
 
@@ -458,51 +398,47 @@
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Ciao, sono la tua stampante Original Prusa i3. Gradiresti un aiuto nel processo di configurazione?"
 "Ciao, sono la tua stampante Original Prusa i3. Gradiresti un aiuto nel processo di configurazione?"
 
 
-#MSG_PRUSA3D_HOWTO c=0 r=0
+#MSG_PRUSA3D_HOWTO
 "howto.prusa3d.com"
 "howto.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#
-"Change extruder"
-"Cambio estrusore"
-
-#MSG_FILAMENTCHANGE c=0 r=0
+#MSG_FILAMENTCHANGE
 "Change filament"
 "Change filament"
 "Cambia filamento"
 "Cambia filamento"
 
 
-#MSG_CHANGE_SUCCESS c=0 r=0
+#MSG_CHANGE_SUCCESS
 "Change success!"
 "Change success!"
 "Cambio riuscito!"
 "Cambio riuscito!"
 
 
-#MSG_CORRECTLY c=20 r=0
+#MSG_CORRECTLY c=20
 "Changed correctly?"
 "Changed correctly?"
 "Cambiato correttamente?"
 "Cambiato correttamente?"
 
 
-#MSG_SELFTEST_CHECK_BED c=20 r=0
+#MSG_SELFTEST_CHECK_BED c=20
 "Checking bed     "
 "Checking bed     "
 "Verifica piano"
 "Verifica piano"
 
 
-#MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
+#MSG_SELFTEST_CHECK_ENDSTOPS c=20
 "Checking endstops"
 "Checking endstops"
 "Verifica finecorsa"
 "Verifica finecorsa"
 
 
-#MSG_SELFTEST_CHECK_HOTEND c=20 r=0
+#MSG_SELFTEST_CHECK_HOTEND c=20
 "Checking hotend  "
 "Checking hotend  "
 "Verifica ugello"
 "Verifica ugello"
 
 
-#MSG_SELFTEST_CHECK_FSENSOR c=20 r=0
+#MSG_SELFTEST_CHECK_FSENSOR c=20
 "Checking sensors "
 "Checking sensors "
 "Controllo sensori"
 "Controllo sensori"
 
 
-#MSG_SELFTEST_CHECK_X c=20 r=0
+#MSG_SELFTEST_CHECK_X c=20
 "Checking X axis  "
 "Checking X axis  "
 "Verifica asse X"
 "Verifica asse X"
 
 
-#MSG_SELFTEST_CHECK_Y c=20 r=0
+#MSG_SELFTEST_CHECK_Y c=20
 "Checking Y axis  "
 "Checking Y axis  "
 "Verifica asse Y"
 "Verifica asse Y"
 
 
-#MSG_SELFTEST_CHECK_Z c=20 r=0
+#MSG_SELFTEST_CHECK_Z c=20
 "Checking Z axis  "
 "Checking Z axis  "
 "Verifica asse Z"
 "Verifica asse Z"
 
 
@@ -530,35 +466,15 @@
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "Adesso iniziero a stampare una linea e tu dovrai abbassare l'ugello poco per volta ruotando la manopola sino a raggiungere una altezza ottimale. Per favore dai uno sguardo all'immagine del nostro manuale, cap.Calibrazione."
 "Adesso iniziero a stampare una linea e tu dovrai abbassare l'ugello poco per volta ruotando la manopola sino a raggiungere una altezza ottimale. Per favore dai uno sguardo all'immagine del nostro manuale, cap.Calibrazione."
 
 
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
-"Improving bed calibration point"
-"Perfezion. punto di calibraz. letto"
-
-#MSG_WATCH c=0 r=0
+#MSG_WATCH
 "Info screen"
 "Info screen"
 "Schermata info"
 "Schermata info"
 
 
-#MSG_FILAMENT_LOADING_T0 c=20 r=4
-"Insert filament into extruder 1. Click when done."
-"Inserire filamento nell'estrusore 1. Click per continuare"
-
-#MSG_FILAMENT_LOADING_T1 c=20 r=4
-"Insert filament into extruder 2. Click when done."
-"Inserire filamento nell'estrusore 2. Click per continuare"
-
-#MSG_FILAMENT_LOADING_T2 c=20 r=4
-"Insert filament into extruder 3. Click when done."
-"Inserire filamento nell'estrusore 3. Click per continuare"
-
-#MSG_FILAMENT_LOADING_T3 c=20 r=4
-"Insert filament into extruder 4. Click when done."
-"Inserire filamento nell'estrusore 4. Click per continuare"
-
 #
 #
 "Is filament 1 loaded?"
 "Is filament 1 loaded?"
 "Il filamento 1 e caricato?"
 "Il filamento 1 e caricato?"
 
 
-#MSG_INSERT_FILAMENT c=20 r=0
+#MSG_INSERT_FILAMENT c=20
 "Insert filament"
 "Insert filament"
 "Inserire filamento"
 "Inserire filamento"
 
 
@@ -578,10 +494,6 @@
 "Is steel sheet on heatbed?"
 "Is steel sheet on heatbed?"
 "La piastra d'acciaio e sul piano riscaldato?"
 "La piastra d'acciaio e sul piano riscaldato?"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
-"Iteration "
-"Iterazione"
-
 #
 #
 "Last print failures"
 "Last print failures"
 "Fallimenti ultima stampa"
 "Fallimenti ultima stampa"
@@ -590,7 +502,7 @@
 "Last print"
 "Last print"
 "Ultima stampa"
 "Ultima stampa"
 
 
-#MSG_SELFTEST_EXTRUDER_FAN c=20 r=0
+#MSG_SELFTEST_EXTRUDER_FAN c=20
 "Left hotend fan?"
 "Left hotend fan?"
 "Vent SX hotend?"
 "Vent SX hotend?"
 
 
@@ -606,19 +518,19 @@
 "Lin. correction"
 "Lin. correction"
 "Correzione lin."
 "Correzione lin."
 
 
-#MSG_BABYSTEP_Z c=0 r=0
+#MSG_BABYSTEP_Z
 "Live adjust Z"
 "Live adjust Z"
 "Compensazione Z"
 "Compensazione Z"
 
 
-#MSG_LOAD_FILAMENT c=17 r=0
+#MSG_LOAD_FILAMENT c=17
 "Load filament"
 "Load filament"
 "Carica filamento"
 "Carica filamento"
 
 
-#MSG_LOADING_COLOR c=0 r=0
+#MSG_LOADING_COLOR
 "Loading color"
 "Loading color"
 "Caricando colore"
 "Caricando colore"
 
 
-#MSG_LOADING_FILAMENT c=20 r=0
+#MSG_LOADING_FILAMENT c=20
 "Loading filament"
 "Loading filament"
 "Caricando filamento"
 "Caricando filamento"
 
 
@@ -634,15 +546,15 @@
 "M117 First layer cal."
 "M117 First layer cal."
 "M117 Calibrazione primo layer."
 "M117 Calibrazione primo layer."
 
 
-#MSG_MAIN c=0 r=0
+#MSG_MAIN
 "Main"
 "Main"
 "Menu principale"
 "Menu principale"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60
 "Measuring reference height of calibration point"
 "Measuring reference height of calibration point"
 "Misura altezza di rif. del punto di calib."
 "Misura altezza di rif. del punto di calib."
 
 
-#MSG_MESH_BED_LEVELING c=0 r=0
+#MSG_MESH_BED_LEVELING
 "Mesh Bed Leveling"
 "Mesh Bed Leveling"
 "Mesh livel. letto"
 "Mesh livel. letto"
 
 
@@ -674,11 +586,11 @@
 "MMU OK. Resuming..."
 "MMU OK. Resuming..."
 "MMU OK. Riprendendo... "
 "MMU OK. Riprendendo... "
 
 
-#MSG_STEALTH_MODE_OFF c=0 r=0
+#MSG_STEALTH_MODE_OFF
 "Mode     [Normal]"
 "Mode     [Normal]"
 "Modo    [normale]"
 "Modo    [normale]"
 
 
-#MSG_SILENT_MODE_ON c=0 r=0
+#MSG_SILENT_MODE_ON
 "Mode     [silent]"
 "Mode     [silent]"
 "Modo [silenzioso]"
 "Modo [silenzioso]"
 
 
@@ -690,15 +602,15 @@
 "MMU power fails"
 "MMU power fails"
 "Mancanza corrente MMU"
 "Mancanza corrente MMU"
 
 
-#MSG_STEALTH_MODE_ON c=0 r=0
+#MSG_STEALTH_MODE_ON
 "Mode    [Stealth]"
 "Mode    [Stealth]"
 "Modo [Silenziosa]"
 "Modo [Silenziosa]"
 
 
-#MSG_AUTO_MODE_ON c=0 r=0
+#MSG_AUTO_MODE_ON
 "Mode [auto power]"
 "Mode [auto power]"
 "Modo       [auto]"
 "Modo       [auto]"
 
 
-#MSG_SILENT_MODE_OFF c=0 r=0
+#MSG_SILENT_MODE_OFF
 "Mode [high power]"
 "Mode [high power]"
 "Mode      [forte]"
 "Mode      [forte]"
 
 
@@ -706,31 +618,31 @@
 "MMU2 connected"
 "MMU2 connected"
 "MMU2 connessa"
 "MMU2 connessa"
 
 
-#MSG_SELFTEST_MOTOR c=0 r=0
+#MSG_SELFTEST_MOTOR
 "Motor"
 "Motor"
 "Motore"
 "Motore"
 
 
-#MSG_MOVE_AXIS c=0 r=0
+#MSG_MOVE_AXIS
 "Move axis"
 "Move axis"
 "Muovi asse"
 "Muovi asse"
 
 
-#MSG_MOVE_X c=0 r=0
+#MSG_MOVE_X
 "Move X"
 "Move X"
 "Muovi X"
 "Muovi X"
 
 
-#MSG_MOVE_Y c=0 r=0
+#MSG_MOVE_Y
 "Move Y"
 "Move Y"
 "Muovi Y"
 "Muovi Y"
 
 
-#MSG_MOVE_Z c=0 r=0
+#MSG_MOVE_Z
 "Move Z"
 "Move Z"
 "Muovi Z"
 "Muovi Z"
 
 
-#MSG_NO_MOVE c=0 r=0
+#MSG_NO_MOVE
 "No move."
 "No move."
 "Nessun movimento."
 "Nessun movimento."
 
 
-#MSG_NO_CARD c=0 r=0
+#MSG_NO_CARD
 "No SD card"
 "No SD card"
 "Nessuna SD"
 "Nessuna SD"
 
 
@@ -738,11 +650,11 @@
 "N/A"
 "N/A"
 "\x00"
 "\x00"
 
 
-#MSG_NO c=0 r=0
+#MSG_NO
 "No"
 "No"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_NOTCONNECTED c=0 r=0
+#MSG_SELFTEST_NOTCONNECTED
 "Not connected"
 "Not connected"
 "Non connesso"
 "Non connesso"
 
 
@@ -750,11 +662,7 @@
 "New firmware version available:"
 "New firmware version available:"
 "Nuova versione firmware disponibile:"
 "Nuova versione firmware disponibile:"
 
 
-#
-"No "
-"No"
-
-#MSG_SELFTEST_FAN_NO c=19 r=0
+#MSG_SELFTEST_FAN_NO c=19
 "Not spinning"
 "Not spinning"
 "Non gira"
 "Non gira"
 
 
@@ -766,7 +674,7 @@
 "Now I will preheat nozzle for PLA."
 "Now I will preheat nozzle for PLA."
 "Adesso preriscaldero l'ugello per PLA."
 "Adesso preriscaldero l'ugello per PLA."
 
 
-#MSG_NOZZLE c=0 r=0
+#MSG_NOZZLE
 "Nozzle"
 "Nozzle"
 "Ugello"
 "Ugello"
 
 
@@ -782,7 +690,7 @@
 "Nozzle FAN"
 "Nozzle FAN"
 "Ventola estrusore"
 "Ventola estrusore"
 
 
-#MSG_PAUSE_PRINT c=0 r=0
+#MSG_PAUSE_PRINT
 "Pause print"
 "Pause print"
 "Metti in pausa"
 "Metti in pausa"
 
 
@@ -814,7 +722,7 @@
 "Please clean the nozzle for calibration. Click when done."
 "Please clean the nozzle for calibration. Click when done."
 "Pulire l'ugello per la calibrazione, poi fare click."
 "Pulire l'ugello per la calibrazione, poi fare click."
 
 
-#MSG_SELFTEST_PLEASECHECK c=0 r=0
+#MSG_SELFTEST_PLEASECHECK
 "Please check :"
 "Please check :"
 "Verifica:"
 "Verifica:"
 
 
@@ -866,7 +774,7 @@
 "Please update firmware in your MMU2. Waiting for reset."
 "Please update firmware in your MMU2. Waiting for reset."
 "Aggiorna il firmware sul tuo MMU2. In attesa di reset. "
 "Aggiorna il firmware sul tuo MMU2. In attesa di reset. "
 
 
-#MSG_PLEASE_WAIT c=20 r=0
+#MSG_PLEASE_WAIT c=20
 "Please wait"
 "Please wait"
 "Attendere"
 "Attendere"
 
 
@@ -874,11 +782,11 @@
 "Please remove shipping helpers first."
 "Please remove shipping helpers first."
 "Per favore rimuovete i materiali da spedizione"
 "Per favore rimuovete i materiali da spedizione"
 
 
-#MSG_PREHEAT_NOZZLE c=20 r=0
+#MSG_PREHEAT_NOZZLE c=20
 "Preheat the nozzle!"
 "Preheat the nozzle!"
 "Prerisc. ugello!"
 "Prerisc. ugello!"
 
 
-#MSG_PREHEAT c=0 r=0
+#MSG_PREHEAT
 "Preheat"
 "Preheat"
 "Preriscalda"
 "Preriscalda"
 
 
@@ -898,7 +806,7 @@
 "Power failures"
 "Power failures"
 "Mancanza corrente"
 "Mancanza corrente"
 
 
-#MSG_PRINT_ABORTED c=20 r=0
+#MSG_PRINT_ABORTED c=20
 "Print aborted"
 "Print aborted"
 "Stampa interrotta"
 "Stampa interrotta"
 
 
@@ -910,11 +818,11 @@
 "Preheating to unload"
 "Preheating to unload"
 "Preriscaldamento per scaricare"
 "Preriscaldamento per scaricare"
 
 
-#MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_PRINT_FAN_SPEED c=18
 "Print fan:"
 "Print fan:"
 "Ventola di stampa:"
 "Ventola di stampa:"
 
 
-#MSG_CARD_MENU c=0 r=0
+#MSG_CARD_MENU
 "Print from SD"
 "Print from SD"
 "Stampa da SD"
 "Stampa da SD"
 
 
@@ -938,15 +846,7 @@
 "Print FAN"
 "Print FAN"
 "Ventola di stampa"
 "Ventola di stampa"
 
 
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK2.5 ready."
-"\x00"
-
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK3 ready."
-"Prusa i3 MK3 pronta."
-
-#MSG_PRUSA3D c=0 r=0
+#MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
 "\x00"
 "\x00"
 
 
@@ -966,19 +866,15 @@
 "Prusa i3 MK3S OK."
 "Prusa i3 MK3S OK."
 "\x00"
 "\x00"
 
 
-#
-"Prusa i3 MK2 ready."
-"Prusa i3 MK2 pronta."
-
-#MSG_CALIBRATE_BED_RESET c=0 r=0
+#MSG_CALIBRATE_BED_RESET
 "Reset XYZ calibr."
 "Reset XYZ calibr."
 "Reset calibrazione XYZ."
 "Reset calibrazione XYZ."
 
 
-#MSG_BED_CORRECTION_RESET c=0 r=0
+#MSG_BED_CORRECTION_RESET
 "Reset"
 "Reset"
 "\x00"
 "\x00"
 
 
-#MSG_RESUME_PRINT c=0 r=0
+#MSG_RESUME_PRINT
 "Resume print"
 "Resume print"
 "Riprendi stampa"
 "Riprendi stampa"
 
 
@@ -1014,31 +910,31 @@
 "Right"
 "Right"
 "Destra"
 "Destra"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
+#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60
 "Searching bed calibration point"
 "Searching bed calibration point"
 "Ricerca dei punti di calibrazione del piano"
 "Ricerca dei punti di calibrazione del piano"
 
 
-#MSG_LANGUAGE_SELECT c=0 r=0
+#MSG_LANGUAGE_SELECT
 "Select language"
 "Select language"
 "Seleziona lingua"
 "Seleziona lingua"
 
 
-#MSG_SELFTEST_OK c=0 r=0
+#MSG_SELFTEST_OK
 "Self test OK"
 "Self test OK"
 "Autotest OK"
 "Autotest OK"
 
 
-#MSG_SELFTEST_START c=20 r=0
+#MSG_SELFTEST_START c=20
 "Self test start  "
 "Self test start  "
 "Avvia autotest"
 "Avvia autotest"
 
 
-#MSG_SELFTEST c=0 r=0
+#MSG_SELFTEST
 "Selftest         "
 "Selftest         "
 "Autotest"
 "Autotest"
 
 
-#MSG_SELFTEST_ERROR c=0 r=0
+#MSG_SELFTEST_ERROR
 "Selftest error !"
 "Selftest error !"
 "Errore Autotest !"
 "Errore Autotest !"
 
 
-#MSG_SELFTEST_FAILED c=20 r=0
+#MSG_SELFTEST_FAILED c=20
 "Selftest failed  "
 "Selftest failed  "
 "Autotest fallito"
 "Autotest fallito"
 
 
@@ -1058,7 +954,7 @@
 "Set temperature:"
 "Set temperature:"
 "Imposta temperatura:"
 "Imposta temperatura:"
 
 
-#MSG_SETTINGS c=0 r=0
+#MSG_SETTINGS
 "Settings"
 "Settings"
 "Impostazioni"
 "Impostazioni"
 
 
@@ -1070,33 +966,25 @@
 "Sensor state"
 "Sensor state"
 "Stato sensore"
 "Stato sensore"
 
 
-#
-"Sensors info"
-"Info Sensori"
-
-#
-"Show pinda state"
-"Mostra stato pinda"
-
 #MSG_FILE_CNT c=20 r=4
 #MSG_FILE_CNT c=20 r=4
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Alcuni file non saranno ordinati. Il numero massimo di file in una cartella e 100 perche siano ordinati."
 "Alcuni file non saranno ordinati. Il numero massimo di file in una cartella e 100 perche siano ordinati."
 
 
 #MSG_SORT_NONE c=17 r=1
 #MSG_SORT_NONE c=17 r=1
-"Sort:      [none]"
-"Ordina:    [none]"
+"Sort       [none]"
+"Ordina     [none]"
 
 
 #MSG_SORT_TIME c=17 r=1
 #MSG_SORT_TIME c=17 r=1
-"Sort:      [time]"
-"Ordina:    [time]"
+"Sort       [time]"
+"Ordina     [time]"
 
 
 #
 #
 "Severe skew"
 "Severe skew"
 "Disassamento grave"
 "Disassamento grave"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
-"Sort:  [alphabet]"
-"Ordine: [alfabet]"
+"Sort   [alphabet]"
+"Ordine  [alfabet]"
 
 
 #MSG_SORTING c=20 r=1
 #MSG_SORTING c=20 r=1
 "Sorting files"
 "Sorting files"
@@ -1126,11 +1014,11 @@
 "Sound    [silent]"
 "Sound    [silent]"
 "Suono[silenzioso]"
 "Suono[silenzioso]"
 
 
-#MSG_SPEED c=0 r=0
+#MSG_SPEED
 "Speed"
 "Speed"
 "Velocita"
 "Velocita"
 
 
-#MSG_SELFTEST_FAN_YES c=19 r=0
+#MSG_SELFTEST_FAN_YES c=19
 "Spinning"
 "Spinning"
 "Gira"
 "Gira"
 
 
@@ -1138,23 +1026,23 @@
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Sono necessari una temperatura ambiente di 21-26C e una superficie rigida "
 "Sono necessari una temperatura ambiente di 21-26C e una superficie rigida "
 
 
-#MSG_STATISTICS c=0 r=0
+#MSG_STATISTICS
 "Statistics  "
 "Statistics  "
 "Statistiche"
 "Statistiche"
 
 
-#MSG_STOP_PRINT c=0 r=0
+#MSG_STOP_PRINT
 "Stop print"
 "Stop print"
 "Arresta stampa"
 "Arresta stampa"
 
 
-#MSG_STOPPED c=0 r=0
+#MSG_STOPPED
 "STOPPED. "
 "STOPPED. "
 "ARRESTATO."
 "ARRESTATO."
 
 
-#MSG_SUPPORT c=0 r=0
+#MSG_SUPPORT
 "Support"
 "Support"
 "Supporto"
 "Supporto"
 
 
-#MSG_SELFTEST_SWAPPED c=0 r=0
+#MSG_SELFTEST_SWAPPED
 "Swapped"
 "Swapped"
 "Scambiato"
 "Scambiato"
 
 
@@ -1182,7 +1070,7 @@
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Calibrazione temperatura completata e attiva. Puo essere disattivata dal menu Impostazioni ->Cal. Temp."
 "Calibrazione temperatura completata e attiva. Puo essere disattivata dal menu Impostazioni ->Cal. Temp."
 
 
-#MSG_TEMPERATURE c=0 r=0
+#MSG_TEMPERATURE
 "Temperature"
 "Temperature"
 "\x00"
 "\x00"
 
 
@@ -1202,7 +1090,7 @@
 "Total print time"
 "Total print time"
 "Tempo di stampa totale"
 "Tempo di stampa totale"
 
 
-#MSG_TUNE c=0 r=0
+#MSG_TUNE
 "Tune"
 "Tune"
 "Regola"
 "Regola"
 
 
@@ -1210,10 +1098,6 @@
 "Unload"
 "Unload"
 "Scarica"
 "Scarica"
 
 
-#
-"Unload all"
-"Rilasciare tutti"
-
 #
 #
 "Total failures"
 "Total failures"
 "Totale fallimenti"
 "Totale fallimenti"
@@ -1226,7 +1110,7 @@
 "to unload filament"
 "to unload filament"
 "per scaricare il filamento"
 "per scaricare il filamento"
 
 
-#MSG_UNLOAD_FILAMENT c=17 r=0
+#MSG_UNLOAD_FILAMENT c=17
 "Unload filament"
 "Unload filament"
 "Scarica filam."
 "Scarica filam."
 
 
@@ -1250,7 +1134,7 @@
 "unknown"
 "unknown"
 "sconosciuto"
 "sconosciuto"
 
 
-#MSG_USERWAIT c=0 r=0
+#MSG_USERWAIT
 "Wait for user..."
 "Wait for user..."
 "Attendendo utente..."
 "Attendendo utente..."
 
 
@@ -1282,7 +1166,7 @@
 "Was filament unload successful?"
 "Was filament unload successful?"
 "Filamento scaricato con successo?"
 "Filamento scaricato con successo?"
 
 
-#MSG_SELFTEST_WIRINGERROR c=0 r=0
+#MSG_SELFTEST_WIRINGERROR
 "Wiring error"
 "Wiring error"
 "Errore cablaggio"
 "Errore cablaggio"
 
 
@@ -1298,7 +1182,7 @@
 "XYZ calibration failed. Please consult the manual."
 "XYZ calibration failed. Please consult the manual."
 "Calibrazione XYZ fallita. Si prega di consultare il manuale."
 "Calibrazione XYZ fallita. Si prega di consultare il manuale."
 
 
-#MSG_YES c=0 r=0
+#MSG_YES
 "Yes"
 "Yes"
 "Si"
 "Si"
 
 
@@ -1315,8 +1199,8 @@
 "Calibrazion XYZ corretta. Assi X/Y leggermente storti. Ben fatto!"
 "Calibrazion XYZ corretta. Assi X/Y leggermente storti. Ben fatto!"
 
 
 #
 #
-"X-correct"
-"Correzione-X"
+"X-correct:"
+"Correzione-X:"
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
@@ -1330,18 +1214,10 @@
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 "Calibrazione XYZ compromessa. Punto anteriore destro non raggiungibile."
 "Calibrazione XYZ compromessa. Punto anteriore destro non raggiungibile."
 
 
-#MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-"XYZ calibration compromised. Left front calibration point not reachable."
-"Calibrazione XYZ compromessa. Punto anteriore sinistro non raggiungibile."
-
-#MSG_LOAD_ALL c=17 r=0
+#MSG_LOAD_ALL c=17
 "Load all"
 "Load all"
 "Caricare tutti"
 "Caricare tutti"
 
 
-#MSG_LOAD_FILAMENT_1 c=17 r=0
-"Load filament 1"
-"Caricare fil. 1"
-
 #
 #
 "XYZ calibration failed. Bed calibration point was not found."
 "XYZ calibration failed. Bed calibration point was not found."
 "Calibrazione XYZ fallita. Il punto di calibrazione sul letto non e' stato trovato."
 "Calibrazione XYZ fallita. Il punto di calibrazione sul letto non e' stato trovato."
@@ -1350,38 +1226,18 @@
 "XYZ calibration failed. Front calibration points not reachable."
 "XYZ calibration failed. Front calibration points not reachable."
 "Calibrazione XYZ fallita. Punti anteriori non raggiungibili."
 "Calibrazione XYZ fallita. Punti anteriori non raggiungibili."
 
 
-#
-"XYZ calibration failed. Left front calibration point not reachable."
-"Calibrazione XYZ fallita. Punto anteriore sinistro non raggiungibile."
-
-#MSG_LOAD_FILAMENT_2 c=17 r=0
-"Load filament 2"
-"Caricare fil. 2"
-
 #
 #
 "XYZ calibration failed. Right front calibration point not reachable."
 "XYZ calibration failed. Right front calibration point not reachable."
 "Calibrazione XYZ fallita. Punto anteriore destro non raggiungibile."
 "Calibrazione XYZ fallita. Punto anteriore destro non raggiungibile."
 
 
-#MSG_LOAD_FILAMENT_3 c=17 r=0
-"Load filament 3"
-"Carica fil. 3"
-
 #
 #
 "Y distance from min"
 "Y distance from min"
 "Distanza Y dal min"
 "Distanza Y dal min"
 
 
 #
 #
-"Y-correct"
-"Correzione-Y"
-
-#MSG_LOAD_FILAMENT_4 c=17 r=0
-"Load filament 4"
-"Caricare fil. 4"
-
-#MSG_LOAD_FILAMENT_5 c=17 r=0
-"Load filament 5"
-"Caricare fil. 5"
+"Y-correct:"
+"Correzione-Y:"
 
 
-#MSG_OFF c=0 r=0
+#MSG_OFF
 " [off]"
 " [off]"
 "\x00"
 "\x00"

+ 134 - 278
lang/lang_en_pl.txt

@@ -1,12 +1,12 @@
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
+#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
 " of 4"
 " of 4"
 " z 4"
 " z 4"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14
 " of 9"
 " of 9"
 " z 9"
 " z 9"
 
 
-#MSG_MEASURED_OFFSET c=0 r=0
+#MSG_MEASURED_OFFSET
 "[0;0] point offset"
 "[0;0] point offset"
 "[0;0] przesuniecie punktu"
 "[0;0] przesuniecie punktu"
 
 
@@ -22,11 +22,11 @@
 ">Cancel"
 ">Cancel"
 ">Anuluj"
 ">Anuluj"
 
 
-#MSG_BABYSTEPPING_Z c=20 r=0
-"Adjusting Z"
-"Dostrajanie Z"
+#MSG_BABYSTEPPING_Z c=15
+"Adjusting Z:"
+"Dostrajanie Z:"
 
 
-#MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
+#MSG_SELFTEST_CHECK_ALLCORRECT c=20
 "All correct      "
 "All correct      "
 "Wszystko OK "
 "Wszystko OK "
 
 
@@ -38,7 +38,7 @@
 "Ambient"
 "Ambient"
 "Otoczenie"
 "Otoczenie"
 
 
-#MSG_PRESS c=20 r=0
+#MSG_PRESS c=20
 "and press the knob"
 "and press the knob"
 "i nacisnij pokretlo"
 "i nacisnij pokretlo"
 
 
@@ -54,15 +54,15 @@
 "SpoolJoin   [N/A]"
 "SpoolJoin   [N/A]"
 "SpoolJoin    [nd]"
 "SpoolJoin    [nd]"
 
 
-# MSG_AUTO_DEPLETE_OFF c=17 r=1
+#MSG_AUTO_DEPLETE_OFF c=17 r=1
 "SpoolJoin   [off]"
 "SpoolJoin   [off]"
 "SpoolJoin   [wyl]"
 "SpoolJoin   [wyl]"
 
 
-#MSG_AUTO_HOME c=0 r=0
+#MSG_AUTO_HOME
 "Auto home"
 "Auto home"
 "Auto zerowanie"
 "Auto zerowanie"
 
 
-#MSG_AUTOLOAD_FILAMENT c=17 r=0
+#MSG_AUTOLOAD_FILAMENT c=17
 "AutoLoad filament"
 "AutoLoad filament"
 "AutoLadowanie fil."
 "AutoLadowanie fil."
 
 
@@ -74,27 +74,27 @@
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoladowanie filamentu wlaczone, nacisnij pokretlo i wsun filament..."
 "Autoladowanie filamentu wlaczone, nacisnij pokretlo i wsun filament..."
 
 
-#MSG_SELFTEST_AXIS_LENGTH c=0 r=0
+#MSG_SELFTEST_AXIS_LENGTH
 "Axis length"
 "Axis length"
 "Dlugosc osi"
 "Dlugosc osi"
 
 
-#MSG_SELFTEST_AXIS c=0 r=0
+#MSG_SELFTEST_AXIS
 "Axis"
 "Axis"
 "Os"
 "Os"
 
 
-#MSG_SELFTEST_BEDHEATER c=0 r=0
+#MSG_SELFTEST_BEDHEATER
 "Bed / Heater"
 "Bed / Heater"
 "Stol / Grzanie"
 "Stol / Grzanie"
 
 
-#MSG_BED_DONE c=0 r=0
+#MSG_BED_DONE
 "Bed done"
 "Bed done"
 "Stol OK"
 "Stol OK"
 
 
-#MSG_BED_HEATING c=0 r=0
+#MSG_BED_HEATING
 "Bed Heating"
 "Bed Heating"
 "Grzanie stolu.."
 "Grzanie stolu.."
 
 
-#MSG_BED_CORRECTION_MENU c=0 r=0
+#MSG_BED_CORRECTION_MENU
 "Bed level correct"
 "Bed level correct"
 "Korekta poziomowania stolu"
 "Korekta poziomowania stolu"
 
 
@@ -102,15 +102,7 @@
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Kalibracja nieudana. Sensor nie aktywowal sie. Zanieczysz. dysza? Czekam na reset."
 "Kalibracja nieudana. Sensor nie aktywowal sie. Zanieczysz. dysza? Czekam na reset."
 
 
-#MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED c=20 r=4
-"Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset."
-"Poziomowanie stolu nieudane. Sensor odlacz. lub uszkodz. przewod. Czekam na reset."
-
-#MSG_BED_LEVELING_FAILED_POINT_HIGH c=20 r=4
-"Bed leveling failed. Sensor triggered too high. Waiting for reset."
-"Kalibracja Z nieudana. Sensor aktywowal za wysoko. Czekam na reset."
-
-#MSG_BED c=0 r=0
+#MSG_BED
 "Bed"
 "Bed"
 "Stol"
 "Stol"
 
 
@@ -126,11 +118,11 @@
 "Calibrating home"
 "Calibrating home"
 "Zerowanie osi"
 "Zerowanie osi"
 
 
-#MSG_CALIBRATE_BED c=0 r=0
+#MSG_CALIBRATE_BED
 "Calibrate XYZ"
 "Calibrate XYZ"
 "Kalibracja XYZ"
 "Kalibracja XYZ"
 
 
-#MSG_HOMEYZ c=0 r=0
+#MSG_HOMEYZ
 "Calibrate Z"
 "Calibrate Z"
 "Kalibruj Z"
 "Kalibruj Z"
 
 
@@ -150,11 +142,11 @@
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Kalibracja XYZ. Przekrec pokretlo, aby przesunac os Z do gornych ogranicznikow. Nacisnij, by potwierdzic."
 "Kalibracja XYZ. Przekrec pokretlo, aby przesunac os Z do gornych ogranicznikow. Nacisnij, by potwierdzic."
 
 
-#MSG_HOMEYZ_DONE c=0 r=0
+#MSG_HOMEYZ_DONE
 "Calibration done"
 "Calibration done"
 "Kalibracja OK"
 "Kalibracja OK"
 
 
-#MSG_MENU_CALIBRATION c=0 r=0
+#MSG_MENU_CALIBRATION
 "Calibration"
 "Calibration"
 "Kalibracja"
 "Kalibracja"
 
 
@@ -162,19 +154,15 @@
 "Cancel"
 "Cancel"
 "Anuluj"
 "Anuluj"
 
 
-#MSG_SD_INSERTED c=0 r=0
-"Card inserted"
-"Karta wlozona"
-
-#MSG_SD_REMOVED c=0 r=0
+#MSG_SD_REMOVED
 "Card removed"
 "Card removed"
 "Karta wyjeta"
 "Karta wyjeta"
 
 
-#MSG_NOT_COLOR c=0 r=0
+#MSG_NOT_COLOR
 "Color not correct"
 "Color not correct"
 "Kolor zanieczysz."
 "Kolor zanieczysz."
 
 
-#MSG_COOLDOWN c=0 r=0
+#MSG_COOLDOWN
 "Cooldown"
 "Cooldown"
 "Chlodzenie"
 "Chlodzenie"
 
 
@@ -182,15 +170,15 @@
 "Copy selected language?"
 "Copy selected language?"
 "Skopiowac wybrany jezyk?"
 "Skopiowac wybrany jezyk?"
 
 
-#MSG_CRASHDETECT_ON c=0 r=0
+#MSG_CRASHDETECT_ON
 "Crash det.   [on]"
 "Crash det.   [on]"
 "Wykr.zderzen [wl]"
 "Wykr.zderzen [wl]"
 
 
-#MSG_CRASHDETECT_NA c=0 r=0
+#MSG_CRASHDETECT_NA
 "Crash det.  [N/A]"
 "Crash det.  [N/A]"
 "Wykr.zderzen[n/d]"
 "Wykr.zderzen[n/d]"
 
 
-#MSG_CRASHDETECT_OFF c=0 r=0
+#MSG_CRASHDETECT_OFF
 "Crash det.  [off]"
 "Crash det.  [off]"
 "Wykr.zderzen[wyl]"
 "Wykr.zderzen[wyl]"
 
 
@@ -214,7 +202,7 @@
 "Date:"
 "Date:"
 "Data:"
 "Data:"
 
 
-#MSG_DISABLE_STEPPERS c=0 r=0
+#MSG_DISABLE_STEPPERS
 "Disable steppers"
 "Disable steppers"
 "Wylaczenie silnikow"
 "Wylaczenie silnikow"
 
 
@@ -226,34 +214,14 @@
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Chcesz powtorzyc ostatni krok i ponownie ustawic odleglosc miedzy dysza a stolikiem?"
 "Chcesz powtorzyc ostatni krok i ponownie ustawic odleglosc miedzy dysza a stolikiem?"
 
 
-#MSG_EXTRUDER_CORRECTION c=9 r=0
-"E-correct"
-"Korekcja E"
+#MSG_EXTRUDER_CORRECTION c=10
+"E-correct:"
+"Korekcja E:"
 
 
 #MSG_EJECT_FILAMENT c=17 r=1
 #MSG_EJECT_FILAMENT c=17 r=1
 "Eject filament"
 "Eject filament"
 "Wysun filament"
 "Wysun filament"
 
 
-#MSG_EJECT_FILAMENT1 c=17 r=1
-"Eject filament 1"
-"Wysun filament 1"
-
-#MSG_EJECT_FILAMENT2 c=17 r=1
-"Eject filament 2"
-"Wysun filament 2"
-
-#MSG_EJECT_FILAMENT3 c=17 r=1
-"Eject filament 3"
-"Wysun filament 3"
-
-#MSG_EJECT_FILAMENT4 c=17 r=1
-"Eject filament 4"
-"Wysun filament 4"
-
-#MSG_EJECT_FILAMENT5 c=17 r=1
-"Eject filament 5"
-"Wysun filament 5"
-
 #
 #
 "Eject"
 "Eject"
 "Wysun"
 "Wysun"
@@ -266,11 +234,11 @@
 "Endstop not hit"
 "Endstop not hit"
 "Krancowka nie aktyw."
 "Krancowka nie aktyw."
 
 
-#MSG_SELFTEST_ENDSTOP c=0 r=0
+#MSG_SELFTEST_ENDSTOP
 "Endstop"
 "Endstop"
 "Krancowka"
 "Krancowka"
 
 
-#MSG_SELFTEST_ENDSTOPS c=0 r=0
+#MSG_SELFTEST_ENDSTOPS
 "Endstops"
 "Endstops"
 "Krancowki"
 "Krancowki"
 
 
@@ -282,31 +250,11 @@
 "ERROR: Filament sensor is not responding, please check connection."
 "ERROR: Filament sensor is not responding, please check connection."
 "BLAD: Czujnik filamentu nie odpowiada, sprawdz polaczenie."
 "BLAD: Czujnik filamentu nie odpowiada, sprawdz polaczenie."
 
 
-#MSG_ERROR c=0 r=0
+#MSG_ERROR
 "ERROR:"
 "ERROR:"
 "BLAD:"
 "BLAD:"
 
 
-#
-"External SPI flash W25X20CL not responding."
-"Zewnetrzna pamiec flash SPI W25X20CL nie odpowiada."
-
-#
-"Extruder 1"
-"Ekstruder 1"
-
-#
-"Extruder 2"
-"Ekstruder 2"
-
-#
-"Extruder 3"
-"Ekstruder 3"
-
-#
-"Extruder 4"
-"Ekstruder 4"
-
-#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 "Extruder fan:"
 "Extruder fan:"
 "Went. ekstrudera:"
 "Went. ekstrudera:"
 
 
@@ -314,7 +262,7 @@
 "Extruder info"
 "Extruder info"
 "Informacje o ekstruderze"
 "Informacje o ekstruderze"
 
 
-#MSG_MOVE_E c=0 r=0
+#MSG_MOVE_E
 "Extruder"
 "Extruder"
 "Ekstruder"
 "Ekstruder"
 
 
@@ -338,11 +286,11 @@
 "Fail stats"
 "Fail stats"
 "Statystyki bledow"
 "Statystyki bledow"
 
 
-#MSG_FAN_SPEED c=14 r=0
+#MSG_FAN_SPEED c=14
 "Fan speed"
 "Fan speed"
 "Predkosc went."
 "Predkosc went."
 
 
-#MSG_SELFTEST_FAN c=20 r=0
+#MSG_SELFTEST_FAN c=20
 "Fan test"
 "Fan test"
 "Test wentylatora"
 "Test wentylatora"
 
 
@@ -354,19 +302,15 @@
 "Fans check  [off]"
 "Fans check  [off]"
 "Sprawd.went.[wyl]"
 "Sprawd.went.[wyl]"
 
 
-#MSG_FSENSOR_ON c=0 r=0
+#MSG_FSENSOR_ON
 "Fil. sensor  [on]"
 "Fil. sensor  [on]"
 "Czuj. filam. [wl]"
 "Czuj. filam. [wl]"
 
 
-#MSG_RESPONSE_POOR c=20 r=2
-"Fil. sensor response is poor, disable it?"
-"Reakcja czujnika slaba, wylaczyc?"
-
-#MSG_FSENSOR_NA c=0 r=0
+#MSG_FSENSOR_NA
 "Fil. sensor [N/A]"
 "Fil. sensor [N/A]"
 "Czuj. filam.[N/D]"
 "Czuj. filam.[N/D]"
 
 
-#MSG_FSENSOR_OFF c=0 r=0
+#MSG_FSENSOR_OFF
 "Fil. sensor [off]"
 "Fil. sensor [off]"
 "Czuj. filam.[wyl]"
 "Czuj. filam.[wyl]"
 
 
@@ -378,18 +322,14 @@
 "Filament extruding & with correct color?"
 "Filament extruding & with correct color?"
 "Filament wychodzi z dyszy a kolor jest czysty?"
 "Filament wychodzi z dyszy a kolor jest czysty?"
 
 
-#MSG_NOT_LOADED c=19 r=0
+#MSG_NOT_LOADED c=19
 "Filament not loaded"
 "Filament not loaded"
 "Fil. nie zaladowany"
 "Fil. nie zaladowany"
 
 
-#MSG_FILAMENT_SENSOR c=20 r=0
+#MSG_FILAMENT_SENSOR c=20
 "Filament sensor"
 "Filament sensor"
 "Czujnik filamentu"
 "Czujnik filamentu"
 
 
-#MSG_SELFTEST_FILAMENT_SENSOR c=18 r=0
-"Filament sensor:"
-"Czujnik filamentu:"
-
 #MSG_FILAMENT_USED c=19 r=1
 #MSG_FILAMENT_USED c=19 r=1
 "Filament used"
 "Filament used"
 "Uzyty filament"
 "Uzyty filament"
@@ -418,15 +358,15 @@
 "Fix the issue and then press button on MMU unit."
 "Fix the issue and then press button on MMU unit."
 "Rozwiaz problem i wcisnij przycisk na MMU."
 "Rozwiaz problem i wcisnij przycisk na MMU."
 
 
-#MSG_FLOW c=0 r=0
+#MSG_FLOW
 "Flow"
 "Flow"
 "Przeplyw"
 "Przeplyw"
 
 
-#MSG_PRUSA3D_FORUM c=0 r=0
+#MSG_PRUSA3D_FORUM
 "forum.prusa3d.com"
 "forum.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#MSG_SELFTEST_COOLING_FAN c=20 r=0
+#MSG_SELFTEST_COOLING_FAN c=20
 "Front print fan?"
 "Front print fan?"
 "Przedni went. druku?"
 "Przedni went. druku?"
 
 
@@ -434,23 +374,23 @@
 "Front side[um]"
 "Front side[um]"
 "Przod [um]"
 "Przod [um]"
 
 
-#MSG_SELFTEST_FANS c=0 r=0
+#MSG_SELFTEST_FANS
 "Front/left fans"
 "Front/left fans"
 "Przedni/lewy wentylator"
 "Przedni/lewy wentylator"
 
 
-#MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
+#MSG_SELFTEST_HEATERTHERMISTOR
 "Heater/Thermistor"
 "Heater/Thermistor"
 "Grzalka/Termistor"
 "Grzalka/Termistor"
 
 
-#MSG_BED_HEATING_SAFETY_DISABLED c=0 r=0
+#MSG_BED_HEATING_SAFETY_DISABLED
 "Heating disabled by safety timer."
 "Heating disabled by safety timer."
 "Grzanie wylaczone przez wyl. czasowy"
 "Grzanie wylaczone przez wyl. czasowy"
 
 
-#MSG_HEATING_COMPLETE c=20 r=0
+#MSG_HEATING_COMPLETE c=20
 "Heating done."
 "Heating done."
 "Grzanie zakonczone"
 "Grzanie zakonczone"
 
 
-#MSG_HEATING c=0 r=0
+#MSG_HEATING
 "Heating"
 "Heating"
 "Grzanie..."
 "Grzanie..."
 
 
@@ -458,51 +398,47 @@
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Czesc, jestem Twoja drukarka Original Prusa i3. Czy potrzebujesz pomocy z ustawieniem?"
 "Czesc, jestem Twoja drukarka Original Prusa i3. Czy potrzebujesz pomocy z ustawieniem?"
 
 
-#MSG_PRUSA3D_HOWTO c=0 r=0
+#MSG_PRUSA3D_HOWTO
 "howto.prusa3d.com"
 "howto.prusa3d.com"
 "\x00"
 "\x00"
 
 
-#
-"Change extruder"
-"Zmiana ekstrudera"
-
-#MSG_FILAMENTCHANGE c=0 r=0
+#MSG_FILAMENTCHANGE
 "Change filament"
 "Change filament"
 "Wymiana filamentu"
 "Wymiana filamentu"
 
 
-#MSG_CHANGE_SUCCESS c=0 r=0
+#MSG_CHANGE_SUCCESS
 "Change success!"
 "Change success!"
 "Wymiana ok!"
 "Wymiana ok!"
 
 
-#MSG_CORRECTLY c=20 r=0
+#MSG_CORRECTLY c=20
 "Changed correctly?"
 "Changed correctly?"
 "Wymiana ok?"
 "Wymiana ok?"
 
 
-#MSG_SELFTEST_CHECK_BED c=20 r=0
+#MSG_SELFTEST_CHECK_BED c=20
 "Checking bed     "
 "Checking bed     "
 "Kontrola stolu"
 "Kontrola stolu"
 
 
-#MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
+#MSG_SELFTEST_CHECK_ENDSTOPS c=20
 "Checking endstops"
 "Checking endstops"
 "Kontrola krancowek"
 "Kontrola krancowek"
 
 
-#MSG_SELFTEST_CHECK_HOTEND c=20 r=0
+#MSG_SELFTEST_CHECK_HOTEND c=20
 "Checking hotend  "
 "Checking hotend  "
 "Kontrola hotendu"
 "Kontrola hotendu"
 
 
-#MSG_SELFTEST_CHECK_FSENSOR c=20 r=0
+#MSG_SELFTEST_CHECK_FSENSOR c=20
 "Checking sensors "
 "Checking sensors "
 "Sprawdzanie czujnikow"
 "Sprawdzanie czujnikow"
 
 
-#MSG_SELFTEST_CHECK_X c=20 r=0
+#MSG_SELFTEST_CHECK_X c=20
 "Checking X axis  "
 "Checking X axis  "
 "Kontrola osi X"
 "Kontrola osi X"
 
 
-#MSG_SELFTEST_CHECK_Y c=20 r=0
+#MSG_SELFTEST_CHECK_Y c=20
 "Checking Y axis  "
 "Checking Y axis  "
 "Kontrola osi Y"
 "Kontrola osi Y"
 
 
-#MSG_SELFTEST_CHECK_Z c=20 r=0
+#MSG_SELFTEST_CHECK_Z c=20
 "Checking Z axis  "
 "Checking Z axis  "
 "Kontrola osi Z"
 "Kontrola osi Z"
 
 
@@ -530,35 +466,15 @@
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
 "Zaczne drukowac linie. Stopniowo opuszczaj dysze przekrecajac pokretlo, poki nie uzyskasz optymalnej wysokosci. Sprawdz obrazki w naszym Podreczniku w rozdz. Kalibracja"
 "Zaczne drukowac linie. Stopniowo opuszczaj dysze przekrecajac pokretlo, poki nie uzyskasz optymalnej wysokosci. Sprawdz obrazki w naszym Podreczniku w rozdz. Kalibracja"
 
 
-#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
-"Improving bed calibration point"
-"Poprawiam precyzje punktu kalibracyjnego"
-
-#MSG_WATCH c=0 r=0
+#MSG_WATCH
 "Info screen"
 "Info screen"
 "Ekran informacyjny"
 "Ekran informacyjny"
 
 
-#MSG_FILAMENT_LOADING_T0 c=20 r=4
-"Insert filament into extruder 1. Click when done."
-"Wloz filament do ekstrudera 1. Potwierdz naciskajac pokretlo."
-
-#MSG_FILAMENT_LOADING_T1 c=20 r=4
-"Insert filament into extruder 2. Click when done."
-"Wloz filament do ekstrudera 2. Potwierdz naciskajac pokretlo."
-
-#MSG_FILAMENT_LOADING_T2 c=20 r=4
-"Insert filament into extruder 3. Click when done."
-"Wloz filament do ekstrudera 3. Potwierdz naciskajac pokretlo."
-
-#MSG_FILAMENT_LOADING_T3 c=20 r=4
-"Insert filament into extruder 4. Click when done."
-"Wloz filament do ekstrudera 4. Potwierdz naciskajac pokretlo."
-
 #
 #
 "Is filament 1 loaded?"
 "Is filament 1 loaded?"
 "Filament 1 zaladowany?"
 "Filament 1 zaladowany?"
 
 
-#MSG_INSERT_FILAMENT c=20 r=0
+#MSG_INSERT_FILAMENT c=20
 "Insert filament"
 "Insert filament"
 "Wprowadz filament"
 "Wprowadz filament"
 
 
@@ -578,10 +494,6 @@
 "Is steel sheet on heatbed?"
 "Is steel sheet on heatbed?"
 "Czy plyta stal. jest na podgrzew. stole?"
 "Czy plyta stal. jest na podgrzew. stole?"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
-"Iteration "
-"Iteracja "
-
 #
 #
 "Last print failures"
 "Last print failures"
 "Ostatnie bledy druku"
 "Ostatnie bledy druku"
@@ -590,7 +502,7 @@
 "Last print"
 "Last print"
 "Ost. wydruk"
 "Ost. wydruk"
 
 
-#MSG_SELFTEST_EXTRUDER_FAN c=20 r=0
+#MSG_SELFTEST_EXTRUDER_FAN c=20
 "Left hotend fan?"
 "Left hotend fan?"
 "Lewy went hotendu?"
 "Lewy went hotendu?"
 
 
@@ -606,19 +518,19 @@
 "Lin. correction"
 "Lin. correction"
 "Korekcja lin."
 "Korekcja lin."
 
 
-#MSG_BABYSTEP_Z c=0 r=0
+#MSG_BABYSTEP_Z
 "Live adjust Z"
 "Live adjust Z"
 "Ustaw. Live Z"
 "Ustaw. Live Z"
 
 
-#MSG_LOAD_FILAMENT c=17 r=0
+#MSG_LOAD_FILAMENT c=17
 "Load filament"
 "Load filament"
 "Ladowanie fil."
 "Ladowanie fil."
 
 
-#MSG_LOADING_COLOR c=0 r=0
+#MSG_LOADING_COLOR
 "Loading color"
 "Loading color"
 "Czyszcz. koloru"
 "Czyszcz. koloru"
 
 
-#MSG_LOADING_FILAMENT c=20 r=0
+#MSG_LOADING_FILAMENT c=20
 "Loading filament"
 "Loading filament"
 "Laduje filament"
 "Laduje filament"
 
 
@@ -634,15 +546,15 @@
 "M117 First layer cal."
 "M117 First layer cal."
 "M117 Kal. 1. warstwy"
 "M117 Kal. 1. warstwy"
 
 
-#MSG_MAIN c=0 r=0
+#MSG_MAIN
 "Main"
 "Main"
 "Menu glowne"
 "Menu glowne"
 
 
-#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60 r=0
+#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60
 "Measuring reference height of calibration point"
 "Measuring reference height of calibration point"
 "Okreslam wysokosc odniesienia punktu kalibracyjnego"
 "Okreslam wysokosc odniesienia punktu kalibracyjnego"
 
 
-#MSG_MESH_BED_LEVELING c=0 r=0
+#MSG_MESH_BED_LEVELING
 "Mesh Bed Leveling"
 "Mesh Bed Leveling"
 "Poziomowanie stolu wg siatki"
 "Poziomowanie stolu wg siatki"
 
 
@@ -674,11 +586,11 @@
 "MMU OK. Resuming..."
 "MMU OK. Resuming..."
 "MMU OK. Wznawianie..."
 "MMU OK. Wznawianie..."
 
 
-#MSG_STEALTH_MODE_OFF c=0 r=0
+#MSG_STEALTH_MODE_OFF
 "Mode     [Normal]"
 "Mode     [Normal]"
 "Tryb   [normalny]"
 "Tryb   [normalny]"
 
 
-#MSG_SILENT_MODE_ON c=0 r=0
+#MSG_SILENT_MODE_ON
 "Mode     [silent]"
 "Mode     [silent]"
 "Tryb      [cichy]"
 "Tryb      [cichy]"
 
 
@@ -690,15 +602,15 @@
 "MMU power fails"
 "MMU power fails"
 "Zaniki zasil. MMU"
 "Zaniki zasil. MMU"
 
 
-#MSG_STEALTH_MODE_ON c=0 r=0
+#MSG_STEALTH_MODE_ON
 "Mode    [Stealth]"
 "Mode    [Stealth]"
 "Tryb    [Stealth]"
 "Tryb    [Stealth]"
 
 
-#MSG_AUTO_MODE_ON c=0 r=0
+#MSG_AUTO_MODE_ON
 "Mode [auto power]"
 "Mode [auto power]"
 "Tryb [automatycz]"
 "Tryb [automatycz]"
 
 
-#MSG_SILENT_MODE_OFF c=0 r=0
+#MSG_SILENT_MODE_OFF
 "Mode [high power]"
 "Mode [high power]"
 "Tryb[wysoka wyd.]"
 "Tryb[wysoka wyd.]"
 
 
@@ -706,31 +618,31 @@
 "MMU2 connected"
 "MMU2 connected"
 "MMU podlaczone"
 "MMU podlaczone"
 
 
-#MSG_SELFTEST_MOTOR c=0 r=0
+#MSG_SELFTEST_MOTOR
 "Motor"
 "Motor"
 "Silnik"
 "Silnik"
 
 
-#MSG_MOVE_AXIS c=0 r=0
+#MSG_MOVE_AXIS
 "Move axis"
 "Move axis"
 "Ruch osi"
 "Ruch osi"
 
 
-#MSG_MOVE_X c=0 r=0
+#MSG_MOVE_X
 "Move X"
 "Move X"
 "Ruch osi X"
 "Ruch osi X"
 
 
-#MSG_MOVE_Y c=0 r=0
+#MSG_MOVE_Y
 "Move Y"
 "Move Y"
 "Ruch osi Y"
 "Ruch osi Y"
 
 
-#MSG_MOVE_Z c=0 r=0
+#MSG_MOVE_Z
 "Move Z"
 "Move Z"
 "Ruch osi Z"
 "Ruch osi Z"
 
 
-#MSG_NO_MOVE c=0 r=0
+#MSG_NO_MOVE
 "No move."
 "No move."
 "Brak ruchu."
 "Brak ruchu."
 
 
-#MSG_NO_CARD c=0 r=0
+#MSG_NO_CARD
 "No SD card"
 "No SD card"
 "Brak karty SD"
 "Brak karty SD"
 
 
@@ -738,11 +650,11 @@
 "N/A"
 "N/A"
 "N/D"
 "N/D"
 
 
-#MSG_NO c=0 r=0
+#MSG_NO
 "No"
 "No"
 "Nie"
 "Nie"
 
 
-#MSG_SELFTEST_NOTCONNECTED c=0 r=0
+#MSG_SELFTEST_NOTCONNECTED
 "Not connected"
 "Not connected"
 "Nie podlaczono "
 "Nie podlaczono "
 
 
@@ -750,11 +662,7 @@
 "New firmware version available:"
 "New firmware version available:"
 "Dostepna nowa wersja firmware:"
 "Dostepna nowa wersja firmware:"
 
 
-#
-"No "
-"Nie"
-
-#MSG_SELFTEST_FAN_NO c=19 r=0
+#MSG_SELFTEST_FAN_NO c=19
 "Not spinning"
 "Not spinning"
 "Nie kreci sie"
 "Nie kreci sie"
 
 
@@ -766,7 +674,7 @@
 "Now I will preheat nozzle for PLA."
 "Now I will preheat nozzle for PLA."
 "Nagrzewam dysze dla PLA."
 "Nagrzewam dysze dla PLA."
 
 
-#MSG_NOZZLE c=0 r=0
+#MSG_NOZZLE
 "Nozzle"
 "Nozzle"
 "Dysza"
 "Dysza"
 
 
@@ -782,7 +690,7 @@
 "Nozzle FAN"
 "Nozzle FAN"
 "Went. hotendu"
 "Went. hotendu"
 
 
-#MSG_PAUSE_PRINT c=0 r=0
+#MSG_PAUSE_PRINT
 "Pause print"
 "Pause print"
 "Wstrzymanie wydruku"
 "Wstrzymanie wydruku"
 
 
@@ -814,7 +722,7 @@
 "Please clean the nozzle for calibration. Click when done."
 "Please clean the nozzle for calibration. Click when done."
 "Dla prawidl. kalibracji nalezy oczyscic dysze. Potw. guzikiem."
 "Dla prawidl. kalibracji nalezy oczyscic dysze. Potw. guzikiem."
 
 
-#MSG_SELFTEST_PLEASECHECK c=0 r=0
+#MSG_SELFTEST_PLEASECHECK
 "Please check :"
 "Please check :"
 "Sprawdz :"
 "Sprawdz :"
 
 
@@ -866,7 +774,7 @@
 "Please update firmware in your MMU2. Waiting for reset."
 "Please update firmware in your MMU2. Waiting for reset."
 "Prosze zaktualizowac Firmware MMU2. Czekam na reset."
 "Prosze zaktualizowac Firmware MMU2. Czekam na reset."
 
 
-#MSG_PLEASE_WAIT c=20 r=0
+#MSG_PLEASE_WAIT c=20
 "Please wait"
 "Please wait"
 "Prosze czekac"
 "Prosze czekac"
 
 
@@ -874,11 +782,11 @@
 "Please remove shipping helpers first."
 "Please remove shipping helpers first."
 "Najpierw usun zabezpieczenia transportowe"
 "Najpierw usun zabezpieczenia transportowe"
 
 
-#MSG_PREHEAT_NOZZLE c=20 r=0
+#MSG_PREHEAT_NOZZLE c=20
 "Preheat the nozzle!"
 "Preheat the nozzle!"
 "Nagrzej dysze!"
 "Nagrzej dysze!"
 
 
-#MSG_PREHEAT c=0 r=0
+#MSG_PREHEAT
 "Preheat"
 "Preheat"
 "Grzanie"
 "Grzanie"
 
 
@@ -898,7 +806,7 @@
 "Power failures"
 "Power failures"
 "Zaniki zasilania"
 "Zaniki zasilania"
 
 
-#MSG_PRINT_ABORTED c=20 r=0
+#MSG_PRINT_ABORTED c=20
 "Print aborted"
 "Print aborted"
 "Druk przerwany"
 "Druk przerwany"
 
 
@@ -910,11 +818,11 @@
 "Preheating to unload"
 "Preheating to unload"
 "Nagrzew. do rozlad."
 "Nagrzew. do rozlad."
 
 
-#MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
+#MSG_SELFTEST_PRINT_FAN_SPEED c=18
 "Print fan:"
 "Print fan:"
 "Went. wydruku:"
 "Went. wydruku:"
 
 
-#MSG_CARD_MENU c=0 r=0
+#MSG_CARD_MENU
 "Print from SD"
 "Print from SD"
 "Druk z karty SD"
 "Druk z karty SD"
 
 
@@ -938,15 +846,7 @@
 "Print FAN"
 "Print FAN"
 "Went. wydruku"
 "Went. wydruku"
 
 
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK2.5 ready."
-"Prusa i3 MK2.5 gotowa"
-
-#WELCOME_MSG c=20 r=0
-"Prusa i3 MK3 ready."
-"Prusa i3 MK3 gotowa"
-
-#MSG_PRUSA3D c=0 r=0
+#MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
 "\x00"
 "\x00"
 
 
@@ -966,19 +866,15 @@
 "Prusa i3 MK3S OK."
 "Prusa i3 MK3S OK."
 "Prusa i3 MK3S OK"
 "Prusa i3 MK3S OK"
 
 
-#
-"Prusa i3 MK2 ready."
-"Prusa i3 MK2 gotowa"
-
-#MSG_CALIBRATE_BED_RESET c=0 r=0
+#MSG_CALIBRATE_BED_RESET
 "Reset XYZ calibr."
 "Reset XYZ calibr."
 "Reset kalibr. XYZ"
 "Reset kalibr. XYZ"
 
 
-#MSG_BED_CORRECTION_RESET c=0 r=0
+#MSG_BED_CORRECTION_RESET
 "Reset"
 "Reset"
 "\x00"
 "\x00"
 
 
-#MSG_RESUME_PRINT c=0 r=0
+#MSG_RESUME_PRINT
 "Resume print"
 "Resume print"
 "Wznowic wydruk"
 "Wznowic wydruk"
 
 
@@ -1014,31 +910,31 @@
 "Right"
 "Right"
 "Prawa"
 "Prawa"
 
 
-#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
+#MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 c=60
 "Searching bed calibration point"
 "Searching bed calibration point"
 "Szukam punktu kalibracyjnego na stole"
 "Szukam punktu kalibracyjnego na stole"
 
 
-#MSG_LANGUAGE_SELECT c=0 r=0
+#MSG_LANGUAGE_SELECT
 "Select language"
 "Select language"
 "Wybor jezyka"
 "Wybor jezyka"
 
 
-#MSG_SELFTEST_OK c=0 r=0
+#MSG_SELFTEST_OK
 "Self test OK"
 "Self test OK"
 "Selftest OK"
 "Selftest OK"
 
 
-#MSG_SELFTEST_START c=20 r=0
+#MSG_SELFTEST_START c=20
 "Self test start  "
 "Self test start  "
 "Rozpoczynanie Selftestu"
 "Rozpoczynanie Selftestu"
 
 
-#MSG_SELFTEST c=0 r=0
+#MSG_SELFTEST
 "Selftest         "
 "Selftest         "
 "Selftest "
 "Selftest "
 
 
-#MSG_SELFTEST_ERROR c=0 r=0
+#MSG_SELFTEST_ERROR
 "Selftest error !"
 "Selftest error !"
 "Blad selftest !"
 "Blad selftest !"
 
 
-#MSG_SELFTEST_FAILED c=20 r=0
+#MSG_SELFTEST_FAILED c=20
 "Selftest failed  "
 "Selftest failed  "
 "Selftest nieudany"
 "Selftest nieudany"
 
 
@@ -1058,7 +954,7 @@
 "Set temperature:"
 "Set temperature:"
 "Ustaw. temperatury:"
 "Ustaw. temperatury:"
 
 
-#MSG_SETTINGS c=0 r=0
+#MSG_SETTINGS
 "Settings"
 "Settings"
 "Ustawienia"
 "Ustawienia"
 
 
@@ -1070,33 +966,25 @@
 "Sensor state"
 "Sensor state"
 "Stan czujnikow"
 "Stan czujnikow"
 
 
-#
-"Sensors info"
-"Info o czujnikach"
-
-#
-"Show pinda state"
-"Stan sondy PINDA"
-
 #MSG_FILE_CNT c=20 r=4
 #MSG_FILE_CNT c=20 r=4
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
 "Niektore pliki nie zostana posortowane. Max. liczba plikow w 1 folderze = 100."
 "Niektore pliki nie zostana posortowane. Max. liczba plikow w 1 folderze = 100."
 
 
 #MSG_SORT_NONE c=17 r=1
 #MSG_SORT_NONE c=17 r=1
-"Sort:      [none]"
-"Sortuj:    [brak]"
+"Sort       [none]"
+"Sortuj     [brak]"
 
 
 #MSG_SORT_TIME c=17 r=1
 #MSG_SORT_TIME c=17 r=1
-"Sort:      [time]"
-"Sortuj:    [czas]"
+"Sort       [time]"
+"Sortuj     [czas]"
 
 
 #
 #
 "Severe skew"
 "Severe skew"
 "Znaczny skos"
 "Znaczny skos"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
-"Sort:  [alphabet]"
-"Sortuj: [alfabet]"
+"Sort   [alphabet]"
+"Sortuj  [alfabet]"
 
 
 #MSG_SORTING c=20 r=1
 #MSG_SORTING c=20 r=1
 "Sorting files"
 "Sorting files"
@@ -1126,11 +1014,11 @@
 "Sound    [silent]"
 "Sound    [silent]"
 "Dzwiek    [Cichy]"
 "Dzwiek    [Cichy]"
 
 
-#MSG_SPEED c=0 r=0
+#MSG_SPEED
 "Speed"
 "Speed"
 "Predkosc"
 "Predkosc"
 
 
-#MSG_SELFTEST_FAN_YES c=19 r=0
+#MSG_SELFTEST_FAN_YES c=19
 "Spinning"
 "Spinning"
 "Kreci sie"
 "Kreci sie"
 
 
@@ -1138,23 +1026,23 @@
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Stable ambient temperature 21-26C is needed a rigid stand is required."
 "Potrzebna jest stabilna temperatura otoczenia 21-26C i stabilne podloze."
 "Potrzebna jest stabilna temperatura otoczenia 21-26C i stabilne podloze."
 
 
-#MSG_STATISTICS c=0 r=0
+#MSG_STATISTICS
 "Statistics  "
 "Statistics  "
 "Statystyki"
 "Statystyki"
 
 
-#MSG_STOP_PRINT c=0 r=0
+#MSG_STOP_PRINT
 "Stop print"
 "Stop print"
 "Zatrzymac druk"
 "Zatrzymac druk"
 
 
-#MSG_STOPPED c=0 r=0
+#MSG_STOPPED
 "STOPPED. "
 "STOPPED. "
 "ZATRZYMANO."
 "ZATRZYMANO."
 
 
-#MSG_SUPPORT c=0 r=0
+#MSG_SUPPORT
 "Support"
 "Support"
 "Wsparcie"
 "Wsparcie"
 
 
-#MSG_SELFTEST_SWAPPED c=0 r=0
+#MSG_SELFTEST_SWAPPED
 "Swapped"
 "Swapped"
 "Zamieniono"
 "Zamieniono"
 
 
@@ -1182,7 +1070,7 @@
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."
 "Kalibracja temperaturowa zakonczona i wlaczona. Moze byc wylaczona z menu Ustawienia -> Kalibracja temp."
 "Kalibracja temperaturowa zakonczona i wlaczona. Moze byc wylaczona z menu Ustawienia -> Kalibracja temp."
 
 
-#MSG_TEMPERATURE c=0 r=0
+#MSG_TEMPERATURE
 "Temperature"
 "Temperature"
 "Temperatura"
 "Temperatura"
 
 
@@ -1202,7 +1090,7 @@
 "Total print time"
 "Total print time"
 "Calkowity czas druku"
 "Calkowity czas druku"
 
 
-#MSG_TUNE c=0 r=0
+#MSG_TUNE
 "Tune"
 "Tune"
 "Strojenie"
 "Strojenie"
 
 
@@ -1210,10 +1098,6 @@
 "Unload"
 "Unload"
 "Rozladuj"
 "Rozladuj"
 
 
-#
-"Unload all"
-"Rozladuj wszystkie"
-
 #
 #
 "Total failures"
 "Total failures"
 "Suma bledow"
 "Suma bledow"
@@ -1226,7 +1110,7 @@
 "to unload filament"
 "to unload filament"
 "aby rozlad. filament"
 "aby rozlad. filament"
 
 
-#MSG_UNLOAD_FILAMENT c=17 r=0
+#MSG_UNLOAD_FILAMENT c=17
 "Unload filament"
 "Unload filament"
 "Rozladowanie fil."
 "Rozladowanie fil."
 
 
@@ -1250,7 +1134,7 @@
 "unknown"
 "unknown"
 "nieznane"
 "nieznane"
 
 
-#MSG_USERWAIT c=0 r=0
+#MSG_USERWAIT
 "Wait for user..."
 "Wait for user..."
 "Czekam na uzytkownika..."
 "Czekam na uzytkownika..."
 
 
@@ -1282,7 +1166,7 @@
 "Was filament unload successful?"
 "Was filament unload successful?"
 "Rozladowanie fil. ok?"
 "Rozladowanie fil. ok?"
 
 
-#MSG_SELFTEST_WIRINGERROR c=0 r=0
+#MSG_SELFTEST_WIRINGERROR
 "Wiring error"
 "Wiring error"
 "Blad polaczenia"
 "Blad polaczenia"
 
 
@@ -1298,7 +1182,7 @@
 "XYZ calibration failed. Please consult the manual."
 "XYZ calibration failed. Please consult the manual."
 "Kalibracja XYZ nieudana. Sprawdz przyczyny i rozwiazania w instrukcji."
 "Kalibracja XYZ nieudana. Sprawdz przyczyny i rozwiazania w instrukcji."
 
 
-#MSG_YES c=0 r=0
+#MSG_YES
 "Yes"
 "Yes"
 "Tak"
 "Tak"
 
 
@@ -1315,8 +1199,8 @@
 "Kalibracja XYZ prawidlowa. Osie X/Y lekko skosne. Dobra robota!"
 "Kalibracja XYZ prawidlowa. Osie X/Y lekko skosne. Dobra robota!"
 
 
 #
 #
-"X-correct"
-"Korekcja X"
+"X-correct:"
+"Korekcja X:"
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
@@ -1330,18 +1214,10 @@
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
 "Kalibracja XYZ niedokladna. Prawy przedni punkt nieosiagalny."
 "Kalibracja XYZ niedokladna. Prawy przedni punkt nieosiagalny."
 
 
-#MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
-"XYZ calibration compromised. Left front calibration point not reachable."
-"Kalibracja XYZ niedokladna. Lewy przedni punkt nieosiagalny."
-
-#MSG_LOAD_ALL c=17 r=0
+#MSG_LOAD_ALL c=17
 "Load all"
 "Load all"
 "Zalad. wszystkie"
 "Zalad. wszystkie"
 
 
-#MSG_LOAD_FILAMENT_1 c=17 r=0
-"Load filament 1"
-"Zaladuj fil. 1"
-
 #
 #
 "XYZ calibration failed. Bed calibration point was not found."
 "XYZ calibration failed. Bed calibration point was not found."
 "Kalibracja XYZ nieudana. Nie znaleziono punktow kalibracyjnych."
 "Kalibracja XYZ nieudana. Nie znaleziono punktow kalibracyjnych."
@@ -1350,38 +1226,18 @@
 "XYZ calibration failed. Front calibration points not reachable."
 "XYZ calibration failed. Front calibration points not reachable."
 "Kalibr. XYZ nieudana. Przednie punkty kalibr. nieosiagalne. Nalezy poprawic montaz drukarki."
 "Kalibr. XYZ nieudana. Przednie punkty kalibr. nieosiagalne. Nalezy poprawic montaz drukarki."
 
 
-#
-"XYZ calibration failed. Left front calibration point not reachable."
-"Kalibr. XYZ nieudana. Lewy przedni punkt nieosiagalny. Nalezy poprawic montaz drukarki."
-
-#MSG_LOAD_FILAMENT_2 c=17 r=0
-"Load filament 2"
-"Zaladuj fil. 2"
-
 #
 #
 "XYZ calibration failed. Right front calibration point not reachable."
 "XYZ calibration failed. Right front calibration point not reachable."
 "Kalibr. XYZ nieudana. Prawy przedni punkt nieosiagalny. Nalezy poprawic montaz drukarki."
 "Kalibr. XYZ nieudana. Prawy przedni punkt nieosiagalny. Nalezy poprawic montaz drukarki."
 
 
-#MSG_LOAD_FILAMENT_3 c=17 r=0
-"Load filament 3"
-"Zaladuj fil. 3"
-
 #
 #
 "Y distance from min"
 "Y distance from min"
 "Dystans od 0 w osi Y"
 "Dystans od 0 w osi Y"
 
 
 #
 #
-"Y-correct"
-"Korekcja Y"
-
-#MSG_LOAD_FILAMENT_4 c=17 r=0
-"Load filament 4"
-"Zaladuj fil. 4"
-
-#MSG_LOAD_FILAMENT_5 c=17 r=0
-"Load filament 5"
-"Laduj filament 5"
+"Y-correct:"
+"Korekcja Y:"
 
 
-#MSG_OFF c=0 r=0
+#MSG_OFF
 " [off]"
 " [off]"
 "\x00"
 "\x00"