Browse Source

Menu reorganized.
Toshiba FlashAir switchable.

bubnikv 8 years ago
parent
commit
52fc724cb4

+ 3 - 0
Firmware/Configuration.h

@@ -42,6 +42,7 @@
 #define EEPROM_BED_CORRECTION_RIGHT (EEPROM_BED_CORRECTION_LEFT-1)
 #define EEPROM_BED_CORRECTION_FRONT (EEPROM_BED_CORRECTION_RIGHT-1)
 #define EEPROM_BED_CORRECTION_REAR  (EEPROM_BED_CORRECTION_FRONT-1)
+#define EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY (EEPROM_BED_CORRECTION_REAR-1)
 
 // Currently running firmware, each digit stored as uint16_t.
 // The flavor differentiates a dev, alpha, beta, release candidate or a release version.
@@ -282,6 +283,8 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
 #define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS) 
 #define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS)
 
+#define Z_HEIGHT_HIDE_LIVE_ADJUST_MENU 2.0f
+
 //============================= Bed Auto Leveling ===========================
 
 //#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line)

+ 3 - 0
Firmware/Marlin_main.cpp

@@ -1017,6 +1017,9 @@ void setup()
 	  farm_no = 0;
   }
 
+  // Enable Toshiba FlashAir SD card / WiFi enahanced card.
+  card.ToshibaFlashAir_enable(eeprom_read_byte((unsigned char*)EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY) == 1);
+
   if (eeprom_read_dword((uint32_t*)(EEPROM_TOP-4)) == 0x0ffffffff && 
       eeprom_read_dword((uint32_t*)(EEPROM_TOP-8)) == 0x0ffffffff &&
       eeprom_read_dword((uint32_t*)(EEPROM_TOP-12)) == 0x0ffffffff) {

+ 4 - 2
Firmware/Sd2Card.cpp

@@ -501,13 +501,15 @@ bool Sd2Card::readData(uint8_t* dst, uint16_t count) {
 #endif
   chipSelectHigh();
   // Toshiba FlashAir Patch. Purge pending status byte.
-  spiSend(0XFF);
+  if (flash_air_compatible_)
+    spiSend(0XFF);
   return true;
 
  fail:
   chipSelectHigh();
   // Toshiba FlashAir Patch. Purge pending status byte.
-  spiSend(0XFF);       
+  if (flash_air_compatible_)
+    spiSend(0XFF);
   return false;
 }
 //------------------------------------------------------------------------------

+ 5 - 1
Firmware/Sd2Card.h

@@ -162,7 +162,7 @@ uint8_t const SPI_SCK_PIN = SOFT_SPI_SCK_PIN;
 class Sd2Card {
  public:
   /** Construct an instance of Sd2Card. */
-  Sd2Card() : errorCode_(SD_CARD_ERROR_INIT_NOT_CALLED), type_(0) {}
+  Sd2Card() : errorCode_(SD_CARD_ERROR_INIT_NOT_CALLED), type_(0), flash_air_compatible_(false) {}
   uint32_t cardSize();
   bool erase(uint32_t firstBlock, uint32_t lastBlock);
   bool eraseSingleBlockEnable();
@@ -225,6 +225,9 @@ class Sd2Card {
   // Toshiba FlashAir support
   uint8_t readExtMemory(uint8_t mio, uint8_t func, uint32_t addr, uint16_t count, uint8_t* dst);
 
+  void setFlashAirCompatible(bool flashAirCompatible) { flash_air_compatible_ = flashAirCompatible; }
+  bool getFlashAirCompatible() const { return flash_air_compatible_; }
+
  private:
   //----------------------------------------------------------------------------
   uint8_t chipSelectPin_;
@@ -232,6 +235,7 @@ class Sd2Card {
   uint8_t spiRate_;
   uint8_t status_;
   uint8_t type_;
+  bool    flash_air_compatible_;
   // private functions
   uint8_t cardAcmd(uint8_t cmd, uint32_t arg) {
     cardCommand(CMD55, 0);

+ 2 - 0
Firmware/cardreader.h

@@ -47,6 +47,8 @@ public:
   FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;};
   FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;};
 
+  bool ToshibaFlashAir_isEnabled() const { return card.getFlashAirCompatible(); }
+  void ToshibaFlashAir_enable(bool enable) { card.setFlashAirCompatible(enable); }
   bool ToshibaFlashAir_GetIP(uint8_t *ip);
 
 public:

+ 24 - 11
Firmware/langtool.pl

@@ -16,19 +16,30 @@ sub parselang
 	my $out = {};
 	while (my $line = <$fh>) {
 		chomp $line;
-		next if (index($line, 'MSG') == -1);
-    	$line =~ /(?is)\#define\s*(\S*)\s*(.*)/;
-    	my $symbol = $1;
-    	my $v = $2;
+		next if (index($line, '#define') == -1 || index($line, 'MSG') == -1);
+		my $modifiers = {};
+    	my $symbol = '';
+    	my $value = '';
+		if (index($line, '#define(') == -1) {
+			# Extended definition, which specifies the string formatting.
+	    	$line =~ /(?is)\#define\s*(\S*)\s*(.*)/;
+	    	$symbol = "$1";
+	    	$value = $2;
+		} else {
+			$line =~ /(?is)\#define\((.*)\)\s*(\S*)\s*(.*)/;
+			my $options = $1;
+	    	$symbol = "$2";
+	    	$value = $3;
+		}
     	next if (! defined $symbol or length($symbol) == 0);
     	# Trim whitespaces from both sides
-    	$v =~ s/^\s+|\s+$//g;
+    	$value =~ s/^\s+|\s+$//g;
 		#$string =~ s/" MACHINE_NAME "/Prusa i3/;
-		$v =~ s/" FIRMWARE_URL "/https:\/\/github.com\/prusa3d\/Prusa-i3-Plus\//;
-		$v =~ s/" PROTOCOL_VERSION "/1.0/;
-		$v =~ s/" STRINGIFY\(EXTRUDERS\) "/1/;
-		$v =~ s/" MACHINE_UUID "/00000000-0000-0000-0000-000000000000/;
-		${$out}{$symbol} = $v;
+		$value =~ s/" FIRMWARE_URL "/https:\/\/github.com\/prusa3d\/Prusa-i3-Plus\//;
+		$value =~ s/" PROTOCOL_VERSION "/1.0/;
+		$value =~ s/" STRINGIFY\(EXTRUDERS\) "/1/;
+		$value =~ s/" MACHINE_UUID "/00000000-0000-0000-0000-000000000000/;
+		${$out}{$symbol} = { value=>$value, %$modifiers };
 	}
 	return $out;
 }
@@ -97,6 +108,7 @@ sub break_text_fullscreen
 }
 
 my %texts;
+my %attributes;
 my $num_languages = 0;
 foreach my $lang (@langs) {
 	my $symbols = parselang("language_$lang.h");
@@ -104,10 +116,11 @@ foreach my $lang (@langs) {
  		if (! (exists $texts{$key})) {
 	 		$texts{$key} = [];
  		}
+ 		my $symbol_value = ${$symbols}{$key};
  		my $strings = $texts{$key};
  		die "Symbol $key defined first in $lang, undefined in the preceding language files."
  			if (scalar(@$strings) != $num_languages);
- 		push @$strings, ${$symbols}{$key};
+ 		push @$strings, ${$symbol_value}{value};
  	}
  	$num_languages += 1;
  	foreach my $key (keys %texts) {

+ 183 - 92
Firmware/language_all.cpp

@@ -115,12 +115,14 @@ const char * const MSG_BABYSTEP_Z_LANG_TABLE[LANG_NUM] PROGMEM = {
 
 const char MSG_BABYSTEP_Z_NOT_SET_EN[] PROGMEM = "Printer has not been calibrated yet. Run calibration G-code to adjust Z height.";
 const char MSG_BABYSTEP_Z_NOT_SET_CZ[] PROGMEM = "Tiskarna nebyla jeste zkalibrovana. Spustte kalibracni G-kod a doladte Z.";
+const char MSG_BABYSTEP_Z_NOT_SET_ES[] PROGMEM = "Impresora aun no calibrada. Ejecutar el G-code de calibracion para ajustar la altura de Z.";
+const char MSG_BABYSTEP_Z_NOT_SET_PL[] PROGMEM = "Drukarka nie byla kalibrowana. Wlaczyc kalibracyjny G-kod i dostroic Z.";
 const char * const MSG_BABYSTEP_Z_NOT_SET_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BABYSTEP_Z_NOT_SET_EN,
 	MSG_BABYSTEP_Z_NOT_SET_CZ,
 	MSG_BABYSTEP_Z_NOT_SET_EN,
-	MSG_BABYSTEP_Z_NOT_SET_EN,
-	MSG_BABYSTEP_Z_NOT_SET_EN
+	MSG_BABYSTEP_Z_NOT_SET_ES,
+	MSG_BABYSTEP_Z_NOT_SET_PL
 };
 
 const char MSG_BED_EN[] PROGMEM = "Bed";
@@ -137,42 +139,50 @@ const char * const MSG_BED_LANG_TABLE[LANG_NUM] PROGMEM = {
 
 const char MSG_BED_CORRECTION_FRONT_EN[] PROGMEM = "Front side um";
 const char MSG_BED_CORRECTION_FRONT_CZ[] PROGMEM = "Vpredu [um]";
+const char MSG_BED_CORRECTION_FRONT_ES[] PROGMEM = "Hacia adelante um";
+const char MSG_BED_CORRECTION_FRONT_PL[] PROGMEM = "Do przodu [um]";
 const char * const MSG_BED_CORRECTION_FRONT_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_CORRECTION_FRONT_EN,
 	MSG_BED_CORRECTION_FRONT_CZ,
 	MSG_BED_CORRECTION_FRONT_EN,
-	MSG_BED_CORRECTION_FRONT_EN,
-	MSG_BED_CORRECTION_FRONT_EN
+	MSG_BED_CORRECTION_FRONT_ES,
+	MSG_BED_CORRECTION_FRONT_PL
 };
 
 const char MSG_BED_CORRECTION_LEFT_EN[] PROGMEM = "Left side  um";
 const char MSG_BED_CORRECTION_LEFT_CZ[] PROGMEM = "Vlevo  [um]";
+const char MSG_BED_CORRECTION_LEFT_ES[] PROGMEM = "Hacia la izquierda  um";
+const char MSG_BED_CORRECTION_LEFT_PL[] PROGMEM = "W lewo  [um]";
 const char * const MSG_BED_CORRECTION_LEFT_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_CORRECTION_LEFT_EN,
 	MSG_BED_CORRECTION_LEFT_CZ,
 	MSG_BED_CORRECTION_LEFT_EN,
-	MSG_BED_CORRECTION_LEFT_EN,
-	MSG_BED_CORRECTION_LEFT_EN
+	MSG_BED_CORRECTION_LEFT_ES,
+	MSG_BED_CORRECTION_LEFT_PL
 };
 
 const char MSG_BED_CORRECTION_MENU_EN[] PROGMEM = "Bed level correct";
 const char MSG_BED_CORRECTION_MENU_CZ[] PROGMEM = "Korekce podlozky";
+const char MSG_BED_CORRECTION_MENU_ES[] PROGMEM = "Nivel de cama correcto";
+const char MSG_BED_CORRECTION_MENU_PL[] PROGMEM = "Korekta podkladki";
 const char * const MSG_BED_CORRECTION_MENU_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_CORRECTION_MENU_EN,
 	MSG_BED_CORRECTION_MENU_CZ,
 	MSG_BED_CORRECTION_MENU_EN,
-	MSG_BED_CORRECTION_MENU_EN,
-	MSG_BED_CORRECTION_MENU_EN
+	MSG_BED_CORRECTION_MENU_ES,
+	MSG_BED_CORRECTION_MENU_PL
 };
 
 const char MSG_BED_CORRECTION_REAR_EN[] PROGMEM = "Rear side  um";
 const char MSG_BED_CORRECTION_REAR_CZ[] PROGMEM = "Vzadu  [um]";
+const char MSG_BED_CORRECTION_REAR_ES[] PROGMEM = "Hacia atras  um";
+const char MSG_BED_CORRECTION_REAR_PL[] PROGMEM = "Do tylu  [um]";
 const char * const MSG_BED_CORRECTION_REAR_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_CORRECTION_REAR_EN,
 	MSG_BED_CORRECTION_REAR_CZ,
 	MSG_BED_CORRECTION_REAR_EN,
-	MSG_BED_CORRECTION_REAR_EN,
-	MSG_BED_CORRECTION_REAR_EN
+	MSG_BED_CORRECTION_REAR_ES,
+	MSG_BED_CORRECTION_REAR_PL
 };
 
 const char MSG_BED_CORRECTION_RESET_EN[] PROGMEM = "Reset";
