diff --git a/mmu.cpp b/mmu.cpp index 9238d94aa..4f0b3dcdd 100644 --- a/mmu.cpp +++ b/mmu.cpp @@ -146,7 +146,8 @@ void mmu_loop(void) printf_P(PSTR("MMU => '%Sensed Filament at Boot'\n"), mmu_finda); enquecommand_front_P(PSTR("M104 S210")); enquecommand_front_P(PSTR("M109 S210")); - enquecommand_front_P(PSTR("M702 C")); + extr_unload_at_boot(); + mmu_puts_P(PSTR("FB\n")); //Advise unloaded to above bondtech for retraction } else if (millis() > 30000) //30sec after reset disable mmu { @@ -840,6 +841,99 @@ void extr_unload() //lcd_return_to_status(); } +void extr_unload_at_boot() +{ //unload just current filament for multimaterial printers +#ifdef SNMM + float tmp_motor[3] = DEFAULT_PWM_MOTOR_CURRENT; + float tmp_motor_loud[3] = DEFAULT_PWM_MOTOR_CURRENT_LOUD; + uint8_t SilentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); +#endif + + if (degHotend0() > EXTRUDE_MINTEMP) + { +#ifndef SNMM + st_synchronize(); + + //show which filament is currently unloaded + lcd_update_enable(false); + lcd_clear(); + lcd_set_cursor(0, 1); lcd_puts_P(_T(MSG_UNLOADING_FILAMENT)); + lcd_print(" "); + lcd_print(mmu_extruder + 1); + + filament_ramming(); + + //mmu_command(MMU_CMD_U0); + // get response + manage_response(false, true); + + lcd_update_enable(true); +#else //SNMM + + lcd_clear(); + lcd_display_message_fullscreen_P(PSTR("")); + max_feedrate[E_AXIS] = 50; + lcd_set_cursor(0, 0); lcd_puts_P(_T(MSG_UNLOADING_FILAMENT)); + lcd_print(" "); + lcd_print(mmu_extruder + 1); + lcd_set_cursor(0, 2); lcd_puts_P(_T(MSG_PLEASE_WAIT)); + if (current_position[Z_AXIS] < 15) { + current_position[Z_AXIS] += 15; //lifting in Z direction to make space for extrusion + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 25, active_extruder); + } + + current_position[E_AXIS] += 10; //extrusion + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 10, active_extruder); + st_current_set(2, E_MOTOR_HIGH_CURRENT); + if (current_temperature[0] < 230) { //PLA & all other filaments + current_position[E_AXIS] += 5.4; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 2800 / 60, active_extruder); + current_position[E_AXIS] += 3.2; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 3000 / 60, active_extruder); + current_position[E_AXIS] += 3; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 3400 / 60, active_extruder); + } + else { //ABS + current_position[E_AXIS] += 3.1; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 2000 / 60, active_extruder); + current_position[E_AXIS] += 3.1; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 2500 / 60, active_extruder); + current_position[E_AXIS] += 4; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 3000 / 60, active_extruder); + /*current_position[X_AXIS] += 23; //delay + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 600 / 60, active_extruder); //delay + current_position[X_AXIS] -= 23; //delay + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 600 / 60, active_extruder); //delay*/ + delay_keep_alive(4700); + } + + max_feedrate[E_AXIS] = 80; + current_position[E_AXIS] -= (bowden_length[mmu_extruder] + 60 + FIL_LOAD_LENGTH) / 2; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 500, active_extruder); + current_position[E_AXIS] -= (bowden_length[mmu_extruder] + 60 + FIL_LOAD_LENGTH) / 2; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 500, active_extruder); + st_synchronize(); + //st_current_init(); + if (SilentMode != SILENT_MODE_OFF) st_current_set(2, tmp_motor[2]); //set back to normal operation currents + else st_current_set(2, tmp_motor_loud[2]); + lcd_update_enable(true); + lcd_return_to_status(); + max_feedrate[E_AXIS] = 50; +#endif //SNMM + } + 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(); + } + //lcd_return_to_status(); +} + //wrapper functions for loading filament void extr_adj_0() { diff --git a/mmu.h b/mmu.h index 9e943df38..b5419ec97 100644 --- a/mmu.h +++ b/mmu.h @@ -74,6 +74,7 @@ extern int get_ext_nr(); extern void display_loading(); extern void extr_adj(int extruder); extern void extr_unload(); +extern void extr_unload_at_boot(); extern void extr_adj_0(); extern void extr_adj_1(); extern void extr_adj_2(); diff --git a/ultralcd.h b/ultralcd.h new file mode 100644 index 000000000..80a065198 --- /dev/null +++ b/ultralcd.h @@ -0,0 +1,196 @@ +#ifndef ULTRALCD_H +#define ULTRALCD_H + +#include "Marlin.h" +#include "lcd.h" +#include "conv2str.h" +#include "menu.h" +#include "mesh_bed_calibration.h" + +extern int lcd_puts_P(const char* str); +extern int lcd_printf_P(const char* format, ...); + +extern void menu_lcd_longpress_func(void); +extern void menu_lcd_charsetup_func(void); +extern void menu_lcd_lcdupdate_func(void); + +// Call with a false parameter to suppress the LCD update from various places like the planner or the temp control. +void ultralcd_init(); +void lcd_setstatus(const char* message); +void lcd_setstatuspgm(const char* message); +void lcd_setalertstatuspgm(const char* message); +void lcd_reset_alert_level(); +uint8_t get_message_level(); +void lcd_adjust_z(); +void lcd_pick_babystep(); +void lcd_alright(); +void EEPROM_save_B(int pos, int* value); +void EEPROM_read_B(int pos, int* value); +void lcd_wait_interact(); +void lcd_change_filament(); +void lcd_loading_filament(); +void lcd_change_success(); +void lcd_loading_color(); +void lcd_sdcard_stop(); +void lcd_pause_print(); +void lcd_resume_print(); +void lcd_print_stop(); +void prusa_statistics(int _message, uint8_t _col_nr = 0); +void lcd_confirm_print(); +unsigned char lcd_choose_color(); +//void lcd_mylang(); + +extern bool lcd_selftest(); + +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 +extern int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting = true, bool default_yes = false); +extern int8_t lcd_show_multiscreen_message_two_choices_and_wait_P(const char *msg, bool allow_timeouting, bool default_yes, + const char *first_choice, const char *second_choice); +extern int8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting = true, bool default_yes = false); +// Ask the user to move the Z axis up to the end stoppers and let +// the user confirm that it has been done. + +#ifndef TMC2130 +extern bool lcd_calibrate_z_end_stop_manual(bool only_z); +#endif + +// Show the result of the calibration process on the LCD screen. + extern void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, uint8_t point_too_far_mask); + +extern void lcd_diag_show_end_stops(); + + +#define LCD_MESSAGEPGM(x) lcd_setstatuspgm(PSTR(x)) +#define LCD_ALERTMESSAGEPGM(x) lcd_setalertstatuspgm(PSTR(x)) +#define LCD_MESSAGERPGM(x) lcd_setstatuspgm((x)) +#define LCD_ALERTMESSAGERPGM(x) lcd_setalertstatuspgm((x)) + + +// To be used in lcd_commands_type. +#define LCD_COMMAND_IDLE 0 +#define LCD_COMMAND_LOAD_FILAMENT 1 +#define LCD_COMMAND_STOP_PRINT 2 +#define LCD_COMMAND_FARM_MODE_CONFIRM 4 +#define LCD_COMMAND_LONG_PAUSE 5 +#define LCD_COMMAND_PID_EXTRUDER 7 +#define LCD_COMMAND_V2_CAL 8 + +extern int lcd_commands_type; +extern int8_t FSensorStateMenu; + +#define CUSTOM_MSG_TYPE_STATUS 0 // status message from lcd_status_message variable +#define CUSTOM_MSG_TYPE_MESHBL 1 // Mesh bed leveling in progress +#define CUSTOM_MSG_TYPE_F_LOAD 2 // Loading filament in progress +#define CUSTOM_MSG_TYPE_PIDCAL 3 // PID tuning in progress +#define CUSTOM_MSG_TYPE_TEMCAL 4 // PINDA temp calibration +#define CUSTOM_MSG_TYPE_TEMPRE 5 // Temp compensation preheat + +extern unsigned int custom_message_type; +extern unsigned int custom_message_state; + +extern uint8_t farm_mode; +extern int farm_no; +extern int farm_timer; +extern int farm_status; + +#ifdef TMC2130 +#define SILENT_MODE_NORMAL 0 +#define SILENT_MODE_STEALTH 1 +#define SILENT_MODE_OFF SILENT_MODE_NORMAL +#else +#define SILENT_MODE_POWER 0 +#define SILENT_MODE_SILENT 1 +#define SILENT_MODE_AUTO 2 +#define SILENT_MODE_OFF SILENT_MODE_POWER +#endif + +extern int8_t SilentModeMenu; + +extern bool cancel_heatup; +extern bool isPrintPaused; +extern bool lcd_autoDeplete; + + +void lcd_ignore_click(bool b=true); +void lcd_commands(); + + +void change_extr(int extr); +void extr_adj(int extruder); + +void extr_unload_all(); +void extr_unload_used(); +void extr_unload(); +void extr_unload_at_boot(); + +void unload_filament(); + +void stack_error(); +void lcd_printer_connected(); +void lcd_ping(); + +void lcd_calibrate_extruder(); +void lcd_farm_sdcard_menu(); + +//void getFileDescription(char *name, char *description); + +void lcd_farm_sdcard_menu_w(); +//void get_description(); + +void lcd_wait_for_heater(); +void lcd_wait_for_cool_down(); +void lcd_extr_cal_reset(); + +void lcd_temp_cal_show_result(bool result); +bool lcd_wait_for_pinda(float temp); + + +void bowden_menu(); +char reset_menu(); +uint8_t choose_menu_P(const char *header, const char *item, const char *last_item = nullptr); + +void lcd_pinda_calibration_menu(); +void lcd_calibrate_pinda(); +void lcd_temp_calibration_set(); + +void display_loading(); + +#if !SDSORT_USES_RAM +void lcd_set_degree(); +void lcd_set_progress(); +#endif + +void lcd_language(); + +void lcd_wizard(); + +//! @brief Wizard state +enum class WizState : uint8_t +{ + Run, //!< run wizard? Entry point. + Restore, //!< restore calibration status + Selftest, + Xyz, //!< xyz calibration + Z, //!< z calibration + IsFil, //!< Is filament loaded? Entry point for 1st layer calibration + PreheatPla, //!< waiting for preheat nozzle for PLA + Preheat, //!< Preheat for any material + Unload, //!< Unload filament + LoadFil, //!< Load filament + IsPla, //!< Is PLA filament? + Lay1Cal, //!< First layer calibration + RepeatLay1Cal, //!< Repeat first layer calibration? + Finish, //!< Deactivate wizard +}; + +void lcd_wizard(WizState state); + +#endif //ULTRALCD_H