Browse Source

Fixed "Shift out of range" bug in xyz calibration, status on demand added, temp reading disable in farm mode

PavelSindler 8 years ago
parent
commit
241e32e691

+ 1 - 1
Firmware/Configuration.h

@@ -5,7 +5,7 @@
 #include "Configuration_prusa.h"
 
 // Firmware version
-#define FW_version "3.0.10"
+#define FW_version "3.0.10.1"
 
 #define FW_PRUSA3D_MAGIC "PRUSA3DFW"
 #define FW_PRUSA3D_MAGIC_LEN 10

+ 1 - 0
Firmware/Marlin.h

@@ -292,6 +292,7 @@ extern unsigned long kicktime;
 extern unsigned long total_filament_used;
 void save_statistics(unsigned long _total_filament_used, unsigned long _total_print_time);
 extern unsigned int heating_status;
+extern unsigned int status_number;
 extern unsigned int heating_status_counter;
 extern bool custom_message;
 extern unsigned int custom_message_type;

+ 37 - 28
Firmware/Marlin_main.cpp

@@ -267,6 +267,7 @@ unsigned char lang_selected = 0;
 
 bool prusa_sd_card_upload = false;
 
+unsigned int status_number = 0;
 
 unsigned long total_filament_used;
 unsigned int heating_status;
@@ -1958,7 +1959,10 @@ void process_commands()
   int8_t SilentMode;
 #endif
   if(code_seen("PRUSA")){
-	  if (code_seen("fn")) {
+		if (code_seen("PRN")) {
+		  MYSERIAL.println(status_number);
+
+		}else if (code_seen("fn")) {
 		  if (farm_mode) {
 			  MYSERIAL.println(farm_no);
 		  }
@@ -1966,7 +1970,7 @@ void process_commands()
 			  MYSERIAL.println("Not in farm mode.");
 		  }
 		  
-	}else if (code_seen("fv")) {
+		}else if (code_seen("fv")) {
         // get file version
         #ifdef SDSUPPORT
         card.openFile(strchr_pointer + 3,true);
@@ -2017,7 +2021,7 @@ void process_commands()
     }else if(code_seen("Y")) { //filaments adjustment at the beginning of print (for SNMM)
 	#ifdef SNMM
 		int extr;
-		SilentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); //is silent mode or loud mode set
+		SilentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); //is  e or loud mode set
 		lcd_implementation_clear();
 		lcd_display_message_fullscreen_P(MSG_FIL_ADJUSTING);
 		current_position[Z_AXIS] = 100; 
@@ -3917,22 +3921,24 @@ Sigma_Exit:
       #endif //TEMP_RESIDENCY_TIME
           if( (millis() - codenum) > 1000UL )
           { //Print Temp Reading and remaining time every 1 second while heating up/cooling down
-            SERIAL_PROTOCOLPGM("T:");
-            SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1);
-            SERIAL_PROTOCOLPGM(" E:");
-            SERIAL_PROTOCOL((int)tmp_extruder);
-			
-            #ifdef TEMP_RESIDENCY_TIME
-              SERIAL_PROTOCOLPGM(" W:");
-              if(residencyStart > -1)
-              {
-                 codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (millis() - residencyStart)) / 1000UL;
-                 SERIAL_PROTOCOLLN( codenum );
-              }
-              else
-              {
-                 SERIAL_PROTOCOLLN( "?" );
-              }
+			  if (!farm_mode) {
+				  SERIAL_PROTOCOLPGM("T:");
+				  SERIAL_PROTOCOL_F(degHotend(tmp_extruder), 1);
+				  SERIAL_PROTOCOLPGM(" E:");
+				  SERIAL_PROTOCOL((int)tmp_extruder);
+
+			#ifdef TEMP_RESIDENCY_TIME
+				  SERIAL_PROTOCOLPGM(" W:");
+				  if (residencyStart > -1)
+				  {
+					  codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (millis() - residencyStart)) / 1000UL;
+					  SERIAL_PROTOCOLLN(codenum);
+				  }
+				  else
+				  {
+					  SERIAL_PROTOCOLLN("?");
+				  }
+			  }
             #else
               SERIAL_PROTOCOLLN("");
             #endif