@@ -182,12 +192,14 @@ const char * const MSG_BED_CORRECTION_RESET_LANG_TABLE[1] PROGMEM = {
 
 const char MSG_BED_CORRECTION_RIGHT_EN[] PROGMEM = "Right side um";
 const char MSG_BED_CORRECTION_RIGHT_CZ[] PROGMEM = "Vpravo [um]";
+const char MSG_BED_CORRECTION_RIGHT_ES[] PROGMEM = "Hacia la derecha um";
+const char MSG_BED_CORRECTION_RIGHT_PL[] PROGMEM = "W prawo [um]";
 const char * const MSG_BED_CORRECTION_RIGHT_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_CORRECTION_RIGHT_EN,
 	MSG_BED_CORRECTION_RIGHT_CZ,
 	MSG_BED_CORRECTION_RIGHT_EN,
-	MSG_BED_CORRECTION_RIGHT_EN,
-	MSG_BED_CORRECTION_RIGHT_EN
+	MSG_BED_CORRECTION_RIGHT_ES,
+	MSG_BED_CORRECTION_RIGHT_PL
 };
 
 const char MSG_BED_DONE_EN[] PROGMEM = "Bed done";
@@ -218,137 +230,169 @@ const char * const MSG_BED_HEATING_LANG_TABLE[LANG_NUM] PROGMEM = {
 
 const char MSG_BED_LEVELING_FAILED_POINT_HIGH_EN[] PROGMEM = "Bed leveling failed. Sensor triggered too high. Waiting for reset.";
 const char MSG_BED_LEVELING_FAILED_POINT_HIGH_CZ[] PROGMEM = "Kalibrace Z selhala. Sensor sepnul prilis vysoko. Cekam na reset.";
+const char MSG_BED_LEVELING_FAILED_POINT_HIGH_ES[] PROGMEM = "Nivelacion cama fallada. El sensor funcino' demasiado temprano. Pendiente el reset.";
+const char MSG_BED_LEVELING_FAILED_POINT_HIGH_PL[] PROGMEM = "Kalibracja Z niepowiedziona. Sensor dotknal zbyt wysoko. Czekam na reset.";
 const char * const MSG_BED_LEVELING_FAILED_POINT_HIGH_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_LEVELING_FAILED_POINT_HIGH_EN,
 	MSG_BED_LEVELING_FAILED_POINT_HIGH_CZ,
 	MSG_BED_LEVELING_FAILED_POINT_HIGH_EN,
-	MSG_BED_LEVELING_FAILED_POINT_HIGH_EN,
-	MSG_BED_LEVELING_FAILED_POINT_HIGH_EN
+	MSG_BED_LEVELING_FAILED_POINT_HIGH_ES,
+	MSG_BED_LEVELING_FAILED_POINT_HIGH_PL
 };
 
 const char MSG_BED_LEVELING_FAILED_POINT_LOW_EN[] PROGMEM = "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset.";
 const char MSG_BED_LEVELING_FAILED_POINT_LOW_CZ[] PROGMEM = "Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset.";
+const char MSG_BED_LEVELING_FAILED_POINT_LOW_ES[] PROGMEM = "Nivelacion cama fallada. El sensor no funciono'. Escombros en la boquilla? Pendiente el reset.";
+const char MSG_BED_LEVELING_FAILED_POINT_LOW_PL[] PROGMEM = "Kalibracja Z niepowiedziona. Sensor nie dotknal. Zanieczyszczona dysza? Czekam na reset.";
 const char * const MSG_BED_LEVELING_FAILED_POINT_LOW_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_LEVELING_FAILED_POINT_LOW_EN,
 	MSG_BED_LEVELING_FAILED_POINT_LOW_CZ,
 	MSG_BED_LEVELING_FAILED_POINT_LOW_EN,
