Browse Source

initial version of long pause

PavelSindler 8 years ago
parent
commit
64f4181451
4 changed files with 557 additions and 60 deletions
  1. 5 1
      Firmware/Marlin.h
  2. 520 53
      Firmware/Marlin_main.cpp
  3. 30 6
      Firmware/ultralcd.cpp
  4. 2 0
      Firmware/ultralcd.h

+ 5 - 1
Firmware/Marlin.h

@@ -322,10 +322,14 @@ extern void delay_keep_alive(int ms);
 
 extern void check_babystep();
 
+extern void long_pause();
+
 #ifdef DIS
 
 void d_setup();
 float d_ReadData();
 void bed_analysis(float x_dimension, float y_dimension, int x_points_num, int y_points_num, float shift_x, float shift_y);
 
-#endif
+#endif
+
+void wait_for_heater(long codenum);

+ 520 - 53
Firmware/Marlin_main.cpp

@@ -263,6 +263,9 @@ unsigned int  usb_printing_counter;
 
 int lcd_change_fil_state = 0;
 int feedmultiplyBckp = 100;
+float HotendTempBckp = 0;
+int fanSpeedBckp = 0;
+
 unsigned char lang_selected = 0;
 int8_t FarmMode = 0;
 
@@ -3929,55 +3932,8 @@ Sigma_Exit:
 
       cancel_heatup = false;
 
-      #ifdef TEMP_RESIDENCY_TIME
-        long residencyStart;
-        residencyStart = -1;
-        /* continue to loop until we have reached the target temp
-          _and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
-        while((!cancel_heatup)&&((residencyStart == -1) ||
-              (residencyStart >= 0 && (((unsigned int) (millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL)))) ) {
-      #else
-        while ( target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder)&&(CooldownNoWait==false)) ) {
-      #endif //TEMP_RESIDENCY_TIME
-          if( (millis() - codenum) > 1000UL )
-          { //Print Temp Reading and remaining time every 1 second while heating up/cooling down
-			  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
-            codenum = millis();
-          }
-          manage_heater();
-          manage_inactivity();
-          lcd_update();
-        #ifdef TEMP_RESIDENCY_TIME
-            /* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
-              or when current temp falls outside the hysteresis after target temp was reached */
-          if ((residencyStart == -1 &&  target_direction && (degHotend(tmp_extruder) >= (degTargetHotend(tmp_extruder)-TEMP_WINDOW))) ||
-              (residencyStart == -1 && !target_direction && (degHotend(tmp_extruder) <= (degTargetHotend(tmp_extruder)+TEMP_WINDOW))) ||
-              (residencyStart > -1 && labs(degHotend(tmp_extruder) - degTargetHotend(tmp_extruder)) > TEMP_HYSTERESIS) )
-			  {
-				residencyStart = millis();
-			  }
-        #endif //TEMP_RESIDENCY_TIME
-        }
+	  wait_for_heater(codenum); //loops until target temperature is reached
+
         LCD_MESSAGERPGM(MSG_HEATING_COMPLETE);
 		heating_status = 2;
 		if (farm_mode) { prusa_statistics(2); };
@@ -4853,11 +4809,184 @@ case 404:  //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp
       break;
     }
     #endif // CUSTOM_M_CODE_SET_Z_PROBE_OFFSET
