From 27ec3504c955ffed0e18e90912542fc7b2f1d244 Mon Sep 17 00:00:00 2001 From: Jens Hauser <44340656+JensHauser@users.noreply.github.com> Date: Thu, 30 Jul 2020 21:20:29 +0200 Subject: [PATCH] works, except that function "user_tool_change" starts the tool change and it will interfer with further g code running in parallel. tbd --- .vs/Grbl_Esp32_JH/v16/.suo | Bin 69120 -> 70656 bytes .vs/slnx.sqlite | Bin 1110016 -> 1110016 bytes Grbl_Esp32/Custom/4axis_xyxz.cpp | 471 +++++++++++++------------------ 3 files changed, 192 insertions(+), 279 deletions(-) diff --git a/.vs/Grbl_Esp32_JH/v16/.suo b/.vs/Grbl_Esp32_JH/v16/.suo index 58d815da5fc335227af72fd9bcf30165858e82d6..fae0635f5cd3b7a4248483068a7261ed92c7a4e0 100644 GIT binary patch delta 2387 zcmdUwZERCj7{~89y1|^;uxiSVGN8=*n~|6ZO0sB3~&h3@UjeS3?gF# z7aXw(?LE=@0gYbGB!-yL1ENTz0W{MX!v|uB9|%EWj3ER_Nss{b|J+u^sfqZ_)BJj# zbMAT0x##?!=iI)7YTqF>>MQ0-wv1Mk0+=RnKb=lfFWIgmp^1Eyd*ug1@y_p<7d^>k zVkh6p%ET?cT%6$*!pBvy!?ZM)(OfDJeVeB{$hZQicmz`?_AY=m4dj6w;0B|B4NL@9 zFbR|byut6K8tw7G4kiE#SPE)DA)tZxz;xJCz&L>2D31akZ~$y+e)oFg6yN+B+3SJ|HJ5jahp!>V~X61ND=j2`mT8KoA5#GYEke zPyuL;r%|uW+B35?^{(l&<;nSujj-u?C+f|yP(kk2Y)4Nlw7|X_jb5-1 zXnf14?kioN{X5~z@F3wt%Hr%Dg9aTboe0TB3sNEZs3vjUV5EHXjO23yl9}WjDIYEL zpnN3PgYsdDW|}8GLchP2kEAIFlfgg9M|1rj<;#2DOk27i>nIQ>^V~-^l(2-oj^#4i z5ap^NSJ)BA^w7Cy1au7jCr6pew{zXC>N~kUfot9dl`<@|h&N!QddeFxGfEectSuMe zSrOgEwZghwMu9=ukr`ds&oxEdDQwJDD0(QlGY`f^w9;Xf?iFgwRH>cmi@3JPE!@tj z#tLC4wnO1Xw}Ij0->b^oPAk(Vajmr8N}Hz}ATwcU%b#aUl)JffcfW^IqPU`rr-61# zP>D@87eES9u<*&Jh*g_Kf|*rxsq-N-ajt zhF6uj7Gs9Qo>K=zw973%zmX#@C4UrqV!a}HY@x9u?c^ruJN<@9KW7yeZ%voizPP}$ zZ@z&6xG+FB3kQ=ciUKwY)W^sxZBR!eg)z(*OveQ delta 2975 zcmc(hdrZ?;6vuz}_6Ma<9?r^8QOje1TD0XMh^Q49W4>A#bI2;bojOJlDpR*eS@uBJ zIp|R^h%WvxggBP4-b_tqCPtPxr_p7Lafu=PVX|!dW6Q*CKD%@JV2sVgC0o4Y!@2j| z^SiI#_nu#!J+iY?ZZU$DjHz&G+k;1scU@O9FLWz*6w?QFRN} z%SN?LSbus{d*!J5hSt)VjW3OIY{vQ)WGhk~@IM)_cC@v~Hlz-zM;yp@qyc#q*@5gt zb|J4JuOm)`78xvMk{$mXk{*{;BRL?NuZkMl`_8}601T^jjT#*GK8{HTMhXZHA5;Rh zNe!d~QUED|e54;z04agmRDw$Ix4ho5N=U-kF-mCkNg)k8MoGb^gbehBAVDQWV0|1y zN}vgXN|+aDk5vLmlaxTQw7C%_1bpQ8dRwbP|4|mXqoV#-SxgB`^k2z>VMgGH3Xz!v z(cuT;W?+3LVnEW7Sx627r^EHxxmcNt|%JFmb;6K!YE;qhG|K{QS4%FeIX@5aOmIU z;UREG|Ez{B!~hbves8$j^<2+xQd?0aFl;EIy9ICw~I>^=`8ex-ImzFyB>p{gFZe@rc~-* zZ@k4nF(qC9#PJsY7N@ur4|ms^LyOl|*KcfuOBI>0@31E76}w}Ly=L`#dyS*cUM*TG zYnhVIp$_(eu{%z5=?862PWimnj+gSufNk(uuaYN7GsC0$>8*&CV)MSCeBvZ(D*ull^ zWoqt@$N83~F`4ps zUvy0L?k{H^-9^Tx!=(wCo;C}E%WWo=Bqc)2%}Fq&Jqa$f$HVUSaIhWFg%sm=ItRAh zDizk|J~pD+pz44$o8~fr*`*U^S3l-&Sk$r5-O&xE!;_%D1Mn3`L;vwq*mEdHadSAT zG-GuSwAi9y=vXSK54Vqmd~?{~QO+{K4tg1Ur5NGou0lxSI{Zm^q2r8Df30OB%{}y# z=s(Ud{D@Zt{U2shADH*czRXGQ46b&i3v+KjgWBF|7~B*O&3!s?y)T&ohZ3kgDvPDv zr&J)@@}ny*(~mX@f0QhcBBk*51T8ax*=EL_$zs5k&ser#C%jB)<51A+f|gY&!gDH- zvtD3l-iMZH@sM@e>FHn`nm$@6hEM;X5gX2TGFWqZtJr$6O$CFu(nQ*|Yq*%9EU^8i z73S->vi^I?PEvB`_hjWtSbLp{)qK*!Di~h*gK%Zj4AI>8JBzvhg}UtCiFYjq zb!$R`?%I5?+KeNMQwFEPFU{2_yQA2zto@3HnNPNjV=)}um)F3Ns$3WtI00qlD^9N9 H?0Ccs z6<1x$t}cknz^ce%11yNTtQE2Rlzm;q=-Lav=ggfua})J_|9E#k8^7myo^#G~pYxpO zo_n5${xjwMXUcC(rG=F@rO$!CdsiPyN2U9+G7i#lWyM9M#ihmB#nYyjPMTg^w(o4# zkcmN-9sAy$cu}@^mV*C1Xga&k*zmTg0Pq9x%mg&QvA)jUX>&H)-9o73`0pQLm`G^5c~=MWoh6b(>eG{?J}L)XLOx3<>Y6vvk>ZZ zdfQvtZC2pyG_o0l(9-U(7q#gxd8|KvJU{8FjgO97zRmr3ZQefq;&_3~h#8>F8L z+~(VN$4i?H^!Ais+S^~F%zdNYxpfCW>53hnol6S-wIW%CFIAYAE7Wu=PmM(qzs$a- z(eCxOceZ+9BJoXyo4J~&CXC?1qel4&O+1y1MBZ!ncs)^Sa8_liI#W|+`V?iX#4CBq z3}bnl?Jb%ql2`Cl29P~{9(V+y8T&Qp0Bj#jzk zWn^TLZ*;YHHaqMZ{nDz;s(#a}(p0#jDqDsAs@#Hz1r{k5P>oaWuzIu>3LdLUU!jPa z8+a;*=<;hjrq%P*7%fYyXIh=gboV%$tiA2S#-Cjs)wQWQYF1x$x~l6v)$zWF0`pV_ z-0fBe@yY0tB+pf>?6$j{Zm-6G=4z!+grV(Yu2NVox6|viIUSl_X_bn~5tecIWI@Z^ z%!o=!u1uC?0Q+B-FF zol>IMp+jM4tesx0Y;tYHimgTFM8(CmT9X@daz0t(rlT3YCQ-RIPY$Xnu;S zwP`_WlVY5dixlPBOFd1_ZtcRRj#t)5Lj zRZVJSWfHR#k0K*!CQrAn|r6&iXdJT5Gps*yF^Tc`6Z{uG#9fMopNRq6}#3_IRBgO}|nnF?{@$Ws$x-E2-+uud-w+39r;iy*-VYcr=Su8|zC><|!YY1ev~d9?Bz zHfKkNwX<2fEH~FBM~rTcQ-tO${#E}plM^2>!V?ysXpp=o9oTf6a%KRig#BnsjHY*S4~D_)FBfY za6ZtG=+V}_MkNPN)Tfx0-lGst#S@7hkILQeLI>E0BKVLOsXG9l_M&`M!FMguIQ4T3 zX3j~4&IDtl8|eMaQUK zAGI3pS|988hxG_fbKw^iJ__{73QqDvxHi)w@3FbtU0&)Db)a}ZMCy28*gQQkD$eRf z=4_>Fvj1XuMsTiX`qwJ*NB7iCAbOo|_ZF>%hw#wzl(sbU#^h{h8L%VD>= z3tJpkI1jo!B`QC~4-uJk4I2^6?dnrmss6FB-Bebg)#1>Lo9TzxT!_EzMTvQes;Pd6 z$-~8CW8sN?C}pbpOnJ&PEvmFs)K(UCL>DK~pG%xu;%nxWSJpLFs+wS5AIh4q^v?EY z!^E)a9_19+)ZuJ~vr(swx>FU;^h4Yp4$clrlqQv*=7+FN&VVkf8%~IDVAgUo{1CHA@8LQ`duRB4 z5V?s!U_vSY&rt`yyiGy%Ckj@Iyo=b2Kcg{T1H_ z;V#n;ah-e*)O9-?zmg#F(4U~Z6Kbp;a1QO@xqb-qWzctSx3#m++S&SB{WJU!@`(l& zR@(@ERd}Cd`bQ}m%&BZFA0ZJI$neAafQ(R5-1A#}d~9QE0}gFOIqC*X*@W^`Y}pjs zuEN*2{c#*WP>$D|BC#!p8?_H2}sr0B5tiOooTbKnm)qqJN_ zKGmnZBwY5+CisRS=j3Rg;ANKN$hJ(|tf<`KvVrsVl(4lv?(hNM;do~Qwe;>6UR$dhstPG*z4h=8Xmi+-DcOGB(hqRT``Oe{iDa6 zG`nIEA~5`j!GOo_??<}T=rq=!L9@{5P|X>1U>1rCaoO}agult5r--H(lwYVgm%fHW zkKiZA(wi@qnM7s{oQ_cT7pBLl90lGKr52MTt zd#fi;T8^_HqZ8mF#jOIn3hF{NkI{8}yzW*iJ|f&>b#&WNt~2z=0s2RpLG0V1KR-dA zK{TBmy6!13=tPve4(>V1LB71(?S^C9@&=~|<+cK`2#64MfI>bs!{mB(u5F>iPtz4~ z=zh$-N?Ssgze>j;J-sOQ3#~axpGW8$%z2qweD~|L$!BCT7#OnA3p*1PoP-&+#hOn+ zvp3e<56$*i^Uu&+9&6qQ%>}XM-O#)=*4zcn!dNp1%}i(}M<%`++NK!0AK&yEoe;YG z4f>%4EVGb$8a$0jLoEF~a~ICeVOm00=P;L|If={!Cj4#P1bv%4;fJtv{U&woZ&I7F zn8(zhT0FGakcM4(Oi|Kr%54nZ^KMq?^*m-`I{zm1Hl4s>aW->D=)i0y10{!q-~2uB zriEe3`NPzmu5M2oB3>T`%s&2bti>IJR$`dJ9p$4!x}T%41bW~~3rZXn+uCeQRn`&oQ3xFrUAW3VR%oiW%cGfN}dTRLK7M+~lu!PXeG z#^CB0Y>L6<*i^+F3qRmE#JsF~iMk`KGxHL_n-usWz^w{A4sc_5u`&?z3^cA#=>Gs% zr@*HHmWM_15fg$&jzZrLFiC-b1E^ErJnZyKSNWy46q`jG_hNJ9HaLJJUlF}+%l z#Wqr8)kwmXBMDcGBwRj{u*}G0(NS|atizh23m%5MSpO%~PjM{!9s3{lOekSDGZ*2@ z?_p-3o3QgaHZgSfb8H2|=l;m#$Dx89rspXGT&PWL@}dG?DCb`0gDaUS)IWD}>^nO@ zW>4{^v*d@LMC^u9^m=NPt<7#*7l}=AyH>JEcqPrIj-uZj&Poq$r`a?^WfD`!gu7Hv zE^|1QZ){{{ev_O%L{U`oucWgBFimpkf{CTGdG2TGkIeO0C}!{Fbx-U5ti$9@l!u3k z*>x9lpKz~of9G~{TRA&d^?(0`)|RlPC;`U%QoXNja@(!Y{typMVN-l4*9DDdfEjt( zccJ-stobi!-XCke0?l2q<`HOai#7ia&E8mZA2i`CqK^C^G?&Mk_ds(&b*#M`+Ly+f zcR;f+*1Q3lnX%^e&@{!G*M_byW1Vy+SXLu+6*M(M0laq#n;yDk3j6XrbT{Vu*)68A z`Zx54^jGK~&|jR$E;i|)fEEA;Up<9^nUQpj1yCZt#G%z%r#WsD&Zp430=B9)SKVqMd(!?HTdozjU*wEaHB9NY!IA6vv7q_CzK0Qg+d`$NEY-0;=kcP530e88S!Ut|xne`6nJ?`Cgdcd%Pn58KABWEZj3?4@i8TfnBV zaV*FDz?^43X5M06VV+?QFpt3N05jJzex`?6$E;?SF!PyN%p_(!lgY$0BKPfL*Gx|M&CeRMfcI2(nZoJsg)Oh6u%JvM|@j6AwDY}6dx7u6>k-<69eLU z(IHyJrL;|4AkG#iix-JmVuJ7$PjN%shurI?A=8JZ*GxxDkD2~xy4e&kxlLQ$K^wsjt<~)EDYA^px%+-Rrt%bo+Go>VmofokwTWHR{TBWx70FypEB-l0TAP zm!FaM$@j`Zc|i8aHn~x*lrNFT%W1Mfx*!cnA4&g|UXTu|zl9NSgXEVy6mi#{#a7R{ z3OgmdM@@}j_$FTh*N_fG&jo63jEd+fKp3SZS zLzaMMuITud{+K{x3^w4QWbSL9G=cawdSn{6jAve= zAIHLMZXbSfHunk3I2k9t&%%8(RyUIx+hOmpx%yD{m(WO!G;$q!#>_+-mhGW`%;COY z1>@C+p1OzoRu9M@3O&kwGz-we(4C)it;l!;-AF%kc&?Hy*z~#NCG;#3lFfW_;(D+%-l6lR>YyuW4|@E4F6>US;Oe@fTll`P+KF z;zB)N@mtBa(c;hrLEy$Qt?Ws7u?Z(>))#uaSh$~I#h0i>xPK}H0hIj}G{%P;49e{Y zotz}hWufzqQ2I0>tm{CC?i1*3X!lM|9Q(IYF&(kSM~#o-8YEr|f)$~6kl3aJv=qPk zo-`G2F^Fa8FZeNoc%2WK?j#|vqH@lXYLxxo7@k}c!DF?2p%iqG?n zqi&!LCf*F8>IS|^n#3=lv)NvVp1XzX1($xQzD!swOw+CB2AJKC*eLbMU+Gq{I_5jJSZbAL@h?J1zePC0KBk*% zN|RsHjg~)U&Y3vlknS@!i>sx-;iu@HF_w+fP1Wr**6Fg1F5_x_hVB95+xlv~!T1m3 z!^T^T{d!7|^;hY8^egc=i}ab99tULy@e~bL(bOXXAPKJc*}qV7aFqLr(5G{x=TI{H z3B}Xxacl-nD;F_qJxE46e5gXo=dYv$+GfX}R7fsih!SaguN7ZeDP`e-N~x3K3n~0X zr8G^_6;TrHXkX*Tg;mnr(3UD`51XnBQ8FQV+DvR3tsrX&^&0g9wk(ip@y-QOu3mSV z(uaFm-FGqK-R!}qK`ywkrvN9_NYiBf!!T-HYkOxecGO7e z!D&6_f{ADc9k~Fej#00g9O!uzy}c@h8>cO%UFbc0vPO!}AP99peTB0#nv)`TJ(I#B zs8)(k35#e`p>6tNLJM77D+!2bIWsQ&NSZmZqh7k`=1tW&p;k%=ZrGHR63>oBsJ+wG z?OoH|(n2oV^cO?SJGrY~O0C_mnxm+V`T>bRzc2a(-$OQrqHdwXS>ebf?-XhW(E7DB zPsoxHye z4G$Y`Hf%Dq8Wz(x!J%-jzF42C`$>0(UZ6XsdtA3m*QZ;d!@dTIpZT+VT0SZt6kdRL z|6%zLvS03^r-?1{YI&jYcDX{nSWc2z=?m#&;h=Ov>=myT9+n=Lc1pd{a-$C)X^@uV z%!Sf>tbByZ#}^h#*#xDA@)k)hQI@{}cWumKXQJTwC1$*5ximU>m#0XtzaL!H<1(`) zh{i*GD4wS73MH?QwxB!{n?=#l)B$y`iJ{_AIFAe-5WcD}!j(ktPCu7O_{2gf1qWA36Y-A=rTp>)c05IsJKGkgyQAGn@+>F`7UKze z#N|JAN0>V7%AdNO&~QnUlu#Y!j<{{7$c@nb^vElAYA2Adrx)28;SSRo^^9wP+KXMQ zq@;9eH9h>f+DfT@V9!G?dvKNKB3#%crEFa-`DA)0<)ItWc#b{K*Rd=4%iut3<8Bt$ ziYwsIHIe^C$Pp8TpO^yn@9YV-gMLj|Bzz|4$_92PW8pSSKk*ynYuHp)WL{>z)W&S;T~@X8kX;$X?5tSlpwgJKEm(IzH`)?_B1#4ohS7a8O` zDZ`}jb$M@JFCJ=<^FleT@&H1I@S(MGMhLBwZ$bMQStVkrvHs17-e=EmUn z*UGump|b44un+?ghCQdHK$MsOw6`>+72}}|w@RIIBF#P)ym3K-Z!A#$pj;_5lZ*2) z(B2VltHlucKv}P)fK(pPY}L`UH*5iCE|40+V(<~=c0w&z4p1(Ol_@}mBONFgYbiFL z%LRu?Hf2QdK?=~=UzHCeQWW#~NGfQP0Q6H)s{>&a5T4WK{h<(#d3;1Fzs(3lba!x6 zQ+x}c?QM1|spTUXeULs$|C_lC zr@G`q=|kgJ%msF_@m1X5lJg9;hUX0-!@Y(Z41ESW?sv%@+=t>$>3HZ%7kJL-QOww3 z6^U)dc!yiw!%5FmoC8nu$m2t;9=VBU4a+GOKi?-`6#8$U+`{OL&r`ZcR0+yUFACnc zI3aZJW;qYRT2ZnRx<)Z$Xl)RqZpUwJk;h@#Cx4gvB(;j!jEo214AN~}YWTC^ABH!L z(~X%%8mITm_oKt1BmMFTT1~Fu0Xa)na#DtKpvsd2ax{^4dO*&$DZGpTBs57PFS<`Q z3`^^z1t6VC@~IkrETfekAgN494G)jfYEB4SuaXlZ{^U6ctSgKteJDhKJJ=2Y1 zAZ*ztC*b03GN+2q*e2(UiLAbVld>M9fHrJZNG?*ZsgH;K+vK!JeQ2_O12KZgM~oMf zO7iz96(7J^Gi6eYk>&3tYX)TjE|)_sQG)PBeH)$N+ikL1k^}d0@|g4LMSjS)&cn01P%^%3yDS^2C@bG@=kd(0SdGo< zE)-oA>(#Nx{A*V%4S%vLmhJwwE0)5~cBAYGs#2?dTd7m3Qn~(>c-GajS&CBdb?(?4 ze|4k0h>3Fj%ZX$n{=$ufNcmNY{|aS?LxhAnGKZadSsgghe>v1nf<40DEHOGR_Mil{ zYS6z_k%8A@S!qlr-oJzoSNm9d+%amBf3e~!O7$3ZEH+i6GEBG@J4TQ9Lj^M_8uGYp zF{;_WkjKw>(CBF4P{Z&I8XXs(yfzl<{G?PF+!6fL4c~0x;1e4(#a}xj)Wt?AzAhH( z>aLTMBUK4z|9rATMV_3*N=XE!j;c?Dw_PWzWjFDDC>SPBv3~vfSb0~xzg(f(JRa(Z z+Rr%JU%^wOKp5)8qEvX9C5B^xQdI@2Q_qTKf3*@Iw8Tj5yV+j_Je+^M9H*8V`YRP_ zFC^}j$QT_y-4Auk#57SJlrzLMP4`3j^2o3qW9RsxhIu0NjzslB$d#;9ta}h1Yl2eD z?1yS*@FS-8^989J`z)y{XbMe}g6au~gP)NXe0Qm%b4j>Ict_#3u0-OLOj-bv^k4=}z`wUl8@L2@K3n|F5 zUIjfW=vIMO1s)Z+RnVmZmkOLJ=u|<63LGj}rvM+atW`%1*=rBG6H;-D^=186)ac56)Lz~1hR0T^^uvi6+Dp;g~g(_%JLA?rA z)TyXe1vM&Ipn~}-n5TldDyUXLl?p0VP!Y1N(~YHl@XvPMAS>QMQFI3Z4gk#rtOKxu zfVBV?5zr1`9sz9tW)si~;1UAVB`9zMWeiXXx&WjT-~td&fV%JnXMlnT<$cOWq3;Mf z4SJj>;5`7J5b!R5_Xv0g08z2vZ2&J4@D_k01iT60AOZgZu!n$C03IOVp8)P6;0*vf z33wgAwFJBdV1R&=6y-x32znJrT?Cu}&_=*30GbGR8NgBkUII`{z>5GX2!MNkG=qR+ z07?ls3Sc||F966U;CTSa1Uv`8NWilI$R;az27L|*HWh3ozz0KH2368kDi}~fKm~pk^sB(9 zf-Nf8tb$D{*r5I0-@4M)>Dj7}IYgnp{hi|rRD=s%=P zADf;u?S{nIa`@+GwDDczVdH&9w{f-mu&-UH{>}ob1Q+?Bc-zX;((v zLIEYv>4O8}uFN>I0QYCbg98F~J)tiYkU>Zp9N_Wp{rcouL&4wxCsR^h9$cW%NKN5D z;zM<=b&4BdpcgB;(ka4@Q-k5Fp+HeZ4OKvr+G)ysY`qPl>-Kt*#x7I)E z-hj+*ug;=Nm51P_`fj;jUM3gIlJv23uhc0Oia&_Q#66;4Y=*mXS~wxx0_pgCNWbsr zZ|B?i$$UB_qW5s~FxSSFaY^iX_9%M~yOnKc=dfd#UziV>=b48gHQvmW(!bEB=)co< z&|Z2DT|mp|bMzY8k8VXR5d0FT|4_#>;a_gzdYd7gKgNTDc@-l)E5KTMe$PnH7{EW= z#6OBmhvUG>yM~*5EV%9=;w!G-8{r^vY^P%8y<{(SD)>=?I~4o~!43sKOz^reHa##J zW?VabMzUG%BipK7(f=N@t=fKX_T6OmR%PT{$+l`y7I_yB&t+GhD;N*6H2->*8)cBU zDYINdW?A!lvs_JPu`07%H45-*1^WqZQgHvMyurXKyt~Da!*AlvgMpR!rX$8=exn}f zS1NQTp|4Qro%-a#z;cZ2hD5%N^u0onShs7+8!8TMgs+`F!GFpb>x2YDh55pE(#<1P?T021G0zCmTvclyVt8b}+CIPkqif zhA$<;4PjxfbmCy39&dWiSjbNh0oUP<7DFLFUH~0y@fU3nC&$B-HMsbwF%jSPf-zNB zAWa?&EPx5h%J9=K7*ow ztLMV3?J*4Z_-%1B;qN0WPsPzW#}eb8VnW7F&K^5v?3kpSNmIs7m@@vVV;2)InOJJ@ z*<EP2;7ESiPVp-^@>J+HL5$ktTVTy1k?*Nst3U(vBr17rG5 zYBYU%%((I$QwGOUG;0EVj%6vCXK9+{y?=8I2x-&%@He%~^!_oU{hW#4naEA2`*W7Z zF#1VHd%{NuHwpyEO7 z>~gl+8Urf&kK{)#QJb2t7pO$6(`vKZaajFb#at&)sR1>C&P6Z9mL;LoUf)#RU<>ds zw!lLCn^F)<;Ie`w0$l|u!+a4~q(*=QXI6vN85p7dmkQ#Rsj8L|fl9`{Tpq{RVu4Bz ztP1oqwun?Z+M6q^o%KQXXUz8dS~1%n*6!JH#MgUfhj;rNm`faR)LR>}1N(@cqej_b zvo||h0|IE7t+w%11h%mhs8x1Hb8B-|b3;I@*nHJxUzIVqv;N#U2|kyiW(ia*yf`RU z+5!xiXR0Hr$^(0i$|Wu8n*tp*&mb+ZJg|j%y050e+SEj5$3pL%kC~=U54*1_uvz3( zbv~BVHw6Yf`WiJ-UU8s)|LD2?^;0<4KPao`rs&l0XG{{P>HYS(7PPWl<|dIf6g^Qj z*wkE8-w+ss$O+g1Nmu~kbp*`Lujl%wq;Xz68RndMvA&o_k5%XO0&7)WeN(`^Hs`2; zXjCf#!W}n8UFAXCv%^<$kC&251r8#6*3BvKP-D>*};a-i#4M`c4rTT{KgxxotSzqz5>?|uK~ z`H4OXHln!#<P(&Gt@k%GN2&f- z*~hk3G+ONeua*=kP@`eos+wWInp(kRQ>!D0Li!(AkT6A^8qwkE3IU~>`oI}x2~*#r zs=2Yz+Eg7lEIW##eL=T`s7f;zU)Da>q|%hXDlo>0MuEx#7p-lrb+)F~`YLN{eREU5 zJ0u&_xi>_?Z(|XBRLy$moRWmucz)(P?c>IhWpCEu8d=D$t#7TbZEAMdNR35-xrl38 z9oBXr`>w_YQq_O4D1$7WsAB);=$c|b4OA5S=iT~Z%VafxF`PQP3zih+%`KXZEwaR9 zBny)dJj8y~wN(;v{~N_-i`qJr7N~Hn(e5O*$L;h9&gTd^)k>2UfIe)c(};ub=lXf- zHw`Atj7nDRTH4itfoWRZR^QZ|UFQ!Da<$Rv#7@slKd}05|X>M)>`fu%Q)hbbOI~{$s&mY$mn6IE%*;e0Bon2`S z(2H_ShB*j9ur*fNs;h0)#5%gCosJ?toouJcK%filbPAD69dvq(FPJW1MI6oQ<|@C9 z*&Y65$QVyf-@?jv))BRM7qIatT-9K+ zIv# zN`j7I)Sc=!u%fZK8a78wRn#7$p5OxB9sw#=N0qa}>Too7ID-_>#V*>vqj3Ri#{z>A zd&Ek-3rKqe5Q@VJ`&36otHWjkD;1!n9qXhfvf^FfX1=LB3pyC%cq9F8-9&=7ce^Rqh#rV%j&y< z?h;(U>-YyjQCma9Wg3_dT@mUxq0s7t$q{Hg#RW7!4%*IXvo>{En`-~8eY^`OAA68z ztr}8a;9VyPu29v3nfax&hG=*d;$84Pz!q}GwEtN>dTFh;057ejlgR=!ucK25&RwT1 z*wyPa`nzczP4?aB(RDPTV)ROY&X?4s-vz{hj4)oD_IyObs zkLgxF5_Vft1^kG?8)bi+{%N_PSy8@im!(;K zk8$|7OGW$mfCiSPpsH~JRdJ2#9tVD$**df9S{oa(Yu8xFoA&q2BDC9o_bd|h{!_Dt z`^KpM%UP*DI*YGUM;x{^j{1rm_|1+dUNkWkU#nJk)YsI*Yq!@|*#dVGi8bn~2&#tm z{%uaIO^pav2;O3_FyoK+(7KiMt4M!=o=(5&F1$dWm`;be`6T9Rnv=?;V)XB1W&%ek zY@~Zk3Ud=rBlPTWW<4q?V4|Wx%2vW2i5gt4!4kJEgV|TheFVn?sHlg}LRW2Pew5gc z*uS$cu_saHZ49DcbH92UQ$y2_p>h4phQ+2@m_QxYuC)(`vN|@Jt!Ze6@7v(h0r+?T zJ{o`v1Ms{6Jjc!7&ioNe--r0a%ps1MXj+dBkKt0$8;6-tjxk7gq6>$aL@~+qplOGx z1_?))5>$SK*_)=@O@-FlT4!H1zO3Ea&}Lf~#-_7@0%~vpDt?ZMj2@gH!H&RHv)UXE z*oBpqG&`xmx$eTFOpy?Nd9!ESkDg$DVOZ*=o7@jS!(5;l`UCg2lMrh&HR%2`TgSW| zF@tydo_+4q&oOx+5I6oTlN-ie#SP=4If?z5{epdueU&}wE;!4C(C)f(%;z-SjQCb| z0owN_W9r6-GT>=xD@2-lvDwJRW5?Cv;KAVHj^N@=!Ns+~#rEK0eQ>eHSB&=cv@E!~ z7~OWBiEv-{H|D|l95X-)iuVKb7_(DU~gxtI(yzhFD}zWwZMqc|WTEp7#^oZ>F-Nlii~g|)DEa!djvprb8p0nMPFTi7kg{G_NyB~OYG-6l4XRew_3nyRT6yOnf0C!oAR zNe|X|sY3}C{5^h%;H@1)1cUbnw-~%HgiZE!+6}$dP=g0Fi7MDPRB-oD!EHkYTZam6 z94c5dRL~YO%kPQWZ{tvvhM|I0Lj`s2K_{D>8S((#L-8E<6ZaK&fsJ5AcgTKr4vm)I z!%n0-Q1c61qut^ob@|Y7cke`C8@J8NYZv9s9m!2eM&vwmVeXWnIA zK@W}LZZ|TI@SpN$`KS5){6^m9UX{a*rBVAaE`&>9r?TkM1kT(Ir|p>TV8871{77)| zk>KJz!9^5YyfwJEIk?ypTaP!PU;-Vr6jA8eFV!-!hJCW)gy>OM;7~=*R>v z&OLDg_u5=~KjM414WT;y-}I;S*Xs}IZ`QZyr|DDCjvnp__Z%0uSf(8)d9yCoePSzD zM?+d-Hfp(}-77R?3ejG@xJ!hC9QI!eAv7w-P;W=>3{cfr1a zJBQvm%$0M(R-wf`=?Hg*qYtB;W%_Wp@i^zA(Fe=*X7?dCw<3cZ&!*C-X*+}gx z@eBBw{6s#JPv)b#c^yx2|KYyi{>lA~dx<;69pfJ0_HaA6P24)Jg{$F~aV1bj&ode5aEIXWyV?$X1c0u1U z|AN)@2J=_uDdsWe0JEFf#`H2BOao(OF@OOz|H61pgp^r|FXEW7B!l8PieIy|A0>H91U`riF5{=^E2;<8Q``#`DH! zWu5V$@n&P2u^iQHS5mw882Sxc4Bdt{L$#sQFw>A@NHUo8zw5u&zpsBq|Fr%={cinc zeW$)of1Q4gev&>zZ`Mn?FLkf$PU#-g?bY3)+n{UGmFtRh({$Oo1f5a&UHL}&PC{0SaQlv~%#waODgd)g4$zRCt%dg9)<)cRVpu9`oEU%FpRjruOf7cl-Ck#t1N7?fyd)`3$y>djP%*;yH#{;(m9GcprU4l=(b*5=Noa#X8b@zNM-9?8_<-Dtf70aT&s;K_8oVn2?+(D*1Mrprd_w?s z1>mj#+!}ya$Fh@|y!?XPC54MCaw|#~@A^RA;Vv;rRWi7Dz5BRXip6hdLzm*D*iGNY zN$zjs?=qZk4(un^Y=yDc|dsays@WZj4;3Oc!1e zo)B&q&v1|Eat#^Ed0m+D8T++qmmxy;A(zM(F#i>@bZ*n=3|Rj=P4jd~`iD%*^_1?A z{x|(d{Wkq4`qxZ7rUu>j`Zd5O4fRWQPiD>{u=7h&iQf*7sKT+XvP9L!t@gL zhQ6HAGplV~9nFqv^d(gHTic`1xI%gIC?gk7)Be=qMExGh$Q0GqH+6z79%KgEmnEHmdcfOwXnF0QbU2?PagB}xM*Wt7BR{9sgaJ^}nAc!*E7?lljn;Wf-S#V0xv+h7?1%{ulkf z^k?-aQB8@QJoUfuv3pTDCVH52%xR@xaVag#WT{43sVp?~D|t$$5~XnRck(CVQ}P>9 zr?gdkNPa@zDR;_ch7R=C61j|t;84Os`2#MMn@yuX7RpJmml(~sQy0m0iA&_B(*55q zv7qB+a+shCp#-M1f3Gte{Z=N&i29u{ADwo0^fGw^%=*u$5Zaqwg=8I^V54hR$ou+l zTRRSQm&@}*Ok5(x_z&Qz1L&J_IXaV$V}_h|Q+LA+mN+KpjGMX(%TP{*9A$>OA&1M< zE^lo`g&f%pwTr4s;f$`?Keul3+6$6;XV+G>ADjp{%>GZDS?FKO<)!Go74pQ5 zE9Gv5IYYHFC1!!=z7?+Ft`#!5e5Q)uA+3^@N%N)A!X+_TiWGlk6S$|jH@F(+WpR=C zrQWJ9!W#X%To^~Oud!bUTbN(jlfdM^@VWe3>;vp>{Yc>fwv>O0S;MZ^ zhv|Ohe`LzodF(%R7nM_dJ=c9B+a&U=joBo)nUA^agE6#$A*+jg7<4bhI#jC{K zuy?jeUHpr>a2*Xh@}4jsoYOI@xZ~U-?%!7`h(>!Vm27%4dbLt%lel4& zWNmj)D7Q-4i$1GT3RsT21&yv&YD8f^CFU+!?A}?eY^KrZ8YMeSjG)4NTtN$6~sZmCv-)odqgLHs0jQ1W@ zcXoBUlWUbenthM{Uw=t?M7=Se&AlvV9rCUL|`k{-w-ZxU=K|1axK}} zbh7dcrGsaZVJQ{Hj-a8t{v+2-+lzjI$ z4az0vYV4)|UEs?Q;eA`51iy>IR#NvfTV!SnbC*eB9x|PQpILAy%uYseb|p*xhw%&c z4{ot>04=h^teRsOFt`l|47VDZ3}vX-t~Bx=N;~BN_YZcMVEto~BG49xau`i>DkFIL zJBn{`*E*F70lnO%jN}YAP@MaRE~SR;SFRnYGclCTN38wZ7e}}ctXER$@K82Ah*+t+ zOz7hcN`{Q@5=yY`s69&aR5`nzGM+Hr4!_l|H9T*4*eDyP7!wR%qqrXBKKfbr znI7d0#+OG*>4m)HRWhWS7CMy(E!A|oPcbWM>d5dmYb(;Wh~F&2Ft)ZLPIsuW~jw(F&@Z#rHyjayZmf!F|@%aCfPqzNre#`V}m_kfrnn zL%r~tU8U8<_rk>!Z{unkzEE^|TS#Ae+p6_}ZPDS4N(9NpzPwTKUkdqlqmrywhc?Bv z0j}qu+)YXZ8na2^iTc%>l;m{Z=)2ab=S?#QN@TM!VMFAV`9L z^G>v)TwUsA47|Q3jMthcx;pWgLB`&0Zy>jafH(rTj)qMx?SPrfBDJjeXe@XfKeiN$Oeq(bMS=`D0LnzmU{jFi7B&1DnN)E4df z%gPqoKPuL(+G{@EqGia>wP=axA6vBSdXj@q8bzEc|8u9_B2J~aR-oxy6^rbbpluGV zkH;N!sxL$-t}?6{iN15tqVHyu*>%0T!eK)SSG*c*)N90Wr0Y7k)(G+N{eU8JG{#9s zkPCgTYgHZJ&q1OS?pmT=#KHR-zr`rmVs)yh7rUsJh%zvk+BzS@P?V@uxYgFgL*N9;{!aQ|Y9bI1X(Ttj13x-ggW@XGajp~ZF zDbc8O(8d8!d`xMr(d5F}M+NSG^6phCe8sQQgtTm{eorQM>0kXwMReAPrN zWYbk<^lQht;7&0PjlT|V8fZSnx!`K?P}u{E+e$|v3gbmP>CAdr{HBrsTYl1 z)6_3gz@h|}B!D|J~6`s0!uk3z!4G;}ycitA<@ z*=lwfjumJ-FKpO@!fCdaC096=>0Lm~B z04xMB5CUKh1||U00lXLiU;+lWWAn6mIOKCwL=8Sez|#agMZgJndzCIyz!`VQ%zGUi zY$3o-Kr;bN1T+%RK)`AORuNE7Kpg?K1k?~;D0HHd>P{-qe^TF_CuCBP6nomV%e2N+ZklNt zW@3z=7>^n^7*`r68RHB;7|t4w8nzm04D$@xhA{m%aI*J+{szc*73#<6BXr;C&g=H; z8sHdZn2u8}DyNl$N{>>hOo8iq-^nk_kI6gacDYQRCdWt@rQ_1wQk|41Wr#nC?}$C3 zp&BwKA;JmBL)wMRW64Q(^Tru{15*`Bo;sD57>4$y$kB{M4! zei`Ub!1@Bc80(`y;zMEtx|GiZoR|3g|W#~HV%3Yg7!P89ie5D~$q@&`YFv?em#D$T*LIf_1@D;*wA;VV) zjZf(t7>+KS(kF_v7z%}9-ohwa2!-y`weHDnF!ID6vn$j32GY>!=k&=U%|^!b4Wy#| zXN=LKXvPe!Q?%A3UgQa_sb3?(k!0*hl<-S3SW3c{QiPweJW-YZl$_8vkbsJ-3~|DL zBS9x#)%nf>oyFnK%)+;E5dT;_)LA0+RU!m224y~{&lJ9h0ws%AY2?4KL*^?x^bw9` zwA%4Mag?G|{2|7XDt-^+2rnM_Zamlw*KCr|kSBi0x2nMDFxBa|aD+ltfBugB3DMe; zz>p_ydk*_!Qu}=a_iI$~s~8(pA6~&e=ruc}Z}P-;Jb0LNst+FQgW~mJ>;U#b*4mQ3 z$rHCdje{0f@=O5JTAOCE>Gie;e6xbPKR+})p0qB z$AwYj@F@0yzOoMw;y6%hXNTb3U+7lx{TOdh@d1q2d-2G7Ato=Z(`=GhkSBhDy)Z5> ztW}-f3o&_Njn^M$k9p&1{qfTVF694Diu7Cq?{yhPO0XC)MS74sE@YU>ke(@C#^W(V zde9$nA&XRo^i0wi(lb$GNY4a~Aw5^AjEWi3GhWrl4Cxt%k`h8jh+c~HjP*9~a-;|I z-~WRnJ(vtH=SUA`!awCmPd3zC&XJz1Add88Ub$<`ksd;em?J%e7BNS92rXic^blIa z9O)U3XA|%$=17l9iz-KY(gQfslcse~CK!3bMDuc_ClyaLA4hsp@J#b@q$gQxO_m*b z;%SOG(vzf4amGAO*=17l^7cobAR9+M?M|#55wTL;=6QEYCI!5ryf131#dXdLOG)i_{|^iWs! z!OM|8Uc?+Z;NwNikpn6(3Ya4Y)~PYU967L7vq@q>o;W6$BL~)~PGgQ7=<@ml9C`eL zLAcQU0cHA!={eJO(^69gT%-EX_?&US(Po@xG#EZLJZZSaumZBeEZmoRSl^?ct54DW ztUIeaq}!~k&`r{XDqkrNEA7fv3L~GBPsm%~qSMu~BE1beMXQtvSGkUhF0n?OD8|9n zwbz9Ma9yoRm+|mzW^aaFn7TGM!pv z$ZR7|9GTsbpfk7Q%1XPiQoE)@LQ9_5&}|hE;x;wJx8V@CszbgVe-@ouThcjs;L5#^bOe1 zPc??o!s^ITeFN1ftJW|=s1YLj2CC3UwT6iKHDIMuvqIuPp5TC$2NmlTRVuK-m0p7x z6`);lMeXaccDYx(`+9h}6`<{1;WVw?64ns7un4zU4r<=d87<>~{DS{L4fM85>y5;X zJfUr&1TiZE6^jLaF3_@i{aO8+Hku2k_6=MQwO3z_w_zcQAqT$sGx*_s1J|MBwT5(I zJnnm`*IR!4=)Qq#(eE!BGe?@UB>DURD?G-y z#IcnD7lX@678TFTuNYeiJ|$wMe4mo_Pn4{nlpurEJe1)9tFgGjEZpEK!GiHjjN{Rh z9{BlUmciLv^rpv{B}B?ueFHO)@S<^)5P|V@G!f%)8KN-FyP#;n-SeWcQ`mUcxbdv% J{<9%T{|AXKUI73A diff --git a/Grbl_Esp32/Custom/4axis_xyxz.cpp b/Grbl_Esp32/Custom/4axis_xyxz.cpp index 3b05fde8..4e9dcb35 100644 --- a/Grbl_Esp32/Custom/4axis_xyxz.cpp +++ b/Grbl_Esp32/Custom/4axis_xyxz.cpp @@ -1,6 +1,19 @@ /* - custom_code_template.cpp (copy and use your machine name) + custom_code_template.cpp (4 axis machine) Part of Grbl_ESP32 + + copyright (c) 2020 Jens Hauser. This file was intended for use on the ESP32 + CPU. Do not use this with Grbl for atMega328P + + + //TODO describe this + Tool change function called by G code "T[1..n] M06". Not triggered by G38.2 or ESP3D probe function :-) + first Z probe before tool change. Only executed once, because then we´ll know the initial Z height. + // second Z probe after tool change. Now we can compare + + //TODO parameterise this + + //vTaskDelay (0.5 / portTICK_RATE_MS); // 0.5 Sec. */ #define DEBUG 0; // do I want debug messages? yes/no @@ -9,358 +22,258 @@ VARIABLES */ uint8_t AmountOfToolChanges; // Each new tool increases this by 1. Before first tool, it´s 0. -uint8_t current_toolNo, new_toolNo; +uint8_t currenttoolNo, newtoolNo; float firstZPos, newZPos, Zdiff; -static TaskHandle_t zProbeSyncTaskHandle = 0; - -// Finite state machine. -uint8_t state; // final state machine +static TaskHandle_t zProbeSyncTaskHandle = NULL; +// Finite state machine and sequence of steps +uint8_t tc_state; // tool change (tc) state machine #define TOOLCHANGE_IDLE 0 // initial state. tool change switched off. set during machine_init() -#define TOOLCHANGE_INIT 1 // do some reporting at first. tool change number x and so on -#define TOOLCHANGE_START 2 // tool change function called by G code "T[1..n] M06". Not triggered by G38.2 or ESP3D probe function :-) - -// first Z probe before tool change -#define TOOLCHANGE_ZPROBE_1a 3 // Z probe #1 (quick). Touch down and order to press the button -#define TOOLCHANGE_ZPROBE_1b 4 // Z probe #1 (quick). Wait for button press. - -#define TOOLCHANGE_MANUAL 5 // go to tool change position - -// second Z probe after tool change. Now we can compare -#define TOOLCHANGE_ZPROBE_2a 6 // Z probe #2 (slow ). Touch down and order to press the button -#define TOOLCHANGE_ZPROBE_2b 7 // Z probe #2 (slow ). Wait for button press. - +#define TOOLCHANGE_INIT 1 // do some reporting at first. initialize G code for this procedure +#define TOOLCHANGE_START 2 // decide, if first or further tool changes and set next status appropriately +#define TOOLCHANGE_ZPROBE_1a 3 // Z probe #1. Send order to press the Z probe button +#define TOOLCHANGE_ZPROBE_1b 4 // Z probe #1. After button press +#define TOOLCHANGE_MANUAL 5 // Go to tool change position +#define TOOLCHANGE_ZPROBE_2 6 // Z probe #2. Send order to press the Z probe button #define TOOLCHANGE_FINISH 99 // tool change finish. do some reporting, clean up, etc. // declare functions -float getCurrentZPos(); float getLastZProbePos(); -float getG54Zvalue(); -int8_t getState(); -bool checkState(uint8_t checkState); -void setState(int8_t newState); -void setState(int8_t newState, uint8_t newtool); - #ifdef USE_MACHINE_INIT /* - machine_init() is called when Grbl_ESP32 first starts. You can use it to do any - special things your machine needs at startup. + machine_init() is called when Grbl_ESP32 first starts. You can use it to do any + special things your machine needs at startup. - Prerequisite: add "#define USE_MACHINE_INIT" to your machine.h file + Prerequisite: add "#define USE_MACHINE_INIT" to your machine.h file */ void machine_init() { - // We start with no tool changes yet - AmountOfToolChanges=0; + // We start with 0 tool changes + AmountOfToolChanges=0; - // unknown at the beginning. But this will change, if the first tool is loaded - current_toolNo = 0; + // unknown at the beginning, maybe there is no special tool loaded. But this will change, if the next tool is loaded + currenttoolNo = 0; - // Initialize state machine - state=TOOLCHANGE_IDLE; + // Initialize state machine + tc_state=TOOLCHANGE_IDLE; - // TODO this task runs permanently. Alternative? - xTaskCreatePinnedToCore(zProbeSyncTask, // task - "zProbeSyncTask", // name for task - 4096, // size of task stack - NULL, // parameters - 1, // priority - &zProbeSyncTaskHandle, // handle - 0 // core - ); + // TODO this task runs permanently. Alternative? + xTaskCreatePinnedToCore(zProbeSyncTask, // task + "zProbeSyncTask", // name for task + 4096, // size of task stack + NULL, // parameters + 1, // priority + &zProbeSyncTaskHandle, // handle + 0 // core + ); } #endif -// return current state machine status -int8_t getState() -{ - return state; -} - -// check, if given state is the active -bool checkState(uint8_t checkState) -{ - if (state == checkState) return 1; - else return 0; -} - -// setnew state machine status -void setState(int8_t newState) -{ - state = newState; -} - -// setnew state machine status -void setState(int8_t newState, uint8_t newtool) -{ - setState(newState); - new_toolNo = newtool; -} - // state machine void zProbeSyncTask(void* pvParameters) { - TickType_t xLastWakeTime; + TickType_t xLastWakeTime; - const TickType_t xProbeFrequency = 100; // in ticks (typically ms) - xLastWakeTime = xTaskGetTickCount(); // Initialise the xLastWakeTime variable with the current time. + const TickType_t xProbeFrequency = 100; // in ticks + xLastWakeTime = xTaskGetTickCount(); // Initialise the xLastWakeTime variable with the current time. - for( ;; ) - { - switch ( getState() ) - { - //while running + //protocol_buffer_synchronize(); // wait for all previous moves to complete - case TOOLCHANGE_INIT: - #ifdef DEBUG - grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_INIT. State=%d\r\n", getState()); - #else - grbl_sendf (CLIENT_ALL, "Tool change procedure started.\r\n"); - #endif - - // TODO set AmountOfToolChanges to 0 after job finish - AmountOfToolChanges++; // Report tool change amount. + for ( ;; ) + { + switch ( tc_state ) + { - #ifdef DEBUG - grbl_sendf (CLIENT_ALL, "This is the %d. tool change in this job\r\n", AmountOfToolChanges); - grbl_sendf (CLIENT_ALL, "Old tool is #%d (0 means unknown), new tool is #%d\r\n", current_toolNo, new_toolNo); - #endif - - // Init. Safe start block. G54, XY plane, mm mode, relative addressing mode - inputBuffer.push("G49\r\n"); - //inputBuffer.push("G54\r\n"); - inputBuffer.push("G53\r\n"); - inputBuffer.push("G17 G21 G90\r\n"); - inputBuffer.push("G0 F100\r\n"); + case TOOLCHANGE_INIT: + // TODO set AmountOfToolChanges to 0 after job finish + // Set amount of tool changes + AmountOfToolChanges++; + + #ifdef DEBUG + grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_INIT. State=%d\r", tc_state); + grbl_sendf (CLIENT_ALL, "This is the %d. tool change in this job\r", AmountOfToolChanges); + grbl_sendf (CLIENT_ALL, "Old tool is #%d (0 means unknown), new tool is #%d\r", currenttoolNo, newtoolNo); + #endif + + // Init. Safe start block. XY plane, mm mode, absolute addressing mode +// inputBuffer.push("G90 G94\r"); +// inputBuffer.push("G17 G21\r"); - // Switch off spindle - inputBuffer.push("M05\r\n"); + // Switch off spindle + inputBuffer.push("M05\r"); - setState (TOOLCHANGE_START); - break; - - case TOOLCHANGE_START: - #ifdef DEBUG - grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_START. State=%d\r\n", getState()); - #endif + tc_state = TOOLCHANGE_START; + break; + + case TOOLCHANGE_START: + #ifdef DEBUG + grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_START. State=%d\r", tc_state); + #endif - // nur beim ersten Mal die Länge des Fräsers messen. Mit dem Wert alle Weiteren vergleichen und G43.2 berechnen. - if (AmountOfToolChanges == 1) - setState(TOOLCHANGE_ZPROBE_1a); - else - setState(TOOLCHANGE_MANUAL); - break; + // Measure firstZPos only once. Then adjust G43.2 by comparing firstZPos and newZPos. + if (AmountOfToolChanges == 1) // first time + tc_state = TOOLCHANGE_ZPROBE_1a; // measure before manual tool change + else + tc_state = TOOLCHANGE_MANUAL; // measure after manual tool change + break; - // First Z Probe - case TOOLCHANGE_ZPROBE_1a: - #ifdef DEBUG - grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_ZPROBE_1a. State=%d\r\n", getState()); - #endif + // First Z Probe + case TOOLCHANGE_ZPROBE_1a: + #ifdef DEBUG + grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_ZPROBE_1a. State=%d\r", tc_state); + #endif - // Place spindle directly above button in X/Y and a few mm above Z - inputBuffer.push("G53 G0 Z-5\r\n"); - inputBuffer.push("G53 G0 X-29 Y-410\r\n"); + // Place spindle directly above button in X/Y and at high Z + inputBuffer.push("G53 G0 Z-5\r"); + inputBuffer.push("G53 G0 X-29 Y-410\r"); - // Z probe, max. 50mm to press button, quick - inputBuffer.push("G91 G38.2 Z-110 F500\r\n"); - inputBuffer.push("G4 P1.0\r\n"); + // Z probe + inputBuffer.push("G91 G38.2 Z-100 F500\r"); - setState(TOOLCHANGE_ZPROBE_1b); - break; + tc_state = TOOLCHANGE_ZPROBE_1b; + break; - case TOOLCHANGE_ZPROBE_1b: // wait for button press - #ifdef DEBUG - // grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_ZPROBE_1b. State=%d\r\n", getState()); - #endif + case TOOLCHANGE_ZPROBE_1b: // wait for button press + #ifdef DEBUG + grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_ZPROBE_1b. State=%d\r", tc_state); + #endif - // TODO Error handling. What happens in case the button is not pressed? - if ( probe_get_state() ) - { + // wait until we hit Z probe button + // TODO Error handling. What happens in case the button is not pressed? + if ( probe_get_state() ) + { + if (AmountOfToolChanges == 1) + firstZPos = getLastZProbePos(); // save Z pos for comparison later - // TODO neue Toollänge immer gegen das erste Tool, richtig? - if (AmountOfToolChanges == 1) - firstZPos = getLastZProbePos(); // save Z pos for comparison later + // hit the probe + grbl_sendf(CLIENT_ALL, "Button pressed first time. Z probe pos=%4.3f\r", firstZPos); - // hit the probe - #ifdef DEBUG - grbl_sendf(CLIENT_ALL, "Button pressed first time, quickly. Z probe pos=%4.3f\r\n", firstZPos); - #endif + inputBuffer.push("G53 G0 Z-5\r"); - inputBuffer.push("G91 G0 Z2\r\n"); - vTaskDelay (xProbeFrequency * 20); // wait until button is released - setState (TOOLCHANGE_MANUAL); - } - break; + tc_state = TOOLCHANGE_MANUAL; + } + break; - // go to manual tool change position - case TOOLCHANGE_MANUAL: - #ifdef DEBUG - grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_MANUAL. State=%d\r\n", getState()); - #endif + // go to manual tool change position + case TOOLCHANGE_MANUAL: + #ifdef DEBUG + grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_MANUAL. State=%d\r", tc_state); + #endif - // Go to tool change position - inputBuffer.push("G53 G0 Z-5\r\n"); - inputBuffer.push("G53 G0 X-5 Y-210\r\n"); + if ( !probe_get_state() ) // button released now + { + // Go to tool change position + inputBuffer.push("G53 G0 X-5 Y-210\r"); - // Hold - inputBuffer.push("M0\r\n"); + // Hold + inputBuffer.push("M0\r"); - setState (TOOLCHANGE_ZPROBE_2a); - break; + // Place spindle directly above button in X/Y and a few mm above Z + inputBuffer.push("G53 G0 Z-5\r"); + inputBuffer.push("G53 G0 X-29 Y-410\r"); - case TOOLCHANGE_ZPROBE_2a: - #ifdef DEBUG - grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_ZPROBE_2a. State=%d\r\n", getState()); - #endif + // Z probe, max. 50mm to press button, quick + inputBuffer.push("G91 G38.2 Z-100 F500\r"); + + tc_state = TOOLCHANGE_ZPROBE_2; + } - // Place spindle directly above button in X/Y and a few mm above Z - inputBuffer.push("G53 G0 Z-5\r\n"); - inputBuffer.push("G53 G0 X-29 Y-410\r\n"); + break; - // Z probe, max. 50mm to press button, quick - inputBuffer.push("G91 G38.2 Z-110 F500\r\n"); - inputBuffer.push("G4 P2.0\r\n"); + case TOOLCHANGE_ZPROBE_2: // wait for button press + #ifdef DEBUG + // grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_ZPROBE_2. State=%d\r", tc_state); + #endif - setState(TOOLCHANGE_ZPROBE_2b); - break; + // TODO Error handling. What happens in case the button is not pressed? + if ( probe_get_state() ) + { + newZPos = getLastZProbePos(); // save Z pos for later comparison to firstZPos - case TOOLCHANGE_ZPROBE_2b: // wait for button press - #ifdef DEBUG - // grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_ZPROBE_2b. State=%d\r\n", getState()); - #endif + // hit the probe + #ifdef DEBUG + grbl_sendf (CLIENT_ALL, "Button pressed second time. new Z probe pos=%4.3f\r", newZPos); + #endif - // TODO Error handling. What happens in case the button is not pressed? - if ( probe_get_state() ) - { - newZPos = getLastZProbePos(); // save Z pos for comparison later + // calculate and send out G43.1 adjustment + char gcode_line[20]; + sprintf(gcode_line, "G43.1 Z%4.3f\r", newZPos-firstZPos); + inputBuffer.push(gcode_line); + grbl_sendf (CLIENT_ALL, gcode_line); - // hit the probe - #ifdef DEBUG - grbl_sendf (CLIENT_ALL, "Button pressed second time, slowly. new Z probe pos=%4.3f\r\n", newZPos); - #endif + // go up + inputBuffer.push("G53 G0 Z-5\r"); - // send out G43.1 adjustment - char gcode_line[20]; + tc_state = TOOLCHANGE_FINISH; + } + break; - sprintf(gcode_line, "G54 G43.1 Z%4.3f\r\n", newZPos-firstZPos); + // That´s it + case TOOLCHANGE_FINISH: + #ifdef DEBUG + grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_FINISH. State=%d\r", tc_state); + #endif - inputBuffer.push(gcode_line); - grbl_sendf (CLIENT_ALL, gcode_line); + // button released, we lift up + if (! probe_get_state() ) + { + //vTaskDelay (1 / portTICK_RATE_MS); // 1 sec. + + grbl_send (CLIENT_ALL, "Tool change procedure finished.\r"); + grbl_send (CLIENT_ALL, "Go to current WCS origin after hold.\r"); - inputBuffer.push("G91 G0 Z2\r\n"); - setState (TOOLCHANGE_FINISH); - } - break; + // go to current WCS origin. This could be G54, but also another one + inputBuffer.push("G0 X0 Y0\r"); + inputBuffer.push("G0 Z0\r"); - // That´s it - case TOOLCHANGE_FINISH: - #ifdef DEBUG - grbl_sendf (CLIENT_ALL, "zProbeSyncTask. TOOLCHANGE_FINISH. State=%d\r\n", getState()); - #endif + //protocol_buffer_synchronize(); // wait for all previous moves to complete + } - grbl_send (CLIENT_ALL, "Tool change procedure finished.\r\n"); - grbl_send (CLIENT_ALL, "Go to G54 after hold.\r\n"); - - // Hold - //inputBuffer.push("M0\r\n"); + tc_state = TOOLCHANGE_IDLE; + break; + } - // Clean up - //inputBuffer.push("G90\r\n"); - - // Go to G54 - // TODO G54 needs to be set before, otherwise bad things could happen - inputBuffer.push("G53 G0 Z-5\r\n"); - - inputBuffer.push("G54"); - inputBuffer.push("G90"); - inputBuffer.push("G0 X0 Y0\r\n"); - inputBuffer.push("G0 Z0\r\n"); - - setState (TOOLCHANGE_IDLE); - break; - - } - - vTaskDelayUntil(&xLastWakeTime, xProbeFrequency); - } + vTaskDelayUntil(&xLastWakeTime, xProbeFrequency); + } } #ifdef USE_TOOL_CHANGE /* - user_tool_change() is called when tool change gcode is received, - to perform appropriate actions for your machine. + user_tool_change() is called when tool change gcode is received, + to perform appropriate actions for your machine. - Prerequisite: add "#define USE_TOOL_CHANGE" to your machine.h file + Prerequisite: add "#define USE_TOOL_CHANGE" to your machine.h file */ void user_tool_change(uint8_t new_tool) { - setState (TOOLCHANGE_INIT, new_tool); // let´s start with the state machine + // let´s start with the state machine - /* - Prerequisites - - First tool properly mounted in spindle - - G54 is set. G54/Z touches the work piece surface - - Reminder: set Autodesk Fusion 360 raw material origin to G54 + newtoolNo = new_tool; + tc_state = TOOLCHANGE_INIT; + sleep(2500); - What happens with every call to this function + while ( zProbeSyncTaskHandle != NULL ) + { + vTaskDelete( xHandle ); + } - + Switch off spindle - + Move to tool change position (not for the first call) - - Hold (not for the first call) - - - Manual tool change (not for the first call) - - - Proceed by un-hold (not for the first call) - - Move to Z probe button - - Quick and then slow Z probe for better precision - - Save Z probe position to "NEW" - - Calculate delta between "NEW" and "OLD" - - Call G43.1 with that delta - - Copy Z probe position "NEW" to "OLD" - - - Go to G54 - - Hold - - - Switch on spindle - - Proceed with job - */ - - return; + //TODO + // Nach Aufruf dieser Function wird gleich wieder zurcügkegeben in die aufrufende Function. + // Ziel: Erst return, wenn wirklich beendet (RTOS!) + return; } #endif -// return current Z machine position -float getCurrentZPos() -{ - int32_t current_position[N_AXIS]; // copy of current location - float m_pos[N_AXIS]; // machine position in mm - - memcpy(current_position, sys_position, sizeof(sys_position)); // get current position in step - system_convert_array_steps_to_mpos(m_pos, sys_position); // convert to millimeters - - return m_pos[Z_AXIS]; -} - // return last Z probe machine position float getLastZProbePos() { - int32_t lastZPosition[N_AXIS]; // copy of current location - float m_pos[N_AXIS]; // machine position in mm - char output[200]; + int32_t lastZPosition[N_AXIS]; // copy of current location + float m_pos[N_AXIS]; // machine position in mm + char output[200]; - memcpy(lastZPosition, sys_probe_position, sizeof(sys_probe_position)); // get current position in step - system_convert_array_steps_to_mpos(m_pos, lastZPosition); // convert to millimeters + memcpy(lastZPosition, sys_probe_position, sizeof(sys_probe_position)); // get current position in step + system_convert_array_steps_to_mpos(m_pos, lastZPosition); // convert to millimeters - return m_pos[Z_AXIS]; -} - -// return the stored G54/Z value -float getG54Zvalue() -{ - float coord_data[N_AXIS]; - - settings_read_coord_data(0, coord_data); //0=G54 - - return coord_data[Z_AXIS]; + return m_pos[Z_AXIS]; } \ No newline at end of file