Jelajahi Sumber

Merge branch 'add_cut' into bad_load_cut

Marek Bel 5 tahun lalu
induk
melakukan
a67645fda6
6 mengubah file dengan 126 tambahan dan 105 penghapusan
  1. 1 1
      Firmware/Configuration.h
  2. 28 70
      Firmware/mmu.cpp
  3. 6 10
      Firmware/mmu.h
  4. 6 6
      Firmware/temperature.cpp
  5. 75 17
      Firmware/ultralcd.cpp
  6. 10 1
      Firmware/ultralcd.h

+ 1 - 1
Firmware/Configuration.h

@@ -132,7 +132,7 @@
   //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
   //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay
   #define PID_INTEGRAL_DRIVE_MAX PID_MAX  //limit for the integral term
-  #define K1 0.95 //smoothing factor within the PID
+  #define PID_K1 0.95 //smoothing factor within the PID
   #define PID_dT ((OVERSAMPLENR * 10.0)/(F_CPU / 64.0 / 256.0)) //sampling period of the temperature routine
 
 // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it

+ 28 - 70
Firmware/mmu.cpp

@@ -297,6 +297,14 @@ void mmu_loop(void)
 				mmu_fil_loaded = false;
 				mmu_state = S::WaitCmd;
 			}
+			else if ((mmu_cmd >= MmuCmd::K0) && (mmu_cmd <= MmuCmd::K4))
+            {
+                const uint8_t filament = mmu_cmd - MmuCmd::K0;
+                DEBUG_PRINTF_P(PSTR("MMU <= 'K%d'\n"), filament);
+                mmu_printf_P(PSTR("K%d\n"), filament); //send eject filament
+                mmu_fil_loaded = false;
+                mmu_state = S::WaitCmd;
+            }
 			else if (mmu_cmd == MmuCmd::R0)
 			{
 			    DEBUG_PRINTF_P(PSTR("MMU <= 'R0'\n"));
@@ -1183,76 +1191,6 @@ void extr_adj_4()
 #endif
 }
 
-void mmu_load_to_nozzle_0() 
-{
-//-//
-     menu_back();
-	lcd_mmu_load_to_nozzle(0);
-}
-
-void mmu_load_to_nozzle_1() 
-{
-//-//
-     menu_back();
-	lcd_mmu_load_to_nozzle(1);
-}
-
-void mmu_load_to_nozzle_2() 
-{
-//-//
-     menu_back();
-	lcd_mmu_load_to_nozzle(2);
-}
-
-void mmu_load_to_nozzle_3() 
-{
-//-//
-     menu_back();
-	lcd_mmu_load_to_nozzle(3);
-}
-
-void mmu_load_to_nozzle_4() 
-{
-//-//
-     menu_back();
-	lcd_mmu_load_to_nozzle(4);
-}
-
-void mmu_eject_fil_0()
-{
-//-//
-     menu_back();
-	mmu_eject_filament(0, true);
-}
-
-void mmu_eject_fil_1()
-{
-//-//
-     menu_back();
-	mmu_eject_filament(1, true);
-}
-
-void mmu_eject_fil_2()
-{
-//-//
-     menu_back();
-	mmu_eject_filament(2, true);
-}
-
-void mmu_eject_fil_3()
-{
-//-//
-     menu_back();
-	mmu_eject_filament(3, true);
-}
-
-void mmu_eject_fil_4()
-{
-//-//
-     menu_back();
-	mmu_eject_filament(4, true);
-}
-
 void load_all()
 {
 #ifndef SNMM
@@ -1407,6 +1345,26 @@ bFilamentAction=false;                            // NOT in "mmu_load_to_nozzle_
   }
 }
 