+/*	case 602: //resume long pause print
+	{
+		//set hotend temp back
+		setTargetHotend(HotendTempBckp, active_extruder);
+		//set fan speed back
+		fanSpeed = fanSpeedBckp;
+
+		//go back to print
+		
+		//Move XY back
+		plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], target[Z_AXIS], target[E_AXIS], 50, active_extruder);
+
+		//wait for hotend to reach target temp -> see M109
+		//while (abs(degHotend(active_extruder) - target_temperature(active_extruder)) > 3) delay_keep_alive;
+		wait_for_heater(millis());
+
+		//Move Z back
+		plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], 15, active_extruder);
+		
+		//Unretract
+		target[E_AXIS] = target[E_AXIS] - PAUSE_RETRACT;
+		plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], FILAMENTCHANGE_RFEED, active_extruder);
+
+		//Set E position to original  (should be original in this case)
+		plan_set_e_position(lastpos[E_AXIS]);
+
+		//Recover feed rate 
+		feedmultiply = feedmultiplyBckp;
+		char cmd[9];
+		sprintf_P(cmd, PSTR("M220 S%i"), feedmultiplyBckp);
+		enquecommand(cmd);
+		
+		card.startFileprint();
+
+	}break;*/
+
+	case 601: //long pause print
+	{
+		//M601 E-2 X50 Y190 Z20
+	//	if (IS_SD_PRINTING) {
+			// We don't know where we are! HOME!
+			// Push the commands to the front of the message queue in the reverse order!
+			// There shall be always enough space reserved for these commands.
+		//	repeatcommand_front(); // repeat G80 with all its parameters
+		//	enquecommand_front_P((PSTR("G25")));
+		//	break;
+		//}
+
+
+		float target[4];
+		float lastpos[4];
+		//statistics - need to save print time???
+		//keep motor currents and bed temperature and pause print
+		//stop_buffering = true;
+		//while (blocks_queued()) delay_keep_alive(50);
+		//tuurn off print ventilator
+		card.pauseSDPrint();
+		while (blocks_queued()) delay_keep_alive(50); //wait for empty buffer
+		st_synchronize();
+
+		feedmultiplyBckp = feedmultiply;
+		HotendTempBckp = degTargetHotend(active_extruder); 
+		fanSpeedBckp = fanSpeed;
+
+		target[X_AXIS] = current_position[X_AXIS];
+		target[Y_AXIS] = current_position[Y_AXIS];
+		target[Z_AXIS] = current_position[Z_AXIS];
+		target[E_AXIS] = current_position[E_AXIS];
+		lastpos[X_AXIS] = current_position[X_AXIS];
+		lastpos[Y_AXIS] = current_position[Y_AXIS];
+		lastpos[Z_AXIS] = current_position[Z_AXIS];
+		lastpos[E_AXIS] = current_position[E_AXIS];
+
+		if (code_seen('E'))
+		{
+			target[E_AXIS] += code_value();
+		}
+		else
+		{
+			#ifdef PAUSE_RETRACT
+			target[E_AXIS] += PAUSE_RETRACT;
+			#endif
+		}
+		plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 400, active_extruder);
+		
+		//Lift Z
+		if (code_seen('Z'))
+		{
+			target[Z_AXIS] += code_value();
+		}
+		else
+		{
+			#ifdef Z_PAUSE_LIFT
+			target[Z_AXIS] += Z_PAUSE_LIFT;
+			if (target[Z_AXIS] > Z_MAX_POS) target[Z_AXIS] = Z_MAX_POS;
+			#endif
+		}
+		plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 15, active_extruder);
+		
+		//set nozzle target temperature to 0
+		setTargetHotend(0, 0);
+		setTargetHotend(0, 1);
+		setTargetHotend(0, 2);
+
+		//Move XY to side
+		if (code_seen('X'))
+		{
+			target[X_AXIS] += code_value();
+		}
+		else
+		{
+		#ifdef X_PAUSE_POS
+			target[X_AXIS] = X_PAUSE_POS;
+		#endif
+		}
+		if (code_seen('Y'))
+		{
+			target[Y_AXIS] = code_value();
+		}
+		else
+		{
+		#ifdef Y_PAUSE_POS
+			target[Y_AXIS] = Y_PAUSE_POS;
+		#endif
+		}
+		plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 50, active_extruder);
+
+		// Turn off the print fan
+		//SET_OUTPUT(FAN_PIN);
+		//WRITE(FAN_PIN, 0);
+		fanSpeed = 0;
+
+		st_synchronize();
+		
+		/*while (!lcd_clicked()) {
+			delay_keep_alive(100);
+		}
+
+		//set hotend temp back
+		setTargetHotend(HotendTempBckp, active_extruder);
+
+		//go back to print
+
+		//Move XY back
+		plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], target[Z_AXIS], target[E_AXIS], FILAMENTCHANGE_XYFEED, active_extruder);
+
+		//wait for hotend to reach target temp -> see M109
+		//while (abs(degHotend(active_extruder) - target_temperature(active_extruder)) > 3) delay_keep_alive;
+		wait_for_heater(millis());
+
+		//Move Z back
+		plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], FILAMENTCHANGE_ZFEED, active_extruder);
+
+		target[E_AXIS] = target[E_AXIS] - FILAMENTCHANGE_FIRSTRETRACT;
+
+		//Unretract       
+		plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], FILAMENTCHANGE_RFEED, active_extruder);
+
+		//Set E position to original  (shoulb be original in this case)
+		plan_set_e_position(lastpos[E_AXIS]);
+
+		//Recover feed rate 
+		feedmultiply = feedmultiplyBckp;
+		char cmd[9];
+		sprintf_P(cmd, PSTR("M220 S%i"), feedmultiplyBckp);
+		enquecommand(cmd);
+
+		//card.startFileprint();*/
+
+	}
+	break;
 
     #ifdef FILAMENTCHANGEENABLE
     case 600: //Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal]
     {
 		st_synchronize();
+		float target[4];
+		float lastpos[4];
 
         if (farm_mode)
             
@@ -4869,8 +4998,7 @@ case 404:  //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp
         
         feedmultiplyBckp=feedmultiply;
         int8_t TooLowZ = 0;
-        float target[4];
-        float lastpos[4];
+
         target[X_AXIS]=current_position[X_AXIS];
         target[Y_AXIS]=current_position[Y_AXIS];
         target[Z_AXIS]=current_position[Z_AXIS];
@@ -5078,7 +5206,7 @@ case 404:  //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp
     }
     break;
     #endif //FILAMENTCHANGEENABLE
