From e056bf8081a942335a2e097d36a2fb35a4c34eba Mon Sep 17 00:00:00 2001
From: Erik van der Zalm <erik@vdzalm.eu>
Date: Sun, 4 Mar 2012 16:34:58 +0100
Subject: [PATCH] Added E-Jerk

---
 Marlin/Configuration.h |   3 ++-
 Marlin/EEPROMwrite.h   |   6 +++++-
 Marlin/Marlin.pde      |   3 ++-
 Marlin/Marlin.suo      | Bin 12288 -> 0 bytes
 Marlin/planner.cpp     |  21 ++++++++++++++-------
 Marlin/planner.h       |   1 +
 6 files changed, 24 insertions(+), 10 deletions(-)
 delete mode 100644 Marlin/Marlin.suo

diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 74c03eb04c8..379aa1953b5 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -171,6 +171,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
 // 
 #define DEFAULT_XYJERK                20.0    // (mm/sec)
 #define DEFAULT_ZJERK                 0.4     // (mm/sec)
+#define DEFAULT_EJERK                 5.0    // (mm/sec)
 
 //===========================================================================
 //=============================Additional Features===========================
@@ -191,7 +192,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
 //#define ULTRA_LCD  //general lcd support, also 16x2
 //#define SDSUPPORT // Enable SD Card Support in Hardware Console
 
-//#define ULTIPANEL
+#define ULTIPANEL
 #ifdef ULTIPANEL
   #define NEWPANEL  //enable this if you have a click-encoder panel
   #define SDSUPPORT
diff --git a/Marlin/EEPROMwrite.h b/Marlin/EEPROMwrite.h
index bb25ae89600..d639e563993 100644
--- a/Marlin/EEPROMwrite.h
+++ b/Marlin/EEPROMwrite.h
@@ -38,7 +38,7 @@ template <class T> int EEPROM_readAnything(int &ee, T& value)
 // the default values are used whenever there is a change to the data, to prevent
 // wrong data being written to the variables.
 // ALSO:  always make sure the variables in the Store and retrieve sections are in the same order.
-#define EEPROM_VERSION "V04"  
+#define EEPROM_VERSION "V05"  
 
 inline void EEPROM_StoreSettings() 
 {
@@ -56,6 +56,7 @@ inline void EEPROM_StoreSettings()
   EEPROM_writeAnything(i,minsegmenttime);
   EEPROM_writeAnything(i,max_xy_jerk);
   EEPROM_writeAnything(i,max_z_jerk);
+  EEPROM_writeAnything(i,max_e_jerk);
   #ifdef PIDTEMP
     EEPROM_writeAnything(i,Kp);
     EEPROM_writeAnything(i,Ki);
@@ -116,6 +117,7 @@ inline void EEPROM_printSettings()
       SERIAL_ECHOPAIR(" B" ,minsegmenttime ); 
       SERIAL_ECHOPAIR(" X" ,max_xy_jerk ); 
       SERIAL_ECHOPAIR(" Z" ,max_z_jerk);
+      SERIAL_ECHOPAIR(" E" ,max_e_jerk);
       SERIAL_ECHOLN(""); 
     #ifdef PIDTEMP
       SERIAL_ECHO_START;
@@ -150,6 +152,7 @@ inline void EEPROM_RetrieveSettings(bool def=false)
       EEPROM_readAnything(i,minsegmenttime);
       EEPROM_readAnything(i,max_xy_jerk);
       EEPROM_readAnything(i,max_z_jerk);
+      EEPROM_readAnything(i,max_e_jerk);
       #ifndef PIDTEMP
         float Kp,Ki,Kd;
       #endif
@@ -179,6 +182,7 @@ inline void EEPROM_RetrieveSettings(bool def=false)
       mintravelfeedrate=DEFAULT_MINTRAVELFEEDRATE;
       max_xy_jerk=DEFAULT_XYJERK;
       max_z_jerk=DEFAULT_ZJERK;
+      max_e_jerk=DEFAULT_EJERK;
       SERIAL_ECHO_START;
       SERIAL_ECHOLN("Using Default settings:");
     }
diff --git a/Marlin/Marlin.pde b/Marlin/Marlin.pde
index de02c88024b..e82afabd48b 100644
--- a/Marlin/Marlin.pde
+++ b/Marlin/Marlin.pde
@@ -97,7 +97,7 @@
 // M202 - Set max acceleration in units/s^2 for travel moves (M202 X1000 Y1000) Unused in Marlin!!
 // M203 - Set maximum feedrate that your machine can sustain (M203 X200 Y200 Z300 E10000) in mm/sec
 // M204 - Set default acceleration: S normal moves T filament only moves (M204 S3000 T7000) im mm/sec^2  also sets minimum segment time in ms (B20000) to prevent buffer underruns and M20 minimum feedrate
