From 399282cba9e498c8dee020d0fb15332acaea4f8e Mon Sep 17 00:00:00 2001 From: Thierry Zamofing Date: Wed, 20 Mar 2019 14:34:12 +0100 Subject: [PATCH] enhance triggering --- Readme.md | 1 + python/MXMotion.py | 4 +-- python/ShapePathAnalyser/MAError.py | 3 ++- python/ShapePathAnalyser/MAVelocity.py | 7 ++--- python/shapepath.py | 7 ++--- python/triggerSync | 1 + src/triggerSync/triggerSync | Bin 0 -> 65686 bytes src/triggerSync/triggerSync.c | 34 +++++++++++++++---------- src/triggerSync/triggerSync.layout | 2 +- 9 files changed, 36 insertions(+), 23 deletions(-) create mode 120000 python/triggerSync create mode 100755 src/triggerSync/triggerSync diff --git a/Readme.md b/Readme.md index df23fd9..acfa3cd 100644 --- a/Readme.md +++ b/Readme.md @@ -1140,6 +1140,7 @@ zamofing_t@ganymede:~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python$ cp -farL ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/*.py \ ~/Documents/prj/SwissFEL/PBTools/pbtools/ \ + ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/src/triggerSync/triggerSync \ /sf/bernina/config/swissmx/zamofing_t/ cp -farL ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/ShapePathAnalyser/*.py \ /sf/bernina/config/swissmx/zamofing_t/ShapePathAnalyser/ diff --git a/python/MXMotion.py b/python/MXMotion.py index 222175c..9d96634 100644 --- a/python/MXMotion.py +++ b/python/MXMotion.py @@ -44,7 +44,7 @@ class MotionBase: self.meta={'srv_per':ServoPeriod,'pt2pt_time':40,'sync_flag':0,'sync_mode':2} self.meta.update(kwargs) - def setup_sync(self, crdId=1, prgId=2,verbose=False): + def setup_sync(self, crdId=1, prgId=2,verbose=False, timeOfs=0.): '''setup the timing synchronization for the motion program kwargs: sync_mode : default=2 @@ -122,7 +122,7 @@ class MotionBase: sftp.put(src, dst) sftp.chmod(dst, 0o755) cmd = 'LD_LIBRARY_PATH=/opt/ppmac/libppmac/ ' + dst - cmd+=' %g %d'%(pt2pt_time,arg) + cmd+=' %g %g %d'%(pt2pt_time,timeOfs,arg) self.cmdSync = cmd print ('starting '+cmd) self.syncShell=comm.shell_channel(cmd) diff --git a/python/ShapePathAnalyser/MAError.py b/python/ShapePathAnalyser/MAError.py index e9dbaff..fedf632 100644 --- a/python/ShapePathAnalyser/MAError.py +++ b/python/ShapePathAnalyser/MAError.py @@ -56,7 +56,8 @@ class MPLCanvasErr(FigureCanvas): hl += ax.plot(erry, 'g-',label='y-error') hl += ax.plot(err, 'r-',label='error') - ax.xaxis.set_label_text('datapoint (timebase: %g ms per data point)'%meta['timebase']) + tb=meta['srv_per']*meta['acq_per'] + ax.xaxis.set_label_text('datapoint (timebase: %g ms per data point)'%tb) ax.yaxis.set_label_text('pos-error um') legend = ax.legend(loc='upper right', shadow=True) ax.plot([.5,.5],[0.01, 0.99],'k',transform=ax.transAxes) diff --git a/python/ShapePathAnalyser/MAVelocity.py b/python/ShapePathAnalyser/MAVelocity.py index 63b38cc..8dd40c7 100644 --- a/python/ShapePathAnalyser/MAVelocity.py +++ b/python/ShapePathAnalyser/MAVelocity.py @@ -59,7 +59,8 @@ class MPLCanvasVelo(FigureCanvas): hl += ax.plot(velAct, 'r-',label='vel act') hl += ax.plot(velDes, 'r--',label='vel des') - ax.xaxis.set_label_text('datapoint (timebase: %g ms per data point)'%meta['timebase']) + tb=meta['srv_per']*meta['acq_per'] + ax.xaxis.set_label_text('datapoint (timebase: %g ms per data point)'%tb) ax.yaxis.set_label_text('um/ms') legend = ax.legend(loc='upper right', shadow=True) #axvline(linewidth=4, color='r') @@ -143,9 +144,9 @@ class MAVelocityFrame(wx.Frame): try: vel=doc.vel except AttributeError: - tb=meta['timebase'] + tb=meta['srv_per']*meta['acq_per'] #data points are um - #datapoint timebase: 2 ms () per data point + #datapoint tb= timebase of datapoint sampling #velocity: um/ms (deltatau desVel= motor units per serco cycle) rec=doc.fh['rec'] velyAct = np.diff(rec[:, 0])/tb diff --git a/python/shapepath.py b/python/shapepath.py index 20751e8..f507e30 100755 --- a/python/shapepath.py +++ b/python/shapepath.py @@ -289,7 +289,7 @@ class DebugPlot: idxTrigger = np.where(np.diff(idxTrigger) == 1)[0] + 1 if idxTrigger.shape[0] > 0: hl += ax.plot(rec[idxTrigger, 1], rec[idxTrigger, 0], 'xr', label='trig') # actual path - hl2 += ax2.plot(rec[:, 4], 'b-', label='trigger') + hl2 += ax2.plot(rec[:, 4]*10, 'b-', label='trigger') ax.xaxis.set_label_text('x-pos um') ax.yaxis.set_label_text('y-pos um') @@ -854,7 +854,8 @@ if __name__=='__main__': #sp.gen_closed_shifted() #sp.gen_swissmx_points(width=1000,ofs=(-500,0)) #sp.gen_swissfel_points(width=1000,ofs=(-500,0)) - sp.gen_rand_points(n=2000, scale=1000);sp.sort_points(xy=False) + #sp.gen_rand_points(n=20, scale=100,ofs=(-950,+2780));sp.sort_points(xy=False) + sp.gen_rand_points(n=200, scale=100,ofs=(0,+2000));sp.sort_points(xy=False) #sp.gen_swissmx_points(width=1000, ofs=(-500, 0)); #sp.gen_spiral_points(rStart=100,rInc=10,numSeg=4,numCir=60, ofs=(0, 0)) #sp.gen_spiral_points(rStart=100,rInc=130,numSeg=4,numCir=2, ofs=(0, 0)) @@ -868,7 +869,7 @@ if __name__=='__main__': gtMaxLn=116508;ovhdTime=100 acq_per=int(np.ceil((sp.meta['pt2pt_time']*sp.points.shape[0]+ovhdTime)/(gtMaxLn*sp.meta['srv_per']))) sp.setup_gather(acq_per=acq_per) - sp.setup_sync(verbose=args.verbose&32) + sp.setup_sync(verbose=args.verbose&32,timeOfs=0.55) sp.setup_coord_trf() # reset to shape path system #sp.meta['pt2pt_time']=10 #put between setup_sync and setup_motion to have more motion points than FEL syncs sp.setup_motion(fnPrg=fn+'.prg', mode=3, scale=1.,dwell=10) diff --git a/python/triggerSync b/python/triggerSync new file mode 120000 index 0000000..9d47987 --- /dev/null +++ b/python/triggerSync @@ -0,0 +1 @@ +../src/triggerSync/triggerSync \ No newline at end of file diff --git a/src/triggerSync/triggerSync b/src/triggerSync/triggerSync new file mode 100755 index 0000000000000000000000000000000000000000..1fff13556536e412f4395d469617227bc6493881 GIT binary patch literal 65686 zcmce<3w)H-wLZLO^3G)5mkoiAc2)5+E^L(j;8G&@dzuGBwG>$pivo z4T6d-o}$oG+Jj14PK(uA+FGSORHLPqidEX$ib^diT3T_S{UIK|CAbYO#i8Xgcg}G$BG>N2eKY2X;;4C z`;{s!D01{4_^_3KVi)7UpRWS(%OB{l`4e7K>h&6>A_t1hA9$CUKg<6#=#%}&bUPQd z#+O~x+BB{+F>ZnpVmKznH+$X!11Z>;wx<-|ktfJO{B3+c=o=esQ-Pwp-ia2SrNV3d z(@*!eRIc-SdzSt(cC(SiNBTeJE8}K(4}XL3$2`scuMh-n7>d7PhH(l$PsQJG{GEos zPvEZvf1~gh#@`tH(YAB&$N$Fa4|N_s&o|#Mz~{J)SKhtp>TkXA-4CWuyl~C7*;g07 z`MA#*?8u;?|o{?ZBK1_=O?=g z@1Jmc>G9ARjk904Z|c>jJbYc%s(4x1-@lytFjcbozucK zJG1<%ysPHd${OCKMeDqJo_Uw;zeuXv4e31Xb`s1l0=j^>GLdRs@ zqead+@Qb{yn)Xiv4IlJ9q-kFxL54GL#}}zH*Habv1&})p{39SY8u`zGUJTmE z`u36?BW{``3cs2fddWdLHOKO8I*XeLduloA9UO^Lfx?@HyS^ zXF>iD!uM)g9S7e5{{l_>z5;%e3D5K#0iX6PHvIXZ=?fbS{Q~IqNX{-pe-GhluT5V! z_;WxPX}-T6bUkQekM9=9Uz?Hlx!|t>ZQ@f~Ku<>cOnQAQAkXkdzi$WVmJIFxDrnk^ zO3?oor1N~x%#RLZ-xonI1#Rv7W|1@20d3{m!AHB0=AV!9+-+$1j{h3iQvll9KOJ-v z=%re}`UdC{(AIwD$6KK5P5L*3&a%&640)vAXZ5v!&-}9Xm4Tl^yr%rslp^Il2fl(n zv;jW&=h+=;d9+C#9c|G@v`VU>VR>7ky`eJ|O{N+eRKt}k8fs(9a&S>yQ+d2bK=XA(c~&s-kRu)S;DI5jI}nWgT&jf?}{g5 zYIZDD*Ah*}n&!sZYEntn(b>`_Lh-g(vVjJtgLJmWVjT@#?WuTc28*Q{I%3IqqAA`; zU9(~2B%{j4yD}QLLaHO4Xj2_sjHII`xx9{_^~+l2b512c<~KKY#!^-D=bCSImG;|$ z%vT0Y;|!lBpakEMx1Fh`#`Di-CQe~lc6Zax&P02(HJ)14utJKYO|v1rys@#NlhgzV zH@7CDsjl{>cvCZ}cz0KOXH#=ioNDPC)L1niuF({4Z|LfbHL2$2R-_3DOLg*}M&zi9 zE=wd+sxy^LC7Sg|E3~z@HZ5yy=t#!fQ$(8*T`ASpnrOT(+DbNKFg^$0X;%%grf4b( z#%jRR_LQss*mm(8eZm;hIsU0&WWdE7)e8NW^9=bWk;5Mto;uC zVf(!g)|v0@3x?V61sE3C@31Rizn5UBV84%nRrdP@7-rb-lQG1w-!DURX1`Y`Rcyb{ zQEG(!Ua!>Y_WQL;ooBx{DRs8}-ij{OeovvxvftMzb%y=E9>W~@zGZa(u{9z8H#a}7 zLYsW5xY9Y}(>Lw&f3s&~|A~uwlq$PNg@FAQo%aisYS`&LkXaMT`{p{xPaUm_=JlxX znsWzr*N;|HrXugPzPxWjm%1E9ddto;cOv}W?0Bx|EpiywhLPu-*!+qrU_8_BQ5Bbm zi=0pX>FhCUZ&J=$jHoWUUE&`zb&zsyJQq4gDQ8}fGdi0;{ht0Kh}X9jx@a5iS_hr9 z(b{L@W}K8EPCjk7JjPA_)Oe}taZ8m+d&%Wtr7k@;ZA$^|pba0V=VRhHAbI?Xx&Zvi zYpxj7z3C=30&%LT?wP$vS4h6cN7wY+t47Rua>C7(&L`qMH%Z?6rmFt_HFYJGbbUwY_-OdhNAzafSz>L0T$Ks42j748F}6@%;)BfTM*aZ4f6075g73Hg zZ}OYvx#?b2!aBe_?}2`#+d=&auf0N*^tehf?bZDsytiiQ8QqWxS1R9e^59<%`IlaS zx&@gV$5eM$IwStnhbl??54dMvVCB}r7oofOrrV{?4AlLVEZtj8n9xad-;vRMPM?+g zA9P=yrTa1yreL6Ml$%%Soc20p=|{AGD}2k!|Mzk9y^x7R9b_2lXP!XkKaCE_D}%jm zFiE4qer4mz3i}h<(TjZiV7rn$?RC%TBWC>`-__Lk=;M9imQ8)r)uuI0UiX|QC(fvJ zhQETiXBxYTdRQOa4?AuQ`@7e;ss@effqFIML*wIUD~Erjy1(yweo~e=WH1=-|Bz)4 zEKEE98{g_MZN)~k6 zpJ~F6!1pqSXWBQpXG@#A_FR0%)v3&beQspK!9i!C9uL2B&F3TCYvN~g-+6^9y0Zao zqxS6*g`6WW9{meji=rY;BSbyhDs%PIQ)$_sjma!(@t$l;l#J&P`USC*ks&r2MOIG|go)Ft1@RrbiTXtx( zR-63aMtneewj(_uwxuTQeIIO>dd0NvM4UFhwKl#RBh}qER@5O+i{CqmKIRYG>+JZa zn)pkmE>+_Y?uX>}xaS<#K3V+xw4QU-slT}IECrhJZ|}du^s$(GA>Y_$u+L?l3`~cV zOS&AfoAfF~XuAoi!HmSCIz4#Kc*Gw(sD75aY^*=ea zq5tW+KkRktTcbYgfWOzTar3&7ZpFR{{h+$>9Qa8k{bbnhf%{;WZ70wU43oBud6`qs zKAPV)&sq@v)JhdNo-UhAo!oVB(CA%h{9ONM_PJ+_@58|G0Ll_^y>5N?&MQf{_# z4qL%{oZ+(k#P-MaD4znR2QmvXx^w(<1O0RU%g1KeHmn8ZV8;g-d+mjeu+cFTWi9P+ zy$X!ge%yZ)x~tY~L_2cb8QtJlA|L16c;(Wf8_&I}C{xddotjlA*$#{`_V3D+#n7uV zHu@ihU--AeZ_`*NuXfwK%1X2K;jA|BCD)zU4Ev=9lHi~WK0kK@Hy7hANtry+7t09 z)$2xj57;&#uKR???>qYfhG9SX_IK2Iz2M_>qQ=g?;4PNX`D*w<_be%cth~1EP(AA9 zbhNn@l}^#c1JnBWW2*S^dsWfnH>LZlgOIIZ+It>TWBR6}A6~k2Q(wPFub`8J`}qHl5~^lrMbuP?qdK|Nr0k!gTHbL#+R&eF1SC&BRgomy`R- zkaM%jcPh&FvW(q+Tb^Oed8V$tS8?1WWpC@yomZ&w2s0Tt#};GOsLC4TQ3<}6WVM6) zfTi2OKGibzgY9ZWuPIY}7Qdxh&O3llgsaI4XZ!1qgtdN<@riT#;1kqQL>~PIdW($j z6u*53#w!1VO>EEJDo|sfBi%ni$B4_%&G^|``sevlJ`cWB+e5B3) zfa5OolaUVCGy1>j6OY+Bta3iT7;{xU&l|0ZH~^^I8?&{53TO^Y^isOUwLn z#=Riui+npJ0XulWzO!F$ff{Nvcro{>Fj?WcMi8NZ%6{Q9z+)#OheMt?S~ zx_i-KjM+Y+#-XqK=1r0P-8VJ8)P2(}uVJ3)jQ(W5^4)az35*f?4`Kd0S>~azWgTo; z2V2&`mUXZNbMUd4gI@sK$8&!A!v6k_7vAjeesNHL&x_~xZ+Nk~f76TC^>2Og3;o+) zyuW|vi~IX`z4&JT?w1Dj_r7#~|Gt;1`wzTyUH`$CzR-X8rThDjzO=vp*h_ErpP;Tg z_xJC<^UeM}cR}{9^ZWPSRo%buuIu`rzUvG92kyGR|GB&N_aD6L&Hh812lXG`e189t z&DH%!H(%HP*5)ttAKQF?|MAWH`%i4f+?l$50lR(yyPkqwPrnYgv6zqBm zc0C2V_9L$Suxmf;+7G+-!>;|XYd`GTZ|qtNyVk<4n<0BM?7A6t-3+^KhFv$quA5=k z&9G}7>{!^d8#Yoe?abCYa1G_sbH^O- zar^u9+D?D}C;!ynhcWF4`V{?W{iy!Fi+cL|;YY`Mu;%jrX1xYu#Nz7yx4*;iv?X0n z6xaX0iM`CiP?7pX5B@q7*Dmp&*Oq9CP4mLb;;He|CQJ)=u4-=#6BB5{w26S?ZC$Nc z+YZaZdpMPhFJB%@3V-6X$yxm7WV9`o!=E&5>a_5RSaKPbva5YLBIyc8WdUCsl%+SceB(kyhmX zxnB5^+=y(xeSBcgi??SoN*C$>$6Wo`;1i`#Qi+aCgvKSp%VX`aBzA%l?Ot|CPFNB~ zS)^LvLFqioEh;e|X}4J`4w$6^zHs5h@HFu)=21g)7u;0*@q+Lo?6HKK6Up#7(PY~> zY5yA#d;)?mPo#2%E(mjj#*~S5?A(Ci@g`u7#o_VUDI6~ejJIQ>sx8)@iZz9!scfsN=p}ynT5%3D<|nxN+l@WD?>ICz=6k(HuSD zrbK(p=r+0xWH-EMI`(^%YD?9mCf1~;l`glY@vC@UX%kYBj$aatqyUq+pjQe`NA*#; zmGM+dSZ}G(&eG;^TW1*7kMk7bW{T1#i=Jh%#whlnK9ZBLae!0AR-jy%53^dM%fsWR zg-gd>Ozo2Af}ttM#v~2XkX8Ci>9|Q^OlPB^o5F3WvPR^AFj5tzjHeCRf74ha~kw)q|8#VQRsxLPKOh&TM&41Gx(?GJpD`349EX`XXJenADkiu`}_Zhp}MN+??2jt&o%hmhtF;O z{eLEZPk;YgTkv_PzyIBh_{30E72!|$R@Y)dzRY(^}kiCSPs@)W5AropLRX3KfHYU;rPx4*mT!#D4O7=A4oAsZ2EgE;FCi z=JOi!*={~RXFjoNO?lZr_&ipmLObyNfBhfwsBcDC2b~ z4Y6jFFn6%uD75y$LgtnIPxudnE&mMge1|O)pMTNem3kno)VE5cB?tVirgWW6cCqZg z^=H}MR%&NLIHpwu=f3mOqHN!Qe0#4PO2C)r<@f-;yr+*4D0RPUj}hSeD0`Fu-!Jaa z#|iND%FK}hP|GyMQv#q?Yf6q5fZVJ}bD{vigBmdB4FLQ?1NxW&G~mAnY^L$xTDbiD z^GyLdObAAab?B_eHL8nR5^b@IR!7?sI5x7pA$3tjqOprzW#>g5$&pY3Xl^FC3FO>7M{A-I&6+Zq%sasxN2lwe(;U&|oyzeIW^jK*d6bcpI2}0e z;`ne9$aj-J;$(32v%qnDfOsf_FN=1@z(BiAMu9L^CgZ7CgW;g1A*U#dqvOEQK{AT7 z7&;Q15hG)SFqU;STTLT0UXsSOIF6)IJS=c$bVWMmGc;q2mX9`G*VSQFm1x%3Oc<@} zOpRaQHMB*O*Wqjol7=3}>F`I!dkx4=96xbU2W8PA*6rkk5qUKD^eWyWde)?=deFA z%WDuPLxw>7BABqoADQhn@SF^QNdPwbBbA8F#&j8Cy2>A^@fsRBqD>PZG!w{;{>WmD z(8yUDxmF{SfXvp&QjJUoQmK(9ja&?*3MSp^kF+40Fe3!Ot_*2y^>7r5hkvLVZHaT2 zKhmM-j%o-0bv}Xq$9GEsy^VImjh*ieCZ)4m6*!MTs-v)>J=P80ZW3_M!iG*s_K!d# zgZhwdPKIAq^jX=-Ect=_E>w=!6{HRTnCL;d8(*9~bs0 zH6$DSoq(rkO<&IoIXIw%64LZr=uMq}@MvtG8YXf5gApD=7hGtRfmRp~1x5;uGe2F3 zd@AA&P5@_zkQ1hmMh6EcAX{t;PG(4L}$k8GuIQZV1g!NeBFQ7F;k z)_D7M4P6~T(e?oKIY1ROUjoO?_f3K3dx{h75Q{Ca@MrdDl zT!5$PsQiH0k^63ez6Yf|u282Ul1muLzX5z__{{Q#Mdb}w&#aw~b3dA>npZx5Zq1yT z^)r>vKxx1)Mov`)`M&?ac&W-;nMhv8&P+!3u_Pkj#>f$~w^Gir;mBgX?`|5v78b`0 zajY)d-ngnE+Q`F_VBVtxgv7K)x3pebE+z|c?9M!sIOU2uWi!; zB>h&teEx!Y^*APmgiak#ZQqBs-%3I%8Y*VaDqAq8-lVmnVdlKD8R#o?I>D~06Izlv zRm!3lm1+bUY5ybnzQ^GZ7b0nFvzO=lo&Y)0AMtxwHfliAxIEQ@t)Y z>nspva(hEZ6IzUX-y0@pJwyMIf!S}ZjN*i1Q)0Pp(eizNVuqvJlGs8c7~5nuBHxEv z;@;rlz+{x_j$7N&9>ux70qi}E`8`Z6n-a-}coRTYoXcrRM-l^=#uU5*4QIaZ9~uuC z`%mbw1t6K7{{)HbEc8s9p6`2~(X%&Y24_Xur}1JjS8ZWQqoL0Cql&pNv!rWhetN;o zy84C%^A^<2G_GT@84K#J(gkjjx&`IsGwbTK3t4bxZSDM8xRJjj)`+D7(*`ADjWK#{ z2u-{DK3hPKGYoGK+C*=V*b`Wi8$_Smwe3s@V-jzY1iTboyoc__tIP`gt=zz!?5RT- zxVY~dhH1jkNOi%CLIhtc+HRv6cTp2I!E$VtMH15%vLEVHA+-2ug(hW;se%0v7DqEo z6I(L2oIWKky9!5CJ0ZrX`WW>fKN7-m*`VPPJ^mRqT(V+N39>2l>s)i99UZOlMrp$u zxTd2*Xafh$5>0au_n>R3g&7){Yg1y(fIBtDI$=LXX5QM|43TzLg^HozF447>x^~hS z`R51Pq6cA7;9C?3zLRTLBhKG0!?+3RF^U`XyeRoSm9WDTgXEk1Od znyV0o#%XPKM4&5*3XO!a_e9yhpbR=xp$BCc_1FYwh7021JmDR}z`F2!hANzZ!YeF8 z2>Hk6@RKJAEQjwyVMxX#!_+I!834I@|EiA*|&!IuG zT9@-k8h>kAVJ2{cF6OfkTCN!{^3*XPRAuEXScnmy-oX#*qMj?#57GK8MFf+N} zTV7Vr>k29~2CQ94G33s zgVn;mmcsO~3GH|?zN`yN^|ls$8ft$fQ9W-hK8C1FbBu3j zEe5D!ZOranptiYLg=%qz{tRjwIvV9VbV`mE=XV3N45-egV_1xU4Wc7vtQoq>>KXFa z0V;60C5EBK08J`%6_m()Z0NVGl1Hr)q~`Qgbh)@0x}-W*CbgwI^jW1&*@i~ScTwm% zIuyoyg=I1d3bi7$F$Q!BYwRE>)TW_e;X)Y$VXPWz7YB)i3TyNTsGI|!P(q^xg|)F2 z@lFn)LLC|^LS$&^u9v1eQVhy}G?Zj^V`-qUreeMdb2(q8pu{5EEu2ia$aQjn8JD3XjP$`kZ1RR9?MM7P!B}j&5N8E%h^x< zZ$W(r-2+yP`ej`c?ZYXLW&!LFPkBb>M?)wOY6AUohE_X3znc|+6RP5%0YvT!<+p8> zcA^lPyrGW{&T_5_T;r)~Ls_V%(0YV_rO-%1nM{}p>$;Yi)T4?Ma_9#ahi=nUsE{gD zXoK~l`Fiambi3vk70!sKGG6(4jTRF{j&pJn`hvzr6dDKGsOb`um3J^JvABe2efc3w z5NX8HOwx4xUxe{zlw_q$`6f=^7rGM{P)ZBu)XeDWT%|&HA+S`NS~KHI%}1lKS)-0l zdO3H4RA`F^IVeDV`;w*#3M<$;;ToHa$o^fUMTNEXb(~O_x5Tgz6#BA;ixF)$yj8;^ zvUQlqzM@$rIf@MLtC|w3&m`gX}vnvb+@fCTN&YqiHk83VlnX^@XWMtYcza-l{@7HMY30^SU?|wC>a7 zwS_a2$pjjbZ))t~6YOD~u}isD>X(!*k57 zOYy5vuV(Dg45_i)%~hetHKP{{Hmk)!W=~c#TKo!AEkM4s%%NX11z7-F-qYg(4C&9b zLn`zH)V+5m+aL@E%WA4-EtpqcF|)2*m2C>)6tWump2xkTXj2pN#kYU}m!ycHRROe6 zsZoKvNRQu}d9vxfZ!t!#FFTQ*n|(O~119r63@*H(PGtQ6F+FYfT@CI$C$hnEoAmOd znY;V00eiU<*=X5zCO&XP1#_>3=v_`^(?HSmq}{g!61$zq7As-mI@!$K_Zi6k)`@Jj zvL@n>&dhxcnEsA-BHOH_(VCu!`<6oBS|_r7fIuf3Y1kbFyW5HEuxt}k)?C}S3?e^r zB0C3&SPhLB1Pyi~4_J0*_Jqd@H9-g&y~_&OoXnDiF)>Je$%#B$Uq^GUE<(U7R?nL%j85_?@XQaLsNH23Dy#u5((^6j?5?^p4d#%L4X{Zka(ZN4) zBKtA|dUaYyj5J|*I`{=A^0XDmn)_wuo<0m(3q2=t;AB#IlIg=Bws5u+c`hxIm3Jqd zSo$!=EnMM54yHq7O#@AyV!&JYb0>1>WFofgFaj=o--#SPnGDsKNstd?e@$`@rPUI~sYs>QErba%Dwu}DLi5wdkU|@AM6Chs~ z*~YH-`pT9L~(F{c7>((Jnd65G&Vt>eXSj4s%Qn&B^Kj*3T}p=tTI zUyZb;v57|8ivvQ`vj(mDDz4gMBf`yNuv>=5+PiReOCCtTyp)@QSftMaV{$+Y3%6NV zXG<6E&#!F9k%N&n3p%l?kV>}Vs0KQkQD5e~an#+IdyeAz->983SswM^C=98a-A!&j znzl<*;c*QUE*`H!Za(s6^k1>?J>lXBBw^y{!=oX4mYXkg5!ty>#WgKhCeqR5VtGiO459YhxWaBVc$kp}-C?c@@z{J;`(PWe(xs5drLLN$$*SZ>)_kZ^5e) zoH4rjm{lOIKpLIHIg^p z&3{}Y^i76(+s(&VilJO1bEBL8Q;ncRDC0Zf=I_$*toB-@ujll^df=Ar^0~*Oxk6DLIm9%GcUY1;D!zBp+#+4E*(rrEHa~l<eTdZN^WGXwrep7a(}rQI;JOjtft-#q4A>5HW_p*#VXOP~pm z#mOy56#E1Ot7}G9BaBI^K{Hs$tGd3tjegps)Rk{=XSJ#+2PlTbTuE^9^TfmIbC~ z&oH<7ybdgXNUhGtgyc#r`)*HTY?}+2iv#NR=Sag89U#Tk;~k8Z`}GKF0M#_xjGpmpyrr zef%=|uX&LJJ`clZyx7Gy<4hb5z9uhn5P5?Jj_%J5M(0poWRu^+%0AHyw$<;|#yWGc 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 literal 0 HcmV?d00001 diff --git a/src/triggerSync/triggerSync.c b/src/triggerSync/triggerSync.c index 0a434b7..fafe8f2 100644 --- a/src/triggerSync/triggerSync.c +++ b/src/triggerSync/triggerSync.c @@ -33,7 +33,7 @@ extern struct SHM *pshm; static char mode=0; static float mtPt2Pt=40.f; //motion point to point time - +static float timeOfs=0.f; //time ofset #define CLOCK_RES 1e-9 //Clock resolution is 1 ns by default #define SIMFLAG0 (pshm->Coord[1].Q[10]) @@ -115,10 +115,11 @@ void trigsync_func(void *arg) scStart=scLast=pshm->ServoCount; mtAct=0.f; pshm->Coord[1].Q[0]=0; - pshm->Coord[1].DesTimeBase=srvPer; //start motion at default speed + srvPer=0.2f; + //pshm->Coord[1].DesTimeBase=srvPer; //start motion at default speed + pshm->Coord[1].DesTimeBase=srvPer*(mtPt2Pt+timeOfs)/mtPt2Pt; //start motion at default speed if(mode&8) - printf("Start: %d, rtDiff: %.3f ms scDiff %d mtAct %.3f mtDes %.3f srvPer %.6f\n", i, rtLast/1E6,scLast, mtAct,mtDes,srvPer); - + printf("Start: rtStart:%.3f ms scStart:%d mtAct:%.3f mtDes:%.3f srvPer:%.6f\n", i, rtLast/1E6,scLast, mtAct,mtDes,srvPer); for(i=1;pshm->Gather.Enable;i++) { @@ -145,12 +146,12 @@ void trigsync_func(void *arg) scDiff=scCur-scLast; mtAct+=scDiff*srvPer; - mtDes=i*mtPt2Pt; + mtDes=i*mtPt2Pt+timeOfs; srvPer=(mtPt2Pt+mtDes-mtAct)/scDiff; pshm->Coord[1].DesTimeBase=srvPer; pshm->Coord[1].Q[0]++; if(mode&8) - printf("Trigger count: %d, rtDiff: %.3f ms scDiff %d mtAct %.3f mtDes %.3f srvPer %.6f\n", i, rtDiff/1E6,scDiff, mtAct,mtDes,srvPer); + printf("Trigger count:%d, rtDiff:%.3fms scDiff:%d mtAct:%.3f mtDes:%.3f srvPer:%.6f\n", i, rtDiff/1E6,scDiff, mtAct,mtDes,srvPer); rtLast=rtCur; scLast=scCur; } @@ -179,8 +180,8 @@ void trigsim_func(void *arg) for(i=0,rtSlice=rtStart;;i++) { - //rtSlice=rtStart+i*40*1E6; // a slice is 40 ms - rtSlice=rtStart+i*40.2*1E6; // a slice is 40 ms + rtSlice=rtStart+i*40*1E6; // a slice is 40 ms + //rtSlice=rtStart+i*40.2*1E6; // a slice is 40 ms //rtSlice+=(rand()%(int)(1*1E6)); //0.1ms jitter rt_task_sleep_until(rtSlice); //in ns if(mode&4) @@ -296,7 +297,7 @@ Coord[1].Q[0]= 0 : got frame trigger 0\n\ Coord[1].Q[0] is incremented at each trigger\n\ sync task ends when Gather.Enable==0\n\ "; - printf("usage:\n%s pt2ptTime mode\n",cmd); + printf("usage:\n%s pt2ptTime timeOfs mode\n",cmd); puts(s); return -1; } @@ -307,15 +308,22 @@ int main(int argc, char *argv[]) int initialized=0; int i; char *s; - if(argc!=3) + if(argc!=4) return usage(argv[0]); - mtPt2Pt= strtof(argv[1], &s); + mtPt2Pt=strtof(argv[1], &s); if (argv[1]==s) return usage(argv[0]); - mode= (int)strtol(argv[2], &s, 10); + timeOfs=strtof(argv[2], &s); if (argv[2]==s) return usage(argv[0]); - + mode=(int)strtol(argv[3], &s, 10); + if (argv[3]==s) + return usage(argv[0]); + puts(argv[0]); + puts(argv[1]); + puts(argv[2]); + puts(argv[3]); + printf("mtPt2Pt:%g timeOfs:%g mode:%d\n",mtPt2Pt,timeOfs,mode); if ((err = InitLibrary()) != 0) { abort(); } diff --git a/src/triggerSync/triggerSync.layout b/src/triggerSync/triggerSync.layout index a2fe753..fe7fbee 100644 --- a/src/triggerSync/triggerSync.layout +++ b/src/triggerSync/triggerSync.layout @@ -4,7 +4,7 @@ - +