From bb5ac93921857888c0115c866a596d87159440c2 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Wed, 22 Aug 2018 18:55:42 +0200 Subject: [PATCH 01/35] 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/35] 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/35] 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 ac5cb0989eb879b243b653a0e403460bf2acd589 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Fri, 24 Aug 2018 15:40:21 +0200 Subject: [PATCH 04/35] 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 05/35] 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 06/35] 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 07/35] 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 08/35] 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 09/35] 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 10/35] 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 11/35] 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 12/35] 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 13/35] 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 14/35] 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 15/35] 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 16/35] 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 17/35] 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 18/35] 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 19/35] 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 20/35] 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 21/35] 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 22/35] 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 23/35] 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 24/35] 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 25/35] 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 26/35] 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 27/35] 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 28/35] 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 29/35] 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 30/35] 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 31/35] 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 32/35] 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 33/35] 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 34/35] 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 35/35] 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() {