From 3c927901a4dcc4fb4bbfd6bf914a35f8277165db Mon Sep 17 00:00:00 2001 From: Dim3nsioneer Date: Mon, 2 Jun 2014 17:02:10 +0200 Subject: [PATCH 1/2] Implementation of FW extruder change retract FW retraction is extended onto swap retraction invoked by 'G10 S1'. Bookkeeping of the retract state of all extruders allows for having one extruder fw standard retracted while another extruder is swap retracted. An LCD menu item for the swap retract and recover length was added. --- Marlin/Configuration_adv.h | 2 + Marlin/Marlin.h | 6 +-- Marlin/Marlin_main.cpp | 75 +++++++++++++++++++++++++++++++++----- Marlin/language.h | 26 +++++++++++++ Marlin/ultralcd.cpp | 8 +++- 5 files changed, 103 insertions(+), 14 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 245f65c9ef..6398f4161b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -410,9 +410,11 @@ const unsigned int dropsegments=5; //everything with less than this number of st #ifdef FWRETRACT #define MIN_RETRACT 0.1 //minimum extruded mm to accept a automatic gcode retraction attempt #define RETRACT_LENGTH 3 //default retract length (positive mm) + #define RETRACT_LENGTH_SWAP 13 //default swap retract length (positive mm), for extruder change #define RETRACT_FEEDRATE 45 //default feedrate for retracting (mm/s) #define RETRACT_ZLIFT 0 //default retract Z-lift #define RETRACT_RECOVER_LENGTH 0 //default additional recover length (mm, added to retract length when recovering) + #define RETRACT_RECOVER_LENGTH_SWAP 0 //default additional swap recover length (mm, added to retract length when recovering from extruder change) #define RETRACT_RECOVER_FEEDRATE 8 //default feedrate for recovering from retraction (mm/s) #endif diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index e7282092e5..062b6d43c4 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -231,9 +231,9 @@ extern unsigned char fanSpeedSoftPwm; #ifdef FWRETRACT extern bool autoretract_enabled; -extern bool retracted; -extern float retract_length, retract_feedrate, retract_zlift; -extern float retract_recover_length, retract_recover_feedrate; +extern bool retracted[EXTRUDERS]; +extern float retract_length, retract_length_swap, retract_feedrate, retract_zlift; +extern float retract_recover_length, retract_recover_length_swap, retract_recover_feedrate; #endif extern unsigned long starttime; diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index c4afca7f68..cdbdd83ed1 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -243,11 +243,29 @@ int EtoPPressure=0; #ifdef FWRETRACT bool autoretract_enabled=false; - bool retracted=false; + bool retracted[EXTRUDERS]={false + #if EXTRUDERS > 1 + , false + #if EXTRUDERS > 2 + , false + #endif + #endif + }; + bool retracted_swap[EXTRUDERS]={false + #if EXTRUDERS > 1 + , false + #if EXTRUDERS > 2 + , false + #endif + #endif + }; + float retract_length = RETRACT_LENGTH; + float retract_length_swap = RETRACT_LENGTH_SWAP; float retract_feedrate = RETRACT_FEEDRATE; float retract_zlift = RETRACT_ZLIFT; float retract_recover_length = RETRACT_RECOVER_LENGTH; + float retract_recover_length_swap = RETRACT_RECOVER_LENGTH_SWAP; float retract_recover_feedrate = RETRACT_RECOVER_FEEDRATE; #endif @@ -1117,23 +1135,27 @@ void refresh_cmd_timeout(void) } #ifdef FWRETRACT - void retract(bool retracting) { - if(retracting && !retracted) { + void retract(bool retracting, bool swapretract = false) { + if(retracting && !retracted[active_extruder]) { destination[X_AXIS]=current_position[X_AXIS]; destination[Y_AXIS]=current_position[Y_AXIS]; destination[Z_AXIS]=current_position[Z_AXIS]; destination[E_AXIS]=current_position[E_AXIS]; - current_position[E_AXIS]+=retract_length/volumetric_multiplier[active_extruder]; + if (swapretract) { + current_position[E_AXIS]+=retract_length_swap/volumetric_multiplier[active_extruder]; + } else { + current_position[E_AXIS]+=retract_length/volumetric_multiplier[active_extruder]; + } plan_set_e_position(current_position[E_AXIS]); float oldFeedrate = feedrate; feedrate=retract_feedrate*60; - retracted=true; + retracted[active_extruder]=true; prepare_move(); current_position[Z_AXIS]-=retract_zlift; plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); prepare_move(); feedrate = oldFeedrate; - } else if(!retracting && retracted) { + } else if(!retracting && retracted[active_extruder]) { destination[X_AXIS]=current_position[X_AXIS]; destination[Y_AXIS]=current_position[Y_AXIS]; destination[Z_AXIS]=current_position[Z_AXIS]; @@ -1141,11 +1163,15 @@ void refresh_cmd_timeout(void) current_position[Z_AXIS]+=retract_zlift; plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); //prepare_move(); - current_position[E_AXIS]-=(retract_length+retract_recover_length)/volumetric_multiplier[active_extruder]; + if (swapretract) { + current_position[E_AXIS]-=(retract_length_swap+retract_recover_length_swap)/volumetric_multiplier[active_extruder]; + } else { + current_position[E_AXIS]-=(retract_length+retract_recover_length)/volumetric_multiplier[active_extruder]; + } plan_set_e_position(current_position[E_AXIS]); float oldFeedrate = feedrate; feedrate=retract_recover_feedrate*60; - retracted=false; + retracted[active_extruder]=false; prepare_move(); feedrate = oldFeedrate; } @@ -1215,10 +1241,19 @@ void process_commands() break; #ifdef FWRETRACT case 10: // G10 retract + #if EXTRUDERS > 1 + retracted_swap[active_extruder]=(code_seen('S') && code_value_long() == 1); // checks for swap retract argument + retract(true,retracted_swap[active_extruder]); + #else retract(true); + #endif break; case 11: // G11 retract_recover + #if EXTRUDERS > 1 + retract(false,retracted_swap[active_extruder]); + #else retract(false); + #endif break; #endif //FWRETRACT case 28: //G28 Home all Axis one at a time @@ -2391,8 +2426,28 @@ void process_commands() int t= code_value() ; switch(t) { - case 0: autoretract_enabled=false;retracted=false;break; - case 1: autoretract_enabled=true;retracted=false;break; + case 0: + { + autoretract_enabled=false; + retracted[0]=false; + #if EXTRUDERS > 1 + retracted[1]=false; + #endif + #if EXTRUDERS > 2 + retracted[2]=false; + #endif + }break; + case 1: + { + autoretract_enabled=true; + retracted[0]=false; + #if EXTRUDERS > 1 + retracted[1]=false; + #endif + #if EXTRUDERS > 2 + retracted[2]=false; + #endif + }break; default: SERIAL_ECHO_START; SERIAL_ECHOPGM(MSG_UNKNOWN_COMMAND); diff --git a/Marlin/language.h b/Marlin/language.h index c032aca89e..8522018bf1 100644 --- a/Marlin/language.h +++ b/Marlin/language.h @@ -171,9 +171,11 @@ #define MSG_KILLED "KILLED. " #define MSG_STOPPED "STOPPED. " #define MSG_CONTROL_RETRACT "Retract mm" + #define MSG_CONTROL_RETRACT_SWAP "Swap Re.mm" #define MSG_CONTROL_RETRACTF "Retract V" #define MSG_CONTROL_RETRACT_ZLIFT "Hop mm" #define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "S UnRet+mm" #define MSG_CONTROL_RETRACT_RECOVERF "UnRet V" #define MSG_AUTORETRACT "AutoRetr." #define MSG_FILAMENTCHANGE "Change filament" @@ -371,9 +373,11 @@ #define MSG_STOPPED "Zatrzymany. " #define MSG_STEPPER_RELEASED "Zwolniony." #define MSG_CONTROL_RETRACT "Wycofaj mm" + #define MSG_CONTROL_RETRACT_SWAP "Z Wycof. mm" #define MSG_CONTROL_RETRACTF "Wycofaj V" #define MSG_CONTROL_RETRACT_ZLIFT "Skok Z mm:" #define MSG_CONTROL_RETRACT_RECOVER "Cof. wycof. +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Z Cof. wyc. +mm" #define MSG_CONTROL_RETRACT_RECOVERF "Cof. wycof. V" #define MSG_AUTORETRACT "Auto. wycofanie" #define MSG_FILAMENTCHANGE "Zmien filament" @@ -572,9 +576,11 @@ #define MSG_STOPPED "STOPPE." #define MSG_STEPPER_RELEASED "RELACHE." #define MSG_CONTROL_RETRACT "Retraction mm" + #define MSG_CONTROL_RETRACT_SWAP "Ech. Retr. mm" #define MSG_CONTROL_RETRACTF "Retraction V" #define MSG_CONTROL_RETRACT_ZLIFT "Hop mm" #define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Ech. UnRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "UnRet V" #define MSG_AUTORETRACT "Retract. Auto." #define MSG_FILAMENTCHANGE "Changer filament" @@ -774,9 +780,11 @@ #define MSG_STOPPED "GESTOPPT" #define MSG_STEPPER_RELEASED "Stepper frei" #define MSG_CONTROL_RETRACT "Retract mm" + #define MSG_CONTROL_RETRACT_SWAP "Wechs. Retract mm" #define MSG_CONTROL_RETRACTF "Retract V" #define MSG_CONTROL_RETRACT_ZLIFT "Hop mm" #define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Wechs. UnRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "UnRet V" #define MSG_AUTORETRACT "AutoRetr." #define MSG_FILAMENTCHANGE "Filament wechseln" @@ -972,9 +980,11 @@ #define MSG_KILLED "PARADA DE EMERG." #define MSG_STOPPED "PARADA" #define MSG_CONTROL_RETRACT "Retraer mm" + #define MSG_CONTROL_RETRACT_SWAP "Interc. Retraer mm" #define MSG_CONTROL_RETRACTF "Retraer V" #define MSG_CONTROL_RETRACT_ZLIFT "Levantar mm" #define MSG_CONTROL_RETRACT_RECOVER "DesRet +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Interc. DesRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "DesRet V" #define MSG_AUTORETRACT "AutoRetr." #define MSG_FILAMENTCHANGE "Cambiar filamento" @@ -1179,9 +1189,11 @@ #define MSG_KILLED "УБИТО." #define MSG_STOPPED "ОСТАНОВЛЕНО." #define MSG_CONTROL_RETRACT "Откат mm:" + #define MSG_CONTROL_RETRACT_SWAP "своп Откат mm:" #define MSG_CONTROL_RETRACTF "Откат V:" #define MSG_CONTROL_RETRACT_ZLIFT "Прыжок mm:" #define MSG_CONTROL_RETRACT_RECOVER "Возврат +mm:" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "своп Возврат +mm:" #define MSG_CONTROL_RETRACT_RECOVERF "Возврат V:" #define MSG_AUTORETRACT "АвтоОткат:" #define MSG_FILAMENTCHANGE "Change filament" @@ -1376,9 +1388,11 @@ #define MSG_KILLED "UCCISO. " #define MSG_STOPPED "ARRESTATO. " #define MSG_CONTROL_RETRACT "Ritrai mm" + #define MSG_CONTROL_RETRACT_SWAP "Scamb. Ritrai mm" #define MSG_CONTROL_RETRACTF "Ritrai V" #define MSG_CONTROL_RETRACT_ZLIFT "Salta mm" #define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Scamb. UnRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "UnRet V" #define MSG_AUTORETRACT "AutoArretramento" #define MSG_FILAMENTCHANGE "Cambia filamento" @@ -1581,9 +1595,11 @@ #define MSG_STOPPED "PARADA. " #define MSG_STEPPER_RELEASED "Lancado." #define MSG_CONTROL_RETRACT " Retrair mm:" + #define MSG_CONTROL_RETRACT_SWAP "Troca Retrair mm:" #define MSG_CONTROL_RETRACTF " Retrair V:" #define MSG_CONTROL_RETRACT_ZLIFT " Levantar mm:" #define MSG_CONTROL_RETRACT_RECOVER " DesRet +mm:" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Troca DesRet +mm:" #define MSG_CONTROL_RETRACT_RECOVERF " DesRet V:" #define MSG_AUTORETRACT " AutoRetr.:" #define MSG_FILAMENTCHANGE "Change filament" @@ -1781,9 +1797,11 @@ #define MSG_KILLED "KILLED. " #define MSG_STOPPED "STOPPED. " #define MSG_CONTROL_RETRACT "Veda mm" + #define MSG_CONTROL_RETRACT_SWAP "Va. Veda mm" #define MSG_CONTROL_RETRACTF "Veda V" #define MSG_CONTROL_RETRACT_ZLIFT "Z mm" #define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Va. UnRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "UnRet V" #define MSG_AUTORETRACT "AutoVeto." #define MSG_FILAMENTCHANGE "Change filament" @@ -1979,9 +1997,11 @@ #define MSG_KILLED "ATURADA D'EMERCH." #define MSG_STOPPED "ATURADA." #define MSG_CONTROL_RETRACT "Retraer mm" + #define MSG_CONTROL_RETRACT_SWAP "Swap Retraer mm" #define MSG_CONTROL_RETRACTF "Retraer F" #define MSG_CONTROL_RETRACT_ZLIFT "Devantar mm" #define MSG_CONTROL_RETRACT_RECOVER "DesRet +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Swap DesRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "DesRet F" #define MSG_AUTORETRACT "AutoRetr." #define MSG_FILAMENTCHANGE "Cambear" @@ -2185,9 +2205,11 @@ #define MSG_KILLED "AFGEBROKEN. " #define MSG_STOPPED "GESTOPT. " #define MSG_CONTROL_RETRACT "Retract mm" + #define MSG_CONTROL_RETRACT_SWAP "Ruil Retract mm" #define MSG_CONTROL_RETRACTF "Retract F" #define MSG_CONTROL_RETRACT_ZLIFT "Hop mm" #define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Ruil UnRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "UnRet F" #define MSG_AUTORETRACT "AutoRetr." #define MSG_FILAMENTCHANGE "Verv. Filament" @@ -2384,9 +2406,11 @@ #define MSG_KILLED "PARADA DE EMERG. " #define MSG_STOPPED "ATURAT. " #define MSG_CONTROL_RETRACT "Retreure mm" + #define MSG_CONTROL_RETRACT_SWAP "Swap Retreure mm" #define MSG_CONTROL_RETRACTF "Retreure F" #define MSG_CONTROL_RETRACT_ZLIFT "Aixecar mm" #define MSG_CONTROL_RETRACT_RECOVER "DesRet +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Swap DesRet +mm" #define MSG_CONTROL_RETRACT_RECOVERF "DesRet F" #define MSG_AUTORETRACT "AutoRetr." #define MSG_FILAMENTCHANGE "Canviar filament" @@ -2582,9 +2606,11 @@ #define MSG_KILLED "LARRIALDI GELDIA" #define MSG_STOPPED "GELDITUTA. " #define MSG_CONTROL_RETRACT "Atzera egin mm" + #define MSG_CONTROL_RETRACT_SWAP "Swap Atzera egin mm" #define MSG_CONTROL_RETRACTF "Atzera egin V" #define MSG_CONTROL_RETRACT_ZLIFT "Igo mm" #define MSG_CONTROL_RETRACT_RECOVER "Atzera egin +mm" + #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Swap Atzera egin +mm" #define MSG_CONTROL_RETRACT_RECOVERF "Atzera egin V" #define MSG_AUTORETRACT "Atzera egin" #define MSG_FILAMENTCHANGE "Aldatu filament." diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index f09dd410d6..da28901f8b 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -194,7 +194,7 @@ static void lcd_status_screen() currentMenu = lcd_main_menu; encoderPosition = 0; lcd_quick_feedback(); - lcd_implementation_init(); // to maybe revive the LCD if static electricity killed it. + lcd_implementation_init(); // to maybe revive the LCD if static electricity killed it. } #ifdef ULTIPANEL_FEEDMULTIPLY @@ -903,9 +903,15 @@ static void lcd_control_retract_menu() MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); MENU_ITEM_EDIT(bool, MSG_AUTORETRACT, &autoretract_enabled); MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT, &retract_length, 0, 100); + #if EXTRUDERS > 1 + MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_SWAP, &retract_length_swap, 0, 100); + #endif MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACTF, &retract_feedrate, 1, 999); MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_ZLIFT, &retract_zlift, 0, 999); MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_RECOVER, &retract_recover_length, 0, 100); + #if EXTRUDERS > 1 + MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_RECOVER_SWAP, &retract_recover_length_swap, 0, 100); + #endif MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &retract_recover_feedrate, 1, 999); END_MENU(); } From 2d22902d080b08c65ebdf5f8b3f03529ccd58144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Thu, 24 Jul 2014 12:04:02 +0200 Subject: [PATCH 2/2] Fix for a wrong checksum truncation for certain commands Positioning of string terminator to truncate checksum from the commands M23, M28, M30, M32, M928 and M117 was off by one, causing the last letter of the actual command to be truncated instead of just the checksum. In case of the SD commands this caused checksummed commands targeting existing files to fail since the last letter of the filename was truncated. In case of M117 this caused the last given letter not to be displayed. This patch fixes the off-by-one error and sets the null terminator on the exact position of the * starting the checksum instead of the character before that. --- Marlin/Marlin_main.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index c4afca7f68..c09585e5bb 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -1693,7 +1693,7 @@ void process_commands() case 23: //M23 - Select file starpos = (strchr(strchr_pointer + 4,'*')); if(starpos!=NULL) - *(starpos-1)='\0'; + *(starpos)='\0'; card.openFile(strchr_pointer + 4,true); break; case 24: //M24 - Start SD print @@ -1716,7 +1716,7 @@ void process_commands() if(starpos != NULL){ char* npos = strchr(cmdbuffer[bufindr], 'N'); strchr_pointer = strchr(npos,' ') + 1; - *(starpos-1) = '\0'; + *(starpos) = '\0'; } card.openFile(strchr_pointer+4,false); break; @@ -1731,7 +1731,7 @@ void process_commands() if(starpos != NULL){ char* npos = strchr(cmdbuffer[bufindr], 'N'); strchr_pointer = strchr(npos,' ') + 1; - *(starpos-1) = '\0'; + *(starpos) = '\0'; } card.removeFile(strchr_pointer + 4); } @@ -1753,7 +1753,7 @@ void process_commands() namestartpos++; //to skip the '!' if(starpos!=NULL) - *(starpos-1)='\0'; + *(starpos)='\0'; bool call_procedure=(code_seen('P')); @@ -1776,7 +1776,7 @@ void process_commands() if(starpos != NULL){ char* npos = strchr(cmdbuffer[bufindr], 'N'); strchr_pointer = strchr(npos,' ') + 1; - *(starpos-1) = '\0'; + *(starpos) = '\0'; } card.openLogFile(strchr_pointer+5); break; @@ -2193,7 +2193,7 @@ void process_commands() case 117: // M117 display message starpos = (strchr(strchr_pointer + 5,'*')); if(starpos!=NULL) - *(starpos-1)='\0'; + *(starpos)='\0'; lcd_setstatus(strchr_pointer + 5); break; case 114: // M114