-	MSG_BED_LEVELING_FAILED_POINT_LOW_EN,
-	MSG_BED_LEVELING_FAILED_POINT_LOW_EN
+	MSG_BED_LEVELING_FAILED_POINT_LOW_ES,
+	MSG_BED_LEVELING_FAILED_POINT_LOW_PL
 };
 
 const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_EN[] PROGMEM = "Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset.";
 const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_CZ[] PROGMEM = "Kalibrace Z selhala. Sensor je odpojeny nebo preruseny kabel. Cekam na reset.";
+const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_ES[] PROGMEM = "Nivelacion cama fallada. Sensor desconectado o cables danados. Pendiente el reset.";
+const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_PL[] PROGMEM = "Kalibracja Z niepowiedziona. Sensor jest odlaczony lub uszkodzony kabel. Czekam na reset.";
 const char * const MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_EN,
 	MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_CZ,
 	MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_EN,
-	MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_EN,
-	MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_EN
+	MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_ES,
+	MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_PL
 };
 
-const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_EN[] PROGMEM = "X/Y calibration failed. Front calibration points not reachable.";
-const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_CZ[] PROGMEM = "Kalibrace X/Y selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_EN[] PROGMEM = "XYZ calibration failed. Front calibration points not reachable.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_CZ[] PROGMEM = "Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_ES[] PROGMEM = "Calibracion XYZ fallad. Punto delanteros no alcanzables.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_PL[] PROGMEM = "Kalibracja XYZ niepowiedziona. Przednie punkty kalibracyjne zbyt wysuniete do przodu. Wyrownac drukarke.";
 const char * const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_EN,
 	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_CZ,
 	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_EN
+	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_PL
 };
 
-const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_EN[] PROGMEM = "X/Y calibration failed. Left front calibration point not reachable.";
-const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_CZ[] PROGMEM = "Kalibrace X/Y selhala. Levy predni bod moc vpredu. Srovnejte tiskarnu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_EN[] PROGMEM = "XYZ calibration failed. Left front calibration point not reachable.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_CZ[] PROGMEM = "Kalibrace XYZ selhala. Levy predni bod moc vpredu. Srovnejte tiskarnu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_ES[] PROGMEM = "Calibracion XYZ fallad. Punto delantero izquierdo no alcanzable.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_PL[] PROGMEM = "Kalibracja XYZ niepowiedziona. Lewy przedni punkt zbyt wysuniety do przodu. Wyrownac drukarke.";
 const char * const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_EN,
 	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_CZ,
 	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_EN
+	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_PL
 };
 
-const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_EN[] PROGMEM = "X/Y calibration failed. Right front calibration point not reachable.";
-const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_CZ[] PROGMEM = "Kalibrace X/Y selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_EN[] PROGMEM = "XYZ calibration failed. Right front calibration point not reachable.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_CZ[] PROGMEM = "Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_ES[] PROGMEM = "Calibracion XYZ fallad. Punto delantero derecho no alcanzable.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_PL[] PROGMEM = "Kalibracja XYZ niepowiedziona. Prawy przedni punkt zbyt wysuniety do przodu. Wyrownac drukarke.";
 const char * const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_EN,
 	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_CZ,
 	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_EN
+	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_PL
 };
 
-const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_EN[] PROGMEM = "X/Y calibration failed. Please consult the manual.";
-const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_CZ[] PROGMEM = "Kalibrace X/Y selhala. Nahlednete do manualu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_EN[] PROGMEM = "XYZ calibration failed. Please consult the manual.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_CZ[] PROGMEM = "Kalibrace XYZ selhala. Nahlednete do manualu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_ES[] PROGMEM = "Calibracion XYZ fallada. Consultar el manual por favor.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_PL[] PROGMEM = "Kalibracja XYZ niepowiedziona. Sprawdzic w instrukcji.";
 const char * const MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_EN,
 	MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_CZ,
 	MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_EN
+	MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_PL
 };
 
-const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_EN[] PROGMEM = "X/Y calibration ok. X/Y axes are perpendicular.";
-const char * const MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE[1] PROGMEM = {
-	MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_EN
+const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_EN[] PROGMEM = "XYZ calibration ok. X/Y axes are perpendicular.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_ES[] PROGMEM = "Calibracion XYZ ok. Ejes X/Y perpendiculares.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_PL[] PROGMEM = "Kalibracja XYZ ok. Osie X/Y sa prostopadle.";
+const char * const MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE[LANG_NUM] PROGMEM = {
+	MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_EN,
+	MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_EN,
+	MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_EN,
+	MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_PL
 };
 
-const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_EN[] PROGMEM = "X/Y calibration failed. Bed calibration point was not found.";
-const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_CZ[] PROGMEM = "Kalibrace X/Y selhala. Kalibracni bod podlozky nenalezen.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_EN[] PROGMEM = "XYZ calibration failed. Bed calibration point was not found.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_CZ[] PROGMEM = "Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_ES[] PROGMEM = "Calibracion XYZ fallada. Puntos de calibracion en la cama no encontrados.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_PL[] PROGMEM = "Kalibracja XYZ niepowiedziona. Kalibracyjny punkt podkladki nieznaleziony.";
 const char * const MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_EN,
 	MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_CZ,
 	MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_EN
+	MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_PL
 };
 
 const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_EN[] PROGMEM = "X/Y skewed severly. Skew will be corrected automatically.";
 const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_CZ[] PROGMEM = "X/Y osy jsou silne zkosene. Zkoseni bude automaticky vyrovnano pri tisku.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_ES[] PROGMEM = "X/Y muy distorsionado. La distorsion sera corregida automaticamente.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_PL[] PROGMEM = "Osie X/Y sa mocno skosne. Skos bedzie automatycznie wyrownany przy druku.";
 const char * const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_EN,
 	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_CZ,
 	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_EN
+	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_PL
 };
 
-const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_EN[] PROGMEM = "X/Y calibration all right. X/Y axes are slightly skewed.";
-const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_CZ[] PROGMEM = "Kalibrace X/Y v poradku. X/Y osy mirne zkosene.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_EN[] PROGMEM = "XYZ calibration all right. X/Y axes are slightly skewed.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_CZ[] PROGMEM = "Kalibrace XYZ v poradku. X/Y osy mirne zkosene.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_ES[] PROGMEM = "Calibracion XYZ conseguida. Ejes X/Y un poco torcidos.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_PL[] PROGMEM = "Kalibracja XYZ w porzadku. Osie X/Y lekko skosne.";
 const char * const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_EN,
 	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_CZ,
 	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_EN
+	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_PL
 };
 
-const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_EN[] PROGMEM = "X/Y calibration compromised. Front calibration points not reachable.";
-const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_CZ[] PROGMEM = "Kalibrace X/Y nepresna. Predni kalibracni body moc vpredu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_EN[] PROGMEM = "XYZ calibration compromised. Front calibration points not reachable.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_CZ[] PROGMEM = "Kalibrace XYZ nepresna. Predni kalibracni body moc vpredu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_ES[] PROGMEM = "Calibrazion XYZ comprometida. Punto delanteros no alcanzables.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_PL[] PROGMEM = "Kalibracja XYZ niedokladna. Przednie punkty kalibracyjne zbyt wysuniete do przodu.";
 const char * const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_EN,
 	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_CZ,
 	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_EN
+	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_PL
 };
 
-const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_EN[] PROGMEM = "X/Y calibration compromised. Left front calibration point not reachable.";
-const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_CZ[] PROGMEM = "Kalibrace X/Y nepresna. Levy predni bod moc vpredu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_EN[] PROGMEM = "XYZ calibration compromised. Left front calibration point not reachable.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_CZ[] PROGMEM = "Kalibrace XYZ nepresna. Levy predni bod moc vpredu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_ES[] PROGMEM = "Calibrazion XYZ comprometida. Punto delantero izquierdo no alcanzable.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_PL[] PROGMEM = "Kalibracja XYZ niedokladna. Lewy przedni punkt zbyt wysuniety do przodu.";
 const char * const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_EN,
 	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_CZ,
 	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_EN
