From 8492b38936ad014af7b74116464f14d23bea30b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Sun, 26 Jun 2022 22:53:12 +0200 Subject: [PATCH] Zerospan mode for spectrum analyzer mode --- Documentation/UserManual/ProgrammingGuide.pdf | Bin 248962 -> 249668 bytes Documentation/UserManual/ProgrammingGuide.tex | 3 ++ .../SpectrumAnalyzer/spectrumanalyzer.cpp | 45 ++++++++++++++++-- .../SpectrumAnalyzer/spectrumanalyzer.h | 2 + Software/PC_Application/Traces/trace.cpp | 9 +++- Software/PC_Application/Traces/trace.h | 10 ++-- Software/PC_Application/Traces/tracemodel.cpp | 11 ++++- .../Application/Communication/Protocol.hpp | 11 ++++- .../Application/SpectrumAnalyzer.cpp | 21 +++++++- 9 files changed, 96 insertions(+), 16 deletions(-) diff --git a/Documentation/UserManual/ProgrammingGuide.pdf b/Documentation/UserManual/ProgrammingGuide.pdf index 69b473727b790b0dfcc661be5c1ffd086bcd7dcd..7ccece1293db4ecb0db8595de9d70a7547f5288c 100644 GIT binary patch delta 39117 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 delta 38449 zcmZs?V{mRk7oZ#4wr%^wc5-6dw%^#cZ5t=HZ96%!t$V(2=FXkEGgbS?s$v zMKm8)sOow3rh|-_nrkxx?dW2Q`_wNxs6maacy0o=$N_qQyPyR{+DoTJG4rNIG4>`$ zQRxsTgkk_vl9uqGTq`r02;1QX9Gf2%jGL6LJf^wb%8>1T1m-ZFQ$8Iq_C`gwPMYRA zB{d**t4WHt+D2eo&?DxpvrE0-QMx$bjBg$i*H`dD^u{0A=j%xwDDq2zWMXY$Cw%Ow z8#CeJgUG1QchA$a+&`dXm;{6(RfopFWH_6c#6THMdE#Lx_=;+A0ZYhokU9>?ga@KP z@}8ql7AuV`9l9IoIUf!HB^9_HFAiiDbSD|GE{YdQ0RwB90MgWw4bl{Y=f6&@P@T|( zXMrI>0@MWgt3fumrB8Cg*dkDILIR-=Z>$;05}gh~gciM>YDihB!O0+22hFMCFSkF( zeR?3)y_D`a^-lOud$3w_;T%bLDS9&TWNZQ+SSyORP(v7(0jeRO2<({6UBZU95druk zlyX>-2@c{&7dI^Tmo~XWWOrXMlA?ALN|y_)5Eb4PFaZ^m{vH$B5&|T3{Q->FI!$gj zG*B0k_7KIR4jLhTEOl#0%q{&SH95$1q5u!Kmj*UWV(diAC4EMXLXJ>U&ZnL?fX3P8T&iG=RWtKj>6%}h$tHFj!& z=G<9_Ti4}>YQi$N*;4NGRqA=wK>aJJi{6$2OZ;sU%SHr%xW4`3>I-PENyO3-L9{o% zJ%#i9;ep1Q33%|!m0L&!7&dFRQYGe-F-~GcH8&RHOg<;pzoYQZQY`zn$OP)I)qJwZ zSigr%|5lC1yJuUA#oUlHVIW zMt^FXwxS1wE|-G1b)s%xZEssScmDW#F8aAl*XIfN@7^o2+xo`Jdu1D6I&azVFalVw zik61mKh53SQL#h6@0z?O+n+7BNW62Keor;>fmdbKn{qJz?pp%7etuv%#x+xr{?YQ{ zk?G%nxHMoUC^OiG{qJ&r#V@2P4{kXeki5B2ej}%Gy<^`9D`BI0=nNl#)a@pRB+ax6>-iB8!#O!h}J7#H8}9XFH6W4W)r8>t{NsIG)D<&Dkh zJ$d!bqQ)bgwUR6H6#}%ea`zZ2uQU8%%K{DxDNI4`jb0UP@3xmQnE*TUY+L27BgqajJp~Ngz zOkcqVRl3{l)Ie#zL;H>s6GzoV{VpNwg*&%}vWAsHL$qF0Ti1b0BmhJ8z8;B=jwq>p zE~9~UU`$@CE)`orlApM1(h>hJ3TTw!J5lOY6^NFAPUO(o7Y<#Y_#+J00JLgt{F@m? zHZ-r|nnCD$pSYd@;4VoZ8?rsD5oell_G7_!UwxE0sZBZ;0a3+dq%JsduKOxNy+_oH zbLG;;;IrkHUd>e;V}QOS0da-2BtmC58>|v7zwU21(4F6pS{Ahn_Y}1j4`faFvxU~g z502C?#1-t7{X7=Z^wY@(BH%+F;mv8Zm1D*izCZWx-#0FSd+j{v;;jTlZj|l%&_}Jj zpTVvs%;HAU;ir`vt;q>hwh|ZOSUP3xH?0D@2p<6P5p0mecK}tRaFJJ(+KpYi_D{R} z^+7QYwow;N1Lu#JEbgj_QRgOoISd>r*K8s z*&tc|d^09Au%l{tm7nRimb<6>ZiFqZLY8JaF9dZ*}1_x zMVMZgZ+C3mZ*%Aqq=p81;dL4r=X1e)0s(? zV`pg|;VHta4#v?f;VBwL3t}ok)>G7fhLww47O=_FgVDr9=+LG2QiFNeq;CoteG30sRhh0qS@6f|{_j4s~UL<1tk>so2_dD0y8iO+L)jPj(ME{}T9 zu`7b$z$C#y9Fp^CKde~-CtEBL8MGkP!62#hs)b#ENl5h1OtpdC7Gs;9>D1B7&rqxeJsevRZ{>k6?evjqa*j6_aiEl4_Ib5baa=$<~eS|quu0%N&?;EI2_q{?6V)mi1_PH0^n zE%qVcweGp#KIcSFZfZ8XLCE5Xb>G=1bq>g%Wa3iR)bJ`nr?@)PTH!xfVZP}8Y)f-z;4pT~6 zrFpGQGwE1PL@8)UCVO&(LI5`XPUoc*QA>CkZ3QtQxZA>JxRd^sA(w7%L-(J{;-ue= z+hJB&V=nYYr|C3k=23lLR`IHZhD+^9nH6F+>6K{{&3!vtaO%6h6|)Y!IryxnLM&P3_EGEQnaxn34=BsFRRFhdmGS5wseA8x#_>8yv8ZCT4LH1_DsJx->MkH1LB zWh8~1h6%sh^2wo;EdCN9aHDF$YGT_$ckFSL3G(|p6ZQM13Z|$J;BdWt;b?sN!Rk2d z=8a=9#s>H`5UtD|tOFtiCl{~ zP^5=Dt3xwgJtaz`F_Y0)to5YEiDicA=O#kyQUdMiz8%GcYvGHcAf(~ijlMJDVR|ys ziAt33`a?O>Fvd_q)x!(RtHEZKTnhq#D1R0v0-T=+prZl(`hcle;$;xr;7k44;VwuL z>vWh3Ah}R?_D`iiG#o5{J};eQ_@T_nzL1UVNSXSImqOe&_JEvbkc>YLeNr8-4pTM4 zIGIFtzqKs`yQ+Sq(VB$@GOjNq@rNDIA_V=E~I!B6UuiyoLHmFn@tZZq? zp<4v!(RS6UdO`luCkW^WPljOXT3uGk(z7x1!Nu6}>%*kj4v!yhYCYJ8EjdY((1zfg zCVyQ7+2PIe&V)xwo#}l?ufV><3?V>w36%ecT;eJ$t^chfj7v11Rxa&Sl2!;wl_Bizp}271bwIWW`Ua_ zf$H?XZ2=~DWsrw6dObT`UfgVK0$5&u-rjs{$bNa9z0C$O9{)ToV2X$w&(AeYS6vx; zbF#e`B2hp_y-iM8i9~-_tMRqNRQ!q zVE20GVC`f_*}kJ~LHnxasr9k-x%F^4R-ISx%A@7~CtP^c9Ja)+^633|zu?MdO{Gz}rE)~D7EVZZSR z$~lUuXgE8qkEGGNCiG1yFJI21SW!16*7`(BbMFew6WP(`mf4D2dP3hsNMSb6s`}b; z%1BHRY!*4|7E|+fu}KmKlaLA=Hg#J_;_nfr=GbCGxkr^Jl?b!Q1M<75^J)$m$44|B z;M>A9SCMl-U*;H<AdXz3KX6xvWAnBKC83&(2#honWQ zzf+(nUrE0Sy(a#!a8dB<8MI>%2C=vsU~^KQs-HA^CS7*#H#f$sVjv=u31;+IKNlj( z0(7vnunOX7G0rc<(@bMS0x}a+C~6y)LYPWuH%ihlTV$mLq5_tHc!#Mm?TVJamRKUn zF&6QPIfCI@Dx$1ld67q`=lC7b_m-%yCQ*|5{bd6@!Xf2-Mw{iDvZz@7>Kmv9li@=T<_yA^QLNK#=9TmxdOt?vl!2TJB zn#w<5#Cm{f4F@R`Hk)jNde-z}lSye~#>BxC$weh`R5&-aF|dG4@1H+RL&~_ZQGd@K z@~0#@x;CQ1=aUdAEmV7QA?50qGKk>fj9A;T%2ofKr4OEBdn(Rgd&biOn(0$gqr1k6 z;ZQR7bP`;b$c05jBeR#^O4K0VWYd{M@wZ6X{>Ci+whVHi;8Lr;KiJRMB-{-Za#;~S z^Epua(U|=@UhNG7Vd4UMN$C7&v#;a-zzYfN0%3Txj?1W0UQoz|{b!GDADs{GtDKt- z)%vvxb%xA(4Nb!p$@1 zsdhL_IHUZ)yV1w~Z9Ua{y{v8AdyB|+yAi9G|!6v{W(+`EsB-E zkK-Y5<-7LSx@$jl96gL3#gF49aQ}}2a94aNHJTJliLbzu>%w>DvG8BTVr&_{0&lJx z-<8M4UGt&k=zkQmJh`rX7ak)Dngl=X2&#qeYR#6_P;xLBCe%ftKEhm@`56(}NO0&T zmtYa%@NdBmjfx?nU3`hW{b)7OTKCZNCIORA^zJC42~6(b<8Gx&hwEm5H77|3vw^Z| zLvD9KEkl@Uzd|bSyEbSC33Gtsst3BYl zNHs`!kd0d*1$VbvSqAm!I61oFa~2QA3X(7jx952YUsYv|m&>GW(mg`4^}!N3m(iDm zcO)htQQKCJ@Sk8cIIfm#{d%N!vB4UtI=x@@m}yi+R&uCt8~~Jb3%!79_LWP>qdlRG z^8Qk22<`YKFDwvf&*wtP4oi&?igfD$=m8^rvfx**eNG$PaWg!&v46iBNmn}mmH>yE zX;3Xjj4W_?p0(!3LZgMdat2+hMTC7H14-u|ppDAD`-*G2WR}e-sV5&6PDN21OahjJ zV>)Cx0?}L7XnUvz^;TdQSdcs)onW3FAlWl>)J_@rs1;9SSQEoih;5FLn6`)sd9f@Y z6uM;6{?2)b7Hl8dY^+5efc*I205!lWFO;75tI3qJ`5nV8p!mE#*bFZSX{?wSH~@Vj z8#9y*FYs2v`HRqVUg9yyffNmcm57PxKZzbbzW?QraWJtZA%jo@uGS~*HU!Zi_I@ca zPqM=DI-eY57@l$I^j?rC1w2e-m5bvc{cM9MbbJSyvA&H?oCm8X4A`FCp#(#?QiHk3-4n^UnfX zFq>!zNz)nBCeTa=V7d=i@BQ85l>kpV@z-uYqS`OSx|gKDFe1Pve*Td1?%mAEYgDHd zbwe#sLojLd)T|Gui+Q#VH5+8QU_{r)Oj2rEhIeYq8^r@Z3a+&Ms-MbKZQQPW3AG0H zm2a5vD4xq+Kp(nvYoN`=@^BZ^AHW|`^I>3Z+qOY&bo*ccgtP^UP+GxWl>-Iv(^?un6f|-HqIKv0&t>iW@|14`)d6LTviu0<5vbQ5d zup-*T70G3L2_DQ?PO+RHVQjgSXbW5&HTg(imC8;xOqji28Z&-YG^`~xx|vhi>FCiH z4QhB|Sdv@H%cLe-9qy>Dyn=2y<2n9YeUwdl6ua=C?A+{4f^3MGAk5rNN-|DRN%O5} zO{>2rAV4^{)8Z>YDG@oj|JUMV=H_Bea{Q(SXvxIkwITP+*6lHOIA|bZMEM)^r8dR_ zLn3$aa3Md}Cqf3Gn2xUD1K;<~s%N*>C$3lx?C^tW1T5E_AB-CP8n39VD6V8rz!8_( zf;N_+x!d_|i*BqCbEhNYH0WF+S^@M(YY zPQo9bK484g9J1PX)OpVASUrHd2SecsP*4k;_hvyLe@T=DB383@t&S4ZK%&nG8R1FS zrbFnGH-!Yx5|LBuJ12%&)H)@))!z;*uSi)yHM2Fn9QaS4P*|LzAJ%~??Q6G>6zt!V(>0cwJRx^i&&HFQdu2cD;}~Nt zf9Sr>uD7dR2Vd-CIW?P1ECKTRzAb~hq$EZ&TLI-MTlJm+@h%wg0t7?=d(C=$WgG`F zuDdN#WhPUP6?>3(e{n*6PKRQ=hOn5%eoj!_6z*e-Qg|TlV~7{i6}))?AQBe^kOO$2 z3=z_~cngFZW5$kT9%xB|ZLfCeSgvrqWaPEA+dmh7?v~(HNPlsHIrjyK^ykwKrf(!$ zol}eqrb55P)*Ovp11nYn6hJlxJeb7YjA5h14d|K-j_&#u!-m1iwVWIH`}!j(fNha{ z#;j|H!=$uT?6&tmk~}!-&C!CO#yD4-LgkbHEC9&P6Y7C2}MquqO7ZJZWtEm}PO-4-%oLLFO zcTF!%Nvk4yHNFkt=k4R`+2=)cv@W*M%he@NQWdBA z`1!6MhHuu*jc+IKK7TWOS`glO*txkH);Yf(qYmKxd^~y2I{aW$QRlTO6B`xwT)LgD zvnK`t!hjZeb5G~v+4e_^x%MnJJu*!;{YbKaGh8XXDUYrMrp|{>$xV%w*0(jHAamFzml9$D4czN~)P7+s5nR z4i0W`cc)sswU}5pf&bI!eMn`jQ;S*idQ|+ilB9*Ub;v z?UCx>O|??El&`rFz!L;aIJ6!h=5f%4t|es}tM^QQYr^?Uz6UG>eo(xS|&{b5eiHL&I9y z!~AupL#@||bkq?Pq85o~9VJM|2%B;laf2_U_bqK7>+w^xOpoIDy)TJygRR+WZ=3&C z0+bMkw~-2H<}F2WhpeA&oB3xd4*e853#M~zt4xDDYGR1oi<`NuR3wxNo2cc^%Y2Pb zf5Lj^1#WP!ULIp!Fn822zqtuVO$o^An$WS!PON=4`d2*zXZNrhXGXK}%^GIh`4zPf zQ6+3EE-q36?GQH~#rP@HX*9gW7kelY0CERNF5)Cv1wDG|2*zf|)De3ojo4~|3u21BL(3Ga;(Ziu8V0NrxU ztpqzF)O0vuACA^*x!qhhtBYh-Y1y?$>jBj8kd-3>UL#L!USzZmM(qvi+>fZsXMz$r z=Yof@XpRc?B3yWAc;ziJcJq*(Us;5^!46ghCNPA*RDbtjUg7J#hj!QbXE&o}e!=gg zRQWqU3ue0GOu~mRwt?WW`@=`lpr1fsr@y?1W?|&bO#iq_Qo6gjqN0d%K5XigSWlFo zt(B+OO>C8^zwC}T=;=u^X`X({AQ>l3(fI;7L`Qd&8r=29H{%CXWwPbx|Ey+kurnnk zSfVwN8rwnuvo$4H3PONza{Z?g*>qz60uIddU-8a$@BbB#y)hvFX$!W|nvjAD!GW3o zD~^U2gM+Yf{?~~B;bcxqjpYPP+Tn2`b%rwarM zT!~-tzkjJ97>{7>4;{Q8*Amqi!KwkF+;0 z4aJ04!W3q0Z3u~lN#@U1F>Ro6z2B~Jpd3#^Ga`oUKnf)}8PALwMubEH1`;ZDD$G=5 zCrbP{w=_gjV2Q-XR$mQ3lNyLs3o#92DvK$AsrQ5;NEycQ1l!&37URQj$|Mn{BW(*W zBaM!&2+r7|XUi-`%YrIF21Aq!0b-)Y@I>gr4KC*n4Uw_H6ZTia*ie?}Jz0qfK9Lep%PD@>z@9%ltXn#nTl^l`e6-!?m^f58Er>C~BU%tG=xm91!R)8QkrcFR5$4wh&C*vySW>yFKRApXk z@0a8E_BDquoa_}lD~h#r$CJXXn;$&tTCwvG;$+~+lfoO6??_XTCw}q`G6Jn7ergyK zTZ_(>=h~MMR+~RoHtGbOX0H{+Z&!;s*+oKE{b0_rPIhHX+)f1^RNC86hWfK3IaQ z1;(4!VaZS-lxrR)bm5`>LoULYA*&_`W$IterHOT86b4T_l}8@3En}*YA!kjtC=w9D zVt)Q;#gW_=1P@-@V1A#@>-R(Dv@lc z8Fc{eA(m@|LLM;!r24PcSqv^8tNz?iLfP-QqbDcHop0s)=ai$Xi?L4sjD6Jjk(20o zxaH7x8vHgS?1Lr2Sai!hXP!d}mLVydTK?xrs;Kcb`z=2!><{u3n{T)$uymV18;!pEaX;`oW+$h#=>LgQPFA-6J;YDCLW69YNHT>4X8SKgMY2X9k`!gon(zyo zp+PvglayrsF}CUq29%SV^S=x}Y4v~rVdDO8Yv=B^e{B6PPZ2oT|G%J&h3j7lhX$Y_ zXOG7T*F9S|$2b>BLapqdAd>Z`3`8hfWRnPTP!|mxj@N<1|6fABy%p5k9k0Rx_s9T| zy!$wfKx|rLSq0@Ov6!riUUPI1MQOB}Yype+$m3ZBTcLWnkC`&obEP;0<2+Xd>M(Vw zAeNrpsvQ}CBTm^XJJ|dv>mqW1mUjCrBcC__5p0T{jGc3&LQUDzAiL6#3 z3@^oP2aYjxEGx6w9=kOZ^J0TafkZmy?_fHhEEJMrje%KL#9Cx$I^Zsa@PSlPa0tXP zZ72-vAf=cgNvMPxc^Ok-jj^y6kbdDlxa?5H!5gG!JrYPc1FU|{-%tp@;57jT;^&z{ zOacBDAwCVE#jq~vLQU7dA*Ul1r}8x$G|@w?MN;We=IOwua65`D5>B)nykJSYgWYF1blxJQ^zH%8s0WDsx!MoOmRR?}8F%?W22TO)4v z>}T9NuclQi-3RmR+y(NkX52SLKO#(>z5bo_qNKERj)eLBXEevCH|1JZ`0ZqR`sp8U z({@A-FBY3U+q$<)7{3ACA0LMtvR@s#djrdM-Yp-&MN$W+lP6cti%+LnQMR(nofZ16 zfKS)&!6#cULW*W|nMwsBc=80d-k18eva#@l z3^a98a5A^>1Q@YtVmu@lJrvBePw-$xVnwW@jqg`+qOmZ|B$7HVl-`J&(LDO&j3Hcn8vYCblpcTAWv=5$IRySbGm6P@IX+zajY+s8! zD?7FkOOYG;Lk~c4f9*qZTwu@cpIJj}FH;ol{_CC7`eEmJYAW~fKW@BQgFHNg;pB*G zW|CJr6Ap&cwMiP(8BtS)){}Q`%pv4Db<()X1%WU&JR=F_DUM>uX_w9^!emUpMuBJ) zCwEW6qXKC^3rP`_@Ch6}JU!Nt!`f;qNUx!<-$<{K)T{w+tHkm&b-RfKhds&kb{5tW z`!EiB}Ex`nTO$XzYWIKIaJrz+NEXE)8W<_mAH9n<9*Iy=9lm48U}hMQj* z-qAx~kAI}V&DqBZ_uzKG3ewSMRBm)qX%V>SM=pYET_|FRvnB(@Gt#^D46k2p=N*CB zF|U+kW!XXK4!xD|0IiyqHm!+NXCH6(SiIfB=^g*oxliEZjL-D{q%ao?^FOkpHPw%i zLH+Yn|Kr=9&3QolPtk3a8Ulpvzla6-R}F6%qXyJy$vJOwAa!4;-%8G?Kw(5FD3s=q zwQQQP)Cwez6Hf~@q>HkqUP?OQy{x(mNw--1MgqPwns3f^zjM2LMqY@TAI3J(PXo>M zo%VPh{i)l96s+S5nhKwy8U<>qTHiaQ%$585ycx~v!qHi`!!}tgJkme^0#VV^tBH+NC~6BjoL93@?5h?X zpbAwBM#*m@{k>p2s&2;1Pc_+YG15yH%D|{TX++gLt-d?)eo&cRHzDTxWvb-YOAGYi zbPdq^wbW+c!`DxD16%OW*yY;;H%n9lGytH5QYRuHqyna)$kG0N%cMUK`jmr!a8C{Bx2Q@> zdy}vMzh1OCdCMY;C?gg{%cepd$H&Te8=lkclIEt?|HApRJe>r#(ISw&d1X?_KXe=)^)e_-Lr3jf{ z`rFT%GA%KQ&$pFq5A>+e6vC$X+Y*p0OM4l%dj%)&8@B7gLMuM$215Nug(auY!^dBc zID^^s8T0tuu3_bb&<{1X?&29riJFVGII&x?BSi*Mq1in8bxMV+iD~-o^;xJeyZE?{ zl1!IH6E476z7v^{)7Y6*FZTPn#^pp^{KxOF=15Ewec$TnX75|2F9EgOH#8tIjR0|X z+u#U39ht%khuTuI>798m=9L%j)kzG!z2j;z;DcN;=Nm5BA8`o?-nNAHQ2v_ zGsN1(%Pd~AqXu(sCEVPWER90nU={YU8!5%T0rUAl5-O8YZ;Ni*um^N0>|hQY-RzL# z*e{K_y!VUn`MAdsMa30(+?Ihhxu&33o^r}z49Q|s#n?1X_6u!D4=KIphHYiB1utB@YARW5e68itkIBEElnzhqCq16p!z! zoO9{QtN&*7c^Zgi&;v*=i5K84#xul1zi!u%b}blgodycin8^vO)FT7Jco-&*r=PYt zKAyg258sabcr<;j%Q705D7L97_CVRZftxtQAHYDI3kkE<-~js8JI40vjW5l;KQy6< zrbUO<%bS8*-<1( zLw@HV5cmBJlC=l%b2s+qfb-a*^cP%7D!MY=WIuRufJ&eU&IgZ~c;uJvgOnD&0V^>I zMzRpS^^*_DoCh4b)PM1T6bqP3|AZ3*6B1$Kqh?9O%m_oV;pLZw<%mP%_z>j_;7W4_ zLcan92s0Nf#*zB#PzUS!y3@2dt@qw_!l5C3*Z&2wjU8=6L@QepNAEu6(EarSxe*O= zzqo4;WBBk9`|bU(+*QU0yH5xv#v!WYJ6<&aYhw^T@Ph+{jNJVBf8jXCe^U=2Y;6CN z(wk2IDDAtdev6!~28H47!E#m}b3oy!qR)0Fk_oA5W;4AeT_~gTpPwibTkg zY{B5}=;k=Xkc@fw@O!K_^;fE{DIM>(=hqHsS0fzDAZrmGc!He0cOHM!C5nCTBo_LN znR`~49cu-c>E7*woZCDv@6zXs;|*XK7ap7GJUz(flbkh_$C#BAKSkO6aPkrr`+G2W zOen$V56^@^-0oB8A^vKBKNFYlkfzj!u0NQby9q`uQy)6o zjei&_5k2*#oqlTG-=AbWyR)Vldr$BLl6O}-NG1;&KUuN_yv9x5eSc}ss5JrbZqd1+ zSO9;75g8Z|GBH=PvpqgSFQLRroY8q+oJ9j!S>EcXxk1X&8ncd;woav!`saz#LO&B^ zoKj!lJ>kygckP))iHcTL%>t2(!*$AC!Vj-rM5=Q{yHq+x7PDblG-d6gR2wun@~d0& zx7dTK;n_9TX9K4KXuwT@7zqK9@8-+B_l720$^rHl>J^)OzwY~fQa~w-_D_h_em*{c z%|sHS_C5dB0T9HCwm;Az?ByZ2nIuMxeVRlig{dDe%o(_Y?oJB84!na4GP782n_3wA zjT`}J2pP^W28+hAZT96nds(_TBAuCr&=#xXGqrDw?oQAR@XQ+#$(i_^6>_vsg?f&E-4~Pp-<&L$8tHm_pgE>W9dh*3VXN-)KiPzS zyz+JvzqW!)R#Y6f;Zp&f{g*WJb*8e22fw%1{>n)qM%`~nTlq`{mNkh6`fAuDi_%U{ zf*a#2WxWJ2hkmFowO%CEyz`uf!aej*9O~G4pc0B8(cB$J<0wU}&1HR!bx@4884~}V zGWY;J^B>y0VU#+9Q;Ui~VL1a!%=udkWBvUyg_tJEtUX3pp$Y}iCnRV)JJbyH1?^Fr zqf$*AAs()<>)UqRkxrTrCOj?GJ5nGXAqts0LmJ)W6pa2IyMBGK(nwZ+TODkcO^-k$ z|0}M^O{Iz^Fpc;4Pw&&u@lq1K6O6jaE&tNa%L{*jRd!6U%eSEeikDc%BVrk4{~1V! zw#L1q2me?K+2|m^p!AolRw*YD^t0hJ2E?ZOlv|dP5S5(kpM#;S8%B9qK39%wA8|=} z{4jZ{{FB}wA>zcSFXbuVFY7>G5e6`RY8yCQ*sabP7gAT(mkJ-eTvVUz(vESv5$>HH zU~`9W7ox;CA!5nx=GIQ&=1deYNh{Akx#Vk{eWPgLqGX-`X(Tu*)>d39_n?X>HFk_g z5zdPZmF=yBq7AHh`EabFm106o^0ly#a9k<;@G$0q7JO2N9G%3t4wj>K4&J{jO`vIl z)4<)ffnVRk$AO0&&Pp322^Ja>qnqqM-e!M4twPYY)zql8Zes=mu@uU3E%1L+hi>#Jt@*^pZlu!T+xj0tsLFNvi0_TX;LtovDGbnPQ{EC zi>OA2?{q_0z~5CPDPcLcG*ARwVcQm7uxSQ_6ncVygOrJuOrTF`-S^N)&fPrw_*f@= zPGEnP^a48y|IDAi&<0x9%y8OzHJF>!`QTL$O@Wg}m;TC;ZT4ePiYkIjY(U>(GRrX@ z%i9tUIv#Mhz$_{J5M*ndKvMxQpb4Uo2IU6ZQ@|}yTJRt{y!9?6lK(6s9-HP3I0%SI zDCAt&45=LaVT)g)H-EwV3GCzQXAzptpVtNzeYW`LtBt4l&*!igu1H zCMBUj(-BUdF{TPv7GJVGJ<5M~4X<3C>@IY zDm7Q5rp|Gd1K?%&$EndzvV+*uua|W!a?UBML?_;!dbRlckY+ZmfIiD_drIxi_36{m zo~ijL<(Q_kf*=(%aeARBdxaC;R^Q`j8Va`;a65Q~$k^o;%R)XlpwGwfODx)Cmv=>% zS1O0sZoR6+E;g5D`?lZdO#4$&!-aQnEGq}mDvJNrn|70+#&O;Rk@IG60&jr-?^EH|V{Z~~E|D-h9{3m?d4bdDB_%X;QqGyAqXWj5H z;3pNtZo@MiRaeJKBqQn2K@;*po8InU7~<`M?XB0^RLR~VKitH#)niM7WhS;<@zkJ0 zsZ~fLjc;UctX#@m;gnkClY@CNr%~+3n3DEWg6cA=>iXi46?Ua6Hf@lps(T{Fti2PQ zrMbNP$f3P+w91wPwRdDYZ%2qGKM>kVh^bYlTsjZD{HhvD4xHakhR-X>Pi8V&KpPRof+TIzwA>i)o<+2v8yy!;iJVYO5U9T>B#~t~ z4@c29u<-Q!W^$%GP$Is6FxA7MBM|fwJ-HPf9#An4kYNC62re|z2=uTC{9MnVe7pbs zGPL`WlP>L6zWx65J3SA_t4&x@_*P*aV%;*CbPw8{reg5dKAohrOP6jm;6}Yl>Igab zT#xfQiF7lA5y*bUikB|Tnw{Pk!T-GlhBGA*y3S;-x}<*D`k)Ky21dWavjs+umT^Uh z&Qy|!OcT@7?F&m!PrXH^;X=Bh^6y}0yg;~Cd)+Dc<{4D}T^V-Du8Wv8zNSd$Nq z`--q|#y8SS-d1FZGesXsz%gaNA{PgqZG|1&Zq=jr!T1$=-eX66OkLf-MjB?JFr^SH zJ}9JQgk`dpKz~*5-}*CxJ-$OX2~QNbghE*E$n)xBojB#+wt$@9h*M%eoz+a+Rdc`J zAMqIJI=HNlSBeZ7^dw0xHx-0KFwoj-plNPs%TMipGST6Y*}FvnDh_m7SIEwUcDoIA zK2*+wqAGhFz|67Q93uim*)5g!Wwu!=39e0<*|Qi;M&|LVPiG_#!>5PKtwCL0JsrC# zCj2nLi8gN<=q**3->trP^{vh%-$Nt=J;rxF9$P2xU&T?pVGAXrnw=xJ-NjXp8Ezd1 zGlg5}7G|WEh^&(U=ALj{=^gFb_9yZyE{Oqnu|A#(|HCnJbxa{ya|alcN?DS1Li&i6aZ^qeSZnIdEW9U;26~4!T%v5 zbDOkv*{ne|&q=`SVf6f{{rJ^6##QZ$%=x2>M~dETzr2Mn|EX@-r18)Jd9{DB&%~zz z$q?Xy-=7D4E<||PCru-+Idrnutzx@dG_#qc7suR_jb*dlUnkVqDy44k3L13yB=yn! z#yuVm1gQE;N&^)K5i2?LZ;nWrC8b*SyOjZZ>Aq*LO9KB!5!1hD0Z!%%7_D}bs{&yB z8B_tdnzFGt%C12?`phAIqI5)o-g6jg#r-#dfwD^E5XV1#{?flKoP%wH&Qii=$kUpje@ z2*dC|6W?y<6|<*%HYfIX>E}Lkh;7gK;Av$I`oIq%r2V4M|7COKO4>t11L0u#x3^L! zG2KA{KGbiaW<;4V{#|5Ul+SEnwftpgRMkz!&4fblXf=)?Hu}_ilSqWGTtJ0<&`jxP z*nnt{*%_BCU$%NftYIUsQ4ghY`+WR*@p$wooB@Q@G9}E^4S!3w@EQ+}B#PW33@MH- z;qwQEKheEyKNwet5l)#f$`N{Wt-?0)f`nC#~oe0{LalCkJOA{c+hGLG^B zAgWckcOVHMA|6hh;8hqtKLlBKwiquZptv~oOl80zKQJP2?+bxSIVZ;rAePbexO9KvG(9yOLdAsoanbtz4KD4Gx_Q|Zv7*Bk9T;@z|TC4@~7M* zo&2Ipug?}a0mZi?be$C;L~knzMJhrUpoMsQ!-0ERU+AovGsRTmU#)iMrB`EvTy}Bu z`a4tQ)n2${{Gw^Kfb9q#;$(1L&SH!g59X*+a;7cqbjHpLUs~q7y7r*+dhL(D9YVN; z+{{@>D1v-@NnbzxZ)Gu|gIJ?zVxxJGtqqC5>MC#`O8Z66jLmfXY^5OWKiOAZ0IUmT zKu%{DPhPIiFH0NX8aC5F$fo7-(OJ6mL*MLB7+i3L<8oD^lzce4++A=^O2XJyMr-9P zXybBrrTmgoVR7_V1=(;UG$}LPH6h@bVnJMaPqGi7J%=c*6B08 z?JgY^WO>Zxd|r3b9MXAekTkIZK-TcIh3jJ6Urm8`zxS}smpMkRlHg{_-W|JF;*983`$br`f-mRW6{qS-$)iXarC!1K!F6sJ8yLT!G zsgQs#H0!3k1CRg|gnot1nvYX;hNv4tEzeCmUsuQK5xuUSp``GwCC>azK+*rh);C61 z)^uBU)Uj>bw%xI9r(>ss9d&HmM#omiwyloUv6C;)`@G}c@5lXfPK_E>Ygg4-XRp0$ z&bjIYt&*3nh2qFS1<(v$bN~4h5(YiiXd(Jzn@9G3U5_RS8Ljf}>$y=kZ%X1|XdsR% zO;R1!o6^1YSm#S#!wO<@45UCB&od~I}@v1 zt{6!}F$k?N_O`A3EW_FJQ``K#bF{B31Tf4iJphv_L-CvSEX1Gw;-E(6kknEnabAd+ z1zYrX{CV3DC4?-OgZSVXA*{C^^Pz3L$Xc85Q4PpTPjf7_39yQ|Y>V=?XWdvQ!3i^4 z&sf{J-*^+#&Q%T%PSv1i7VLCe`|IvK!o%B5qxq{My~HnNIPVJpa``!*s=`PIKm`u< zuQG|k4?K{q`)-5Z-5nAKT6`}r`vdMf`ri}i7`C?S?RJryr{DLdKZolzTN%JT%r79m~uC6n{k2v%2F?-~GC@Y+L=sHOECk>?~tNgTdpcJqe23!W@6{(7p2oANGL7iQUThk5up zXd5T_Dtwwr?iRwKfV^{~Pe)ry zTryDg4&pG}>X{HgNRnfMWQW=IlUp~?{9HCpm8B-2K%kjwu`E>ddhk>xF`@Lrs0AzM69$~P(izeSJ< zx1`HD5{isxOSbdX8)W-5Q_5)RO{ViAM_QDs;myDdECXYo1lNzn%2Q_^^8vfy*yQQ2 z=Hdh519s{yHCPhH%|TKIe1=nY%zM`O;N3<`s#)aT8sM20cI*4j!U;)RJn(AultR9~ zSC>Gv-5~_QRX4gKsiO9(V#X;^!Gll>Oj2{fYtx z!m#HL*ZlAWI#NokX!MWhSH6kErv|Esr`{0qIWejip5$-c(M1tLbvyxtoDolx8<+;= z#$7MRA;9yFsrrY0cbXe%h2cXw5^4V6-aW${5UQzenlxVHZjr!6X@l8zae1ogng5a+|@OXS+^t&3731NH0mZ{qQkHVzXzTRa$` zzOJ2L`sZ$#xCOplS7(bNEfPFWDYtZ9T;_A!ANr3qGEa1jd-@QMyFcdo-oH+}R{IMM z-`iqkT=ry!g_}Jx8XQ0DP;Ujr6=sZ=~{{wMr-UM->=CC zQHe&P3!73V5`BGE+NJ+c`u6I@k~ij!NCLNmw6&qqq9#>;3c7BGxqT>atU>d7t>??>$XIMp?=L*9Fp2;8B*^Y8 zapL@oOX&&{dFNp5dlc!NB2MuXHwJHWwT+qv$D^T_XX~!EZ*zHr8kGtr%p$r8Z7ycW zQo_Iq1+IgZt;Nqyv$iIYmbn`zU>D;HCto3JJbX=SN%z(~hFY@|W<-d$y1~YQ8h1Oc zlw|Xh&Djs5JA`BoUlUcE<=vxWnp_szQ^_Z&ESlz{x-#gdI2@Gt*kbwf#uny!iC_D7 zQwU%0BIfcDP961SBUYS3IBW&Gb=En3x~=S;&t3}Kg&cpTMV0hHc`1Yi03=;f&T94CNK== zfY4y1?c_e=++JkFEeyHUpPGKMaPCn1!B5Bh9u1u-*$RE~JrdWn z(N~^B`#mI@_%PuLi`vB5@b@UN>ipwK7j9hq=&^_B^B;m`D78$;nEG-*L|Np;_$8f zAVi9Ir%58&t^9t08fY7Vet_A{qul);;f0y&zZ|Ilm9aB3b0>h{P=9J8<-X%dB6VI? z9~n%qsV%7K!S{yrE6IbHyu|iD5+#y@N1Fa&r}_}6mO%QW6_M^CH*Lhu&Tqe2@ymCP z&^To_JRz9?lXes4g{r^Bw&jE_I#p7)H5B!iGS5(Bik$~XndNt03;NYPf+Yz10n1%q zj87<5$wma!R@A}F5DpN`V}V4sQZ7Xf{fSIHMCj>g z^hjBGo5Va8YtXaX7>17Eu&kgk1ly^Uq`AE$$V>r8yw^JfJ{o{w;(bjsC`s;Ios#<- zNMdddyeIhd$W(#YC@?j-nj4^a;~3+^WnL=aNLe){3QSW3APvQmT{S@9gAX(vC@qZW zB?E)oOUiy$UszQK!^)e-W5%A@|VWohaajh?5el$qWAH!4D^%VK1J)buNj+b-GT%nCsTb0)a!VNoI?tax|m@b z?{_?i1l04Rp9d|)jU`m$atlsa2My)(ABbS* zj90C=Fpkj~g;_0OZ@QclQFiGDZP4Q;k!ThwC&1&0Vx_})qtV;A!|KqIUPl0X`Dm*R zWil8u-3PrDOa_hn}vnkg}{qh#_DQkwtE!OtPSxx}t3s_TuDmeWuaJI$3IwZPB+j z9zJd@*%<`vorP1Cmu)}!u?`NKF^sGn|J|k2NbYzx0h}K8Z}leeJ#%Cf7~b*ZD0hUf z?FAePx%j7|C~_umPIoS+SB03Yi>N!hpw+jWjiel#`QQ~YJFv4~oqKnLlN}>PEKlk( zRz?=s#|9nHGZl~Z?)|35S&GQb)e_IN*pMJcoF0LIiA;{V^0cnVQ)X5RvM3JOp-4S&xjCRbWo{lNb z(st!zb9fR3RF2unDR$1p!%I)e{F>M;JQYzy8m0}IL5|Njx|{5XC?W6GX#%oW_w--` z;QNCbLT@cPB3oG4{7sPwSJ6(z(X8^g6Njs3KpIVWqkIy6WK_rnb5^8dz?*Mml(Xs= z!{rgg)>uEKbxM^Y#qwo{@=viNn?K5hLMPuGGvO~Kz_XI` zr+F}s*QUW=Fuqh3etW(xlERMVQzwKR`@zKN_o;SWv8M8wYc7f(JWFGuGtUF08 zJuk$tRcR$6?EDL;H>IpQ)$hQS$G9`deyoC~F6_1+buZ1#n677uCTEPhjz4tf$La;Er z-Gey{O>XFKR7ciFIoyX6FHJS&H!YH&@)#EhXH@;g3zBZC##?Q(^de`k5op%bH|D0Z z?^qtA!7#jj^9#M7feX6FI4-z-9yd4SCY$$1H;uj{U+hD!PWfYXlmVx}jh*d8!v}Fk zo@@-{VEfTOkCXi+!n$NlK=3+ZN|^0?D;CcVxP9W_X6W+}KoW(#jSK-1Z}jk*Ww-8P^Zvbu>hUCfqn?2>u46D$nnKF# z=kLVDDv7SatgH=sweNU4YJMuG{6o$LvHw6ew%%L`KVbK`jcn6fun-ibmZdgcJE(s+ znzW3Q#3Nc(H_IOrb=%(6?&)c$=?`sKhpU$pCj$YlFd{Q-GDANqaHeDE9%;QP8VdW} zVTW%NYCbRwdG{eHxGH{PVQ=m(ZQAt)OK4uCgjKMoOFRy?NNDD1GG5m&V5vBU3=>AZ z<^B;7Dhz=D0XB@ls4_@QkPb9e1fR!*yHsq?hmBUr3hgnVb(=<-;Fi5vSOqsQ9q&Ce z`Pww5IeaV_&b_$?N&5yu*CM_pvIW=^jn=oJ?_EM;F;#_x^q1+)JSj@@s}mx zgo73c+Ah(JX(N`t5hCBcpYeuqnP`q0SIu5;EakMT4BqQZQEEsIh%T$}b{~H5U0tDv zxUrr|mdV=>vrb5g3!?;zA9-l!#)wiFU*YGQ+}UI40{$S80TD#4)BIG}`oh0;@tNkn zVExbn6RoxT?&n!qVdwX=k9iHTMibNP%N#MzGQux;S}?<9>=II|8)Hs!&7+L%a}IK*rYAF}~d#qMmqT>RMGzZ90hLB`^Qk5J4`R4eN^k(Orwe`s!uSs zMm3DuB2I#ijq09B@?Le#Ti@TwyPmav^O=g!n_%_JqJd>e0f#Y*|P_O zG0;798Op&DSpuwFi`lj9@DDKDO~{tY58DrUKn>L3O_vMR>V;b1afuE97c{8Je?mTL z$^r}s`ltN<-<*M++8Z%*Tu8vBL7b$dWK_4HI+QBXIz9?ivH%eXV$p<1k*&K``;Zgx z7IkjUxlwF)9^_S;(1PuCzsm|31eZZFh84rEBk=L$6`LxC!wBx z-2j8|>m~14Gj?U|Lh&@(CK(;o`!(xMMqynKXvP1Fv?X1rwJaa zfCQ#e>Q9=YzvTjtKH|}| zA#s6b)8XdrzRY?wKX_U3$7CHl%7{}L3!%p9R`TUec?k8{ejl)B?9LJ%HX^?^^o8yH z(r01cEswFhN#{=Wkue(?@hS7hwPq_Ti7p9S1F2>>*4T1!lSV$RJ5fG>RzH^1t z@UwyH36IQ-rr;WYIm>?sYSH4Pq_s~G;Z&^HlFLzRM&ufHXle_m6N@yNu^sROdcFc$ z1~e9Yz3=*u@wS(UtK`2$EBkJp>Hm7bN)~TH)8pm%;?K9ZE0SQ86k#c|(5bQx#KxiR z$qh3Lbgk-47E|KK(~MgRFq;k&QaDPZC1+BS`ol* z(JF@Jg)mqtuw~k1&e+(n{vlnq28*L*UqHeE{dw@Vy*8iQt!hH(c22@H6~eD40NNgq zYImdZH80d+Ss!nD+Kjn1i_s2a2FaO>-MJh(nQ(#i&svzA1ISEk&v%-^??51+g!Z&v zif9Ms>YriC0fT)VB8lrhQ?n_~7q`~pcyw2v*E9$4Hb2pwm79Kjqe~O{K%L+w)mk5J zNtxXz)prtJAUn@?lr!wvn7UuFd#K`T&LX8YJ!JbsN4RZz1=Yo1zBu<_TE2&}XqJ8t z=BN_5CFLrAXo4++cIWa0btVEBnaK()IrjLSiU|@}(#(OaaBqN*ZH0`-+Eel(w8q9Z z^|(C;(b+Y$bYsn-J?h;~Rgvae?^9!94-U%NofP$UMkt zFdLTq>%ts2CdOcbw`lZ6ckG7t7^QlkdcY&7H5nU|J4vL*&XY5W6{s3XNVf~~k12(lAQ>>Kg`{_GmpXIplrf9JG?GBgLylW$J96tCGqz8^8(Sq;rNS}T z7(xcQI83Pam6vGO19-b9av(!8F^^?T{=)utAop;3(Q^s;#wulJj-S3x#`bix|6Bm( zQ3OqvPOhyD%GZkH-sM{|0=4y?sn}a3osEGQg-XnwXL$84(0Y{VE&#`KDF{$Y`Ju?r zlLelNeK&5DZm1E1N`jLZS-RczR5pc-EbcQ1S$XI=l($#Bfyf$UkagWy`O6CuQp5*Kdg)KnOPb3tUh;frYHTRp!f4%JehOkzr6~6a#gx= zEPgYW^6`F2hbmZI@ux{GIJJ5&a1nF_s3eEuzfY_|I&RMi_fh%Hh&eoKEjD zh=ORxf_8F`1Eo@8&U!cxEDr6*RB31-Q5EV^g1M*5YLd(LF;e7kaV`+=xchuyX$KlV zDWQ^(O2a#nh$^21(}06Mk{o(ctE5K;ik#$~L(}{;)&73)7)ti_O;MU5EEpQ?a1~Y2 z6@((SOF8xmobC)U5)^YazPO!x0uts%vRM@MVl*lecPND-gF_S$D#HbuM)jEJ3@tIJ z%*(jFo%@MV3ixk@uk<#VKZ2^ZbZ(hTI@9aQvXbP!2@`eoK?9sy1l+S$^RTxYE^;up z#cRiS-`^GNLJ~5Pesv~J-z6Wk6??4}P4<9yLQZ^MGds%x8#muIo|;6HSI>0ACt-QP z_(y_Ff3K#uJC@PqPP}#is$}je^!HG+RRzkqpk3VR+2ceNp*6YIg!uj7y7lK{Em6-O zKW2M5S}Wa~ttpEeM>UGW1g<<6sGm{Q!=Ly?c-DzO9P&4Lh?(>8RoBajx5FQb_Saz^ z>%zKhIl#{S+LI}4C+sJ8gIPMtMw|@uOQNrHoJ(p^7-snA5aLW>LJJqLvmkGi2s3cT zZm!APpVuqnxN4D_hDHM?_;sHTSA9H-*d$Rk` z1=>6~>GPi} zQy4HKmNw0R3P%a!Lff&3)RE`MGj1F+!`8bg+I~OV^fav`n4xgvC_t^QW=YLe5fUQaDLVn9Iu}BnTxu3v z?Q?oRxz(1i_Bcqq?)|cfCEj32+&IRR@51Y>Ht}>nswVvto(4H;T9|eEB*zxVka-L$ z=>jVJ_sJ5CJf^RP`q2kqD>!iS4}6iL1_pwN$Vl3RFX(I$^+QmzDTVpcArhg4Ai-ik*&=9A4P=~f+Qmaw{3 z=6Ct5_~CDsW~AW3K}B#pG*AsyB-^V>U)zRy-u&Wn;s+ zd*0pja3J+KKncCglu>>;`s%Wk&T5MCV@{MurY{$dHr^phFYQVZNJ;GQl|%f|5|F)i z#A5AE-%s$?PRv>Y!Xtk0MzMr92_N4@`}t^QGh~Cme3iuF8YCgeFBovLhl}~(c*)H39|gbzb+5j-ITFV2}qh4Hgt%{3QUTjNB+k>HtO*~JNs zheNp5=c*!EHt63d)Z;#Bktyly^Z`3(A)81&lJIn7&q#g*091q@T~smd36O=wgIJkbt&XOw#%%9=WV+iuG#aoH zRgukp!ct@1VN6)YRz7vJ>MGyWt_M-i?3a=`zW(B=a!Lx0?d|t9Hg$a>oxS5?v^yyA z6h3~+x-(yX5iAa)2p4WSQQrFCw(l|hPAr31nIPozMi)s4-r_W z*jnoXLAkv3%g~IkQKT8Bcl5{>eQa{Z(Dv;dqOS|oX*r-xbSBwwYa0wdzWh6CEP8{E zb<&1jO_R5Z&@V<*P>hMWOEla%vVs%{qbpxXoyL0_;Ln2rmZo9&74 z}QWF0rfu^a@eIp_m~5HCe)7zCra6&IAcIpxRRXM=}X(34RRrhkD> zj{nWT$IAR4MkjEtt>wHXf$~YJNgdj7f_64gW6(IhMW%Hm`$SY`!Ni2oIMJvRVq;#P z-+p{i21f)LtxZxr2Mg`VEwN~O$q@KD&&<*zayvdv&qO#gD?1uGG+a2qza8y{7H%c& z-WM64+ebxtWs`=UkNML?o!7k3bdmSg>ws(n%sKfYt`!JvM;kZc33M00;*-HZ+dzkn zzDPef5)W&F_GqG$_}OlvY-zkb0|gr8msFgmneURT79b5Ffef1%Zmt$CO)peQl+3YB z`}Z4U3;`?%dMBtTq=;x=R>98pnJ^YQmseo$AT433{|<;KJVkPkFfopbP+NAM(u^YF zLHKk=4=q5Bc8A4=Qfu}N#+vK%Tar{HZ@%EKz=>aQ2oBTFS>-#D+oH%GTCm_np__RV zX_$gEr|=&_XLw@8!69mJ4JF<x<48~?nAF59@wkQ*sSRM2 ztD`Mrtt!8OAE7^5MoNmZR-so$FKP4st+m85@&abG*=EnM?3mh3SB)s(T&IhRac8{P zq%erDq+y8ksi@)tyBf|0F)Y$N$$ z+c5uyjNJ&EDRTixN<=5{_G?C!Vn?ruz-;<(f%ik#@0lpUq*6H^Va3=mP!YGCxjQTbOfypeD zxlyv*Ia)TY96Z>zUu##7D@XCzI%S6*-%Z)lvN!kNK<{P#Twd4F6`N?X^Aq^e8)PSY zYW-fFpV^a4a2&}Nw0MP5Z>THg4OpqFECvUh-|cvgb1=wxA%_A<2e&W{WSTU$UhLf= z8QOBvbYDU%95% z{2fdjCur%PxgLnIooYyiSW|6XAzhN{?wAm_IGp&s$Wg*#_DP*bh?g}#D@P6E)rJK7vP@XvXdJgfe}viK>AojsZ34?uPh&a1{>^Ky?3y46f+g>sAXye0 zHXTma+I$RbW}Pc3e0%9-Q0$EyR?@xk=9sf2YCpUQHyS}x1zs?ISRs2C(Q)n9u!#R?awS38w$gFMj@FgEvG zQDf89k|cEthNcSfZOT>2B;8&I#H2t=cp=;=}5^=V5Pc+!^Ahps@v@VNl zbU!w}S@6ZfBEKU@^v;d&KD}}Smxr>~Z+a949a4L1zb=adW!$PQ&EeaRki~UvB8oI1vE2?mGEq%6!bD^6!h;FePG+hZ`KkgGrZ>z%z zLg|uRjEeM((7d=M3U2z(&nrQk|9_$RuRAD5_@*>i=8Q+>4)To(}H~$ zoaMDg%_8$!HDn277BdQz0NCbH(W-t^=-)0fXZ_K9_fZ68AryfcYze}+o(U@mI5i&B zIzenu-s8vLMUIE7S`h+D(DCsxA<|bu&@|C@rXF#WKDyuIVOL$L8U60#l4i~D|C0IP zOTT@61Sg-_mM=p>0xPuU83PR#LXa#R#!64R4DN9|Cru(z0J=ExhC&71fD}?ZkSJYwlRL|BFO4jK2Q-`iDhTHoinU zD;}#!#8trn9A#`(Jv+MC%4$|a1D^&xSqQSv1qiPS)n5QKHJ3++M%A}3r{$aCO%b(; zv-4JkxP*UH*Gec*p;8pR_^S%L{nV2}!8~q|Rc*?zMpZ0H93~sFB(qeJw%kr5mp6dSQ(1P&(bZOnuYuVT32TC9iE!5*f%O%*F-sry9#>bU3hwvG~1>B zk|BAPcT^Za2-gC5I%p~9Xegfqx(6~eC@n6xE(F%57(@255{w-LM~~mA2**>)pdOU# znhTf~5UNyYWC)emuA#elPgR;AUx>ZNFZI#;dgP>s_J+&CPd1`i>V^zbo-CKQ@DU{- zQ2BkeF`5Zu$?hMAenf^HZFY~8BtpDJbpN@0oZ(J5RuWX#KOV84#gwNYUxT;2+uNxJ3pdV01%3t( z^*QzoJv65bxNzXb4pJVq?70uPaJBBb7rbD98sEUIcY=C1jn;DHtu)U-&*`z@cpbGU z@OJBy(chGf2uLxYc+Cb53?4b(b(pi*&H;;T9sL8o5lPEFgNvllk@|BZbpj7tYCvWh8~I$UAa4_KDJ6y1 zD`95AoSPn{7(eSBHn&WXO{N$&A2>dywxK6m=yhk#3XAc2z9hK1vlv;Mas_J^e7Jz^ z&Q5wF7t2W6k~qRPh`ae&L1~|Z=ex(x{UI^rhgd9*Z~+A+`c6x7UYa`bXp4`4(@>F@ zcjbgkA+X>NvXd+9H$Cm~3rwv3a;)%57b3bEjYs*frtgZ_Kmy*mJK=*bAMh%Ww>#5N z0vcS{9hCb^xb?~};_LeW7=>6#=Q?O8r$S)=qU`pyFB?r01-RUHth+ZjXTeZj{V+L! zE4>OM=x5_D|g2J>t5F ziXD$Hp>WmJuu@W#<%jy$DS!jREB-f=cUBVGDUce^QCLdTr`Y%Ien}To*<;3w;KD+M zoYyh&60O8aeo&Pz7J8bFBA>`!7Z5UY-6}WL*zZoiuU2}gK z(HP+_Xb0ezH*nJ^=~mm*i~VZqOtOi?vsLp^ESD|*3%%A{hSFNmsSC88<+Y`WwMi;= zFrjkb8Sfu-)-FF;xvOThZ31^qWs2{J>_+F|2VG`e51i@sfhD?5(R3%lfEavR!^nqq z`*)3(J-b`l7ghJ#dp`O~nQGPJqIAY2vofKIZ#}BV6Q@mW0ix(HEp^C!O{eMNGsR~U zC-7=d+z(C_G{u6}*HZSFr*ZiHckgwwG4o-nPK-I|$AM!_fl(3yvG0#50@nEOCH3*W z%s1QD9My!|=3cLdJ8GV+G9QGp4bCP-z|%t4d-n3_&NU#DpR)Sf~`5bhf-=-2DO27?M54gS$ZuV6*!{&!8rb@|uzT zEl`O{_!^(b2QZaso+))JXr6VV!kiUSP|8A}>N*U(1;CE9Y#ILadx5}=b0icaTda$V zi~tfH1&th|TXI(A2j7As!a*U}3IpJqNc3%tsr(d)RO1+65+#C^a-p2!q0D-A{XijX zp{p2s^LngT*uAx4xiBokQVku6MdUPfSLxBPtVdEkTw0K;sv__>BSA^Mghc$~oCDEx z6N3pM2JvSWuaAV$u8isCr`uAss}&8$;Q>LI$N>{(n8+d_Y>2^CoCr`y7wzf*nV|YU zDkh~KW3*JR#=+fT>F;zfvhDhLztLzg3Vx%Zetsl^CMxNSR@DlaD6hpKr)U?cR>+`3 zC`U1P*&RmcQlLqd3ZlZ0;oU^;%_5K@FnkuTBh787OqiE<{un!o`E&I$P@+iz$PuhC zg`orOl2poGE;V0)R<&@--{>)6RcFP7HEwwgJcf8~F<+}yhvTWdd$ z*qXE#_Hw@6d-4{xoibn)v&h!;5KQ7HYxca<5m|PK=8M6z}F3GVjC?79g#|AbIjs_+) z3IneX|ioU;SFf%<>{FT8za#Zjw2~w*aEz;S{+`8O1V0!?&+zO3>#mD9{-lZ(hYRR64h; zuj)oRWCiygV>~U&Z2j8TDe^LKKHy|cFyVLDZ)t6u*3;xZ`U2$JciUAnRA*dV81kl} zT0yS;d=kzO3GSO5J70j%&z*I7;4Z%DZOy#TXV=@(fBpWD-^TZPV<&Ky{c$H)t>GHAdJVLSQ{0F9TPV+t3&5mRqD= znw(shLhNgefRwJz-)eJ@;u9Q zd^%5+gMo~-dKJ_B$+DNdRhV_uax>$6dE->w5)I@%pggNc>!NLACBCqmw;2B>FqV{D zHzj({?W&FOQh9b0>vJGKW}K7cLr|xH|6)_C@F^u)DT(%JTBbD12|iO9`lP@m)WwM2 z*P7(e-7BpO5x*?gDqy^np6$i@94$*m_$b~R4GXxO6$}Vay)c;)^4#|r6DD@Tt;h@s zXr74!D`T;pE@y$CbN;OR@0_1N?r-cOIB0DztO)g8+``VHEPRzV4%s`)E(lYO)$VY; zIdvdrIHt?ty*8*}v>@UG3~DGUHWd@(|j+u=) zY0;<5#rjyZ+GsIU>^tGrUDBn{kC`>Qj>BE`y8l{*`yZfj88IcRi6TZ>Ww0;oA%&mA;Ee?@%xBx&i=R4 z-`S&~{7LIp*n*yl)aC#2@wg&%)$hXsj4PM*x>nRLe5N@jpO={$6+m1${Kq{k{_7q( zpYHMLx@9Ig^!L&$CI5Ag!hhW3Y?(4b%}4eA3gmw7!g4118}EF`)?|CS`qp;@X?e!O zmk-33l$*M6tOm-w%aI+8JH6u`8V*ZTP1hpA+MU+4+fWc9$BmOksGW{5+Fj+*kzWZmJoXFv z=!k4@3DE!fyT%CKPAe0%F%!SMxf=hdAS1)DQ}$FOrfscN9wW1_EGOg7J+_UI;PDPL ztJzHj9yFO|Gl>oL{q5GxY0+~zr*>=~jv{I9ljZw0)kEKZ9?l5s*si?Rd*m~b9oIj= zX*Z1}`?t%9n9<*3ba4~~WuRnmFGQr&=m)$gFNLIlWMV3b+HYs0Jh;VZE2pG}2pJbK zD&|xooR*G$&BA^mXL<$Qa+yj#z7$OWcS^AH2EjNl+Dvw)AOuks{ZEz!bwmgsopw2Q zZht@bWdCz?V?=2jcZp#6>@`j$1HXhWT{w3VgWe$6tx&e>8V#7Y*YZKRE5G z$B~%I+Jq|&_x1M$;J$}*7jT$l0S}HlPs^qoX3%{^B-aKb5$_HmndGtLys%C`!u@yyWc=3chuHMDGBO9u20RJT1k#k2x7dpm!+Su>ONq1Ej2{MbK#J56a`is|-!nKbZ_ewOYu5k2f? z&6Ui&gJLQS^Ix7$*-|+3UqY<5=QVvf5IonS^7^xL9r?{zRDp$8)Lb-6m;rMVg*6^X zg7;i3sLku=PvP(K$x#uRuCkA6Gcd$VyQq3zkT5^)uV1aM_+(nGNE7>xcYXoO3iVIsV3Fp)8%^lcGX{PAZR~Dr&Qi zC3lt~mAn4mjSG54LNLhO_eD-zfNH$6d>7cxIq=^GCaa3xU@&WS%6M=`Xr=m+1= zTcWO|K|O$$Y9bOv6J*cRNV^9emt}?RL9s}NlHn;(N1UHNMQ98%y0PhnlSu=#V(Xo= zw8*TQ)5PoUO_@26o7ahx8HV&r`qM3Sqx*lvw(e=e#S?$4Vuk%$VQcQ+m!6@uUE_vh zYD;K3dm4$!>DRaFs0JaezVMVr{+s2P)R=9_9K*)cS47rH>BdE*vViZFhg<^X8-37m zWGc(_I2qI4I0>#@x>n8JGhaPmxObKUh0z#&GkuQm$-FzY83dKd(4yf|z@Iiu0iRY&Bkpd$UtX_c^dcg)#R$_Sw4BOLcMjkq+{YGlfev`&Tl(q*CLXH7 zD`#o2OF0JWR|{M7=Hn&&ih|P|Hr%5wS~9GVF8`_{>$-+xLoZjm!&K_K7Mxeo#fWcI zG`4Dq0BiA9ZaGSv)1s&pgd}@Kh_DXpO<4$s4y&0o%cpj^+RHz??wv<8yZj0qwLG@! z2{oNiJF`L$Gxict^fgM47?`QCGEo!sQEXB1(=lcaubFQ3pN^jIv!Vpp&@#14^NMeR zaq>^yF3U9+R2V{4Do`A0^zPF z_>eMKYV7Nh(>f*t$53kJUX_D7X7pMOUn(}s{ei`)^2??V@iB3~`BfJI#ALKjqp#O2Wk^1O4;c&0dj zzh@Q)wqkN3GYTKQdPH$lGl_cDcw4W6)8m)R^x)7+QuX!I09q zlia0z;7{pGA$hK@9?9dM(?TH2|HJ#M&(tCZ&4y3@`nC6Y8=zq6G0qLI{5;FD07o1n znKqWpJ9ohS9VB%M{SW{Rj&Slwp8A|tD5jIC`aS}cwqMUqxB#BLY#cxz434ukj`97? z(RBc#5BQyL>^N;d?TRRtF*gj0Q^Kp}CG)*3Ms4yR4aRQoo^Jk-IM;!`;IcDI^{3Qf z_1k<8>}Q;7RRPQP#lPqbY~u=TTjIu6Hs5}*)45uGTZsLh-u!Bk#5XI_O9?)xKckOL zzS{S2t1z{jU&7P^Ic=m(B0TIuS<#|gip1GJ6+Q{U0#!c*jlM=SV~U*#FUZnpdloyF zh5BD8ngnfEQ)v&^&0b}>Br9fE!dSm|CpO#=m_7d`vUHdsaC%`qwaxQukin8DR-M9W z`u$rN`-mZ(h~WF@ z$1*txb>7jMV1$2JbS!!{^{yp1;OP@KqtBmp6anEM+3#kmcT{zzJV<0~EZJfr@HC+GNou(0?i!1l+MILzI}syw!H8N95UR~B1i`F;ecQ0bq7gLk z9O|mgUI`T_OPWvr9y#HS3-8`!z=e!_MhgbTJAUVa&K%G}J2>wIX$iB|Lj^LDEc5x( z^`XFzVsW}svAPl7&n*n&ZPe9MO$>@-_-EdKXDodZ77054WEt1m?!POFGfAGAvD$jW zRi#af!rLgM307(AZ-9Pbr#OH5aVqA~C=Qi(5-l@26zWGAZE8 zK~4x}nIN@0Lt>h>Wl)b(3q$qsgX5gNOU*}#;&Cy@!S`BOatSoXDlG3^HAD-C5dH55 zAEYp6j0fvlE=hRoMk}ndzy-OV3hs~JRwWPjs?q;5`u>z*|$Mv0iv(2 z(rAD-!24&YXr0|w4o!O3w)oF+oDu~RyuO?`S zMfX1^54u5QhM$4+Xb52CZ)+#h+D6+PqEKyOP?<^F{EYIU0RD0wb@P#YZEROFV8=Jv zdxLHMv+Lz`5|+9-1n+5LFc=bNLo8(Q+U~Ogo}&Ritzva~*WQ;rQE8W{%1+Tu4qMD2 z3VNTP9y=~o*njG>=d&Ol?@!eUrG`b0#(Hjxi?<`iVea!?#nf8Pab75pbM zy3lWOKTd~3`Yodz{jJ!TMe^aw=N>3t>Uwzi{ob4O*?lpZT=tbm4g?a|H9@llx zEh8XbIoSV~pd4@~K8}mQOS)>xMCG!{)JJUHN0pouy)_ae_yH2xUmD1xR-^lFj4*IQ zY8sbRbQ+{kWLWUT}2T>9nYZP5U8}&e`b3TQnLTb#odOu&#G7FwJEH-Euy>5lTU$ zpHE49=O!IyQloJI|9vsw;l8-GYvY!Dw~ScqZ)$-{*JDK*+|I-cG=_hDa9{Y?asA@) z20S^(UcSxPdF#b%FA=QUrfrMeAGmaW{w#zY)6^+k*khj9vJ%;SsRm*Oo~B5vB|e) zt?&L5Ba;d`mJa^@n=(o^xb*)@9;KX24!R%6kCl_Pr0-uXw8|t%RPRyZ>MFuh7e1QwwUVgw&B!N65-aArM+x(%MKFDQ$VAhL(oB zygCvN*U^NlK>r^XCbAFtQKM#Mrna2Vi?s@AnQ?VNga5*mC$4iO-Xz6aKQ1@?Xjg190 z1l_e;>3t;Sk$P$Gqui<6MR)Ltd{q6ni;uq-7daX)qQ_>=dBOo3wUWLS?x@U{6+`Cm z3lpqo?Mptd7w(3>_O_v}qp?3&iE4^l;r@o5#>KLC+}PJGMYvzQsubZ~sq%R~>}vku zr&#uwx#vn_bEUi2K=v2%jOe;U!r1fbR$2tEH$_t*U@OVKKz2md7b2wZzXEeV|J%?Npm~<^e}z>ZdN7 zoWwC_vz?S~vl!vcFu$j4VBj98jbgshg*1nTVoFQe0X;H#?oma#A~<0xa`MEa2+ThD zYce0E+oRodtx0g$fP^4MH0ccA>?wUzB4d(@muxb?gboJ=uo^nd3D?KcG~Jdqu*Twc zFw7XQ1U>kDi)a%GN3#`x+*HM67_72atm!GHUf4fQ5z{&uCj1T0*<{_6lhsIq5S5$Q zvwrmQa5b9vnW+E{F-HdN+U)?yGiA-ivU?y1p|-@=M1>+5Gch#>E5>_ZxG@v3oE`*` zjmWi5Yo)!YZCgGAo`p1{r;f0!=Udb^Kq8|2GKTI^m&oyS9xNH#XS<;d7Iz&y*|r&lhlEJdZ*XLyUYh6k|`)GwPD* zqZE?=$=6YkMSR^BAu8QihH#!-&-^ZcfIW6LM);>@z{oCZUKVR^Xsm`nUlF8qnSg#x zZlEF2jGQO$8Y7nqtFYP^qrbR4Y~=+zJw|4W9KybsK~^yJ;%|+2qi!m`==S1WUtcp%yn`<_df|m07g; z>7RnUu*xZ(^2_Aw7vOoh5!V}Du(dw z5Ih-C#6(Tbq|!%y{Xao zb3VPY{s;P>j>dPNC}%}cunSMv6O=SQP})pwHN1Knq>97|YQ7O(1U%T-Za5%+RBCBa z%Q6ZuMS$|2TZevhJDnkWmS)y3fykw4`SKWja5Z7xbNgO1V{{2$0YIo11_x00dcr~D zxJD8W2lZwz6`WEWZ$QE#+9-KAs9c?R?5O5@K*BwtaGHu9h5%+%oOQr_{>g)cT3eE= z&_X|3oS7`8b>NjHa4?A?7feUG77l{M2{|z-QBCw*wW7Z1#99-(>BQ@UGi;!0>80Dh z`W0vC#NHt&7B~nKC8?OrP~6RV#uQ)-%a3*WCW9MWw=%6pHMnpF&W*VqP;s9%WtnrB03a+`deK9jKrjAT$M!u1*mC_2l|9{ zlftiJ3#34HCAW@=!790^4#N5G5z!Y+DWIeJ=^Ryz5vyL=dsgQ+W6oq zPWO5aaht190}WdciiUUYo~u!}2K}X_A3#Cy8N*NReXJbGzlT_olG?03WOw`SWd66a zTiy6>3h%gAa&y!-{Iq@CyzXPl-L*jiVcShH< z&R0qk1*wFfrJfNB@0IiWu3^3D#Oo_r_BfUw-g#0ReUw~a(U1icv)OKXOtDM2EX4$4C77n!li zyM@hQ)%V6s6Uu%OsFU!|F9%)IJmQtSzxmrPb`q2WWQ^o1Y-Kui`ig3DJVtMCR0~U?@|=g2DBJ`^q;BVVl#W8(i&`32>YaW6nMKi| zmnLSdWKuY6FG2>tpe3La=0gee6*7C2-+Jrw2gIW{|oz5 B+#vt} diff --git a/Documentation/UserManual/ProgrammingGuide.tex b/Documentation/UserManual/ProgrammingGuide.tex index bf2bf35..79b7599 100644 --- a/Documentation/UserManual/ProgrammingGuide.tex +++ b/Documentation/UserManual/ProgrammingGuide.tex @@ -573,6 +573,9 @@ These commands change or query spectrum analyzer settings. Although most of them \subsubsection{SA:FREQuency:FULL} \event{Sets the device to the maximum span possible}{SA:FREQuency:FULL}{None} +\subsubsection{SA:FREQuency:ZERO} +\event{Sets the device to zero span mode}{SA:FREQuency:ZERO}{None} + \subsubsection{SA:ACQuisition:RBW} \event{Sets the resolution bandwidth}{SA:ACQuisition:IFBW}{, in Hz} \query{Queries the currently selected resolution bandwidth}{SA:ACQuisition:IFBW?}{None}{resolution bandwidth in Hz} diff --git a/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp b/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp index 701b396..d0f290a 100644 --- a/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp +++ b/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp @@ -135,6 +135,13 @@ SpectrumAnalyzer::SpectrumAnalyzer(AppWindow *window, QString name) connect(bZoomOut, &QPushButton::clicked, this, &SpectrumAnalyzer::SpanZoomOut); tb_sweep->addWidget(bZoomOut); + auto bZero = new QPushButton("0"); + bZero->setToolTip("Zero span"); + bZero->setMaximumWidth(28); + bZero->setMaximumHeight(24); + connect(bZero, &QPushButton::clicked, this, &SpectrumAnalyzer::SetZeroSpan); + tb_sweep->addWidget(bZero); + window->addToolBar(tb_sweep); toolbars.insert(tb_sweep); @@ -450,6 +457,16 @@ void SpectrumAnalyzer::NewDatapoint(Protocol::SpectrumAnalyzerResult d) d = average.process(d); + if(settings.f_start == settings.f_stop) { + // keep track of first point time + if(d.pointNum == 0) { + firstPointTime = d.us; + d.us = 0; + } else { + d.us -= firstPointTime; + } + } + if(normalize.measuring) { if(average.currentSweep() == averages) { // this is the last averaging sweep, use values for normalization @@ -464,7 +481,7 @@ void SpectrumAnalyzer::NewDatapoint(Protocol::SpectrumAnalyzerResult d) normalize.f_stop = settings.f_stop; normalize.points = settings.pointNum; EnableNormalization(true); - qDebug() << "Normalization measuremen complete"; + qDebug() << "Normalization measurement complete"; } } } @@ -496,7 +513,7 @@ void SpectrumAnalyzer::NewDatapoint(Protocol::SpectrumAnalyzerResult d) void SpectrumAnalyzer::SettingsChanged() { changingSettings = true; - if(settings.f_stop - settings.f_start >= 1000) { + if(settings.f_stop - settings.f_start >= 1000 || settings.f_stop - settings.f_start <= 0) { settings.pointNum = 1001; } else { settings.pointNum = settings.f_stop - settings.f_start + 1; @@ -505,10 +522,16 @@ void SpectrumAnalyzer::SettingsChanged() settings.applySourceCorrection = 1; auto pref = Preferences::getInstance(); - if(!settings.trackingGenerator && pref.Acquisition.useDFTinSAmode && settings.RBW <= pref.Acquisition.RBWLimitForDFT) { - // Enable DFT if below RBW threshold and TG is not enabled - settings.UseDFT = 1; + if(settings.f_stop > settings.f_start) { + // non-zerospan, check usability of DFT + if(!settings.trackingGenerator && pref.Acquisition.useDFTinSAmode && settings.RBW <= pref.Acquisition.RBWLimitForDFT) { + // Enable DFT if below RBW threshold and TG is not enabled + settings.UseDFT = 1; + } else { + settings.UseDFT = 0; + } } else { + // zerospan, DFT not usable settings.UseDFT = 0; } @@ -620,6 +643,13 @@ void SpectrumAnalyzer::SetFullSpan() ConstrainAndUpdateFrequencies(); } +void SpectrumAnalyzer::SetZeroSpan() +{ + auto center = (settings.f_start + settings.f_stop) / 2; + SetStartFreq(center); + SetStopFreq(center); +} + void SpectrumAnalyzer::SpanZoomIn() { auto center = (settings.f_start + settings.f_stop) / 2; @@ -853,6 +883,11 @@ void SpectrumAnalyzer::SetupSCPI() SetFullSpan(); return ""; }, nullptr)); + scpi_freq->add(new SCPICommand("ZERO", [=](QStringList params) -> QString { + Q_UNUSED(params) + SetZeroSpan(); + return ""; + }, nullptr)); auto scpi_acq = new SCPINode("ACQuisition"); SCPINode::add(scpi_acq); scpi_acq->add(new SCPICommand("RBW", [=](QStringList params) -> QString { diff --git a/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.h b/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.h index 6a39a12..d247d25 100644 --- a/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.h +++ b/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.h @@ -61,6 +61,7 @@ private slots: void SetCenterFreq(double freq); void SetSpan(double span); void SetFullSpan(); + void SetZeroSpan(); void SpanZoomIn(); void SpanZoomOut(); void SetSingleSweep(bool single); @@ -92,6 +93,7 @@ private: bool changingSettings; unsigned int averages; bool singleSweep; + double firstPointTime; // timestamp of the first point in the sweep, only use when zerospan is used TraceModel traceModel; TraceWidget *traceWidget; MarkerModel *markerModel; diff --git a/Software/PC_Application/Traces/trace.cpp b/Software/PC_Application/Traces/trace.cpp index ba1a4fd..74365db 100644 --- a/Software/PC_Application/Traces/trace.cpp +++ b/Software/PC_Application/Traces/trace.cpp @@ -120,11 +120,16 @@ void Trace::addData(const Trace::Data& d, DataType domain, double reference_impe emit outputSamplesChanged(index, index + 1); } -void Trace::addData(const Trace::Data &d, const Protocol::SpectrumAnalyzerSettings &s) +void Trace::addData(const Trace::Data &d, const Protocol::SpectrumAnalyzerSettings &s, int index) { settings.SA = s; settings.valid = true; - addData(d, DataType::Frequency); + auto domain = DataType::Frequency; + if (s.f_start == s.f_stop) { + // in zerospan mode + domain = DataType::TimeZeroSpan; + } + addData(d, domain, 50.0, index); } void Trace::setName(QString name) { diff --git a/Software/PC_Application/Traces/trace.h b/Software/PC_Application/Traces/trace.h index 46ff999..efeeaf7 100644 --- a/Software/PC_Application/Traces/trace.h +++ b/Software/PC_Application/Traces/trace.h @@ -46,15 +46,15 @@ public: void clear(); void addData(const Data& d, DataType domain, double reference_impedance = 50.0, int index = -1); - void addData(const Data& d, const Protocol::SpectrumAnalyzerSettings& s); + void addData(const Data& d, const Protocol::SpectrumAnalyzerSettings& s, int index = -1); void setName(QString name); void setVelocityFactor(double v); void fillFromTouchstone(Touchstone &t, unsigned int parameter); QString fillFromCSV(CSV &csv, unsigned int parameter); // returns the suggested trace name (not yet set in member data) static void fillFromDatapoints(Trace &S11, Trace &S12, Trace &S21, Trace &S22, const std::vector &data); void fromLivedata(LivedataType type, LiveParameter param); - QString name() { return _name; }; - QColor color() { return _color; }; + QString name() { return _name; } + QColor color() { return _color; } bool isVisible(); void pause(); void resume(); @@ -65,7 +65,7 @@ public: bool isReflection(); LiveParameter liveParameter() { return _liveParam; } LivedataType liveType() { return _liveType; } - TraceMath::DataType outputType() const { return lastMath->getDataType(); }; + TraceMath::DataType outputType() const { return lastMath->getDataType(); } unsigned int size() const; double minX(); double maxX(); @@ -123,7 +123,7 @@ public: virtual nlohmann::json toJSON() override; virtual void fromJSON(nlohmann::json j) override; - Type getType() override {return Type::Last;}; // can return invalid type, this will never be called + Type getType() override {return Type::Last;} // can return invalid type, this will never be called // Traces are referenced by pointers throughout this project (e.g. when added to a graph) // When saving the current graph configuration, the pointer is not useful. Instead a trace diff --git a/Software/PC_Application/Traces/tracemodel.cpp b/Software/PC_Application/Traces/tracemodel.cpp index 7f343cd..d3915a7 100644 --- a/Software/PC_Application/Traces/tracemodel.cpp +++ b/Software/PC_Application/Traces/tracemodel.cpp @@ -248,8 +248,15 @@ void TraceModel::addSAData(const Protocol::SpectrumAnalyzerResult& d, const Prot source = DataSource::SA; for(auto t : traces) { if (t->isLive() && !t->isPaused()) { + int index = -1; Trace::Data td; - td.x = d.frequency; + if(settings.f_start == settings.f_stop) { + // in zerospan mode, insert data by index + index = d.pointNum; + td.x = (double) d.us / 1000000.0; + } else { + td.x = d.frequency; + } switch(t->liveParameter()) { case Trace::LiveParameter::Port1: td.y = complex(d.port1, 0); break; case Trace::LiveParameter::Port2: td.y = complex(d.port2, 0); break; @@ -257,7 +264,7 @@ void TraceModel::addSAData(const Protocol::SpectrumAnalyzerResult& d, const Prot // not a SA trace, skip continue; } - t->addData(td, settings); + t->addData(td, settings, index); } } } diff --git a/Software/VNA_embedded/Application/Communication/Protocol.hpp b/Software/VNA_embedded/Application/Communication/Protocol.hpp index 8e31400..424a70c 100644 --- a/Software/VNA_embedded/Application/Communication/Protocol.hpp +++ b/Software/VNA_embedded/Application/Communication/Protocol.hpp @@ -152,7 +152,16 @@ using SpectrumAnalyzerSettings = struct _spectrumAnalyzerSettings { using SpectrumAnalyzerResult = struct _spectrumAnalyzerResult { float port1; float port2; - uint64_t frequency; + union { + struct { + // for non-zero span + uint64_t frequency; + }; + struct { + // for zero span + uint64_t us; // time in us since first datapoint + }; + }; uint16_t pointNum; }; diff --git a/Software/VNA_embedded/Application/SpectrumAnalyzer.cpp b/Software/VNA_embedded/Application/SpectrumAnalyzer.cpp index 23d9ebd..d125da0 100644 --- a/Software/VNA_embedded/Application/SpectrumAnalyzer.cpp +++ b/Software/VNA_embedded/Application/SpectrumAnalyzer.cpp @@ -36,6 +36,10 @@ static uint8_t attenuator; static int64_t trackingFreq; static bool trackingLowband; +static uint64_t firstPointTime; +static bool firstPoint; +static bool zerospan; + static void StartNextSample() { uint64_t freq = s.f_start + (s.f_stop - s.f_start) * pointCnt / (points - 1); freq = Cal::FrequencyCorrectionToDevice(freq); @@ -205,6 +209,8 @@ void SA::Setup(Protocol::SpectrumAnalyzerSettings settings) { points += s.pointNum - points % s.pointNum; binSize = points / s.pointNum; LOG_DEBUG("%u displayed points, resulting in %lu points and bins of size %u", s.pointNum, points, binSize); + + zerospan = (s.f_start == s.f_stop); // set initial state pointCnt = 0; // enable the required hardware resources @@ -256,6 +262,7 @@ void SA::Setup(Protocol::SpectrumAnalyzerSettings settings) { } lastLO2 = 0; + firstPoint = true; active = true; StartNextSample(); } @@ -375,7 +382,19 @@ void SA::Work() { // Send result to application p.type = Protocol::PacketType::SpectrumAnalyzerResult; // measurements are already up to date, fill remaining fields - p.spectrumResult.frequency = s.f_start + (s.f_stop - s.f_start) * binIndex / (s.pointNum - 1); + if(zerospan) { + uint64_t timestamp = HW::getLastISRTimestamp(); + if(firstPoint) { + p.spectrumResult.us = 0; + firstPointTime = timestamp; + firstPoint = false; + } else { + p.spectrumResult.us = timestamp - firstPointTime; + } + } else { + // non-zero span, set frequency + p.spectrumResult.frequency = s.f_start + (s.f_stop - s.f_start) * binIndex / (s.pointNum - 1); + } // scale approximately (constant determined empirically) p.spectrumResult.port1 /= 253000000.0; p.spectrumResult.port2 /= 253000000.0;