Parcourir la source

Merge pull request #1005 from PavelSindler/snmm_v2

M600 fix; manage_response fix
XPila il y a 6 ans
Parent
commit
8de1bd6a6c
3 fichiers modifiés avec 116 ajouts et 109 suppressions
  1. 2 2
      Firmware/Marlin.h
  2. 112 105
      Firmware/Marlin_main.cpp
  3. 2 2
      Firmware/ultralcd.cpp

+ 2 - 2
Firmware/Marlin.h

@@ -467,8 +467,8 @@ void gcode_M701();
 
 void proc_commands();
 
-void manage_response();
-bool mmu_get_response(bool timeout);
+void manage_response(bool move_axes, bool turn_off_nozzle);
+bool mmu_get_response(bool timeout, bool clear);
 void mmu_not_responding();
 void mmu_load_to_nozzle();
 void M600_load_filament();

+ 112 - 105
Firmware/Marlin_main.cpp

@@ -3096,8 +3096,9 @@ void gcode_M600(bool automatic, float x_position, float y_position, float z_shif
 
 		//First backup current position and settings
         feedmultiplyBckp=feedmultiply;
-        float HotendTempBckp = degTargetHotend(active_extruder);
-		int fanSpeedBckp = fanSpeed;
+        HotendTempBckp = degTargetHotend(active_extruder);
+		fanSpeedBckp = fanSpeed;
+
         lastpos[X_AXIS]=current_position[X_AXIS];
         lastpos[Y_AXIS]=current_position[Y_AXIS];
         lastpos[Z_AXIS]=current_position[Z_AXIS];
@@ -6844,7 +6845,7 @@ if (mmu_enabled)
 		  printf_P(PSTR("T code: %d \n"), tmp_extruder);
 		  fprintf_P(uart2io, PSTR("T%d\n"), tmp_extruder);
 
-		  manage_response();
+		  manage_response(true, true);
 
     	  snmm_extruder = tmp_extruder; //filament change is finished
 
@@ -8880,11 +8881,14 @@ static void print_time_remaining_init() {
 	print_percent_done_silent = PRINT_PERCENT_DONE_INIT;
 }
 
-bool mmu_get_response(bool timeout) {
+bool mmu_get_response(bool timeout, bool clear) {
+	//waits for "ok" from mmu
+	//function returns true if "ok" was received
+	//if timeout is set to true function return false if there is no "ok" received before timeout
 	bool response = true;
 	LongTimer mmu_get_reponse_timeout;
-    uart2_rx_clr();
-	
+    if (clear) uart2_rx_clr();
+	KEEPALIVE_STATE(IN_PROCESS);
 	mmu_get_reponse_timeout.start();
 	while (!uart2_rx_ok())
     {
@@ -8898,16 +8902,19 @@ bool mmu_get_response(bool timeout) {
 }
 
 
-void manage_response() {
+void manage_response(bool move_axes, bool turn_off_nozzle) {
+	
 	bool response = false;
 	mmu_print_saved = false;
 	bool lcd_update_was_enabled = false;
-	float hotend_temp_bckp;
-	float z_position_bckp, x_position_bckp, y_position_bckp;
+	float hotend_temp_bckp = degTargetHotend(active_extruder);
+	float z_position_bckp = current_position[Z_AXIS];
+	float x_position_bckp = current_position[X_AXIS];
+	float y_position_bckp = current_position[Y_AXIS];	
 	while(!response) {
-		  response = mmu_get_response(true);
-		  if (!response) {
-			  if (!mmu_print_saved) { //first occurence
+		  response = mmu_get_response(true, !mmu_print_saved); //wait for "ok" from mmu
+		  if (!response) { //no "ok" was received in reserved time frame, user will fix the issue on mmu unit
+			  if (!mmu_print_saved) { //first occurence, we are saving current position, park print head in certain position and disable nozzle heater
 				  if (lcd_update_enabled) {
 					  lcd_update_was_enabled = true;
 					  lcd_update_enable(false);
@@ -8916,61 +8923,59 @@ void manage_response() {
 				  mmu_print_saved = true;
 				  
 				  hotend_temp_bckp = degTargetHotend(active_extruder);
-				  z_position_bckp = current_position[Z_AXIS];
-				  x_position_bckp = current_position[X_AXIS];
-				  y_position_bckp = current_position[Y_AXIS];
-
-				  //lift z
-				  current_position[Z_AXIS] += Z_PAUSE_LIFT;
-				  if (current_position[Z_AXIS] > Z_MAX_POS) current_position[Z_AXIS] = Z_MAX_POS;
-				  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 15, active_extruder);
-				  st_synchronize();
-				  //set nozzle target temperature to 0
-				  setAllTargetHotends(0);
-
-				  //Move XY to side
-				  current_position[X_AXIS] = X_PAUSE_POS;
-				  current_position[Y_AXIS] = Y_PAUSE_POS;
-				  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 50, active_extruder);
-				  st_synchronize();
+				  if (move_axes) {
+					  z_position_bckp = current_position[Z_AXIS];
+					  x_position_bckp = current_position[X_AXIS];
+					  y_position_bckp = current_position[Y_AXIS];
+				  
+					  //lift z
+					  current_position[Z_AXIS] += Z_PAUSE_LIFT;
+					  if (current_position[Z_AXIS] > Z_MAX_POS) current_position[Z_AXIS] = Z_MAX_POS;
+					  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 15, active_extruder);
+					  st_synchronize();
+					  					  
+					  //Move XY to side
+					  current_position[X_AXIS] = X_PAUSE_POS;
+					  current_position[Y_AXIS] = Y_PAUSE_POS;
+					  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 50, active_extruder);
+					  st_synchronize();
+				  }
+				  if (turn_off_nozzle) {
+					  //set nozzle target temperature to 0
+					  setAllTargetHotends(0);
+					  printf_P(PSTR("MMU not responding\n"));
+					  lcd_show_fullscreen_message_and_wait_P(_i("MMU needs user attention. Please press knob to resume nozzle target temperature."));
+					  setTargetHotend(hotend_temp_bckp, active_extruder);
+					  while ((degTargetHotend(active_extruder) - degHotend(active_extruder)) > 5) {
+						  delay_keep_alive(1000);
+						  lcd_wait_for_heater();
+					  }
+				  }
 			  }
-			  printf_P(PSTR("MMU not responding\n"));
-			  lcd_show_fullscreen_message_and_wait_P(_i("MMU needs user attention. Please press knob to resume nozzle target temperature."));
-			  setTargetHotend(hotend_temp_bckp, active_extruder);
-			  while ((degTargetHotend(active_extruder) - degHotend(active_extruder)) > 5) {
-				  delay_keep_alive(1000);
-				  lcd_wait_for_heater();
-			  }			
-			  lcd_display_message_fullscreen_P(_i("Now check MMU. Fix the issue and then press knob on MMU unit."));
+			  lcd_display_message_fullscreen_P(_i("Check MMU. Fix the issue and then press button on MMU unit."));
 		  }
 		  else if (mmu_print_saved) {
 			  printf_P(PSTR("MMU start responding\n"));
 			  lcd_clear();
 			  lcd_display_message_fullscreen_P(_i("MMU OK. Resuming..."));
-			  current_position[X_AXIS] = x_position_bckp;
-			  current_position[Y_AXIS] = y_position_bckp;
-			  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 50, active_extruder);
-			  st_synchronize();
-			  current_position[Z_AXIS] = z_position_bckp;
-			  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 15, active_extruder);
-			  st_synchronize();			  
+			  if (move_axes) {
+				  current_position[X_AXIS] = x_position_bckp;
+				  current_position[Y_AXIS] = y_position_bckp;
+				  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 50, active_extruder);
+				  st_synchronize();
+				  current_position[Z_AXIS] = z_position_bckp;
+				  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 15, active_extruder);
+				  st_synchronize();
+			  }
+			  else {
+				  delay_keep_alive(1000); //delay just for showing MMU OK message for a while in case that there are no xyz movements
+			  }
 		  }
 	}
 	if (lcd_update_was_enabled) lcd_update_enable(true);
 }
 
 void mmu_load_to_nozzle() {
-	/*bool saved_e_relative_mode = axis_relative_modes[E_AXIS];
-	if (!saved_e_relative_mode) {
-		enquecommand_front_P(PSTR("M82")); // set extruder to relative mode
-	}
-		enquecommand_front_P((PSTR("G1 E7.2000 F562")));
-		enquecommand_front_P((PSTR("G1 E14.4000 F871")));
-		enquecommand_front_P((PSTR("G1 E36.0000 F1393")));
-		enquecommand_front_P((PSTR("G1 E14.4000 F871")));			  
-	if (!saved_e_relative_mode) {
-	    enquecommand_front_P(PSTR("M83")); // set extruder to relative mode
-	}*/
 	st_synchronize();
 	
 	bool saved_e_relative_mode = axis_relative_modes[E_AXIS];
@@ -9033,45 +9038,41 @@ void M600_check_state() {
 }
 
 void M600_wait_for_user() {
-		KEEPALIVE_STATE(PAUSED_FOR_USER);
+		//Beep, manage nozzle heater and wait for user to start unload filament
 
-		int counterBeep = 0;	
+		KEEPALIVE_STATE(PAUSED_FOR_USER);
 
+		int counterBeep = 0;
 		unsigned long waiting_start_time = millis();
 		uint8_t wait_for_user_state = 0;
 		lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD));
-		//-//
 		bool bFirst=true;
 
-
-			while (!(wait_for_user_state == 0 && lcd_clicked())){
-
+		while (!(wait_for_user_state == 0 && lcd_clicked())){
 			manage_heater();
 			manage_inactivity(true);
 
-				#if BEEPER > 0
-				if (counterBeep == 500) {
-					counterBeep = 0;
-				}
-				SET_OUTPUT(BEEPER);
-				if (counterBeep == 0) {
-					//-//
-					//if(eSoundMode==e_SOUND_MODE_LOUD)
-					if((eSoundMode==e_SOUND_MODE_LOUD)||((eSoundMode==e_SOUND_MODE_ONCE)&&bFirst))
-					{
-						bFirst=false;
-						WRITE(BEEPER, HIGH);
-					}
-				}
-				if (counterBeep == 20) {
-					WRITE(BEEPER, LOW);
+			#if BEEPER > 0
+			if (counterBeep == 500) {
+				counterBeep = 0;
+			}
+			SET_OUTPUT(BEEPER);
+			if (counterBeep == 0) {
+				if((eSoundMode==e_SOUND_MODE_LOUD)||((eSoundMode==e_SOUND_MODE_ONCE)&&bFirst))
+				{
+					bFirst=false;
+					WRITE(BEEPER, HIGH);
 				}
+			}
+			if (counterBeep == 20) {
+				WRITE(BEEPER, LOW);
+			}
 				
-				counterBeep++;
-#endif
+			counterBeep++;
+			#endif //BEEPER > 0
 			
 			switch (wait_for_user_state) {
-			case 0: 
+			case 0: //nozzle is hot, waiting for user to press the knob to unload filament
 				delay_keep_alive(4);
 
 				if (millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) {
@@ -9086,7 +9087,7 @@ void M600_wait_for_user() {
 					disable_e2();
 				}
 				break;
-			case 1:
+			case 1: //nozzle target temperature is set to zero, waiting for user to start nozzle preheat
 				delay_keep_alive(4);
 		
 				if (lcd_clicked()) {
@@ -9096,7 +9097,7 @@ void M600_wait_for_user() {
 					wait_for_user_state = 2;
 				}
 				break;
-			case 2:
+			case 2: //waiting for nozzle to reach target temperature
 
 				if (abs(degTargetHotend(active_extruder) - degHotend(active_extruder)) < 1) {
 					lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD));
@@ -9119,29 +9120,35 @@ void M600_wait_for_user() {
 void mmu_M600_load_filament(bool automatic)
 { 
 	//load filament for mmu v2
-	bool response = false;
-	bool yes = false;
-	if (!automatic)
-	{
-		yes = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Do you want to switch extruder?"), false);
-		if (yes) tmp_extruder = choose_extruder_menu();
-		else tmp_extruder = snmm_extruder;
-	}
-	else
-	{
-		tmp_extruder = (tmp_extruder+1)%5;
-	}
-	lcd_update_enable(false);
-	lcd_clear();
-	lcd_set_cursor(0, 1); lcd_puts_P(_T(MSG_LOADING_FILAMENT));
-	lcd_print(" ");
-	lcd_print(tmp_extruder + 1);
-	snmm_filaments_used |= (1 << tmp_extruder); //for stop print
-	printf_P(PSTR("T code: %d \n"), tmp_extruder);
-	fprintf_P(uart2io, PSTR("T%d\n"), tmp_extruder);
-	manage_response();
-	snmm_extruder = tmp_extruder; //filament change is finished
-	mmu_load_to_nozzle();
+
+		  bool response = false;
+		  bool yes = false;
+		  if (!automatic) {
+			  yes = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Do you want to switch extruder?"), false);
+			  if(yes) tmp_extruder = choose_extruder_menu();
+			  else tmp_extruder = snmm_extruder;
+
+		  }
+		  else {
+			  tmp_extruder = (tmp_extruder+1)%5;
+		  }
+		  lcd_update_enable(false);
+		  lcd_clear();
+		  lcd_set_cursor(0, 1); lcd_puts_P(_T(MSG_LOADING_FILAMENT));
+		  lcd_print(" ");
+		  lcd_print(tmp_extruder + 1);
+		  snmm_filaments_used |= (1 << tmp_extruder); //for stop print
+		  printf_P(PSTR("T code: %d \n"), tmp_extruder);
+		  fprintf_P(uart2io, PSTR("T%d\n"), tmp_extruder);
+
+		  manage_response(false, true);
+    	  snmm_extruder = tmp_extruder; //filament change is finished
+
+		  mmu_load_to_nozzle();
+
+		  st_synchronize();
+		  current_position[E_AXIS]+= FILAMENTCHANGE_FINALFEED ;
+		  plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 2, active_extruder);
 }
 
 void M600_load_filament_movements()

+ 2 - 2
Firmware/ultralcd.cpp

@@ -3053,8 +3053,8 @@ bool lcd_wait_for_pinda(float temp) {
 }
 
 void lcd_wait_for_heater() {
-	lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING));
-
+		lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING));
+		lcd_set_degree();
 		lcd_set_cursor(0, 4);
 		lcd_print(LCD_STR_THERMOMETER[0]);
 		lcd_print(ftostr3(degHotend(active_extruder)));