+	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_PL
 };
 
-const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_EN[] PROGMEM = "X/Y calibration compromised. Right front calibration point not reachable.";
-const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_CZ[] PROGMEM = "Kalibrace X/Y nepresna. Pravy predni bod moc vpredu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_EN[] PROGMEM = "XYZ calibration compromised. Right front calibration point not reachable.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_CZ[] PROGMEM = "Kalibrace XYZ nepresna. Pravy predni bod moc vpredu.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_ES[] PROGMEM = "Calibrazion XYZ comprometida. Punto delantero derecho no alcanzable.";
+const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_PL[] PROGMEM = "Kalibracja XYZ niedokladna. Prawy przedni punkt zbyt wysuniety do przodu.";
 const char * const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_EN,
 	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_CZ,
 	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_EN,
-	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_EN
+	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_ES,
+	MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_PL
 };
 
 const char MSG_BEGIN_FILE_LIST_EN[] PROGMEM = "Begin file list";
@@ -361,24 +405,27 @@ const char * const MSG_BROWNOUT_RESET_LANG_TABLE[1] PROGMEM = {
 	MSG_BROWNOUT_RESET_EN
 };
 
-const char MSG_CALIBRATE_BED_EN[] PROGMEM = "Calibrate X/Y";
-const char MSG_CALIBRATE_BED_CZ[] PROGMEM = "Kalibrace X/Y";
+const char MSG_CALIBRATE_BED_EN[] PROGMEM = "Calibrate XYZ";
+const char MSG_CALIBRATE_BED_CZ[] PROGMEM = "Kalibrace XYZ";
+const char MSG_CALIBRATE_BED_ES[] PROGMEM = "Calibra XYZ";
+const char MSG_CALIBRATE_BED_PL[] PROGMEM = "Kalibracja XYZ";
 const char * const MSG_CALIBRATE_BED_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_CALIBRATE_BED_EN,
 	MSG_CALIBRATE_BED_CZ,
 	MSG_CALIBRATE_BED_EN,
-	MSG_CALIBRATE_BED_EN,
-	MSG_CALIBRATE_BED_EN
+	MSG_CALIBRATE_BED_ES,
+	MSG_CALIBRATE_BED_PL
 };
 
-const char MSG_CALIBRATE_BED_RESET_EN[] PROGMEM = "Reset X/Y calibr.";
-const char MSG_CALIBRATE_BED_RESET_CZ[] PROGMEM = "Reset X/Y kalibr.";
+const char MSG_CALIBRATE_BED_RESET_EN[] PROGMEM = "Reset XYZ calibr.";
+const char MSG_CALIBRATE_BED_RESET_CZ[] PROGMEM = "Reset XYZ kalibr.";
+const char MSG_CALIBRATE_BED_RESET_PL[] PROGMEM = "Reset kalibr. XYZ";
 const char * const MSG_CALIBRATE_BED_RESET_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_CALIBRATE_BED_RESET_EN,
 	MSG_CALIBRATE_BED_RESET_CZ,
 	MSG_CALIBRATE_BED_RESET_EN,
 	MSG_CALIBRATE_BED_RESET_EN,
-	MSG_CALIBRATE_BED_RESET_EN
+	MSG_CALIBRATE_BED_RESET_PL
 };
 
 const char MSG_CARD_MENU_EN[] PROGMEM = "Print from SD";
@@ -438,22 +485,26 @@ const char * const MSG_CONFIGURATION_VER_LANG_TABLE[1] PROGMEM = {
 
 const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_EN[] PROGMEM = "Are left and right Z~carriages all up?";
 const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_CZ[] PROGMEM = "Dojely oba Z voziky k~hornimu dorazu?";
+const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_ES[] PROGMEM = "Los carros Z izquierdo/derecho estan arriba al maximo?";
+const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_PL[] PROGMEM = "Oba wozki Z dojechaly do gornej ramy?";
 const char * const MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_CONFIRM_CARRIAGE_AT_THE_TOP_EN,
 	MSG_CONFIRM_CARRIAGE_AT_THE_TOP_CZ,
 	MSG_CONFIRM_CARRIAGE_AT_THE_TOP_EN,
-	MSG_CONFIRM_CARRIAGE_AT_THE_TOP_EN,
-	MSG_CONFIRM_CARRIAGE_AT_THE_TOP_EN
+	MSG_CONFIRM_CARRIAGE_AT_THE_TOP_ES,
+	MSG_CONFIRM_CARRIAGE_AT_THE_TOP_PL
 };
 
 const char MSG_CONFIRM_NOZZLE_CLEAN_EN[] PROGMEM = "Please clean the nozzle for calibration. Click when done.";
 const char MSG_CONFIRM_NOZZLE_CLEAN_CZ[] PROGMEM = "Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem.";
+const char MSG_CONFIRM_NOZZLE_CLEAN_ES[] PROGMEM = "Limpiar boquilla para calibracion. Click cuando acabes.";
+const char MSG_CONFIRM_NOZZLE_CLEAN_PL[] PROGMEM = "Dla prawidlowej kalibracji prosze oczyscic dysze. Potwierdzic guzikiem.";
 const char * const MSG_CONFIRM_NOZZLE_CLEAN_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_CONFIRM_NOZZLE_CLEAN_EN,
 	MSG_CONFIRM_NOZZLE_CLEAN_CZ,
 	MSG_CONFIRM_NOZZLE_CLEAN_EN,
-	MSG_CONFIRM_NOZZLE_CLEAN_EN,
-	MSG_CONFIRM_NOZZLE_CLEAN_EN
+	MSG_CONFIRM_NOZZLE_CLEAN_ES,
+	MSG_CONFIRM_NOZZLE_CLEAN_PL
 };
 
 const char MSG_CONTRAST_EN[] PROGMEM = "LCD contrast";
@@ -732,32 +783,38 @@ const char * const MSG_FILE_SAVED_LANG_TABLE[1] PROGMEM = {
 
 const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_EN[] PROGMEM = "Searching bed";
 const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_CZ[] PROGMEM = "Hledam kalibracni";
+const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_ES[] PROGMEM = "Buscando cama";
+const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_PL[] PROGMEM = "Szukam kalibracyjnego";
 const char * const MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_EN,
 	MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_CZ,
 	MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_EN,
-	MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_EN,
-	MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_EN
+	MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_ES,
+	MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_PL
 };
 
 const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_EN[] PROGMEM = "calibration point";
 const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_CZ[] PROGMEM = "bod podlozky";
+const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_ES[] PROGMEM = "punto de calibracion";
+const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_PL[] PROGMEM = "punktu podkladki";
 const char * const MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_EN,
 	MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_CZ,
 	MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_EN,
-	MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_EN,
-	MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_EN
+	MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_ES,
+	MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_PL
 };
 
 const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_EN[] PROGMEM = " of 4";
 const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_CZ[] PROGMEM = " z 4";
+const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_ES[] PROGMEM = " de 4";
+const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_PL[] PROGMEM = " z 4";
 const char * const MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_EN,
 	MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_CZ,
 	MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_EN,
-	MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_EN,
-	MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_EN
+	MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_ES,
+	MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_PL
 };
 
 const char MSG_FLOW_EN[] PROGMEM = "Flow";
@@ -883,32 +940,38 @@ const char * const MSG_HOTEND_OFFSET_LANG_TABLE[1] PROGMEM = {
 
 const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_EN[] PROGMEM = "Improving bed";
 const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_CZ[] PROGMEM = "Zlepsuji presnost";
+const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_ES[] PROGMEM = "Mejorando cama";
+const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_PL[] PROGMEM = "Ulepszam dokladnosc";
 const char * const MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_EN,
 	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_CZ,
 	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_EN,
-	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_EN,
-	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_EN
+	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_ES,
+	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_PL
 };
 
 const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_EN[] PROGMEM = "calibration point";
 const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_CZ[] PROGMEM = "kalibracniho bodu";