-
+	
     case 907: // M907 Set digital trimpot motor current using axis codes.
     {
       #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
@@ -5844,6 +5972,59 @@ void delay_keep_alive(int ms)
     }
 }
 
+void wait_for_heater(long codenum) {
+
+#ifdef TEMP_RESIDENCY_TIME
+	long residencyStart;
+	residencyStart = -1;
+	/* continue to loop until we have reached the target temp
+	_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
+	while ((!cancel_heatup) && ((residencyStart == -1) ||
+		(residencyStart >= 0 && (((unsigned int)(millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))))) {
+#else
+	while (target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder) && (CooldownNoWait == false))) {
+#endif //TEMP_RESIDENCY_TIME
+		if ((millis() - codenum) > 1000UL)
+		{ //Print Temp Reading and remaining time every 1 second while heating up/cooling down
+			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
+				codenum = millis();
+		}
+			manage_heater();
+			manage_inactivity();
+			lcd_update();
+#ifdef TEMP_RESIDENCY_TIME
+			/* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
+			or when current temp falls outside the hysteresis after target temp was reached */
+			if ((residencyStart == -1 && target_direction && (degHotend(tmp_extruder) >= (degTargetHotend(tmp_extruder) - TEMP_WINDOW))) ||
+				(residencyStart == -1 && !target_direction && (degHotend(tmp_extruder) <= (degTargetHotend(tmp_extruder) + TEMP_WINDOW))) ||
+				(residencyStart > -1 && labs(degHotend(tmp_extruder) - degTargetHotend(tmp_extruder)) > TEMP_HYSTERESIS))
+			{
+				residencyStart = millis();
+			}
+#endif //TEMP_RESIDENCY_TIME
+	}
+}
+
 void check_babystep() {
 	int babystep_z;
 	EEPROM_read_B(EEPROM_BABYSTEP_Z, &babystep_z);
@@ -6092,4 +6273,290 @@ void bed_analysis(float x_dimension, float y_dimension, int x_points_num, int y_
 
 }
 
-#endif
+#endif
+
+
+void long_pause() //long pause print
+{
+	//M601 E-2 X50 Y190 Z20
+	//	if (IS_SD_PRINTING) {
+	// We don't know where we are! HOME!
+	// Push the commands to the front of the message queue in the reverse order!
+	// There shall be always enough space reserved for these commands.
+	//	repeatcommand_front(); // repeat G80 with all its parameters
+	//	enquecommand_front_P((PSTR("G25")));
+	//	break;
+	//}
+
+
+	float target[4];
+	float lastpos[4];
+	//statistics - need to save print time???
+	//keep motor currents and bed temperature and pause print
+	//stop_buffering = true;
+	//while (blocks_queued()) delay_keep_alive(50);
+	//tuurn off print ventilator
+	
+	st_synchronize();
+
+	feedmultiplyBckp = feedmultiply;
+	HotendTempBckp = degTargetHotend(active_extruder);
+	fanSpeedBckp = fanSpeed;
+
+	target[X_AXIS] = current_position[X_AXIS];
+	target[Y_AXIS] = current_position[Y_AXIS];
+	target[Z_AXIS] = current_position[Z_AXIS];
+	target[E_AXIS] = current_position[E_AXIS];
+	lastpos[X_AXIS] = current_position[X_AXIS];
+	lastpos[Y_AXIS] = current_position[Y_AXIS];
+	lastpos[Z_AXIS] = current_position[Z_AXIS];
+	lastpos[E_AXIS] = current_position[E_AXIS];
+
+	if (code_seen('E'))
+	{
+		target[E_AXIS] += code_value();
+	}
+	else
+	{
+#ifdef PAUSE_RETRACT
+		target[E_AXIS] += PAUSE_RETRACT;
+#endif
+	}
+	plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 400, active_extruder);
+
+	//Lift Z
+	if (code_seen('Z'))
+	{
+		target[Z_AXIS] += code_value();
+	}
+	else
+	{
+#ifdef Z_PAUSE_LIFT
+		target[Z_AXIS] += Z_PAUSE_LIFT;
+		if (target[Z_AXIS] > Z_MAX_POS) target[Z_AXIS] = Z_MAX_POS;
+#endif
+	}
+	plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 15, active_extruder);
+
+	//set nozzle target temperature to 0
+	setTargetHotend(0, 0);
+	setTargetHotend(0, 1);
+	setTargetHotend(0, 2);
+
+	//Move XY to side
+	if (code_seen('X'))
+	{
+		target[X_AXIS] += code_value();
+	}
+	else
+	{
+#ifdef X_PAUSE_POS
+		target[X_AXIS] = X_PAUSE_POS;
+#endif
+	}
+	if (code_seen('Y'))
+	{
+		target[Y_AXIS] = code_value();
+	}
+	else
+	{
+#ifdef Y_PAUSE_POS
+		target[Y_AXIS] = Y_PAUSE_POS;
+#endif
+	}
+	plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 50, active_extruder);
+
+	// Turn off the print fan
+	//SET_OUTPUT(FAN_PIN);
+	//WRITE(FAN_PIN, 0);
+	fanSpeed = 0;
+
+	st_synchronize();
+
+	/*while (!lcd_clicked()) {
+	delay_keep_alive(100);
+	}
+
+	//set hotend temp back
+	setTargetHotend(HotendTempBckp, active_extruder);
+
+	//go back to print
+
+	//Move XY back
+	plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], target[Z_AXIS], target[E_AXIS], FILAMENTCHANGE_XYFEED, active_extruder);
+
+	//wait for hotend to reach target temp -> see M109
+	//while (abs(degHotend(active_extruder) - target_temperature(active_extruder)) > 3) delay_keep_alive;
+	wait_for_heater(millis());
+
+	//Move Z back
+	plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], FILAMENTCHANGE_ZFEED, active_extruder);
+
+	target[E_AXIS] = target[E_AXIS] - FILAMENTCHANGE_FIRSTRETRACT;
+
+	//Unretract
+	plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], FILAMENTCHANGE_RFEED, active_extruder);
+
+	//Set E position to original  (shoulb be original in this case)
+	plan_set_e_position(lastpos[E_AXIS]);
+
+	//Recover feed rate
+	feedmultiply = feedmultiplyBckp;
+	char cmd[9];
+	sprintf_P(cmd, PSTR("M220 S%i"), feedmultiplyBckp);
+	enquecommand(cmd);
+
+	//card.startFileprint();*/
+
+}
+
+
+
+/*void bootloader_display() {
+	char i;
+	unsigned char lcd_rows = 4;
+	unsigned char lcd_cols = 20;
+	unsigned char display_func = 0;
+	unsigned char current_row = 0;
+	unsigned char rs_pin = 82;
+	unsigned char enable_pin = 18;
+	unsigned char d4 = 19;
+	unsigned char d5 = 70;
+	unsigned char d6 = 85;
+	unsigned char d7 = 71;
+
+	//initialize display
+
+	for (i = 0; i < 100; i++) delay(500); //we need at least 40ms delay after power up
+	display_func |= 0x08; //2 lines
+						  // Now we pull both RS and R/W low to begin commands
+
+
+		// Now we pull both RS and R/W low to begin commands
+		
+		digitalWrite(rs_pin, LOW);
+		digitalWrite(_enable_pin, LOW);
+		if (_rw_pin != 255) {
+			digitalWrite(_rw_pin, LOW);
+		}
+
+		//put the LCD into 4 bit or 8 bit mode
+		if (!(_displayfunction & LCD_8BITMODE)) {
+			// this is according to the hitachi HD44780 datasheet
+			// figure 24, pg 46
+
+			// we start in 8bit mode, try to set 4 bit mode
+			write4bits(0x03);
+			delayMicroseconds(4500); // wait min 4.1ms
+
+									 // second try
+			write4bits(0x03);
+			delayMicroseconds(4500); // wait min 4.1ms
+
+									 // third go!
+			write4bits(0x03);
+			delayMicroseconds(150);
+
+			// finally, set to 4-bit interface
+			write4bits(0x02);
+		}
+		else {
+			// this is according to the hitachi HD44780 datasheet
+			// page 45 figure 23
+
+			// Send function set command sequence
+			command(LCD_FUNCTIONSET | _displayfunction);
+			delayMicroseconds(4500);  // wait more than 4.1ms
+
+									  // second try
+			command(LCD_FUNCTIONSET | _displayfunction);
+			delayMicroseconds(150);
+
+			// third go
+			command(LCD_FUNCTIONSET | _displayfunction);
+		}
+
+		// finally, set # lines, font size, etc.
+		command(LCD_FUNCTIONSET | _displayfunction);
+		delayMicroseconds(60);
+		// turn the display on with no cursor or blinking default
+		_displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
+		display();
+		delayMicroseconds(60);
+		// clear it off
+		clear();
+		delayMicroseconds(3000);
+		// Initialize to default text direction (for romance languages)
+		_displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
+		// set the entry mode
+		command(LCD_ENTRYMODESET | _displaymode);
+		delayMicroseconds(60);
+
+	}
+
+
+
+
+	void lcd_init()
+	{
+		lcd_implementation_init();
+
+#ifdef NEWPANEL
+		SET_INPUT(BTN_EN1);
+		SET_INPUT(BTN_EN2);
+		WRITE(BTN_EN1, HIGH);
+		WRITE(BTN_EN2, HIGH);
+#if BTN_ENC > 0
+		SET_INPUT(BTN_ENC);
+		WRITE(BTN_ENC, HIGH);
+#endif
+#ifdef REPRAPWORLD_KEYPAD
+		pinMode(SHIFT_CLK, OUTPUT);
+		pinMode(SHIFT_LD, OUTPUT);
+		pinMode(SHIFT_OUT, INPUT);
+		WRITE(SHIFT_OUT, HIGH);
+		WRITE(SHIFT_LD, HIGH);
+#endif
+#else  // Not NEWPANEL
+#ifdef SR_LCD_2W_NL // Non latching 2 wire shift register
+		pinMode(SR_DATA_PIN, OUTPUT);
+		pinMode(SR_CLK_PIN, OUTPUT);
+#elif defined(SHIFT_CLK)
+		pinMode(SHIFT_CLK, OUTPUT);
+		pinMode(SHIFT_LD, OUTPUT);
+		pinMode(SHIFT_EN, OUTPUT);
+		pinMode(SHIFT_OUT, INPUT);
+		WRITE(SHIFT_OUT, HIGH);
+		WRITE(SHIFT_LD, HIGH);
+		WRITE(SHIFT_EN, LOW);
+#else
+#ifdef ULTIPANEL
+#error ULTIPANEL requires an encoder
+#endif
+#endif // SR_LCD_2W_NL
+#endif//!NEWPANEL
+
+#if defined (SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0)
+		pinMode(SDCARDDETECT, INPUT);
+		WRITE(SDCARDDETECT, HIGH);
+		lcd_oldcardstatus = IS_SD_INSERTED;
+#endif//(SDCARDDETECT > 0)
+#ifdef LCD_HAS_SLOW_BUTTONS
+		slow_buttons = 0;
+#endif
+		lcd_buttons_update();
+#ifdef ULTIPANEL
+		encoderDiff = 0;
+#endif
+	}
+
+
+
+	//clear the display
+
+	//write message
+
+
+
+	LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5, LCD_PINS_D6, LCD_PINS_D7);  //RS,Enable,D4,D5,D6,D7
+}*/