-// M205 -  advanced settings:  minimum travel speed S=while printing T=travel only,  B=minimum segment time X= maximum xy jerk, Z=maximum Z jerk
+// M205 -  advanced settings:  minimum travel speed S=while printing T=travel only,  B=minimum segment time X= maximum xy jerk, Z=maximum Z jerk, E=maximum E jerk
 // M206 - set additional homeing offset
 // M220 S<factor in percent>- set speed factor override percentage
 // M221 S<factor in percent>- set extrude factor override percentage
@@ -1116,6 +1116,7 @@ void process_commands()
       if(code_seen('B')) minsegmenttime = code_value() ;
       if(code_seen('X')) max_xy_jerk = code_value() ;
       if(code_seen('Z')) max_z_jerk = code_value() ;
+      if(code_seen('E')) max_e_jerk = code_value() ;
     }
     break;
     case 206: // M206 additional homeing offset
diff --git a/Marlin/Marlin.suo b/Marlin/Marlin.suo
deleted file mode 100644
index 4aca6fed8d686cdd38cac7ac6fb2afd527ff510b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12288
zcmeHNU2Ggz6~1=j#&H9*KtmcryG;WPt!Fd)znkDT-d%6g){dR{CxtFa_h;-(yxm>R
z&L$3VBt%v5fCMUS)k-`dK)?gMR7gm?lpyhlR9+~&(Mm-KRYHA>cp%~X?##8<Ywzx?
zy|#?hvpRF{+<WJqbMD-G{$~ID?)~ro<n6;Bh$eVa>=AeF?icqowD+M-lyILA{iyK%
z&fU9rokk&0{RIAxR^Y$jb-;axdr|Uz4+8fAhk*Nmc-7)w-~r&LfS(3_2KZUv{lL!y
zKL>mOco4|_K>P%D{|cNJ75r@B6Jw%`(h}G42ED^UF|cyxsSn!0`@g?^boM`g>f3`s
zw;psxPJv=YToKQJ`aEi5VyWE}>-r8t3pK9tx&bX3xTgs-A}4BMQH%={r7dQ0HNcZ<
zuQ|h7UXO|XKAr`hA@b33U_%FWCeIjQ26U@pO46*kJQ!Gu0$RMlL!i$y$Fu8|KHt-T
z`?Azo<vZaVl!H2e=bt?C{8JC8aXkO3&Nbxuryk(>ryfu`;0vf90&?tOw`BcGs6PaJ
z80Z5&0z3+Q6nG5yW#CtUj{%PZzY2UD_ylkmr~&=J6F?mp00w~}U>FzyMu9P49GC!}
z1fBwZ4LAZMA5Wn?4IBj~fhk}bI0noBp9U&9pGEyS;5cx?ZJ%_@b8b0}at1gHoC96}
zJ`YrLu*~BAn{L}BlrOsVJj#Mw=Ubn5>v&|_;Wv-?fAx=|G5NEf-}A4tf4KY%NOuJv
zr?^A506Ywok|p6lKQ0&NYH1^1UzoCtno+iMwpl4p<qC_r1!LGZXIM4dj|6nT{0;k3
z^^#q;jFGZYx2;@h*f&+rm(0R*#`T%XqEQ~n>!JC`d~7}tC`R;LD7Q}%Qxx~sC(MFX
zsa57}|D0K?=StIdy=Yeal7$7sTB*!bDy0i%xmdYY^QUumZpN(E{8MJRoXeLCc{8?T
z8|9jrH%q2{-9JT6YiKDLPmIfoVez?XyJ8uX^Iqvc?X>s<l)T(Kp&P_hBD)Kcs+3Ab
zfp3o__i~A(;@Q6kxA*Zvpl`8RP%m*S&+}ZTpe3>^+P{W+Qj}mDOxS`fG=m|ngbfQ-
z#r*_&EcBbu)XjI@aYCKj3*bE81{S0oj#XU%k2&#@@Ij-Q;FdD@pjDTk8Kcmw<eZY_
zMO`f5N4s|cPuQ5{vK-x+Gau{^_b>H7%g#?Y@0+%Q&`duG9t`lXh;^>W^|iruYd8-2
z%2)MDpMETLGohJ2{SVsSDptV+2j#ZZX{-ACC<|#5<fI)g^q-aeZ>G;TRTf1t4cc|A
zMJGRi^l7g-pI7?ySI$!X08CJz2UY{lLuMbW7d@dm-a!d>(`c)MAFhQD)>eo0)v<Ht
zaALCZSsP_da!UL5ePFkHaBDnpzm~Ae=RtRs6Lr6PICA*h4Qs?5R=}F^y&71vt%AFi
z)=aaNwlx!VxasTA->G{@<Z*QNiZ}YwCw2U8j7CGzNF)~2l7U!M3#Wn^Es+ewwb584
z84c=@L?jl!xjd1xN@m%AwXjsRDp!_MC$qCP82fCplrybt+Ndqsm1@=*r3yGHa83$E
zf3;{VFW-nKL-8Pf8fFb@fj~N-#p5wu(*c=yED}qkgEwE>Znj$MpX)eNd7S!E+a;v_
zk&4f~v>ohr(ic|an(0qqN4^BAj6*NDy09Xywba7HE`91$ulkRnCw+B7GyRS2Pa`MJ
zbLtufea1xeVZ74+BE~BHPkUoSW(#MM8h6!FtH{{ES+${UX^S|L*Hw#na?9&q!Tfcs
zxifR4q*I{Dn6#ZG)Lr_F`@G731Y<9|3y=nlR`gXYo|ZmI4o|HIKjMEzAhhXT={N2_
z+F5EsC8M*>^N@N0t@NK%&wAQy!TytUNt>|osI{$6;`WNGASZFguD}nYuh#sI=VS!C
z_SxpUqga3X(TuUZ(m#W-N<WvgD{AR7lu}wB3yelmQ7svYB((5YH~{Sz)wK|mVj>t!
z1xJHBpp?qlQm(vEN3`en%+%}Kttrc{9`8ndFZYQ)WueT|yVS-EisV~r@gf0zEEA0D
zS|S>VY2l0>*5c7jSPLXFv9WMG70sjq-C4g&R|8uyfXO#^gf-WmcVU^AldmeyGRaUn
z5DSiKWATu#g#+n~mP{vDi$&A1(P&gpB)u-0VVR3+y}D;A`NQ4E({g&3?)zp{dPwv^
zEB34NitbU=sjSo6?uKnf<89186QB+pxs^nP!Rb!$-@O@e*<2}{^=I-{!D&<^|GQJU
zD>hZ>2%zq~mCT<{z|$y6KZDUWGfRxQ`BlLAHo~m6lPfzVbKEzOwT>d=9YwY~f=qW1
zS@9%d^B7t*j7Xs+gIYqi#!(wZUj%ni^ysK1<a2Rx6VZGT-t}6#lQR3!NR=6bwPO@-
zj(5tjgEDX5OWsb2r$D!tGy27O__@r4@vDy^mfaX5gmv*FgOHT|9<yJ}{uM!eb>;cx
zptroN#va}9!LKo+GA1y^RmhM6-wTq{K^cW?JS)F{YzLh4!IuXQy~>_8W>)=>uYmZd
zx^fPvn|F>H*Xyu2BX>&?S4%WzQrXM?#!TJ%erHtcD<m4SW~0Bj`u2(OA07JT3;BUJ
zmRgPWI<D388?~pf&v_PVGVf<V7c@s98$Gq!#_yl}{>SfqUgM9(_)F;##=%wa!pNU1
z?PwduyX}GW8Ba5&_e!51xsGuw0cH_TlWI=p!ip<8*U@XMakevh{gv?-=_*)1Vtq@a
z{AUnp7A5U6WG;c5jEqQ~{pN{&*YRf~eQLY{vh9pNnQ><BdE8x(c5%0o3i+R|>7T{J
z{N_SX@84PP8E{d@UbI*K4`3lP(Jlr@{-JC7jq)>(?Q7z~;mq3=|38os-XRR<9`N$i
z6b4!Dz)8r<{55m3#D#{PpGJ!s*J@twf6`@6#Vh^u82eLq|Fa<Sn{zL%+ekxZt<k!H
z%o-TL-HSc6AJk@CMSj2F7cD>Rg^=D;v4>O~e~sCp5>8JMRI2g}JO82Rr9A5?Q66S*
zdP!xi)m5^%TLiRP!!dYD{0GsZJf{{)eq)@2m#M=e<+mdKL!&i3|1SNR&BMjsxgHxW
z_4l6r%LCWm`RLVG?)-7~#KRwasM5SVY6>>bJf7?!{~K-nTg81xe*4aw=MLn4{N8uo
z%O)5`D86Oc{Pw)sT_yC9P3YgR<Kg4(1nPfQ>i<{MIIr{p_zjwxv6BT<`cDa^_-a>v
z1D%8JfOh(qK1s0MMCb#3`Tt19apa-HaM}F=t}nX-JJAnym{7^j|5bUVf3bnSN0wW1
z(Zl__krMj*ug~7De)#xnKlt6Ful%z*H+#kvlcFkU$(xss{C4UON0AOa__y1}@JCM%
zeVqRHU%&O(CH{3x@vcfQtZvJgPW!LD_ICEa5`v`{CUY3%b^nJuOvv-sEq%uI-|aAO
QH{IRR?`Cc<W4A*8f1$BcL;wH)

diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp
index 5972dafea57..84c0daeff73 100644
--- a/Marlin/planner.cpp
+++ b/Marlin/planner.cpp
@@ -74,6 +74,7 @@ float acceleration;         // Normal acceleration mm/s^2  THIS IS THE DEFAULT A
 float retract_acceleration; //  mm/s^2   filament pull-pack and push-forward  while standing still in the other axis M204 TXXXX
 float max_xy_jerk; //speed than can be stopped at once, if i understand correctly.
 float max_z_jerk;
+float max_e_jerk;
 float mintravelfeedrate;
 unsigned long axis_steps_per_sqr_second[NUM_AXIS];
 
@@ -531,6 +532,13 @@ void plan_buffer_line(const float &x, const float &y, const float &z, const floa
   if(block->steps_e != 0) { enable_e0();enable_e1();enable_e2(); }
 
 
+  if (block->steps_e == 0) {
+        if(feed_rate<mintravelfeedrate) feed_rate=mintravelfeedrate;
+  }
+  else {
+    	if(feed_rate<minimumfeedrate) feed_rate=minimumfeedrate;
+  } 
+  
   // slow down when de buffer starts to empty, rather than wait at the corner for a buffer refill
   int moves_queued=(block_buffer_head-block_buffer_tail + BLOCK_BUFFER_SIZE) & (BLOCK_BUFFER_SIZE - 1);
   #ifdef SLOWDOWN
@@ -555,12 +563,6 @@ void plan_buffer_line(const float &x, const float &y, const float &z, const floa
   block->nominal_speed = block->millimeters * inverse_second; // (mm/sec) Always > 0
   block->nominal_rate = ceil(block->step_event_count * inverse_second); // (step/sec) Always > 0
 
-  if (block->steps_e == 0) {
-        if(feed_rate<mintravelfeedrate) feed_rate=mintravelfeedrate;
-  }
-  else {
-    	if(feed_rate<minimumfeedrate) feed_rate=minimumfeedrate;
-  } 
 
 /*
   //  segment time im micro seconds
@@ -705,7 +707,9 @@ void plan_buffer_line(const float &x, const float &y, const float &z, const floa
   if(abs(current_speed[Z_AXIS]) > max_z_jerk/2) 
     vmax_junction = max_z_jerk/2;
   vmax_junction = min(vmax_junction, block->nominal_speed);
-
+  if(abs(current_speed[E_AXIS]) > max_e_jerk/2) 
+    vmax_junction = min(vmax_junction, max_z_jerk/2);
+    
   if ((moves_queued > 1) && (previous_nominal_speed > 0.0)) {
     float jerk = sqrt(pow((current_speed[X_AXIS]-previous_speed[X_AXIS]), 2)+pow((current_speed[Y_AXIS]-previous_speed[Y_AXIS]), 2));
     if((previous_speed[X_AXIS] != 0.0) || (previous_speed[Y_AXIS] != 0.0)) {
@@ -717,6 +721,9 @@ void plan_buffer_line(const float &x, const float &y, const float &z, const floa
     if(abs(current_speed[Z_AXIS] - previous_speed[Z_AXIS]) > max_z_jerk) {
       vmax_junction *= (max_z_jerk/abs(current_speed[Z_AXIS] - previous_speed[Z_AXIS]));
     } 
+    if(abs(current_speed[E_AXIS] - previous_speed[E_AXIS]) > max_e_jerk) {
+      vmax_junction *= (max_e_jerk/abs(current_speed[E_AXIS] - previous_speed[E_AXIS]));
+    } 
   }
   block->max_entry_speed = vmax_junction;
     
diff --git a/Marlin/planner.h b/Marlin/planner.h
index 8fa4d4ec340..873441bb053 100644
--- a/Marlin/planner.h
+++ b/Marlin/planner.h
@@ -88,6 +88,7 @@ extern float acceleration;         // Normal acceleration mm/s^2  THIS IS THE DE
 extern float retract_acceleration; //  mm/s^2   filament pull-pack and push-forward  while standing still in the other axis M204 TXXXX
 extern float max_xy_jerk; //speed than can be stopped at once, if i understand correctly.
 extern float max_z_jerk;
+extern float max_e_jerk;
 extern float mintravelfeedrate;
 extern unsigned long axis_steps_per_sqr_second[NUM_AXIS];