@@ -3984,15 +3990,18 @@ Sigma_Exit:
         {
           if(( millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
           {
-            float tt=degHotend(active_extruder);
-            SERIAL_PROTOCOLPGM("T:");
-            SERIAL_PROTOCOL(tt);
-            SERIAL_PROTOCOLPGM(" E:");
-            SERIAL_PROTOCOL((int)active_extruder);
-            SERIAL_PROTOCOLPGM(" B:");
-            SERIAL_PROTOCOL_F(degBed(),1);
-            SERIAL_PROTOCOLLN("");
-            codenum = millis();
+			  if (!farm_mode) {
+				  float tt = degHotend(active_extruder);
+				  SERIAL_PROTOCOLPGM("T:");
+				  SERIAL_PROTOCOL(tt);
+				  SERIAL_PROTOCOLPGM(" E:");
+				  SERIAL_PROTOCOL((int)active_extruder);
+				  SERIAL_PROTOCOLPGM(" B:");
+				  SERIAL_PROTOCOL_F(degBed(), 1);
+				  SERIAL_PROTOCOLLN("");
+			  }
+				  codenum = millis();
+			  
           }
           manage_heater();
           manage_inactivity();

+ 71 - 8
Firmware/mesh_bed_calibration.cpp

@@ -412,18 +412,55 @@ BedSkewOffsetDetectionResultType calculate_machine_skew_and_offset_LS(
         cntr[1] = 0.f;
         float wx = 0.f;
         float wy = 0.f;
-        for (int8_t i = 0; i < 9; ++ i) {
+        for (int8_t i = 0; i < npts; ++ i) {
             float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1];
             float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1];
             float w = point_weight_x(i, y);
-            cntr[0] += w * (pgm_read_float(true_pts + i * 2) - x);
-            wx += w;
+			cntr[0] += w * (pgm_read_float(true_pts + i * 2) - x);
+			wx += w;
+			if (verbosity_level >= 20) {
+				MYSERIAL.print(i);
+				SERIAL_ECHOLNPGM("");
+				SERIAL_ECHOLNPGM("Weight_x:");
+				MYSERIAL.print(w);
+				SERIAL_ECHOLNPGM("");
+				SERIAL_ECHOLNPGM("cntr[0]:");
+				MYSERIAL.print(cntr[0]);
+				SERIAL_ECHOLNPGM("");
+				SERIAL_ECHOLNPGM("wx:");
+				MYSERIAL.print(wx);
+			}
             w = point_weight_y(i, y);
-            cntr[1] += w * (pgm_read_float(true_pts + i * 2 + 1) - y);
-            wy += w;
-        }
+			cntr[1] += w * (pgm_read_float(true_pts + i * 2 + 1) - y);
+			wy += w;
+
+			if (verbosity_level >= 20) {
+				SERIAL_ECHOLNPGM("");
+				SERIAL_ECHOLNPGM("Weight_y:");
+				MYSERIAL.print(w);
+				SERIAL_ECHOLNPGM("");
+				SERIAL_ECHOLNPGM("cntr[1]:");
+				MYSERIAL.print(cntr[1]);
+				SERIAL_ECHOLNPGM("");
+				SERIAL_ECHOLNPGM("wy:");
+				MYSERIAL.print(wy);
+				SERIAL_ECHOLNPGM("");
+				SERIAL_ECHOLNPGM("");
+			}
+		}
         cntr[0] /= wx;
         cntr[1] /= wy;
+		if (verbosity_level >= 20) {
+			SERIAL_ECHOLNPGM("");
+			SERIAL_ECHOLNPGM("Final cntr values:");
+			SERIAL_ECHOLNPGM("cntr[0]:");
+			MYSERIAL.print(cntr[0]);
+			SERIAL_ECHOLNPGM("");
+			SERIAL_ECHOLNPGM("cntr[1]:");
+			MYSERIAL.print(cntr[1]);
+			SERIAL_ECHOLNPGM("");
+		}
+
     }
     #endif
 
@@ -605,18 +642,24 @@ void world2machine_initialize()
         // Length of the vec_x shall be close to unity.
         float l = sqrt(vec_x[0] * vec_x[0] + vec_x[1] * vec_x[1]);
         if (l < 0.9 || l > 1.1) {
+			SERIAL_ECHOLNPGM("X vector length:");
+			MYSERIAL.println(l);
             SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the X vector out of range.");
             reset = true;
         }
         // Length of the vec_y shall be close to unity.
         l = sqrt(vec_y[0] * vec_y[0] + vec_y[1] * vec_y[1]);
         if (l < 0.9 || l > 1.1) {
-            SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the X vector out of range.");
+			SERIAL_ECHOLNPGM("Y vector length:");
+			MYSERIAL.println(l);
+            SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the Y vector out of range.");
             reset = true;
         }
         // Correction of the zero point shall be reasonably small.
         l = sqrt(cntr[0] * cntr[0] + cntr[1] * cntr[1]);
         if (l > 15.f) {
+			SERIAL_ECHOLNPGM("Zero point correction:");
+			MYSERIAL.println(l);
             SERIAL_ECHOLNPGM("Invalid bed correction matrix. Shift out of range.");
             reset = true;
         }
@@ -1654,7 +1697,27 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level
         eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +0), vec_y[0]);
         eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +4), vec_y[1]);
     #endif