+const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_ES[] PROGMEM = "punto de calibracion";
+const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_PL[] PROGMEM = "punktu kalibracyjnego";
 const char * const MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_EN,
 	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_CZ,
 	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_EN,
-	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_EN,
-	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_EN
+	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_ES,
+	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_PL
 };
 
 const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_EN[] PROGMEM = " of 9";
 const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_CZ[] PROGMEM = " z 9";
+const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_ES[] PROGMEM = " de 9";
+const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_PL[] PROGMEM = " z 9";
 const char * const MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_EN,
 	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_CZ,
 	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_EN,
-	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_EN,
-	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_EN
+	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_ES,
+	MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_PL
 };
 
 const char MSG_INIT_SDCARD_EN[] PROGMEM = "Init. SD card";
@@ -1085,6 +1148,16 @@ const char * const MSG_MAX_LANG_TABLE[1] PROGMEM = {
 	MSG_MAX_EN
 };
 
+const char MSG_MENU_CALIBRATION_EN[] PROGMEM = "Calibration";
+const char MSG_MENU_CALIBRATION_CZ[] PROGMEM = "Kalibrace";
+const char * const MSG_MENU_CALIBRATION_LANG_TABLE[LANG_NUM] PROGMEM = {
+	MSG_MENU_CALIBRATION_EN,
+	MSG_MENU_CALIBRATION_CZ,
+	MSG_MENU_CALIBRATION_EN,
+	MSG_MENU_CALIBRATION_EN,
+	MSG_MENU_CALIBRATION_EN
+};
+
 const char MSG_MESH_BED_LEVELING_EN[] PROGMEM = "Mesh Bed Leveling";
 const char * const MSG_MESH_BED_LEVELING_LANG_TABLE[1] PROGMEM = {
 	MSG_MESH_BED_LEVELING_EN
@@ -1152,14 +1225,16 @@ const char * const MSG_MOVE_AXIS_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_MOVE_AXIS_PL
 };
 
-const char MSG_MOVE_CARRIAGE_TO_THE_TOP_EN[] PROGMEM = "Calibrating X/Y. Move Z carriage up to the end stoppers. Click when done.";
-const char MSG_MOVE_CARRIAGE_TO_THE_TOP_CZ[] PROGMEM = "Kalibrace X/Y. Posunte prosim Z osu az k~hornimu dorazu. Potvrdte tlacitkem.";
+const char MSG_MOVE_CARRIAGE_TO_THE_TOP_EN[] PROGMEM = "Calibrating XYZ. Move Z carriage up to the end stoppers. Click when done.";
+const char MSG_MOVE_CARRIAGE_TO_THE_TOP_CZ[] PROGMEM = "Kalibrace XYZ. Posunte prosim Z osu az k~hornimu dorazu. Potvrdte tlacitkem.";
+const char MSG_MOVE_CARRIAGE_TO_THE_TOP_ES[] PROGMEM = "Calibrando XYZ. Subir carro Z hasta maximo. Click cuando acabes.";
+const char MSG_MOVE_CARRIAGE_TO_THE_TOP_PL[] PROGMEM = "Kalibracja XYZ. Prosze przesunac os Z do gornej ramy. Potwierdzic guzikiem.";
 const char * const MSG_MOVE_CARRIAGE_TO_THE_TOP_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_MOVE_CARRIAGE_TO_THE_TOP_EN,
 	MSG_MOVE_CARRIAGE_TO_THE_TOP_CZ,
 	MSG_MOVE_CARRIAGE_TO_THE_TOP_EN,
-	MSG_MOVE_CARRIAGE_TO_THE_TOP_EN,
-	MSG_MOVE_CARRIAGE_TO_THE_TOP_EN
+	MSG_MOVE_CARRIAGE_TO_THE_TOP_ES,
+	MSG_MOVE_CARRIAGE_TO_THE_TOP_PL
 };
 
 const char MSG_MOVE_E_EN[] PROGMEM = "Extruder";
@@ -1224,22 +1299,26 @@ const char * const MSG_MOVE_Z_LANG_TABLE[LANG_NUM] PROGMEM = {
 
 const char MSG_NEW_FIRMWARE_AVAILABLE_EN[] PROGMEM = "New firmware version available:";
 const char MSG_NEW_FIRMWARE_AVAILABLE_CZ[] PROGMEM = "Vysla nova verze firmware:";
+const char MSG_NEW_FIRMWARE_AVAILABLE_ES[] PROGMEM = "Nuevo firmware disponible:";
+const char MSG_NEW_FIRMWARE_AVAILABLE_PL[] PROGMEM = "Wyszla nowa wersja firmware:";
 const char * const MSG_NEW_FIRMWARE_AVAILABLE_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_NEW_FIRMWARE_AVAILABLE_EN,
 	MSG_NEW_FIRMWARE_AVAILABLE_CZ,
 	MSG_NEW_FIRMWARE_AVAILABLE_EN,
-	MSG_NEW_FIRMWARE_AVAILABLE_EN,
-	MSG_NEW_FIRMWARE_AVAILABLE_EN
+	MSG_NEW_FIRMWARE_AVAILABLE_ES,
+	MSG_NEW_FIRMWARE_AVAILABLE_PL
 };
 
 const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_EN[] PROGMEM = "Please upgrade.";
 const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_CZ[] PROGMEM = "Prosim aktualizujte.";
+const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_ES[] PROGMEM = "Actualizar por favor.";
+const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_PL[] PROGMEM = "Prosze zaktualizowac.";
 const char * const MSG_NEW_FIRMWARE_PLEASE_UPGRADE_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_NEW_FIRMWARE_PLEASE_UPGRADE_EN,
 	MSG_NEW_FIRMWARE_PLEASE_UPGRADE_CZ,
 	MSG_NEW_FIRMWARE_PLEASE_UPGRADE_EN,
-	MSG_NEW_FIRMWARE_PLEASE_UPGRADE_EN,
-	MSG_NEW_FIRMWARE_PLEASE_UPGRADE_EN
+	MSG_NEW_FIRMWARE_PLEASE_UPGRADE_ES,
+	MSG_NEW_FIRMWARE_PLEASE_UPGRADE_PL
 };
 
 const char MSG_NO_EN[] PROGMEM = "No";
@@ -2147,12 +2226,14 @@ const char * const MSG_SET_ORIGIN_LANG_TABLE[LANG_NUM] PROGMEM = {
 
 const char MSG_SHOW_END_STOPS_EN[] PROGMEM = "Show end stops";
 const char MSG_SHOW_END_STOPS_CZ[] PROGMEM = "Zobraz konc. spinace";
+const char MSG_SHOW_END_STOPS_ES[] PROGMEM = "Ensena fin de paso";
+const char MSG_SHOW_END_STOPS_PL[] PROGMEM = "Pokaz krancowki";
 const char * const MSG_SHOW_END_STOPS_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_SHOW_END_STOPS_EN,
 	MSG_SHOW_END_STOPS_CZ,
 	MSG_SHOW_END_STOPS_EN,
-	MSG_SHOW_END_STOPS_EN,
-	MSG_SHOW_END_STOPS_EN
+	MSG_SHOW_END_STOPS_ES,
+	MSG_SHOW_END_STOPS_PL
 };
 
 const char MSG_SILENT_MODE_OFF_EN[] PROGMEM = "Mode [high power]";
@@ -2357,6 +2438,16 @@ const char * const MSG_TEMPERATURE_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_TEMPERATURE_PL
 };
 
+const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN[] PROGMEM = "SD card [normal]";
+const char * const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_LANG_TABLE[1] PROGMEM = {
+	MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN
+};
+
+const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN[] PROGMEM = "SD card [FlshAir]";
+const char * const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_LANG_TABLE[1] PROGMEM = {
+	MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN
+};
+
 const char MSG_TUNE_EN[] PROGMEM = "Tune";
 const char MSG_TUNE_CZ[] PROGMEM = "Ladit";
 const char MSG_TUNE_IT[] PROGMEM = "Adatta";

+ 8 - 2
Firmware/language_all.h

@@ -90,8 +90,8 @@ extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_LA
 #define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_LANG_TABLE)
 extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_LANG_TABLE[LANG_NUM];
 #define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_LANG_TABLE)
-extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE[1];
-#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT LANG_TABLE_SELECT_EXPLICIT(MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE, 0)
+extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE[LANG_NUM];
+#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE)
 extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_LANG_TABLE[LANG_NUM];
 #define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_LANG_TABLE)
 extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_LANG_TABLE[LANG_NUM];
@@ -286,6 +286,8 @@ extern const char* const MSG_MAIN_LANG_TABLE[LANG_NUM];
 #define MSG_MAIN LANG_TABLE_SELECT(MSG_MAIN_LANG_TABLE)
 extern const char* const MSG_MAX_LANG_TABLE[1];
 #define MSG_MAX LANG_TABLE_SELECT_EXPLICIT(MSG_MAX_LANG_TABLE, 0)
+extern const char* const MSG_MENU_CALIBRATION_LANG_TABLE[LANG_NUM];
+#define MSG_MENU_CALIBRATION LANG_TABLE_SELECT(MSG_MENU_CALIBRATION_LANG_TABLE)
 extern const char* const MSG_MESH_BED_LEVELING_LANG_TABLE[1];
 #define MSG_MESH_BED_LEVELING LANG_TABLE_SELECT_EXPLICIT(MSG_MESH_BED_LEVELING_LANG_TABLE, 0)
 extern const char* const MSG_MIN_LANG_TABLE[1];
@@ -542,6 +544,10 @@ extern const char* const MSG_TAKE_EFFECT_LANG_TABLE[LANG_NUM];
 #define MSG_TAKE_EFFECT LANG_TABLE_SELECT(MSG_TAKE_EFFECT_LANG_TABLE)
 extern const char* const MSG_TEMPERATURE_LANG_TABLE[LANG_NUM];
 #define MSG_TEMPERATURE LANG_TABLE_SELECT(MSG_TEMPERATURE_LANG_TABLE)
+extern const char* const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_LANG_TABLE[1];
+#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF LANG_TABLE_SELECT_EXPLICIT(MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_LANG_TABLE, 0)
+extern const char* const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_LANG_TABLE[1];
+#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON LANG_TABLE_SELECT_EXPLICIT(MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_LANG_TABLE, 0)
 extern const char* const MSG_TUNE_LANG_TABLE[LANG_NUM];
 #define MSG_TUNE LANG_TABLE_SELECT(MSG_TUNE_LANG_TABLE)
 extern const char* const MSG_UNKNOWN_COMMAND_LANG_TABLE[1];

+ 16 - 13
Firmware/language_cz.h

@@ -279,10 +279,10 @@
 #define MSG_USB_PRINTING					"Tisk z USB  "
 
 #define MSG_SHOW_END_STOPS					"Zobraz konc. spinace"
-#define MSG_CALIBRATE_BED					"Kalibrace X/Y"
-#define MSG_CALIBRATE_BED_RESET				"Reset X/Y kalibr."
+#define MSG_CALIBRATE_BED					"Kalibrace XYZ"
+#define MSG_CALIBRATE_BED_RESET				"Reset XYZ kalibr."
 
-#define MSG_MOVE_CARRIAGE_TO_THE_TOP		"Kalibrace X/Y. Posunte prosim Z osu az k~hornimu dorazu. Potvrdte tlacitkem."
+#define MSG_MOVE_CARRIAGE_TO_THE_TOP		"Kalibrace XYZ. Posunte prosim Z osu az k~hornimu dorazu. Potvrdte tlacitkem."
 #define MSG_CONFIRM_NOZZLE_CLEAN			"Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem."
 #define MSG_CONFIRM_CARRIAGE_AT_THE_TOP		"Dojely oba Z voziky k~hornimu dorazu?"
 
@@ -293,17 +293,17 @@
 #define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2	"kalibracniho bodu"
 #define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3	" z 9"
 
-#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND			"Kalibrace X/Y selhala. Kalibracni bod podlozky nenalezen."
-#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED			"Kalibrace X/Y selhala. Nahlednete do manualu."
-#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT					"X/Y calibration ok. X/Y axes are perpendicular."
-#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD					"Kalibrace X/Y v poradku. X/Y osy mirne zkosene."
+#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND			"Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED			"Kalibrace XYZ selhala. Nahlednete do manualu."
+#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT					"XYZ calibration ok. X/Y axes are perpendicular."
+#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD					"Kalibrace XYZ v poradku. X/Y osy mirne zkosene."
 #define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME				"X/Y osy jsou silne zkosene. Zkoseni bude automaticky vyrovnano pri tisku."
-#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR		"Kalibrace X/Y selhala. Levy predni bod moc vpredu. Srovnejte tiskarnu."
-#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR	"Kalibrace X/Y selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu."
-#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR		"Kalibrace X/Y selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu."
-#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR	"Kalibrace X/Y nepresna. Levy predni bod moc vpredu."
-#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR	"Kalibrace X/Y nepresna. Pravy predni bod moc vpredu."
-#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR	"Kalibrace X/Y nepresna. Predni kalibracni body moc vpredu."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR		"Kalibrace XYZ selhala. Levy predni bod moc vpredu. Srovnejte tiskarnu."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR	"Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR		"Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR	"Kalibrace XYZ nepresna. Levy predni bod moc vpredu."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR	"Kalibrace XYZ nepresna. Pravy predni bod moc vpredu."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR	"Kalibrace XYZ nepresna. Predni kalibracni body moc vpredu."
 
 #define MSG_BED_LEVELING_FAILED_POINT_LOW						"Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset."
 #define MSG_BED_LEVELING_FAILED_POINT_HIGH						"Kalibrace Z selhala. Sensor sepnul prilis vysoko. Cekam na reset."
@@ -320,4 +320,7 @@
 #define MSG_BED_CORRECTION_REAR									"Vzadu  [um]"
 #define MSG_BED_CORRECTION_RESET								"Reset"
 
+
+#define MSG_MENU_CALIBRATION									"Kalibrace"
+
 #endif // LANGUAGE_EN_H

+ 16 - 15
Firmware/language_en.h

@@ -272,10 +272,10 @@
 #define MSG_HOMEYZ_DONE		                "Calibration done"
 
 #define MSG_SHOW_END_STOPS					"Show end stops"
-#define MSG_CALIBRATE_BED					"Calibrate X/Y"
-#define MSG_CALIBRATE_BED_RESET				"Reset X/Y calibr."
+#define MSG_CALIBRATE_BED					"Calibrate XYZ"
+#define MSG_CALIBRATE_BED_RESET				"Reset XYZ calibr."
 
-#define MSG_MOVE_CARRIAGE_TO_THE_TOP 		"Calibrating X/Y. Move Z carriage up to the end stoppers. Click when done."
+#define MSG_MOVE_CARRIAGE_TO_THE_TOP 		"Calibrating XYZ. Move Z carriage up to the end stoppers. Click when done."
 #define MSG_CONFIRM_NOZZLE_CLEAN			"Please clean the nozzle for calibration. Click when done."
 #define MSG_CONFIRM_CARRIAGE_AT_THE_TOP		"Are left and right Z~carriages all up?"
 
@@ -286,17 +286,17 @@
 #define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2	"calibration point"
 #define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3	" of 9"
 
-#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND			"X/Y calibration failed. Bed calibration point was not found."
-#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED			"X/Y calibration failed. Please consult the manual."
-#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT					"X/Y calibration ok. X/Y axes are perpendicular."
-#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD					"X/Y calibration all right. X/Y axes are slightly skewed."
+#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND			"XYZ calibration failed. Bed calibration point was not found."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED			"XYZ calibration failed. Please consult the manual."
+#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT					"XYZ calibration ok. X/Y axes are perpendicular."
+#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD					"XYZ calibration all right. X/Y axes are slightly skewed."
 #define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME				"X/Y skewed severly. Skew will be corrected automatically."