+void mmu_cut_filament(uint8_t filament_nr)
+{
+bFilamentAction=false;                            // NOT in "mmu_load_to_nozzle_menu()"
+  if (degHotend0() > EXTRUDE_MINTEMP)
+  {
+    LcdUpdateDisabler disableLcdUpdate;
+    lcd_clear();
+    lcd_set_cursor(0, 1); lcd_puts_P(_i("Cutting filament")); //// c=18 r=1
+    lcd_print(" ");
+    lcd_print(filament_nr + 1);
+    mmu_filament_ramming();
+    mmu_command(MmuCmd::K0 + filament_nr);
+    manage_response(false, false, MMU_UNLOAD_MOVE);
+  }
+  else
+  {
+      show_preheat_nozzle_warning();
+  }
+}
+
 void mmu_eject_filament(uint8_t filament, bool recover)
 {
 //-//

+ 6 - 10
Firmware/mmu.h

@@ -52,6 +52,11 @@ enum class MmuCmd : uint_least8_t
     E2,
     E3,
     E4,
+    K0,
+    K1,
+    K2,
+    K3,
+    K4,
     R0,
     S3,
     W0,
@@ -108,11 +113,6 @@ extern void extr_adj_1();
 extern void extr_adj_2();
 extern void extr_adj_3();
 extern void extr_adj_4();
-extern void mmu_load_to_nozzle_0();
-extern void mmu_load_to_nozzle_1();
-extern void mmu_load_to_nozzle_2();
-extern void mmu_load_to_nozzle_3();
-extern void mmu_load_to_nozzle_4();
 extern void load_all();
 extern void extr_change_0();
 extern void extr_change_1();
@@ -132,11 +132,7 @@ extern bool mmu_check_version();
 extern void mmu_show_warning();
 extern void lcd_mmu_load_to_nozzle(uint8_t filament_nr);
 extern void mmu_eject_filament(uint8_t filament, bool recover);
-extern void mmu_eject_fil_0();
-extern void mmu_eject_fil_1();
-extern void mmu_eject_fil_2();
-extern void mmu_eject_fil_3();
-extern void mmu_eject_fil_4();
+extern void mmu_cut_filament(uint8_t filament_nr);
 extern void mmu_continue_loading();
 extern void mmu_filament_ramming();
 extern void mmu_wait_for_heater_blocking();

+ 6 - 6
Firmware/temperature.cpp

@@ -662,9 +662,9 @@ void manage_heater()
           iState_sum[e] += pid_error[e];
           iState_sum[e] = constrain(iState_sum[e], iState_sum_min[e], iState_sum_max[e]);
           iTerm[e] = cs.Ki * iState_sum[e];
-          // K1 defined in Configuration.h in the PID settings
-          #define K2 (1.0-K1)
-          dTerm[e] = (cs.Kd * (pid_input - dState_last[e]))*K2 + (K1 * dTerm[e]); // e.g. digital filtration of derivative term changes
+          // PID_K1 defined in Configuration.h in the PID settings
+          #define K2 (1.0-PID_K1)
+          dTerm[e] = (cs.Kd * (pid_input - dState_last[e]))*K2 + (PID_K1 * dTerm[e]); // e.g. digital filtration of derivative term changes
           pid_output = pTerm[e] + iTerm[e] - dTerm[e]; // subtraction due to "Derivative on Measurement" method (i.e. derivative of input instead derivative of error is used)
           if (pid_output > PID_MAX) {
             if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration
@@ -811,9 +811,9 @@ void manage_heater()
 		  temp_iState_bed = constrain(temp_iState_bed, temp_iState_min_bed, temp_iState_max_bed);
 		  iTerm_bed = cs.bedKi * temp_iState_bed;
 
-		  //K1 defined in Configuration.h in the PID settings
-		  #define K2 (1.0-K1)
-		  dTerm_bed= (cs.bedKd * (pid_input - temp_dState_bed))*K2 + (K1 * dTerm_bed);
+		  //PID_K1 defined in Configuration.h in the PID settings
+		  #define K2 (1.0-PID_K1)
+		  dTerm_bed= (cs.bedKd * (pid_input - temp_dState_bed))*K2 + (PID_K1 * dTerm_bed);
 		  temp_dState_bed = pid_input;
 
 		  pid_output = pTerm_bed + iTerm_bed - dTerm_bed;

+ 75 - 17
Firmware/ultralcd.cpp

@@ -144,6 +144,7 @@ static void lcd_menu_show_sensors_state();
 
 static void mmu_fil_eject_menu();
 static void mmu_load_to_nozzle_menu();
+static void mmu_cut_filament_menu();
 
 #if defined(TMC2130) || defined(FILAMENT_SENSOR)
 static void lcd_menu_fails_stats();
@@ -2407,6 +2408,9 @@ switch(eFilamentAction)
      case e_FILAMENT_ACTION_mmuEject:
           lcd_puts_P(_i("Preheating to eject"));  ////MSG_ c=20 r=1
           break;
+     case e_FILAMENT_ACTION_mmuCut:
+          lcd_puts_P(_i("Preheating to cut"));  ////MSG_ c=20 r=1
+          break;
      }
 lcd_set_cursor(0,3);
 lcd_puts_P(_i(">Cancel"));                        ////MSG_ c=20 r=1
@@ -2460,6 +2464,14 @@ else {
                     menu_back(nLevel);
                     menu_submenu(mmu_fil_eject_menu);
                     break;
+               case e_FILAMENT_ACTION_mmuCut:
+                    nLevel=1;
+                    if(!bFilamentPreheatState)
+                         nLevel++;
+                    bFilamentAction=true;
+                    menu_back(nLevel);
+                    menu_submenu(mmu_cut_filament_menu);
+                    break;
                }
           if(bBeep)
                Sound_MakeSound(e_SOUND_TYPE_StandardPrompt);
@@ -4745,7 +4757,7 @@ static void lcd_wizard_unload()
 		} 
 		else
 		{
-			mmu_eject_fil_0();
+		    mmu_eject_filament(0, true);
 		}
 	} 
 	else
