From a1dec94f1f8e4713b05c4ae490fefc2a7313c470 Mon Sep 17 00:00:00 2001 From: Theodor Chikin Date: Mon, 21 Jul 2025 19:08:48 +0300 Subject: [PATCH] added flushing (function X502_FlushRcv_buff) of receing buffer on PC between changing BlackFin settings via commands. --- BF_companion | Bin 52624 -> 57752 bytes main.c | 212 ++++++++++++++++++++++++++++++++++++++++++--------- plotter.py | 12 ++- 3 files changed, 188 insertions(+), 36 deletions(-) diff --git a/BF_companion b/BF_companion index e6a5c29825a90a540661cd7c913f05df32798224..38aa35643d3ab20404e8368bedfbe5c55fc29616 100755 GIT binary patch literal 57752 zcmeFa3w%`7wLgB&nc2xql1YXFzkm8FUU z_ZiA`B?_>W<3xF;NKh)Svs!p+lXweK;!CB>FzEz=R`gWYkW%6s>1ub15#3QKY_p+Wlt-omvfUo*X+a?MBy$np7ReWx zx}-hzRJSMTNdJ~fxsho)%IMP5NWLwSFEY&$Y>J*z9dwnR_gDWj^%YCL%NvE9$n-9O zR`gV_?+f4~yZobx;C%4nHE>t*7KCbj_=;t6Z{ZUVZi4`ntwI``q@WOXeAR!v>gK07t<_AwhhGicH^<=Hzz;(4;p{MR z1U#x$T=*Ax{VNc|$+>m}J-<2v{_zpyd^Q4o0r0L!WdMJ51Ucm+*x`l|{3vCdlG!Xu^m#(@=9LwAt9>oL+PYT1ucfRYyS}N>S5{G3?^8A` zPG8_H_4!M;HCC1SD_Z;oP1QQq-{PxiXysT*Cot~D5NmFW&zIwCEAdq|wN&Rrewf6N zFro_+QtEGN7Kk-Izq_TSsioB4QrB2(@aJc5sc3BU)hk|aZ9`L|x0ST>dPO-}&?@Dv zu5q{fsjB?OfCDyp|-Hw7A{>Z@z=n<}bv>slJN zRS_Z3xh+SwB-)Z+SJ_h0vTePurM0f9QB;);OZxTpgG4q>)S6FS07k=% ztsy%WHTxP@Z!=01H_?{2R$fWo9PqcoRIpOjZQiOaw|Q$S>gtsmGJ9)XZAF!zlmSuI zmWmdorU`Nte_ex5X{e~LZ>j<(X3Z*T z9sySouKT%jH|QL%HSQqbm{9E zW4z7~_|5eq)$u3gy51HszI8Y~0v}f__?JfDM@jry3WT_5EyC9$98#2XCcIPPC>b!} zN1O1MOn6$$=+|WvezuN8s>dfuWbEIAX%n zx=g=Ln($P&ew{Yqsc!x1H{ta@pt7?jJUY_2&YAEr1{QWR;bTqsOD24r34hsyha-h9 zX;0EIK7>_lCVYYk?=;~@neeG5ym>w2GU1a<^s`KOS_kV_x(T16BatpO;m4TpnI?Ry z3GXrC$C~iPCj2-PeuD`=-h|(5!kZV-TTFOb^XXT!2|r0kB5gO}C!6p)On8?GzuSbL zV#4n+;isDL`%L(2O!$K){4^8(5ffg90A707gqIHp60#_|?)dE*7aMc1=EpXKWS1oYW0#_|?)dE*7aMc1=E%5)H1wKlc^cPRp z`!-LIy;P(qp6-)=ZK&VV^`h;^T#2E@Uo2FVq3QLwCrr*%h<*!|48AioG*q*P!*tL# z_|p(f2W*2cgkU;Y8~kAirUSLXhe9wNqz&E^g6SY}aAydn!>YlS5KISYgOwqe4$uZm zLNFbi4XzHsbYM2PAOzDv+2GU=Ob29xi6NK{#s;+zoIvo0e>K`m2bzQLgkU-t8~kYq zrUS9T7eX){gbn^M1k(Z7;6ovp4!#EO3BhzQI=C|g(*f9EO9-ZeuffU?Ob1?rB_Ws& zx&~K=U^?I$To8ikU~6z{2&MzA!Nd?u2U&w!2&Mz9!4E$-+V3Lxoe)e1R)aqc!E{hH z_(BM#1FFFvhG06F8hj`O(}C3BJt3G5q6T*w@X++!0!67wn4F_<{~MZqVO==<>j?Ob z2>7)K_*4XZA_9Io0)8w4{`Uy@fe85i2>5Fe@K++>jtICd0&a|eYa-xVBjEKBaA5?T z8v)-C0WXPw(<0y*5%8o4cyt6D9|1>2z<*sE-k*PpfPWtWUxBe_TEgUAa9RY=-j##E zczW48lq|dKPeEvHqdY>Zedt`mp0Nc5R{lq`G6@`>32Vc(}pY^dyqJx}0xBOVgW0G+7-0^-NBbijz=l-l3$;DK( z^%Xpt@$~c^0jvzvp}ww$&(y9vK2rkk?Ah~@Sw^v^=Z@2!p1{eT@?+JWpmjPOB71t= zm*=1CbDtyrKKEIXyd{!%De?5VFY&b3eb&?S{87rEpxbkF8(5DjJ-zO?hAA44FcvI7 z8+5;=z7TZ3OSfZcfA`6RU9W)i%95TJJU#uM=g(O^sz`eJ24<4@9`_|r*BzIXgkAR# zqx&rSb9FEP$>%&({gF&Bc!Ho;`=25GxVo^5kh z=elHWem@%spoL-mw7KVwL+GZ15q*Sy=;z}4+^1zKdyDsd*Byt{gs;5@_XxTVbq%PV zecY0$_uap66P|?$&nkggaOoG;P{%)iG!1f2kVC!1f#=WJ5`J`&vhOE6eX{3_{dq{~ zEmnKVkMx`jlh)t!a*uQH31}O1|Fe1@#YAWftI9tMy{m@PyCIh-|JU^Hg4v<=GWVf` zySw=SI^qcyoW&5s*nN$9Xf}GN$9=5pj$=w789g^ms5)@yGJ3883qasJ61NXHbR>1$ zU^zMxqD}|PpNtqX>gj~1ckBjDhQ(j;_efO#;=f0t1?-;Qls}>GE{@eRPGmkHOf)jT zMaB~hoDLR1mD9ZQRGGkOnyu7tJ!d>UANHI=V}3%^dWieVC-COK(+X{56+K-ir+K*4 zUbED6NWHjlB)MS95lqcyrceI_w-DX6!hI}Z=K*wApZg>kJLonU$5hZa5F_#k2H_#?A>hM8nhR6UK%e_EnFfLePFN`e36H>pn1L{%QPIWf zp!+ifuHNKs0%5$%t6|FwEfPH+jS0qGfj&yq$yzY*8C8D2{ie=8zd*5bcx&J(~fVb<-k38S+>n;P9)+K%28<3+G^mS)SrX9zr9xb8!ePZZk zpG+0@_~fIZp@biGlPY{v{zl-1bAAhjK`xA!oi&$r@G{;SiV-iF%PM&p>C5?^F_-0{ ztgkyqs&#Qrkmo)7g1dNAIl}{Hh7>S#aUxaFuIMJoEvKG~K~n~5cwN+V&U%}f^}jx( z#yv%i%kS+aqvZrSv!}P0>>A{~;R$wA*YKl&-s5Dj8-vHmf=Ed2jpR3z;Ws!MaP{!6 zF|0{0j@CzsS_i&|3WL4WdBOYmol|qg{yK#lTo^Ws=y>1ovN*HS(@_SIu~OuEfPLK_ zh(uKi*^BbrUeqAY-)NS7{tsj?B2t6*Q6ef@_Cm{x5PM3H4h(@xv_cK63qD1yhHXe< z@HpM2Pw0)IekKF0clSJx5zTAeWv;ae@?allkheH8AdNyNg~prb&iC>977dA1i0!%5 zbDxvM_w?G31Zhz%K7i=G`;!-X-34UNQOg8G#qw_Ei*$266+OHkUQ>GHM7fd&XQ=!po>x zyzG1CvLz_%>z*dny0|RJ^QIsi>?X4y=mZtceW#iG@(0w}#Erp0$qH`0mS@D^$m120 z9XM;Dne{kWF*vBD7#w6lH~{JB3G$8zie3qJQzyy6LDs{lAaf!ixqNVFqVq90a)2^S zD+k9Q&Qxd!-GvH+y+jebkKZ{pSL`=}L|Azm(eaMrWgnQ!Y$!vo{9cM&2C%Pt7DQ5? z(%_&x9~{&m&i@57|LNb8y@&{dgA!4Z930=1V&4IkXoZ^4y$OyZtobR>!KcUuGK>U| zQ!N-OWJJAb4_yfN^EIV37H9Y=b?RvcczutMtZ ze@87N4tN43;hwOHD(z+4%oRQhmcH(E&{Bncd=lVQ7YBJh+>Qli)*ZYyVpY42QxX$M z7Djp_OlTJu1Y0ixjbZD9g7o_!6=t?1bZ;}vd@s=doS9df4f3n^4Kw@A_@4mZ$0NRO zW*+@VHnS6l9fq0z1>9Yn8)hcPa5JB!N_$zNxxzADVFqZ0nKNbXViOj79}w=8`x8Y( zX~X2$#C?EeC5FvGqw``m}9U4!$Y zX(@ilSWpJt`$Qmf573TsAa%F~+r({VDgmARm|xNeZ_3^5CN;;e(SOCX8}l zPI%gVVb{rRsDxHj3V~hc5_Y@arQFE@>u&dXY)--53GPdjMVwc#c(dU^;*+z$8KMUF zVg*TT*vfXD%cL`rosbF1n3$v@(5MG6$XrimgYTg~=YqrN zPZi^^5PeCDc0zWYn~ahBcg8DO7ucrtNQ*I)^Fkav!FH2~snN z-g6(`elI|rQ}hkI0c+4P+CBna;=nNh9OHJ3`CKOGh()S^e^tJt>U1l>;vd;EMn*UJIuueZ}PVHz$=Y z_aU4;9$MkPH(}>ba4;19{2(1u@7ai55S9t=3qAM=RNcFz3Y}LhqoF{@vKsYs1@P#l zOF^OzTp|vBI74OKP!fnslz&F>M{eIrKw?@5biKbBsvNYrI#I+ zTm$b2F3xn6q@S=$%Ij$L?>JPd}1 z6@LtGk=*!0KKf%b1nxm)^rS^R=)#khSRhSqgi`=44tkEq;kk^b=P3or72eI-x#ymG zj+SKuM@gmbr62?Z>vcEl+1~DhIF&!T59kxT3_5&vj(6=OE`gVOB$=Q%^&Gw2FtC`q zJfeWtHer|oI(HnfpkUx@klxe12nt}cg!}UYwuGnq^}G}7%3v?Y52p6K)^i3v+slrc zJ831U*VnxTdXqkKY1+L3u%6$HJdP}6BXLTA9CeW3>BLTdc%ZLY>85C*%$i;jq*%fl4?nm7=4X!3L*Ekaw{9bbH z(7Co7Tyixk5Vx8s6DA zK=zSNDfTzqYx@Q?tmML7HqCI^`$+_%QIKWK<}N#tR}h*Deh#5KgSJ*P+xZ%_R! z-kt*9zoGUpvv zDk0}Dcma|a-#%+Fn%08RJ4ESZnnCngqHo|vdZD~e5f!Lu8ydV&}f#~bbpf=&^>z-ibHW;~^We!sn6&p(MCGr;`r>C2UJ;A3) zye#I+)jjZ*Sk$TKkmd6BpCBD z-dCmW$wZxchz`N2`8b?6Qhw)jO$bBQo4*Zq3Y)R@Bd1LiQo>djNUW7o)_4 z7P(V>1OzYrSiCFCpII4ibHhKbURNz(vH*RZgf7~m(05@J_xvSFMP*ZqUl8>_aAtS^ zk^Ud_AMHQv>i^-HVE>c-PxU{Gf5-ceoVnZ8|6Kp!{$pqEKC`p`$dnjmdUcxqKS^4y z1Hejo|JMJM3%rN>pW%{@_n#o}h^zkuU_kv(5at+xXS({IJ#)9@ySM+unLE$y1n#;1 z<7a}dGk0<=Ky>D7XL_I_#2Q@vN0uvY{}x|MBfclIN+~a0trTbH&BH&R(!bx3eV6N< zUH7}DS1)%>Z=K_sK6hEG(*I!pQ)hOhkxnNd4|yt#QTq2lpB;ejlrY-S|3fM#N*C0E zf%<=hf5%O{CY8?IotBoSC}H+Q8%}`dN#YXLJb~670s1iP2{V&{jYgfhdrBmK7ny`} zpMWxKZ#8mnEixcakQAmey%KB1+&|2=VH6$u+vw7{B*0MQZ&k`hZ{L|1wxoKP{0)6mr7 zbLHlix!Nk~1HM+5A0M)E(Px&n`l{1h8N(WwBVF#2lA;n}6(vGmer{>OKPwQQxf0!0 zURvU6Xss32Ug8l3(@U4T8hu+`ydM6oEm9W5=#p*q_##$_sX}NN6I1K+!xQl3EPU(A z)l}oELL+&mw796G%v*x~6uC0wJUInf9K|zb8=+lBk+2VI$FiUDZgz_oEJH5U-t*W(6sSY$WQ^gqW zp_*d0R@C_ki)v_ku5N1dDKVv7AdeB4Nqmids@f+UH@7~}x&=|ArlqL?^9F@P;-}C< z)yK$yOE{V>`J7Ljh>vX)QN*M-D7Y7;x4VAtYic)$5TwC!u#MW60 z7gW~yXU`VmrE(Q*zLttws)ef-6C-(C)PgjZyPY=+wZl%-auMf34Oi6hmKAqFFPx+( zvrY{SokaS`X&hA}J%UuhhH};`Lqm@M9`)+bP%7ZrNS7jQK)L~G%4-{7|#P>F)%zmI?S!G=Gxn#*6d>g93Z^PCwPni9sJYVgki zJ`Xm(1?+}=t&A%`^7B#t6_h8@A)2ngCB~x5uSfYdY%!n4lc!Mmqf9Tq3*`yF92)At zi%X&MK(tC6Nd9gWa6OA^pKuXLT2<>J&;QGPG=!y5to;%7$4(I>skmt<3RHwvs| zQy!58bRI<)9l6k@fAhXyHeAP_mKEuG+oU1!o(jM8`tdtOe(7|0t%SD^Mi--7M2)neLG39+@7L>0z0klxe?A&&l+XO!Ys; z2sF^IJlr=!J@SEMYAQE|JgE)ixp03mm%T|UVj?yYQh;W{%i^- zo=@-X;rFCsfDFeOT?bFq-WWp) z=tK}irzX*XbM#N4a`f2bX3A@@M)bJkdy${~5Ygno7Pd_(-v#1YMk?9AU5Zm~D`~2z zbx^ufy#pbwL%lsgQSML~l;5r%Kx@CO4uJP|bp|5$HuW$%vt7+aRNJc7q2Jq77pe-V zJ+Opd{Uh$Jss;BJ^?J1DOX_ZD+^l{Zm?rhBaI!}A2)G*5|AT(5SDlc2n>reO@J02% z@G-_Z)rE#`QRyJNR_%srHR>m*%ctH5O{&!an6XN|2^vqDijT_Z-Xx9ey`_S!1^^c%guil8d%GGZ`hca~r zC`;A%@I2yMooWG^`pr(&gZAy~RI8xOH#${%HSYdS)r|(-*QwqBnfG?8--8lg?^Nk` zEBAD&-$E1if*rc<=~Qn=a(AbC6s`DLr}_$P-rK1*LFQeZ>X*Urd58LCAV2F+yTJEp zhdLhB{-s0Rk7oS2L;W+_bh$%)6Ak&KLoGrd{Ha5oj%xqdp)Q8bA9qj(Dj#*I|B9A< z*rDDHQ~aSroddp09clp32OVl1*ni)leg{hYu0w4A`}-a0MpS#TLv4o4-*%``U>NLB ze*w!3fD*{}I@HnNyU?LNgc{CwsNaNUuXd>GP|+(L>NzmH+@XF9hL<|jaj?tj4s|`W z?(0xbgW*(%x)YxIlMeNB^zw@xYBxIU#~o@f+Wta^S`CKhJJgR*(a8=az6cz*t6Rw> zr$S4`I)J-seFzdXYcvf~L9y)UMROr6v3cn$jE22`{6H&Hs%yaUC8}qtUh2KcT6L^#V9l>rvb_>-TWCSa$+% zwKn6<1pQHUI?+!CzhXUw@vK@;qe+@5eNpYE(q&LWv3>_ttJdq0)vSM}Fk+oC86(-+ zgnYF1Z45!p+6R}kSZ9Jh%K91%9Bo|<-?CXVQM=tr&u3z+1+ZMKkpD~dAj$tWI#f-V zBpWV@-c#S8qJ3~N)jE?`dI$oY*5kOltcT#~nbtd@u*JFy{@yIOK34xiTp8d}65iti zmCS@F$j7xq(0r<=-84$`5MF~v!3fAo z`bpYm!hfB2`hFNe($CT!Bm6rsg=%HI3r?Uzt=6C6ZnI7S#%WE18@Q}Hp@Y?$0c~y8 zK@1|NbwAqWvf5y%Ori4%Z6QdlUqnk)>o(M-S@%GK)jA)POReK@KY2|XjIXHI5gkI0@e;en?1og3Je^gim;?H`TAL zBPHmkE2?!d^|vy<4V68vO}~*E5LYQs21}+N^%^pLFluBXP4t<^x82kp8infZpUTV;TYVlNOG4D9V;&>Rq`YBbFEsAP!lBOpW8+9|`^+po>qz>09ms3Zf*NW2v@@0!1~(t7Ccmn;^il2Xu}V z@lPOcRg#>JRa%f}zJp=s$ciC}ik5;w?O4qLtM)D`c4UvDdTqq8MmuH*%`*#KD})M$ zbvlE~QKUt~KZF)vFf)`$h6ON>qm)-?)6y`^9c4-X4LzJ%AKK<9=RhjeU17P7M3tjo z9aRqAWbK#eaYr==Y|2chrTe}^xcs!q(H3Tor;rN$+>92>O`lJYPDs^g|O zA*B#Sj$52{NNm~(GT4?Fs>?~$)@u(D!?!SVIT}+Af(8a7J)4BmMB~?fMl@5=-;OpZ z^f&M&$5z>}&)~q0_9U8k>NifK@AndpWM@Rx?8J)0TUL*<$-07 zGFe5kEXspB_Cz;A4IX%XfcXHPsYIn_MLUkxBUSY(Ebm^IT!L#rf9tg+s-9+ zqOxfPAah>N0jH)R7(178AXVE>z%mZFv}|;eb2$fQX-&|_xq<`f+RxyT&I}GL)!f9h zk^`CADm2KM$pMeHiYm?GK(V$DUhiDZfeqR=^olcQbPTM%SsPD^<|Zcq*rMG5vp79m z>t^kBnx6AG;MW=mSR0F987b}BHrT*fkmv!hL!&QfISUik1K6pxpoz{RTQa0|X`OI4 z=NA&D0obj5i3DtPyaKX4+6v4Y&YQ-hp=6)7iwtt}*rfmtYUfGoTev!pXdl8yowxGv zbXY4Ot-Ud65O74hpPIdy>vmGx1eCMVMnBwoQHj14;zmV}r47dNAT{o~c-Kwn_9%w( zC_?k@BdvJ%0r@$4%(WCcMa>4*btfc5EkuqJ7U+aYN)&bNR6?w%fv?3tY&>2!Y$UDprF+{2G(KLC*TcH z);r)j(bgXLjLrHwXzbPpAuPsvE5c)}61|@mIO{Dh12^VPFu2qW&IeJ0_8(NRF@k;Yu|${)K+uVesk3UQ8nqe)m(AAs9319jhD<(ru_=8u|4)~G}Ugg6(hmL zS2M?<5$}GBlF|sG`$s(rjNRgF7DOp0q3u42Y}Szhbo{p@(xoH6fEaQhj*M=%?2yQ5 z@1RMKIOt5nZb{dX(=dB{Pa^fdQk&#dzi;=#sM_-&Ru75gtwzgR_0drz06tCY67@05 z3Xn}3L}dTLm{*~*-LhFqwy(gjwbxii)83ah?v|-gU$I|;{gWG1uH2J^rr>BHq0^Pr zKcO)x`3VaEy-a0vQ=$m8zll2RtD?EM3n6h|K}+qWc8;c)%4^}`6nh-1vab^?WA!q{ zPN&26PNCRh9c`hU5=D!#xj#pJ*T;+@Z%(C2B>p3=Z4J?qO)a-kF2EURa+yjcQ8Zah zZALEjW~ZWzUKvmG(YJ__GJ-J;+)8RY94&ss7@E+YqH->iASLxV7$ErwukIBpqA;V_ zU5JgzHkAjR_XwR$66vPce}oZg-zFOAfU?2>JVy<%&`pV=yPbYoYR|KATcw4OD)ygX zINM(mc5E=pXhqB=SU8Rg3>R%7P>FhsHK>R)axq zU&6Rvry|O>li=~9?45`*`b3lcWh>|VYeZQ!RyOuSqP{f5QehU}fMITm{WfxnUkUoP zVf2c<7d>k)5oI-0#&5h`QM8e=zmGv=pDGA;>dcD$Ug}JraCJHqw9wCxdACg`-N2I@ zGmbp}X)2^~qS$k&A8rt$eyWSIP)>=Oh`Q#!1hO%fu{4-6UWZYWUsvN^K}t?!g)ea5 zm*Z*WyO1{Kam_J?3i$fSUIxZ72Q}`UX@nL&Sq8^X{S`N5DPfH!itgvVocaa$-qXo)?1dnmjZEk;ak~aagd=bdmm|w!&}@+orOmy%if3E;jBOFUI&*?YE~{R?`n(-L`#|707B2g3p#ezA?+3ix_!425SHw2e8?vSrrzau{6Oo5`xs{v4hBa2vP( z%~l7GAA2vgar@t5jeUw&f4PnQ5>d`;5)4(X z!>_inA*jDqr|)lLZ=$?iFMqv_{T%vSvL@0B3jWZ}DzSe3gEd8mlV@SU^pVwe6#67z zLfs!*1vr52*)NF{9&)jJVU!NDex$g$(FuC!A{%o6Z#)*WA>q zEMzk{RWk1dHj{cG`9sKB&Suc8k$eGKuVB-uH^wHPf-7XQG~(db*l{)0tx6A@Kx@u% z{x;>SY+4nvX=Tu2oYz~Y+{IFgK$?6v8ixGaz(b{WOE{4GQC92yNO&1pZr*Z|#aT%U0Y;JH zH++CLsuL|y>8p5k3V&xFS#|%raHfeA5GGnCiGc7(XAC*$M9XY3Kn`}sP(+w$$rK*B zuQP@`XriTXHzZj0-rE^N9yHO?LRN#vbaD@LS@_CU+nd83aEcCkxc^>bi4xpLI=TN& z6R@^7pZyB%J6$h6*2$8g;Y^E-`byhd?A(+ons7lRN?e_?*utMnVJy-9PGO&5`Fw*V zhMK1B^#a4UDIWvm=EKh;-a|JhT4G4y@7y2+1*JT7|9ZF`H%X#p7MVob>tQcqh$rby zxY_w@$+S!|#rYeWmC+U_SxDQvnZg5tQkE8T5Ck)?7gYR*4#=weKSd!oYL=EJjJmrs zhQer;mL-h1t22he?rKdR_8l=4R#$72WmxElp|HAITO#0rj+kteXKUj~HlkEV%rXq) zY%POeZLbpZG)8KUHj!a4YkO@mOVG$1ElYq-<^;1_izRg}d(kJ8(U8sBz@ROZvCBn)3+IZ0z&**I#R0$r{i9|VzM#kmgkd-@vW$(dG z#rfPyQFy1MLHQ?o`NN%rj8b5XD4Iv2Vkk#5%!FLTfwxue8ef_(SotqlkX84OcS+ZH zTfJ6{mfhQ93eZt+t4sMBaPO||F{dzE-d5KM+w9mLQ;zWWwtB1RsLNlDp)WAKt$s4_sQ+-DcItI8c%gw_MY6%D9pa6%IW;bcJ?he z!hjAR+s@`dpFthovwiee7l>w*ibSFL45Q``s$4v<)%YnK%)Wi}y^=_;tVIY)))K{d-@jdPCM*^L>P14zjMvK_-i{6M zJ(6IXtclk$Pp{?B_R*h80=<^AqLyoQDUYC*wk1NmKCn?sx?X;GyK|>3-XfLYQDeTA z5Q-WivR>zsVWUc!@B=vYcZF}Hb~(L4EZ1FqEPn@l%LVdkD$A3 zw5cfpqnxZVbD^}lUyV|wjc$>`)%}lyY9fAWuIyL&+^y}sImVf!0OXSmg&L=1S}U1Q z+rO!?k2Z1hi|K}v1W;3sPjR@Tv_-c5w%2&hM-YpQf zS#=RNiA(7^pQhneQMd=AMUai<(T;(v4^N?H-k{$Ph|85##8%LPX_j zWQSRl^hQLC7e|p|z8Qk`5m|}4|1#(%JqlG{TtHcx9VU^cFBXxaSWkCOB28cP6>%FK z>P#Uk{6yNjIOS!m7EkeDg+`^!L0O-K@>6C3IxV5Hlpg?knVSPssB`H|p~*e6Em<(; z8~lx!(W_+9YFYFK^qNhN0e`_;s_osNICn?T@bYuA{AMslk=<8+3Cl(GiKr>E*>dLq zPx4Gdv)_V7Poz@k!%>~fC6Sb@%&t?O4moD_H3-A%w;lRhLogA))crZFb+ss&BILk_ z)me%qegduj9mp(?T@kx1HZN%@reM5ml8517nmINvDPt_5V_2l9*eR%N9%_k0Ew->)99*#}c2O^B7H?H= zm=Ya3#hRD2oa3j&lhg#RDcr{ytBz6=qp>QTro_hH5NnCY3d`I)te=w9*jUk8VoeTf z8_u(Im|KI|I$Fpi;xS38CEm=PYP1sMp;nHKh2xG3YY(2wa7*c}K@5?+!mh+js%NHd z=Z2aHLxo#ol5RRfv&l1fKe>`%(+sS$rl6(ZG1+VC^_=1wZXXPRX<@BfHI~{poqS{l ztiq&8?bOtnW5UcdONdrOPBL3>o}tdQ=$u&5H{?vBYpx6LL+CIkMV-l;I5$nh$=eSj*(`lL<|4KP`}bZ^Qd!@Kd4%!HYjhg=?eHf~Wlcvg+2Zpbj4 z0`)b<9oidDDOgsIHyMM+*uOoHVrq8HosaHZq~JQE5prFMK^kB&vFOddT_JegPZmMf#0DU zy}@QVjvG6LoAoui(c!Q4*K~W2ZhxQ~o1xe>JpkfBOl7f;GW7tPhEc*2F0j}GO!G7A zJeI0xR*P)~OGc`$WojL3u*9yl)iB3-79R)%SaKU<-L?ZP+4dlF?PT*eFxv(;a~E5* zljUq+$$l1RyN8W`oH;Ytzsr~jV`-K^8XF_5 zHi?o9mS{=Y!)&%)%wB6-#S+dlyPr+o#HQN(%+bmw=kr`PaO-%^<0rPLwIpm0%jUq{ z%t7hbIB4;+TtF7$r*tiwVEZ-f>t{|sTeXg@MsCzvc0FobF0#`=rdj;xffN$6mW{F` zA7ybk=;~rg(8;-%jS8^I+Vm9WUdxujc9Yklv!<|=TB46S9c6oojeVBcciWN~JHg_P zF?AiAWxJU4NQ9+oN!@c>H4zFxNa5^)9=H^swD1dd1J!FAl(9k8`Q2R+PwW zmKZ4c@_B7m60x2qPWwED59Z>%vgxA?zCSYCAdA||;e}K)L#~i3(j;vukQq|9*P(us|5)TrMW1coW zi8%u-9;aFd*lf^f-())JUl>Ml)c-{20TPNHk9pR13{e1sF?KH-Ck0#DA238)Vn1YY z50bfxY`3sjZ4R`sOxQ_%J#iD9FN4im$rfa=lnmy)fhDX9unGBWMg~jXu#(hu+{2>Q zGUqxrHo&ICZ!_4qmE_zLYuPL?ZD8>$+1Lygy@AE9W1}!5EHOHpb7UWw10L zF$%gUl!9!E(8`wekG5?*eAv{s6b??oy_O*lZLWQQw8`*OEHv5{K?XZs_W+q-rJpSZ znclVtGMIJd18nRDw#?7w^R}fvAlo+e0czWr2V~pEK0tlD07%}p(VXlWu2quJHuQEX z?`_z7;>zLs*-F0iiZq6G7h|?AHo;FCBH~Rzc=59-wJh~fvT{;@jl!^RCjz#PUE^md z81E}tD!^Jci6h|(jy7h+u$f0ubX*3TbecugQhxkeHd)V)TTA%4G}5X>09nh!3&z`M z8g}r+Tb_N1u~*on2UseUf%TvahC?kI{U}R*fZ}WdYJ7+Ypv;U1*ch(NIDoax#gXVc z3@D*YA_y|rc&-5QLIEg-yijajm@*W!)CY8BthcaesN=*@Yk*Be#2#+QP|(&aKkwMU zt|Mkl_Lj%hqioI%A2RI%0`xq_GT7*KEXuad7GQRS{*`PeLZ9so7W-a+MYUly;B05n znD3J|u~8%glXen@DbMapv`uSTnK)fdVt$nvouL-WAyxjMP;(-mL?a~74-nqqAc((^;tH>)@VD# zwDYJ7fdq5I<8YX6#@@7b!Bt{yJ*)~-#2!|fLHBrVMhc62^jQ}F>;YVC%)@N%0XBZ8 z=;NboZomZ039xZH`3gxr3bTR^%OQlS2U+SvZ1w>*dZ(DGV8Z|#yHkXGF2i7>a5f3k zP=KW%BtOVvEf^U#+p8?$7qIx7%(0iZ=ff!Nnw0a*txZj0MOb@faI9DvAPW<&j>J`#vUS{`KjS(Xhwf&qv=aMrL1MQl_ho4AV2 zt6`&-v57bE%yJs_qkPP6vD@BdaTi$9JeY11#x5ITUuXq*|GMmpST~whn~FARvy&M!5X=G{EGxl&f!S>bFVONi&hk7Wlv=Be#;#)nKFH?9$05DN zB}LiZyu$Ta`FT0sY>&4jt8k55@wf92rYW4Pw5-IPRp8CZE0plY!fZg^(v5}ly(M|2 zZl$%(TTxxz;;nD3RJ?)4K&!8MfuN--bm{pJUr?0eR=o7>vBstlMUH!YUbY)DOS6j# z3*Fge?wn9zS$45kqVtLhNojo15+B3#($gHH9jkM_*#$YMi(0g%#9dm7FTIwCR^Vi( zQK@P6w+M37mYbiorqsJ82gL4DcVU_0^#<^}uBBdoNMg}CrLNgq?Q8Sa*R}dlf-3MO zP_O*D8vj_T5@@`wv1w}~Ss+kX9bzslD)W|>7kgK4^yZZ0t#_9w_!K2Rq>FFE38GS; zzjRw;RRMiWjyJ;43c8hgyg6BASzg{NA)#d+bVQD~w5+I@R3np%!fbr}&M)Px@%i)X zDqAXAwynoUH0zog>D#;1SJ~dIoNTWk5l* zEcE8Ov&za#+~^Nyf802s|@}@y`+Ce zQ21FzgHQkRsc;8xMGGG6LW!FCirQ9meG@(v>Q{sdSK?S2{7{viR~x3wE5z4F$<=wI zxix`umlS5@o753*Obsb2b{C=zRe_ckZ=NtHeZvrbQrn1wb#HxB)ome0=$v1Ko-N7Q z=q;lb(l=AR{%!bFpHKP=x)omxY-+)W4)LWwcyn!qm);nmKBbQfD)dcW`m`wqU~@AH zxT3}7`T6C=r8HVS+@Muk>Z=tT?YDaK8m=J8S6V8zdighILuEPC?-+mUF}8R)ugx$F z)xX-EUv#54-@V>#GKOi$X6F}`x^wtgaIX)wI`(m6tC^yD6(O zFnOh?h7iNV85ys#r3Z#+7b}%@jowy&3$-z%M?ra+dxH_BJXwV~`G`^ex&~O$-{h~T z_qGHY$xm9hwbBP^y{+|4jkV@bVUBQF>(_Wo^EM$URv=Wg`tj-B7R8%a4nycz) zKvgyRm70nwRJYCBfS;!5$|`X3)-A#_jJiaNvk^_o+!z}b)!V$__rk%bm36iF#wMDF z?(m|YY4FG|FAJS=5GF(b&Bm;;x86oMqxl7l>_ezRxEOmSJUc0Rh0fT#RE8+_x zH@@M?o1NR@lerRit~ZyoTaccfzRt5rl*m=9WE%66~pBpOS6FqD>M z;akM|Y)E~VTf8QVt4X66!=87r{Nyn#T1BJX>@On3yGyd5IUnyv&xjJEf#gS(O%*LP z>$D+wkke4mr0J>}5;5(xlB04&qaT6ZuiMrL9~-@x16rFAHvD=lahIWQOJye(73Oc` z%FCGLt=d8#RrPXL=W~pV+rm)jPjB|d?0mOmzcDMX%$rkG=vEr&i_}$^5-G^xBcqTb z!w}g>ZSt0~>?bOAds!hwu{^pw(OAgGW_u@zUo`TWOq$ zKyD1H4WYPQRstX5fm<$V#7LkRW=!P%mTj%@U;fo;?vXr<@-7jRnwh4to-mu7izZIzeh=bTxeJGnWnJ+YH!B>S_8Yy6h+OP&D&nwI=LI7-?Pqzi3v4y24cQ-y68lzXY zC#`e~%L`Ux*+;&l5B<MbcREX*rh z!yAa9));D?_!ct%aRs|w%m%t;IJaT10(U`C$wn_+p-3ucc5Jd@u?Mk9 zSdy0f6#r^y#Pi5e!&m36zItDk-`mveYox^=J}~damzuE!F(M$J(}>lN&q-HR_^~MF zWg)8;7KsISXwf1j5e#>eQ;XnyV@Y0_4BM#A*Y2z0+k&li{w-Kp%818pO4CB94&4O! z9yqP1a`V=dmxv`Rw+Bs7M%ds{L++}C1ljMHd*u=+gy4UtL#*&=nHp|;qZf0FN(!<} zYi9~s=oZt`;>MzqoKjJn5uj+UFWXowN3enByGD)|a}t>e>heW^-cJ~Np`}GtQ}Z?v zwDGn5T78tsHlY8Z3D&e?j-s_Cw;#1eOtzQtaP`>q``))~tNm&0)-mtpaya8EfIFw0VUqU#TQbg?#yv zleb=3Q&{fGo`1dks)}oFgFn#dTUqOC^tIGg0i>PI%J!v8<}O*}np^9dTT{`BP3M-D zrpBf~>)b%&R!nDe{nV^h6k^3vb=%zLmL@+2R8z}btdz0PH43U|C8-x<456T^#st%@ zW-BI&244dfkl5{2(<|=0y@unEKZPyrO)fway%AVwos12l*o{zV)Bom(n82IstHu6@ z7N@ju6~0HyHL+yppG&{ediiBps}WQAT<7Kfz=J|9KarrFB4UT!#z!u6;2N08sM~Y$ z)=(jh7do@JvKD=bsqj6&%UBVGMHAgU_&zeXB&&cXRs`W;f*3{)EE;I0z=p5fiwaG9 zJIrS?Dug5DEMpF;aze%EhxS5{SRUZd8iX1mdj+!$Uwq4%#&F%pLnB0JF zU~YF~s}bs6>Qs3;m77;maAQ^p->zcajvXW&8Hsr`#Gv~s8CGDWhZy64CIf5(Er#Fnpw_I7Y`M??o zCwU7OC|DD=NdKTstZ0g{d=0H^5i0akmC#mpeNnz?a`Y6HmSIPZ0G;ijfB`+=%5X30 za+>9;+T^+*q!2&0qZN?Y6-OT4iN!-H4mUBytS%}q%*iS-?P?KaS%mb1(-UtaiP;%!s#t$`&DD_y2%@&Wzm>19mI6S2Df)I7+;3}6i6D7vPN(XFW zt6AX>VB|F4=G$hhq(V}Rr3TGwuo(KlTj6hNsH=kE#LPxG3W9zL0xf<_rpBhN2$MH0 zV?*-7_rjr-BTen0&Zg}uU;FB#F*Inz=*0@65QCtQ0<60bCzrHn=1mvFH81SUf%{d7 zdySVb^AsP#eW10{IANhbd?gNBu z<0vDti^De)80K_nUV;!?QYaRKd>za?8&aAui6cffv?9dOB7vU}ago`4{e@9cQJqeM zqoR7T*mlYV6JkFmfBlTVl-6T4SmAyNA&!RzIh?77q!RjB5jZQc;}n{U5J`v0=B0LP zT|+Yl247tYIwO?KUo6gaDq3o*%*Xc%5N%KteYS7`jbnb^&$C9@!0s=6n@HN}aSliL zxj5w%{>tYa{`X-F`|1&r290=zBLAFB_(;>qC~g|7I70{;X&$s3&-beC4dSfXTabn0 zzY;!q8f{**R32negf#{hT*S-&h#x;P$;Cq#Y%nMmlTXq(tf|1?KZ|rH`RpMgh@npc zeC=##D#8`EZR^C;jH3rSdEjx2-@?{B*s#f!Esm7}v{tJRG{})|xN`V(NXrpaTO%DI zY$zAxm0~NSpYO_(J2&^xki%n3C;QG_nBxsQP&ERT*xAa58c?1u1Ni}44c|^0&DFcD zxQNfHe2`aSv5X~Ic(}pCBzg!n{H}`olQ_!3s>ZvzJXbD65exWIgbq?@(Mz!$j}46K zL)%h}Rj`5xe<6(?BybWVP;YXV&}oG{&kc1sJ-`Y{gO};;q0!HuG>H@II&Tvq4^F#7 z#Ktox?Ea1YmpA15Mc8()-ezoE75qUb5z^>U!WO84Wq`M-zM3Ag@EM3EfSM+KrN;Y} zpGE28-)OY1BTZ$Ph4EZ4-{fC3i*VA_HEwLdvl|e3`7z)E1-{rw&PWa)vCItHO>*`U zs98=6ha5T*ET)44xo6>vT+BguP>ADA9C~`(@OF5ev2vyTDF!m_Ou4L(D;MUJ!};>e z4~NJzBw6_O0Z(QGcLX}0{NIlSG!8kdTI!nl!i-bO!4P^VkX2HG!yDd*`jQK$u{gx# zTXvyhq<9l4)2OFva zp)CnLMAK(Ez9`|791hK~R}kh4J?>s0j*`j8`57^u8PgPkEhm#F7fGZkl!9Fk0+A^=cu5w;&RnOU< z#=yM!3+L4}R@Ddah=vnN;7UTi(Ej@*^XSoJYnZGs;7Y-?e|el<0k{5Y z(Su8@Pb~S7{D~XkhQILAHa=ALhoQ(){89-oom-W=ETY6E386i=6g zGI2@#jtKlhi9Z>E&jVh?SF}Cy7fhrdUFGs91Wb96lY)JDbE zvGwnC>-g^?Go1d9ar&`}{s|fULX%(5aQrw$|B8%`f05(ID*A_HbbP<0*S{rW>e6K~{lQjPDE>!nQ`KSqiCKKH-D z|6KGjWTRbzqaE~#uv_FW0RM&Kb*Z6rCnNeRuWyY&|AP_mFOGnJ5PFh6F6qy@JHF28 zol4~I?tdfkk-t0pK;k2Rl&)!Hhbym9zz^51sUzSsM!=U6UK^$8-?`Uo+6eq8_}gY_ zf8F0|Mv!y+2>87m@4Vut@ZTSS{=^9Q{t@u!M!^3G_~Go9$oorgWhk970)F`j_+sEk zQ4bUg8M=MEBhWXGfWH&?;q?4h;GM(xKYh=CxPE_z&wP6JLjZ%K( z_vY#2)Whld)e-Rbj)4Cz@J@`2Nd2Dxp7hi|8>Z`dYy>%Pa{5F?|GpVOe!VjS{re-} z=_BRCwJRBT((_>RX(?GGV@IH$!|_ff^4IOFMxZYPp5lXU2fe+uBhcRtJo&RuuPb%u z2=w=jfdAnL_*X~3|BB?jTUsi%;V29*j9_z#qc$)8oNmK5u$UkmG1cK+Clje$@6#(Q@+A<{+bcXPpNWch zC?emxxZ>rhD<6BCA5W$&H1^}=EU0)u!0!kZ`_H_=&z7uw?~qSx)g29AzM zJvn&1zb3zEHC|1@nJgVth-YSsH)kUbQS-8geHt~)DGZKRBi=+6PX;sB;H|N2?}D@i zX^X`c$#f8lb58op^5P6Z92(Is&e-NfJk0UdHsE2t*tdBVY>ryPq({6PVw7F4zx1vras^p(;1tYJ+&5H(&Ee zg0Zr-Rhq&$mBpr%p0*<<+~%#Rs0(o{66ffq*SGld4x<6Uz8FjBl8 z5vGLMkD}O*}u(%stnZC zSI@;snxM*BoriZGY86ht1@AN{Y1P{rQH4lx2FpuuFvMSafqHq zF<(hTHm$ZvX6OVm&F^amNRtPso4C!=d|Tvnu?4U18<3D8<_*E2=TTJ!o}ocGGI<(& zNlC+m)qr^jIA3J|Pub)IB0>HZtzJ}FNw1Ddh`$dj^RS>9jUF@Lmd08-GH#8SZvR;j zU!hV|{KGPzU#VEP(xs;p1Zdoe)_h$9fPPf3^DmYBdYWz~MqXdv=x91%G4pSc{CYY~ zCzPqazSGfk-eKm~&s+4=r4!0DlK)2F|AfDprR%T%T`@hKCHe4y4t_=IU-5qnJ7bqR zf*_1vqok1FKOh{zfWhW9=|l1d#M&yP5e)=Gx)9`*7HLBiEwm7eG_OvRN@Ej98Au%v ztgI#A_ubC#vNz9%1HNx}cD|k2y}ReTDQ2Zrm4<%(zaxIozq>7t(R&A<{Kckprr>`i z3_#8;lSwCe|KCaLGr{0<4j4$ff%vflcf|J@WAr&^42;*ZsrXAYI=w~>FA+ZHo`DY{ zVEpIxe+mBcn2>YSK)E()r$v+q}=;k;iKzet&;h;Bo(amCpMIfA_7eRHQf1 zdA?fUgYz1%`OS7%2R^IGYU3C6g2#hzqTSFq_@ns# s@MT!iANMW)KRwL7*Ae4m@~bp1=W6Zr^;0dpJNbLA3MBcE0#4oL7Ee{+3IG5A literal 52624 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 diff --git a/main.c b/main.c index ec0505e..7cf4339 100644 --- a/main.c +++ b/main.c @@ -67,6 +67,9 @@ #include "l502_BF_enums.h" #include "l502_fpga_regs.h" + + + typedef enum { unknown = 0x00, ADC_data =0x01, @@ -170,6 +173,18 @@ typedef struct { char const *devname; } ip_dev_list_t; + +volatile sig_atomic_t abort_crtl_C = 0; + +void handle_sigint(int signal_stop){ + (void)signal_stop; + abort_crtl_C = 1; + for (int i = 100; i ; --i){ + printf("abort"); + } +} + + /* Функция находит все подключенные модули по интерфейсам PCI-Express и USB и * сохраняет записи о этих устройствах в выделенный массив. * Также создаются записи по переданным IP-адресам модулей и добавляются в конец @@ -768,9 +783,83 @@ long int X502_Raw_User_Data_Parser(uint32_t *inp_buff, uint32_t inp_values_N, } } +uint32_t X502_FlushRcv_buff(t_x502_hnd hnd){ + uint32_t ready; + X502_GetRecvReadyCount(hnd, &ready); + if (ready > 0) { + uint32_t *tmp = malloc(ready * sizeof(uint32_t)); + X502_Recv(hnd, tmp, ready, 0); // вычитываем и отбрасываем + free(tmp); + } + return ready; +} +void receive_data(t_x502_hnd hnd, char* logfilename, uint32_t* inp_buff, int data_receive_trys_counter, uint32_t max_total_words){ + //int data_receive_trys_counter = 100; + //uint32_t max_total_words = 10000; + uint32_t ready_cnt_Err = 0; + uint32_t recv_Err_code = 0; + int ready_cnt = 0; + int ready_cnt_copy = 0; + int values_in_line = 0; + FILE *logfile_ptr; + + logfile_ptr = fopen(logfilename, "a"); + + while((--data_receive_trys_counter)&& (max_total_words)){ + + ready_cnt_Err = X502_GetRecvReadyCount(hnd, &ready_cnt); + recv_Err_code = X502_Recv(hnd, inp_buff, ready_cnt, 10); + printf("\n\nget counters of calls of SPORT_RX, SPORT_TX, HDMA_RX, HDMA_TX\n"); + BF_exec_cmd_with_arr(hnd, 0x8005U, 100, NULL, 0, 1); + printf("\n\request TX_buff_I_shadow value (last size of TX_buff transferred to pc )\n"); + BF_exec_cmd_simple(hnd, 0x8009, 10, 1); + if (ready_cnt){ + printf("Ready count: %d, Err: %d \n", ready_cnt, ready_cnt_Err); + for (int i = 0; i < ready_cnt; ++i){ + //printf("\nabort value: %d\n", abort_crtl_C); + if (abort_crtl_C){ + break; + } + --max_total_words; + if (max_total_words == 0){ + break; + } + char bin_str_val[9] = {0,}; + uin32_t_to_bin(inp_buff[i], bin_str_val); + printf(" 0x%08X,", inp_buff[i]); + fprintf(logfile_ptr, "0x%08X \n", inp_buff[i]); + //printf(" 0b%s,", bin_str_val); + ++values_in_line; + if (values_in_line == 10){ + printf("\n"); + values_in_line = 0; + } + } + + /* + uint32_t process_data_Err = 0; + uint32_t adc_data_size = ready_cnt; + X502_Raw_User_Data_Parser(inp_buff, inp_values_N, + adc_data, adc_chans_N, adc_readouts_N, + &LFSM_res_tmp, &LFSM_res, + &FFT_res_tmp, &FFT_res); + //process_data_Err = X502_ProcessData(hnd, inp_buff, ready_cnt, X502_PROC_FLAGS_VOLT, adc_data, &adc_data_size, NULL, NULL); + uint64_t data_sum = 0; + for (int i = 0; i < ready_cnt; ++i){ + data_sum += inp_buff[i]; + if (i % 1000 == 1){ + //printf(" %e\n", adc_data[i]); + } + } + */ + } + //printf("try: %04d, words ready: %06d, receive_error_code: %05d, data_sum: %d \n", data_receive_trys_counter, ready_cnt, recv_Err_code, data_sum); + } + fclose(logfile_ptr); +} @@ -779,6 +868,7 @@ long int X502_Raw_User_Data_Parser(uint32_t *inp_buff, uint32_t inp_values_N, int main(int argc, char** argv) { + signal(SIGINT, handle_sigint); int32_t err = X502_ERR_OK; uint32_t ver; t_x502_hnd hnd = NULL; @@ -910,7 +1000,7 @@ int main(int argc, char** argv) { printf("loading Blackfin firmware file: %s\n", BF_firmware_filename); uint32_t bf_firmware_load_state = X502_BfLoadFirmware(hnd, BF_firmware_filename); //load firmware from l502-BFfirmware0.ldr file to BlackFin - printf("load state: %u \n", bf_firmware_load_state); + printf("load state: %d \n", bf_firmware_load_state); printf("setup module again"); if (err == X502_ERR_OK) { @@ -985,6 +1075,14 @@ int main(int argc, char** argv) { streams_start_Err = X502_StreamsStart(hnd); printf("Streams start err: %d \n", streams_start_Err); + + time_t seconds; + time(&seconds); + char logfilename[] = " "; + sprintf(&logfilename, "received_data_%ld.csv", seconds); + //logfile_ptr = fopen(logfilename, "w"); + printf("dumping to file: %s\n", logfilename); + printf("\n"); //printf("start streams sampling\n"); //BF_exec_cmd_with_arr(hnd, 0x8004U, 0, NULL, 0, 1); //setup and start streams @@ -1002,57 +1100,63 @@ int main(int argc, char** argv) { BF_exec_cmd_with_arr(hnd, 0x8005U, 100, NULL, 0, 1); - printf("\n\nget a some data made by sport isr handler\n"); - BF_exec_cmd_with_arr(hnd, 0x8006U, 100, NULL, 0, 1); +// printf("\n\nget a some data made by sport isr handler\n"); +// BF_exec_cmd_with_arr(hnd, 0x8006U, 100, NULL, 0, 1); //BF_exec_cmd_with_arr(hnd, 0x8006U, 100, NULL, 0, 3); + + printf("\nStart transparent mode\n"); + BF_exec_cmd_simple(hnd, 0x8007, 10, 1); //start transparent + + printf("\Flushed from receiving buff: %d\n", X502_FlushRcv_buff(hnd)); + printf("receiving data...\n"); uint32_t *inp_buff = malloc(1024*100*1024*2*4); double *adc_data = malloc(1024*1024*sizeof(double)); //uint32_t inp_buff[1024*2048] = {0,}; - uint32_t ready_cnt = 0; + int ready_cnt = 0; + int ready_cnt_copy = 0; + uint32_t ready_cnt_Err = 0; uint32_t recv_Err_code = 0; - ready_cnt_Err = X502_GetRecvReadyCount(hnd, &ready_cnt); + ready_cnt_Err = X502_GetRecvReadyCount(hnd, &ready_cnt_copy); recv_Err_code = X502_Recv(hnd, inp_buff, 1024, 10); + ready_cnt = ready_cnt_copy; + printf("Ready count: %d, Err: %d \n", ready_cnt, ready_cnt_Err); printf("Recv Err code (<0 -- err, >= 0 -- number of received words(32bit)): %d\n", recv_Err_code); if (recv_Err_code > 0){ ready_cnt = recv_Err_code; } - - FILE *logfile_ptr; - time_t seconds; - time(&seconds); - char logfilename[] = " "; - sprintf(&logfilename, "received_data_%ld.csv", seconds); - logfile_ptr = fopen(logfilename, "w"); - printf("dumping to file: %c\n", logfilename); - - printf("\n\nreceived data:\n"); - int values_in_line = 0; - //for (int i = 0; i < 1024; ++i){ - for (int i = 0; i < ready_cnt; ++i){ - char bin_str_val[9] = {0,}; - uin32_t_to_bin(inp_buff[i], bin_str_val); - printf(" 0x%08X,", inp_buff[i]); - fprintf(logfile_ptr, "0x%08X \n", inp_buff[i]); - //printf(" 0b%s,", bin_str_val); - ++values_in_line; - if (values_in_line == 10){ - printf("\n"); - values_in_line = 0; - } + if (ready_cnt < 0){ + ready_cnt = 0; } - printf("\n"); + + int data_receive_trys_counter = 100; + uint32_t max_total_words = 10000; + + receive_data(hnd, logfilename, inp_buff, data_receive_trys_counter, max_total_words); +/* + data_receive_trys_counter = 100; + max_total_words = 10000; + + receive_data(hnd, logfilename, inp_buff, data_receive_trys_counter, max_total_words); +*/ + + + printf("\nStart averaging mode\n"); + BF_exec_cmd_simple(hnd, 0x8008, 2, 1); //start averaging + printf("\Flushed from receiving buff: %d\n", X502_FlushRcv_buff(hnd)); + + printf("\n\nget counters of calls of SPORT_RX, SPORT_TX, HDMA_RX, HDMA_TX\n"); @@ -1062,8 +1166,34 @@ int main(int argc, char** argv) { //fprintf(logfile_ptr, "value number; time, sec; adc_value, V\n"); - int data_receive_trys_counter = 1000; - while(--data_receive_trys_counter){ + data_receive_trys_counter = 100; + max_total_words = 10000; + +// void receive_data(t_x502_hnd hnd, FILE* logfile_ptr, uint32_t* inp_buff, int data_receive_trys_counter, uint32_t max_total_words) + + + receive_data(hnd, logfilename, inp_buff, data_receive_trys_counter, max_total_words); + + + + printf("\nStart transparent mode\n"); + BF_exec_cmd_simple(hnd, 0x8007, 10, 1); //start averaging + printf("\Flushed from receiving buff: %d\n", X502_FlushRcv_buff(hnd)); + + receive_data(hnd, logfilename, inp_buff, data_receive_trys_counter, max_total_words); + + printf("\nStart averaging mode\n"); + BF_exec_cmd_simple(hnd, 0x8008, 2, 1); //start averaging + printf("\Flushed from receiving buff: %d\n", X502_FlushRcv_buff(hnd)); + + receive_data(hnd, logfilename, inp_buff, data_receive_trys_counter, max_total_words); + + + + +/* + while((--data_receive_trys_counter)&& (max_total_words)){ + ready_cnt_Err = X502_GetRecvReadyCount(hnd, &ready_cnt); recv_Err_code = X502_Recv(hnd, inp_buff, ready_cnt, 10); printf("\n\nget counters of calls of SPORT_RX, SPORT_TX, HDMA_RX, HDMA_TX\n"); @@ -1071,6 +1201,14 @@ int main(int argc, char** argv) { if (ready_cnt){ printf("Ready count: %d, Err: %d \n", ready_cnt, ready_cnt_Err); for (int i = 0; i < ready_cnt; ++i){ + //printf("\nabort value: %d\n", abort_crtl_C); + if (abort_crtl_C){ + break; + } + --max_total_words; + if (max_total_words == 0){ + break; + } char bin_str_val[9] = {0,}; uin32_t_to_bin(inp_buff[i], bin_str_val); printf(" 0x%08X,", inp_buff[i]); @@ -1083,7 +1221,6 @@ int main(int argc, char** argv) { } } - /* uint32_t process_data_Err = 0; uint32_t adc_data_size = ready_cnt; X502_Raw_User_Data_Parser(inp_buff, inp_values_N, @@ -1098,15 +1235,22 @@ int main(int argc, char** argv) { //printf(" %e\n", adc_data[i]); } } - */ + } //printf("try: %04d, words ready: %06d, receive_error_code: %05d, data_sum: %d \n", data_receive_trys_counter, ready_cnt, recv_Err_code, data_sum); } - fclose(logfile_ptr); + */ + //fclose(logfile_ptr); + + + printf("\n\nreceive done. Exiting...\n\n\n"); + //logfile_ptr = fopen(logfilename, "w"); + printf("dumped to file: %s\n", logfilename); + X502_Close(hnd); // освобождаем описатель X502_Free(hnd); diff --git a/plotter.py b/plotter.py index 15711fa..df9732b 100755 --- a/plotter.py +++ b/plotter.py @@ -18,7 +18,7 @@ if __name__ == "__main__": data = {} values_N = 0 for line in f: - print(line) + #print(line) #print(line, len(line)) len_line = len(line) try: @@ -28,6 +28,8 @@ if __name__ == "__main__": header = line[2:4] value = line[4:10] if not(header in data): + print("New msg type!") + print(line) data[header] = [] data[header + "_N"] = [] data[header + "_hex"] = [] @@ -38,11 +40,17 @@ if __name__ == "__main__": pass except IndexError: pass + if (values_N > 10000): +# break + pass f.close() -# print("data samples:",len(data["X"])) + print("data samples:", values_N) chart = go.Figure() for key, val in data.items(): if (key.count("_N") + key.count("_hex")) == 0: + #print(key+"_hex :", data[key+"_hex"]) + #chart.add_trace(go.Scatter(x=data[key+"_N"], y=data[key], name=key, mode="lines", text=data[key+"_hex"])) chart.add_trace(go.Scatter(x=data[key+"_N"], y=data[key], name=key, mode="lines+markers", text=data[key+"_hex"])) + chart.update_layout(title=argv[1]) chart.show()