Browse Source

Merge pull request #1713 from mkbel/fix_octoprint_mmu_load_failed

Fix octoprint mmu load failed
PavelSindler 5 years ago
parent
commit
7168c09eec
5 changed files with 125 additions and 56 deletions
  1. 2 1
      Firmware/Marlin.h
  2. 23 10
      Firmware/Marlin_main.cpp
  3. 95 43
      Firmware/mmu.cpp
  4. 2 2
      Firmware/mmu.h
  5. 3 0
      Firmware/tmc2130.cpp

+ 2 - 1
Firmware/Marlin.h

@@ -469,7 +469,7 @@ extern uint8_t calc_percent_done();
 #define KEEPALIVE_STATE(n) do { busy_state = n;} while (0)
 extern void host_keepalive();
 //extern MarlinBusyState busy_state;
-extern int busy_state;
+extern int8_t busy_state;
 
 
 #ifdef TMC2130
@@ -497,3 +497,4 @@ void M600_load_filament_movements();
 void M600_wait_for_user(float HotendTempBckp);
 void M600_check_state(float nozzle_temp);
 void load_filament_final_feed();
+void marlin_wait_for_click();

+ 23 - 10
Firmware/Marlin_main.cpp

@@ -303,7 +303,7 @@ int fanSpeed=0;
 
 bool cancel_heatup = false ;
 
-int busy_state = NOT_BUSY;
+int8_t busy_state = NOT_BUSY;
 static long prev_busy_signal_ms = -1;
 uint8_t host_keepalive_interval = HOST_KEEPALIVE_INTERVAL;
 
@@ -4962,13 +4962,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 		KEEPALIVE_STATE(IN_HANDLER);
         lcd_ignore_click(false);
       }else{
-		KEEPALIVE_STATE(PAUSED_FOR_USER);
-        while(!lcd_clicked()){
-          manage_heater();
-          manage_inactivity(true);
-          lcd_update(0);
-        }
-		KEEPALIVE_STATE(IN_HANDLER);
+        marlin_wait_for_click();
       }
       if (IS_SD_PRINTING)
         LCD_MESSAGERPGM(_T(MSG_RESUMING_PRINT));
@@ -7014,7 +7008,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 	  	if (mmu_enabled) 
 		{
 			st_synchronize();
-			mmu_continue_loading();
+			mmu_continue_loading(is_usb_printing);
 			mmu_extruder = tmp_extruder; //filament change is finished
 			mmu_load_to_nozzle();
 		}
@@ -7052,7 +7046,8 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 				  mmu_command(MmuCmd::T0 + tmp_extruder);
 
 				  manage_response(true, true, MMU_TCODE_MOVE);
-				  mmu_continue_loading();
+		          mmu_continue_loading(is_usb_printing);
+
 				  mmu_extruder = tmp_extruder; //filament change is finished
 
 				  if (load_to_nozzle)// for single material usage with mmu
@@ -9614,4 +9609,22 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE))
 	lcd_update_enable(false);
 }
 
+
+//! @brief Wait for click
+//!
+//! Set
+void marlin_wait_for_click()
+{
+    int8_t busy_state_backup = busy_state;
+    KEEPALIVE_STATE(PAUSED_FOR_USER);
+    lcd_consume_click();
+    while(!lcd_clicked())
+    {
+        manage_heater();
+        manage_inactivity(true);
+        lcd_update(0);
+    }
+    KEEPALIVE_STATE(busy_state);
+}
+
 #define FIL_LOAD_LENGTH 60

+ 95 - 43
Firmware/mmu.cpp

@@ -679,6 +679,7 @@ void manage_response(bool move_axes, bool turn_off_nozzle, uint8_t move)
 				  st_synchronize();
 				  mmu_print_saved = true;
 				  printf_P(PSTR("MMU not responding\n"));