-
+		if (verbosity_level >= 10) {
+			// Length of the vec_x
+			float l = sqrt(vec_x[0] * vec_x[0] + vec_x[1] * vec_x[1]);
+			SERIAL_ECHOLNPGM("X vector length:");
+			MYSERIAL.println(l);
+
+			// Length of the vec_y
+			l = sqrt(vec_y[0] * vec_y[0] + vec_y[1] * vec_y[1]);
+			SERIAL_ECHOLNPGM("Y vector length:");
+			MYSERIAL.println(l);
+			// Zero point correction
+			l = sqrt(cntr[0] * cntr[0] + cntr[1] * cntr[1]);
+			SERIAL_ECHOLNPGM("Zero point correction:");
+			MYSERIAL.println(l);
+
+			// vec_x and vec_y shall be nearly perpendicular.
+			l = vec_x[0] * vec_y[0] + vec_x[1] * vec_y[1];
+			SERIAL_ECHOLNPGM("Perpendicularity");
+			MYSERIAL.println(fabs(l));
+			SERIAL_ECHOLNPGM("Saving bed calibration vectors to EEPROM");
+		}
         // Correct the current_position to match the transformed coordinate system after world2machine_rotation_and_skew and world2machine_shift were set.
         world2machine_update_current();
 

+ 257 - 0
Firmware/ultralcd.cpp