-#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR		"X/Y calibration failed. Left front calibration point not reachable."
-#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR	"X/Y calibration failed. Right front calibration point not reachable."
-#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR		"X/Y calibration failed. Front calibration points not reachable."
-#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR	"X/Y calibration compromised. Left front calibration point not reachable."
-#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR	"X/Y calibration compromised. Right front calibration point not reachable."
-#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR	"X/Y calibration compromised. Front calibration points not reachable."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR		"XYZ calibration failed. Left front calibration point not reachable."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR	"XYZ calibration failed. Right front calibration point not reachable."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR		"XYZ calibration failed. Front calibration points not reachable."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR	"XYZ calibration compromised. Left front calibration point not reachable."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR	"XYZ calibration compromised. Right front calibration point not reachable."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR	"XYZ calibration compromised. Front calibration points not reachable."
 
 #define MSG_BED_LEVELING_FAILED_POINT_LOW						"Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 #define MSG_BED_LEVELING_FAILED_POINT_HIGH						"Bed leveling failed. Sensor triggered too high. Waiting for reset."
@@ -314,8 +314,9 @@
 #define MSG_BED_CORRECTION_REAR									"Rear side  um"
 #define MSG_BED_CORRECTION_RESET								"Reset"
 
-
-
 #define MSG_MESH_BED_LEVELING									"Mesh Bed Leveling"
+#define MSG_MENU_CALIBRATION									"Calibration"
+#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF					"SD card [normal]"
+#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON					"SD card [FlshAir]"
 
 #endif // LANGUAGE_EN_H

+ 36 - 0
Firmware/language_es.h

@@ -272,5 +272,41 @@
 #define MSG_STATISTICS                      "Estadistica  "
 #define MSG_USB_PRINTING                    "Impresion de USB "
 
+#define MSG_SHOW_END_STOPS                  "Ensena fin de paso"
+#define MSG_CALIBRATE_BED                   "Calibra XYZ"
+#define MSG_CALIBRATE_BED_RESET             "Reset XYZ calibr."
+#define MSG_MOVE_CARRIAGE_TO_THE_TOP        "Calibrando XYZ. Subir carro Z hasta maximo. Click cuando acabes."
+#define MSG_CONFIRM_NOZZLE_CLEAN            "Limpiar boquilla para calibracion. Click cuando acabes."
+#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP     "Los carros Z izquierdo/derecho estan arriba al maximo?"
+#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE1  "Buscando cama"
+#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE2  "punto de calibracion"
+#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE3  " de 4"
+#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1   "Mejorando cama"
+#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2   "punto de calibracion"
+#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3   " de 9"
+#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND           "Calibracion XYZ fallada. Puntos de calibracion en la cama no encontrados."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED            "Calibracion XYZ fallada. Consultar el manual por favor."
+#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT               "Calibracion XYZ ok. Ejes X/Y perpendiculares."
+#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD             "Calibracion XYZ conseguida. Ejes X/Y un poco torcidos."
+#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME          "X/Y muy distorsionado. La distorsion sera corregida automaticamente."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR     "Calibracion XYZ fallad. Punto delantero izquierdo no alcanzable."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR        "Calibracion XYZ fallad. Punto delantero derecho no alcanzable."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR     "Calibracion XYZ fallad. Punto delanteros no alcanzables."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR        "Calibrazion XYZ comprometida. Punto delantero izquierdo no alcanzable."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR       "Calibrazion XYZ comprometida. Punto delantero derecho no alcanzable."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR        "Calibrazion XYZ comprometida. Punto delanteros no alcanzables."
+#define MSG_BED_LEVELING_FAILED_POINT_LOW           "Nivelacion cama fallada. El sensor no funciono'. Escombros en la boquilla? Pendiente el reset."
+#define MSG_BED_LEVELING_FAILED_POINT_HIGH          "Nivelacion cama fallada. El sensor funcino' demasiado temprano. Pendiente el reset."
+#define MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED      "Nivelacion cama fallada. Sensor desconectado o cables danados. Pendiente el reset."
+#define MSG_NEW_FIRMWARE_AVAILABLE                  "Nuevo firmware disponible:"
+#define MSG_NEW_FIRMWARE_PLEASE_UPGRADE                 "Actualizar por favor."
+#define MSG_BABYSTEP_Z_NOT_SET                      "Impresora aun no calibrada. Ejecutar el G-code de calibracion para ajustar la altura de Z."
+#define MSG_BED_CORRECTION_MENU                                 "Nivel de cama correcto"
+#define MSG_BED_CORRECTION_LEFT                                 "Hacia la izquierda  um"
+#define MSG_BED_CORRECTION_RIGHT                                "Hacia la derecha um"
+#define MSG_BED_CORRECTION_FRONT                                "Hacia adelante um"
+#define MSG_BED_CORRECTION_REAR                                 "Hacia atras  um"
+#define MSG_BED_CORRECTION_RESET                                "Reset"
+
 #endif // LANGUAGE_EN_H
 

+ 41 - 0
Firmware/language_pl.h

@@ -288,5 +288,46 @@
 #define MSG_STATISTICS                      "Statystyka  "
 #define MSG_USB_PRINTING                    "Druk z USB  "
 
+#define MSG_SHOW_END_STOPS					"Pokaz krancowki"
+#define MSG_CALIBRATE_BED					"Kalibracja XYZ"
+#define MSG_CALIBRATE_BED_RESET				"Reset kalibr. XYZ"
+
+#define MSG_MOVE_CARRIAGE_TO_THE_TOP		"Kalibracja XYZ. Prosze przesunac os Z do gornej ramy. Potwierdzic guzikiem."
+#define MSG_CONFIRM_NOZZLE_CLEAN			"Dla prawidlowej kalibracji prosze oczyscic dysze. Potwierdzic guzikiem."
+#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP		"Oba wozki Z dojechaly do gornej ramy?"
+
+#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE1	"Szukam kalibracyjnego"
+#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE2	"punktu podkladki"
+#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE3	" z 4"
+#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1	"Ulepszam dokladnosc"
+#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2	"punktu kalibracyjnego"
+#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3	" z 9"
+
+#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND			"Kalibracja XYZ niepowiedziona. Kalibracyjny punkt podkladki nieznaleziony."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED			"Kalibracja XYZ niepowiedziona. Sprawdzic w instrukcji."
+#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT					"Kalibracja XYZ ok. Osie X/Y sa prostopadle."
+#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD					"Kalibracja XYZ w porzadku. Osie X/Y lekko skosne."
+#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME				"Osie X/Y sa mocno skosne. Skos bedzie automatycznie wyrownany przy druku."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR		"Kalibracja XYZ niepowiedziona. Lewy przedni punkt zbyt wysuniety do przodu. Wyrownac drukarke."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR	"Kalibracja XYZ niepowiedziona. Prawy przedni punkt zbyt wysuniety do przodu. Wyrownac drukarke."
+#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR		"Kalibracja XYZ niepowiedziona. Przednie punkty kalibracyjne zbyt wysuniete do przodu. Wyrownac drukarke."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR	"Kalibracja XYZ niedokladna. Lewy przedni punkt zbyt wysuniety do przodu."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR	"Kalibracja XYZ niedokladna. Prawy przedni punkt zbyt wysuniety do przodu."
+#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR	"Kalibracja XYZ niedokladna. Przednie punkty kalibracyjne zbyt wysuniete do przodu."
+
+#define MSG_BED_LEVELING_FAILED_POINT_LOW						"Kalibracja Z niepowiedziona. Sensor nie dotknal. Zanieczyszczona dysza? Czekam na reset."
+#define MSG_BED_LEVELING_FAILED_POINT_HIGH						"Kalibracja Z niepowiedziona. Sensor dotknal zbyt wysoko. Czekam na reset."
+#define MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED				"Kalibracja Z niepowiedziona. Sensor jest odlaczony lub uszkodzony kabel. Czekam na reset."
+
+#define MSG_NEW_FIRMWARE_AVAILABLE								"Wyszla nowa wersja firmware:"
+#define MSG_NEW_FIRMWARE_PLEASE_UPGRADE							"Prosze zaktualizowac."
+#define MSG_BABYSTEP_Z_NOT_SET                          		"Drukarka nie byla kalibrowana. Wlaczyc kalibracyjny G-kod i dostroic Z."
+
+#define MSG_BED_CORRECTION_MENU									"Korekta podkladki"
+#define MSG_BED_CORRECTION_LEFT									"W lewo  [um]"
+#define MSG_BED_CORRECTION_RIGHT								"W prawo [um]"
+#define MSG_BED_CORRECTION_FRONT								"Do przodu [um]"
+#define MSG_BED_CORRECTION_REAR									"Do tylu  [um]"
+#define MSG_BED_CORRECTION_RESET								"Reset"
 
 #endif // LANGUAGE_EN_H

