Browse Source

Merge pull request #1014 from mkbel/MK3_dev

Mk3 dev
XPila 6 years ago
parent
commit
f873ae9486
4 changed files with 120 additions and 93 deletions
  1. 2 2
      Firmware/Marlin.h
  2. 114 87
      Firmware/Marlin_main.cpp
  3. 2 2
      Firmware/mmu.cpp
  4. 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();

+ 114 - 87
Firmware/Marlin_main.cpp

@@ -3088,7 +3088,9 @@ void gcode_M600(bool automatic, float x_position, float y_position, float z_shif
 
 		//First backup current position and settings
         feedmultiplyBckp=feedmultiply;
-		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];
@@ -3505,7 +3507,7 @@ void process_commands()
 
 	} else if(code_seen("Fir")){
 
-      SERIAL_PROTOCOLLN(FW_VERSION);
+      SERIAL_PROTOCOLLN(FW_VERSION_FULL);
 
     } else if(code_seen("Rev")){
 
@@ -5923,10 +5925,31 @@ Sigma_Exit:
 			}
 		}
 		break;
-    case 204: // M204 acclereration S normal moves T filmanent only moves
+    case 204:
+      // M204 acclereration settings.
+      // Supporting old format: M204 S[normal moves] T[filmanent only moves]
+      // and new format:        M204 P[printing moves] R[filmanent only moves] T[travel moves] (as of now T is ignored)
       {
-        if(code_seen('S')) acceleration = code_value() ;
-        if(code_seen('T')) retract_acceleration = code_value() ;
+        if(code_seen('S')) {
+          // Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware,
+          // and it is also generated by Slic3r to control acceleration per extrusion type
+          // (there is a separate acceleration settings in Slicer for perimeter, first layer etc).
+          acceleration = code_value();
+          // Interpret the T value as retract acceleration in the old Marlin format.
+          if(code_seen('T'))
+            retract_acceleration = code_value();
+        } else {
+          // New acceleration format, compatible with the upstream Marlin.
+          if(code_seen('P'))
+            acceleration = code_value();
+          if(code_seen('R'))
+            retract_acceleration = code_value();
+          if(code_seen('T')) {
+            // Interpret the T value as the travel acceleration in the new Marlin format.
+            //FIXME Prusa3D firmware currently does not support travel acceleration value independent from the extruding acceleration value.
+            // travel_acceleration = code_value();
+          }
+        }
       }
       break;
     case 205: //M205 advanced settings:  minimum travel speed S=while printing T=travel only,  B=minimum segment time X= maximum xy jerk, Z=maximum Z jerk
@@ -6814,7 +6837,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
 
@@ -8850,11 +8873,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())
     {
@@ -8868,16 +8894,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);
@@ -8886,61 +8915,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];
@@ -9003,45 +9030,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) {
@@ -9054,7 +9077,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()) {
@@ -9064,7 +9087,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));
@@ -9106,9 +9129,13 @@ void mmu_M600_load_filament(bool automatic)
 	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
+	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/mmu.cpp

@@ -107,7 +107,7 @@ void extr_adj(int extruder) //loading filament for SNMM
 	lcd_print(snmm_extruder + 1);
 
 	// get response
-	manage_response();
+	manage_response(false, false);
 
 	lcd_update_enable(true);
 	
@@ -182,7 +182,7 @@ void extr_unload()
 		fprintf_P(uart2io, PSTR("U0\n"));
 
 		// get response
-		manage_response();
+		manage_response(false, true);
 
 		lcd_update_enable(true);
 #else //SNMM

+ 2 - 2
Firmware/ultralcd.cpp

@@ -3047,8 +3047,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)));