@@ -1874,6 +1874,7 @@ void lcd_diag_show_end_stops()
 
 
 void prusa_statistics(int _message) {
+	
 
 	switch (_message)
 	{
@@ -1883,6 +1884,7 @@ void prusa_statistics(int _message) {
 		{
 			SERIAL_ECHO("{");
 			prusa_stat_printerstatus(4);
+			status_number = 4;
 			prusa_stat_printinfo();
 			SERIAL_ECHOLN("}");
 		}
@@ -1890,6 +1892,7 @@ void prusa_statistics(int _message) {
 		{
 			SERIAL_ECHO("{");
 			prusa_stat_printerstatus(1);
+			status_number = 1;
 			SERIAL_ECHOLN("}");
 		}
 		break;
@@ -1898,6 +1901,7 @@ void prusa_statistics(int _message) {
 		farm_status = 2;
 		SERIAL_ECHO("{");
 		prusa_stat_printerstatus(2);
+		status_number = 2;
 		SERIAL_ECHOLN("}");
 		farm_timer = 1;
 		break;
@@ -1906,6 +1910,7 @@ void prusa_statistics(int _message) {
 		farm_status = 3;
 		SERIAL_ECHO("{");
 		prusa_stat_printerstatus(3);
+		status_number = 3;
 		SERIAL_ECHOLN("}");
 		farm_timer = 1;
 
@@ -1914,12 +1919,14 @@ void prusa_statistics(int _message) {
 			farm_status = 4;
 			SERIAL_ECHO("{");
 			prusa_stat_printerstatus(4);
+			status_number = 4;
 			SERIAL_ECHOLN("}");
 		}
 		else
 		{
 			SERIAL_ECHO("{");
 			prusa_stat_printerstatus(3);
+			status_number = 3;
 			SERIAL_ECHOLN("}");;
 		}
 		farm_timer = 1;
@@ -1938,14 +1945,17 @@ void prusa_statistics(int _message) {
 		break;
 	case 6:		// print done
 		SERIAL_ECHOLN("{[PRN:8]}");
+		status_number = 8;
 		farm_timer = 2;
 		break;
 	case 7:		// print done - stopped
 		SERIAL_ECHOLN("{[PRN:9]}");
+		status_number = 9;
 		farm_timer = 2;
 		break;
 	case 8:		// printer started
 		SERIAL_ECHO("{[PRN:0][PFN:");
+		status_number = 0;
 		SERIAL_ECHO(farm_no);
 		SERIAL_ECHOLN("]}");
 		farm_timer = 2;
@@ -1963,6 +1973,7 @@ void prusa_statistics(int _message) {
 		break;
     case 22: // waiting for filament change
         SERIAL_ECHOLN("{[PRN:5]}");
+		status_number = 5;
         break;
 	
 	case 90: // Error - Thermal Runaway
@@ -3166,6 +3177,7 @@ static void lcd_main_menu()
 	MENU_ITEM(submenu, MSG_UNLOAD_FILAMENT, fil_unload_menu);
 	MENU_ITEM(submenu, MSG_CHANGE_EXTR, change_extr_menu);
 	#endif
+	//MENU_ITEM(function, PSTR("belt test"), belt_test);
     MENU_ITEM(submenu, MSG_SETTINGS, lcd_settings_menu);
     if(!isPrintPaused) MENU_ITEM(submenu, MSG_MENU_CALIBRATION, lcd_calibration_menu);
   }
@@ -3551,6 +3563,251 @@ menu_edit_type(float, float52, ftostr52, 100)
 menu_edit_type(unsigned long, long5, ftostr5, 0.01)
 
 
+static void belt_test() {
+	
+	
+	/*lcd_update_enable(false);
+	float coordinate[2] = { 253, 215.5 };
+	float max = 10;
+	float step = 0.5; //mm
+	float change_belt = 2.5; //mm
+	float excellent = 1;
+
+	 //set motor current higherdigipot_current(0, 850); //set motor current higher
+		//current_position[Z_AXIS] += 15;
+		//plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+
+		for (int j = 0; j < 2; j++) {
+			lcd_implementation_clear();
+			j == 0 ? lcd_printPGM(PSTR("Testing X belt")) : lcd_printPGM(PSTR("Testing Y belt"));
+			for (int i = 0; i < max*(1 / step); i++) {
+
+				if (i == 0) {
+					current_position[j] += coordinate[j] + max;
+					j == 0 ? digipot_current(0, 130):digipot_current(0, 60);
+				}
+				else {
+					current_position[j] += ((float)i - 1.f)*step;
+				}
+				plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+				st_synchronize();
+				digipot_current(0, 500);
+				if (i == 0) current_position[j] -= coordinate[j];
+				else current_position[j] -= (float)i * step;
+				plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+
+
+				st_synchronize();
+				if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) || (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1)) {
+					//lcd_display_message_fullscreen_P(PSTR("Endstop hit"));
+					lcd.setCursor(0, 0);
+					if (i < (excellent / step)) lcd_printPGM(PSTR("Excelent condition  ")); //1 mm
+					else if (i < (change_belt / step)) lcd_printPGM(PSTR("Belt ok         ")); //2.5 mm
+					else lcd_printPGM(PSTR("Change the belt ")); //>2.5mm
+
+					delay_keep_alive(5000);
+					
+					
+					
+					i = max*(1 / step);
+				}
+				else {
+					lcd.setCursor((change_belt / step), 1); lcd_printPGM(PSTR("|"));
+					lcd.setCursor((change_belt / step), 2); lcd_printPGM(PSTR("|"));
+					lcd.setCursor((change_belt / step), 3); lcd_printPGM(PSTR("|"));
+
+					lcd.setCursor(i, 2);
+					if (i == (change_belt / step)) lcd_printPGM(PSTR("+"));
+					else lcd_printPGM(PSTR("-"));
+
+				}
+
+
+			}
+		}
+		enquecommand_P(PSTR("G28 W"));
+		lcd_update_enable(true);
+		digipot_current(0, 800);
+		lcd_update(2);
+		return;*/
+
+	/*
+	13.f  - BED_ZERO_REF_X,   6.4f - BED_ZERO_REF_Y,
+    115.f - BED_ZERO_REF_X,   6.4f - BED_ZERO_REF_Y,
+    216.f - BED_ZERO_REF_X,   6.4f - BED_ZERO_REF_Y,
+
+    216.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
+    115.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
+    13.f  - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
+
+    13.f  - BED_ZERO_REF_X, 202.4f - BED_ZERO_REF_Y,
+    115.f - BED_ZERO_REF_X, 202.4f - BED_ZERO_REF_Y,
+    216.f - BED_ZERO_REF_X, 202.4f - BED_ZERO_REF_Y
+
+
+	#define BED_ZERO_REF_X (- 22.f + X_PROBE_OFFSET_FROM_EXTRUDER)
+	#define BED_ZERO_REF_Y (- 0.6f + Y_PROBE_OFFSET_FROM_EXTRUDER)
+
+	#define X_PROBE_OFFSET_FROM_EXTRUDER 23     // Z probe to nozzle X offset: -left  +right
+	#define Y_PROBE_OFFSET_FROM_EXTRUDER 9     // Z probe to nozzle Y offset: -front +behind
+	#define Z_PROBE_OFFSET_FROM_EXTRUDER -0.4
+
+	*/
+
+/*
+
+	lcd_update_enable(false);
+	float coordinate[2] = { 210, 190 };
+	float max = 10;
+	float step = 0.5; //mm
+	float change_belt = 2.5; //mm
+	float excellent = 1;
+	float safety_a = 20;
+
+	 //set motor current higherdigipot_current(0, 850); //set motor current higher
+		current_position[Z_AXIS] -= 0.4;
+		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+		st_synchronize();
+		for (int j = 0; j < 2; j++) {
+			lcd_implementation_clear();
+			j == 0 ? lcd_printPGM(PSTR("Testing X belt")) : lcd_printPGM(PSTR("Testing Y belt"));
+			for (int i = 0; i < max*(1 / step); i++) {
+
+				if (i == 0) {
+					current_position[j] += coordinate[j] - safety_a;
+					//j == 0 ? digipot_current(0, 130):digipot_current(0, 60);
+				}
+				else {
+					current_position[j] += ((float)i - 1.f)*step;
+				}
+				plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+				st_synchronize();
+				if (i == 0) {
+					for (int k = 0; k < (safety_a + max)*(1 / step); k++) {
+						current_position[j] += step ;
+						plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+						st_synchronize();
+						if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1)) {
+							k = 2000;
+						}
+					}
+				}
+				//digipot_current(0, 500);
+				if (i == 0) current_position[j] -= coordinate[j];
+				else current_position[j] -= (float)i * step;
+				plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+
+
+				st_synchronize();
+				if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) || (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1)) {
+					//lcd_display_message_fullscreen_P(PSTR("Endstop hit"));
+					lcd.setCursor(0, 0);
+					//if (i < (excellent / step)) lcd_printPGM(PSTR("Change it        ")); //1 mm
+					if (i < (change_belt / step)) lcd_printPGM(PSTR("Change the belt  ")); //2.5 mm
+					else lcd_printPGM(PSTR("Belt ok       ")); //>2.5mm
+
+					delay_keep_alive(5000);
+					current_position[j] += 14;
+					plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+					st_synchronize();
+					
+					i = max*(1 / step);
+				}
+				else {
+					lcd.setCursor((change_belt / step), 1); lcd_printPGM(PSTR("|"));
+					lcd.setCursor((change_belt / step), 2); lcd_printPGM(PSTR("|"));
+					lcd.setCursor((change_belt / step), 3); lcd_printPGM(PSTR("|"));
+
+					lcd.setCursor(i, 2);
+					if (i == (change_belt / step)) lcd_printPGM(PSTR("+"));
+					else lcd_printPGM(PSTR("-"));
+
+				}
+
+
+			}
+		}
+		enquecommand_P(PSTR("G28 W"));
+		lcd_update_enable(true);
+		//digipot_current(0, 800);
+		lcd_update(2);
+		return;*/
+
+/*
+
+lcd_update_enable(false);
+float coordinate[2] = { 210, 190 };
+float max = 10;
+float step = 0.5; //mm
+float change_belt = 2.5; //mm
+float excellent = 1;
+float safety_a = 20;
+
+//set motor current higherdigipot_current(0, 850); //set motor current higher
+current_position[Z_AXIS] -= 0.4;
+plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+st_synchronize();
+for (int j = 0; j < 2; j++) {
+	lcd_implementation_clear();
+	j == 0 ? lcd_printPGM(PSTR("Testing X belt")) : lcd_printPGM(PSTR("Testing Y belt"));
+	current_position[j] += coordinate[j] - safety_a;
+	plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+	st_synchronize();
+		for (int k = 0; k < (safety_a + max)*(1 / step); k++) {
+				current_position[j] += step;
+				plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+				st_synchronize();
+				if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1)) {
+					k = 2000;
+				}
+			}
+		}
+		current_position[j] -= coordinate[j];
+		
+
+		else current_position[j] -= (float)i * step;
+		plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+
+
+		st_synchronize();
+		if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) || (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1)) {
+			//lcd_display_message_fullscreen_P(PSTR("Endstop hit"));
+			lcd.setCursor(0, 0);
+			//if (i < (excellent / step)) lcd_printPGM(PSTR("Change it        ")); //1 mm
+			if (i < (change_belt / step)) lcd_printPGM(PSTR("Change the belt  ")); //2.5 mm
+			else lcd_printPGM(PSTR("Belt ok       ")); //>2.5mm
+
+			delay_keep_alive(5000);
+			current_position[j] += 14;
+			plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], 50, active_extruder);
+			st_synchronize();
+
+			i = max*(1 / step);
+		}
+		else {
+			lcd.setCursor((change_belt / step), 1); lcd_printPGM(PSTR("|"));
+			lcd.setCursor((change_belt / step), 2); lcd_printPGM(PSTR("|"));
+			lcd.setCursor((change_belt / step), 3); lcd_printPGM(PSTR("|"));
+
+			lcd.setCursor(i, 2);
+			if (i == (change_belt / step)) lcd_printPGM(PSTR("+"));
+			else lcd_printPGM(PSTR("-"));
+
+		}
+
+
+	}
+}
+enquecommand_P(PSTR("G28 W"));
+lcd_update_enable(true);
+//digipot_current(0, 800);
+lcd_update(2);
+return;
+
+*/
+
+}
+
 static void lcd_selftest()
 {
 	int _progress = 0;

+ 2 - 0
Firmware/ultralcd.h

@@ -31,6 +31,8 @@
 void lcd_mylang();
   bool lcd_detected(void);
 
+  static void belt_test();
+  
   static void lcd_selftest();
   static bool lcd_selfcheck_endstops();
   static bool lcd_selfcheck_axis(int _axis, int _travel);