+ 49 - 31
Firmware/ultralcd.cpp

@@ -136,8 +136,8 @@ static void lcd_main_menu();
 static void lcd_tune_menu();
 static void lcd_prepare_menu();
 static void lcd_move_menu();
-static void lcd_control_menu();
 static void lcd_settings_menu();
+static void lcd_calibration_menu();
 static void lcd_language_menu();
 static void lcd_control_temperature_menu();
 static void lcd_control_temperature_preheat_pla_settings_menu();
@@ -765,7 +765,7 @@ static void lcd_support_menu()
         // Menu was entered or SD card status has changed (plugged in or removed).
         // Initialize its status.
         menuData.supportMenu.status = 1;
-        menuData.supportMenu.is_flash_air = card.ToshibaFlashAir_GetIP(menuData.supportMenu.ip);
+        menuData.supportMenu.is_flash_air = card.ToshibaFlashAir_isEnabled() && card.ToshibaFlashAir_GetIP(menuData.supportMenu.ip);
         if (menuData.supportMenu.is_flash_air)
             sprintf_P(menuData.supportMenu.ip_str, PSTR("%d.%d.%d.%d"), 
                 menuData.supportMenu.ip[0], menuData.supportMenu.ip[1], 
@@ -1325,7 +1325,7 @@ static void lcd_adjust_bed()
         eeprom_update_int8((unsigned char*)EEPROM_BED_CORRECTION_REAR,  menuData.adjustBed.rear  = menuData.adjustBed.rear2);
 
     START_MENU();
-    MENU_ITEM(back, MSG_SETTINGS, lcd_settings_menu);
+    MENU_ITEM(back, MSG_SETTINGS, lcd_calibration_menu);
     MENU_ITEM_EDIT(int3, MSG_BED_CORRECTION_LEFT,  &menuData.adjustBed.left2,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
     MENU_ITEM_EDIT(int3, MSG_BED_CORRECTION_RIGHT, &menuData.adjustBed.right2, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
     MENU_ITEM_EDIT(int3, MSG_BED_CORRECTION_FRONT, &menuData.adjustBed.front2, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
@@ -1682,7 +1682,7 @@ static void lcd_show_end_stops() {
 
 static void menu_show_end_stops() {
     lcd_show_end_stops();
-    if (LCD_CLICKED) lcd_goto_menu(lcd_settings_menu);
+    if (LCD_CLICKED) lcd_goto_menu(lcd_calibration_menu);
 }
 
 // Lets the user move the Z carriage up to the end stoppers.
@@ -2055,6 +2055,12 @@ void lcd_mesh_calibration_z()
   lcd_return_to_status();
 }
 
+void lcd_toshiba_flash_air_compatibility_toggle()
+{
+   card.ToshibaFlashAir_enable(! card.ToshibaFlashAir_isEnabled());
+   eeprom_update_byte((uint8_t*)EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY, card.ToshibaFlashAir_isEnabled());
+}
+
 static void lcd_settings_menu()
 {
   EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu));
@@ -2065,23 +2071,9 @@ static void lcd_settings_menu()
   MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_control_temperature_menu);
   MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu_1mm);
   
-  if (!isPrintPaused)
-  {
-#ifndef MESH_BED_LEVELING
-    // "Calibrate Z"
-	  MENU_ITEM(gcode, MSG_HOMEYZ, PSTR("G28 Z"));
-#else
-    // "Calibrate Z" with storing the reference values to EEPROM.
-    MENU_ITEM(submenu, MSG_HOMEYZ, lcd_mesh_calibration_z);
-    // "Mesh Bed Leveling"
-	  MENU_ITEM(submenu, MSG_MESH_BED_LEVELING, lcd_mesh_bedleveling);
-#endif
-  }
-
   if (!isPrintPaused)
   {
 	  MENU_ITEM(gcode, MSG_DISABLE_STEPPERS, PSTR("M84"));
-	  MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28 W"));
   }
 
   if (SilentModeMenu == 0) {
@@ -2093,21 +2085,47 @@ static void lcd_settings_menu()
 	if (!isPrintPaused)
 	{
 		MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z);//8
-    MENU_ITEM(submenu, MSG_BED_CORRECTION_MENU, lcd_adjust_bed);
 	}
 	MENU_ITEM(submenu, MSG_LANGUAGE_SELECT, lcd_language_menu);
-	if (!isPrintPaused)
-	{
-		MENU_ITEM(submenu, MSG_SELFTEST, lcd_selftest);
-    MENU_ITEM(submenu, MSG_SHOW_END_STOPS, menu_show_end_stops);
+
+  if (card.ToshibaFlashAir_isEnabled()) {
+    MENU_ITEM(function, MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON, lcd_toshiba_flash_air_compatibility_toggle);
+  } else {
+    MENU_ITEM(function, MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF, lcd_toshiba_flash_air_compatibility_toggle);
+  }
+
+	END_MENU();
+}
+
+static void lcd_calibration_menu()
+{
+  START_MENU();
+  MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
+  if (!isPrintPaused)
+  {
+    MENU_ITEM(submenu, MSG_SELFTEST, lcd_selftest);
+#ifndef MESH_BED_LEVELING
+    // MK1
+    // "Calibrate Z"
+    MENU_ITEM(gcode, MSG_HOMEYZ, PSTR("G28 Z"));
+#else
+    // MK2
     MENU_ITEM(submenu, MSG_CALIBRATE_BED, lcd_mesh_calibration);
+    // "Calibrate Z" with storing the reference values to EEPROM.
+    MENU_ITEM(submenu, MSG_HOMEYZ, lcd_mesh_calibration_z);
+    // "Mesh Bed Leveling"
+    MENU_ITEM(submenu, MSG_MESH_BED_LEVELING, lcd_mesh_bedleveling);
+#endif
+    MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28 W"));
+    MENU_ITEM(submenu, MSG_BED_CORRECTION_MENU, lcd_adjust_bed);
+    MENU_ITEM(submenu, MSG_SHOW_END_STOPS, menu_show_end_stops);
     MENU_ITEM(gcode, MSG_CALIBRATE_BED_RESET, PSTR("M44"));
-	}
-	if (farm_mode)
-	{
-		MENU_ITEM(submenu, PSTR("Farm number"), lcd_farm_no);
-	}
-	END_MENU();
+  }
+  if (farm_mode)
+  {
+    MENU_ITEM(submenu, PSTR("Farm number"), lcd_farm_no);
+  }
+  END_MENU();
 }
 /*
 void lcd_mylang_top(int hlaska) {
@@ -2423,7 +2441,7 @@ static void lcd_main_menu()
   
  MENU_ITEM(back, MSG_WATCH, lcd_status_screen);
 
-  if ( ( IS_SD_PRINTING || is_usb_printing ) && (current_position[Z_AXIS] < 0.5) ) 
+  if ( ( IS_SD_PRINTING || is_usb_printing ) && (current_position[Z_AXIS] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU) ) 
   {
 	MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z);//8
   }
@@ -2480,6 +2498,7 @@ static void lcd_main_menu()
     MENU_ITEM(function, MSG_LOAD_FILAMENT, lcd_LoadFilament);
     MENU_ITEM(function, MSG_UNLOAD_FILAMENT, lcd_unLoadFilament);
     MENU_ITEM(submenu, MSG_SETTINGS, lcd_settings_menu);
+    MENU_ITEM(submenu, MSG_MENU_CALIBRATION, lcd_calibration_menu);
   }
 
   if (!is_usb_printing)
@@ -2557,7 +2576,6 @@ static void lcd_control_temperature_menu()
 
   START_MENU();
   MENU_ITEM(back, MSG_SETTINGS, lcd_settings_menu);
-  //MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
 #if TEMP_SENSOR_0 != 0
   MENU_ITEM_EDIT(int3, MSG_NOZZLE, &target_temperature[0], 0, HEATER_0_MAXTEMP - 10);
 #endif