Ver código fonte

Fixup: restoring temp. while Load2ExtrFailed

D.R.racer 2 anos atrás
pai
commit
5e103cc24e
1 arquivos alterados com 15 adições e 9 exclusões
  1. 15 9
      Firmware/mmu2.cpp

+ 15 - 9
Firmware/mmu2.cpp

@@ -311,9 +311,8 @@ bool MMU2::ToolChangeCommonOnce(uint8_t slot){
 void MMU2::ToolChangeCommon(uint8_t slot){
     while( ! ToolChangeCommonOnce(slot) ){ // while not successfully fed into extruder's PTFE tube
         // failed autoretry, report an error by forcing a "printer" error into the MMU infrastructure - it is a hack to leverage existing code
+        // @@TODO theoretically logic layer may not need to be spoiled with the printer error - may be just the manage_response needs it...
         logic.SetPrinterError(ErrorCode::LOAD_TO_EXTRUDER_FAILED);
-        SaveAndPark(true);
-        SaveHotendTemp(true);
         // We only have to wait for the user to fix the issue and press "Retry".
         // Please see CheckUserInput() for details how we "leave" manage_response.
         // If manage_response returns false at this spot (MMU operation interrupted aka MMU reset)
@@ -685,12 +684,24 @@ void MMU2::CheckUserInput(){
     case Right:
         SERIAL_ECHOPGM("CheckUserInput-btnLMR ");
         SERIAL_ECHOLN(btn);
+
+        // clear the explicit printer error as soon as possible so that the MMU error screens + reporting doesn't get too confused
+        if( lastErrorCode == ErrorCode::LOAD_TO_EXTRUDER_FAILED ){
+            // A horrible hack - clear the explicit printer error allowing manage_response to recover on MMU's Finished state
+            // Moreover - if the MMU is currently doing something (like the LoadFilament - see comment above)
+            // we'll actually wait for it automagically in manage_response and after it finishes correctly,
+            // we'll issue another command (like toolchange)
+            logic.ClearPrinterError();
+            lastErrorSource = ErrorSourceMMU; // this seems to help clearing the error screen
+        }
+
         ResumeHotendTemp(); // Recover the hotend temp before we attempt to do anything else...
 
         // In case of LOAD_TO_EXTRUDER_FAILED sending a button into the MMU has an interesting side effect
         // - it triggers the standalone LoadFilament function on the current active slot.
         // Considering the fact, that we are recovering from a failed load to extruder, this side effect is actually quite beneficial
         // - it checks if the filament is correctly loaded in the MMU (we assume the user was playing with the filament to recover from the failed load)
+        // Moreover, the "button" makes all the nice things like temp recovery
         Button(btn);
 
         // A quick hack: for specific error codes move the E-motor every time.
@@ -701,13 +712,6 @@ void MMU2::CheckUserInput(){
         case ErrorCode::FSENSOR_TOO_EARLY:
             HelpUnloadToFinda();
             break;
-        case ErrorCode::LOAD_TO_EXTRUDER_FAILED:
-            // A horrible hack - clear the explicit printer error allowing manage_response to recover on MMU's Finished state
-            // Moreover - if the MMU is currently doing something (like the LoadFilament - see comment above)
-            // we'll actually wait for it automagically in manage_response and after it finishes correctly,
-            // we'll issue another command (like toolchange)
-            logic.ClearPrinterError();
-            break;
         default:
             break;
         }
@@ -782,6 +786,8 @@ bool MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) {
             CheckUserInput();
             return true;
         case PrinterError:
+            SaveAndPark(move_axes);
+            SaveHotendTemp(turn_off_nozzle);
             CheckUserInput();
             // if button pressed "Done", return true, otherwise stay within manage_response
             // Please see CheckUserInput() for details how we "leave" manage_response