+ 30 - 6
Firmware/ultralcd.cpp

@@ -509,7 +509,27 @@ static void lcd_status_screen()
 #ifdef ULTIPANEL
 
 void lcd_commands()
-{
+{	
+	if (lcd_commands_type == LCD_COMMAND_LONG_PAUSE)
+	{
+		if(lcd_commands_step == 0) { 
+			lcd_commands_step = 2;
+		}
+		if (lcd_commands_step == 2 & !blocks_queued()) {
+			//lcd_return_to_status();
+			lcd_setstatuspgm(PSTR("print paused"));
+			
+			lcd_commands_step = 1;
+		}
+		if (lcd_commands_step == 1 && !blocks_queued()) {
+			long_pause();
+			lcd_commands_type = 0;
+			lcd_commands_step = 0;
+		}
+
+	}
+
+
 	if (lcd_commands_type == LCD_COMMAND_STOP_PRINT)   /// stop print
 	{
 
@@ -711,16 +731,20 @@ static void lcd_return_to_status() {
     lcd_goto_menu(lcd_status_screen, 0, false);
 }
 
+
 static void lcd_sdcard_pause() {
-  card.pauseSDPrint();
-  isPrintPaused = true;
-  lcdDrawUpdate = 3;
+	card.pauseSDPrint();
+	isPrintPaused = true;
+	lcd_return_to_status();
+	lcdDrawUpdate = 3;
+	lcd_commands_type = LCD_COMMAND_LONG_PAUSE;
+
 }
 
 static void lcd_sdcard_resume() {
-	card.startFileprint();
+	/*enquecommand_P(PSTR("M602"));
 	isPrintPaused = false;
-	lcdDrawUpdate = 3;
+	lcdDrawUpdate = 3;*/
 }
 
 float move_menu_scale;

+ 2 - 0
Firmware/ultralcd.h

@@ -91,6 +91,8 @@ void lcd_mylang();
   #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_LONG_PAUSE_RESUME 6
 
   extern unsigned long lcd_timeoutToStatus;
   extern int lcd_commands_type;