+				  KEEPALIVE_STATE(PAUSED_FOR_USER);
 				  hotend_temp_bckp = degTargetHotend(active_extruder);
 				  if (move_axes) {
 					  z_position_bckp = current_position[Z_AXIS];
@@ -735,6 +736,7 @@ void manage_response(bool move_axes, bool turn_off_nozzle, uint8_t move)
 		  }
 		  else if (mmu_print_saved) {
 			  printf_P(PSTR("MMU starts responding\n"));
+			  KEEPALIVE_STATE(IN_HANDLER);
 			  mmu_loading_flag = false;
 			  if (turn_off_nozzle) 
 			  {
@@ -878,7 +880,7 @@ void mmu_M600_load_filament(bool automatic, float nozzle_temp)
     mmu_command(MmuCmd::T0 + tmp_extruder);
 
     manage_response(false, true, MMU_LOAD_MOVE);
-    mmu_continue_loading();
+    mmu_continue_loading(is_usb_printing);
     mmu_extruder = tmp_extruder; //filament change is finished
 
     mmu_load_to_nozzle();
@@ -1363,7 +1365,7 @@ bFilamentAction=false;                            // NOT in "mmu_load_to_nozzle_
 	lcd_print(tmp_extruder + 1);
 	mmu_command(MmuCmd::T0 + tmp_extruder);
 	manage_response(true, true, MMU_TCODE_MOVE);
-	mmu_continue_loading();
+	mmu_continue_loading(false);
 	mmu_extruder = tmp_extruder; //filament change is finished
 	mmu_load_to_nozzle();
 	load_filament_final_feed();
@@ -1464,59 +1466,109 @@ static void load_more()
     st_synchronize();
 }
 
-void mmu_continue_loading() 
+static void increment_load_fail()
 {
-	if (ir_sensor_detected)
+    uint8_t mmu_load_fail = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL);
+    uint16_t mmu_load_fail_tot = eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT);
+    if(mmu_load_fail < 255) eeprom_update_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL, mmu_load_fail + 1);
+    if(mmu_load_fail_tot < 65535) eeprom_update_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT, mmu_load_fail_tot + 1);
+}
+
+//! @brief continue loading filament
+//! @par blocking
+//!  * true blocking - do not return until successful load
+//!  * false non-blocking - pause print and return on load failure
+//!
+//! @startuml
+//! [*] --> [*] : !ir_sensor_detected /\n send MmuCmd::C0
+//! [*] --> LoadMore
+//! LoadMore --> [*] : filament \ndetected
+//! LoadMore --> Retry : !filament detected /\n increment load fail
+//! Retry --> [*] : filament \ndetected
+//! Retry --> Unload : !filament \ndetected
+//! Unload --> [*] : non-blocking
+//! Unload --> Retry : button \nclicked
+//!
+//! Retry : Cut filament if enabled
+//! Retry : repeat last T-code
+//! Unload : unload filament
+//! Unload : pause print
+//! Unload : show error message
+//!
+//! @enduml
+void mmu_continue_loading(bool blocking)
+{
+	if (!ir_sensor_detected)
 	{
-	    load_more();
+	    mmu_command(MmuCmd::C0);
+	    return;
+	}
 
-		if (PIN_GET(IR_SENSOR_PIN) != 0) {
-			uint8_t mmu_load_fail = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL);
-			uint16_t mmu_load_fail_tot = eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT);
-			if(mmu_load_fail < 255) eeprom_update_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL, mmu_load_fail + 1);
-			if(mmu_load_fail_tot < 65535) eeprom_update_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT, mmu_load_fail_tot + 1);
+    load_more();
 
+    enum class Ls : uint_least8_t
+    {
+        enter,
+        retry,
+        unload,
+    };
+    Ls state = Ls::enter;
+
+    while (PIN_GET(IR_SENSOR_PIN) != 0)
+    {
+        switch (state)
+        {
+        case Ls::enter:
+            increment_load_fail();
+            // no break
+        case Ls::retry:
 #ifdef MMU_HAS_CUTTER
-			if (1 == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
-			{
-			    mmu_command(MmuCmd::K0 + tmp_extruder);
-			    manage_response(true, true, MMU_UNLOAD_MOVE);
-			}
+            if (1 == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
+            {
+                mmu_command(MmuCmd::K0 + tmp_extruder);
+                manage_response(true, true, MMU_UNLOAD_MOVE);
+            }
 #endif //MMU_HAS_CUTTER
-
             mmu_command(MmuCmd::T0 + tmp_extruder);
             manage_response(true, true, MMU_TCODE_MOVE);
             load_more();
-
-            if (PIN_GET(IR_SENSOR_PIN) != 0)
+            state = Ls::unload;
+            break;
+        case Ls::unload:
+            stop_and_save_print_to_ram(0, 0);
+
+            //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();
+
+            mmu_command(MmuCmd::U0);
+            manage_response(false, true, MMU_UNLOAD_MOVE);
+
+            setAllTargetHotends(0);
+            lcd_setstatuspgm(_i("MMU load failed     "));////c=20 r=1
+
+            if (blocking)
+            {
+                marlin_wait_for_click();
+                restore_print_from_ram_and_continue(0);
+                state = Ls::retry;
+            }
+            else
             {
-                //pause print, show error message and then repeat last T-code
-                stop_and_save_print_to_ram(0, 0);
-
-                //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();
-
-                mmu_command(MmuCmd::U0);
-                manage_response(false, true, MMU_UNLOAD_MOVE);
-
-                setAllTargetHotends(0);
-                lcd_setstatuspgm(_i("MMU load failed     "));////MSG_RECOVERING_PRINT c=20 r=1
                 mmu_fil_loaded = false; //so we can retry same T-code again
                 isPrintPaused = true;
                 mmu_command(MmuCmd::W0);
+                return;
             }
-		}
-	}
-	else { //mmu_ir_sensor_detected == false
-		mmu_command(MmuCmd::C0);
-	}
+            break;
+        }
+    }
 }

+ 2 - 2
Firmware/mmu.h

@@ -58,7 +58,7 @@ enum class MmuCmd : uint_least8_t
     K4,
     R0,
     S3,
-    W0,
+    W0, //!< Wait and signal load error
 };
 
 inline MmuCmd operator+ (MmuCmd cmd, uint8_t filament)
@@ -134,7 +134,7 @@ extern void mmu_eject_filament(uint8_t filament, bool recover);
 #ifdef MMU_HAS_CUTTER
 extern void mmu_cut_filament(uint8_t filament_nr);
 #endif //MMU_HAS_CUTTER
-extern void mmu_continue_loading();
+extern void mmu_continue_loading(bool blocking);
 extern void mmu_filament_ramming();
 extern void mmu_wait_for_heater_blocking();
 extern void mmu_load_step(bool synchronize = true);

+ 3 - 0
Firmware/tmc2130.cpp

@@ -715,6 +715,9 @@ uint8_t tmc2130_get_pwr(uint8_t axis)
 	return 0;
 }
 
+//! @par pwr motor power
+//!  * 0 disabled
+//!  * non-zero enabled
 void tmc2130_set_pwr(uint8_t axis, uint8_t pwr)
 {
 	switch (axis)