From d5c5ed55eb7de4f66a557655cb7d5b889c733c22 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Mon, 25 Feb 2019 11:12:39 +0100 Subject: [PATCH 1/5] Change formatting. --- Firmware/ultralcd.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index dd1132f86..4bf514d9b 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -134,7 +134,15 @@ 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, +} eFILAMENT_ACTION; extern eFILAMENT_ACTION eFilamentAction; extern bool bFilamentFirstRun; extern bool bFilamentPreheatState; From 34e24954879118201f6a1ef8b199597b7d5f73df Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Tue, 26 Feb 2019 10:32:10 +0100 Subject: [PATCH 2/5] Convert mmu_load_to_nozzle_0 to mmu_load_to_nozzle_4 to template. --- Firmware/mmu.cpp | 34 ---------------------------------- Firmware/mmu.h | 5 ----- Firmware/ultralcd.cpp | 18 ++++++++++++------ 3 files changed, 12 insertions(+), 45 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 2f7bf96c3..158b3cb77 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -1183,40 +1183,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() { diff --git a/Firmware/mmu.h b/Firmware/mmu.h index 446c9aec0..b2f9cefb8 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -108,11 +108,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(); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index f6502cef9..339d5195d 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -5685,18 +5685,24 @@ static void fil_load_menu() MENU_END(); } +template +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 { From 7a1b47c340b357161663be96c6e51d5e580d6972 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Tue, 26 Feb 2019 11:11:05 +0100 Subject: [PATCH 3/5] Convert functions mmu_eject_fil_0 to mmu_eject_fil_4 to template function. --- Firmware/mmu.cpp | 36 ----------------------------- Firmware/mmu.h | 5 ---- Firmware/ultralcd.cpp | 53 ++++++++++++++++++++++++------------------- 3 files changed, 30 insertions(+), 64 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 158b3cb77..c77276be1 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -1183,42 +1183,6 @@ void extr_adj_4() #endif } - -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 diff --git a/Firmware/mmu.h b/Firmware/mmu.h index b2f9cefb8..3b0d41860 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -127,11 +127,6 @@ 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_continue_loading(); extern void mmu_filament_ramming(); extern void mmu_wait_for_heater_blocking(); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 339d5195d..00c939bb6 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4745,7 +4745,7 @@ static void lcd_wizard_unload() } else { - mmu_eject_fil_0(); + mmu_eject_filament(0, true); } } else @@ -5717,30 +5717,37 @@ else { } } +template +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_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(); -} -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(); - } + 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(); + } } #ifdef SNMM From 5a5a482a59c2302837e72e7452f0f0263d9cae9b Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Tue, 26 Feb 2019 13:59:44 +0100 Subject: [PATCH 4/5] Rename preprocessor macro K1 to PID_K1 to avoid future conflict with MMU command. --- Firmware/Configuration.h | 2 +- Firmware/temperature.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 13d2f1a05..db8d54ec2 100644 --- a/Firmware/Configuration.h +++ b/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 diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index e156734b8..99a0d0c95 100644 --- a/Firmware/temperature.cpp +++ b/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; From 815231bc26ea89c720df0a5bedbfd99d99793df3 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Tue, 26 Feb 2019 17:58:00 +0100 Subject: [PATCH 5/5] Add MMU cut filament menu. --- Firmware/mmu.cpp | 28 +++++++++++++++++++++++++++ Firmware/mmu.h | 6 ++++++ Firmware/ultralcd.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++ Firmware/ultralcd.h | 1 + 4 files changed, 80 insertions(+) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index c77276be1..53e7458a6 100644 --- a/Firmware/mmu.cpp +++ b/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")); @@ -1337,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) { //-// diff --git a/Firmware/mmu.h b/Firmware/mmu.h index 3b0d41860..b498a3749 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -52,6 +52,11 @@ enum class MmuCmd : uint_least8_t E2, E3, E4, + K0, + K1, + K2, + K3, + K4, R0, S3, W0, @@ -127,6 +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_cut_filament(uint8_t filament_nr); extern void mmu_continue_loading(); extern void mmu_filament_ramming(); extern void mmu_wait_for_heater_blocking(); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 00c939bb6..46dd1a3ce 100644 --- a/Firmware/ultralcd.cpp +++ b/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); @@ -5750,6 +5762,38 @@ static void mmu_fil_eject_menu() } } +template +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("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_mmuCut; + bFilamentFirstRun=false; + if(target_temperature[0]>=EXTRUDE_MINTEMP) + { + bFilamentPreheatState=true; + mFilamentItem(target_temperature[0],target_temperature_bed); + } + else mFilamentMenu(); + } +} + #ifdef SNMM static void fil_unload_menu() { @@ -6222,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 { diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 4bf514d9b..c947a346d 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -142,6 +142,7 @@ typedef enum 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;