From bb5ac93921857888c0115c866a596d87159440c2 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Wed, 22 Aug 2018 18:55:42 +0200 Subject: [PATCH 01/54] Add missing compile time check for ShortTimer fitting into menu_data. Convert preprocessor checks to shorter and more accurate static_assert. Remove redundant macro MENU_DATA_EDIT_SIZE. Decrease scope of menu_stack and asociated macro. No functional change. --- Firmware/menu.cpp | 14 ++++---------- Firmware/menu.h | 11 ++++++++--- Firmware/ultralcd.cpp | 23 +++++++---------------- 3 files changed, 19 insertions(+), 29 deletions(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index b63629edf..66e2e1c3c 100644 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -14,8 +14,9 @@ extern int32_t lcd_encoder; +#define MENU_DEPTH_MAX 4 -menu_record_t menu_stack[MENU_DEPTH_MAX]; +static menu_record_t menu_stack[MENU_DEPTH_MAX]; uint8_t menu_data[MENU_DATA_SIZE]; @@ -33,6 +34,8 @@ uint8_t menu_leaving = 0; menu_func_t menu_menu = 0; +static_assert(sizeof(menu_data)>= sizeof(menu_data_edit_t),"menu_data_edit_t doesn't fit into menu_data"); + void menu_goto(menu_func_t menu, const uint32_t encoder, const bool feedback, bool reset_menu_state) { @@ -296,15 +299,6 @@ void menu_draw_float13(char chr, const char* str, float val) lcd_printf_P(menu_fmt_float13, chr, str, spaces, val); } -typedef struct -{ - //Variables used when editing values. - const char* editLabel; - void* editValue; - int32_t minEditValue; - int32_t maxEditValue; -} menu_data_edit_t; - void _menu_edit_int3(void) { menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); diff --git a/Firmware/menu.h b/Firmware/menu.h index 06c901035..af6f38969 100644 --- a/Firmware/menu.h +++ b/Firmware/menu.h @@ -4,9 +4,7 @@ #include -#define MENU_DEPTH_MAX 4 #define MENU_DATA_SIZE 32 -#define MENU_DATA_EDIT_SIZE 12 //Function pointer to menu functions. typedef void (*menu_func_t)(void); @@ -17,7 +15,14 @@ typedef struct int8_t position; } menu_record_t; -extern menu_record_t menu_stack[MENU_DEPTH_MAX]; +typedef struct +{ + //Variables used when editing values. + const char* editLabel; + void* editValue; + int32_t minEditValue; + int32_t maxEditValue; +} menu_data_edit_t; extern uint8_t menu_data[MENU_DATA_SIZE]; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 9988815e5..1e2208497 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2086,9 +2086,7 @@ static void lcd_support_menu() uint8_t ip[4]; // 4bytes char ip_str[3*4+3+1]; // 16bytes } _menu_data_t; -#if (22 > MENU_DATA_SIZE) -#error "check MENU_DATA_SIZE definition!" -#endif + static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (_md->status == 0 || lcd_draw_update == 2) { @@ -2417,6 +2415,7 @@ static void lcd_menu_AutoLoadFilament() } else { + static_assert(sizeof(menu_data)>=sizeof(ShortTimer), "ShortTimer doesn't fit into menu_data"); ShortTimer* ptimer = (ShortTimer*)&(menu_data[0]); if (!ptimer->running()) ptimer->start(); lcd_set_cursor(0, 0); @@ -2533,9 +2532,7 @@ static void _lcd_move(const char *name, int axis, int min, int max) bool initialized; // 1byte bool endstopsEnabledPrevious; // 1byte } _menu_data_t; -#if (2 > MENU_DATA_SIZE) -#error "check MENU_DATA_SIZE definition!" -#endif + static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (!_md->initialized) { @@ -2739,9 +2736,7 @@ static void _lcd_babystep(int axis, const char *msg) int babystepMem[3]; // 6bytes float babystepMemMM[3]; // 12bytes } _menu_data_t; -#if (19 > MENU_DATA_SIZE) -#error "check MENU_DATA_SIZE definition!" -#endif + static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (_md->status == 0) { @@ -2822,16 +2817,14 @@ static void lcd_babystep_z() typedef struct { // 12bytes + 9bytes = 21bytes total - uint8_t reserved[MENU_DATA_EDIT_SIZE]; //12 bytes reserved for number editing functions + menu_data_edit_t reserved; //12 bytes reserved for number editing functions int8_t status; // 1byte int16_t left; // 2byte int16_t right; // 2byte int16_t front; // 2byte int16_t rear; // 2byte } _menu_data_adjust_bed_t; -#if (21 > MENU_DATA_SIZE) -#error "check MENU_DATA_SIZE definition!" -#endif +static_assert(sizeof(menu_data)>= sizeof(_menu_data_adjust_bed_t),"_menu_data_adjust_bed_t doesn't fit into menu_data"); void lcd_adjust_bed_reset(void) { @@ -5674,9 +5667,7 @@ static void lcd_tune_menu() // it needs to be applied. int16_t extrudemultiply; // 2byte } _menu_data_t; -#if (3 > MENU_DATA_SIZE) -#error "check MENU_DATA_SIZE definition!" -#endif + static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); if (_md->status == 0) { From 07d07831f1ba99a2ce07176dfd9c1f427136996d Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Wed, 22 Aug 2018 19:40:12 +0200 Subject: [PATCH 02/54] Add portability note. --- Firmware/menu.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index 66e2e1c3c..7fa177460 100644 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -19,6 +19,9 @@ extern int32_t lcd_encoder; static menu_record_t menu_stack[MENU_DEPTH_MAX]; uint8_t menu_data[MENU_DATA_SIZE]; +#ifndef __AVR__ +#error "menu_data is non-portable to non 8bit processor" +#endif uint8_t menu_depth = 0; From 3780516f74e9b8837d1ec93919f5a8554750e6bc Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Wed, 22 Aug 2018 19:47:29 +0200 Subject: [PATCH 03/54] PFW-512 Reserve space for MENU_ITEM_EDIT_int3_P in shared memory in lcd_tune_menu(). --- Firmware/ultralcd.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 1e2208497..fb4a083cd 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -5660,12 +5660,12 @@ static void lcd_colorprint_change() { static void lcd_tune_menu() { typedef struct - { // 3bytes total - // To recognize, whether the menu has been just initialized. - int8_t status; // 1byte - // Backup of extrudemultiply, to recognize, that the value has been changed and - // it needs to be applied. - int16_t extrudemultiply; // 2byte + { + menu_data_edit_t reserved; //!< reserved for number editing functions + int8_t status; //!< To recognize, whether the menu has been just initialized. + //! Backup of extrudemultiply, to recognize, that the value has been changed and + //! it needs to be applied. + int16_t extrudemultiply; } _menu_data_t; static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data"); _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]); From 142bf28dc262ac933c12bdd875daeda004e8fd70 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Thu, 23 Aug 2018 21:15:12 +0200 Subject: [PATCH 04/54] Clear communication buffer when sending load filament command to MMU. This fixes PFW-517 in the moment, when the problem with not displaying "Loading filament 1" to "Loading filament 5" has appeared for the first time. --- Firmware/mmu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 57da1e80f..bf7645a88 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -480,7 +480,7 @@ void extr_adj(int extruder) //loading filament for SNMM { #ifndef SNMM printf_P(PSTR("L%d \n"),extruder); - fprintf_P(uart2io, PSTR("L%d\n"), extruder); + mmu_printf_P(PSTR("L%d\n"), extruder); //show which filament is currently loaded From 050a7c41d0e2f3a4c2d1681af44461ba47959dcc Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 24 Aug 2018 03:49:51 +0200 Subject: [PATCH 05/54] Fix "Check MMU. Fix the issue and then press button on MMU unit." shown instead of "Loading filament 1". --- Firmware/mmu.cpp | 18 +++++++++++++++--- Firmware/mmu.h | 5 +++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index bf7645a88..94a19b9f3 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -162,6 +162,13 @@ void mmu_loop(void) mmu_printf_P(PSTR("T%d\n"), extruder); mmu_state = 3; // wait for response } + else if ((mmu_cmd >= MMU_CMD_L0) && (mmu_cmd <= MMU_CMD_L4)) + { + int filament = mmu_cmd - MMU_CMD_L0; + printf_P(PSTR("MMU <= 'L%d'\n"), filament); + mmu_printf_P(PSTR("L%d\n"), filament); + mmu_state = 3; // wait for response + } mmu_cmd = 0; } else if ((mmu_last_response + 1000) < millis()) //request every 1s @@ -479,8 +486,13 @@ void display_loading() void extr_adj(int extruder) //loading filament for SNMM { #ifndef SNMM - printf_P(PSTR("L%d \n"),extruder); - mmu_printf_P(PSTR("L%d\n"), extruder); + uint8_t cmd = MMU_CMD_L0 + extruder; + if (cmd > MMU_CMD_L4) + { + printf_P(PSTR("Filament out of range %d \n"),extruder); + return; + } + mmu_command(cmd); //show which filament is currently loaded @@ -490,7 +502,7 @@ void extr_adj(int extruder) //loading filament for SNMM //if(strlen(_T(MSG_LOADING_FILAMENT))>18) lcd.setCursor(0, 1); //else lcd.print(" "); lcd_print(" "); - lcd_print(mmu_extruder + 1); + lcd_print(extruder + 1); // get response manage_response(false, false); diff --git a/Firmware/mmu.h b/Firmware/mmu.h index 763c15ea8..835b615cb 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -23,6 +23,11 @@ extern int16_t mmu_buildnr; #define MMU_CMD_T2 0x12 #define MMU_CMD_T3 0x13 #define MMU_CMD_T4 0x14 +#define MMU_CMD_L0 0x20 +#define MMU_CMD_L1 0x21 +#define MMU_CMD_L2 0x22 +#define MMU_CMD_L3 0x23 +#define MMU_CMD_L4 0x24 extern int mmu_puts_P(const char* str); From ac5cb0989eb879b243b653a0e403460bf2acd589 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 24 Aug 2018 15:40:21 +0200 Subject: [PATCH 06/54] Uncomment linearity correction menu. Fix return from linearity correction menu. --- Firmware/ultralcd.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index fb4a083cd..1417dd090 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -123,7 +123,7 @@ static void lcd_control_temperature_preheat_pla_settings_menu(); static void lcd_control_temperature_preheat_abs_settings_menu(); static void lcd_control_motion_menu(); static void lcd_control_volumetric_menu(); -//static void lcd_settings_menu_back(); +static void lcd_settings_linearity_correction_menu_back(); static void prusa_stat_printerstatus(int _status); static void prusa_stat_farm_number(); @@ -4484,13 +4484,13 @@ void lcd_wizard(int state) { lcd_return_to_status(); lcd_update(2); } -/* + void lcd_settings_linearity_correction_menu(void) { MENU_BEGIN(); if (menu_item_back_P(_T(MSG_MAIN))) { - lcd_settings_menu_back(); + lcd_settings_linearity_correction_menu_back(); return; } // MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); @@ -4505,7 +4505,7 @@ void lcd_settings_linearity_correction_menu(void) MENU_ITEM_EDIT_int3_P(_i("E-correct"), &corr[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 MENU_END(); } -*/ + static void lcd_settings_menu() { EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); @@ -4576,7 +4576,7 @@ static void lcd_settings_menu() else MENU_ITEM_SUBMENU_P(_T(MSG_CRASHDETECT_NA), lcd_crash_mode_info); } -// MENU_ITEM_SUBMENU_P(_i("Lin. correction"), lcd_settings_linearity_correction_menu); + MENU_ITEM_SUBMENU_P(_i("Lin. correction"), lcd_settings_linearity_correction_menu); #endif //TMC2130 if (temp_cal_active == false) @@ -4661,8 +4661,8 @@ static void lcd_ustep_linearity_menu_save() } #endif //TMC2130 -/* -static void lcd_settings_menu_back() + +static void lcd_settings_linearity_correction_menu_back() { #ifdef TMC2130 bool changed = false; @@ -4677,10 +4677,10 @@ static void lcd_settings_menu_back() lcd_ustep_linearity_menu_save(); if (changed) tmc2130_init(); #endif //TMC2130 - menu_menu = lcd_main_menu; + menu_menu = lcd_settings_menu; // lcd_main_menu(); } -*/ + static void lcd_calibration_menu() { From 5daae818e1ceab4ddeb4486619f77c569a95522e Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 24 Aug 2018 17:33:43 +0200 Subject: [PATCH 07/54] Convert menu_item_edit to template function. --- Firmware/menu.cpp | 19 +++++++++++++------ Firmware/menu.h | 5 +++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index 7fa177460..b588e7189 100644 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -269,8 +269,11 @@ const char menu_fmt_float31[] PROGMEM = "%c%.12S:%s%+06.1f"; const char menu_fmt_float13[] PROGMEM = "%c%.12S:%s%+06.3f"; +template +void menu_draw_P(char chr, const char* str, int16_t val); -void menu_draw_int3(char chr, const char* str, int16_t val) +template<> +void menu_draw_P(char chr, const char* str, int16_t val) { int text_len = strlen_P(str); if (text_len > 15) text_len = 15; @@ -302,7 +305,8 @@ void menu_draw_float13(char chr, const char* str, float val) lcd_printf_P(menu_fmt_float13, chr, str, spaces, val); } -void _menu_edit_int3(void) +template +void _menu_edit_P(void) { menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); if (lcd_draw_update) @@ -310,7 +314,7 @@ void _menu_edit_int3(void) if (lcd_encoder < _md->minEditValue) lcd_encoder = _md->minEditValue; if (lcd_encoder > _md->maxEditValue) lcd_encoder = _md->maxEditValue; lcd_set_cursor(0, 1); - menu_draw_int3(' ', _md->editLabel, (int)lcd_encoder); + menu_draw_P(' ', _md->editLabel, (int)lcd_encoder); } if (LCD_CLICKED) { @@ -319,7 +323,8 @@ void _menu_edit_int3(void) } } -uint8_t menu_item_edit_int3(const char* str, int16_t* pval, int16_t min_val, int16_t max_val) +template +uint8_t menu_item_edit_P(const char* str, T pval, int16_t min_val, int16_t max_val) { menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); if (menu_item == menu_line) @@ -327,11 +332,11 @@ uint8_t menu_item_edit_int3(const char* str, int16_t* pval, int16_t min_val, int if (lcd_draw_update) { lcd_set_cursor(0, menu_row); - menu_draw_int3((lcd_encoder == menu_item)?'>':' ', str, *pval); + menu_draw_P((lcd_encoder == menu_item)?'>':' ', str, *pval); } if (menu_clicked && (lcd_encoder == menu_item)) { - menu_submenu_no_reset(_menu_edit_int3); + menu_submenu_no_reset(_menu_edit_P); _md->editLabel = str; _md->editValue = pval; _md->minEditValue = min_val; @@ -344,6 +349,8 @@ uint8_t menu_item_edit_int3(const char* str, int16_t* pval, int16_t min_val, int return 0; } +template uint8_t menu_item_edit_P(const char* str, int16_t *pval, int16_t min_val, int16_t max_val); + #undef _menu_data diff --git a/Firmware/menu.h b/Firmware/menu.h index af6f38969..59167246a 100644 --- a/Firmware/menu.h +++ b/Firmware/menu.h @@ -104,9 +104,10 @@ extern void menu_draw_float13(char chr, const char* str, float val); extern void _menu_edit_int3(void); -#define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) do { if (menu_item_edit_int3(str, pval, minval, maxval)) return; } while (0) +#define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) do { if (menu_item_edit_P(str, pval, minval, maxval)) return; } while (0) //#define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) MENU_ITEM_EDIT(int3, str, pval, minval, maxval) -extern uint8_t menu_item_edit_int3(const char* str, int16_t* pval, int16_t min_val, int16_t max_val); +template +extern uint8_t menu_item_edit_P(const char* str, T pval, int16_t min_val, int16_t max_val); #endif //_MENU_H From 5a7c9e3ffd2874da880f942991ce3087945d75f4 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 24 Aug 2018 18:00:05 +0200 Subject: [PATCH 08/54] Make local functions static. Saves 30B of flash with Arduino 1.6.9. No difference with Arduino 1.8.5. --- Firmware/menu.cpp | 10 +++++----- Firmware/menu.h | 7 ------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index b588e7189..493ff2605 100644 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -92,7 +92,7 @@ void menu_back(void) } } -void menu_back_no_reset(void) +static void menu_back_no_reset(void) { if (menu_depth > 0) { @@ -126,7 +126,7 @@ void menu_submenu(menu_func_t submenu) } } -void menu_submenu_no_reset(menu_func_t submenu) +static void menu_submenu_no_reset(menu_func_t submenu) { if (menu_depth <= MENU_DEPTH_MAX) { @@ -164,7 +164,7 @@ int menu_draw_item_printf_P(char type_char, const char* format, ...) } */ -int menu_draw_item_puts_P(char type_char, const char* str) +static int menu_draw_item_puts_P(char type_char, const char* str) { lcd_set_cursor(0, menu_row); int cnt = lcd_printf_P(PSTR("%c%-18S%c"), (lcd_encoder == menu_item)?'>':' ', str, type_char); @@ -270,7 +270,7 @@ const char menu_fmt_float31[] PROGMEM = "%c%.12S:%s%+06.1f"; const char menu_fmt_float13[] PROGMEM = "%c%.12S:%s%+06.3f"; template -void menu_draw_P(char chr, const char* str, int16_t val); +static void menu_draw_P(char chr, const char* str, int16_t val); template<> void menu_draw_P(char chr, const char* str, int16_t val) @@ -306,7 +306,7 @@ void menu_draw_float13(char chr, const char* str, float val) } template -void _menu_edit_P(void) +static void _menu_edit_P(void) { menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); if (lcd_draw_update) diff --git a/Firmware/menu.h b/Firmware/menu.h index 59167246a..f752b963b 100644 --- a/Firmware/menu.h +++ b/Firmware/menu.h @@ -55,21 +55,16 @@ extern void menu_end(void); extern void menu_back(void); -extern void menu_back_no_reset(void); - extern void menu_back_if_clicked(void); extern void menu_back_if_clicked_fb(void); extern void menu_submenu(menu_func_t submenu); -extern void menu_submenu_no_reset(menu_func_t submenu); - extern uint8_t menu_item_ret(void); //extern int menu_draw_item_printf_P(char type_char, const char* format, ...); -extern int menu_draw_item_puts_P(char type_char, const char* str); //int menu_draw_item_puts_P_int16(char type_char, const char* str, int16_t val, ); @@ -96,13 +91,11 @@ extern const char menu_fmt_int3[]; extern const char menu_fmt_float31[]; -extern void menu_draw_int3(char chr, const char* str, int16_t val); extern void menu_draw_float31(char chr, const char* str, float val); extern void menu_draw_float13(char chr, const char* str, float val); -extern void _menu_edit_int3(void); #define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) do { if (menu_item_edit_P(str, pval, minval, maxval)) return; } while (0) //#define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) MENU_ITEM_EDIT(int3, str, pval, minval, maxval) From 68f2e22dad1126d38e48a10aff918ddad9727908 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 24 Aug 2018 18:28:05 +0200 Subject: [PATCH 09/54] continue loading command --- Firmware/Marlin_main.cpp | 2 +- Firmware/mmu.cpp | 9 ++++++++- Firmware/mmu.h | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 6aea1214b..046ed3ecf 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -6808,7 +6808,7 @@ if (mmu_enabled) mmu_command(MMU_CMD_T0 + tmp_extruder); manage_response(true, true); - + mmu_command(MMU_CMD_C0); mmu_extruder = tmp_extruder; //filament change is finished if (*(strchr_pointer + index) == '?')// for single material usage with mmu diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 843f415c0..c644bdb72 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -162,6 +162,12 @@ void mmu_loop(void) mmu_printf_P(PSTR("T%d\n"), extruder); mmu_state = 3; // wait for response } + else if (mmu_cmd == MMU_CMD_C0) + { + printf_P(PSTR("MMU <= 'C0'\n")); + mmu_puts_P(PSTR("C0\n")); //send continue loading + mmu_state = 3; + } mmu_cmd = 0; } else if ((mmu_last_response + 1000) < millis()) //request every 1s @@ -188,7 +194,7 @@ void mmu_loop(void) case 3: //response to commands T0-T4 if (mmu_rx_ok() > 0) { - printf_P(PSTR("MMU => 'ok'\n"), mmu_finda); + printf_P(PSTR("MMU => 'ok'\n")); mmu_ready = true; mmu_state = 1; } @@ -395,6 +401,7 @@ void mmu_M600_load_filament(bool automatic) mmu_command(MMU_CMD_T0 + tmp_extruder); manage_response(false, true); + mmu_command(MMU_CMD_C0); mmu_extruder = tmp_extruder; //filament change is finished mmu_load_to_nozzle(); diff --git a/Firmware/mmu.h b/Firmware/mmu.h index 763c15ea8..144f2ef27 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -23,6 +23,7 @@ extern int16_t mmu_buildnr; #define MMU_CMD_T2 0x12 #define MMU_CMD_T3 0x13 #define MMU_CMD_T4 0x14 +#define MMU_CMD_C0 0x30 extern int mmu_puts_P(const char* str); From 46a3baac573bc027101ef39bf2e6c553f7814e68 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 24 Aug 2018 20:06:09 +0200 Subject: [PATCH 10/54] Add menu_item_edit_P specialization to be used for linearity correction. Works well, but costs about 600..700B of FLASH, needs to be optimized. --- Firmware/menu.cpp | 25 +++++++++++++++++++++++++ Firmware/menu.h | 2 +- Firmware/ultralcd.cpp | 9 ++++----- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index 493ff2605..a315f240f 100644 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -9,6 +9,7 @@ #include "Configuration.h" #include "Marlin.h" #include "ultralcd.h" +#include "language.h" @@ -269,6 +270,8 @@ const char menu_fmt_float31[] PROGMEM = "%c%.12S:%s%+06.1f"; const char menu_fmt_float13[] PROGMEM = "%c%.12S:%s%+06.3f"; +const char menu_fmt_float13off[] PROGMEM = "%c%.12S:%s%"; + template static void menu_draw_P(char chr, const char* str, int16_t val); @@ -305,6 +308,27 @@ void menu_draw_float13(char chr, const char* str, float val) lcd_printf_P(menu_fmt_float13, chr, str, spaces, val); } +template<> +void menu_draw_P(char chr, const char* str, int16_t val) +{ + menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); + int text_len = strlen_P(str); + if (text_len > 15) text_len = 15; + char spaces[21]; + strcpy_P(spaces, menu_20x_space); + spaces[12 - text_len] = 0; + float factor = 1.0 + static_cast(val) / 1000.0; + if (val == _md->minEditValue) + { + lcd_printf_P(menu_fmt_float13off, chr, str, spaces); + lcd_puts_P(_i(" [off]")); + } + else + { + lcd_printf_P(menu_fmt_float13, chr, str, spaces, factor); + } +} + template static void _menu_edit_P(void) { @@ -350,6 +374,7 @@ uint8_t menu_item_edit_P(const char* str, T pval, int16_t min_val, int16_t max_v } template uint8_t menu_item_edit_P(const char* str, int16_t *pval, int16_t min_val, int16_t max_val); +template uint8_t menu_item_edit_P(const char* str, uint8_t *pval, int16_t min_val, int16_t max_val); #undef _menu_data diff --git a/Firmware/menu.h b/Firmware/menu.h index f752b963b..73e4925a6 100644 --- a/Firmware/menu.h +++ b/Firmware/menu.h @@ -97,7 +97,7 @@ extern void menu_draw_float31(char chr, const char* str, float val); extern void menu_draw_float13(char chr, const char* str, float val); -#define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) do { if (menu_item_edit_P(str, pval, minval, maxval)) return; } while (0) +#define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) do { if (menu_item_edit_P(str, pval, minval, maxval)) return; } while (0) //#define MENU_ITEM_EDIT_int3_P(str, pval, minval, maxval) MENU_ITEM_EDIT(int3, str, pval, minval, maxval) template extern uint8_t menu_item_edit_P(const char* str, T pval, int16_t min_val, int16_t max_val); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 1417dd090..7997202f7 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4496,13 +4496,12 @@ void lcd_settings_linearity_correction_menu(void) // MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); #ifdef TMC2130_LINEARITY_CORRECTION_XYZ //tmc2130_wave_fac[X_AXIS] - int corr[4] = {tmc2130_wave_fac[X_AXIS], tmc2130_wave_fac[Y_AXIS], tmc2130_wave_fac[Z_AXIS], tmc2130_wave_fac[E_AXIS]}; - MENU_ITEM_EDIT_int3_P(_i("X-correct"), &corr[X_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 - MENU_ITEM_EDIT_int3_P(_i("Y-correct"), &corr[Y_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 - MENU_ITEM_EDIT_int3_P(_i("Z-correct"), &corr[Z_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 + MENU_ITEM_EDIT_int3_P(_i("X-correct"), &tmc2130_wave_fac[X_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 + MENU_ITEM_EDIT_int3_P(_i("Y-correct"), &tmc2130_wave_fac[Y_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 + MENU_ITEM_EDIT_int3_P(_i("Z-correct"), &tmc2130_wave_fac[Z_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 #endif //TMC2130_LINEARITY_CORRECTION_XYZ - MENU_ITEM_EDIT_int3_P(_i("E-correct"), &corr[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 + MENU_ITEM_EDIT_int3_P(_i("E-correct"), &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 MENU_END(); } From 32723d8d6f5bd516fbaa07f52e2dcf5b9da93bcc Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 24 Aug 2018 20:30:44 +0200 Subject: [PATCH 11/54] whitespace --- Firmware/mmu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/mmu.h b/Firmware/mmu.h index 156ee08ba..643cf29b8 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -28,7 +28,7 @@ extern int16_t mmu_buildnr; #define MMU_CMD_L2 0x22 #define MMU_CMD_L3 0x23 #define MMU_CMD_L4 0x24 -#define MMU_CMD_C0 0x30 +#define MMU_CMD_C0 0x30 extern int mmu_puts_P(const char* str); From df61172984a3eee287feea122abdd2cd20dd7cc0 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 24 Aug 2018 20:31:49 +0200 Subject: [PATCH 12/54] Fix linearity correction not saved and applied when menu was left by timeout. --- Firmware/ultralcd.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 7997202f7..ad357a4cd 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -123,7 +123,7 @@ static void lcd_control_temperature_preheat_pla_settings_menu(); static void lcd_control_temperature_preheat_abs_settings_menu(); static void lcd_control_motion_menu(); static void lcd_control_volumetric_menu(); -static void lcd_settings_linearity_correction_menu_back(); +static void lcd_settings_linearity_correction_menu_save(); static void prusa_stat_printerstatus(int _status); static void prusa_stat_farm_number(); @@ -4488,12 +4488,7 @@ void lcd_wizard(int state) { void lcd_settings_linearity_correction_menu(void) { MENU_BEGIN(); - if (menu_item_back_P(_T(MSG_MAIN))) - { - lcd_settings_linearity_correction_menu_back(); - return; - } -// MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); + MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); #ifdef TMC2130_LINEARITY_CORRECTION_XYZ //tmc2130_wave_fac[X_AXIS] @@ -4503,6 +4498,10 @@ void lcd_settings_linearity_correction_menu(void) #endif //TMC2130_LINEARITY_CORRECTION_XYZ MENU_ITEM_EDIT_int3_P(_i("E-correct"), &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 MENU_END(); + if(menu_leaving) + { + lcd_settings_linearity_correction_menu_save(); + } } static void lcd_settings_menu() @@ -4661,7 +4660,7 @@ static void lcd_ustep_linearity_menu_save() #endif //TMC2130 -static void lcd_settings_linearity_correction_menu_back() +static void lcd_settings_linearity_correction_menu_save() { #ifdef TMC2130 bool changed = false; @@ -4676,8 +4675,6 @@ static void lcd_settings_linearity_correction_menu_back() lcd_ustep_linearity_menu_save(); if (changed) tmc2130_init(); #endif //TMC2130 - menu_menu = lcd_settings_menu; -// lcd_main_menu(); } From 085c77effb2b70b0d7f847f32e9974cd8f398d70 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 24 Aug 2018 20:38:07 +0200 Subject: [PATCH 13/54] Fix when value edited, other values appeard as +1.000 instead of [off]. --- Firmware/menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index a315f240f..c73b28439 100644 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -318,7 +318,7 @@ void menu_draw_P(char chr, const char* str, int16_t val) strcpy_P(spaces, menu_20x_space); spaces[12 - text_len] = 0; float factor = 1.0 + static_cast(val) / 1000.0; - if (val == _md->minEditValue) + if (val <= _md->minEditValue) { lcd_printf_P(menu_fmt_float13off, chr, str, spaces); lcd_puts_P(_i(" [off]")); From ea88dea43243fa56d0daeee168e121054ddfc85c Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 24 Aug 2018 21:24:14 +0200 Subject: [PATCH 14/54] Fix memory overwrite. --- Firmware/menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index c73b28439..8ae30021e 100644 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -342,7 +342,7 @@ static void _menu_edit_P(void) } if (LCD_CLICKED) { - *((int*)(_md->editValue)) = (int)lcd_encoder; + *((T)(_md->editValue)) = lcd_encoder; menu_back_no_reset(); } } From 5fe6a3ed1c468b750e259c3fa1caf8e27b9b6db8 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 24 Aug 2018 22:04:48 +0200 Subject: [PATCH 15/54] Place similar functions together. --- Firmware/menu.cpp | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index 8ae30021e..bd5238269 100644 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -286,6 +286,27 @@ void menu_draw_P(char chr, const char* str, int16_t val) lcd_printf_P(menu_fmt_int3, chr, str, spaces, val); } +template<> +void menu_draw_P(char chr, const char* str, int16_t val) +{ + menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); + int text_len = strlen_P(str); + if (text_len > 15) text_len = 15; + char spaces[21]; + strcpy_P(spaces, menu_20x_space); + spaces[12 - text_len] = 0; + float factor = 1.0 + static_cast(val) / 1000.0; + if (val <= _md->minEditValue) + { + lcd_printf_P(menu_fmt_float13off, chr, str, spaces); + lcd_puts_P(_i(" [off]")); + } + else + { + lcd_printf_P(menu_fmt_float13, chr, str, spaces, factor); + } +} + //draw up to 12 chars of text, ':' and float number in format +123.0 void menu_draw_float31(char chr, const char* str, float val) { @@ -308,27 +329,6 @@ void menu_draw_float13(char chr, const char* str, float val) lcd_printf_P(menu_fmt_float13, chr, str, spaces, val); } -template<> -void menu_draw_P(char chr, const char* str, int16_t val) -{ - menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]); - int text_len = strlen_P(str); - if (text_len > 15) text_len = 15; - char spaces[21]; - strcpy_P(spaces, menu_20x_space); - spaces[12 - text_len] = 0; - float factor = 1.0 + static_cast(val) / 1000.0; - if (val <= _md->minEditValue) - { - lcd_printf_P(menu_fmt_float13off, chr, str, spaces); - lcd_puts_P(_i(" [off]")); - } - else - { - lcd_printf_P(menu_fmt_float13, chr, str, spaces, factor); - } -} - template static void _menu_edit_P(void) { From 1f5bece0dba8b18ae6e277ad75c184e8edc6dc18 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sat, 25 Aug 2018 16:15:35 +0200 Subject: [PATCH 16/54] check for required mmu2 firmware buildnr --- Firmware/mmu.cpp | 15 +++++++++++++++ Firmware/mmu.h | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 977c3fe14..0ffccc299 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -23,6 +23,7 @@ extern char choose_extruder_menu(); #define MMU_HWRESET #define MMU_RST_PIN 76 +#define MMU_REQUIRED_FW_BUILDNR 81 bool mmu_enabled = false; @@ -137,6 +138,9 @@ void mmu_loop(void) { fscanf_P(uart2io, PSTR("%u"), &mmu_buildnr); //scan buildnr from buffer printf_P(PSTR("MMU => '%dok'\n"), mmu_buildnr); + bool version_valid = mmu_check_version(); + if (!version_valid) mmu_show_warning(); + else puts_P(PSTR("MMU version valid")); puts_P(PSTR("MMU <= 'P0'")); mmu_puts_P(PSTR("P0\n")); //send 'read finda' request mmu_state = -4; @@ -826,3 +830,14 @@ void extr_unload_4() change_extr(4); extr_unload(); } + +bool mmu_check_version() +{ + return (mmu_buildnr >= MMU_REQUIRED_FW_BUILDNR); +} + +void mmu_show_warning() +{ + printf_P(PSTR("MMU2 firmware version invalid. Required version: build number %d or higher."), MMU_REQUIRED_FW_BUILDNR); + kill(_i("Please update firmware in your MMU2. Waiting for reset.")); +} diff --git a/Firmware/mmu.h b/Firmware/mmu.h index 643cf29b8..a24dc4ccf 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -80,3 +80,7 @@ extern void extr_unload_1(); extern void extr_unload_2(); extern void extr_unload_3(); extern void extr_unload_4(); + +extern bool mmu_check_version(); +extern void mmu_show_warning(); + From f3edd37d113cc5171ca3ff4613457c324ed1e15c Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sat, 25 Aug 2018 16:52:19 +0200 Subject: [PATCH 17/54] removing unretract --- Firmware/Marlin_main.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 6aea1214b..95f86c55e 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3139,11 +3139,6 @@ void gcode_M600(bool automatic, float x_position, float y_position, float z_shif //Move Z back plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED, active_extruder); st_synchronize(); - - //Unretract - current_position[E_AXIS]= current_position[E_AXIS] - e_shift; - plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_RFEED, active_extruder); - st_synchronize(); //Set E position to original plan_set_e_position(lastpos[E_AXIS]); From 0929a35a4f0542b18def68a95632efda56be5955 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sat, 25 Aug 2018 17:21:17 +0200 Subject: [PATCH 18/54] 5 minutes mmu timeout --- Firmware/mmu.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 94a19b9f3..05bf87046 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -19,6 +19,7 @@ extern char choose_extruder_menu(); #define MMU_TODELAY 100 #define MMU_TIMEOUT 10 +#define MMU_CMD_TIMEOUT 300000ul //milliseconds (5min timeout) #define MMU_HWRESET #define MMU_RST_PIN 76 @@ -187,7 +188,7 @@ void mmu_loop(void) if (mmu_cmd == 0) mmu_ready = true; } - else if ((mmu_last_request + 30000) < millis()) + else if ((mmu_last_request + MMU_CMD_TIMEOUT) < millis()) { //resend request after timeout (30s) mmu_state = 1; } @@ -199,7 +200,7 @@ void mmu_loop(void) mmu_ready = true; mmu_state = 1; } - else if ((mmu_last_request + 30000) < millis()) + else if ((mmu_last_request + MMU_CMD_TIMEOUT) < millis()) { //resend request after timeout (30s) mmu_state = 1; } From c57fdb11b7b7ad32941aaf487d291dfdf34869b6 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 26 Aug 2018 14:22:52 +0200 Subject: [PATCH 19/54] show active extruder: numbers corrected --- Firmware/ultralcd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index d07c90771..66372a002 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -530,9 +530,9 @@ void lcdui_print_extruder(void) { int chars = 0; if (mmu_extruder == tmp_extruder) - chars = lcd_printf_P(_N(" T%u"), mmu_extruder); + chars = lcd_printf_P(_N(" T%u"), mmu_extruder+1); else - chars = lcd_printf_P(_N(" %u>%u"), mmu_extruder, tmp_extruder); + chars = lcd_printf_P(_N(" %u>%u"), mmu_extruder+1, tmp_extruder+1); lcd_space(5 - chars); } From 2610547a481b3f7e0161cb8a8f380ec585baa2dc Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 26 Aug 2018 16:39:21 +0200 Subject: [PATCH 20/54] Fixed displayed filament after load --- Firmware/Marlin_main.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index dbf5c6765..c94ef5593 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3162,8 +3162,11 @@ void gcode_M701() { printf_P(PSTR("gcode_M701 begin\n")); - if (mmu_enabled) - extr_adj(mmu_extruder);//loads current extruder + if (mmu_enabled) + { + extr_adj(tmp_extruder);//loads current extruder + mmu_extruder = tmp_extruder; + } else { enable_z(); @@ -6744,7 +6747,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)) case 701: //M701: load filament { if (mmu_enabled && code_seen('E')) - mmu_extruder = code_value(); + tmp_extruder = code_value(); gcode_M701(); } break; From 5769b758ee53795228ea8344137b3b5185985e13 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 26 Aug 2018 16:50:28 +0200 Subject: [PATCH 21/54] max feedrate for stealth mode reduced to 100mm/s (because of loudness) --- Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index dbce6a962..4dec83550 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -100,7 +100,7 @@ //Silent mode limits #define SILENT_MAX_ACCEL_XY 960ul // max acceleration in silent mode in mm/s^2 -#define SILENT_MAX_FEEDRATE_XY 172 // max feedrate in mm/s +#define SILENT_MAX_FEEDRATE_XY 100 // max feedrate in mm/s //Normal mode limits #define NORMAL_MAX_ACCEL_XY 2500ul // max acceleration in normal mode in mm/s^2 From 4b1f1bc6a61054c5c5c725221006364147fbc449 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 26 Aug 2018 21:39:37 +0200 Subject: [PATCH 22/54] mmu timeout update: no need to press knob on printer to recover paused print --- Firmware/mmu.cpp | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 196455dbd..81e5e5ea6 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -19,7 +19,8 @@ extern char choose_extruder_menu(); #define MMU_TODELAY 100 #define MMU_TIMEOUT 10 -#define MMU_CMD_TIMEOUT 300000ul //milliseconds (5min timeout) +#define MMU_CMD_TIMEOUT 300000ul //5min timeout for mmu commands (except P0) +#define MMU_P0_TIMEOUT 3000ul //timeout for P0 command: 3seconds #define MMU_HWRESET #define MMU_RST_PIN 76 @@ -198,7 +199,7 @@ void mmu_loop(void) if (mmu_cmd == 0) mmu_ready = true; } - else if ((mmu_last_request + MMU_CMD_TIMEOUT) < millis()) + else if ((mmu_last_request + MMU_P0_TIMEOUT) < millis()) { //resend request after timeout (30s) mmu_state = 1; } @@ -211,7 +212,7 @@ void mmu_loop(void) mmu_state = 1; } else if ((mmu_last_request + MMU_CMD_TIMEOUT) < millis()) - { //resend request after timeout (30s) + { //resend request after timeout (5 min) mmu_state = 1; } return; @@ -307,7 +308,7 @@ void manage_response(bool move_axes, bool turn_off_nozzle) } st_synchronize(); mmu_print_saved = true; - + printf_P(PSTR("MMU not responding\n")); hotend_temp_bckp = degTargetHotend(active_extruder); if (move_axes) { z_position_bckp = current_position[Z_AXIS]; @@ -329,23 +330,28 @@ void manage_response(bool move_axes, bool turn_off_nozzle) 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(); - } } } - lcd_display_message_fullscreen_P(_i("Check MMU. Fix the issue and then press button on MMU unit.")); + lcd_display_message_fullscreen_P(_i("MMU needs user attention. Fix the issue and then press button on MMU unit.")); delay_keep_alive(1000); } else if (mmu_print_saved) { - printf_P(PSTR("MMU start responding\n")); - lcd_clear(); - lcd_display_message_fullscreen_P(_i("MMU OK. Resuming...")); + printf_P(PSTR("MMU starts responding\n")); + if (turn_off_nozzle) + { + lcd_clear(); + setTargetHotend(hotend_temp_bckp, active_extruder); + lcd_display_message_fullscreen_P(_i("MMU OK. Resuming temperature...")); + delay_keep_alive(3000); + while ((degTargetHotend(active_extruder) - degHotend(active_extruder)) > 5) + { + delay_keep_alive(1000); + lcd_wait_for_heater(); + } + } if (move_axes) { + lcd_clear(); + lcd_display_message_fullscreen_P(_i("MMU OK. Resuming position...")); 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); @@ -355,6 +361,8 @@ void manage_response(bool move_axes, bool turn_off_nozzle) st_synchronize(); } else { + lcd_clear(); + lcd_display_message_fullscreen_P(_i("MMU OK. Resuming...")); delay_keep_alive(1000); //delay just for showing MMU OK message for a while in case that there are no xyz movements } } From b13ff8e424bfd69291dc90714d05bd6d0129be82 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 26 Aug 2018 22:08:52 +0200 Subject: [PATCH 23/54] Wait for ok after U0 (unload current filament) command. --- Firmware/mmu.cpp | 9 +++++++-- Firmware/mmu.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 196455dbd..623574ae4 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -180,6 +180,12 @@ void mmu_loop(void) mmu_puts_P(PSTR("C0\n")); //send continue loading mmu_state = 3; } + else if (mmu_cmd == MMU_CMD_U0) + { + printf_P(PSTR("MMU <= 'U0'\n")); + mmu_puts_P(PSTR("U0\n")); //send continue loading + mmu_state = 3; + } mmu_cmd = 0; } else if ((mmu_last_response + 1000) < millis()) //request every 1s @@ -588,9 +594,8 @@ void extr_unload() current_position[E_AXIS] -= 80; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 2500 / 60, active_extruder); st_synchronize(); - printf_P(PSTR("U0\n")); - fprintf_P(uart2io, PSTR("U0\n")); + mmu_command(MMU_CMD_U0); // get response manage_response(false, true); diff --git a/Firmware/mmu.h b/Firmware/mmu.h index a24dc4ccf..05f8e3582 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -29,6 +29,7 @@ extern int16_t mmu_buildnr; #define MMU_CMD_L3 0x23 #define MMU_CMD_L4 0x24 #define MMU_CMD_C0 0x30 +#define MMU_CMD_U0 0x40 extern int mmu_puts_P(const char* str); From d3ed270a5a625a47bc568dd053f24bb0abc30614 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 26 Aug 2018 23:52:45 +0200 Subject: [PATCH 24/54] single material printer (no mmu unit) M600 hotfix: M600_check_state loop working --- Firmware/Marlin_main.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index dbf5c6765..231ff0e02 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -8843,8 +8843,7 @@ void M600_check_state() { //Wait for user to check the state lcd_change_fil_state = 0; - - while ((lcd_change_fil_state == 0)||(lcd_change_fil_state != 1)){ + while (lcd_change_fil_state != 1){ lcd_change_fil_state = 0; KEEPALIVE_STATE(PAUSED_FOR_USER); lcd_alright(); @@ -8871,7 +8870,7 @@ void M600_check_state() lcd_update_enable(true); break; } - } + } } void M600_wait_for_user() { @@ -9036,7 +9035,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)) fsensor_disable(); } #endif //FILAMENT_SENSOR - + lcd_update_enable(false); } #define FIL_LOAD_LENGTH 60 From ac3b92bade47223ef1be255caf75e6120d341be1 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 26 Aug 2018 23:55:29 +0200 Subject: [PATCH 25/54] commentary fix --- Firmware/mmu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 623574ae4..88be7f0e6 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -177,13 +177,13 @@ void mmu_loop(void) else if (mmu_cmd == MMU_CMD_C0) { printf_P(PSTR("MMU <= 'C0'\n")); - mmu_puts_P(PSTR("C0\n")); //send continue loading + mmu_puts_P(PSTR("C0\n")); //send 'continue loading' mmu_state = 3; } else if (mmu_cmd == MMU_CMD_U0) { printf_P(PSTR("MMU <= 'U0'\n")); - mmu_puts_P(PSTR("U0\n")); //send continue loading + mmu_puts_P(PSTR("U0\n")); //send 'unload current filament' mmu_state = 3; } mmu_cmd = 0; From ceb49d12621b127f5f64eb2156cc8ff4ce83e277 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 27 Aug 2018 04:21:43 +0200 Subject: [PATCH 26/54] finda filament runout: initial version --- Firmware/Marlin.h | 3 +++ Firmware/Marlin_main.cpp | 4 +++- Firmware/mmu.cpp | 11 ++++++++++- Firmware/planner.cpp | 17 +++++++++++++++++ Firmware/planner.h | 2 +- 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index c098b216d..1f51b6659 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -359,6 +359,9 @@ extern uint8_t print_percent_done_normal; extern uint32_t print_time_remaining_normal; extern uint8_t print_percent_done_silent; extern uint32_t print_time_remaining_silent; +extern uint16_t mcode_in_progress; +extern uint16_t gcode_in_progress; + #define PRINT_TIME_REMAINING_INIT 0xffffffff #define PRINT_PERCENT_DONE_INIT 0xff #define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == CUSTOM_MSG_TYPE_TEMCAL) || saved_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL) || card.paused || mmu_print_saved) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index dbf5c6765..8f4043a12 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3408,7 +3408,9 @@ void process_commands() } #endif //BACKLASH_Y #endif //TMC2130 - + else if (code_seen("FSENSOR_RECOVER")) { + fsensor_restore_print_and_continue(); + } else if(code_seen("PRUSA")){ if (code_seen("Ping")) { //PRUSA Ping if (farm_mode) { diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 196455dbd..86059592c 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -7,6 +7,8 @@ #include "uart2.h" #include "temperature.h" #include "Configuration_prusa.h" +#include "fsensor.h" +#include "cardreader.h" extern const char* lcd_display_message_fullscreen_P(const char *msg); @@ -16,6 +18,7 @@ extern void lcd_return_to_status(); extern void lcd_wait_for_heater(); extern char choose_extruder_menu(); +#define CHECK_FINDA ((IS_SD_PRINTING || is_usb_printing) && (mcode_in_progress != 600) && !saved_printing && e_active()) #define MMU_TODELAY 100 #define MMU_TIMEOUT 10 @@ -182,7 +185,7 @@ void mmu_loop(void) } mmu_cmd = 0; } - else if ((mmu_last_response + 1000) < millis()) //request every 1s + else if ((mmu_last_response + 800) < millis()) //request every 800ms { puts_P(PSTR("MMU <= 'P0'")); mmu_puts_P(PSTR("P0\n")); //send 'read finda' request @@ -194,6 +197,12 @@ void mmu_loop(void) { fscanf_P(uart2io, PSTR("%hhu"), &mmu_finda); //scan finda from buffer printf_P(PSTR("MMU => '%dok'\n"), mmu_finda); + //printf_P(PSTR("Eact: %d\n"), int(e_active())); + if (!mmu_finda && CHECK_FINDA) { + fsensor_stop_and_save_print(); + enquecommand_front_P(PSTR("FSENSOR_RECOVER")); //then recover + enquecommand_front_P(PSTR("M600")); //save print and run M600 command + } mmu_state = 1; if (mmu_cmd == 0) mmu_ready = true; diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index e89cbef8d..058fd2a9d 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -494,6 +494,23 @@ void getHighESpeed() } #endif +bool e_active() +{ + unsigned char e_active = 0; + block_t *block; + if(block_buffer_tail != block_buffer_head) + { + uint8_t block_index = block_buffer_tail; + while(block_index != block_buffer_head) + { + block = &block_buffer[block_index]; + if(block->steps_e.wide != 0) e_active++; + block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1); + } + } + return (e_active > 0) ? true : false ; +} + void check_axes_activity() { unsigned char x_active = 0; diff --git a/Firmware/planner.h b/Firmware/planner.h index 8d648c8e8..998a3595b 100644 --- a/Firmware/planner.h +++ b/Firmware/planner.h @@ -154,7 +154,7 @@ void plan_set_position(float x, float y, float z, const float &e); void plan_set_z_position(const float &z); void plan_set_e_position(const float &e); - +extern bool e_active(); void check_axes_activity(); From 03fffae4c3fae09ef3ae6462f8491475b5394b36 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 27 Aug 2018 05:20:42 +0200 Subject: [PATCH 27/54] finda runout sensor can be turned on/off from menu --- Firmware/Marlin_main.cpp | 81 ++++++++++++++++++++++------------------ Firmware/mmu.cpp | 2 +- Firmware/stepper.cpp | 26 +++++++++---- Firmware/ultralcd.cpp | 76 ++++++++++++++++++++++--------------- 4 files changed, 110 insertions(+), 75 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 8f4043a12..a55c48251 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1962,8 +1962,8 @@ void loop() checkHitEndstops(); lcd_update(0); #ifdef FILAMENT_SENSOR - if (mcode_in_progress != 600) //M600 not in progress - fsensor_update(); + if (mcode_in_progress != 600 && !mmu_enabled) //M600 not in progress + fsensor_update(); #endif //FILAMENT_SENSOR #ifdef TMC2130 tmc2130_check_overtemp(); @@ -3170,7 +3170,10 @@ void gcode_M701() custom_message_type = CUSTOM_MSG_TYPE_F_LOAD; #ifdef FILAMENT_SENSOR - fsensor_oq_meassure_start(40); + if (mmu_enabled == false) + { + fsensor_oq_meassure_start(40); + } #endif //FILAMENT_SENSOR lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT)); @@ -3212,15 +3215,18 @@ void gcode_M701() custom_message_type = CUSTOM_MSG_TYPE_STATUS; #ifdef FILAMENT_SENSOR - fsensor_oq_meassure_stop(); - - if (!fsensor_oq_result()) + if (mmu_enabled == false) { - bool disable = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Fil. sensor response is poor, disable it?"), false, true); - lcd_update_enable(true); - lcd_update(2); - if (disable) - fsensor_disable(); + fsensor_oq_meassure_stop(); + + if (!fsensor_oq_result()) + { + bool disable = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Fil. sensor response is poor, disable it?"), false, true); + lcd_update_enable(true); + lcd_update(2); + if (disable) + fsensor_disable(); + } } #endif //FILAMENT_SENSOR } @@ -7303,38 +7309,41 @@ static void handleSafetyTimer() void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument set in Marlin.h { #ifdef FILAMENT_SENSOR - if (mcode_in_progress != 600) //M600 not in progress + if (mmu_enabled == false) { - if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LCD_COMMAND_V2_CAL)) + if (mcode_in_progress != 600) //M600 not in progress { - if (fsensor_check_autoload()) + if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LCD_COMMAND_V2_CAL)) { - fsensor_autoload_check_stop(); - if (degHotend0() > EXTRUDE_MINTEMP) + if (fsensor_check_autoload()) { -if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)) - tone(BEEPER, 1000); - delay_keep_alive(50); - noTone(BEEPER); - loading_flag = true; - enquecommand_front_P((PSTR("M701"))); - } - else - { - lcd_update_enable(false); - lcd_clear(); - lcd_set_cursor(0, 0); - lcd_puts_P(_T(MSG_ERROR)); - lcd_set_cursor(0, 2); - lcd_puts_P(_T(MSG_PREHEAT_NOZZLE)); - delay(2000); - lcd_clear(); - lcd_update_enable(true); + fsensor_autoload_check_stop(); + if (degHotend0() > EXTRUDE_MINTEMP) + { + if ((eSoundMode == e_SOUND_MODE_LOUD) || (eSoundMode == e_SOUND_MODE_ONCE)) + tone(BEEPER, 1000); + delay_keep_alive(50); + noTone(BEEPER); + loading_flag = true; + enquecommand_front_P((PSTR("M701"))); + } + else + { + lcd_update_enable(false); + lcd_clear(); + lcd_set_cursor(0, 0); + lcd_puts_P(_T(MSG_ERROR)); + lcd_set_cursor(0, 2); + lcd_puts_P(_T(MSG_PREHEAT_NOZZLE)); + delay(2000); + lcd_clear(); + lcd_update_enable(true); + } } } + else + fsensor_autoload_check_stop(); } - else - fsensor_autoload_check_stop(); } #endif //FILAMENT_SENSOR diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 86059592c..8918925b4 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -198,7 +198,7 @@ void mmu_loop(void) fscanf_P(uart2io, PSTR("%hhu"), &mmu_finda); //scan finda from buffer printf_P(PSTR("MMU => '%dok'\n"), mmu_finda); //printf_P(PSTR("Eact: %d\n"), int(e_active())); - if (!mmu_finda && CHECK_FINDA) { + if (!mmu_finda && CHECK_FINDA && fsensor_enabled) { fsensor_stop_and_save_print(); enquecommand_front_P(PSTR("FSENSOR_RECOVER")); //then recover enquecommand_front_P(PSTR("M600")); //save print and run M600 command diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp index e1eaf67e5..45175c028 100644 --- a/Firmware/stepper.cpp +++ b/Firmware/stepper.cpp @@ -41,6 +41,8 @@ int fsensor_counter = 0; //counter for e-steps #endif //FILAMENT_SENSOR +#include "mmu.h" + #ifdef DEBUG_STACK_MONITOR uint16_t SP_min = 0x21FF; #endif //DEBUG_STACK_MONITOR @@ -470,8 +472,11 @@ FORCE_INLINE void stepper_next_block() #endif #ifdef FILAMENT_SENSOR - fsensor_counter = 0; - fsensor_st_block_begin(current_block); + if (mmu_enabled == false) + { + fsensor_counter = 0; + fsensor_st_block_begin(current_block); + } #endif //FILAMENT_SENSOR // The busy flag is set by the plan_get_current_block() call. // current_block->busy = true; @@ -901,7 +906,10 @@ FORCE_INLINE void isr() { if (step_loops < estep_loops) estep_loops = step_loops; #ifdef FILAMENT_SENSOR - fsensor_counter += estep_loops; + if (mmu_enabled == false) + { + fsensor_counter += estep_loops; + } #endif //FILAMENT_SENSOR do { WRITE_NC(E0_STEP_PIN, !INVERT_E_STEP_PIN); @@ -1027,7 +1035,9 @@ FORCE_INLINE void isr() { // There is not enough time to fit even a single additional tick. // Tick all the extruder ticks now. #ifdef FILAMENT_SENSOR - fsensor_counter += e_steps; + if (mmu_enabled == false) { + fsensor_counter += e_steps; + } #endif //FILAMENT_SENSOR MSerial.checkRx(); // Check for serial chars. do { @@ -1049,15 +1059,17 @@ FORCE_INLINE void isr() { // If current block is finished, reset pointer if (step_events_completed.wide >= current_block->step_event_count.wide) { #ifdef FILAMENT_SENSOR - fsensor_st_block_chunk(current_block, fsensor_counter); - fsensor_counter = 0; + if (mmu_enabled == false) { + fsensor_st_block_chunk(current_block, fsensor_counter); + fsensor_counter = 0; + } #endif //FILAMENT_SENSOR current_block = NULL; plan_discard_current_block(); } #ifdef FILAMENT_SENSOR - else if (fsensor_counter >= fsensor_chunk_len) + else if ((fsensor_counter >= fsensor_chunk_len) && (mmu_enabled == false)) { fsensor_st_block_chunk(current_block, fsensor_counter); fsensor_counter = 0; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index d07c90771..a0db0330e 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1882,20 +1882,22 @@ static void lcd_menu_extruder_info() // Shutter register is an index of LASER shutter time. It is automatically controlled by the chip's internal // auto-exposure algorithm. When the chip is tracking on a good reflection surface, the Shutter is small. // When the chip is tracking on a poor reflection surface, the Shutter is large. Value ranges from 0 to 46. - - if (!fsensor_enabled) - lcd_puts_P(_N("Filament sensor\n" "is disabled.")); - else + if (mmu_enabled == false) { - if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LCD_COMMAND_V2_CAL)) - pat9125_update(); - lcd_printf_P(_N( - "Fil. Xd:%3d Yd:%3d\n" - "Int: %3d Shut: %3d" - ), - pat9125_x, pat9125_y, - pat9125_b, pat9125_s - ); + if (!fsensor_enabled) + lcd_puts_P(_N("Filament sensor\n" "is disabled.")); + else + { + if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LCD_COMMAND_V2_CAL)) + pat9125_update(); + lcd_printf_P(_N( + "Fil. Xd:%3d Yd:%3d\n" + "Int: %3d Shut: %3d" + ), + pat9125_x, pat9125_y, + pat9125_b, pat9125_s + ); + } } #endif //FILAMENT_SENSOR @@ -4040,15 +4042,16 @@ static void lcd_crash_mode_set() static void lcd_fsensor_state_set() { FSensorStateMenu = !FSensorStateMenu; //set also from fsensor_enable() and fsensor_disable() - if (!FSensorStateMenu) { - fsensor_disable(); - if (fsensor_autoload_enabled) - menu_submenu(lcd_filament_autoload_info); - }else{ - fsensor_enable(); - if (fsensor_not_responding) - menu_submenu(lcd_fsensor_fail); - } + if (!FSensorStateMenu) { + fsensor_disable(); + if (fsensor_autoload_enabled && !mmu_enabled) + menu_submenu(lcd_filament_autoload_info); + } + else { + fsensor_enable(); + if (fsensor_not_responding && !mmu_enabled) + menu_submenu(lcd_fsensor_fail); + } } #endif //FILAMENT_SENSOR @@ -4546,17 +4549,23 @@ static void lcd_settings_menu() { // Filament sensor turned off, working, no problems MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_OFF), lcd_fsensor_state_set); - MENU_ITEM_SUBMENU_P(_T(MSG_FSENS_AUTOLOAD_NA), lcd_filament_autoload_info); + if (mmu_enabled == false) + { + MENU_ITEM_SUBMENU_P(_T(MSG_FSENS_AUTOLOAD_NA), lcd_filament_autoload_info); + } } } else { // Filament sensor turned on, working, no problems MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_ON), lcd_fsensor_state_set); - if (fsensor_autoload_enabled) - MENU_ITEM_FUNCTION_P(_i("F. autoload [on]"), lcd_set_filament_autoload);////MSG_FSENS_AUTOLOAD_ON c=17 r=1 - else - MENU_ITEM_FUNCTION_P(_i("F. autoload [off]"), lcd_set_filament_autoload);////MSG_FSENS_AUTOLOAD_OFF c=17 r=1 + if (mmu_enabled == false) + { + if (fsensor_autoload_enabled) + MENU_ITEM_FUNCTION_P(_i("F. autoload [on]"), lcd_set_filament_autoload);////MSG_FSENS_AUTOLOAD_ON c=17 r=1 + else + MENU_ITEM_FUNCTION_P(_i("F. autoload [off]"), lcd_set_filament_autoload);////MSG_FSENS_AUTOLOAD_OFF c=17 r=1 + } } #endif //FILAMENT_SENSOR @@ -5558,7 +5567,7 @@ static void lcd_main_menu() else { #ifdef FILAMENT_SENSOR - if ( ((fsensor_autoload_enabled == true) && (fsensor_enabled == true))) + if ((fsensor_autoload_enabled == true) && (fsensor_enabled == true) && (mmu_enabled == false)) MENU_ITEM_SUBMENU_P(_i("AutoLoad filament"), lcd_menu_AutoLoadFilament);////MSG_AUTOLOAD_FILAMENT c=17 r=0 else #endif //FILAMENT_SENSOR @@ -6079,14 +6088,19 @@ bool lcd_selftest() { _progress = lcd_selftest_screen(8, _progress, 3, true, 2000); //bed ok #ifdef FILAMENT_SENSOR - _progress = lcd_selftest_screen(9, _progress, 3, true, 2000); //check filaments sensor - _result = lcd_selftest_fsensor(); + if (mmu_enabled == false) { + _progress = lcd_selftest_screen(9, _progress, 3, true, 2000); //check filaments sensor + _result = lcd_selftest_fsensor(); + } #endif // FILAMENT_SENSOR } if (_result) { #ifdef FILAMENT_SENSOR - _progress = lcd_selftest_screen(10, _progress, 3, true, 2000); //fil sensor OK + if (mmu_enabled == false) + { + _progress = lcd_selftest_screen(10, _progress, 3, true, 2000); //fil sensor OK + } #endif // FILAMENT_SENSOR _progress = lcd_selftest_screen(11, _progress, 3, true, 5000); //all correct } From 2b32b419697e743f3bd355da657166098af27d88 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 27 Aug 2018 05:53:39 +0200 Subject: [PATCH 28/54] MK2.5 build error hotfix --- Firmware/ultralcd.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 37114398c..08490dbcc 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4496,6 +4496,7 @@ void lcd_settings_linearity_correction_menu(void) { MENU_BEGIN(); MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); +#ifdef TMC2130 #ifdef TMC2130_LINEARITY_CORRECTION_XYZ //tmc2130_wave_fac[X_AXIS] @@ -4504,6 +4505,7 @@ void lcd_settings_linearity_correction_menu(void) MENU_ITEM_EDIT_int3_P(_i("Z-correct"), &tmc2130_wave_fac[Z_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 #endif //TMC2130_LINEARITY_CORRECTION_XYZ MENU_ITEM_EDIT_int3_P(_i("E-correct"), &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 +#endif MENU_END(); if(menu_leaving) { From f02b0d80e3a8e7631b469d6305d21b6efc4b6d46 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 10 Aug 2018 15:19:35 +0200 Subject: [PATCH 29/54] Split settings menu into separate macros. --- Firmware/ultralcd.cpp | 254 ++++++++++++++++++++++++++---------------- 1 file changed, 156 insertions(+), 98 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 37114398c..63affbaf8 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4511,6 +4511,154 @@ void lcd_settings_linearity_correction_menu(void) } } +#ifdef FILAMENT_SENSOR +#define SETTINGS_FILAMENT_SENSOR \ +do\ +{\ + if (FSensorStateMenu == 0)\ + {\ + if (fsensor_not_responding)\ + {\ + /* Filament sensor not working*/\ + MENU_ITEM_FUNCTION_P(_i("Fil. sensor [N/A]"), lcd_fsensor_state_set);/*////MSG_FSENSOR_NA c=0 r=0*/\ + MENU_ITEM_SUBMENU_P(_T(MSG_FSENS_AUTOLOAD_NA), lcd_fsensor_fail);\ + }\ + else\ + {\ + /* Filament sensor turned off, working, no problems*/\ + MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_OFF), lcd_fsensor_state_set);\ + if (mmu_enabled == false)if (mmu_enabled == false)\ + {\ + MENU_ITEM_SUBMENU_P(_T(MSG_FSENS_AUTOLOAD_NA), lcd_filament_autoload_info);\ + }\ + }\ + }\ + else\ + {\ + /* Filament sensor turned on, working, no problems*/\ + MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_ON), lcd_fsensor_state_set);\ + if (mmu_enabled == false)\ + {\ + if (fsensor_autoload_enabled)\ + MENU_ITEM_FUNCTION_P(_i("F. autoload [on]"), lcd_set_filament_autoload);/*////MSG_FSENS_AUTOLOAD_ON c=17 r=1*/\ + else\ + MENU_ITEM_FUNCTION_P(_i("F. autoload [off]"), lcd_set_filament_autoload);/*////MSG_FSENS_AUTOLOAD_OFF c=17 r=1*/\ + }\ + }\ +}\ +while(0) + +#else //FILAMENT_SENSOR +#define SETTINGS_FILAMENT_SENSOR do{}while(0) +#endif //FILAMENT_SENSOR + +#ifdef TMC2130 +#define SETTINGS_SILENT_MODE \ +do\ +{\ + if(!farm_mode)\ + {\ + if (SilentModeMenu == SILENT_MODE_NORMAL)\ + {\ + MENU_ITEM_FUNCTION_P(_T(MSG_STEALTH_MODE_OFF), lcd_silent_mode_set);\ + }\ + else MENU_ITEM_FUNCTION_P(_T(MSG_STEALTH_MODE_ON), lcd_silent_mode_set);\ + if (SilentModeMenu == SILENT_MODE_NORMAL)\ + {\ + if (CrashDetectMenu == 0)\ + {\ + MENU_ITEM_FUNCTION_P(_T(MSG_CRASHDETECT_OFF), lcd_crash_mode_set);\ + }\ + else MENU_ITEM_FUNCTION_P(_T(MSG_CRASHDETECT_ON), lcd_crash_mode_set);\ + }\ + else MENU_ITEM_SUBMENU_P(_T(MSG_CRASHDETECT_NA), lcd_crash_mode_info);\ + }\ +}\ +while (0) + +#else //TMC2130 +#define SETTINGS_SILENT_MODE \ +do\ +{\ + if(!farm_mode)\ + {\ + switch (SilentModeMenu)\ + {\ + case SILENT_MODE_POWER:\ + MENU_ITEM_FUNCTION_P(_T(MSG_SILENT_MODE_OFF), lcd_silent_mode_set);\ + break;\ + case SILENT_MODE_SILENT:\ + MENU_ITEM_FUNCTION_P(_T(MSG_SILENT_MODE_ON), lcd_silent_mode_set);\ + break;\ + case SILENT_MODE_AUTO:\ + MENU_ITEM_FUNCTION_P(_T(MSG_AUTO_MODE_ON), lcd_silent_mode_set);\ + break;\ + default:\ + MENU_ITEM_FUNCTION_P(_T(MSG_SILENT_MODE_OFF), lcd_silent_mode_set);\ + break; /* (probably) not needed*/\ + }\ + }\ +}\ +while (0) +#endif //TMC2130 + +#ifdef SDCARD_SORT_ALPHA +#define SETTINGS_SD \ +do\ +{\ + if (card.ToshibaFlashAir_isEnabled())\ + MENU_ITEM_FUNCTION_P(_i("SD card [flshAir]"), lcd_toshiba_flash_air_compatibility_toggle);/*////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1*/\ + else\ + MENU_ITEM_FUNCTION_P(_i("SD card [normal]"), lcd_toshiba_flash_air_compatibility_toggle);/*////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1*/\ +\ + if (!farm_mode)\ + {\ + uint8_t sdSort;\ + EEPROM_read(EEPROM_SD_SORT, (uint8_t*)&sdSort, sizeof(sdSort));\ + switch (sdSort)\ + {\ + case SD_SORT_TIME: MENU_ITEM_FUNCTION_P(_i("Sort: [time]"), lcd_sort_type_set); break;/*////MSG_SORT_TIME c=17 r=1*/\ + case SD_SORT_ALPHA: MENU_ITEM_FUNCTION_P(_i("Sort: [alphabet]"), lcd_sort_type_set); break;/*////MSG_SORT_ALPHA c=17 r=1*/\ + default: MENU_ITEM_FUNCTION_P(_i("Sort: [none]"), lcd_sort_type_set);/*////MSG_SORT_NONE c=17 r=1*/\ + }\ + }\ +}\ +while (0) +#else // SDCARD_SORT_ALPHA +#define SETTINGS_SD \ +do\ +{\ + if (card.ToshibaFlashAir_isEnabled())\ + MENU_ITEM_FUNCTION_P(_i("SD card [flshAir]"), lcd_toshiba_flash_air_compatibility_toggle);/*////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1*/\ + else\ + MENU_ITEM_FUNCTION_P(_i("SD card [normal]"), lcd_toshiba_flash_air_compatibility_toggle);/*////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1*/\ +}\ +while (0) +#endif // SDCARD_SORT_ALPHA + +#define SETTINGS_SOUND \ +do\ +{\ + switch(eSoundMode)\ + {\ + case e_SOUND_MODE_LOUD:\ + MENU_ITEM_FUNCTION_P(_i(MSG_SOUND_MODE_LOUD),lcd_sound_state_set);\ + break;\ + case e_SOUND_MODE_ONCE:\ + MENU_ITEM_FUNCTION_P(_i(MSG_SOUND_MODE_ONCE),lcd_sound_state_set);\ + break;\ + case e_SOUND_MODE_SILENT:\ + MENU_ITEM_FUNCTION_P(_i(MSG_SOUND_MODE_SILENT),lcd_sound_state_set);\ + break;\ + case e_SOUND_MODE_MUTE:\ + MENU_ITEM_FUNCTION_P(_i(MSG_SOUND_MODE_MUTE),lcd_sound_state_set);\ + break;\ + default:\ + MENU_ITEM_FUNCTION_P(_i(MSG_SOUND_MODE_LOUD),lcd_sound_state_set);\ + }\ +}\ +while (0) + static void lcd_settings_menu() { EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); @@ -4519,76 +4667,22 @@ static void lcd_settings_menu() MENU_ITEM_SUBMENU_P(_i("Temperature"), lcd_control_temperature_menu);////MSG_TEMPERATURE c=0 r=0 if (!homing_flag) - MENU_ITEM_SUBMENU_P(_i("Move axis"), lcd_move_menu_1mm);////MSG_MOVE_AXIS c=0 r=0 + MENU_ITEM_SUBMENU_P(_i("Move axis"), lcd_move_menu_1mm);////MSG_MOVE_AXIS c=0 r=0 if (!isPrintPaused) - MENU_ITEM_GCODE_P(_i("Disable steppers"), PSTR("M84"));////MSG_DISABLE_STEPPERS c=0 r=0 + MENU_ITEM_GCODE_P(_i("Disable steppers"), PSTR("M84"));////MSG_DISABLE_STEPPERS c=0 r=0 -#ifndef TMC2130 - if (!farm_mode) - { //dont show in menu if we are in farm mode - switch (SilentModeMenu) - { - case SILENT_MODE_POWER: MENU_ITEM_FUNCTION_P(_T(MSG_SILENT_MODE_OFF), lcd_silent_mode_set); break; - case SILENT_MODE_SILENT: MENU_ITEM_FUNCTION_P(_T(MSG_SILENT_MODE_ON), lcd_silent_mode_set); break; - case SILENT_MODE_AUTO: MENU_ITEM_FUNCTION_P(_T(MSG_AUTO_MODE_ON), lcd_silent_mode_set); break; - default: MENU_ITEM_FUNCTION_P(_T(MSG_SILENT_MODE_OFF), lcd_silent_mode_set); break; // (probably) not needed - } - } -#endif //TMC2130 - -#ifdef FILAMENT_SENSOR - if (FSensorStateMenu == 0) - { - if (fsensor_not_responding) - { - // Filament sensor not working - MENU_ITEM_FUNCTION_P(_i("Fil. sensor [N/A]"), lcd_fsensor_state_set);////MSG_FSENSOR_NA c=0 r=0 - MENU_ITEM_SUBMENU_P(_T(MSG_FSENS_AUTOLOAD_NA), lcd_fsensor_fail); - } - else - { - // Filament sensor turned off, working, no problems - MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_OFF), lcd_fsensor_state_set); - if (mmu_enabled == false) - { - MENU_ITEM_SUBMENU_P(_T(MSG_FSENS_AUTOLOAD_NA), lcd_filament_autoload_info); - } - } - } - else - { - // Filament sensor turned on, working, no problems - MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_ON), lcd_fsensor_state_set); - if (mmu_enabled == false) - { - if (fsensor_autoload_enabled) - MENU_ITEM_FUNCTION_P(_i("F. autoload [on]"), lcd_set_filament_autoload);////MSG_FSENS_AUTOLOAD_ON c=17 r=1 - else - MENU_ITEM_FUNCTION_P(_i("F. autoload [off]"), lcd_set_filament_autoload);////MSG_FSENS_AUTOLOAD_OFF c=17 r=1 - } - } -#endif //FILAMENT_SENSOR + SETTINGS_FILAMENT_SENSOR; if (fans_check_enabled == true) MENU_ITEM_FUNCTION_P(_i("Fans check [on]"), lcd_set_fan_check);////MSG_FANS_CHECK_ON c=17 r=1 else MENU_ITEM_FUNCTION_P(_i("Fans check [off]"), lcd_set_fan_check);////MSG_FANS_CHECK_OFF c=17 r=1 -#ifdef TMC2130 - if(!farm_mode) - { - if (SilentModeMenu == SILENT_MODE_NORMAL) { MENU_ITEM_FUNCTION_P(_T(MSG_STEALTH_MODE_OFF), lcd_silent_mode_set); } - else MENU_ITEM_FUNCTION_P(_T(MSG_STEALTH_MODE_ON), lcd_silent_mode_set); - if (SilentModeMenu == SILENT_MODE_NORMAL) - { - if (CrashDetectMenu == 0) { MENU_ITEM_FUNCTION_P(_T(MSG_CRASHDETECT_OFF), lcd_crash_mode_set); } - else MENU_ITEM_FUNCTION_P(_T(MSG_CRASHDETECT_ON), lcd_crash_mode_set); - } - else MENU_ITEM_SUBMENU_P(_T(MSG_CRASHDETECT_NA), lcd_crash_mode_info); - } + SETTINGS_SILENT_MODE; +#if defined (TMC2130) && defined (LINEARITY_CORRECTION) MENU_ITEM_SUBMENU_P(_i("Lin. correction"), lcd_settings_linearity_correction_menu); -#endif //TMC2130 +#endif //LINEARITY_CORRECTION && TMC2130 if (temp_cal_active == false) MENU_ITEM_FUNCTION_P(_i("Temp. cal. [off]"), lcd_temp_calibration_set);////MSG_TEMP_CALIBRATION_OFF c=20 r=1 @@ -4609,45 +4703,9 @@ static void lcd_settings_menu() MENU_ITEM_SUBMENU_P(_i("Select language"), lcd_language_menu);////MSG_LANGUAGE_SELECT c=0 r=0 #endif //(LANG_MODE != 0) - if (card.ToshibaFlashAir_isEnabled()) - MENU_ITEM_FUNCTION_P(_i("SD card [flshAir]"), lcd_toshiba_flash_air_compatibility_toggle);////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1 - else - MENU_ITEM_FUNCTION_P(_i("SD card [normal]"), lcd_toshiba_flash_air_compatibility_toggle);////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1 + SETTINGS_SD; + SETTINGS_SOUND; -#ifdef SDCARD_SORT_ALPHA - if (!farm_mode) - { - uint8_t sdSort; - EEPROM_read(EEPROM_SD_SORT, (uint8_t*)&sdSort, sizeof(sdSort)); - switch (sdSort) - { - case SD_SORT_TIME: MENU_ITEM_FUNCTION_P(_i("Sort: [time]"), lcd_sort_type_set); break;////MSG_SORT_TIME c=17 r=1 - case SD_SORT_ALPHA: MENU_ITEM_FUNCTION_P(_i("Sort: [alphabet]"), lcd_sort_type_set); break;////MSG_SORT_ALPHA c=17 r=1 - default: MENU_ITEM_FUNCTION_P(_i("Sort: [none]"), lcd_sort_type_set);////MSG_SORT_NONE c=17 r=1 - } - } -#endif // SDCARD_SORT_ALPHA - - -//-// -switch(eSoundMode) - { - case e_SOUND_MODE_LOUD: - MENU_ITEM_FUNCTION_P(_i(MSG_SOUND_MODE_LOUD),lcd_sound_state_set); - break; - case e_SOUND_MODE_ONCE: - MENU_ITEM_FUNCTION_P(_i(MSG_SOUND_MODE_ONCE),lcd_sound_state_set); - break; - case e_SOUND_MODE_SILENT: - MENU_ITEM_FUNCTION_P(_i(MSG_SOUND_MODE_SILENT),lcd_sound_state_set); - break; - case e_SOUND_MODE_MUTE: - MENU_ITEM_FUNCTION_P(_i(MSG_SOUND_MODE_MUTE),lcd_sound_state_set); - break; - default: - MENU_ITEM_FUNCTION_P(_i(MSG_SOUND_MODE_LOUD),lcd_sound_state_set); - } -//-// if (farm_mode) { MENU_ITEM_SUBMENU_P(PSTR("Farm number"), lcd_farm_no); From 191e5dfddda1b8f679bfccb5484b9a71c7471243 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 27 Aug 2018 16:12:10 +0200 Subject: [PATCH 30/54] mmu M600: dont use change extruder posibility; unload starts always imidiately --- Firmware/Marlin_main.cpp | 2 +- Firmware/mmu.cpp | 44 +++++++++++++++++++++++++++++++++++++++- Firmware/mmu.h | 2 +- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index e9fea8c25..bbcbeff59 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3097,7 +3097,7 @@ void gcode_M600(bool automatic, float x_position, float y_position, float z_shif st_synchronize(); //Beep, manage nozzle heater and wait for user to start unload filament - if(!automatic) M600_wait_for_user(); + if(!mmu_enabled) M600_wait_for_user(); lcd_change_fil_state = 0; diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 73caf79db..b402c102a 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -9,6 +9,7 @@ #include "Configuration_prusa.h" #include "fsensor.h" #include "cardreader.h" +#include "sound.h" extern const char* lcd_display_message_fullscreen_P(const char *msg); @@ -410,6 +411,43 @@ void mmu_load_to_nozzle() if (!saved_e_relative_mode) axis_relative_modes[E_AXIS] = false; } +void mmu_M600_wait_and_beep() { + //Beep and wait for user to remove old filament and prepare new filament for load + + KEEPALIVE_STATE(PAUSED_FOR_USER); + + int counterBeep = 0; + lcd_display_message_fullscreen_P(_i("Remove old filament and press the knob to start loading new filament.")); + bool bFirst=true; + + while (!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)||((eSoundMode==e_SOUND_MODE_ONCE)&&bFirst)) + { + bFirst=false; + WRITE(BEEPER, HIGH); + } + } + if (counterBeep == 20) { + WRITE(BEEPER, LOW); + } + + counterBeep++; + #endif //BEEPER > 0 + + delay_keep_alive(4); + } + WRITE(BEEPER, LOW); +} + void mmu_M600_load_filament(bool automatic) { //load filament for mmu v2 @@ -417,10 +455,14 @@ void mmu_M600_load_filament(bool automatic) bool response = false; bool yes = false; if (!automatic) { + mmu_M600_wait_and_beep(); +#ifdef MMU_M600_SWITCH_EXTRUDER yes = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Do you want to switch extruder?"), false); if(yes) tmp_extruder = choose_extruder_menu(); else tmp_extruder = mmu_extruder; - +#else + tmp_extruder = mmu_extruder; +#endif //MMU_M600_SWITCH_EXTRUDER } else { tmp_extruder = (tmp_extruder+1)%5; diff --git a/Firmware/mmu.h b/Firmware/mmu.h index 05f8e3582..e7ad6030b 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -56,7 +56,7 @@ extern void manage_response(bool move_axes, bool turn_off_nozzle); extern void mmu_load_to_nozzle(); extern void mmu_M600_load_filament(bool automatic); - +extern void mmu_M600_wait_and_beep(); extern void extr_mov(float shift, float feed_rate); extern void change_extr(int extr); From 8279aba4d7b03b2c4d5698f4da0103da2c2ec3d5 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 10 Aug 2018 16:10:49 +0200 Subject: [PATCH 31/54] Add auto deplete setting. --- Firmware/eeprom.h | 1 + Firmware/ultralcd.cpp | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index 28498f139..54a216488 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -144,6 +144,7 @@ // Sound Mode //#define EEPROM_SOUND_MODE (EEPROM_EXTRUDEMULTIPLY-1) // uint8 #define EEPROM_SOUND_MODE (EEPROM_UVLO_TINY_Z_MICROSTEPS-1) // uint8 +#define EEPROM_AUTO_DEPLETE (EEPROM_SOUND_MODE-1) //bool // !!!!! // !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!! diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 63affbaf8..e3a38aa97 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -88,6 +88,7 @@ unsigned long display_time; //just timer for showing pid finished message on lcd float pid_temp = DEFAULT_PID_TEMP; static bool forceMenuExpire = false; +static bool autoDeplete; static float manual_feedrate[] = MANUAL_FEEDRATE; @@ -4659,6 +4660,11 @@ do\ }\ while (0) +static void auto_deplete_switch() +{ + autoDeplete = !autoDeplete; + eeprom_update_byte((unsigned char *)EEPROM_AUTO_DEPLETE, autoDeplete); +} static void lcd_settings_menu() { EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); @@ -4673,6 +4679,9 @@ static void lcd_settings_menu() SETTINGS_FILAMENT_SENSOR; + if (autoDeplete) MENU_ITEM_FUNCTION_P(_i("Auto deplete [on]"), auto_deplete_switch); + else MENU_ITEM_FUNCTION_P(_i("Auto deplete[off]"), auto_deplete_switch); + if (fans_check_enabled == true) MENU_ITEM_FUNCTION_P(_i("Fans check [on]"), lcd_set_fan_check);////MSG_FANS_CHECK_ON c=17 r=1 else @@ -7056,6 +7065,12 @@ void menu_action_sddirectory(const char* filename, char* longFilename) void ultralcd_init() { + { + uint8_t autoDepleteRaw = eeprom_read_byte(reinterpret_cast(EEPROM_AUTO_DEPLETE)); + if (0xff == autoDepleteRaw) autoDeplete = false; + else autoDeplete = autoDepleteRaw; + + } lcd_init(); lcd_refresh(); lcd_longpress_func = menu_lcd_longpress_func; From 1cdb7a48cb80cb5b5aa60d0d465f121b07d32680 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 10 Aug 2018 16:25:13 +0200 Subject: [PATCH 32/54] Show auto deplete only when mmu unit present. --- Firmware/ultralcd.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index e3a38aa97..4129a6086 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4679,8 +4679,11 @@ static void lcd_settings_menu() SETTINGS_FILAMENT_SENSOR; - if (autoDeplete) MENU_ITEM_FUNCTION_P(_i("Auto deplete [on]"), auto_deplete_switch); - else MENU_ITEM_FUNCTION_P(_i("Auto deplete[off]"), auto_deplete_switch); + if (mmu_enabled) + { + if (autoDeplete) MENU_ITEM_FUNCTION_P(_i("Auto deplete [on]"), auto_deplete_switch); + else MENU_ITEM_FUNCTION_P(_i("Auto deplete[off]"), auto_deplete_switch); + } if (fans_check_enabled == true) MENU_ITEM_FUNCTION_P(_i("Fans check [on]"), lcd_set_fan_check);////MSG_FANS_CHECK_ON c=17 r=1 From b08ae955682831c5c6fc11249aa0080c3b041217 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Mon, 27 Aug 2018 19:36:54 +0200 Subject: [PATCH 33/54] Rename autoDeplete to lcd_autoDeplete and make it global. When filament runs out, call M600 AUTO if lcd_autoDeplete is enabled. Shorten finda polling period to 300 ms. --- Firmware/mmu.cpp | 6 ++++-- Firmware/ultralcd.cpp | 12 ++++++------ Firmware/ultralcd.h | 1 + 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 73caf79db..37f78db6f 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -9,6 +9,7 @@ #include "Configuration_prusa.h" #include "fsensor.h" #include "cardreader.h" +#include "ultralcd.h" extern const char* lcd_display_message_fullscreen_P(const char *msg); @@ -192,7 +193,7 @@ void mmu_loop(void) } mmu_cmd = 0; } - else if ((mmu_last_response + 800) < millis()) //request every 800ms + else if ((mmu_last_response + 300) < millis()) //request every 300ms { puts_P(PSTR("MMU <= 'P0'")); mmu_puts_P(PSTR("P0\n")); //send 'read finda' request @@ -208,7 +209,8 @@ void mmu_loop(void) if (!mmu_finda && CHECK_FINDA && fsensor_enabled) { fsensor_stop_and_save_print(); enquecommand_front_P(PSTR("FSENSOR_RECOVER")); //then recover - enquecommand_front_P(PSTR("M600")); //save print and run M600 command + if (lcd_autoDeplete) enquecommand_front_P(PSTR("M600 AUTO")); //save print and run M600 command + else enquecommand_front_P(PSTR("M600")); //save print and run M600 command } mmu_state = 1; if (mmu_cmd == 0) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 4129a6086..ea85049f3 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -88,7 +88,7 @@ unsigned long display_time; //just timer for showing pid finished message on lcd float pid_temp = DEFAULT_PID_TEMP; static bool forceMenuExpire = false; -static bool autoDeplete; +bool lcd_autoDeplete; static float manual_feedrate[] = MANUAL_FEEDRATE; @@ -4662,8 +4662,8 @@ while (0) static void auto_deplete_switch() { - autoDeplete = !autoDeplete; - eeprom_update_byte((unsigned char *)EEPROM_AUTO_DEPLETE, autoDeplete); + lcd_autoDeplete = !lcd_autoDeplete; + eeprom_update_byte((unsigned char *)EEPROM_AUTO_DEPLETE, lcd_autoDeplete); } static void lcd_settings_menu() { @@ -4681,7 +4681,7 @@ static void lcd_settings_menu() if (mmu_enabled) { - if (autoDeplete) MENU_ITEM_FUNCTION_P(_i("Auto deplete [on]"), auto_deplete_switch); + if (lcd_autoDeplete) MENU_ITEM_FUNCTION_P(_i("Auto deplete [on]"), auto_deplete_switch); else MENU_ITEM_FUNCTION_P(_i("Auto deplete[off]"), auto_deplete_switch); } @@ -7070,8 +7070,8 @@ void ultralcd_init() { { uint8_t autoDepleteRaw = eeprom_read_byte(reinterpret_cast(EEPROM_AUTO_DEPLETE)); - if (0xff == autoDepleteRaw) autoDeplete = false; - else autoDeplete = autoDepleteRaw; + if (0xff == autoDepleteRaw) lcd_autoDeplete = false; + else lcd_autoDeplete = autoDepleteRaw; } lcd_init(); diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 29a13a9c7..3d334a9ad 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -111,6 +111,7 @@ extern int8_t SilentModeMenu; extern bool cancel_heatup; extern bool isPrintPaused; +extern bool lcd_autoDeplete; void lcd_ignore_click(bool b=true); From 2a00e5d34830c1ab1a648a20779fd93c12ab87ec Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Mon, 27 Aug 2018 20:09:22 +0200 Subject: [PATCH 34/54] Fix loading filament screen hangs if changed automatically. --- Firmware/Marlin_main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index e9fea8c25..c06e6c75c 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3124,6 +3124,8 @@ void gcode_M600(bool automatic, float x_position, float y_position, float z_shif if(!automatic) M600_check_state(); + lcd_update_enable(true); + //Not let's go back to print fanSpeed = fanSpeedBckp; @@ -8881,7 +8883,6 @@ void M600_check_state() // Everything good default: lcd_change_success(); - lcd_update_enable(true); break; } } From 9611401b691c6ef088a16b4a38660bd591954163 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Mon, 27 Aug 2018 20:23:43 +0200 Subject: [PATCH 35/54] Fix mmu_M600_load_filament increments tmp_extruder, which is not set in case of automatic == true. --- Firmware/mmu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 37f78db6f..e4ef322a6 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -418,11 +418,10 @@ void mmu_M600_load_filament(bool automatic) bool response = false; bool yes = false; + tmp_extruder = mmu_extruder; if (!automatic) { yes = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Do you want to switch extruder?"), false); if(yes) tmp_extruder = choose_extruder_menu(); - else tmp_extruder = mmu_extruder; - } else { tmp_extruder = (tmp_extruder+1)%5; @@ -444,6 +443,7 @@ void mmu_M600_load_filament(bool automatic) 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); From 7aadb2f660f315094994c229b2bdd01bdd8a90d0 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Mon, 27 Aug 2018 20:57:57 +0200 Subject: [PATCH 36/54] Fix compile time error: default argument given for parameter 2 of int8_t lcd_show_fullscreen_message_yes_no_and_wait_P --- Firmware/mmu.cpp | 9 +-------- Firmware/ultralcd.h | 1 + 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 73caf79db..a32a9a6ab 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -9,14 +9,7 @@ #include "Configuration_prusa.h" #include "fsensor.h" #include "cardreader.h" - - -extern const char* lcd_display_message_fullscreen_P(const char *msg); -extern void lcd_show_fullscreen_message_and_wait_P(const char *msg); -extern int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting = true, bool default_yes = false); -extern void lcd_return_to_status(); -extern void lcd_wait_for_heater(); -extern char choose_extruder_menu(); +#include "ultralcd.h" #define CHECK_FINDA ((IS_SD_PRINTING || is_usb_printing) && (mcode_in_progress != 600) && !saved_printing && e_active()) diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 29a13a9c7..69faadbb1 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -45,6 +45,7 @@ void lcd_menu_statistics(); extern const char* lcd_display_message_fullscreen_P(const char *msg, uint8_t &nlines); extern const char* lcd_display_message_fullscreen_P(const char *msg); +extern void lcd_return_to_status(); extern void lcd_wait_for_click(); extern void lcd_show_fullscreen_message_and_wait_P(const char *msg); // 0: no, 1: yes, -1: timeouted From 72cd0d26f94abecbfa4081ca7807053d3f1e83de Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Mon, 27 Aug 2018 21:08:40 +0200 Subject: [PATCH 37/54] Increase scope of code disabled by macro TMC2130 to whole lcd_settings_linearity_correction_menu. --- Firmware/ultralcd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 08490dbcc..36c70d7a2 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4492,11 +4492,11 @@ void lcd_wizard(int state) { lcd_update(2); } +#ifdef TMC2130 void lcd_settings_linearity_correction_menu(void) { MENU_BEGIN(); MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); -#ifdef TMC2130 #ifdef TMC2130_LINEARITY_CORRECTION_XYZ //tmc2130_wave_fac[X_AXIS] @@ -4505,13 +4505,13 @@ void lcd_settings_linearity_correction_menu(void) MENU_ITEM_EDIT_int3_P(_i("Z-correct"), &tmc2130_wave_fac[Z_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 #endif //TMC2130_LINEARITY_CORRECTION_XYZ MENU_ITEM_EDIT_int3_P(_i("E-correct"), &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0 -#endif MENU_END(); if(menu_leaving) { lcd_settings_linearity_correction_menu_save(); } } +#endif // TMC2130 static void lcd_settings_menu() { From 27bd31e25544c6ef05626be56500eb0af19a3fb5 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Tue, 28 Aug 2018 11:26:35 +0200 Subject: [PATCH 38/54] removed redundant code --- Firmware/mmu.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 40bf5ce98..de093df4a 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -455,10 +455,8 @@ void mmu_M600_load_filament(bool automatic) yes = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Do you want to switch extruder?"), false); if(yes) tmp_extruder = choose_extruder_menu(); else tmp_extruder = mmu_extruder; -#else - tmp_extruder = mmu_extruder; #endif //MMU_M600_SWITCH_EXTRUDER - } + } else { tmp_extruder = (tmp_extruder+1)%5; } From d3869bd8579e7591d06843f37078a684880c1d83 Mon Sep 17 00:00:00 2001 From: MRprusa3d Date: Tue, 28 Aug 2018 16:12:59 +0200 Subject: [PATCH 39/54] Z-endstop @ MK3 add show P.I.N.D.A. state menu item @ CalibrationMenu --- Firmware/ultralcd.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 3ba483fc2..09992050f 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3555,6 +3555,27 @@ void lcd_diag_show_end_stops() lcd_return_to_status(); } +#ifdef TMC2130 +static void lcd_show_pinda_state() +{ +lcd_set_cursor(0, 0); +lcd_puts_P((PSTR("P.I.N.D.A. state"))); +lcd_set_cursor(0, 2); +lcd_puts_P(READ(Z_MIN_PIN)?(PSTR("Z1 (LED off)")):(PSTR("Z0 (LED on) "))); // !!! both strings must have same length (due to dynamic refreshing) +} + +static void menu_show_pinda_state() +{ +lcd_timeoutToStatus.stop(); +lcd_show_pinda_state(); +if(LCD_CLICKED) + { + lcd_timeoutToStatus.start(); + menu_back(); + } +} +#endif // defined TMC2130 + void prusa_statistics(int _message, uint8_t _fil_nr) { @@ -4792,7 +4813,9 @@ static void lcd_calibration_menu() MENU_ITEM_SUBMENU_P(_i("Bed level correct"), lcd_adjust_bed);////MSG_BED_CORRECTION_MENU c=0 r=0 MENU_ITEM_SUBMENU_P(_i("PID calibration"), pid_extruder);////MSG_PID_EXTRUDER c=17 r=1 -#ifndef TMC2130 +#ifdef TMC2130 + MENU_ITEM_SUBMENU_P(_i("Show pinda state"), menu_show_pinda_state); +#else MENU_ITEM_SUBMENU_P(_i("Show end stops"), menu_show_end_stops);////MSG_SHOW_END_STOPS c=17 r=1 #endif #ifndef MK1BP From 9fb68fb7248c2106cf4cc49d1d6a41993ddb74d0 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Tue, 28 Aug 2018 18:08:21 +0200 Subject: [PATCH 40/54] Remove usage of global variable tmp_extruder in M200. --- Firmware/Marlin_main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index c31130d6a..3491bb04e 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -5819,10 +5819,10 @@ Sigma_Exit: case 200: // M200 D set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters). { - tmp_extruder = active_extruder; + uint8_t extruder = active_extruder; if(code_seen('T')) { - tmp_extruder = code_value(); - if(tmp_extruder >= EXTRUDERS) { + extruder = code_value(); + if(extruder >= EXTRUDERS) { SERIAL_ECHO_START; SERIAL_ECHO(_i("M200 Invalid extruder "));////MSG_M200_INVALID_EXTRUDER c=0 r=0 break; @@ -5836,7 +5836,7 @@ Sigma_Exit: // for all extruders volumetric_enabled = false; } else { - filament_size[tmp_extruder] = (float)code_value(); + filament_size[extruder] = (float)code_value(); // make sure all extruders have some sane value for the filament size filament_size[0] = (filament_size[0] == 0.0 ? DEFAULT_NOMINAL_FILAMENT_DIA : filament_size[0]); #if EXTRUDERS > 1 From 55eaa1de830acb9045e7c0692f54fe640d7b1801 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Tue, 28 Aug 2018 18:26:10 +0200 Subject: [PATCH 41/54] Fix code indentation. --- Firmware/Marlin_main.cpp | 218 +++++++++++++++++++-------------------- 1 file changed, 109 insertions(+), 109 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 3491bb04e..2a956a85f 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -6793,132 +6793,132 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)) else if(code_seen('T')) { - int index; - st_synchronize(); - for (index = 1; *(strchr_pointer + index) == ' ' || *(strchr_pointer + index) == '\t'; index++); - - if ((*(strchr_pointer + index) < '0' || *(strchr_pointer + index) > '9') && *(strchr_pointer + index) != '?') { - SERIAL_ECHOLNPGM("Invalid T code."); - } - else { - if (*(strchr_pointer + index) == '?') { - tmp_extruder = choose_extruder_menu(); - } - else { - tmp_extruder = code_value(); - } - snmm_filaments_used |= (1 << tmp_extruder); //for stop print + int index; + st_synchronize(); + for (index = 1; *(strchr_pointer + index) == ' ' || *(strchr_pointer + index) == '\t'; index++); -if (mmu_enabled) -{ - //printf_P(PSTR("T code: %d \n"), tmp_extruder); - //mmu_printf_P(PSTR("T%d\n"), tmp_extruder); - mmu_command(MMU_CMD_T0 + tmp_extruder); + if ((*(strchr_pointer + index) < '0' || *(strchr_pointer + index) > '9') && *(strchr_pointer + index) != '?') { + SERIAL_ECHOLNPGM("Invalid T code."); + } + else { + if (*(strchr_pointer + index) == '?') { + tmp_extruder = choose_extruder_menu(); + } + else { + tmp_extruder = code_value(); + } + snmm_filaments_used |= (1 << tmp_extruder); //for stop print - manage_response(true, true); - mmu_command(MMU_CMD_C0); - mmu_extruder = tmp_extruder; //filament change is finished + if (mmu_enabled) + { + //printf_P(PSTR("T code: %d \n"), tmp_extruder); + //mmu_printf_P(PSTR("T%d\n"), tmp_extruder); + mmu_command(MMU_CMD_T0 + tmp_extruder); - if (*(strchr_pointer + index) == '?')// for single material usage with mmu - mmu_load_to_nozzle(); -} -else -{ + manage_response(true, true); + mmu_command(MMU_CMD_C0); + mmu_extruder = tmp_extruder; //filament change is finished + + if (*(strchr_pointer + index) == '?')// for single material usage with mmu + mmu_load_to_nozzle(); + } + else + { #ifdef SNMM - #ifdef LIN_ADVANCE - if (mmu_extruder != tmp_extruder) - clear_current_adv_vars(); //Check if the selected extruder is not the active one and reset LIN_ADVANCE variables if so. - #endif - - mmu_extruder = tmp_extruder; +#ifdef LIN_ADVANCE + if (mmu_extruder != tmp_extruder) + clear_current_adv_vars(); //Check if the selected extruder is not the active one and reset LIN_ADVANCE variables if so. +#endif - - delay(100); + mmu_extruder = tmp_extruder; - disable_e0(); - disable_e1(); - disable_e2(); - pinMode(E_MUX0_PIN, OUTPUT); - pinMode(E_MUX1_PIN, OUTPUT); + delay(100); - delay(100); - SERIAL_ECHO_START; - SERIAL_ECHO("T:"); - SERIAL_ECHOLN((int)tmp_extruder); - switch (tmp_extruder) { - case 1: - WRITE(E_MUX0_PIN, HIGH); - WRITE(E_MUX1_PIN, LOW); + disable_e0(); + disable_e1(); + disable_e2(); - break; - case 2: - WRITE(E_MUX0_PIN, LOW); - WRITE(E_MUX1_PIN, HIGH); + pinMode(E_MUX0_PIN, OUTPUT); + pinMode(E_MUX1_PIN, OUTPUT); - break; - case 3: - WRITE(E_MUX0_PIN, HIGH); - WRITE(E_MUX1_PIN, HIGH); + delay(100); + SERIAL_ECHO_START; + SERIAL_ECHO("T:"); + SERIAL_ECHOLN((int)tmp_extruder); + switch (tmp_extruder) { + case 1: + WRITE(E_MUX0_PIN, HIGH); + WRITE(E_MUX1_PIN, LOW); - break; - default: - WRITE(E_MUX0_PIN, LOW); - WRITE(E_MUX1_PIN, LOW); + break; + case 2: + WRITE(E_MUX0_PIN, LOW); + WRITE(E_MUX1_PIN, HIGH); - break; - } - delay(100); + break; + case 3: + WRITE(E_MUX0_PIN, HIGH); + WRITE(E_MUX1_PIN, HIGH); + + break; + default: + WRITE(E_MUX0_PIN, LOW); + WRITE(E_MUX1_PIN, LOW); + + break; + } + delay(100); #else //SNMM - if (tmp_extruder >= EXTRUDERS) { - SERIAL_ECHO_START; - SERIAL_ECHOPGM("T"); - SERIAL_PROTOCOLLN((int)tmp_extruder); - SERIAL_ECHOLNRPGM(_n("Invalid extruder"));////MSG_INVALID_EXTRUDER c=0 r=0 - } - else { - #if EXTRUDERS > 1 - boolean make_move = false; - #endif - if (code_seen('F')) { - #if EXTRUDERS > 1 - make_move = true; - #endif - next_feedrate = code_value(); - if (next_feedrate > 0.0) { - feedrate = next_feedrate; - } - } - #if EXTRUDERS > 1 - if (tmp_extruder != active_extruder) { - // Save current position to return to after applying extruder offset - memcpy(destination, current_position, sizeof(destination)); - // Offset extruder (only by XY) - int i; - for (i = 0; i < 2; i++) { - current_position[i] = current_position[i] - - extruder_offset[i][active_extruder] + - extruder_offset[i][tmp_extruder]; - } - // Set the new active extruder and position - active_extruder = tmp_extruder; - plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); - // Move to the old position if 'F' was in the parameters - if (make_move && Stopped == false) { - prepare_move(); - } - } - #endif - SERIAL_ECHO_START; - SERIAL_ECHORPGM(_n("Active Extruder: "));////MSG_ACTIVE_EXTRUDER c=0 r=0 - SERIAL_PROTOCOLLN((int)active_extruder); - } + if (tmp_extruder >= EXTRUDERS) { + SERIAL_ECHO_START; + SERIAL_ECHOPGM("T"); + SERIAL_PROTOCOLLN((int)tmp_extruder); + SERIAL_ECHOLNRPGM(_n("Invalid extruder"));////MSG_INVALID_EXTRUDER c=0 r=0 + } + else { +#if EXTRUDERS > 1 + boolean make_move = false; +#endif + if (code_seen('F')) { +#if EXTRUDERS > 1 + make_move = true; +#endif + next_feedrate = code_value(); + if (next_feedrate > 0.0) { + feedrate = next_feedrate; + } + } +#if EXTRUDERS > 1 + if (tmp_extruder != active_extruder) { + // Save current position to return to after applying extruder offset + memcpy(destination, current_position, sizeof(destination)); + // Offset extruder (only by XY) + int i; + for (i = 0; i < 2; i++) { + current_position[i] = current_position[i] - + extruder_offset[i][active_extruder] + + extruder_offset[i][tmp_extruder]; + } + // Set the new active extruder and position + active_extruder = tmp_extruder; + plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); + // Move to the old position if 'F' was in the parameters + if (make_move && Stopped == false) { + prepare_move(); + } + } +#endif + SERIAL_ECHO_START; + SERIAL_ECHORPGM(_n("Active Extruder: "));////MSG_ACTIVE_EXTRUDER c=0 r=0 + SERIAL_PROTOCOLLN((int)active_extruder); + } #endif //SNMM -} - } + } + } } // end if(code_seen('T')) (end of T codes) else if (code_seen('D')) // D codes (debug) From 8aeb7e04f1c48eeed546487c7b3606567c83bce5 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Tue, 28 Aug 2018 18:52:16 +0200 Subject: [PATCH 42/54] Fix bound check for T0 .. T4 command. Document mmu_load_to_nozzle(). --- Firmware/Marlin_main.cpp | 6 +++--- Firmware/mmu.cpp | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 2a956a85f..0106718d5 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -6797,7 +6797,7 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)) st_synchronize(); for (index = 1; *(strchr_pointer + index) == ' ' || *(strchr_pointer + index) == '\t'; index++); - if ((*(strchr_pointer + index) < '0' || *(strchr_pointer + index) > '9') && *(strchr_pointer + index) != '?') { + if ((*(strchr_pointer + index) < '0' || *(strchr_pointer + index) > '4') && *(strchr_pointer + index) != '?') { SERIAL_ECHOLNPGM("Invalid T code."); } else { @@ -6811,8 +6811,6 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)) if (mmu_enabled) { - //printf_P(PSTR("T code: %d \n"), tmp_extruder); - //mmu_printf_P(PSTR("T%d\n"), tmp_extruder); mmu_command(MMU_CMD_T0 + tmp_extruder); manage_response(true, true); @@ -6820,7 +6818,9 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)) mmu_extruder = tmp_extruder; //filament change is finished if (*(strchr_pointer + index) == '?')// for single material usage with mmu + { mmu_load_to_nozzle(); + } } else { diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 40bf5ce98..073618482 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -380,6 +380,12 @@ void manage_response(bool move_axes, bool turn_off_nozzle) if (lcd_update_was_enabled) lcd_update_enable(true); } +//! @brief load filament to nozzle of multimaterial printer +//! +//! This function is used only only after T? (user select filament) and M600 (change filament). +//! It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading +//! filament to nozzle. +//! void mmu_load_to_nozzle() { st_synchronize(); From 0695f3f345540f39ee70ae29ff3a0348a4140062 Mon Sep 17 00:00:00 2001 From: MRprusa3d Date: Tue, 28 Aug 2018 19:58:03 +0200 Subject: [PATCH 43/54] Z-move correction Z-move inhibition after FactoryReset --- Firmware/Marlin_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index c31130d6a..a6f724c57 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1355,6 +1355,7 @@ void setup() plan_init(); // Initialize planner; factory_reset(); + lcd_encoder_diff=0; #ifdef TMC2130 uint8_t silentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); From 2cd86913764587838e87bbc68f82b1034266582f Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Tue, 28 Aug 2018 20:26:33 +0200 Subject: [PATCH 44/54] Do not use global variable tmp_extruder when setting temperature. --- Firmware/Marlin.h | 3 +- Firmware/Marlin_main.cpp | 96 ++++++++++++++++++++++++---------------- 2 files changed, 59 insertions(+), 40 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 1f51b6659..0681aae26 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -394,7 +394,6 @@ uint8_t check_printer_version(); float temp_compensation_pinda_thermistor_offset(float temperature_pinda); #endif //PINDA_THERMISTOR -void wait_for_heater(long codenum); void serialecho_temperatures(); bool check_commands(); @@ -471,4 +470,4 @@ void proc_commands(); void M600_load_filament(); void M600_load_filament_movements(); void M600_wait_for_user(); -void M600_check_state(); \ No newline at end of file +void M600_check_state(); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 0106718d5..b2bee4bca 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -543,8 +543,9 @@ static bool saved_extruder_relative_mode = false; //=========================================================================== static void get_arc_coordinates(); -static bool setTargetedHotend(int code); +static bool setTargetedHotend(int code, uint8_t &extruder); static void print_time_remaining_init(); +static void wait_for_heater(long codenum, uint8_t extruder); uint16_t gcode_in_progress = 0; uint16_t mcode_in_progress = 0; @@ -5353,15 +5354,18 @@ Sigma_Exit: break; case 104: // M104 - if(setTargetedHotend(104)){ - break; - } - if (code_seen('S')) - { - setTargetHotendSafe(code_value(), tmp_extruder); - } - setWatch(); - break; + { + uint8_t extruder; + if(setTargetedHotend(104,extruder)){ + break; + } + if (code_seen('S')) + { + setTargetHotendSafe(code_value(), extruder); + } + setWatch(); + break; + } case 112: // M112 -Emergency Stop kill(_n(""), 3); break; @@ -5369,14 +5373,16 @@ Sigma_Exit: if (code_seen('S')) setTargetBed(code_value()); break; case 105 : // M105 - if(setTargetedHotend(105)){ + { + uint8_t extruder; + if(setTargetedHotend(105, extruder)){ break; } #if defined(TEMP_0_PIN) && TEMP_0_PIN > -1 SERIAL_PROTOCOLPGM("ok T:"); - SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1); + SERIAL_PROTOCOL_F(degHotend(extruder),1); SERIAL_PROTOCOLPGM(" /"); - SERIAL_PROTOCOL_F(degTargetHotend(tmp_extruder),1); + SERIAL_PROTOCOL_F(degTargetHotend(extruder),1); #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 SERIAL_PROTOCOLPGM(" B:"); SERIAL_PROTOCOL_F(degBed(),1); @@ -5401,7 +5407,7 @@ Sigma_Exit: SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(tmp_extruder))/127); SERIAL_PROTOCOLPGM("W"); #else - SERIAL_PROTOCOL(getHeaterPower(tmp_extruder)); + SERIAL_PROTOCOL(getHeaterPower(extruder)); #endif SERIAL_PROTOCOLPGM(" B@:"); @@ -5459,9 +5465,11 @@ Sigma_Exit: KEEPALIVE_STATE(NOT_BUSY); return; break; + } case 109: {// M109 - Wait for extruder heater to reach target. - if(setTargetedHotend(109)){ + uint8_t extruder; + if(setTargetedHotend(109, extruder)){ break; } LCD_MESSAGERPGM(_T(MSG_HEATING)); @@ -5472,10 +5480,10 @@ Sigma_Exit: autotemp_enabled=false; #endif if (code_seen('S')) { - setTargetHotendSafe(code_value(), tmp_extruder); + setTargetHotendSafe(code_value(), extruder); CooldownNoWait = true; } else if (code_seen('R')) { - setTargetHotendSafe(code_value(), tmp_extruder); + setTargetHotendSafe(code_value(), extruder); CooldownNoWait = false; } #ifdef AUTOTEMP @@ -5492,13 +5500,13 @@ Sigma_Exit: codenum = millis(); /* See if we are heating up or cooling down */ - target_direction = isHeatingHotend(tmp_extruder); // true if heating, false if cooling + target_direction = isHeatingHotend(extruder); // true if heating, false if cooling KEEPALIVE_STATE(NOT_BUSY); cancel_heatup = false; - wait_for_heater(codenum); //loops until target temperature is reached + wait_for_heater(codenum, extruder); //loops until target temperature is reached LCD_MESSAGERPGM(_T(MSG_HEATING_COMPLETE)); KEEPALIVE_STATE(IN_HANDLER); @@ -6024,25 +6032,26 @@ Sigma_Exit: #if EXTRUDERS > 1 case 218: // M218 - set hotend offset (in mm), T X Y { - if(setTargetedHotend(218)){ + uint8_t extruder; + if(setTargetedHotend(218, extruder)){ break; } if(code_seen('X')) { - extruder_offset[X_AXIS][tmp_extruder] = code_value(); + extruder_offset[X_AXIS][extruder] = code_value(); } if(code_seen('Y')) { - extruder_offset[Y_AXIS][tmp_extruder] = code_value(); + extruder_offset[Y_AXIS][extruder] = code_value(); } SERIAL_ECHO_START; SERIAL_ECHORPGM(MSG_HOTEND_OFFSET); - for(tmp_extruder = 0; tmp_extruder < EXTRUDERS; tmp_extruder++) + for(extruder = 0; extruder < EXTRUDERS; extruder++) { SERIAL_ECHO(" "); - SERIAL_ECHO(extruder_offset[X_AXIS][tmp_extruder]); + SERIAL_ECHO(extruder_offset[X_AXIS][extruder]); SERIAL_ECHO(","); - SERIAL_ECHO(extruder_offset[Y_AXIS][tmp_extruder]); + SERIAL_ECHO(extruder_offset[Y_AXIS][extruder]); } SERIAL_ECHOLN(""); }break; @@ -6062,10 +6071,11 @@ Sigma_Exit: int tmp_code = code_value(); if (code_seen('T')) { - if(setTargetedHotend(221)){ + uint8_t extruder; + if(setTargetedHotend(221, extruder)){ break; } - extruder_multiply[tmp_extruder] = tmp_code; + extruder_multiply[extruder] = tmp_code; } else { @@ -7571,11 +7581,21 @@ void setPwmFrequency(uint8_t pin, int val) } #endif //FAST_PWM_FAN -bool setTargetedHotend(int code){ - tmp_extruder = active_extruder; +//! @brief Get and validate extruder number +//! +//! If it is not specified, active_extruder is returned in parameter extruder. +//! @param [in] code M code number +//! @param [out] extruder +//! @return error +//! @retval true Invalid extruder specified in T code +//! @retval false Valid extruder specified in T code, or not specifiead + +bool setTargetedHotend(int code, uint8_t &extruder) +{ + extruder = active_extruder; if(code_seen('T')) { - tmp_extruder = code_value(); - if(tmp_extruder >= EXTRUDERS) { + extruder = code_value(); + if(extruder >= EXTRUDERS) { SERIAL_ECHO_START; switch(code){ case 104: @@ -7594,7 +7614,7 @@ bool setTargetedHotend(int code){ SERIAL_ECHO(_i("M221 Invalid extruder "));////MSG_M221_INVALID_EXTRUDER c=0 r=0 break; } - SERIAL_PROTOCOLLN((int)tmp_extruder); + SERIAL_PROTOCOLLN((int)extruder); return true; } } @@ -7659,7 +7679,7 @@ void delay_keep_alive(unsigned int ms) } } -void wait_for_heater(long codenum) { +static void wait_for_heater(long codenum, uint8_t extruder) { #ifdef TEMP_RESIDENCY_TIME long residencyStart; @@ -7675,9 +7695,9 @@ void wait_for_heater(long codenum) { { //Print Temp Reading and remaining time every 1 second while heating up/cooling down if (!farm_mode) { SERIAL_PROTOCOLPGM("T:"); - SERIAL_PROTOCOL_F(degHotend(tmp_extruder), 1); + SERIAL_PROTOCOL_F(degHotend(extruder), 1); SERIAL_PROTOCOLPGM(" E:"); - SERIAL_PROTOCOL((int)tmp_extruder); + SERIAL_PROTOCOL((int)extruder); #ifdef TEMP_RESIDENCY_TIME SERIAL_PROTOCOLPGM(" W:"); @@ -7702,9 +7722,9 @@ void wait_for_heater(long codenum) { #ifdef TEMP_RESIDENCY_TIME /* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time or when current temp falls outside the hysteresis after target temp was reached */ - if ((residencyStart == -1 && target_direction && (degHotend(tmp_extruder) >= (degTargetHotend(tmp_extruder) - TEMP_WINDOW))) || - (residencyStart == -1 && !target_direction && (degHotend(tmp_extruder) <= (degTargetHotend(tmp_extruder) + TEMP_WINDOW))) || - (residencyStart > -1 && labs(degHotend(tmp_extruder) - degTargetHotend(tmp_extruder)) > TEMP_HYSTERESIS)) + if ((residencyStart == -1 && target_direction && (degHotend(extruder) >= (degTargetHotend(extruder) - TEMP_WINDOW))) || + (residencyStart == -1 && !target_direction && (degHotend(extruder) <= (degTargetHotend(extruder) + TEMP_WINDOW))) || + (residencyStart > -1 && labs(degHotend(extruder) - degTargetHotend(extruder)) > TEMP_HYSTERESIS)) { residencyStart = millis(); } From 705f098b1c6b301e0b4975cd4f5d32cf4da48496 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Tue, 28 Aug 2018 23:50:31 +0200 Subject: [PATCH 45/54] eject filament: initial version --- Firmware/mmu.cpp | 29 ++++++++++++++++++++++++----- Firmware/mmu.h | 7 +++++++ Firmware/ultralcd.cpp | 2 +- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index de093df4a..d8a1449f8 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -103,6 +103,7 @@ void mmu_init(void) //mmu main loop - state machine processing void mmu_loop(void) { + int filament = 0; // printf_P(PSTR("MMU loop, state=%d\n"), mmu_state); switch (mmu_state) { @@ -160,14 +161,14 @@ void mmu_loop(void) { if ((mmu_cmd >= MMU_CMD_T0) && (mmu_cmd <= MMU_CMD_T4)) { - int extruder = mmu_cmd - MMU_CMD_T0; - printf_P(PSTR("MMU <= 'T%d'\n"), extruder); - mmu_printf_P(PSTR("T%d\n"), extruder); + filament = mmu_cmd - MMU_CMD_T0; + printf_P(PSTR("MMU <= 'T%d'\n"), filament); + mmu_printf_P(PSTR("T%d\n"), filament); mmu_state = 3; // wait for response } else if ((mmu_cmd >= MMU_CMD_L0) && (mmu_cmd <= MMU_CMD_L4)) { - int filament = mmu_cmd - MMU_CMD_L0; + filament = mmu_cmd - MMU_CMD_L0; printf_P(PSTR("MMU <= 'L%d'\n"), filament); mmu_printf_P(PSTR("L%d\n"), filament); mmu_state = 3; // wait for response @@ -184,6 +185,19 @@ void mmu_loop(void) mmu_puts_P(PSTR("U0\n")); //send 'unload current filament' mmu_state = 3; } + else if ((mmu_cmd >= MMU_CMD_E0) && (mmu_cmd <= MMU_CMD_E4)) + { + int filament = mmu_cmd - MMU_CMD_E0; + printf_P(PSTR("MMU <= 'E%d'\n"), filament); + mmu_printf_P(PSTR("E%d\n"), filament); //send eject filament + mmu_state = 3; // wait for response + } + else if (mmu_cmd == MMU_CMD_R0) + { + printf_P(PSTR("MMU <= 'R0'\n")); + mmu_puts_P(PSTR("R0\n")); //send recover after eject + mmu_state = 3; // wait for response + } mmu_cmd = 0; } else if ((mmu_last_response + 300) < millis()) //request every 300ms @@ -214,7 +228,7 @@ void mmu_loop(void) mmu_state = 1; } return; - case 3: //response to commands T0-T4 + case 3: //response to mmu commands if (mmu_rx_ok() > 0) { printf_P(PSTR("MMU => 'ok'\n")); @@ -900,3 +914,8 @@ void mmu_show_warning() printf_P(PSTR("MMU2 firmware version invalid. Required version: build number %d or higher."), MMU_REQUIRED_FW_BUILDNR); kill(_i("Please update firmware in your MMU2. Waiting for reset.")); } + +static void mmu_eject_filament(uint8_t filament) +{ + if (filament < 5) mmu_command(MMU_CMD_E0 + filament); +} \ No newline at end of file diff --git a/Firmware/mmu.h b/Firmware/mmu.h index e7ad6030b..2a80f948d 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -30,6 +30,13 @@ extern int16_t mmu_buildnr; #define MMU_CMD_L4 0x24 #define MMU_CMD_C0 0x30 #define MMU_CMD_U0 0x40 +#define MMU_CMD_E0 0x50 +#define MMU_CMD_E1 0x51 +#define MMU_CMD_E2 0x52 +#define MMU_CMD_E3 0x53 +#define MMU_CMD_E4 0x54 +#define MMU_CMD_R0 0x60 + extern int mmu_puts_P(const char* str); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 3ba483fc2..d24bbbfe2 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -5559,7 +5559,7 @@ static void lcd_main_menu() }*/ - + if ( ( IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL)) && (current_position[Z_AXIS] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU) && !homing_flag && !mesh_bed_leveling_flag) { MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);//8 From 515e78cfd1743989153f247815c5e61e78ddd6c4 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 29 Aug 2018 01:58:28 +0200 Subject: [PATCH 46/54] Eject filament feature in menu, M600: if it was envoked by FINDA, eject filament --- Firmware/Marlin_main.cpp | 13 ++++++++++ Firmware/mmu.cpp | 51 ++++++++++++++++++++++++++++++++++++---- Firmware/mmu.h | 7 +++++- Firmware/ultralcd.cpp | 14 +++++++++++ 4 files changed, 80 insertions(+), 5 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 677f081bf..31424d9e2 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3120,7 +3120,20 @@ void gcode_M600(bool automatic, float x_position, float y_position, float z_shif } if (mmu_enabled) + { + if (saved_printing) mmu_eject_filament(mmu_extruder, false); //if M600 was invoked by filament senzor (FINDA) eject filament so user can easily remove it + if (!automatic) mmu_M600_wait_and_beep(); + if (saved_printing) { + + lcd_clear(); + lcd_set_cursor(0, 2); + lcd_puts_P(_T(MSG_PLEASE_WAIT)); + + mmu_command(MMU_CMD_R0); + manage_response(false, false); + } mmu_M600_load_filament(automatic); + } else M600_load_filament(); diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index b960a6a74..12319d972 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -22,7 +22,7 @@ #define MMU_HWRESET #define MMU_RST_PIN 76 -#define MMU_REQUIRED_FW_BUILDNR 81 +#define MMU_REQUIRED_FW_BUILDNR 83 bool mmu_enabled = false; @@ -470,7 +470,6 @@ void mmu_M600_load_filament(bool automatic) bool yes = false; tmp_extruder = mmu_extruder; if (!automatic) { - mmu_M600_wait_and_beep(); #ifdef MMU_M600_SWITCH_EXTRUDER yes = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Do you want to switch extruder?"), false); if(yes) tmp_extruder = choose_extruder_menu(); @@ -790,6 +789,36 @@ void extr_adj_4() #endif } +void mmu_eject_fil_0() +{ + mmu_eject_filament(0, true); +} + +void mmu_eject_fil_1() +{ + mmu_eject_filament(1, true); +} + +void mmu_eject_fil_2() +{ + mmu_eject_filament(2, true); +} + +void mmu_eject_fil_3() +{ + mmu_eject_filament(3, true); +} + +void mmu_eject_fil_4() +{ + mmu_eject_filament(4, true); +} + +void mmu_eject_fil_5() +{ + mmu_eject_filament(5, true); +} + void load_all() { #ifndef SNMM @@ -921,7 +950,21 @@ void mmu_show_warning() kill(_i("Please update firmware in your MMU2. Waiting for reset.")); } -static void mmu_eject_filament(uint8_t filament) +void mmu_eject_filament(uint8_t filament, bool recover) { - if (filament < 5) mmu_command(MMU_CMD_E0 + filament); + if (filament < 5) + { + mmu_command(MMU_CMD_E0 + filament); + manage_response(false, false); + if (recover) + { + lcd_show_fullscreen_message_and_wait_P(_i("Please remove filament and then press the knob.")); + mmu_command(MMU_CMD_R0); + manage_response(false, false); + } + } + else + { + puts_P(PSTR("Filament nr out of range!")); + } } \ No newline at end of file diff --git a/Firmware/mmu.h b/Firmware/mmu.h index 2a80f948d..35c1e18c6 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -91,4 +91,9 @@ extern void extr_unload_4(); extern bool mmu_check_version(); extern void mmu_show_warning(); - +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(); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 85ea86dd4..69bf72125 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -5203,6 +5203,19 @@ static void fil_load_menu() MENU_END(); } +static void mmu_fil_eject_menu() +{ + 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(); +} + static void fil_unload_menu() { MENU_BEGIN(); @@ -5651,6 +5664,7 @@ static void lcd_main_menu() if (mmu_enabled) { MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), fil_load_menu); + MENU_ITEM_SUBMENU_P(_i("Eject filament"), mmu_fil_eject_menu); if (mmu_enabled) MENU_ITEM_GCODE_P(_T(MSG_UNLOAD_FILAMENT), PSTR("M702 C")); else From b284c70d9b71222fb5cd721023180b10ae2d54d3 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 29 Aug 2018 13:08:09 +0200 Subject: [PATCH 47/54] auto deplete: dont eject filament --- Firmware/Marlin_main.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 31424d9e2..413dec652 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3121,16 +3121,18 @@ void gcode_M600(bool automatic, float x_position, float y_position, float z_shif if (mmu_enabled) { - if (saved_printing) mmu_eject_filament(mmu_extruder, false); //if M600 was invoked by filament senzor (FINDA) eject filament so user can easily remove it - if (!automatic) mmu_M600_wait_and_beep(); - if (saved_printing) { + if (!automatic) { + if (saved_printing) mmu_eject_filament(mmu_extruder, false); //if M600 was invoked by filament senzor (FINDA) eject filament so user can easily remove it + mmu_M600_wait_and_beep(); + if (saved_printing) { - lcd_clear(); - lcd_set_cursor(0, 2); - lcd_puts_P(_T(MSG_PLEASE_WAIT)); + lcd_clear(); + lcd_set_cursor(0, 2); + lcd_puts_P(_T(MSG_PLEASE_WAIT)); - mmu_command(MMU_CMD_R0); - manage_response(false, false); + mmu_command(MMU_CMD_R0); + manage_response(false, false); + } } mmu_M600_load_filament(automatic); } From 8a453e65f8fd6a4cd5a672be31c1e1a12765ff59 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 29 Aug 2018 13:16:17 +0200 Subject: [PATCH 48/54] eject filament allowed only when nozzle is hot (there can be filament loaded in printer nozzle) --- Firmware/mmu.cpp | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 12319d972..a23a402a5 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -954,13 +954,37 @@ void mmu_eject_filament(uint8_t filament, bool recover) { if (filament < 5) { - mmu_command(MMU_CMD_E0 + filament); - manage_response(false, false); - if (recover) + + if (degHotend0() > EXTRUDE_MINTEMP) { - lcd_show_fullscreen_message_and_wait_P(_i("Please remove filament and then press the knob.")); - mmu_command(MMU_CMD_R0); + st_synchronize(); + lcd_update_enable(false); + lcd_clear(); + lcd_set_cursor(0, 1); lcd_puts_P(_i("Ejecting filament")); + current_position[E_AXIS] -= 80; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 2500 / 60, active_extruder); + st_synchronize(); + + lcd_update_enable(true); + + mmu_command(MMU_CMD_E0 + filament); manage_response(false, false); + if (recover) + { + lcd_show_fullscreen_message_and_wait_P(_i("Please remove filament and then press the knob.")); + mmu_command(MMU_CMD_R0); + manage_response(false, false); + } + } + else + { + lcd_clear(); + lcd_set_cursor(0, 0); + lcd_puts_P(_T(MSG_ERROR)); + lcd_set_cursor(0, 2); + lcd_puts_P(_T(MSG_PREHEAT_NOZZLE)); + delay(2000); + lcd_clear(); } } else From b2c94f36ccb3eef4c8d4a76b38920fe593c94651 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 29 Aug 2018 14:41:39 +0200 Subject: [PATCH 49/54] removed unused "out of range" function --- Firmware/mmu.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index a23a402a5..7ceb53e96 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -814,11 +814,6 @@ void mmu_eject_fil_4() mmu_eject_filament(4, true); } -void mmu_eject_fil_5() -{ - mmu_eject_filament(5, true); -} - void load_all() { #ifndef SNMM From 25a22120fb202d05de292851541ba0c26760a7b4 Mon Sep 17 00:00:00 2001 From: MRprusa3d Date: Thu, 30 Aug 2018 03:32:33 +0200 Subject: [PATCH 50/54] 1-st Layer Calibration correction filament loading improvement --- Firmware/Marlin_main.cpp | 5 +---- Firmware/ultralcd.cpp | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 413dec652..cb2180196 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3192,10 +3192,7 @@ void gcode_M701() custom_message_type = CUSTOM_MSG_TYPE_F_LOAD; #ifdef FILAMENT_SENSOR - if (mmu_enabled == false) - { - fsensor_oq_meassure_start(40); - } + fsensor_oq_meassure_start(40); #endif //FILAMENT_SENSOR lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT)); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 69bf72125..5a5f69eef 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4404,6 +4404,7 @@ void lcd_wizard(int state) { break; case 5: //is filament loaded? //start to preheat nozzle and bed to save some time later + lcd_commands_type = LCD_COMMAND_V2_CAL; setTargetHotend(PLA_PREHEAT_HOTEND_TEMP, 0); setTargetBed(PLA_PREHEAT_HPB_TEMP); wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Is filament loaded?"), false);////MSG_WIZARD_FILAMENT_LOADED c=20 r=2 @@ -4441,6 +4442,7 @@ void lcd_wizard(int state) { #ifdef SNMM change_extr(0); #endif + loading_flag = true; gcode_M701(); state = 9; break; From d96b0d5f3248e48a7ad4c459d73eef669666d2f1 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 30 Aug 2018 11:28:12 +0200 Subject: [PATCH 51/54] linearity correction define added (menu readded) --- .gitignore | 1 + Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 321c24319..bf77e0f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ Firmware/Doc /Firmware/Firmware - Shortcut.lnk /Firmware/variants/1_75mm_MK3-MMU-EINSy10a-E3Dv6full.h.bak /Firmware/Marlin_main.cpp~RF12cfae7.TMP +/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h.bak diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index 4dec83550..7cde630b7 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -183,6 +183,7 @@ #define CMD_DIAGNOSTICS //Show cmd queue length on printer display #endif /* DEBUG_BUILD */ +#define LINEARITY_CORRECTION #define TMC2130_LINEARITY_CORRECTION #define TMC2130_LINEARITY_CORRECTION_XYZ //#define TMC2130_VARIABLE_RESOLUTION From ed49e5187b14c975690c90442a79b913b1f07b5f Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 30 Aug 2018 11:35:06 +0200 Subject: [PATCH 52/54] version changed --- Firmware/Configuration.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 6e08fe287..7c6d95cfa 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -7,8 +7,8 @@ #define STR(x) STR_HELPER(x) // Firmware version -#define FW_VERSION "3.4.0-RC1" -#define FW_COMMIT_NR 1170 +#define FW_VERSION "3.4.0-RC2" +#define FW_COMMIT_NR 1267 // FW_VERSION_UNKNOWN means this is an unofficial build. // The firmware should only be checked into github with this symbol. #define FW_DEV_VERSION FW_VERSION_UNKNOWN From 12b1769531b0be29326730f32ca655d0efdf4f44 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Thu, 30 Aug 2018 16:02:13 +0200 Subject: [PATCH 53/54] Fix printer reset when changing filament during print over USB. --- Firmware/Marlin.h | 1 + Firmware/ultralcd.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 0681aae26..8512de1e4 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -348,6 +348,7 @@ extern bool sortAlpha; extern char dir_names[3][9]; +extern int8_t lcd_change_fil_state; // save/restore printing extern bool saved_printing; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 5a5f69eef..f49911bc7 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -35,7 +35,6 @@ #include "mmu.h" -extern int lcd_change_fil_state; extern bool fans_check_enabled; From 35cf3f3a61028ca4693fc71192d601f791823e62 Mon Sep 17 00:00:00 2001 From: MRprusa3d Date: Tue, 4 Sep 2018 14:39:46 +0200 Subject: [PATCH 54/54] Time info suffix for doubt time estimation (i.e. if feed rate changed) --- Firmware/ultralcd.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index f49911bc7..46ac9d665 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -597,8 +597,15 @@ void lcdui_print_time(void) int chars = 0; if ((PRINTER_ACTIVE) && ((print_time_remaining_normal != PRINT_TIME_REMAINING_INIT) || (starttime != 0))) { - char suff = (print_time_remaining_normal == PRINT_TIME_REMAINING_INIT)?' ':'R'; - chars = lcd_printf_P(_N("%c%02u:%02u%c"), LCD_STR_CLOCK[0], print_t / 60, print_t % 60, suff); + char suff = ' '; + char suff_doubt = ' '; + if (print_time_remaining_normal != PRINT_TIME_REMAINING_INIT) + { + suff = 'R'; + if (feedmultiply != 100) + suff_doubt = '?'; + } + chars = lcd_printf_P(_N("%c%02u:%02u%c%c"), LCD_STR_CLOCK[0], print_t / 60, print_t % 60, suff, suff_doubt); } else chars = lcd_printf_P(_N("%c--:-- "), LCD_STR_CLOCK[0]);