@@ -5685,18 +5697,24 @@ static void fil_load_menu()
 	MENU_END();
 }
 
+template <uint8_t filament>
+static void mmu_load_to_nozzle()
+{
+    menu_back();
+    lcd_mmu_load_to_nozzle(filament);
+}
+
 static void mmu_load_to_nozzle_menu()
 {
-//-//if (degHotend0() > EXTRUDE_MINTEMP)
 if(bFilamentAction)
 {
 	MENU_BEGIN();
 	MENU_ITEM_BACK_P(_T(MSG_MAIN));
-	MENU_ITEM_FUNCTION_P(_i("Load filament 1"), mmu_load_to_nozzle_0);
-	MENU_ITEM_FUNCTION_P(_i("Load filament 2"), mmu_load_to_nozzle_1);
-	MENU_ITEM_FUNCTION_P(_i("Load filament 3"), mmu_load_to_nozzle_2);
-	MENU_ITEM_FUNCTION_P(_i("Load filament 4"), mmu_load_to_nozzle_3);
-	MENU_ITEM_FUNCTION_P(_i("Load filament 5"), mmu_load_to_nozzle_4);
+	MENU_ITEM_FUNCTION_P(_i("Load filament 1"), mmu_load_to_nozzle<0>);
+	MENU_ITEM_FUNCTION_P(_i("Load filament 2"), mmu_load_to_nozzle<1>);
+	MENU_ITEM_FUNCTION_P(_i("Load filament 3"), mmu_load_to_nozzle<2>);
+	MENU_ITEM_FUNCTION_P(_i("Load filament 4"), mmu_load_to_nozzle<3>);
+	MENU_ITEM_FUNCTION_P(_i("Load filament 5"), mmu_load_to_nozzle<4>);
 	MENU_END();
 }
 else {
@@ -5711,22 +5729,61 @@ else {
      }
 }
 
+template <uint8_t filament>
+static void mmu_eject_filament()
+{
+    menu_back();
+    mmu_eject_filament(filament, true);
+}
+
 static void mmu_fil_eject_menu()
 {
-//-//if (degHotend0() > EXTRUDE_MINTEMP)
+    if(bFilamentAction)
+    {
+        MENU_BEGIN();
+        MENU_ITEM_BACK_P(_T(MSG_MAIN));
+        MENU_ITEM_FUNCTION_P(_i("Eject filament 1"), mmu_eject_filament<0>);
+        MENU_ITEM_FUNCTION_P(_i("Eject filament 2"), mmu_eject_filament<1>);
+        MENU_ITEM_FUNCTION_P(_i("Eject filament 3"), mmu_eject_filament<2>);
+        MENU_ITEM_FUNCTION_P(_i("Eject filament 4"), mmu_eject_filament<3>);
+        MENU_ITEM_FUNCTION_P(_i("Eject filament 5"), mmu_eject_filament<4>);
+        MENU_END();
+    }
+    else
+    {
+        eFilamentAction=e_FILAMENT_ACTION_mmuEject;
+        bFilamentFirstRun=false;
+        if(target_temperature[0]>=EXTRUDE_MINTEMP)
+        {
+            bFilamentPreheatState=true;
+            mFilamentItem(target_temperature[0],target_temperature_bed);
+        }
+        else mFilamentMenu();
+    }
+}
+
+template <uint8_t filament>
+static void mmu_cut_filament()
+{
+    menu_back();
+    mmu_cut_filament(filament);
+}
+
+static void mmu_cut_filament_menu()
+{
 if(bFilamentAction)
 {
-	MENU_BEGIN();
-	MENU_ITEM_BACK_P(_T(MSG_MAIN));
-	MENU_ITEM_FUNCTION_P(_i("Eject filament 1"), mmu_eject_fil_0);
-	MENU_ITEM_FUNCTION_P(_i("Eject filament 2"), mmu_eject_fil_1);
-	MENU_ITEM_FUNCTION_P(_i("Eject filament 3"), mmu_eject_fil_2);
-	MENU_ITEM_FUNCTION_P(_i("Eject filament 4"), mmu_eject_fil_3);
-	MENU_ITEM_FUNCTION_P(_i("Eject filament 5"), mmu_eject_fil_4);
-	MENU_END();
+    MENU_BEGIN();
+    MENU_ITEM_BACK_P(_T(MSG_MAIN));
+    MENU_ITEM_FUNCTION_P(_i("Cut filament 1"), mmu_cut_filament<0>);
+    MENU_ITEM_FUNCTION_P(_i("Cut filament 2"), mmu_cut_filament<1>);
+    MENU_ITEM_FUNCTION_P(_i("Cut filament 3"), mmu_cut_filament<2>);
+    MENU_ITEM_FUNCTION_P(_i("Cut filament 4"), mmu_cut_filament<3>);
+    MENU_ITEM_FUNCTION_P(_i("Cut filament 5"), mmu_cut_filament<4>);
+    MENU_END();
 }
 else {
-     eFilamentAction=e_FILAMENT_ACTION_mmuEject;
+     eFilamentAction=e_FILAMENT_ACTION_mmuCut;
      bFilamentFirstRun=false;
      if(target_temperature[0]>=EXTRUDE_MINTEMP)
           {
@@ -6209,6 +6266,7 @@ static void lcd_main_menu()
 //bFilamentFirstRun=true;
           MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), extr_unload_);
 		MENU_ITEM_SUBMENU_P(_i("Eject filament"), mmu_fil_eject_menu);
+        MENU_ITEM_SUBMENU_P(_i("Cut filament"), mmu_cut_filament_menu);
 	}
 	else
 	{

+ 10 - 1
Firmware/ultralcd.h

@@ -134,7 +134,16 @@ void extr_unload_used();
 void extr_unload();
 
 typedef enum
-     {e_FILAMENT_ACTION_none,e_FILAMENT_ACTION_Load,e_FILAMENT_ACTION_autoLoad,e_FILAMENT_ACTION_unLoad,e_FILAMENT_ACTION_mmuLoad,e_FILAMENT_ACTION_mmuUnLoad,e_FILAMENT_ACTION_mmuEject} eFILAMENT_ACTION; // 'none' state is used as flag for (filament) autoLoad (i.e. opposite for 'autoLoad' state)
+{
+    e_FILAMENT_ACTION_none, //!< 'none' state is used as flag for (filament) autoLoad (i.e. opposite for 'autoLoad' state)
+    e_FILAMENT_ACTION_Load,
+    e_FILAMENT_ACTION_autoLoad,
+    e_FILAMENT_ACTION_unLoad,
+    e_FILAMENT_ACTION_mmuLoad,
+    e_FILAMENT_ACTION_mmuUnLoad,
+    e_FILAMENT_ACTION_mmuEject,
+    e_FILAMENT_ACTION_mmuCut,
+} eFILAMENT_ACTION;
 extern eFILAMENT_ACTION eFilamentAction;
 extern bool bFilamentFirstRun;
 extern bool bFilamentPreheatState;