From fbef25884ec2d612f3eaddbeedc1c5e8ebcf831a Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Tue, 12 Oct 2021 11:31:14 +0100 Subject: [PATCH] Add Radio Astronomy plugin --- doc/img/RadioAstronomy_Calibration.png | Bin 0 -> 27278 bytes .../RadioAstronomy_CalibrationSettings.png | Bin 0 -> 12971 bytes doc/img/RadioAstronomy_DistanceToHICloud.png | Bin 0 -> 88544 bytes doc/img/RadioAstronomy_LAB.png | Bin 0 -> 66498 bytes doc/img/RadioAstronomy_Radiometer.png | Bin 0 -> 76805 bytes doc/img/RadioAstronomy_Radiometer2D.png | Bin 0 -> 21837 bytes doc/img/RadioAstronomy_RadiometerData.png | Bin 0 -> 42424 bytes doc/img/RadioAstronomy_RadiometerGaussian.png | Bin 0 -> 27058 bytes doc/img/RadioAstronomy_RefLine.png | Bin 0 -> 84459 bytes doc/img/RadioAstronomy_RunControl.png | Bin 0 -> 13432 bytes doc/img/RadioAstronomy_SensorSettings.png | Bin 0 -> 20816 bytes doc/img/RadioAstronomy_Settings.png | Bin 0 -> 34071 bytes doc/img/RadioAstronomy_Spectrometer.png | Bin 0 -> 117761 bytes doc/img/RadioAstronomy_SpectrumGaussian.png | Bin 0 -> 143947 bytes doc/img/RadioAstronomy_plugin.png | Bin 0 -> 151790 bytes plugins/channelrx/CMakeLists.txt | 1 + .../channelrx/radioastronomy/CMakeLists.txt | 67 + plugins/channelrx/radioastronomy/icons.qrc | 16 + .../channelrx/radioastronomy/icons/cold.png | Bin 0 -> 521 bytes .../radioastronomy/icons/galactictriangle.png | Bin 0 -> 485 bytes .../radioastronomy/icons/gaussian.png | Bin 0 -> 539 bytes .../channelrx/radioastronomy/icons/hot.png | Bin 0 -> 513 bytes .../channelrx/radioastronomy/icons/lab.png | Bin 0 -> 324 bytes .../channelrx/radioastronomy/icons/legend.png | Bin 0 -> 265 bytes .../channelrx/radioastronomy/icons/marker.png | Bin 0 -> 286 bytes .../channelrx/radioastronomy/icons/noise.png | Bin 0 -> 456 bytes .../channelrx/radioastronomy/icons/peak.png | Bin 0 -> 443 bytes .../radioastronomy/icons/refline.png | Bin 0 -> 187 bytes .../radioastronomy/icons/reverse.png | Bin 0 -> 333 bytes .../radioastronomy/icons/temperature.png | Bin 0 -> 391 bytes .../radioastronomy/radioastronomy.cpp | 1109 +++ .../channelrx/radioastronomy/radioastronomy.h | 437 ++ .../radioastronomy/radioastronomybaseband.cpp | 197 + .../radioastronomy/radioastronomybaseband.h | 97 + .../radioastronomycalibrationdialog.cpp | 48 + .../radioastronomycalibrationdialog.h | 40 + .../radioastronomycalibrationdialog.ui | 247 + .../radioastronomy/radioastronomygui.cpp | 6012 +++++++++++++++++ .../radioastronomy/radioastronomygui.h | 672 ++ .../radioastronomy/radioastronomygui.ui | 5197 ++++++++++++++ .../radioastronomy/radioastronomyplugin.cpp | 92 + .../radioastronomy/radioastronomyplugin.h | 49 + .../radioastronomysensordialog.cpp | 68 + .../radioastronomysensordialog.h | 40 + .../radioastronomysensordialog.ui | 251 + .../radioastronomy/radioastronomysettings.cpp | 491 ++ .../radioastronomy/radioastronomysettings.h | 225 + .../radioastronomy/radioastronomysink.cpp | 304 + .../radioastronomy/radioastronomysink.h | 123 + .../radioastronomywebapiadapter.cpp | 52 + .../radioastronomywebapiadapter.h | 50 + .../radioastronomy/radioastronomyworker.cpp | 160 + .../radioastronomy/radioastronomyworker.h | 93 + plugins/channelrx/radioastronomy/readme.md | 864 +++ plugins/feature/startracker/startracker.cpp | 6 +- sdrbase/channel/channelwebapiutils.cpp | 379 +- sdrbase/channel/channelwebapiutils.h | 14 + sdrbase/util/units.h | 24 + sdrbase/util/visa.cpp | 25 + sdrbase/util/visa.h | 1 + sdrbase/webapi/webapirequestmapper.cpp | 15 + sdrbase/webapi/webapiutils.cpp | 49 +- sdrbase/webapi/webapiutils.h | 2 + sdrgui/gui/wrappingdatetimeedit.cpp | 73 +- sdrgui/gui/wrappingdatetimeedit.h | 4 + .../api/swagger/include/ChannelActions.yaml | 2 + .../api/swagger/include/ChannelReport.yaml | 2 + .../api/swagger/include/ChannelSettings.yaml | 2 + .../api/swagger/include/RadioAstronomy.yaml | 92 + swagger/sdrangel/api/swagger/swagger.yaml | 10 + .../code/qt5/client/SWGChannelActions.cpp | 25 + .../code/qt5/client/SWGChannelActions.h | 7 + .../code/qt5/client/SWGChannelReport.cpp | 25 + .../code/qt5/client/SWGChannelReport.h | 7 + .../code/qt5/client/SWGChannelSettings.cpp | 25 + .../code/qt5/client/SWGChannelSettings.h | 7 + .../code/qt5/client/SWGModelFactory.h | 54 + .../qt5/client/SWGRadioAstronomyActions.cpp | 110 + .../qt5/client/SWGRadioAstronomyActions.h | 59 + .../qt5/client/SWGRadioAstronomyReport.cpp | 131 + .../code/qt5/client/SWGRadioAstronomyReport.h | 64 + .../qt5/client/SWGRadioAstronomySettings.cpp | 764 +++ .../qt5/client/SWGRadioAstronomySettings.h | 227 + 83 files changed, 19095 insertions(+), 112 deletions(-) create mode 100644 doc/img/RadioAstronomy_Calibration.png create mode 100644 doc/img/RadioAstronomy_CalibrationSettings.png create mode 100644 doc/img/RadioAstronomy_DistanceToHICloud.png create mode 100644 doc/img/RadioAstronomy_LAB.png create mode 100644 doc/img/RadioAstronomy_Radiometer.png create mode 100644 doc/img/RadioAstronomy_Radiometer2D.png create mode 100644 doc/img/RadioAstronomy_RadiometerData.png create mode 100644 doc/img/RadioAstronomy_RadiometerGaussian.png create mode 100644 doc/img/RadioAstronomy_RefLine.png create mode 100644 doc/img/RadioAstronomy_RunControl.png create mode 100644 doc/img/RadioAstronomy_SensorSettings.png create mode 100644 doc/img/RadioAstronomy_Settings.png create mode 100644 doc/img/RadioAstronomy_Spectrometer.png create mode 100644 doc/img/RadioAstronomy_SpectrumGaussian.png create mode 100644 doc/img/RadioAstronomy_plugin.png create mode 100644 plugins/channelrx/radioastronomy/CMakeLists.txt create mode 100644 plugins/channelrx/radioastronomy/icons.qrc create mode 100644 plugins/channelrx/radioastronomy/icons/cold.png create mode 100644 plugins/channelrx/radioastronomy/icons/galactictriangle.png create mode 100644 plugins/channelrx/radioastronomy/icons/gaussian.png create mode 100644 plugins/channelrx/radioastronomy/icons/hot.png create mode 100644 plugins/channelrx/radioastronomy/icons/lab.png create mode 100644 plugins/channelrx/radioastronomy/icons/legend.png create mode 100644 plugins/channelrx/radioastronomy/icons/marker.png create mode 100644 plugins/channelrx/radioastronomy/icons/noise.png create mode 100644 plugins/channelrx/radioastronomy/icons/peak.png create mode 100644 plugins/channelrx/radioastronomy/icons/refline.png create mode 100644 plugins/channelrx/radioastronomy/icons/reverse.png create mode 100644 plugins/channelrx/radioastronomy/icons/temperature.png create mode 100644 plugins/channelrx/radioastronomy/radioastronomy.cpp create mode 100644 plugins/channelrx/radioastronomy/radioastronomy.h create mode 100644 plugins/channelrx/radioastronomy/radioastronomybaseband.cpp create mode 100644 plugins/channelrx/radioastronomy/radioastronomybaseband.h create mode 100644 plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.cpp create mode 100644 plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.h create mode 100644 plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.ui create mode 100644 plugins/channelrx/radioastronomy/radioastronomygui.cpp create mode 100644 plugins/channelrx/radioastronomy/radioastronomygui.h create mode 100644 plugins/channelrx/radioastronomy/radioastronomygui.ui create mode 100644 plugins/channelrx/radioastronomy/radioastronomyplugin.cpp create mode 100644 plugins/channelrx/radioastronomy/radioastronomyplugin.h create mode 100644 plugins/channelrx/radioastronomy/radioastronomysensordialog.cpp create mode 100644 plugins/channelrx/radioastronomy/radioastronomysensordialog.h create mode 100644 plugins/channelrx/radioastronomy/radioastronomysensordialog.ui create mode 100644 plugins/channelrx/radioastronomy/radioastronomysettings.cpp create mode 100644 plugins/channelrx/radioastronomy/radioastronomysettings.h create mode 100644 plugins/channelrx/radioastronomy/radioastronomysink.cpp create mode 100644 plugins/channelrx/radioastronomy/radioastronomysink.h create mode 100644 plugins/channelrx/radioastronomy/radioastronomywebapiadapter.cpp create mode 100644 plugins/channelrx/radioastronomy/radioastronomywebapiadapter.h create mode 100644 plugins/channelrx/radioastronomy/radioastronomyworker.cpp create mode 100644 plugins/channelrx/radioastronomy/radioastronomyworker.h create mode 100644 plugins/channelrx/radioastronomy/readme.md create mode 100644 swagger/sdrangel/api/swagger/include/RadioAstronomy.yaml create mode 100644 swagger/sdrangel/code/qt5/client/SWGRadioAstronomyActions.cpp create mode 100644 swagger/sdrangel/code/qt5/client/SWGRadioAstronomyActions.h create mode 100644 swagger/sdrangel/code/qt5/client/SWGRadioAstronomyReport.cpp create mode 100644 swagger/sdrangel/code/qt5/client/SWGRadioAstronomyReport.h create mode 100644 swagger/sdrangel/code/qt5/client/SWGRadioAstronomySettings.cpp create mode 100644 swagger/sdrangel/code/qt5/client/SWGRadioAstronomySettings.h diff --git a/doc/img/RadioAstronomy_Calibration.png b/doc/img/RadioAstronomy_Calibration.png new file mode 100644 index 0000000000000000000000000000000000000000..d60d2dd5c01e64487205efa4b99f6faf70ec2dc6 GIT binary patch literal 27278 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 literal 0 HcmV?d00001 diff --git a/doc/img/RadioAstronomy_Radiometer.png b/doc/img/RadioAstronomy_Radiometer.png new file mode 100644 index 0000000000000000000000000000000000000000..4877d196e503158eddcad14bc54348d2c3f76ad5 GIT binary patch literal 76805 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 literal 0 HcmV?d00001 diff --git a/doc/img/RadioAstronomy_Radiometer2D.png b/doc/img/RadioAstronomy_Radiometer2D.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c80f2c10db7057530964b03e6681a41eb47f2e GIT binary patch literal 21837 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 R1AG9|*EYQVLDT-pe*oM-iy{C3 literal 0 HcmV?d00001 diff --git a/doc/img/RadioAstronomy_RadiometerData.png b/doc/img/RadioAstronomy_RadiometerData.png new file mode 100644 index 0000000000000000000000000000000000000000..fa54cde1e2bda4d921c51a64bb733188fc23537e GIT binary patch literal 42424 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

Jjzu%TEp?B0aK+_eh|T6h~WZbj{5A9j~YdK3h|2 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 Olao@GtQI#7`hNgJCw1ij literal 0 HcmV?d00001 diff --git a/doc/img/RadioAstronomy_RunControl.png b/doc/img/RadioAstronomy_RunControl.png new file mode 100644 index 0000000000000000000000000000000000000000..8b361da01003fe74258b462b11afbe7e45483aa7 GIT binary patch literal 13432 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 literal 0 HcmV?d00001 diff --git a/doc/img/RadioAstronomy_SensorSettings.png b/doc/img/RadioAstronomy_SensorSettings.png new file mode 100644 index 0000000000000000000000000000000000000000..38c2dc10f555e2a97b571e6d496eaa4afecb4331 GIT binary patch literal 20816 zcmeFZbySq?+CF>_si2@DB8?&;sS-mE3W$nyHxklAcPi3SA|)vx-O@E64FVEFhtiG2 z5Cb#w-8_5$p1q%UKkvJ~^;_S6-|Je$xR{wcuIoIH^N0ymQjon$LPG)oz}4r^q*VX_ z5BwFM_|nCX77O>!;17tCitH1hWPolRd_Z9SSpG2plt+=Czaj)5U$%dy?F0a1Z5LmV zF1tKa08mKszLdu9ZsN9$LIvzXxqspXm7In+_^5l;N070vUKA~3RUdL zaQ6KhV?RSpSXNmhZ2E4jb=Z&Vc=eZ=PqbaJNPJwhySitx-Sm1pfw~n}b2OEelo=RE zND3IG8DrRhmInj?a61ek`e1xc z?pF^LOV4GjBV2b6HSMdrx{B;De!O!_X{!TxjkoSBA=WrZX zNQ%4VC3Sw>xs@EX>v1;FV29LCph0t^I4&auvXl3Jb|@k=8LQTs(tVYoC4_s2@pMK= zMeQ`yR2q-}CL3Nxb@kEt>4D+NH>#(yvaqws!42YlGh^cg&AA3P7X0=Ci<{)@s5pCa z;9(`~;o-jOuU#y{PXZ}ue}upx4@V5$*SVooyR}|@gI@4ikK_1pUIWaOo1cgS8tDW} za!QiALAmWS2IFEM*%gURCx|w4K0B5$V|01-c|5FWs}?RG?xihmwt9!I@7V9$n$+;@ z1YxX)H>Q? z3vv6qrH1u69iq9ej{NPqqd_h%nZk2S-S9~DTz;=-5|v`F#EcJ&{u(j`|o*)c(--U*TCd*E8Ap{KQd0*SX>C_s^r>wqQLAZ{NitP?f9^Xa7L4@z#Q~(TtisXh))6*5; zY+j+;(x-P4$r#ba+v#Uz`aiI(XnpbHy>r!hFTJW!aoi|lPo$LJz2Lntn!fPjg{vc7 zh_mMQ^PYowAI;L857D>%*`7B9FG+<{L~6cj8gIWdynRQeGq-WpAq1xDSo@BpG<1=` zvv|;@P(jXs9q>>wG@KtA+Dk^9CVOI@R?o=)>^g45eF#^l^X|X zi|J~}LiC=U|;d49VX zH+ej7sPrT|8 z7UZGyPL%6UiwoWz=~QLDF4;=uKPHw)5mIcAQ_Gj;RVmoAHV7{o{8byTbYB3aX?B{2_jBiIlU(!^!WGg9^ z9vLNX_}*J#mafUKi&tlMFDdub62=i7zjQVA|ONmiE+>ZTBv&LsnK6Z`0uigPzhaZa$@a_>YJs!^U~_ebA(Q zxT-}_SrJ^-rW`LN6;w zuYZ&TBlCRq>eazYKXlev)#0Hf1c3UVo_g%zpmXk7d3oJ%hd5#2g`8ZeL6hg{zFB$W zc{2bIvOV2iz_GBf82^-jLd~J|y<&M(GKOk?dwvBlpvcd)?v{%#fj|5OvlH;(03U#6 zzDJ4{E(}aC0&uR$QQN1-|K800dPILY-8?$NmVq`~Hp3qZX<~Fg`cJ<)nM{U(Alfky=1QT zAd z6{f~4y(V$bT;2@+^^TEDz2yx z*I}IZcI(e$b5Q@4&+S#>a7>|?UabiM3O^)s`i~g@;N>`Wibp-Owl=P1aBqjXek&PS zsQB5Qh`X-;jiQ+EVV^3iRg>Ot*nS>K)JP0bL;bwrN~qgSVtY7N@7)49FwPmQDw)e1 zlba5AUkE+1_c2fE+GiY572<8Q|6Y1l7s@|MmwZ3=S4<+_hvbH^{s-guz&I}y@-yYQ zyz2lRRc>NMBpW_YZO>eC-PE0H;MRH*0E|85!7~C+1REQSFGAo-G?jK(sO-5^_YfD0 zHYjfFnZC7KA)T=u*iNQ^u$YX)btEO49I#OS&l)9ExbgB8pf={(f2@Bs z_#9znSy`FK!Adf`KEF0m8saa&4}0Uc*~` z)Pt9SG7;lSZmgk-%3Y!vCnqOY6A=$j+B|l2CORCaih&qyPnc

Rt!x*F~0Cfy7gY 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 literal 0 HcmV?d00001 diff --git a/doc/img/RadioAstronomy_Settings.png b/doc/img/RadioAstronomy_Settings.png new file mode 100644 index 0000000000000000000000000000000000000000..8c3ae1da626065b5e55db4d5e9e585437df370f5 GIT binary patch literal 34071 zcma&Nb9i0d7XKTwabw%IZQE>Y?WD2Y*o|%5wvC33-KcT$+kN| zwdNdie8zXo2qgtc1UMWx5D*XqX(=%k5D>5@;O7+>FyL>bqctJmA5a$+NfD6hX}lBQ z1%!pLyf6qzT`c^oF(mLB)=^5^1q1|f;Li`}h(oC<2uN_Hw3x8kSA&Zzcq6r;u8$dk zTLmFlDo~D4Nf2}~vcLo}(r~&eb!PFoeU7e!Z5m-=k|l#qc^m7BXn*7)db@>;$Npc( zQA)x2uvDm#81zO-!4Tna!c4Fp7iX`2J?Y#QGnd&uWNTy@OoV$ZvD@ja7SoyOSA5ge z5_F%DJ5pW;b{)C!5W~=zc%WT^nMwgF95Y4&h+%)e&J-3~$`@6ra@mXKRLBv?k|=e4 z{I!cD_!{T&=Mms7A_SOKx68T?>u^gB=K|PpLdr9<(~KG+dhz=%CY}ex&_%7qw2`_cDGPf zRW-Q>Di#3BCDh&d8uo3*@4JY0{mJHt)V>L=If3If<2Lcp2t(z z-dV(BXJ-#X#CPUWQ-g;P`HaQX6R7CkO=p97p>NZoj$c|{{+w%jL7Ir48yV@FlgM_M z$GP>V-o_PPQ+%80RD%Q>e zZ9X2n@6!NbmKZ(v-{E-u$o{xGa!Q~ziC(-tXn-eV|&qf?pw6)Zw`SQN`eN zUi#pN6cKJR^@H*4#0T_SBbnRbg}Z_j2E=tkk01waVs^;iSvJCWnQuJxot-Bu#sg+2 zMCi~-Mc=?cEh#lUJwe@g9J(nn(-d|7rh@EdAx%HES4@p+W@5ZXmX4}7cmmEv`1YTf zI)mMphmw`Ug;dRi$t5^hv0nkkjjq^uHurzY1X@#m(0+pAFP_!JHE_ad_o zdisp4%Nya=>F=8UL}HzqEmn0KwD&Ou_U|%>Lg~r5gYGu`yTGP%L#|f-S`F6GU7dfw zGzzuB|661bb~WJNvdmkT|GhB{cG^n|xFk&&6ndOz_#fEV*q9WNxcuJvyb*CZzIl4V z)DRGh)Ru>FdTQBy;QA*%9Eb;B?ZGNyTg^U(7D^`{`uXw>SgR`FEpDNmlqNFK!+l+t&|G#$q&DIuyOd3+|^?_Bg+I+UcO zdwa2h=I_~aOQ&-jwu^zxP#C9$Z(WhMP5RW)2JMi-ZK^&wEg99P$KP`1e(01?E=g!B z1|N_9pwQ>$Nf2vn>T!Sdz99d3sX;7iy&xC=g=DU~tm;k8C(+uv6WHRQ1S9J#Zq{LT zy_@qKJ*n_!f{%Qk`B9iL6~Tj0+AlMio3RDLlmzCdclFx;G%QM?m4U5Ep`|>GXJaxN zWXc|IYng|QOJx<8e}$(rn+mpCn@|k|k&+Ge@Zs$E-ZMzBSHc)Oo6TvIO#Y=rez2r> zX_B_f3S->k7LFZW{?(k|c;3vJHJu?ngv+-E?0Ej(nHAf5cvmmm64J|YAJHrOHLrHj z7f^oTu++?P2q5l-@S37ax;=zvf|u8Ne?`e9=X4=OZUCKIs_T3v6_T|t4z|IcK9HL| z1i13x^T~FDW(d)>rQ_Gi*ohoLu*Q9JdkA}spS9oqDfbX6 z&50|OQn=y`Cp|cxvGV(aFY%Ku`^6jthMZH~UCaVq?_!|MVIuO3u4VrXG=vV$9`sw5 zNwvU4hQB#6;zar6os}aoqnw2RHo7dkX~X`>^y!`X^rI;b&8}RuCJ3TM9I9NEs01Qu zj-k_ATEWNDd+bBu``4L=SPA~lpUaXG@mN(Dgq$TsnxD-v+G_`J%R-g!NO@RCZgb0YnwPI^9r&&jD^S#NHj@vM}ezapL}lNF^+U z)To^3E*(P>dU%YF+Wf*OuvKp0G52QQQ>C8HLqSpDo0ik%0Si3SH@hK{n}GF zYH-U*KWTPVLzFML`B}nv5FOhkkSIINE1DyAU5__$7 z>FPxT%CAUZ5AnaxY}RzU{7@{{xU#P#*8ZJI9#8KhI{C9YV0=%7E;@N6cx}aS%DYQx zbn+n4fXhmg79?!JhU^GqAAYFOaI~CB+AgYLZmb-6KDCvNi>T>V9(^DATpX^QrbD<$ zss1L5(luY@MLMI|N;M=dnmeG=EF-w_)&CGM>(m~PFhWg<`y=@AnC$S&9#YSLUYqA$ zA?Wuf$Vsq(Z}nM^=RX(A7#PRp#%L`B$d?YhXdzV-bj{*jR-z~H1R1Y2^6WnRGNH@A zdx%Vd@mV=ez0TuOA`DLAj^maK5aDK6me)X*6{LNFbNzKNUubmjrHm%?Q;IUVb>3+T z0dj-v{ShRwfHfaHcz%SdTd|O8(9A>|7}bf#OK;l-a5F-1&_h2MS3>>b6Ft%el7@$-WP27i@C`G$BVwXiP zUAz3q#QZ7$;bp-F8`XU~ZG+hmXo5UrrUlwLUj>}XPQsU92~)E5Yh2W0YKEy~HOA>a zE%?QQb(05R9KwwO;~Qj!C3Q;Vv(V|M{D-;xjfkdE(`uTS=$iSfu*mfDzHp&RT)UIm zG(VH@ARJj!6~nb{{@35bNLU_LN-pt|LEvs|P^Sa%lz^NEGe^Hd5B?SimP*`nLs!Ht z;+rCwK<2JrP2euTw&zadN+US=WWfth(wgoOlooQCb$ZrmH7gg9imQ`NiC{a5haV!1 zPog-_a)@fDcF}kj;*|(yGIACdeYgnQmXuv(Y}J&5_c52E+TX-^K`*tf%fzjJdr}kg zrF;;A*gW+MB#iw_?{2FwB@FyNgRyP?SW;GNYL#*NjlQJJA7_S}4Psxp-A3OvKl42R zBP1AQ{>F;EnkJ-Ar*6c#!|Ni9LLNhGb{3Ms4G%*2v&4ub7oLS?P4%dj&z)V^z-K~g zw&vw|OQtwF;6fYhRRLNmKcJ_wne!XzHeIgWFiGmmkn0Wk?sT$o<+?2q} z!`O!ov>BLRm`2Y969Sq-PKQ_lh>4qrhJS7gQsxAv$BF9Jl?WvatLD`dRb2n6tk#D= z&k*3SxZM)q>%)Vx4T+lxA zBTeTwfgKtJLI%*W?=^vt{Ge< zg2Gu!njh^bQ_8UEg4>R3EiZ$BFD_huZ+}KgSD;Y3YD|C)TndX*5}!KQyY03|6hP%C z8AjlCg6tcCJ;w7mNmR=)wYXK$?@o=ew?18^8i8Lr@L-FW^*#7d0!Sf@bwFq<^ z8pNT1_e;mjrU6s3N3v3bZ>K788YiWJJr!bx)|WtI(@#ZlJp1^HZc2b?(-Zt93Nr>2 z-Zojj!kC6*GN##w&X{cxH@U9M%_Ef*xoEM6@JDhavKVfS7hLhBeDhR&$X}p_oj>o8 zZxd9opyxtKxG|ylR<+~kz2;fetG$o{uf%H8O;AtpNZR~m^|9H^*hq~pg`&vi#U?BV zkD91;i&c>tzszSg1r8+NFNB!fr`lry9oTliOL@cQkUWch^&ZdT=e1T@1!SBV^iH>Z zLPO*hB0c;ykDb-j1`5L|x~?4)45L4ro`_30KH8=KJYmH8GeVX6(1dyRr8NXt;Wo+q~O+!upO+R8KJrcu9=U~F6a z`)?+8rTMQnFFgX+>0VZP_Z67cIX-uZYab8jtck}8Yfw)LAsSo7dULNu_LcdbU%T?! z%${1Ez(qM=A&b_EpKtHcX$x`T5LA3|G9;>NCc_AnyXUf(B)X&no|`!fXbc@I+?@H- znLbhkw+MzrvNCD40Q-cSH2bi(C5PJrnUhK_*`6gFen*;0@l;)38AZClTzhS@b@+}2(uX7nqg!v~|Wv$b0k-1e6&P}x7)%8-dgVdYXtBRa#(u2#z!}J;z zS^^|ayLs)&Vp|w@()k`w)-ot#e%XypZNO|yqOeM=r2}x)s}}4$>pbOpcHf{2WLM6& zso0NMgc*MXWVe)QHhUKlVkVvLMiXdcTrQ#+fP!(H1;O?122FhdBcGj8s;efRM4u`ITk?aI!+{VAq1gp01=J&xW3G8e-BkDm?ne8aPGVfaD* zfBDJ3*y$*P2L979AOZ+Y=C*)0Acq|+0jqOnB?r$3Vnr9k3XcL*m^RQ6K8gjQ2fE(@ z8UNG^GnQR(h#lOpE|0Lmr;U@>yKbR8)7%fZ*0TRcfx$a-jZk^OX^uRgon zt8dwI;6j9Q(bd?a=PL7BouaQ`Ym@CX-bI+2w*sv7>&avk2K1eV2ErB` z34Lm%8t<;fGlVrdbGb<>xr>YjvJKt8=$Dr3le+VV(fKlc$+fo0xolUN4o{dnJ%bUu z-t+_c%Q!l-??7KWAh=VBg@7v?RP_Uc0c@2?)GJAVTg z*sY^Kpf?}RV+CRDUdn%XQb-U&@E#^mbtR8%7gGT;cimOIE$Je~XyB8~4S3 z7SP<;&h0WL=hJV|3Jts;mRm6qp>nQp4_miabhP zJX!vfXZ!n^`^+xm9LQS^=ao69{?Z(_plBJO-PN6oKOohOu@6247|@Y|vHAajIHi{55|`{P{jg~aKHKD{<+3|mr}?N3vLQEyFu>r0 z&uryriGQ4y_alSPgXQ8?%hFN^eW32k$d2k|vS??cXd9o|bC;3uv0l4tSyff^6L+4N zsi~=}D_bfr9$|3Ya@)~w+-_U=FTRX_c8cSMVQjRYKDy4VoW%xf&eL4Rz|y0JSbUyc zu_oC$IU917NH{n!Lf^xX2sv=lpFdsCBVGerza402XV>-hn&j3|BsNbpOhR0o87XWJ z)G|xS<46w|>yP2!?6q|SA$wQ8qxXT&7m#TCE z$<6{xYN*A2^(J!DV!d7fOPBW3Vt}F4lBiZId>7+nc(b-K z>i`#*iL@Wm+6=Oy=nrg`;|jS0P!t=0sq^9XoC_YWz^{tu&oegB%2ui-;YfeT4>$#@ zq9~)El(zt1wm@-V0Aq53hxEv-J!Bd16Z=1OG&C$JIH|Dh0eR_IcPvWcU_2;i52kX( zYaTWn4hFaW5s=}<(92ZbK1dU#n0oM^2|sBv`gDTPxtLttkO8n$tcK6|%%s8I^wVUt zV!D2AjT_Bz(bnqq<>o)sPIBQXD8lSuvmMF2#V=x0OHb1m)|rKX3QT6-@+3b|E3ibB zFM+vZnyFa$7U3mpi_vu{b(a+ylroOxH~S~CfFBVy*179plCw20AtU8gbt_}JY=)a2 z4sEdf!45qjc32Keb)P*i4u4te_z~f46!6)-2eaLI-st-ilxOffUfx&s4qojc^y18U zke43>4HjlGJhcF?AQq9KN=D+fyYb7&=f+QEriqDi_xBWQHq%lSHLKCFng-nP zrvR;Da=t({+h_R6NJ75vHP*5H!7LUGh+zwak3LX&qT`A+xo^rEA=G{mHio7QbW<3S z$_l3F@M{70YVTfsM4<8t8seS-oXnIn0-5%<$=D(x&yhLf4on|wKO%y=>z%ah-`WXQ0@ z`590FpJv!Qw9BEuZg#E9^-|7H=c>=W-a=L$vdjq-RWz$~Te#vqL;_FOJ%v$u$6OXd z;7We?VdQo<>tsj%Qt?!I651u3Lms?{8I6deI@(8(PUPv3A^B{MZMIpihSP`@$q8VF zw;->=Sv91Z0PWM5Hyvjv3dp{XOG3hMbeD}7*nJ#6z*Z{)l0pg_p$fu)sA@tzVK1}s z7{$E4`W_pcjgXH!o=-6VB#yU2__EZ1@Fc!K{(6x+e+RRr>o)4_GReyd6@e%un<;;%d6d&YpgrSjI0Arq}E%;y5&&c;SUC)&gM7OJe=)86VI{eO)*>5bvTCI2iP;8RC4rM ze%-B)81hPc^Aq#%@bL0_mC+)D?M{k-PLy(vKWM<+&5^5EJY4epCJS0oYg++`j5OTU zdRv~D*`v-clw#k_s>CN4E9Gg=3H4rtWQ=|Xcb0LLu9ahjXi0!5^k1ADksz4tARN`* zX423If@CwR3MZU1Uhzg{^^X1uSr2iKvg3A?ydsLE$B4gWC)@g3<%?=e6BM) zMp>**GKgTU=@XQLmF%^PU~CIpPqT&0BZ6-O+Bg!Nuj3Rj?6>gD@b+7;=~lCoNCW_B zVKZj*Rh6QCL{XjK%HeF?;RV!RFu~oLh_s9})vi@2u3KO1SqStm_~JjEJ?J?_6Ll}D zGt%=l9M%!R;ODlrdHiU$qo=1&V*}mzJ9-Vj;6A5Q`!MKjuZnqx3Ma$Vw^WB>OMguw z&>AyV`ubQSO9UH2lAK5$l#8k}u6Ek`nQEdjn22mcvvo*%*9Ug8_~%ndC7YrKUa3hy zoX`>mhG)C56jq3?mm2sItaTrlzExT0vM6#UgZSXC<8zp)i?Oh$cuEwFiXrIjiqqHM zfei3l^Vn+O9WiaSbdsZ*yj#Nl!UxBXFkyS=r%UMA6|vnHj%hzhLxz`ia1fvpiX6hR z5tYHE=$RTG>yYG8B}z71kB-XruZE$+VEYRrynF@TdL*eP!H6C`Zfz*?(;2M`(?f)$ z-7aw}#w}FgL4(-U=g2+qkVvmy+Xn-|zNw{0n!aV@R`1Rl_B?)-3B>$yIk&jj2sqPN zhaRA8B@UKo>ti{^r*nuSUS0XghR9b4jJmv=uV9tWv{@6$V*GSOLhc$;(`N>U`!h0Z zwmv@vC>3q(j3|m1ht5_8%t&KPq@Zb3<2K6!wqQ*9+{%h>bddNVDZ>U%ARR-rMa)dW z=8Cuh6`Sht5R3SWU3&bCI%!|xTG%& z9Z<_^sSINUih;^*1{B(@*LpwUzJ-d&ujAAn|ab`g2UvWraO=-MCLUKtbed##az2 zh1UQRN_t*h1BLRk3PoAj+qO8Wpl0kw?*tc@RZ|Eko+!33Y8<-bb6cLoAWsfnUH#MA zN>T%GR7pyhbF-Gg#u65^(&W#waeVVV3<2*j3Vm*{+xKw;yLUVX9v&G9aQuY)F2>zT znJ3=*!;tfa^u!}%i4WEs!WD-#d&dnE2{8W6?gnwlE<^4!~2wXP|euE zO39Iwdnr*twbr#k3N6vF?C}(xZbG9KyX%i9{U3ws+0aM%B{cGwktd;^u&C)XEMRj_ zTCwQ82UJqtrIs(hFKjR<$msOIV@S$v$tv7)biF86tw#ju3c7RAnCqK`FGQOolxh^q zqcl>}q@I%KQ6goJNf90t8Ri4UJUnp8;xg&(&dVoQ=@wWBh}m+R@2co4zhOpu7W@(t z9lyCyENV-aC0Ods9&p|etv%2CopM0&QW*v`tf`IyLAe@-6mVWP8wC8wpJ=?U_G?D_ zC6tJ|)U9Ha>c7k7J)Uu~ndHUQdqCYnM%cgpKJszjIDUbq3#cIFMe_CheHcMH>->yx zC5WZpZvHXMs8#t5$cLVDbb~h>_v0xwcY9DH4u1Wug6!-~b#?JiqOp&Uk3KKIhlYlf z9l}%Hj#EqI1TpB65}Y5{C>O&cBI0SGEQsPWbz2MF5?ho3zhLsV-y5MrZMmFPE+Nv47}G<{xBejpchtayvLg%1Hpo1T&DCT;l`U zLl1E6iy`(A(-08*`}=itb-#T1qJ4#FA~a0o6(^mt8Amxdp<3(*uTitYib+ZK$AiX< ze$0=%G5@%d@4h{R{V$P7&NLeE(v1Hhm@hisHnJOweRZ5`CUsb!LJJEEM@OYFKFc&V zH7zYJuG(@G#BatUGhQGwDyF~Fug1j0q@<)wPb(ZA1*7Kre=#xnize5()^mAEb388Q z-)vea1|vD1pazfIUJ}PjDES7REw=|Mrp_Rl>jeO{~C9uXC#=8)!V!bU@7GHTn6Jzt-HG zCDILt_)cdiHk^>I^X^%E!l`1d-6`6X{S|oN$OVcja+RrDrGaG_lMbYXMp_A8hHjT% zCW%B`w#bJNwx+U#qkn|CV`)3Y@Wuus_e^tv_^H4Q&TVsVra$bFIg!5geFdAt7V8$G z7l=WZZAS!$yLX7=9$5^V_zH^ut7%@>M(bZ8JWmLw%J^Tg`wr@VXxs{108h7(oXP(t zb3jqtqzKd-O6CEI<wl!~%szX5Xj(p?8pXPt1}v zx_DhzR~8Tkg~h~zB?_3aGJEhPwn0BNIrJagTl6w3m8a0~mpNo(PVYKW1pyhJ4e!^h zVm4oTGZuTMXU(}pav&13mirhEPtUFj#>axk%i=0dFM~+-c!qosejETFG zg?mpQ7Z+CepTSUdb#)vW7r%A~Bnsj~gN?!l&t`;7h1BTPJ+-#^7&8ZUm7t!yw3r41 zP*AT*MUY#m9c^}?nEj;s|8rl`y*w?Dnm6!dEQzupa9V+ly8{jKbEqGMm0rDo_0V$T z28VV#f}*%X#e?{zf-lM_^InJuV$%056od_EvA?pUt<--1{{3(=UDTbzStQzcAoOCb zfs%nC##7WWFJL7HROVQdUOnmFZoW`jHkBbdHnv1rz|z*%`{^JxmQWDUzU6P{x(%V% zV|XuHMdvh&1fG^z4vIKz4V!*O^AKP6Q4;pJOMpEh+4-HUAm@@X-;a%?8k0#lXkDNA zkf})sU|3qNcH0f%TE;!^uPd9SH9DXY>b>-L-DzQ`lrVr%^D}fVMuWc~S*CtG&G?13 zE}wY3U8BL@pY=_??Bf)&Dc9)4MM1A@xjTS`iiUWfth~(Xb)}SRgIRiSe?pC+CR{)K z2KNo5f)j+C<2L9@#LZOF5cyeM7TwIJ^N)wUm&|CU2ZjiJKY3?(DN1<%FRib!0=1 z_pX8QS>le5bA{s-yyCQZGsHqrEMq}DvOc?Wx(yvchO;?-#Lz&6N@;-AqExJEh11Rb z!QJeA*#5V8J^+4l6oStv{Y^kyoI1XQcHY(ZosJZ@CPbiufT~|D=xf64sXdOZ(bu~# z2bY$n_04+8)A6D{i3TSIoh1>fd{ISR7WK8?r(Z*Sob>8;G{pg|YAakXG&^LiBCg{I z?LL%2t+cER)X9wpr1yL<0_~g$F>DW#v+4^2oqUaMmdF@QwbTsbpac>3nAje8Q9D&) zal9e5+M%iiP&D_m=Pkp;�=JRkQ__q|_p_KLKYLjG;S#s3kNPb|q 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 z zF?Bt!RarHYMA)8hAn4Mxte$c8^Up0YY`Y43xa9%u41IO|lM@m<%?eIo4TsD~L^O2V z^P(pWv#2Wm?&Jp8dqu%bO7$hB)d3mo6`mnNC{lGE`;9)@gkcTLfMQ$1cBORrngYMPWX2BzP7fUEnqmX*qLGj!wrJ4aw&+S2 z%kxL_8I~%!yt>HupX@2-GB+$reXn>(+6{rLeZHPQ_rm&eSVtu4%C;$%ZG6+sN zEppT}P>GP_=~}5VC766=TU{lIvRe(XS%$Jq5j4IZuc5IGvs6fdl@_A<{fedhb9rT> zyOAjjgbM;RtExLX9!LXtl47#^^$wOiypCf%>MFV!_8iG}Qs!T`L!D*?t0Fgwgg-MA z0HNC~vKOp)o#jcP+T|g^yfa=D7)oPjVv0^t5up&;3+!yffrdm?|z{EWe7( z51_)7oVIMxTuoTOlz1iOb2k@t5XE@}ocg;$RzdrdGP#q614+>=NNIGhR#2fL)xVly z%aG_K7_g5J$iT`WY_89Un&#)tisdtNz z1*D{sTFk?^^>IWU56Sq^V+JTp7{L+7usU;xrUODc%G5r#St`WW&p z3IDNvW+pn?8AL%9PKrTMx;Yc87qjS3I z=LHFmBA+u5h7*(BVS46DV{jQ_@!^s@BbnRFT!srWuq&u|KssYijkZ1#)S%7Fo)$hfS!#iY4-fV=4&~7Q~Aj zLAC5agsW$oyq-lcJhoL!Dj0()02Vs_N0$VG^8i&N>0m}&Dqv}WBfMa4Fp8@+%x@@u zIDx_>Ak@e=kd(~PTq#LCBGD>CRe$zB-VfZ|kK-PtvRf#h6*%Gbm*L%ETla@s?kkHW zhu14q?_4F+H|l8`SRchOPmC=G^Ws6|^i6tK_t$mK-rio$Xp<>Aj{jP(_Xm|#S6726 zhwa#qLPVK;3Q4g>1Woq#1%Mp<@X-$J2OgB7#B4lEcCW`Y{1X=8UI6eF@dpO>v-sC{ zL?op8WoxOn{%i%a|Mf`)XVA6snL6obeu%j>n6?En`R`!~VScoN-Bvy=c`>0J$wK)Ue(4K{qcWV}176=`ig`S(C2 z6;8@3YFVN<-~1kw8MwySA&Yzp9l)QfK!|n(k(3}mbR;>rssdo60OCHsEWTD(!yp%IG#}3=i@{q_XrI}zqH(Tjz&LCbi0}}BK1!O4=n#>=WV6tXQLMnOoiDq*B5fXR}~EnNjw@s z2sU*?Lq%v(v<~^YU+xvM5N(HIRAGzi011&Rnky<_M;#8z5?;RfvdBQXfGak6V?ayo znWBQLeSM*h#GZr-t~%=55lx{wtl^GEgc_HkI@hcCTA;u0FTDzJ&Ct-$lWr>5M{h&( zxz2UCg{lmma-Nv$iBgZ#VpzqzS+A8&msXI6uw(1^v5?LBg-1bn%zsnC5fkZm^|a-=sdrMPg*N z>!`^tE@0oF1j$L@-uG!jL}~BC^< z_o7FBacQ72bG`QGN_^kWiXyw;2SM+?K|8lSm#41W9c z=@Vo(k8zl`476`LJ;tu4P5PfNWQ648B93f49@u!?77eM)U)Q6pjn^~VK~=6ZwgkO4 z@84K>E<%SrZL~WDgR~L5#vo=arlZYH0E$X_n&4d-91 zb0%8rth~KtoK0)wv5I|(o^HE-e0x&rl!vX_J+t`K@$tsOGGSnEaA^xI#XMcT`u2{a zr7{S6+vR1m7aGRjU%XrWQU4M+Y{%8PvyXo1r41$-vVZaUo+XNNM&s#fmQ)Tr7d(`D zI31$&<@%Bt zA4s(GW%{D=V5TBITWJo_)Vo~GuDMtzd^-Bx}Q%f;^Q$cSGBVrYKN-EvV2YVeokFVLMo$XcrwT4^mq`YI;uH9V8v}*xqp_w@m8@-af0Qe z3k9F-Dq&t1P~i%uaZ<*$IyJexAFq0J&2JAT?&tZrZX~ssd^FF~eS=Gp$lF5-tEvRO zQyW^E2@CL#=#derP%>P@e5^>bcF1Z>&rtkm9fzd9sc6^(-95Zroi(j%%w2t!T@3a_ zQl<3QLX`MlF0#f$Ut~Gs9_W;F2!RlPY>YXEo0SZ+g-T7Ja<0eKrwZ zEv7B7NL8y7$wf>~xAQ)G3AKhCg5-5us>eD--V!kz6x(T@J7XQU)kNMOGGP&SMI8KS z(es3-PTidtsH5DuCrSK+VgCc_m(=@9DT7?Aorjrq+MGb~D=lTB`F~^&;7|`V|44|L z&ox@O2qFZ7kq!AC9zQ^(%tTZ|$b8mRy43aoa z?CZ;v#jk2WQgA3{72eAgb?H`S)$)EHpnD}4o59R5$7o`+y#puO(dC2wIgXw6g)w@t zu(1-b&!am-@%3GWF{@q0Q^Q(QkM&94cK#TYH&Gpz+$Ifoc03keR=XQl|6rllu3t`mJ;7U!?B5|#zVmV24*;V6VejU=+1=ino_KjjKatYR(*UaUP zT>Ok&FXH8$fRy%66{j5)Yi7#gv7Icl<6ev z&-;lF*2YMybsJi`d6JKxa;J1;u8ecnd+}W%~;wb|bUAo?%Plswwy&d}hfkaAKwRlyh{s%o)f|kNorc!t#-7@oBgZC!Qt=hpZ94xG>NK1iaP6EzHb_6p=Ksvn`!=` zTdutR$*A>%==M4c4;^B=MeD+}3wAy1z@PE_16~c!6yGPve}{cKl!xKr zNkt7>rAxEj=El*X%fUmr%Vjtai**5ysOe`|j-#b&v|f`Hzw|wJuNGdT!ew&uiXP|A z%5zTenoWOsTi zc-SxcJXK$N`E~h9_DvY!>Q!&to%i45f5H}d?|*3AFs=&92}wE1uDL&A9Ez`dX!LMWYo1~kOb(*H-sN5^wK!dqoRN{BZbVDedT$x|7xRKOh2xGt ze(Z1c20>e8*>yb?8|sEdMknMl%?wqoNDRQ2#)qt-m+c}hEk~P{ zx4oCRZnD_?g!ta5sDO9JHS!o%@vW$ig`D)w_f^QKB9qGUsDos|pNY!b<$Rky&XXK7M^&Q~Q8WtNPJwCoihN4TeKnpg zrwb$dsfs=?OMKWH>o-evz4#(-GHJDRego!+*idWj<%hTYqu83eEQ`y(z3vBkb(~5W z!O+V-BUXd0>Pe)IKt0^VvXC8)rzc$WY4QCAuan|}aiYV$vF(1OZvFRNr0~q3@ASoI zzZ#HAIJ?HHQ@HSw%-*Xvn$a&A; z_e?f-nDHR$_}g#3`9_~U$=1uYSm*wS1Ncq4*G`mxCQ zNv3qt^QbrVTglt6?4*t#u8$3~?>a}3HJQn-sD2YWYb2cx17Y7!Y@IH_m2Llvl$*e^ zFS?{M={Pd(jENVoBmf+#kf*u|j*NH}T<3xdKThKEq`;R<@S|Ntd)FvnOC(_an|;%f zdbxokmmM13AIhK1UO%nTlfG^zF4JnYCnH6mQFGxp z)hZg-$kXZP(&If;=PVgRR?K$O<*SIQ*=4(WUhDt%UtYBxF?$TdwQJ7{T=F0MmOwLF z0)pgk2Iui9R+qfDA_>YbAVL$SLXDra+FCX1U!JcMrwJWJsV=@ za)2p{`L@RAnro0hT~awidVXmn_FHAJDL_$!OLBLbC895drl{Jk_@AKnUudFP^xcY7 zkwcibf7k6(+3qwFfi4VoydtHhLCF<^{y4nKQL5NBwsmK59y$6vC!~2{_l>{S+{tTk zr>F4$;(xdTkE_f(Fs*Rb#{iY0eO7W=Rn%w!-o4AaKyf z!iyA1b>Y*Ah%({UYX2|wZDjiS^Jio}sI23A@2yM}#1Zy;L5C(#2i6CKKomhET?LCz z1hU~pl|v@;{6J0({<0On)hpFK&WQmpM$gOpE0pc*|4Kv>#7JYrqx7P^pHjiT(PF_0 z+mm2&VFWbHGmz|10}_cmlzs0q(HTd6;}zyl_|II|xOn&dUs}6+1~mYkhygW%V<;LP zND;6Li`hp(8{bEvypM@cD8#Ca!5kYpLVf~p)#pUocD_UB#Iz#LIA>QPJe+ZU%C4CtA9*@;n5CbPh7&}VzP>)wFSDY}ndVF8 zqLUQnIQOIW-jZqhv-JFz%mz(wB>Z^gP`&VyeV(9sAVTZH-5+|PXAxA!S@ybz$Ct}) zn9ehF#z%V3_0qY*&va-YgAEwV6aFsiqKOzD8(S=#Gj*Ej_x=PH%>K6`r%4C~krG&e zze5FQ)xb*P*Y}spxv>A2i95J%U%q4!hXIN)V8vf?@=e2y!m5usarC2yESwF>H(38S z#Y4-mKv+iQ5vV9)gB14>+&e(mDuEaD&Sd0Zv>xodX#wN#Fnes66#LfCt~}kC-(iFQ z8XsB?p+KO56giWJI#T1I&bg>98qzab8?~yJy%PzsCh3tq!UGAI*p?703(AR+uE&J_ z)7k%9(B_yDd~>2j!DvW}BT>57;5Yhn-p@TP%ek(#zw&A{RrsJktbSDB4hd)0v$cm< z{O>H7hz`&0n?mB-E4jPP#lk(cuN8q-rAlN5=jr*8eS%YIn1gYB`q#T?-m**QhZN!t`*o zLc6h2H1~W~mlLhnQdoRS4Iu83>+1{QWy2{6$fr?{s+toP?{4tVhPSovE z9s+dB5)pl{ZITioHjWuJZse?bp5%+ZXZ8Ghx)>LoH@9L-dAsmW5ITG44GQp^Z{GKh zrSyE0u!(}=n24to7wmE`U$y{$#QwoHOKO%+twivm%F+^3lOQzzX zB)$QStSY#|99NT5Utgc8&N~?721_Hj+5${q=_1O@8Hvp7_1)bc!!fDB%199K<>4}H zp+TEzZmzF!^6M;_fS>=xdb(~&h+K4sSkwv{wKK#L z{u1>P3lTTOqLOO|>2Km;d*}(Meoy1AbTBpHOKQhfDdhSNvEIRDk*9_zSL`z>LR!Yt z+!qd`mxp?o6YCksu_9dcX3c(g6AQEcnFUHBYa(6>S=7R!Y~Ip^mxNP%IPk*sC1Bwt zdd6{{;)TFJc8=J@t+a-g@*K}U)(8Ca|Btb^jEZaNx<+wAumpk!2*HB|ZCn#vLvRmH z;~Hohm*AG*8rq_IaN3zTY>-{c-QV9^F-Y_paKts@7a{uEha=U<>b4 z%?Ysa4DzCht@vlI^&q-q`-v5x-Nd5Xmwk#RzG4q!Ofj8NY~VM^rHyb)a_Z=qTu&z!Z19Kw5rY|FUGaB+)_Ut8eQQQh#9tw*DR`OyJQC=|$oq=vWar$1fLPHz z$I_UbNHltBS(f{G4k&@I~c~}Jre1u2X{{a*t zq{5d|o6gva1bGy838TK$^)7EKwEe@cyc?~uL1QKRheg&|;fjQf#93!*y;KoTbESCD zY>Vv^?)>?Tr2J;!I>UjB#+A~<)WJXapj-R)or#4}m3jo_y4gRt$RR><`)x(%puip$ zv7EmG_2m*S1qp1Zp38*ha*5JwcN1ULq5}JyRJO`n6CcT$;F<+FqC8v4r(|dGaVM&d zkX^(B>xk0`mhsp>0&&>n6r)gl^kdz|?Ke0Rb(}t<*VOBcN9-R_ZSARZdbMk1HgdLH zt!Y`h4Da&2w9)m-H#c4b_f@8MvxYUczTPlcVR*ik0yRa}cc%48ZK|Uv4rAcc$(Lel zhUXXKtX4N^{SOgL(olDUP-#V8Vi_Lni=-JsdNi;elRicz(%6#39n}=}W~n;)mmapd z6(PlUJ-8{ecyv&hve%p&2@r-t-bjaaCc2-ki%l84dV@k8f@)z!N!&YDKsD$hM?T|( ztqi1wlNVr$tbDVr;3#1ctJOn{!R1W8YwfvCgVK}1vDyqrKzq|kZU1S5v0>E)>mRAj zZQlg_ksTAt>`t_4yp<)9S~BeMiSMW+2-Fc}al%5XoIKte?f4HulPwhCdk<3&dLCwYTBw zB-xwA`SpCp=6o7+Q=gfGxvWnM0b;KOmy+d`6HnTaQ&O7M^6(O=%3^m{wA}HWJ%RNA)b%M z?BvgnIahk{MW>C0)|SzN@ZX^|v0dxTb?(=X<`<|l|6zwP5lUn9SX5GyHnS-05k<=J zs~fqvT)5qV&f4#?xlH1AGy*p+k6h<+qO@MP?ioF@*|{(L8fx$Y6aBH*04Lo{PMbVE zxYs+Di`-n`;LX0$t^^_XNdj>ow)1@v4ZhAVk}l%pRsIV55yXjLdb2UousLn3zCQ9n z{N2A8^|v*RP7QwwGQtf8vHSASROF6`a}+t(_jGSaWk{#ib9$4jWg5lsRj&`su9s(y zs|zyZg+60p!IJ_U3;Nb@+FDNCVFme03Z@+CO9=gr`C2xo?B=w@^B>sajmVGS8)raK z^yT?Timijw^oUFT9Z!~v&(zeElJI>%`12WtS4A`f?m!tgj=}3*g~bLnIVo$3kRM_{ zm9r^ZhT)|#{>yXfx*i~bGe$`>EYCD&Frur}SG1F^N(EvaZV%I5CpaDS{E|tpNY;l? zP2h#as9f&itg-{?u(=V8E8()-fO{tS z4`QoQX0y_Vp+bJKIteoK$Wj?iJFFl5^)r^%oK1ybRv2lFc75j)52HLlOQ0^c&RI#w zw$Pu&KL`sNVLdU0OgagFOBJbWBI!RvGyi}9PG~A15c)1c!~7_m&XdqGvlxz|%nxVG z+9Z3Ke9|+K9OghgQ;US>+doGVVRZVJVdQ^|pj+v1^2h3f@{qO*@Qw3x2_{@i5&Uc3 z*FmKCrozrs5=HNx#LjNxYob;J>GRc(y`z9ES5yisos#kV84omiPJ!SDtfR+${1eDh ziV=uqp%n~B21NTk9O62Q?4N9(#}tNv6w6^GCf*aP>O@?%fXw|}tRj{|aP%L`@7vhs zTcK*(Z7k02wzID(|5mDuN}us2fFq@`E$tUgT*OpCs#0+tEVzG}D5l!r!;}%1#No!u zPre|;9E6)J2K^w@>V!kF$bd*;oR>zvWyFpaal`ql@$uSi5Hp$|5cw~ghb_Sopa6F; zTV%XZt>&iE!>*eT0+Qk9{K3A4$fNrAFIp|<(fnTLTJXh2TB?*GT$4@w-{rPuSjjmm zcX*c%rzqn$@+q`UNH|4;Hd>6p`oSj@UBd`D%h&UMy>8gDSy^IAk>t^F;P)-Hc$6UT zl@r7$LB3yTDdJ(ScJif?mk6X052Q$KVO72b_R$+;99W-Pe51kEo^~UC6h0?;C~XFQ z@ovc|&Od2fqi4>qu~=u~A4o&z8jqZ4ES3G^2!RK5vxT#C!91)fbJ}LvF;&9?r~X^-o)@`zpW>e&l#)KEn|)fq=B4Z5A}Q5|8N{z z>9N{H$x1F)irHr+GLqQD?@z;H_Ojc3&4=8#`juM+Qv$fAX~j*7h6B*`m_|VJGtBXA z62**{keb%WnV!JElRCWqP=z~y!;=Lt%gf&D+%=h%A3YKFT}=?j#K}~xD!>*|Un(Gh z=N^!Wvyvk(Fjq~U-20y)lLSKOuzkc1*EP-$_6&EF<7?Z13gvWMVR?`0mn3&r{xhhLQ6-d3% z@Z%3?w+KF_Sun}_-Ci=_`6gf>`F!+{QMF*FkCE+L7Mzyv0DDVPoIk@;^P%P@qJQ4v zUE-sCx5@`;>O=o5b5f5wFV-2@7hu`yFOVO|YPHcnC14dzTZk7(&}QyoG042Aq^`8> zdgp0dXd69G!ZiR?%a<9|d~sTUC$SHz(X8ev^p3?U=D%}Jl^A#8rP{k|S?K3Yv20!A z3vLs(U+?hqLn1wS)6>)A2|KRe*x2AYLUV=OrDGz$!p06979i~q$p%A9>-~ZSY2?BY zxDLkB1X@#S0vW9T7$n)|r>za4EN5m#K;FM!N-ip$T zbI$5KKQ*2W?~C&ce(L0nW$PZ?70MqpkyTK@e*OAyo-0mj&B4Jz6*DNK>9dSzN%uyk z5n5ZC_x(=7v=60poVZ4%cIkf{plQ70%1iY9)zbSGMa(o=n|wf>qA}cU`9EU;ndV1u zh6~aJ!jXLB^u^vh>ScGV|7CcsJ2de*n?lsM3)KP`>0ioYQ{OyBnF*@TgCLI06wdIs zR?d=EvxG~Rdi!w_ivoei!7Ir@ckH-Iv zkHfqCkGtQwzy7aBkCsi{{jakf9*Om@Bm9}4<6nM2=l;O|)o_*14toH=RmJ9SUXebb zZzxr?V5H!IW;xkczjPe>cc4nX`&u-XM&+H(v4&yF)f4~mty_zGdaydqKT^ne^arhJ z@1ce?o}bw|%@VE^W(OE7hyrOs79rFw@qmj3K`f+FkyB#J#u)Sf#jjt#s;LoR&!uE$ zW=2OxLt+FX=J+Qzii(TLDnTp?|Le6XU;ZOcWYuIQw6ZcvUL9XF^RL$hy3OD~cxn}; zY>x9Lj-*1l9i_<8eCzoBd-0oshK58mQfU(t6X>t@K42OL7IqD-xP$~-Q$gek1}0{l zsXIJ3dug2ywFS?ZK7GASFpsKB{ z{ZCjN8)XsO({PR=}q6J$iwpwmm9lGTpLQRZhP_nYYl0VmXgvG6v>6m?=Q=`fB9Xb>V zWLt}Gl5ttshr8AmHcc9~V?lbt{u5{}-P+BxnaBG<+>X?lquW8X8%bI4b=>UhGVP)2 zA6XBfvINuEL08(Vy^AFHeEi_Yj$LBR*#U&?yISBDDG$i)-6rMnv}d3G3>Y_XY3Xn zmu4%S2FpA`+Jq&w!+Gu1y-P`rLy+Y;kTw-2)&$o6knx%U;V`V+EQ2S7b zsrF-rk1}*DOH25@1hgasyw`He!ru0R>$ZUg#;$t!M^yHZ{2wp3EMm&;BEQ*NQzRD` z+etTrF~hSRHa+|b|mE^5yai_WUIB0ach^n~`%a>x#M6b%^2w@~O?frXFdFm)7ut33S9?($u8=zWM6-&<}yFx6T(hA)8HLAMxmKu=H z>KX1l>i`gh0J}GLNO&iv-Y+(szX?xf)D7ArIp9+o*Ab#hBIC;6NaOB!UT$-gltqg` zP`F$HQUe5MNVKU>9@v`Mem<&4qO)IZBuv-#Qmf#zK=Qor5s76y5UQ9BJ}@`&gqX;9 zfC)lcp~vOH~D>CBL#UuBUdj`(1*65&gEw?*I}pJoxQby8^rI zY~EWb`+CyGBr-7%f_XZp8j{Ar6hXRo8I``(GuW0Rl67^UkNKSlcY-j+gEIjv9wZCB@kM0Rd%^r}ae zgOjKi(KXc^b3}J8$N4!-{dozz@ODQ*#jp>0ulZj({m~tO%KvJ+^aqwh;ucN2VSh&p z9|tz{qB7PGC-}j6p5pbsSrCtGN*-quXmJT#E!JeiexMG@$gtlDsO^dWM>@6~4%}lK zC+1)Lc?b)~PR*r=?z7efLh<>q(L46EQ2OpL8cxu%6^D=5L~jZv$(cVmU-8$tNI^2G zvKt~Igeg_sQTcNf)>=iK~M(^<{KI z#fV=N|EG}I?Fr+cmc>1i*=;gO&ZHwPcyOqs(}^sNygK1M=D$w)wW0sM5S(Iwvl2@B z*^4$`!*Zf$hQQ*h%i||F!qZr|WUeC8$nZrV%4~dfI(p)K7FDQL(aE2G(JzD&E{0mu z|3p4hlM<9?M)9on#W(!Qe}04sUCfXEx@^{5=3O+;ZlTPI3gLZMIwJ|mUTZx*i$3W| zAYzW37%uEzt=5g-9w*=!&x1~8JwXyn>F&JPn7e5h;LX}hP-=`zY(Lq`G+o`64SC@B zkCJP@0f$(G9ypQep+9jYJIXsHXV3+4YtM5#7E0}OPk#_LMm8_RoJxe-e(=Zq4IlVY zv9jKxNI3#q)pk51nM9GUbRw}^O`$kuxmpYkrAZ&9lE7X6yyAFmW5RU6K+aLhO#0PL zxrS`JDFo4S#LVtk;)G1)v#y!xaSjC1v&VQeygnjX$G#3O#tJ zsFXb75^*YtQ^cC#}hb&<>} z@`mDpVw;@Hs8;80rmG!7MI;QD_*(gmQIj9zkM$$QkCD~yUQZh6d(-#aoTkZ_J~yr( zoMwq7C~Q%ZIIx+-d>cPq1%Es2v;2@W*;)}eY|*s4ey1T2Ti!@0*!nGw11l^eIbQI5 zfuDPvxYPDv-|jC_yHvbem4&wJ-`HFn$FZGD1zf0_+!3~D zBCZ3+=R33(KkA#SELwB1GpCJ>7QlzT|0%E&Q}KtR89aL~t?R%aOrzBv%M*f*WOG`> z->LO2yC{_0xc4foE9x&GwVmJcz7+(DAjf07izZJonfZ3T@%=Xfh#wPOV`{*yntOGZNU$2sSSUdR<1&kD&? zDEaTscDBtR=@ME!6h836(CyOAD&Z=N_32+N1SMMxAh&4M7cl=@E!d3UM z9;)u%^lWr;PJP2OPskAHMLY$seADED8z>BDYK&CV-zDi<9i`4Vy6 z(dsvP4E8$baTbbTJ$c;XwK$~PgfhbmTL0OXPifkCSrWkQU?_TwYPW1= z6vgAma4CeOdQ5#0?Une_sv7f4nmIrHSHUlj{I0an9YxgdqAi!Fh4z0Dk3PclkbL+M zN+k3rS^PCOO+d7X+v3YD=+tJ^th$h91I&?>rm=T@n+B*B*djvJ)8_i-g_xe3yxs;B z%bYR#v6m+Ra>QQ;;}ABT7iW~-M!Ib?bwzoUzTER(6MwN~-H64YoG)(7rcxf8a9Ke9 zI8At!p@_+2?KYOmX@iy#L=<6AYsONG1?99(Rq2qcrfWF;yv=Hq(1N8ad*yUc9d)HG zQcU3_LBI;WQP;Smz54w9plgGrn?TRM#)Puv4bTsU)Bm6~r^^YH5h5fojPFIiP&pK( zY`7ZJ?onOYUaXM~PEb*>UsFR=cpexyWP2zcIYHKIZTNV1*TxvNedYD&kSccQfE!k2 zyiwvIR2Nrg(*5@t(-S}ll`UTd->Y=LHTsbkh?!hjX0AXc(#LHk+)B)-%MC{dEQ?&Ew3r|Kk^xDug@`USUj1d zBR$@kTt2*~a}_<@E{T$bPBbGH&j&!6<~vSWJc@?7U0kTZ?|C?>$$RMrMxCd;@k5WkW<|B__#Fj>Nb{v}3|Xn&G*{5hAa7(Zc@n=zLSc-tBQ)Ni;ZvPH#A_kao6C zZgOsX`alrmxnm%r_w>-id4@=Od4%4tm-=KJPi5X#?=c>DEBr`i#&_(tFvHfB{N2mz znK3`LE148I+;C90aqe&-skVOHooLtV83Q2orOo7-n#k+A16jo#2XUtH_6OPF>{^!< z0%gzTieREp+88?uB~BWD-0D{Up2jQP4}S&dOMu%SR62&L({ssDH#}4pM`nv#qdw)1 zQH;Otl-k-RGEA~MWA>lHAl7(8tmBb;SF703G}iwiVErS?&agS9cRaEbcp-rqPQ|IZ zuVzy|@>ydel&mN80iqfAfiMXv{Q~{4kH)qL%}rS-60j0R?o2J71I-t)&fhLp2zU39 zV3!DzwfUZ>XwKOwcusPEk-O;(twelHLYa4ZEj@eM_XRmL zEr!|w>E&*R)_^4mZ#1G;Iu3Y8xMWfBtw@Sw_h`e4owOGJg9~dfTjjZwg6mO;;{gvI z<=U;ZE!&#>J6q{OG>ep;VphiQI(bw1SPhHehs`engkv5wZtqq-^gZykL~?!M$wEr~ zZ<{rjons!SFe_hM(H%a@H#~ei_=_5NH0Kx%pdX06hi2b0N9P$2%ueT`-U>bxhqMn> z*BBnmeyP$>Y;vY*gvPb5d#ra4=X`Y&uEq8jWWOjYaVSpQS#2KMI|nT-Pi9MLl<8_| zYY&CnBS==5NczCa(2Pg(VNG#*pllDBr#pC|Lk~qSr(rXmuMSK52n4MGLMj!T>T|=@ zq7%XwHe5tpNlubK?I=npQn>x~ASPo;b%|#`Xu|R<<EH>oOF!Is%z}enoTu=vLHe%2(Tn3;vp9 zR^8cu=1vqocS99ouNx`C1g^Bgv`ec4Gjze!qH$fJ1*@jN#Iwz6r#TJP&?Uk>0suR? z*#p$IUW*tyj>?VGl?69=)XI9_3hGRhNbY`pmb~jUk3G0^!)~X1KR+iPnQg;9+YWPD zPh*PDyB&HujImdONbJnsyBI{sF4ftHNjV{dR~BbA46xDRA~PN?0W%Ee!)EXfHR83B5R(h&!Re_=Isk+F46yXfp`(eKog;C7-ZErpfRgBFzY-7A< zCpEhAaReq$6~I7aDNZS5TnzhO04{-fbRJ%W#pO8z?-di9G6G#DhpQs*%Wqfw53d`ae{om`6@2otDX^WPx3($FhQM_i2hNTXoY}?- z`%P`2+mqd8o1!Ue%+v(S>zUG;ugE~zFO~qrztPYrhHf+IG$vGWF-=U2UAEyVssd!$!wcH#MwHbE0uV~evt49{{P-en=`AuTvc7YFY3P?UTJ@@S*+QRGV+#tQ#0nim)4K1 zAP2iSu7;;of>YZal#ZAq`)l@x3$pT+}sQe3nRxt2h_VN);&r}6tl&d z#de}8Ne-7b>?U2rtEID)-RRglMFc_8nn{huH+*6-n08vZD?`F&JtS+%6>$N&i+@En=w z_QY+aebxP?7YcKf6W5(u|jplJwIE%w(LH3I_cQx&3ljDqCF+kSr4_GNBesT=&! zCPgu^+mLJEIreb;efzCb|CF_@9%ZIAee8~sSBL|_yJ#b7&zoaENyrei6e7w6Q79;N?Wh57OiKq6GL-JmmOEn%1_gpxCCIs`7haePv0_s zSYZ9ur$&=os*{lzgMKBu)QDmmp}a@{-gBBCo?Ug`V^Y3+lCEWLlXQ1lJ+w|ChGA|~ zQF}UBt(i0$itK)r{ce0}ei_d&$838f_z^6LMXghJmY39emGo!D{EmNTKiJIK;9kC! zOk#kMG_%!|O|OlXHWOf^l)`H=d||bjwGyqSK<*R&Iox{j4c%dr%b?$%+X`#sTV{Iv z^kV*3Xpv+tSuuUD*+xIQBX(a4r8JE8{-YL}1~rxKo+g+jZh_VjPCBzv>Uhj}UYVPH5d50de_L(l4cpM$URq8;^?-`1uJoI zsV*KpLHn;xjAqW>eg4aWV2&dUNSr_#QyTAgx0q?7=eVGk-=v*dM~U|V7>J767DF)U zCUw4QO4XqF4UcN1JpcL#nb{AqydS32D`&DFiG|bu&g+}U$1?yf3%1GP;4SLm%d)he zh!gj%ZFgXKBQAYD+~-=(37;PT3Z(Wk@(PS3$0F8_JPnqWU^adgx9 zbqaSFwr&n0eiPd7>hXDVM`b+`!J`zq0qO}*k1}Yw$~47#wX7;$ur=0gNCj6fuIl1| zR?9+QUh)8T*^M*w>s+)jFSp|O~AI=mcYS1ZhOso(CS6S!s&?c zi=W74r%6@uULfv6WRg_uGCi#~+dGK{MHMJ3#vbl~E8(_(&ef{}l+LZ7Ie~X?x5He^ zRGy83(MzX>54qJ*uz*5-_~EH%+lXQj^iZh6J)@8Zyf%q&&DRKz{YDH%M*Q^4C=Jm> z%U-t;&pYdub3>db6(69zahT|}nt>{ZXScQTc@US=c7U3~{BuK@Zy4a)i50U%rg_wZ zvkCuC_>Q~h;+Vk9M(pA3@hh1Wywb{;a@vN}0MhS_22tL~u2JEGSeub;G-5Hv*Vdf2 zQh|L24t8is_T<-}AB+qNcHAX0ZUc)bSLme_FSbMwL|#4)9fZM3AxD+XDE$GSpgWzu(7L2~Hmm#^IH6gUmjXL!_huIpL|- z<01D-%a^isUuX_efpHqk9<=c-uGf!ALTyIKVM6Ep>UY^vSbb+k0;tO6tPALPQm=2& z5*!;)qP*^UL)^zJJY6zA$5h1FJB8NUsUMhLOKVP4@HoG!zjpW=r$JEi{Me#vE8bO8 zz?RXW;=Hq>A^0}+X2NoZ#A_t~&!@PzH@J5Axe{9B0y5IGQi_rY&zq%(9!SM`$%jy(sm|0opE1e2%PCgC@rJ<}i13V9c*}@R?W?Kcaj2}Q zAY{EJrJv~;MDD_0xFfvop0iRijP$qwY#F=tDxG)~j;r_JGr@(`!&d{$qc+=kyE}bk zLKNa(+zh|O0E^rx8Is?3QL0t`DT^bNKXmMnJvsQngXO5jqz=;d&$h31=&Vd zigI%keQkh1W_3aLi|g&ZfyfKPtHQo9YL15{i~UD6CdV>^86HJ5wiz z=6bV7AM5TGEZ?Sv_g*j)+1Fput-7>uX!Ump-$1i!!spySR)w?nn^eFfD;5w0%q;DD_Y7$rZugoq~dkY zcCqxw2g2)Lha6z?9zM4_FI$9UcL&a5T@~-o+~jeU21TDRihvYS@pCdDyE-J zM@m5}zdutbmNeY{AR#5X6!82-of-3_!mEShgD~Gt5vm*Rv6)O8j~N4+lb>No~}v zV6LEWr2?`&m@V4TvEgyJ)$;CO@Gofz@p3Qd2zV)6ZbVOQ4N8HlxlpX4lClxE%JUA{ zSEUEfydH3)KOo~-AfhYia;w3pMNs|Ii-dcjm_3maj=}1_{c2;VHh$){k>p85iJ!kT zmm!<5xSOfoh8(m(Z!qar1gxhyOJodFeub8_JQ|id-s3|XRQ=!Zc-54UYmxD|P^Jt2 z(0m4{@J*uw@rZ(trqYvJe%qbL_A`!&*w^nYkx zYXIv%=QLK6-3Q_HD@#SZkAJz&TNx>^d$fX9gv?!2=d5kRg5M{;%oGDNyly%I+^eO& z+HNlx*c`GS?HWlqw!@n8$TY*-R0$1$tcgv(GwLgSt#K%m+b#X;ElXi$mlHm=^PhF! zj4~cB)?@-=jHq>4A9{>_3-t`VJRc07fD?4xU*5eC?R=bYn|}oi16+Jc`|DK#azbr1 z`=(I2En(M4Cb&vjX)Erb1uoEY;c~zDn>FUI#xN@{S#||0A2g`^*dC;-q2#P)pp@KX zWwk~LRc)Ev8Iw{jBCVmGYbcXY!xLG)^guHK{&2JM#U0+`Oc2hd+>IAC#G>lAxcfnk zlP&)jzF+-3@6HB0vhX8qU3G0qcJ*b%C5SllRv*O)J6K4+1KsSpnd6Qi3Vx~~<6-vR zBJwKEoc`QGm`&N{J)f6PDK)O|akHP^?uHBCVt)P}?seDQd(eV#yDjRHiEIWjK*A5U z?UNVv%B&86ADW)lpReic7z##vDTM|39Tg51+(Dq+90m%rt6pR9{k#xU+-Zil4&|p7 zmt4@TK4^jVr++q%$jh?A@WSTn%zXo|+Co^xWx1ybtM>!3HANEacpXI9xA&XTD6W;h zK68BC=srdGash?n&XC7sy97PR`o4cn#57(sd-tu6HO@-vc~d)!Sg$i>(449CtTQBV zvOAmq>wF#o>O|8(g-o2`8(4B0^52r!qfA>1IU4$mqlZ1A@uL*pxYBoMXc&BSIpe>m zE;QCA^4`>`eyD}U5;KYP_}X1gfU=ZO-tyaS@A&jD?QIT3nWK~085wEqWIN632hF&Y zWOkDdTfXboj-!vli)El(7WNE7>Yq^d<)P{~d?iA1-C6kaWUIXWxq)p?rE}9H;5&Gr z@IFT5*DWVQq#?5X-{L%3?;h1Ee=Qx>rn^%xW&j1H?+aR+VM`CH~ef z=D39>t?8A2Vccw25Yp5er<4F9mq;)!|>p5*dP}A@ruNiO@Y#U_wy9YFJ*jz!+Xpl?7nht9P#+N zBg4Bt+$gRTzAO#gs`7o%L$Ff08s}!=4@V`k(@n%L#Y&RuXe7evOeBvkjB@WUO!jlZQxIUk8C@0TkE_89XGU>aAKYg~*$D9@Wg|sLx zKl_q8ISA9v+dgc2k1VM^Q*Io_4Sa~t&I0iuW>!+o;XdCvhV4j^C8V*KjTp%s>hQ4RoQB5z< zm3V$g0o6k7-^Sg_z^*2v?(Yg8A|SL-0b8yM&B>8CH;(D1;ykLoY0<+!&^UX&{6_o# zA7F+Hl;5aE@pQGdG0W1IbZBreBr0le7cw>&zh+@^Z8{~-F~2@&(MT{SsJdD;RNXu4 zHEdHhInm^#K@Ep=g23Ok`?-L(Lqh)oHu#F-;z&o?Q~b2Fw96CQ&ifNt1qHvz6p{YF z5sg=O9O-bN>aR;r_2B=YH{#HLup!Y87Nf69|Al$D;WXm^H_Y>Y8qR1#3yMmm>r58# z+LUML>~l2hthHioWO`_N{IJ&?j=jAZ{ewmLq7{BRy^-BQ z{8xE=JfosmsTk&8-AJV$piL$uC}VlNqAot36=F#XC_QMuFmVg88P&^#$ReieB+jsr$o9oLR~=O_nVz$dJ38PeEfg+Gv$&eJgI-Ko(=_8v-t^im z@{bG>%1`7(h;t%aVtSP zlOYZ>%Tiv`m+?^-Hw0cBw5B3O?^Am40;OdGOSWlK?N@l|jfd(v)*=1=wHsH(TMv$O3bP~zHpfU|&WZ~J3Bd3{SPcci!(Pg>aJ+67x~ zQ8 zwr+%TI{x!qmtTaP;(E4nwZ({~oJExUU{Ax5YPykava;Nd4P};<`p1d3oRC z53Rbsx|ZVGv*=JS1D!JSWcy>cXWNWqkO@`eV$iUC=_tu;q#yj3@jg&+e`iS=WjW0t?_J^p;zf+O0qM8er1 z`QnYuFc;Pge^4o|)wJ6K0UNCl0JxeyFRT|Q_%lpCw3a~HDUex&_vKoDq4C}vEG1aw z2}!kyN`F4L*`v9RJP^3dMZ7#wda1od1Rlv{TnqA^7R?A}PZ9PRG#c$>e8TtmPNyAf zReO9OycNa9Op6;8$=3=yZPI((;2S1fmEVjyWlL__98RfQn<{%sLS_SroW#0!tGTQ( zSyJ=6$;0U)$5&2@X*b3fb$0r$N5Vyd_cw9*rL9k?V&qL3?n}XC3vzZPcWV4QxpQm# z6)w(mh&CSKa8W936CiN-Z4W13-|=Z{+W`0ZQgp6uP!DT@Kb{JI-d^mLqkMDAO0D!7 zc&AaYco`VtW65%{Y5|T-M#9w{1Xlgao zb#%OFK)tz&ir0%^vPSB}K>I!%MC4J{)WT$!H2!q_Zofgl!{uD?K2XlX51244a(MrU zXHh?z%Wj?{fyB!RF)P*k(@D-ySWPtQR@%uW{%NjZ7jW&9QD@SG*|%-=%0;2|2ea0t z7@bV>k6j-%OhOHO)+(rs*tTrHpPrEG9G5eBeNcGXLYJAla?53ZS=L~F1P{ZLm<`=u zrNujp<4pRz^SL5`!GP!j-qB3i)kBEw^CB&W*0ASczs%H1nli##_S2 zmQA;>rj@L!oK4}L9$VfSp$AsdC&sY{W*e)3MW{3(=qAq^)-5vFt0@2$O2 zW3o4U{IF}|aRkc$81t<2(n_-z-gEv3=FyL(TeksuiBC$4^L9UfF>{e`yswvmRaZY> z&w|G&JO#Dz2x!#lAGY_Q3t=A_I#zo^wqnWfs)2V0H-{DXh+KhKyjRU!z^S znPz#2a)@Zg?U26lI9N*TX!$}YuhXrN_1&d+<|LrUY(yp_t};zWoeKVvNH)j@huDoQ zqB>cWnvcm)#!zf7FAu^gA%Nb32lAhe)dq!hAh-tVIPS6qVSv1 zsy@{C_OZ98aQot(tqy!S#fj!B^7Qv$&EV`=V{6IA-Ff*^PyfXvw6b521H8I)K)HPV ztF>JG=J#M8IvNX)?IfAz)c~f;UpWB=lCUxb*suiWT0~~F!*+f_s2Vp#A(_MUsj*2g#pa>;d0&|KeDXYB z^M$CC<#>Jn5bTD0r%?W*Y$JVJsV%&y3a?CXok+rtTe9H6!K%k@Lda9Fvk14F(t@|^ z_um9beC5oI7gxxV?k&5{1EKOI87ED!P0AOq+YJdtxx&QugUcMM+h^DMPclmnO6ki2 z2G1=z!3~=5;BmPtqbaSH!*Tc+t+|`r;*m;EIfCT z&i&La=^|Zg)T2B8vjwZ!^fnMVY$F2jy~d2(X|Hu8co#&PanT)@|5SR(3DtjayGgsB zZhBrT;|Z?iARdrDP5@_UHZTi#MR}@$ymUd5d9T78-lfYTJHvxfG{(z+-XN zOrEaAbs4mpCsAC%gv;-p5(9aucGnRkF!4@3JbY|tN@r?un(fp>ZEQSMd^s#zV_BUW zf3#d0-#Sg?`aoZ%_wDGEer@*nmsyiB)3KutH*=s+2K6vcUD1&2^ymF2rV+lQ&BZjW ztLqEoz0te9KSg=Xk^0W#+rG!&7UM~Cx@XMkG??GlH9RRdb}4-Lj?hjrA4Z9RGKxVB z?LS&mFdkp_Np8$xtH#+Z32yf--0Bs`1@*1o@l>X08RLM!xF$Jl1EkH#a6hxJENRj? z;jUJlU;J<;+3FKm**gJf^`iDj5f6O+YX;x=yg!*rbJ$jyk~OIncGn=9sa|6>++U-% z!?vf$5}0DABa^Nc^-NZC>IEGr8h;N2Nlap?3acBvm53crecT-;@^;v?=J6T|I3VbIPv!lvaJ$L(~4{Ssr!IF@NZWrYZj-P+f_?#0pVH4z(+*>odzkRb>$ zU-f{(D2dDomIUf4b$M5LSuGtv#!WXKUc1F6%N5y7FPDm4zSRBvb=6EWvU-T6{_K?; z7_t1{cQPl$kmm##TpA!DY6KCM#BZC5XGzHBtm z&FiyaZ=H84Bsa{t~~Y}{lmHeq(~=`3(X;AXqUO>4JHA+-CdM_qd- z{;y7z$)Gai%q}UYA6pxpvi4>$&Hu#U;lzEC}j}jK5-XJAJo0f z{ty|(3Obil{yJLB4$5%Gpmn)HdqZ#(6KIL~pkz0&=T5Bx%I#LC?kO$QR@Tc!)(YFJ zN&zG}5tg`|laY@iqzX9P{HEdmli5>=p{p!+cTE&kGG8TevL7QzdY)Rh-p%cHl4idH zZYO0gvRS>lsWlzfhZz+*w&*>+ZREPiRE>1&i7$}#b6s>Y@Jx2SOO~Tp#fkfk5;{mn zp~tt{hIeyQ7F>3eQgHpam9q6xyMv)oLbpMb=Wdk@n9PX{OKVb$s&MDXiqHr+&e1FQ?wL?hB{#WHWmY z*IK9P`8^4Ade434m&OKdk3#~(I5b2gm$Uq?Kc$^jR9oG< z?s3;5#ieK|?(P(KcXxMpr$}*kr?^XTD^76;5}>#QcRA_z?X%Cm_>X;aa+$Hl%F4{N z%=dYI&zSm={~}tnJ^W_k4#8Diw*s+%x7xDo+uJhSZOpWA!oYwecO!!{iL3Ix&qz(b+2{QzN2F_bbJQBCu8)yr>Y9q|vp@ea1yV(~?g$$W!n zP(LT^Mm+6ELve3~qriRct=ifjG@;bfrzv~aJVh_}{x1DH4Z6mrxs8Sz%hMFcHpcEf zxzFWls$bu3E0JZmh`Bp$r#ubQ@&acJN6)2s=iU|qH+i>#ZMr=tB{{gV(}dpM$B8u{ zoaP33la-|BY%$_JR~kVcwRzOnQP*-gaB9yCQAK{%-R9G`%sha|DbICOPVjgg`8HC3H)b335X+F{sk;d%2Qi%I}$4*Ifs**)j8tYt|2oG^A75mcp1E*0r%P(HwjWw5g>2gw^G)@^# zhCS7witx!zZAQzf_EASeTX)-;(x})*LbEbQIiIOXIZ5sZ{chg2GoLk(;p*-Dm9jt6 z^Uocre2JMZTvjt$KQi6`-Ac@*U%A_i-&I+-KPVsj5%YvgaZk}t;x8E6Q=_kh~#sFPSWCzb~ zi|mbHpl&6jr{jidz30@Rz2$}n;BJnhK{|n9z2T-dboCOn;r0mcPpWtMT4rB|Q{7X4 zwq@uG{HX0>&hNTZU7an+<3f9#{?2FlZd(2(MyOqw`iEF=xq9VJYkN4x@|0$3dOqt8G(L{ zphyARI?zVoNH%^)q~}ZbYb8m-D64(7%lwLuf87OOBLBV>T&SqeqqtaGCb)a-E?GL2q3hpyG~ zFUb9kLzW6FCoS!qOn(9x&lA4m@B*u;A6YI5TQ@qBafnvAUsLiOGR=#jYq-x4* z)j%ADD5}_YWZ>K!ImH}L@T80|K^L+Jm%XR_2$YFOX*J5v$WT(z8^}=usM$5irA=T{ zZ8Go5&o2-~3>vGY5bTYfu6R|{aO=jmrLs=2nzaq4<+iHSO6}1(YiJCqY2Y=WtyH@V zGiom4yG<+sVHZ8shNlDn5w zDIGC*%UDkzA>>C$xt1@JEWo5m$StO&WORmqO zvjl@?%N?h+Vu{K;Er)!0bzj=|45yNIym8@WI!Xb9t7c{5h+}4k>k9i+85?+Mdq*{r z#SN;~L1UgAXAQ}TC^f#CAT(lLY#bbCG24<%v-Bqt@s7;F8A zrtRkVz|htafzfOtT&_9Mnw+$joB|mSii)jccF}5e0CXA?!m$vEFGh_UAeze(B&ubqNtLWKR61lRGkhLNLOGsR3@o}- zw>2>_$>y}rpt`VMThjT`=q2GH^POj^zElP=W)KRNd?Kr;r5^{O_ybH)_?`^CA61C% zeM%735`=#;41}*?f5E^uR8;Me5HK=4Zg%4PQOtk=hA>dDg zB#`J=lY&!=H0MFlC67Tp9`UFk@yiaY(qUz>Q>w+|pv;phBL`H`wItg|ngL~UVad(? z8q($HQ4Q6Mj~gLd8@Ip9R~U_{(2LEBr1Hq4{>d!eIU%QaVok++(HFL2j;O>?9ZokC z3BaCk%OHU@lr9wh64P>_ZoD_UNx52Bf%MStnB!~~g;mnN6D(^&&rg_TKsb>izkzB_ zKEd)`VKK#i*5;qmg_2)#)JKb8wkm6UhYWIiUFw)J8-;RJRpHk@O4GwsoV4J3Tr+j` z9JG~PEJ}#5h=Q~lsYcb{Ood=+jD1@iQ1muevmD|lC%T~{vMf1axC%Uf*@C4?yJFgc zTT0!~$8MF7$IY;4eP!X3q0prU)HZvT8t6_@PPw+i^bG3B*=7WhJ>l&u(LJT@LA}b^ z!Wj5?@&Nq-c&}V9RoOXn*zn5fW(7X^CH7g`0(ZFuUNU7ej78qoL5Oas7~JOgvO}$w zEQ_%u#ADbk85?W0ulPv6)$m);L{MQxM@w|z-|SG6goVowf%?BiPH4%*h2f6Sh=)E} z5nI8R#n?kM$D52RU@gXxo0d@Lpir_c@)Fn(TYaL7I?>|(W}dD~3z@5SQh;sYGMWaC z+B7oJfe)q}$}Y3>qH7>Z)skbdBBq!ATlDF{ix4q9*M5S&7=I#<71r zMrU-pnV5Ny0H&-;qskpZEw)0I-s2ZK)b^(c2Lpz|V2qbv$Z6G{$Pd6-DKGk)ASA4^ zNGJqWW6Fn_IcfCStnx^anoIR8;Gv?>JJ1Ls;4s`9frn=#c+4a^B(Rswo`yXsDB~yM zwKS}K43r4l!AgVaurkD^7lcUYz>F>&eK63Px41o}zlT;wS?&2-DWAIC2m5$Xi$XCvQ8`;}e533KV7sJydCg== zq?bx@uf87Z*b?W2Ip39GXfWo6QsxgVj=k9ua--2YQw|ixA<# zzK%XesGZCzt!t7^#tirUfo~~1>W>3GAa<;8e|`9~iGi|*8Z+xvp-BS6*~uJ=M$cL& zvrT?T6R;7JIXl_?EV#OPl1~-N!z}A~>FxhdX-)~1yQMxFPAy)BG`&D)loe%S2$dQ~ zeKDu8I)nxpHhxr80GixrK>X}eXkP>6g>^9c0&fz$qnB1ysVrv&5yC)oJmXjdWs6G9 zV8OM3pVxr}=q6UlJ2aVHVcsrgAB*E2hSYAi3<6qU|J^_q7d|dd62>Ib7AZfh6b?jl z?*BPd>^ztT?vpXDo0$8~HwL_O0akXhucDsx8U#%sv(1E{!=Ga&WBTcJ3E*z3`x`QHnAsW~kVdfLW`4@=1Z}KC7c5)Hq122+2uY)`?F=FrP_o;C!7> zR<)p@j5eVWx$%VvzaRyD4WhO{i$$hDjE)l7HCA9J0{m0kL?E~FK*(eGiG{F}Yqyee zm}@+n=+jr3O3Iwkk1nvE=LG-$@J=^X?(uVXVa)E$h=w zATSZc);HidT4U|pbp2@^+5OgWGTuk{fydt&i1~^lLvS0uUCBitPa6h@vMwr*fI4Q< zZ#7H5iw@(A?xbQsYqi~E0Y?yY_H)+j=d^lZ>c5hEh@LUXa`_zARq}Jc^eweh7+TVt z9HU~=c1w5^3t$u4?TG#5_skBQ4KB~)0(Yy;ZPGH6btjwhCXVbZYe;WY119dkXa7qI zp#|ucJty0{Z2_9l#~o*21m6?-fjM~w?0E(J&7gjL#0q576|b|S!AuIUNu^v#%g9F< z`YMb?%ZB+95?|QxFwUo(WF@}*8{EP4f*`ivxZFR_S2y0rLwymYU}&||+5_EFwwua} zk`pkCEF3q<)N=h5n$)S!ABKqSIZdRd1+80qus~w}3x`ekecA)fTZ%ly;cAyUwELyx z;r%aD^R)JDme)}MHZ6MY9eEgc<2=6tLh5(|tFQnogmqXrh}mI6{99ZY-dT(rxeG}y z8!QNc@|i@@1TlXVzOd{ceYvpUUgb2`M-v22hRK$E3Gj0zn#QX~W-bsq{te3RCqYFF zd4-Bazv!C^z7$8C83D)B>O|t;?&E!*C8FMXbGd@AhKr5ZNx-Lo^}1}l;KvOx08N8} z3Q9@$(;e1xLmeRVj#%1IZe{#0#T+plAb{WD#3%aVpesjF3UayV!Kf`L1{T`2CVzG2 zlE39~1?mSF42W!+6-%!dHs*nD6_EO_SnuXLgwtCo9qmw_B(4BIAx%6pC`t+Y4QZzy zFG4}+aU4f?L6q#kEw7fL9rtTKcf@X3SlG^viAAUby@FGJD(i#kfoT3h+NPa&GDvpg zWj>wz?#TTXuCyTgKEHov*!aM_mY)Y3>^pw)*MzC)GFjKH0nq(oYPfKfq##g2=L7A|P!;r(TEPYC=JSMFoUkqtSla zJ$hHti`ud)1s3?2*-Xs^5g_QZ;1My)GO@F#O3~ADg*_C(JOo4EMMh#k4uf0mc={s)7HGh*4iHfj*5 z2Mtn-!k9Ae;%rBRbuJLWD8RTDa|boUoBI$y#-;jEwSVbvPYg{r=51XExYw<*l1}5UI!(*qQ}T zF(hR1jhPAKJF)T#&BirWs8ElxZ=TWCh-VZC0v#F!0X1RkB9xZ7>-$S$x|I)i!0U;5QDaWZM5qeE3zL_7KQLZcv9! z7poPE5*t4(^{SlVV-iWv?mAd-(}%2B`%mYzc#s>U!9pYY{W%ngct2?KFnu~xk$@5b zck%@OQbCd*du#rOy$1vvc3g}jLoj%aYyBYMSO=6RLUhF2-Zz}KL3n9%tQUXOfaNB< zjo|aJx!HR@6GV|v-2+t6pbT?f^jD=nmBZg)@q2fBZ<9coh(be8y}1OT5~BJT1zc1w zgjt$t1hqvM!17)rbPKi%5k#C>m(ZjB(=RiPuBFHxS}Gt8cL%Lt35^Mx8ZK*A*KtC( zvq`OBh}?z|D!2$RbsD+ow=vrag30JTuk$g4Y$7aohm@b)iPw#5D-kahd#xf>+1M7t z=|rFpJnGnuF0g(lKo}atNej(Fa}^8i=hMO47){^!t1o;!eGwfEgmAk3(=wp=l)&d^ zoL_J05*hq;P4EGYzCHWiPOxJa@Y4eURg$X?3-H(K11y1Bl)`CWFCc6x7>DM};JgT` z{D8)*v=@@M@+V|F1GZCD$Vx(gmLS*J)FNUz4T+8b5v~?7FAhr*JQpe)HD{~{$-oMF zQf!X3lO(&O7U-cp5Cb6+LKS4N24f)^Gqjp5Yw0)K28mIH)zLPTOzPuS+3F_a0mWFI z#zyBd0?>Mg7sDR``zO4UA5np~Gs2gDus94z@dmmqd%V5)vA_K_U^yj;fPkYM$BLgik%Qhg*$P z9QI6e}>axzxv!a#~CKDzTw%3lov>tDwFh(5~VCMnoZ`J)g)?X3%9J9g{_jvC#q^%6HDcRhNDO(ljjQyN5s9Eeb`hwN^$!0+?4AK8jRi!LU6N90& zUeJRGYsq{VF&j*;8)_}7YM1e)us0;0<&X$EnLtjULfejzmucwJ4~2|;JKc2iqRK3W z&kk4?iW%@!kwrs%!~}9eoudl^5$BwR@Sz?-c?p8f7!{a#%~+CWE%CwgHAT{`P&%X5 z7`5(ExX7HqFsgA*Brfq^pRfCZvOqc+EzXCp200&zxVRKt;+J|GK5 zh0H|!C=qQ$LH@WIMX3vCLySd-BOYS^BLbFg^e81)DZ0WP0YP<^ml+RCfmdY2K(Gm} z1AMXyQYKeuT_1*zAD2#*L^3VZ98YzCg&W;HJIyn1g|0)UL?<8Z;`@+*Yku$I;fA+C z6fsvTFFM@t>LCpPgXxF`9o*d9B4_tw})X0<*g1VsozRrN99Y@a51}kb5;3N zloS-fad9ijh3JfmFs+jZN!XRSUtE#wJI``(PNpzdPBcd7L}C!v)^e!B5++E?A=eI? zmsgF9a*Lc`44NJ}Z0vH{A7-)t+&7Z8eiL8dt!(1L#&yWZ9gkZu@$8?2m-I}!jw$Ug zt_^gR{>|lUnTwU4WAyplWp!ay2VQuY`Vf-CN2qG}BtM22f1#-O*CdZm=XDwSJrUsk zQC{HNMx%vP6{>o~1ZzpbVCH)pXf}Q%}4PGGhJK_iBkrx;R=&R|OBI z39WT+7;|Y3zSHOI(=*B^4tqpw?(5OyKQzn=q%Bc;WL6kn=;gD@OI<_Kc9CYopUc)e zdVPlHBPZgja|~Tv+d#hn&h<_cQF9>=tG9!j1MYSFJ{FgS zCUY$l+R5+N=Szk$<1qp2FZ;c9XI>sMAF+lK@sBLm3G;xAd&Dp=;-@9@!tKrlYwUwT z@~>sn`_Y^Al#_Vd6Uti4ydvcr%i!at& z-wHE)t}5YuZaqpAd`oP-KG*)fSZmnEm>Oe&G0XcP#$MoVA<$dmYGAzCv1MCko`1bE zB02MRmyDQ2h^FH#?QE2gj4(2>}**=^PJJZX?s?Ml0`4NG!1MW8>84a``RczmnP>a z((zciWQp;w+zDT@J5F~n`A?}#j$qL@a2KHWG92A=)U9I1d7gE+9)#x`ro5HzC~yUZ zk++e&`E2BKQQy)g9MPY6}e&VDX_zJ6y~U7?bOQw|9r=>1*kfl=_!kN@CY(8*p7)=^YHlCjy39aow`Qv0k! zvAVlEWr?79yN1<%BXFjUZ17#G)~@?`6;swwPMn3B_=WhJ|LuzY{H*&r0jq}vmZlFo zbNFsJNk~o@GJ2%tJt*(l{H-dxHMCsp~|QGAKi-m(!XaX8u+^-O8 z+xALalw;6%NN_ZXWdKG>3Ge7<40hV)HWRMDc`oJCW2`K8|D--D zeGjcK6#lO$3pIGdb0V_v=Mh^s!!a~Vp2bc z!@>`!hZ?ZNX!KF~kig3tFdIw6(`Y%9mmm1nQG5MkXJ2w9kyK_@^Q-HeWXZC%iPZYY%3F z+vAD(JPFoc2L>nd{a**~rWIu0Ur$e--)2E;q?Gfl?uy}Ea?2ZO<}D1aG;W=L_JxvX z^85vkoG=qFyom#*_vPbsESIY|O5VwQ5L7Iusz~`ecT%YIPnKG%m4p_4vjkpDgGz`huA$*EOF0`G8TTPO9Ntwn0+WYmw8af5;2!he{y8gG?j<5E> z>dJWrOOu)Q2Nm50Y-`{B>0%aQ-;|HIIakkw&u>3HCAv(CZYBUv{w4q-DcrMv6(sWyGih{Gh8*2Ov>rNcAW5l2o!Ag5qJ6uNqrF+nq369OSUlS40 z^=SyiaZt~qErLJ3H`vrT76c=+1}0Sv9Z@{}f(?o2TaJeIVe`=QYt8e}kEHv|nqe%= ztwQb{@Y7*VJ@V~k+_yXWs6N`FN~T($#P@6OHTs*=ahFid2IR<8ED<0Xuy{>j4Mt4}?Eyi7P2sm)_(1;TWUe-4 zk+AFK@19_wD}??+CaZbO=&p8y32c*fd{~Vek%cGf#m1nFt&F#>t(WsWIzUOTZEc=A z?>X+kYO*hWd^=~puA^|PHotYmtmWPCe_9Rd_Q5d1;k-U{`k#n_6%>U zcOwd6>v!OhdYELU6=OY7#W1YR9I)C7I~;Rgt$dOZv))KF3#<{+DbCDdqv8>w=5^@iiW5!@mkd2|C_29+1=b=42bs34P zqt9s%7|Ks;0|#w3&`XxmEHSHdE2qsJT|M_!uB1QDF^tDL zi(FA^t%3BCTP$#Ndvh8_IPy2Xpxfemup@!ki13e)8%Ju(h;4qaaIkstV@kFkQhY=p zAXqCl&Vf#a?p_|*+WbzORV}L6YBw1BgFoQzpbN!o@awUhgwUKM0=yKN2cJEY_Sx zfWT`%whRsBl-_Y)`xL`Kqrc`-#*y8+RCuOf(UwkPO3KYIiUhd~=3xBQqUmQ)uc4ma zq+J&2qS{lz8(6jQ=9d$0+{yyFUW_iNOcmgd-1t!DsXs?&hhJvJ!F2arTQ2W+vc>fR znj3xF+dT7d>$KlQ9nBMRG@et^W*W?2aJEWEAvNz1NU|RP5D+cgX0)#ku5FCF#M)Uk zex6v$8;7jhdIpT{_kJu6{y1o=HpkWiQG_SSnz<7EBZK~s2PuGNsu>56rj|W4*g}9n z{0*6SfnKd$=}a`v?xPV(_^L4;E!zt(Cmr#`Cxx*xozXHK$=YUh%jft8&FOAV<0EFf$@ML&`1!!gK&E;~G?=>h-Z3SI|a_18^oqtzW9-xr;?GYn- zzPr5QlpnWN!Mxe2Cu6cAJRkt1vx8_;6s)q2Y=%7W@I4~@r)OmMbFA6geRSCa7PDH` zJKxmQ)KCc6t*-uzAtE9&m@1cd%E15Rf-G#$0x%O=sO)uP)(Q%rq+sb0sr#bnz0Do# zy3RjswyT0L1AVf8>~CbWzf8v(*j#co9&iWXPgL4Jp2|*~QJ0nedPsFokOw}AC*@?( zkB*m>X*HVMqIO>e?4JtV9S;!E*i-!6^}_>Z@_ULrB`i} zTU=5%>7yPjB^Hm0fpbMCb=#$aBsHE06Z&=PpMwuoFH}LUyBK|%SR&I#KuRGSNzeK? z#{xa_B5*%CaMjJX)mQ2qUbv!wjvaca1_>s_J!;1>aD7>Kd6`Waf@#V@IbAQ_nefywf6R6agCoUnk9CR5 zRIGbI(o_up61-?ka!^OYU56}_k;}~%N>!QXj06)W;v{LoReuqwEpnt4A=!q4$7D|R zwvL#L*8AEfzlV6KQXL{BWM0vF@R0b)c63A^dWLkJvFy*U#G&bFFPfXXhZNmuo3^u) zpOes3rF%S)F@h6{Z}yX%8%u|v5O$75nOvvbX2d89A_QsI@4o|=ku<$U9e$cylq3}F z*o*TX2}K+iM-((RUV$MGK|+mU$|%zx>wvURad(LK5z6sZ)Ar0C_cH|>lVkmsVp|Z=Tn{800ceC z4_;)SEA#hz9J2O0%{!v!#q0(Ty*5h^)Eso%45>Q-kjqSs4W_>#K@b9_|=`SXTb+^YLMUYQ||8I)%33I&nltA>E(69x~hY>O#nbMKd@_KQ${zgvcis3)1$v-%R$d))S87S za<{rLkPrmgc4J2-LcTbOdcn1~0f)AnqIq#o^jSWRGE9%_@H65w4h_Je!y5#|;m?3z z%LjlF(nzG`2^D{5Z`7^f7<=7^UDJmq!kD$1jlM0zh4((=pP?wr=?;~Y8a$;%MHSUd z(hr=wLfYvY9){)Zf-KL^8vzrCXOb=@=G#lZjF}Fei^-6$!1-oI&Yys^)2*#4(NIKxLl!XjBqL7y@BC( zw`$qtan|{AH9;Eiu)W_?q3T~cA35uP|5zWJRW^45o9jyj1wK7-_gk7ko-7}IIogn? zIzvuEAMJPZxtTgq04=r1&Oj1l@xFTOAio2i?xdF6Z_f;}TH0?~`D%ZjOC7z*(rhG^ zy_`&N>7^+b>Uxy^xshtE^(10><2ncRt}w}Vjz$YX4hE{$!D4K5JN*nIuMW8WeInhkC zN{u^`zW!0NSkeqUc758I*nDsg+~1A1%q|&F!TEp%BI0fj`o8t+d3@6Jyt$!!vak*t z`*bZiIX5@A*Ykdct2xjr&N&tc0Ye2VW>IKZ=1<+qbbm_%hU1a z%Wm*};Kjs#ej3T!4HQ_;(symuFV92aziz^sTYFiXw;71)+elMwu66te>n9w|XP8;; zn?}aJTeYuY9=_|8$c)~U>KZNM6!9<;TQB+^)yLnl6LjgOTDlmSp6>eTKTTwRMC-ns z<#>O+TRvS+DF3tR`#a9C>)AgeVB631ch%2s-`M<~ZVjEQl_d3HI%WEku$LXZUw*h{ zql*jD*$|FZ+>q92-+7reXEH~yh`*aTu1v;u*dlaAw)ogB#lpRAAWbylG8s(9XFnF9 zm1fCALJ@6u&nyGY)f}BRQNk5k8|B>qf({=y(p(a~w|npR-d)IiJsmtY<4-~JX7a8w zt#<9GQylHWC+tJoRf$&v{#35-H-R`zKb2p$=3?Pp4S&8S4it$~SU@g)OF-^>zY%)`N+s^h~HT<@c>g|f=@DkvC<078ENvv877c(wf@NQ+UonKqKPCO#B4;wJB*!_ zXt6mIX*P2BB>43Fi$`a5Wyq$+B&w?DquD|+Wo1k*1loUzStmIthqYuj?T~QlPia_f zqw`?2K+k|^c^w1rxY=qYWum_}YODAY%sy9!s7Rt#QrX0`jCPAz(ReEgn+;W>y@V@}E0BMWxiI?! z(L|Q{jw#Pjkk!Qjg_G#wwib1awJeUCOME{vQM<56w5istkZs0RHeyS; z4h*6TfrC!>Hq$0&_UUv7FgLXAEdR!FYKW@&=Lkr`gsWv!rMo!3Bs1Ol;J+ISmFrEutWXq1Qw>J!rTH7tEfB!Wt^U zkzc@8d#R4AS^(gb)rYs8hK9ytkX*2<87h#W;bml1P$YBALv2K0VOV|}Yfv=WjVq~_ z#6h+G!5e}xt+gKDD5nd368UW_axv~=60*geM-nWIfqA;N>F;htnt}spo{~vG^-p;k zHO7*JKHXJFwI;^0lxS0s!;>&~8WG7ro5vU#a_m+aNFWZ`pJ*^0jVXrs+dQ;=(X1FY z!$kE7^#Wj*#A%gWToC#(BI6@IGfyL8wt?mYC-Y!+9Fu<`q*X@HFF$hUnOJ^lOk+Vs zvZ+1JY_ODQA4Vnzqhpt&5fbB`%oF$lVe0|PluD0dz#NIF-@V9OmxOpkH-)PT8l?I~ zr1y6?3-A^bfsBZ(I}MB`gljJ{+Mw3be=v*D>?EUg&5%57Ic@zIc`qJ?0a|cs7~nz? z6H^ij0u^ZgHK#i@Ldy)pw^fO%)8xyyDXN;DuzN zhS$ezV&y=3Jb{63VKM}qH@v_K1UMq2qh55I3%-cX!f(Q4eT(x?qJbn(_pF=3Ba(mo zfFBXQ3wKG0pUj|xH4b86WFyclGU2N-**s*@nLkjB$DkbtD&R1xiuN$yo_n0tc3**E zRvh>pKSV^Aq(#{2L#O~b-cs-jjK`OVnZqWtXF8{opk%MzsyqnEO>K&SCg+{+(F48b ze-#c24_4ya#hTnu`u?Lm(1g9PNAU2Q!bhU=M)GY+?WD&P7#0(%pD}W7>Twi>>=;rQ z3tR}{n$Xep#Zgx>BrPgLIhG*0&*VZicggYcg0Uj;Bw<35i4#W8E{m@fnT(bo`C%L# zxa_cx55Y)GdL|}Ip?qjxZaBi;rqMV^=;HhAmsW=aG&sWruc6Z;8pTrZ(_>ZPRRkkp z_AXqIhQkX)J`|29$$kx@fX)d?|sNW1|B@$rSV!@Pk5j~n8`6Z*&m1vT>Wsb^9KT?@Otyp`VN<%pO_ zRs5roGNI6 z>!>5aPgQH;Oszl8i7~kSVv%S^ozq{{9?D7O#(|gsRV+d>ZGIqRj?o~8 z^UG%v3&n6W?{M}s(6R?Q~YE*>Iq`ZYgl7kxCG|4jpS z3);mXfdjUnVPHS-4y{)WLU-!IE{FRMgf}&~XMJ5k-xhiq14-TmV6jh1VP6V-Nf+3SEz*8mAU3{* zYcZ~U2oq{S?)w7b zzF2PD`I3x$7fB)AkRb#t7@NFh)2HdM&_>SN15)1wMj+7&4;=IUax`*ofXtD*c*MWJ z$H+F4kvw|!BLcS~Tu1>b=%@KU1ztjs1hGB{%@P%f9b~6;zkO?@x_5cNwQzSOoZUtG z>Otm?-BgMSSHGArkFPKr8PG_?Pb);|a{8I&5PmEL@J|Ma1Qp?6voUxk++D==`m@1y zk&zI4gB4$~9t>e8TtadP5AGxUa%4ctJCwpx zNLFEI=q=5{Cxe<$WIo!+i<#x(it&C4)tm7_cG`pYDOkEqHQay{h6z)Q4K=rkN~|feMrq1#2C#F%=#spkO}=wwF706S zK}sAFKov8`Mv`6B6sOt*Sz3v1)@ZZ9*HVXUq_BFhH-p|}qS1J)k#SU~mF}q3?uh*> zcwxiQJ7hNB(Qn`OWx9##P=>#et>dI+r#zcBXlI!nx7|%>{&yCgqZoV0)=9FHLee`4 z{`vhvRB0(%MFCqiNj;plu~e#4ls+>EWk;673(|VG%~)N%*ca!H*((HjC7XKa6F^** zitnq3?T0Yf$6|scq|gRBZ+6)A9Hg9&5prW1!s3`vG4Sf?+Kiac{Mt!hlWDD3n(YCc zpON|q(aEgvGO~<8q;1>dP(DpX1H;f&q`K;{cvBijCRNr_KH+9~vpnY7$<5q)S{w;q zA}aB-OhiB}>uLHn7=z8ZWiMpm_Z9My0Beou6H%OJlz!$pglf{JDqHuhQ z8Xit)QSM?IC9!sjY9z`@FMa)NEv2G5pB6^hFS(W^99bVNof}tJsc(gX$NQbidc8-6 zf7>4p5JAn%Y@g^4*Y7g%atWiJu0SfUgiMo$kc!tjRQ2WJP*>_EElxuCxv~;6>`U+( zR!6zyafGr;BrEE{8pP-5kb28#uj7cy@Lvmp>NHMHLD3Cg+n4u+;|A?e?Qg?EStILm zW?MdD@TQsJxBh8J2^|S;T!`oDPB*+c8Ex|b(5#l#$dt|Fd;VGD0ogy>fM&w^w%-1X zAWxV?t$(guIDH*$<2>7F+f`c1^R$TLegnAZHwdI{FM$g$pObtJg@0Ph2iDZzgbL-W zCZ+F^?U8e}W-)NooS6N0dA3>Dh(1TiW2)KAY@J~FB{S}K|9ou*kI`bt@M&y+2}9=j zj&vm>i?ytVA{FvT;l@9O#_K7m@}AHCQXnAHjCT=Fu(bI?0n{`J8OdV|i3QE%i%%$@ z-0zAW>AO!)+4~psa_1;poJ6CwqK#!yDpi0jR^-2RIdMhK%FE!Cdl79@~_J|s4IN>v9 zjlc0dAfRj=>jfYNpt2bFHaBNcB zb8>M}oT{}#yDu*)9P!l(7BgD&+QQ4>v0UQ@{mgyr&!S%r`ijx@_c+*?#$ZB}6_Zg0${U-)i!_wNJ62 zZ}P%GG^GpGl9CCe_?BoJ!c&x6R%Cse z;6T?BAC)rZ9etw0#`hK_26t)o6A~hV@cK}{Kdoy-eZESN6JK7WO@|xR2UoJ&Kyk2& z0qvJG0M+w`SQqK56!(hioVSB(!JdPosqs z?$2?O89Q%m=T$}M#ayIhLP|49sP?_q1Qfk+_45xJ8OleM;!j#vMR7gMK;xS3r#dYW zH>Bd|#t?cJ_NVDT^wgD45oHf&vtWEy z4Hi^|Z*SDweLWdm_)wYDYU3Z#A9&TAsY;O}5QL?PEH5!6b91n%X|jmz#h?Qog{X=d zty7h?kQXyf_GKPwfcX>TrC+s>J-QI57BX70q>1|3q^O$6sM05-LhYRX@)= z-$v#4daGVHjRAzTc8k&*w08M^=!un-F=(@UOtqIKcP`Gri9`o4xJ*c?HK}1ytC9

IQAgV>o9gGuUsGC z4RkjZ?BzILNO>F7Y{|c#>D5~XRF20~1MV8acHg`9Q=enf%X*I(1<2BWw3b!wJur+f zxu7H0qOD*cq{C?!wy_ij*5&osW_gx^55)`ILa;(Lw>Y4@KiLW*s9$cg;_R>`Gm`GM>j>vb;5$#)l-f8ERGs=gr8?8P6XTAK4aGMwNXKlcg68mi+y9v|x}) zFpEHC+(`Xx3WP0-W8tto1KE%(ST7KSsLm_Lhow15v*mrs&_&U~IUo4Q2pUl)Tb>%s zWi30sjl#Ol6naF?`Ly*`dTky0*R1x!G@>@)_n~S(@1sJB$UE-9S3r)tW&S4U5L2>2 zFN5X2`?R)nBsk~bt$TYRG4E4(5p9ygs<~vDT~2EKP0zs{spc9DHxZpPcgn7UcG{%` z7DEtiGa4b3r6xYae43rsLSQf`%_;diXF#m&q#tK&Z61=1Zwts*+4#e5?|hKvzWTD$ zVDp&`D~`4ubCtYqb4l4##IMO%b?rA2oTF2kBHXMLsZ=fd=y38U+z;L6-Nsmy(}}LE z6wUd^gu?bR|4bS!G|Yx(&$Y})NVZ25jkZn2#{dFdofVn7~ zFPSlRcvbXcU`)<;krQr)CfCWOS9p~Y%Hp4{2_BJa#BH7-+%9c^_s#P^0b_G{3X(|- zHAa7X%6hw9kJyW>lEQ?h7hk}&BcOYY zt=%t(j8-#2ZRUYzaRXJ%ho3L)!`j;4MyYngo!W=YCiUgYrc3TME~$ATji-tHgaK$B z(fayjRS!cTS|3t=scZp%6v1{rA>4_@M+!Ch@&qhZWO>Oy zGAOzx+sORKe_KXORUQCWArOP$WBnX(9wO0rtHR_3z4c{}2(&GqK4U^8a?#Q``U z_^Nsre`X)=*K~WGgKY8gm=qcvxt7cO-r9VMnrVoonhO5&dc4IXdyXta%d@)p<#B`y z{ZBuH`|FReS05i)GP)YE3!QKnb!NS=44Srn3$NRu zlA78ODh(u!Za{J2V!AZjm=TzIxTm3aE$2N!H`BL3O+|(C@nh32g7{HQqSb%J8+-yz zc>PZ^;NjALB{d-EQ2&eQE9hrN3GG>Lg8REa#b6iwzwdH;oN75^2XT>r4{QAX-B|_; z&u0BS+4vjpAY%LVKgB=%?-yqNbvLA>U9PG8ODBXPUF@bP^6o~L{pX&+1%grc#)$uz zaJV}#{(nB{edSJS$zl6_8j80{oJeP!O*bH46DZ`h5a$ literal 0 HcmV?d00001 diff --git a/doc/img/RadioAstronomy_SpectrumGaussian.png b/doc/img/RadioAstronomy_SpectrumGaussian.png new file mode 100644 index 0000000000000000000000000000000000000000..f6476b86eb9e78b9f9f99f6bb5c6a46269e8b4df GIT binary patch literal 143947 zcmYJ4Wmp{1vaWI0;1)DMaCi3vhv4oy$l&hof#41aA;I0<-8HxecLu$kv(G;F2hB4> z&pb`{s;cjMt5%eXk}Nt3F$xqE6#6GQDK#i47zh*;bT$$U@Xi<}y&muj+C@!P0;*zy z^aywXXCh1d{De*6!h9`cA`J@`R z_ha^6+^m$8$ORwZ_c^yO!lum= z8*i`o&N~C2q!}#7(l6&L{l7Iu(HXj)B?-n^9F1iJw47}+o>}-qswbrzW8ZeVwG=e^ zzr|~SI^zZY{w(@;kfB&~#3uB?a)k>Ysr084Q`O`0ZD2XrP;@{8}+V7)7=-wh7junJ1 zQ}vYo9Q4IFcwsc{72?oE!>p-Mep29J$E`sdo=q|veDAg6LU7tEGc>?l_Ip)Abx-|C zAC7zNxi2cIv_^~Tq-2g^vM6TZ|85s{p+4e6Kdb*%O9caAAeP22(Qq+XD{+K(&V5n> zfjx}*T>al$sBM5X>Xyo+1AaPfB#4pLu*^rI{PktI=7(XB!cOGz`-ZZ$3E{=2JyV?o zBf90DImQYf-;*ZvB+rwE6OSqp?R8!U@X%=K%r-P1Zgz+2(c(>x4PSuP!lc35`g$ z+jXDHCYX%R&#Ce-H~bkn{@7P8lvPIzR8<-pcq9II zK@`Ok%Wy10vvfXRRaCHSb?4K!$vnp~wiKyhe7S#^JR~c^dgl4ofA9M!=IB0J^al^V zeewT49&$BsPUq`wWtfDxCmTIVCEI16i(}hfpWl}bPUpOs_~lO7U8wulIBwmf3o3kWlEkkWhFD@gVlGBO}*d@;E{~IrZwh<}%h)tWp zs4GOqDRO3i@vL4?s&f*WRo4+(E(wpTsc&Q*-Uo~ccp!*7Z3ZF!0_UZBZZq@7w^qFVQ29>?0~f~~`I2f3gGlPs1@$iHzn|T~38A>) zhI}Ya`Gs)%_M-FOutCFW5GbKmIj|LTym$M*yDp%%wWP%Q?_5_St7k`EmGA%ko}&1U z#7851uA1et?O#ymejWmQ0)y>dW$*rfGANU2@}A+oojm@(w_qh%(t6pE3NiPW+;6aR z`$V&TG5yV3EdB4AL5QuWsF;{g@>3A|sDb{sS?Rz33p<-RVf;?ItjVvxy#m4B73%+Y z*=Pd&*m8xi>F4Gen1z$aOV1XNKw}6TD_DCyp?BJnCk643gl872XFh3F;=FWt#2i*} zD$VDv&3DJLNE?X7#LftGFK78}I@LAs`x;Zk>&HlwM*7Ne;_lLy!6 z=;%%guiP}dGcP1;#+*DYyK*c4k4t1LG4HV1zXgLe3Tx^81~}_?M-C{*d%sK z8?Qs7`LD_fvfJDxa(A@QhSu3%Rmp`+60pmG@6=43vzjw^*>Vg4=-P0ko} zce1?XG0b$_TXUEeQuozNPj5AmQgTWwaE?llh}~2QQPMa07$%cF2N&}@{o|qV18rKM z;}AGB!c3P)C{Rk=CpbJYFpVm{yuAEke2ipsHPfyliXGngbJ;C&dJp#9v?HNoK&a*WW?iM`~`pW>lNLwutAN%+Au_Q3^95`y2AqKTwpBDaXa zFii+OTy_pa9@GiW9|NNI1cs#TM|E1vmoKspI9b__I3`X)UQH zd<_nJO0uL-jO38HG=j^*1=@V@Vrgcfl(p@veKq z%6bu-WwWvJuDPmvImE2|jhj&dilZ`;<}RcItd+1*v#?%mKFFP>K*&k6F_+@#P-qa? zh_hl{WnqzYYyTt(RyI-&XlR&V0F^&i{7XkIt;fEWOCs;x8|My`Tp|AFQI@ zrl$x&kfvW{h_E=XFWYtAlXV}S6;u6&Tgh_oN~@c-_9ph!EE<_^|?%^ zc7Gx#X5SRle!HL-@N%1!PZ1F8vvee_o++mX4I$3Ni@HPqn4+!cb6USeLK@;nZ|#>J z=4>DN^$aS-F4PMzK9K@7gWrYLSJI^#VGt_zBZV!WZKQKh#Z2r&gVUD80|I5Nd@-SE zpk%=oR9`$7E^>C#6E7CZ)SnaH-Lh>Gg-@N(Dw2}bw6f47o1QsnYIIZ2@Tlv4_wCt5iSBJMlGH?-p*PnA5!$cz> zVu)g8Uv|hpI4sDrC%{5OWG}F^24fFh2mKHfp=jF|IemJ%#@qH6eb}niyR9Plsd>^L zUk8py?%`7_>>V0xn-;ws9t8JqEHO9Ar=?_N5#$Z2nq|wZ`i2GxqQWii?Z;swc-dja&5z#&e}?N3caZ#PO?ezWen!Z-nF3 zce*uFv~Yy+BQgpErm6Kw4^1fC0#5L*9GCCivem7iVwQakvacjn%yg0_l`M{l!qA>m zitbTkNuEEk4Qa$)BzF|9ZQz|aakSP{U%iv`71NDkS;0mh?~n;P5npTDAtkn9Aep!4hg4wra1G=GXKeU{brYObtW4xQ0q zitYv<`x0xj+}mB4)_%t^RS7kuvRsNoasS=cl;|ZS*kvs3$$R|-?|}({Wd#;YI=om1LiJ5Wq=u|W7vlW=xq}094T z>V|hzr)Luf;L%iOofRF@hPzO968jUb{hYRM-g0>mCBKi1q7DasUFLW2q{r{x$SJ5?zHp%e;&4uNZztE+21 zzq{R11Z`}j=%xw!Bk`1MA%X>|DykU$!W6zxTaR?X)cQJ$fHjqP0luYb43&_$_zP6!2Cx-*VYrlH);KlL$2euilU4i#W> zUtDPFLaQK{<8H<-$;KiZ`?_rpc#WoCv((nqJW%vvbqJ-YW)H#>_3cpO zvn$ky8@)U!O)r*?tBug%&dkpqUvX~UQnun_g`d&N@4oB;6>T^~2wr3q%diRo z_E=EUycDmjc0%B@nMLLMkx*z2Y}27c%0W_>F^|rtwbO=GjMjdZ))N?n{+$HT_Z1A^ zv4E43m9b8=*HGz5ln>XOF~VZU2RaL>h~lo1<)sDiV^+ssm$>uJGts(ADm6mSYD$ zkNmQfGxPcn`Y_m{wLTS&i7d+`*fhF(8HFv#}GAs#nP(dJrP5c~s z2dHM4c2o8DHFCREuL#Z3id%(bJC^0UK&})`D4Ox{aU5EODc;b&%m)PSrXWI`W(*ht zMYg6xpbD^~TzCQ5ql#7}#!+R~i_kMYj63HTs*uUD|5Gx77)&ImljKu)_#y92ROrVv z*pSlr(qR6(=1D&cn~`u5he&n_9A^?SNoZdjJ8O8l53->VO;bFp_AY;%2VWirMPDa8 zI$XM-5fw5xEH?b^*L=>~?^o<9{qB|#pVK;S_Rf6|LPI*i7gZ*`nOT`mw-%?PHT*Oa z(x0vQ=*3fxkyJu-X>h`Vk12`Va=yo`)t8^~tm?Itt=U@Z9Wr@#2BNi2qkwq==u!BY ziCc1GZnD6nSq>!Af<}k*m=HzG&eFe+_!WP$$EiyjS93BHh2!7_B|~CQA_cy#Pf1LI z<3D+k-*R42X%{OaLX;3V@pLdx1TySX$FvZOH{d?s42MJmwpHYlO06hT6+P^)E;;&? zke|pY*6{gg>?!nc4PBg*LO87t@Ua1JPaEWZH`CM!LRZ&$Z@v@R{GyOy<*HKpd8`pE z$*37BJmW=GeIk0vy3Q%T7bZU>6C%S^1Va*VMli`PNkjl!iOcci`Smx)SMwqRjE%?q zbFzot(H6Z0nRlT~y~F#51_-Yn$wO`rcb&7#^QSXDNamy@h&*y9O^;+m*M(5$A5k_7 zC^FUN1bOdt;gI;_y&Y2Bbs%-ONdGD?=Kzg>-hEs+ zhXNbPeTfr@agy!19ThhI$as?V#fxx`}3vq?Wt4r^)dk{F#>A%HvP_0T^gZ?d{pE$-KS z&NZ|Qyx#ooD_hT6M4y%?jY+-a9)762Q?2NAj8emtn+T%3i%C7TT!5TV(!Ks|*m$|U zYX!b!q*j^V_o{}Snlp9L8p7X#YGzeK^f(4qjUyo{&_|?Wz&B`YJ;aL+BAH^&`cc+y zSyA;;YL&D6XI7=E_Bo0oRDLm>HJfz$g$wzcBDirS9X$oD5TW@CPt3`$5tp3m2t!|& zcLd}Dn)4VU?hn)BqATK;+iN2?GW`JI$fNnWOg<5yVZ15L8R%xeJCvjy$z7$$fF90; zOFxYwMr2BlZ3d(%qqoP!Jij{~CJC2=i7+^n*%IYEAuq6%)xkeD1KiHXDM?H+5#Odm z)V_EzVCkLG6;p~WM~8hU7hL9G9MWA^5$(b-p)1-_G`zgn z@V`GoKGxIO72wALlRX+^u2_BC>K2)upC9*uBRc=EnB-?bA+cXj>#Ai zKk?WY4){yBab{Ll(lL{M6IQQ){Sw=*fE-8SaXvHdls=C=u#nW-LViz{L8*OMu=X+U zVsgc2)}32fiT2$aHG1V}a7QYjR#dUu7l_0rf>Mikx!)iMoAV4gy05uudHTHEF23#a zb~YdV$TBvWRpbqWtqP&tCW&T)krSa5*^Jaj1ObUHT41sHYJ~CMbI*IdDPfCIkhWJ7 zLSv6FI`b+v1;ZX?Smk{*41-_TYH8?Fgkx@2Tz z#>PZAc=bOE^##);G5;m7RZ!!pRL|;KTm=cQLrCTOD-9xbb7Yf-BJcN+V6q#=1F}G) z8}OQgJUbx~uE)cEV?&-dL`z9MDjWt6IHRd<}~9++}fC$$G{E64mw%$-dB4{K_Bnd_On4q0%!N(^VImW#qj}w zqQN$9MEqEbyvdH=W&L*IIu1Ry$)l07NV+rRdf_?^)#u8nO{icb?dUD&?LQ!9e4GMhCZk9f@guEpGTS}7%SUqfB+5Y1d42~&l&%&q{*XQr?9oC7s!4O9o1+%<*no!c7!26OY>#!Xf0z6(%sSZ}CUXHnSqH4?DtlOFPfklW)%lqO2_4 znK$KJ1YN|xxMbpp!z#itS{~K&9&v@bePv{V&xi%xnY@*6#tES<7~yEPvo5{{21j7w zckMvJ_RYspQ2Jpuh(}CmI{Ul{gc~*YA4`mGOMK2c_A;+K zoS*S0mMF(Ht^8wPG2c2@-&}|5J3DvZ{MqJ+{0A)P9QnL=^H^6sMwvrmMa>%gj^Y9yMyy2R^bdMEb2|rFB69CnjsEz*X&mJEK4>Nf zcwT;3Tm#>OtVkPLubO_aon4R{dB<$dkduojee&Q66|6D;vz4}9sQs&BPi-dbVy1UE zFr`N`i4rtel>?WVBjk0rNB8Cy{y(^C6j8TeG|+LoEC!yq(qivhJXB@FHw4Ll*)-q| zUay9MZ6KD&<@s`O$4#g~0QY{)!)RB4#Gz@cdhos88LZf6TsXVRb{?*C;1Mq)DGJ@r zsqYNLh2$;qpS9l`Uh2$$tJcKu`x{9H#f0q~uSkw!5UgLa3?8(vegRS#FT*OkZCt9& zj$K)6wb2QN{;oj0vM4xa4Vwhl4^f8V6T%h0J`6M!7NGEcb(>MAFiBNl zAhepfxNy2I6%BodE7lCuOgZAi2!EHu8Sv_Bj=40NL<^YWwI-J6LJD+eRS+D(_Lsph zc{vv&@1qZ{4}dhe1_}Z}#)ot(qD{&?VV?%B(6E2-q5Pd!An6w77}cV9?CI(0JF=RJ zfq?;Zo+T(9r07JmDFRl*SkLduLsCc`a&W_RyVt^nP+3D{dlGUgiE`p5|DdxVU$o-9 z2;47Y@mLDXEDj444rZw!z+%XDmynKVeG(MG?V-4aY9uwZUXRj7T zPSQ&|`A@8PMMV9Q2#g&(_*vZi5;UA(8kaG7YTW;r-54o7?gJ^UJ!0U@#p1^ z{^{`(Z=(Xgy7*e<6LH)2l)Fp`C>vdUOMc}b`_aMr!`PaGWaV;h zY9hhGC*Z0wB?oJJAim@kWn8J{!ui7~{OH>M0K1^fm#t?l_<=9sZIU;3uuJnP2$IAo zDfHtj_C=7d!%^PWU-xKZ`=cT7sCPD(})miD?ouT5`ai+kE?g?!?R0`K*pM zpp?_L2%fydiXhc(EcY*0-I&jP7_#6=4pGNh)%1?H{)x+6s{a)YRFQ}qwEPmpJR;of zBvQLbb1eh6dDZ~PC@M>nn20O*6>^XVBy>KM z>xZ2L`5)lhc`Zpq8DnVou1Hu@a-m&7v|~Sj8rSeYo?{4}1j@I)+^x!mC4Df16TNSq z1l7-L4i!$p68f>jk6Qnx#*2VPN($=&T|^>r;xAv9h`!jEE72EL0=}MQ7Y9@5LQGZ` z@nln%E%G)_L*7y7dwJ11Z#j&~x1(+V(Lii(Qqg&+{fI3IzUBf^=Vs~fwm@590n z9l|bFwAs(cF+foVyxj)?&9Q;fl3ec|WIAKIV7RS-r_~LSn<>c%3_V!eDcRp$vXT#} zJ8gW?TzBvBS%!pY<1W3 zi$+EPLw}?zjhwdEdE59o1gA$Pje5zrUG>dsZ=WmA9*ru@&JgS{OY}>MICm_-knr4m zW9miZXPdSA4Ug4A2h*dO?~NP&t+^vm zo^tQVf4!qe4}aH>JzUcHR>1AmdOA3BVE#kYeJic=E$v9WYQ5!H$b*rc=6SSyQgJ>0 zYf5^3Rp6|PvZ%~2v&Od*f#|S;^W*}u#w^m6jMwxAobH+h$d!eW;en)Gj@#2Mf6m?+ z0P=pC?U^Pk@_2295#Y1vN0Q0W{A;9qEXfY;Cu0Rkt6>z$#64d0Vro#rEkF!B*6@%y^e?)qVUxJ%)pAFVB);VdsKHyoPLgdjc5) z3tqE^*-bm^Bo6I6K}N#fV=W|8AmUME-?p)O6DZ6T)+DY=Mt>T7`d}lEHMh>Y`pVPV zNs$OL_a(q;VZ7#tV5|UZIzi;o`li@-@slPq>9}y#3zbv*N{BPACBXL5^bz^tz+`2i zO{Dx-Ft$U+@**m7QQ4m$52EM&NMF=h$E_(Yg@uUdv)7H5B&<-D<8Ly>WeKWD}`Zhjkl zRwaD#CntR`?0wVmbmlYjiLPLfjcD^C$73C`L;gnCj4?xTNI}&Ehv43ozOYFM73Oul z-;Mi~L<)`Lw$xC6Pf%kx)JHAT*A0Np(JHe%S)cO zLl*STJ4Iuj26}f*&4$c3NjO63y*M^{Q4-Tlt}f`>nO^H1;4FE0+`YPel-J+VS_7Vw zsXHFWiEt*Du4j|MhE@X@C%!m!C;92f&-$BaWbGO|sT&=TeY!X2MecydasG{Emc`oF zzUCb1-$k{9x_{v`lSTV3$yg63n!_set4pRt90z=2(k%4Kcq$2vF?g>l(N<2^a?Kz& zM`nU)!+72(x$~gq-tz72#&t+jd(+T}MP^ySALidE=~Dot$vQda3yzTb^=`95U8Rr@ z4Pr)+4L*80&IO~4t+_*NBGf0?0dHe^Dgm0!+%L!6$orT*%rP{vn>@s}Q#{Q68!A@l z`uN=Me6dl-NFc284{vJaf3PL@lNQuJs_;2*ae1kt;SX58Y)J6zr(w4cWH)&!v}=>Q zP7cZj&WQGYt@wd4&S+u%f{^D z^G&sAE@bPbRI_6KOn+tmGKj>ye4_u@v2J+u&5w7L-9GEns?gmEhahf+C z%NA)woR(t2ejb3Gt*g8;K>TtfOd_P4A=4G9a`&q2_g8($GBNto1SNjpR&PY-^@O14 z<8;C%bIP<-8T1M+6tx_ZlN9)RT9zCj3esst{t$Qq{R<#GpVK;@_xKO8VRse{JjiGV zEVDr23fBLC#c%EfZOKf#st{X+tq^}@lz2+&&}1h!z|;W@LEQtOQyb6wya0SijmMDX zW0K~YUVuV!#*Lz^Ul$oa>@ZmMOlF_j|Np>G-hf z5R!km!y?VVT^dOa>-C$KA>_Bw>s2XTUeDg{43u6{Cz5IfEc4GE@ka){HKw|w_R84# zrMXkcEPq)Z%Eju#MsVUW9E4&PGCjJ+YUp*d*vNl(QR#oW zN_X0NATIiRU^h;^Sbc>KZ$~6hx=jA{lCxqX`5MK*tFe?n0&aCA*4{bX8y=;)zcvw5 z@KiW=ytC$H6)^T|@T`Xt6`Wj)Yo|PxdH_ppUT z#J(zMhS3b2wQPLy2C2$~daWCyWCX44hf$Sr5JO6JD!pwnilUsPm^;DBZo0s;z4Gi( zGiS+uNKcjOv4DZRprEL0$e-^pI)l2>*pIXcDOrU8+NP{>j^2FpVdFN(J;GsaFM+;?F z_0cg%{B#xo3PlMbD5Hm7_Uk``$x6SX>x~ssW>F%s#+yv$a@ow>ciao_;!K?!9wzQD zO+z!4gU=B&TQqujhxT5m>)>aXmXMUEuu2(B;Svbh%VO}Edl=QUd$Yy&Lm9YmBeAP# zyFTSIWcCAZ(L*a7@!bBk>zXD40|qjUy{-&4SU2LKwvI-d4|^l>H>9ftyuA_*&0 zw&EXR{Ri*pvYmP^2gwsIOmNZyb&5@g+^~@5{&hYPVXPT*U=dK7Sc0XC0r>&&=w5Xw z!tTJA=^`2KMy}Cv+CBt{a7ls^Nv7o}Fc}Qv6PH_?sd7Ogi4kGLxkW(J+hIE|GfT!d zM_Yc+1W{j57T}3*gAR5Vk!jC)J~)Lx_3|t`R#t~$?z@ipLzEruy$*GbeVq*_Z+arl z0-VOX-y9z_b0&o#eW|Uvd?K?vrgKZ2{@&;Cg3KS?@dtcGs$yQp8V}bMXKSR-X0o3) zY~)FD%4Iy7IA!1aE%3;v#!bL!Rv)UEN`4{;&-FiL%L=&`;+bPbvic_BV4u>O0WH^< zp@N5vcBE9Y@tRe6$`ubes%82N4mMtRB3BZ5u%jZquMeRUy`MAtDZO7a;mt&ok)B_~ z!TmC9)uXxNF7U$JnAf3xv7|mpr=m|_Uv*S;p%xix*5PgHpsVlDqyuASZ)m0z^RNXlLKrc4GtCq1jtMl9AiT4Z&}i zQn-mRgM!++NAF_IrJtwchgD&vm#{6&{U3ATW+H*%h3>iS{utgrPQ9u{GL-FsB5Kg~ zz1r`;H|t}_Op&_x;WpT|JqTToadwMY0bL2YJl`v2|EuJGJPj)tGM(V>x?)q3<2*q0 z4>bZJwdK6ysV9;U_r4g(Zm8W@MGcNkjWO>|nr>(>A1y8Mc$53r84xypnA2i0&5emTJEu^&k|ki9S@8u(0q@3)V*gVA%>pK7ZnHs|&se zLVPcV>0$>@D2_J=6@^WdF!aF)S8xiN`rQ{i)UTLRC5=nbeKN5bCsNHAb;d#dBeYe* z1b!=KjmjYHo66dNr$*2nWJefN`2`@2SGTaao_B(>?HoRB$Gf6KLN7A=t7!&)*YyXE zZ_~+d=N^uAaZD@%_a5q}*AuT#pveu_@q^6QtDf_gw?)W^bb`^DV$*IO!P|c0hP~fe z6S;8vE207Cx?THK_;1W5FcoB>%|5BI?xm;{Q-tSC-YVyMGT`~h$4>vbYbLd{8Glr| z0>?auDHs2_Lr-Q;z+oEGv{H@%=}0)}-G}`Cgj|nd#MK<%OHo1sM*@BDY?1iIdfZ0X zmrzmt`y=vfM4~T_E%T2Y$d!CF4^QRf3^>zx>#dhm^MAKPU~T#q`Z4U^UVg}KsJEbm zd-y80G#8C9qTvMq(>B#T=>l$lfkpsFau7ORB^Q7X42CX=F`t3XlNV4hgkZ{ z@7Q)3UdMoF?|I&KJpthKxHV}&Y=F!FS}LgtM?cLFGM=a2g;%{XRcLtPBygbP;L+7Q z@!VXS$pP{jJRiedtEliD%|sVIWsWDn6@+PwaKXZ49jMMUu|hp9RsNfgaWn)dgjgxW z)lU1=;%+^P)Q=|}z_=k*yc%v*bTDB-ao{YBc{W|HCsm6>Pbl(`TcVg4bn^tzj(Y`W z4&8Fx7M6`e&=aFD$VK#7DDgvsEZAXww6^*jmp96&-dXPE$Y~$lmk!2(XIgbkwr(eUY$-wq&?B{gO8HKc;+_s!Zg{ z`f=l7tR9VQ+n|Jg!F@f>FWOYo(<6z#fPO?W64{3JE5@0!0fD|X z5Ko1QKw03jA1LxGl63sUEfs~J9yrD9xpsx9lRgX{U=6(S%i_JfvmkhUF2c0ru>>(D zH`YKBP{SJXn<*VV+?k2^$Nr`tFyBTr*k9kuPu842E!0o)Vn94od4KHnS~%!Uu{XB5 z&1Dvmh@>~$mm`zFxui{4zj=O952<%OHIYo!MK{C8Bk;d@^}*rM?OfVs&3RpKa=X)? z;r3fTSq72B>RzntL6S%k$XA3qi%gay-j4rxzF=SPyYcv19{nT&k#pgfFYg3zomZ|o zjO#QG`gvq8-gIYA>>g2toU82q&P(d)iQJf?KaB(3nwK%oNeYdbtO$e#^piiU0D_+kcy)OZXw9w% zC*^woEd`oYm0t?re$@AmrsgypUo@lcyK^%`wqHeUtS2`-26dJPwx}10MeRezH$2a( zeW$+N3#K6m@6h>m4|DrIUv>Hk0u77^f7OL^hP$%*yL2OwD&z8oq?|S39ARO>)27}( z%`R2w|B8R)*@B*9Kf2Tz65gD{K?^>V{8HNVVndt?1NqNc8_4BdL} z(0a;ax4?8VSmh4PANg5UA^BGlQYVPEX_H5-uRhHZj=)B~)Oz@L{>ahR7PLYb~ zZyGFykpQ0k2>{r;(HEA$98oY!r~k?Z{l;mttUJJHQR#P<)2=K*gK6}h?f3&hta>dHKOHHV+grKVzE&Xqp}8V6pP z$2gpMUW|NJV{`5*n)#+WORQAFUABBahDkO( zm!ii}S<9||l6h;m$^3qHY1<2ZV#;d`QenCn(Yq27w`f>Nh}*i)>T=D@NznOct92rB z!2%V3SEl0hAf^`Itwny7M5aQpuB7!hD0Z=`7-YjE=;|zQ=I?Lm+*|0|QD6IER-kce zxvnbtb;-8L1s@mN%J^$P^ zIllxAj_NV@-@%vL#r2=r2zv2aSDldFF~3H{UzOr7r4XEndw3AIn?+tj^p%x8e4aS; zlg_*^axiC#0;G1$$OmNpPDl70-XVA+Xw>-4h*B5&z`A0>3M~C8xB!}Amt&mD8~&@H zfR0OT9zps~Hf`1VBJqRWCv{dW!5J23~5n~=7H;Fyz zw7(kRUizV6+5HTuNP<&mautXFYqv4Eca4facK)}}(ahNsiW`4p3HRmr^P&r&ncIO0 z)OV$zB|1LX5opgVV6I&u>yG79;r-l~*g}OOF_G3yV<=Ns?5{kJQ!79V^-7+#^JY7S z4W zMSt_a&y~@)XKaiQ(#5Fl&pyQG%8O3>M-+BLdQL>kjtjGTdRAZ5i1i>@DHa>sA`xpNrpm_5HTAl}E8L<9) z74Lu4-`%+vv&uOaNAt?t0cGyr*b8lzeXy{GNLuYyIEm?K--I{N)uNcjwh-sv7?Eyy zeLSAb7XD^?-;%u+FhgagzsCo!-m7Zng;rpPs;~~R^Uw% ziu>$Mb9EP-uXAJ`OW04Gdt`OBvz4cNBv(!Pva*8!A{5PhnI2NT;dOi!LStcy)$tko zHyN^!x=`WpxC**oTMu~iV?&QauRyx#Dhw%Y*EkbVsOcf^Zu+{T;2``N_b0U+A{+MbJs9%PSJn>RFS(F#_sOYdOZvO4vDwV#2bwgrv z(;-zS^NvLu%om~6Ao!aw3x1xmSp(VKJLmX5y8 zV?4*;@TBItJgmzgTD0xz_Bt$#+zNHHrXz2h$B*rLE#Bff+OYb2{a)#P%L;K;%+22o zJ;!!8h#`hw6!J0x)!u3J8Tkb>X-lJ+9?izrZiLu&gv?nhg+ce25r93xW{9(-6$Kcb zwhX-)qmV_8LHn@j7BK8=N(+L@*}{C0k!A27(K;?Sfk?w?NBIG=CaFQ^+8QhM5z;GS zTyd8)qh`t{hY9T^Cqk(D-NUl>)OAODL=x_H3Xa!jK@N zKMuS366hd)5SXH{7}2{Z7PAaSwIE$}iJ{n~=c>t`pW=l#i9)+pDI(iWPSTX+ztBSY zl!qSEFa&x$BE#22J9KbmTtM~0*ok7dnW0gLn<;s*jg|V}Rhb#^dYxy~Ey%7c0x9nB zxcXGRFzejI<28x0vMT7(jKH{9U%XQk9=<;?Ko05MN`C zP;+fjkxFrPi0RN&NfNyx%n}jB7!O}(uZHAkoc-x{0wbwRvHQa4e&)s%+u`m0lv0R@ zYu^X-8XLY422H74NuE*{UEN%tS1)t3rstaP@^k@rwFWskt_i=j&Gr7Q{*kw)Jd4tg z_YGl^}m=Co&LpE5! z05+XlntPbJp2P%!#P=D=F8)wX4vJ*OuG0{Jd}_yeB-w7x2)5oIZUe7*(Azc55@&;$>1n**-2*u3iXu6Caew{-+=i|IH!!a;h zTFNRaa)VJvb~!RgU(y&~A}rnuqBpSFo7J@v#3-e{`YcRs72&fSJ&rOiT<8~(EcJJ- z1M{?1lv6Arq6nv|b*j^bF^n_u{d6l>oEU4fT``XKqtB|Q+Wvdrw8AmTY_7}pJzBR-T2k(oSOoh z6Sa05;Z-J%bbfjnGV=BsA-4xM8;tA!z9r-xoU<8^@>Z9G#3WS$eO%Uxk=cGTBTuN0 zD<~kqvt~b=x{rTlzsx~n5(rl+TpSbr!`b*-nYLu7o11$(;8J>J(HxD!+p7J5ewHl$ z=W`f$H&q^@_2p>$a4~x*B1zF!hi>M0BF-NrQ`akRhVPpPsvI8SFfB5M^%04fbPCVA z51fQ+3ZAglESq_eZUhH!{NKHh^AIzAz>P$?C95~{Xi~r>j;vEu5-Xq6kvy7;lI`9h zWI&=RO5fOjpHPDMRY5^T;}tHy?w^TG4#e{X)q;&a&L`Geki|5TH@gVP_+G{jMyEI%f15XqP7`&b5QNVVLdT03w){DNmP0FF(~-J zvx*h1S~lN6kpo#NnwWq^`vHJ3%sMrmgk{b$fT3kqR2(lacO{2=g8BMm>ccFW@Yq!K zPZ(5!Xzt56Hp^4?amDekL6lxSSLJl`Z`%lYb?igz_z$Bq zBo_Qpu17WBff?}p`&SfUKv2C8uSND-oKsj%)JyT-_orrDVg9D0Vt7np7VZKF=v)yq znWwMP)ZyriYPJ$B)%u7b106{ph7&)$6*B~z_HlWqR}vfW=GuR9dNdDqoFME-gYh1+zzh{rn3R#t*)$k;nR4>lnshTa= zj9FHFvgFWd;oWIjqDVx%ST{;x{z80Zq%-xTmb)lME~Oejtw`dHh;C|B_Q5yC(RQmN zRQT&Pojv3^paLjY)ti&71byg)u)7V3T+txg0&#(B186BIMgQOEKBS4whLDHno0T?1+?X5@K>ZC*l53cvW1emmSu_IwD(uSX5B z|Lm({BztDowM2S`C_es)(#^3kNnJ}By}HWLva3ikim8SY$%`t`ou^0s`_beA$>Uxwk1y*U z{CMG(G8t8C+|+kQ;@*@a_t4IHL)^T7ftdIpOgeIkWUiv{Yo9V@3u(^IRSRuRh99o$ zl-??zNFvehTV1TAt#!D{=K*N7DWQ!atLPZ-xByQT7I6)1?a&aZNgbGG{D&KKCmKEc zmk8}gT;UCzPx}Jd;rUOSyv^fe$>4LT$M{y&u7ivGM}}#OPdBVPNAs~{Gy%B3|FgOF z8~o(t2n+ox<9V5O%I&D~ios=xrcDyK8$-jKQHF^1x!Qw&$*aoI+;{Zyq9<#;&D4pS zv`1LlAc{B~JU5keK1k6?nb#COmnfbD7FdE7D8kO!6I&%a_wtSH(qobSeP^)t$G#k^ za%)vS&^1ka=Sy^l_*kR@bOEJ+q&kYJy6>hS{S7~Q={J^c@__QJtJ=eavh;Z9IT_?5 z^U){GU6Mfz`V9mmw@)0Ch^Z>J(1*w9NIZTb$Y((@LFaonv-#FeT2)p~A1^q9COcK6 zz5zKBnaB?%qQjxz1x7Ocikk?VkAzeA_DRhU$u0_IF_7Z& zZ$f)nM>gs$@WDy#b;K8sS}A2zC2K@>sIB9GDpM@k}D!&bFR;7ecwbT&z%KU*_3LXIe91pIHoHsHL}Mq=@~VS;hK1u?A!YvefIAz3oOI8hA5XPgH+fsc5h~krxaJii%@6`}u(+5JVadiMI%(zT^&bb!(pX3Sev0GPsR4{#_~x?Nx$H@cT6g1C z!ymtwHlK)a!G`RMvpFu845SQlp_x_H5QlDeP94Wc9InfTJ%Ro^1(jl>?(fRkLr)}I zcj8Y-r?@l)enFvQRiSdWUc8jsnv~`TUo|E4zvS;<=CohGwh0gyji})u9BA;7vE~&SWwo<2voOKuSslNoaEk9a6hD*&b0_iPM|&#GFRE^ra-JSR z>!EN^7-1c+I?hMw%sTd@L_0ibw=a^?)sh5SOHW=t#gLTJlyBd8hcv(G@+ljOaMF|u&@dFT8kxFaif*N;pUwM2X{JJ=Nbfu; zAtbLZmnL^yaPlU-3VWk?H{MZt_2r<1O*JlQJ+tx2m)>ORm=<)%DGjGw@V`suK8McMn{&Pm?zy=*ko=$D@r1*-ww>KD+CMPrq`{E3e=F z#+!e;=hcT_c;Uh?&GVOy9p$_~`CC_CdC&9z`0rDH_|cEI9o^Ql?yOC|{o6}ldG-Eh z?mT*nd2MZLP0Tf~;T8*?hxE$}_#X=K_5`1KpNlpp2}*%=L?L#ECJoXsYAc90ky|z9 zKBes&J{Wtmk}%??B8Xg9siOF-WPmmpGix?n0i;+?1J$x`^tKWaOQlbkU2gEDsncQ+ zvDt*>u=C|M57)9IibyQH*?B4Vb)>0QVp~$sM|murD&Y z@sO)=_3Q8a{)D8?K*@UIOg2b#z*TQRLOnC~;Y81Dvik<_{Xe?y!#jU_zo>aEOHmuHK(# zSs6+U@ttAF=>J20^VMOW8Ru@b{TH9yb?=?OwcjH<9lqBZBSz*e&u`2v9@^x$H@tq% zc3<4}(_3w^<<47dwd1F@`TSmgcQ^JL8`pOI_K^!ZGRSrKO)ScFy4~Uy51z8^r}x`> z^Dj=`e3xU-eqq{UkNzYV9Zyo6@uFeqy^F)2PT*zByt^P ziA_>5JeW-cq?RVHqmH-ldhiKr?6^s)IAPCSXFhn+qmS;q%l=BT_vJ5N81jrauR86p zLoa<(_=g^zF?Ku}L%8K>cO`_3@h4q)*UL}6^72!6oiu^U18B~do)R^mWbmw+W=b&S z!sDzPPJ2X^B23w3ml-!+b@$s~-@N;pYiI1Z$CNTc%bFB={>saLyIihV25;Vd)&7Uw zXdQE`>Zs7qSMIp*gHV^yXtPP0umvo zHtZ8C+;4BbHrAUeTuFFol^zLb@5TgG=h5mO`i18==Ek3xtjz}+)jgjJ8 z*{dg?Ws{UAiY}j0#*@+^e(VNu3H|@)j-4h9`>6HJ8y?>2w)-Fb-90-$_LqMyn)gu; z{lhBDb}gsTwfzjekmj%NVtaCOO$|lI?*?P{+KwBA~BZ1)lGB7d+QTtE`vL zwM{J#!qtlfDDzL4%` zSP*Nf&@0mI2>NA!z>0J*E(#{uKIOiSYQ-KHP*OQo1JzNjn6UpIJ6bbm$Qo`<+I=@` z#yi%14?d>$d&|1-`^Z9s4e_SZX8mz9-;>pr1;C^!$9^LeTGo!cS=a1OFNLF2U_i}} z8?T#Rf8qE?PwR&%+O&?fu0H8LDI}qTwcf_QJZ?PibEU#bCtP@pzSVStb2-80YhLsCFK*fB zJB3@1{_JD(HpCmd?wanHP0v2>xmO>2BaCQN6GcH4`KPPdb<1j(~Dn#r7X;QJbaPOB!jpPTT`2;3%HO>QcapgG6;y57z(2 zO|s8{u0PH?=a6s#o%F?>tw$chx_sAzPwcYC-XbiENqb*@{>~2{7A?y1^7O)EturIx z6IWyB1Kz|7{rF4a0XLuZ@B{bJp3#@7{VzMpx+XGfV$%4riZhTZ76@ z6TYS|3)<`nQ+C-UdbNGk)x4jfW5+%ADBrkx`>vA?rEDMtGajD#*n?+ql62N%(NL4_RI?} zzx4RCFZ}(H=gv93%kgNBavUq``Chl%>G>`)pIeF#6+*Nr!Q!)=B9!Jjq8if=TLa*tLL9wR z)v?+`f6(NdN0C7MjuQyNggtj%f7~(G({6Fjj#l(GRvIRqaMw*oy>~_|1CW=e`=9aX z9_Op=vn-aUd6`$z2~&KZ|NA9xSP0ZREODd?Y41GjocG3`eIaFpeY}Uom>^p}WdJ*$ zMSaM0?#^6^{NlYbZ@y@}dEcccT_tbiagxLvFrve&c^R)WZWw=TTF<10+)KmM3$3(% zs}TCrQ3Hg2Ye~IlN}`l`J3y3umhFGpS>qo0f9aM}N9WC}PCHAbcNgyQ=z~vWUilzL zzxroc{L8qM>sWR^L;D8(e}+Q)Tc_=?^H;XrYMW2*xZPG?+W9l5{-Uuc>KQxh1%8*; z<$6WRbu#&;#+Gb0i(F^i)?eN@c=+9Sv$pSLmb8y-FIqh}TzzYIkDnXz!5zPTc&BZ) zE&9c5x5{-~JCh6YtyZ?dc93!LeVy>581*fuDnJ9G*p&$}+dHKrWnQG;*I`8*gi4`> zS|?Slj!z)&yXrdY8{ZCJS<8mHRHOY=@Tj%cVBa@b;Jo%C@%V7kaZ({Xf#zg<-%9)I6=Ae<}|Ctm;x9Ue#e z=uFxhvrA^$q?3;N+`<`e{-+taj%Q`)t1`%SY~(uFO6cE6Qm&J=n>?zaT*tCAKK-Lh z+bj4sheez&%h7LTNoarYsQUNTgTEj<8In{hEgu|&7kzjrkkYtR!Zs5vg7yIaoo5gZq~*x z`%!P6sGh{6y7wxiN*wadyUzT7U%u?sY)6ybk+BQ(k00niHn@CW$F>Td)n3S1+x_(A z$Nu-~Yg1o%`jwZT{O>D|-~Rm#?M#~$Itku zK>t!A^p@Yh;B-fvU$u~{rqX~=PJf_wRyA~Vr8FQU+M2Y|5t>!D6>r@9i~T<=&v!7h z=pW-#Rg^d@AeUBL0+ARTeKB5svt`LGWQ4mX(gVsFD4($C$F}p1?`JHB>*N0qt7Kj$ z1h6D#O2Byu6IrE;af&1Vxs6NegJgVFIkP2FV7rv(*z}I9@|FJWDg8Iw0IwwYO=A8( zs6?zT)`aPuY6S_m>r|&Y)v4lCD+qUo8gsi2fgZSW)Hjq;FS?H9rF=X&(I9y_qs%!@ zn8A=-@iO(o*(V}SaOmSd`V&B?=g*pn7PXbTH&j3pM2QZOr~bRHQlmoHz7MJuB;2l3 zo$6Glic_s2bi6jb|70N?D;_DckVYkf81bV|q<#;}gw9t=h;A4GbdYzNn3sfx73g34 z8?6bF_D+7_UMgZ>E^y?dqJmjWm&k<>(35@}mHN8w6&lZ#69F&$Ck zW^~{zN51ID=}uTnMz~QOb<|Nu9iMcB+kvqysEwtLDne{TlEZ_tNh=+RTxVdHkc5iU z5_XT%m`uiL%w;V*)8jk7?>j-aAGk%!37mX3*KFH4Kd=L@V0-PpWw}mk#?Cj{LB{g@ zpx7PQOZ|Mo$~jIh@7S$QkVmfLT6W;%oNR_ZqwM;2rkH8;oGe|ePl#{TPj%E$M;+CM z#4=U2WZdQFtw?sV61D0j!|wr5!bnvUAtnmJpYkn*8ED_=hf>-1u*es~p9HvqHQ4RQ zb=%5jGL5;M?PPlb$MZeMN3P=)0{X9Txm+`n7~i)ozi7M5(9Yvrr;&b?)Aud6+gG`c zoyj#gsPl7Ba^aK@3 zb8Ci7PWdk2M5j!;qY5)6#|^_T2X~LA$l|qn<);_=wR(uV<|_nnq^27k3n# zASigw(n8K@U(%Xu8MEf-uJ(?$mLa)JcHXjLgWr(}3UawVpnJB;sg648sH57DSf;9$ z5}@sv0ENaMt55-Eh*Ew#;P;mfz(TmQC2>`{&>O-+w>!!1M>MIPD7) zGFC^iam2idN1geHd)|KIwMYJN*4f+H6NdVZCAm)4ZCT&n@*C&;@s8JDfAOB*{_K>= zE#rp-jebYgD)OcKpk%pPsYFnxI@PI86{cjlS}DF?Mvqz{*-Zyb`c(B4a;Ebk_yfQ3 zF=TCNvhonmb;O%8S5P%kC2=gU$uF+9gCOf$4Mk`A{KEbR{a}~>T=?5J7k@CP-41g0 z;$h7VhaUC2u^rcb^NV{PGvz$%s6Suzji7B_<34}B<9O@J$(wEZxt;E6KJ?e$-=+Cg zt5`tVkE!;*90kdH8A}2 zFYeH()XBC(|J|1>Y8cVPp=6%Ek;gxp#8X{UeATLIgg!_9i}Nf&WS&p)samcOH6@AU z)dmhE@=z!VdbY=@Mi7tAAT=(GC>%o}h01i!prdS15i!!^Djz~(nW|dC3W-RtTp|*% zRCGc}K~b_{l@LSu7`ZGpEWudtcXJS(R4IKR!$$>fQ;nozia-+&S%dF;fRDA3R!dn) zLXv}|7G+Ud$C8vLc5tCH`POZ~1@t>M^rOijt|IM-O8^x~59oPA6|Nh&UM|;|%Qi0Q z8hYHnPFv^Hlg@v~F4#kcO!>usPk8++`~L3Pu3)6K{z-S?M;>#>$32a0Jq>NccK*o=-+XJ|!>^o?_k+T^r`&nx#y|hk5B|N_ zZzy`XqPjA!%Kvz`c0t`K9FI392Y?BHX^_d#WQG`XL572urittY-u+i5gl z!X!hi#*k@PqQ7W0sqyus91s&{H|h@|aFi5`(lEfH6uAQRft;xW_|6L<=lJD+H#r^X zJGKy!h@*4J0`#qM-*Mbrw&++z%gqP5HT)rdE@xX_SN9Uv>MXoJZ?0=KIIf@h_~UkK z?Y7ZPjYB%#m^rh(;M<*kcHY7TjYCEZ^KwXDyu91pI3!#AVCMUsmeY|bbbc^vTF*8+ zY|@@z++%mBYcgb_*F1Pe3s6GNi|&tVT-W6)K!mjca#uYf4sx1Vl);5MQTSluL@HGU z_DI}P14Kn~mfQy*r4>mkSkCG?5?xbWfIlwg8Bx)7iHaeC=h!^<9V{jzW~6{?P4bGq z3vx@y)4aM)FT|H9O9|!vQG`&$(G?2C9vK}PH8rF%mTKsPs2K8^DvpFdARMA1l~pX@ z_(c=NNO8%7HEJCyE>#k!kTn;Ts|+;7crfB+0SOS7jxHQHVp#y_n%V&TL@<;(*!;qt z5|%KVp_GEQ29o{yPX7MV3vM3&+x1U>e7Lo= zCqHM(dGDP1{)xL@{*n`9>>#u8DL3A_;q@DQ@2R03?f#I32VMNux27L^#iI2ay@s5J zD=6If=f5egHeuV2dag2%yk{H-6BvJV2hetScKa&zl}C+$W(Pvzqw+gE(m@ys8k#)6 z2{idN47Pf}F{q)iX`BE)V7&0slAq9?!}sK59VR`#Ux#|q<6xy<#A0;-0r`prWKfvl zF^OJr(qKZ)W1~h(oftg0(iDi~#HullKr+QfFxsS}q)Dj_6ES;6fd+x&$!6%Qofsf~ z+R<3Tq70a5QZvn}i}ilZK?XY)^Dy+1XC}GN&@+%nf*ugEVyyztIK;uxa!?#ja;yYl z$W;Z5j|`0r5sglW8edN|%+*05ZO%a!#lQ;GFikUpF?s2xj@;VG%Y7XuK>wiPxkH{$ z$#vZDe}B@UuZ}Z)k}IO~k*fJ#;JZPyJ?VRQ|2%irmo9w8UQ*1gdB{ai@BQ>H-}w9D zhHSo=+vl2xk9g+LZ*~9VzHRQ>>4y&&ydKwgj{L(@`~LUPBX0N*!;3v6bLgc{Z};%$ ze)vF#+tFQczkcO^j-UPgzs=dw#|uaLx3>y*ra^JF2^mj4WHf1mpu4Mc^ytwa&zaNI z)J&6_I#_0NU!zi0P%aZgPh@`J(9zK`YUIdy^X9d*wvq~~;ShF0UlY7?P=0Y7eBuls z1iiuv{LW5{-KaTp<~BDsy`UDpnNa!19VCj7#S_`rbGlY2;7`o_0858-602Mt28#Lh)W?W?E-C~9E>KVty7^)#w}AofN$mVw1$9PylC;TVMEC#Zy>Cd zj(%QuaL{{)@#vAx;>AmbtuYJ&jF}3Z2f4O^XIw|;$Wd5N=C`)AsCeWF8VimJRTwQs z0fR&S(!m%>dZVOP*AtEOnHjAa)`Eo#+lCBz@S%qm%%9IIjM@&kR?XYq5e_w-DAx(B zd}d|mIwr)Wykj?HoUR_fv*5Q4+4|_)&lq+37teWR4KFurje{=y&v7s9|HaGSZ5h$r zKH|WeZrbDa-M>Hdr_X(P=3z(P{Q8{5Zr8de|KrvT{<+srZZBG1A@B>!rd&Mr$oYqz zaP9N$A7;ANKJ~V{HoSGuv;J(i`%BzL^6hJfAB^MmH~f`6s9ngdJl;HTaEtV=!LXr2 z4><6^JMXw-@scIEEdFv>muTW+9{ANZpL+p6|K!XuVxHiEC+$A_>~rtE_jY!6@t(q9 zMK!abR6S8DpCYh8Jqr;JEkKN7v4F7~I<)P80}iyld(a%^Zgt-m@nGJoiN+S5yx4w1dRaa3NYcA=8f4WCjJ(jPZV$PX`z{+NG^6WbL zn4@pF{ss|40ua~BWE|unD@BCQ2OW~S8EDDcv^rKM%x zefPWXzWchmu%0Lgqq`>xvdY56bBCTddO1;R3GD_oww{zC?0uX~Ur5Y}27+#BY2J6= zeQ&<`=BB15es|8J9-%&wdODSZRE8-FJxg&FFr~RplpdN;KJg+J7Ro{v0os_Dik8(8 z_-nNd%{AJ~I$pGUI^JsAtf$M}HXF>lY(1y3B{$?dr+jV5udlhjc}~}|`D=gZ6&5vI|EJ%LIpBz`W)I0U4LRoY!}7oW z^Ph)y;M(crb!Ef`>%rG(7|CWbJ+4CA3_kjT6=3n=Rrq7@gh5!p6;&1Q*m$O-1nUqC$8+-xobari(k*q3+7e;oK2vd+oiFSgT zTTe=f+)y2_z>ZOoy~b=T6pI)^MB{oMf~MH}$Z$#^SqdjC8YT~<=Q{ldJ!#;U_RF>k zR?ry)uYBO0e$O*+z4h#OHkfqQ@2{Ks-k(3cQM>QF^4lL?J^9H*m~?s&;0j^XTO@e{oI@096qPHb>ACrzG3goFmIzbE<5V#A;&)d-zT1U zeoD)&KfU9>&5wn-4q{Q^g#B8x#PeHX!6ZgGpUb(F2iUIbBG-WuDo_gvO^-zLDkcN; zjHU-ii!3LX&lUMO%mInAdSaLmJ5@rFM~Fh6tN@Q4O-Hn?qimtJ)RjSY9ZLl%~+j?_8wlVpeju~3XOR0tb!s$7TW zWKFFnse}X^;b2;NuFiFc_{6;dPWq-Q$4(%Q67c}l@Oly_I`E0h%1c#23yxhZaIRxp z^r=+L$$=(1+*kUcV6Xz}Qxl7>tWxy8QQZu`9(AAWyGbKA#H{^iU=w%%puJvZLt=a=66|(2o!^~v!d@Fs z*mT!p&%Eemd%^sLqnG{r#Dh=1r>Awv-1&{~Tz}TL_u6p7jd%aX4}bG=*Zb|mz045b ziGM(c{HSFjMB~dcl42eZ!>ba@s8Vax5QSXnRFaa^OD*xjC}n9{dD3n&sS^w76oOxk z;f%4vk$5f&l&-YWY$##T;1dpT(;%~2HhnzFc~gXo$ZoJO6^jMB)ol1php?3?R}wo; zhR)!V_KF;1BByZje7E4{GxVhg-ZE(f(FI9ubz-iHh+GQKW(`U-b}}J(L}`e5M`v4`Rq5&dcKa}wv;Sx*uqz7Wr4<(1+EJPpISND%iG zYbchYw2mdJjai$_bqJ_0HNcP>MFcrwG$PwUvFLYp% z`|##gx3T-91s^zBYtHVcxqL4QW5En%HzD@*Xp;ie&Q`BKdBIEHf~;>9Uq zR4w~2;0XB?L#QH6(+GzcsH|jsbqxo(hhjq{+p;8V996U9q0h`nRVJHLxsH!q$Mqfl zv=MS0+s@_b(~F*)fvA`%BDHDoa#oNpSWTXt$Mezh1KagzmC0sMM7zLqEaW;?E=Rde z-VIQ6bA?XZi+(g2kc-zY0a%Y@oOwd?2MB2NNrttFyBm-rYZwN25R7v55ucQkDi%J( zAaT&2)=`nsqw*x)l#)^)(C616!m7(lle`7VazJaASkPqZ3>vBH3PMJm6GcXhPb!#| z8W56PPSr*+=rWBTr8nKk& z#6;YRl;9EdzKjC7Cwht~C^iP-ha53>7%w$~MEa&s7$HCs)&NHhq)zm~6B8<|CZJd( zD%}lHcYxOgQyKx%^opv68bpQkv8F^zC5M01?K;E$P4yF;%-HBggwhzhJhl1`1)YC8+ZCq#Tun z8ZsU{3QZARlcj!~)+)4}>E~sWCB4Rxy;-eC*PS6oiH|VYaRGGS3a!ToN7S$j)P98&IsvXPG z#T=VNxjfT!a0WHyD)2RQH{rG_@+pNceKt}VkC<4>)kXr%EC(w4Bpm3~&7oS6sH+hi z4-P`B4JekXUrz=OZ2NMG5sT=oczy02qNPlxBl#YdR_#xx%GS&8U>W_1hD5gIgTj)o zK%ztUX^7`sDEicG+K{LwR2Lrk{tq9ecC|oBZ>!Ewr--58Re@Q3T76(fqXMijdhsAO z^9ia*Q!}InE>7_Rw39uI%q#lhYdb`&>*V@N&!h#O+q0o>Ln*yM{1Np7_2UsvZ`56N{JDk z2Z-ufPfAI7q30T4unbm=w3F3ok_ctAQ@SMeJLh#&7BoubhL`6I9zqJqa@E0fE$*iB zJ53>Zu2RI^E9Yz^ukvsR+Qpc!W+AmAw!VOkDOEYNueId#3ShO1H+s>Wj3_K8&(#HZ z#gy=_oU@UIB~l#X#j0aXr_mCddGVV`PjKvGGblnymT|W@q}S za(oTzV@6e15#Wuc2$yu3$?qRguX;Gt-OP#IKlTp z$yZutkx`QCsD`yef`qWvEKh;GHnL|l@nOhrs5 z-kczkicneT<;hfv@ks@PHTTR~AEKw6u zr)ncSl#_UHAv%OWAz3y-MNz3LVyH8n5+Va7wUG+AYM{QMl=x)w8eu6uUBOdPovIPq zugF36*6=sZ)(Rr9#&N#92JZeSVbb_qZCCDf@CaKT$MvSjQrGoN1_NMQ*wi? zQW)N8R&F=z&k)1{sP1SOy{s8&6{%+&=&Vjv4CST4tnNqzx%$U!jI6;{84RyNR*PzR zJyDBENlYnFb*6sEmm`7N2K6JViIB{7q)82tAR(+diq4EQPQYrE_K1E=u{w#JqjL(M zhEPpTfYPrx^#;=DLxn&Cr`S};g$9}WfiN~crSPS}QyGt#SjyE#F~rKT!Afc}#6p!& zDPlq@XhCAUs94h^QD{!dqC=!493E9j>L4h2N~Higy=sZs%2Mb^bPfx>z*OmndI?h7 zl-}2YT5Zv41&SvvCM`>@QXy3@*g5e~`PqMWjkXmB+=zQp;+MJf$Oj3{j}xXWUXg_A z6+74{bLrG&)D(q$TrE|KLR_oL5IIL&e_XA?hz9IZ9~)&YLErG`0~~PGMxAu5HrJB` zlpFo`hBZaKKW$4Y%WBu(!>SgC_+J0!Q5(*@faa!HW8K-t3B4T zqfztgi8xhB*Xp@Wbzp#Vpekqc3IOqF($OV&O;v!u1N$%wcZ2@|z7iqs@Q2~|yk*HjHK+=zRm z#;N2O*CLQ+skAZ>S3-xBR|#Iza=>ifZwrp)*3+G8Ky!IWm4G8kASvke{Q{+&9-UaPHcCgLt~Q^0N^%4VMpLbg`Js zLV_2H&J_huFy%(csF>w6SF30}fgj2h;Y`00d{`Tv`-MnZxQP0Eiq;dI>OmhvwOYf7 zomnX>X{=*ng=zpCD)Gq_B)ur@pmglY2u zFv`m_&ee(ZSWDweQz+G{7|0bodiTgs=v}cADDkL_i%0~7gg2pE#9v>5r=mJlH{u?u zk|C_EyC5-dnb#3%Mx9N~+C((z_*@!$3<-%eVYZS8J)m>=C=b+{4XOglk%T{`?xiV| zYL!CiBvtij_im#k*MWL%(P{ySV*qQ84!{3RsuWQGQ8au?@T#Z~FAW;Rj|8cT@Dwh) z@;hy&guyHhrBq3arKHB}+f-Q$9i z=!%%e>Vo7m%?vuhtD-`@H0VfPJ}lEYjHyP}ljy>c7ko4ou|T6^SY35UIz}soVv~TJY7^CFv0Tf+hVnyBd|V}-^}}c~*FlroqSXy5 zq*!EJkcp4AsWfPk%b_Zf>aZMCRhr`>OV$|W@(aPr1+GFDQm6hxhACyRdI4WzfY(`m zs0-0)Ko{g2I%#)x(x5I<^(dK4y4Z{R92_4i3FScVe(0)RbZQtzRAzvsd@}r4!(?Rz zP}Yf>SWm($rCm^D$r_`qLoaR35;~OCP(TGydM~an?_sGRYnDO~D@8*X@un~d)P*y< zsz@D5c~cz1)ae_85^s3Yh-%_;hFXnEj_I00aj;C+tvU)%f>;5pQ3&}IQHas3JM9O5};LyodiU-N+|_~)Ql|jmQN|Xz$nDzwTO5CD47FBMa61}tRfU4QHIa4 zYJkg$0|Q)5lb{zS#+rzWQK|?E`eA@Y-*;nWq4B>169P;V!cxT zY;yI1W6hXf>>pmvO+Ias}7|X zHHz`2f?x_lK9Z%)+gd_AB7V1+DJ~BowN-)?XTmc4SG6VMsme)lZGxi<9|rmnUA1*U zi9el~QcE(5$Z1M?)*d4;1xWr`k|M+NBW8(!r1^=xI?}6#;eCM#`;JUO)x2asYt- zs-_gAXc(t(pyX5Jri8&P4knc#QNJpvcNhwZUBoPzTIx((yg>~i={ib@SV|=f5m$s# zP+F0c=&7k7^|eb8q(DcCF;>+NNRz>*a-gc!Vm(Q~&@T-}ol^J}LrJa!tF=X|4KV0T z5u{*wN2@L9jMh7t!}``CjtvYt<7NBYjIr#pyMDWDXUVzKjp3VH10A6jYyS} zpms8_CQMV@Hc>wah%PEzJcNi(mx3=-0ahqFS2fr}{%xHSUsIgtkoZt7P|l?J6c?yc zcq$FIb|IleGk7%!ty~C@SLb>%5E$MW%MLSAQZhqtz%aUKb@{vwBC2)bM}%;$me$1T zs-O5l2+zbNsx*`!O)Is&F}eWgnQRIf5L7$Cd7MHBZ%XweCRZg&hpN|Mu70S`e)2IyEF^wOEi5DClky4xmoMi*shlOI zSn*{vQvi9ns+EggE~M8ThGL?{B+dg|h)GPK0{TL#R7DiJh(}mTL)mS{uu>V6cc720 zvG;&iFNBd+!FnO7L8KU8e@%JCsCV?Kkc$48UDeb(lmagm zk+Qk^DBiS`vVJ8Xm#!v~v!IkQkt$RWD;1$KNUe#4Mm4c`)HD&&=3W)9C*^2G&}Vb= zLW4}vS%LU8IUy{IPE;$Zp5}KE)i1uRdlK@u9vcuX=D8ni#eucsdNt7>b6hijeMJSkMviIi|9@ zAsJkit|u{+@ruM;rRr;JJ&AgoUI;~QnQ}wSFpG(*G$<81h1zMY>bXwUAT~U@P|Bna zWc5OMDI^!{x?z;VS`n#=sGtP3jwmio0?iO&h3W#Pp!QsoKp3+a)oN)R zTBl6?Aj0q<=1g2JB_%ToO42uCO@a7r=K5!otAay%g{(>YBK=Soq( zkgC^zVF~2YtCV^{Od)(7sU& zM+xW%qbe$e;)<>({UBN{G{N1PSWn84;ZZaPlkyNGCy=Jn;fIn-lTbZ88&IN@8lWWC zp=WhX(P{|9CF3R0C5kl&)A3{wI=T>=PspnR?2|Y~)6euUENDrR2^BOOSx~2nA-Z_P zMe9p=O0GV_D}_*^ilI~_)kdYB>9GJAh?OD*b*etFW8$6RU|C;f{VZEutH4wgBIxMA z)J&v?qo)4?#o!c*gsqYz^qSz?J%X9fydZdQoAQWU}{nM-N>`9vD}Ln~YrlW6F+LJH7Qio&f@3K5o~3N9*y ze431)`GinYb)v+>n5WT*5DcvZq8i~ULLuU%5T()-rBJP=iKC#iDWo!?iq?~U6J;)7 zFdON}3=orO$c&Z6B$~Z!#^5SN8qCunA!jJLt}zs1!zUn-meRmSt*GPhXWO=88@*Bg zY;ql|9(r2R(U^P+{L~c%z+_B$(pX~XwYqHOpaos#LL`=lxqy&Bmz4xiQBV=J zx;ho8tt_R3D`KOO7Kb)cQkNzhR3sgca#9+BVwI{uzHwG|D%KKIM0_+6N#g5F4Wid^ zDqC6kpv432gvk(J>Uo&VDTO#U>3|+LZ0ixLrqf{M|qU=Otn!e1}ZNHeU-td7{YQS zm#316v?2~NyNM~GP(w%zVr{DAeVqd@dF#y=4Z7qYlJ0kvDZKCdo3U<$&AxxteNuJF zkCJr?QJghTl#zl-fT~DNPuSX`z7b7FiY|oNw5p>{fFy{>pj4eIA%P)@v;4qO$+@IX z>c}w?LNQmMz(+;Z1H+#Z?>G=CbA<{lM53smtyGrEAm%e7iZrE$j`T21)hLyP?t`c^ zs&hS2UL`;hcy3UtPSuh+C@4NAkH)1eplVu4AgWS!1O7K}NOh#k6q31)7+qC##}6h> z+FH>Wk4=B%q1#z*S&yBr<$GWLn%M-I(5**XzdsyRU;4du+^v@!7^__!!BOexqA=B| zCc#m};$TSxT}&Kh38-eUlM$t&KRQ(c!#(MF(_igA9cdNel_XqF$}QJb2k}xlDp5vD zqDZK$)tDf~xn>{^n;|ghl`iu}-m^M@qLGMj6w*lWX0ggZu8D`5QqdosDgk>a&oSky zJ_;kyMJ?2=1_bj-%3M^e)O%Q)ocgVC5B>HYRq6!??!N1c>wj~{TVP+mLE{Qh=NWGRg+rVkVox!sPj$ANVwDQ7yVep@o5yvag-)8m|Z$ zppwi|Q(lf|s3tg-QW{7sRoo~BJNUIV`ET2*l4UJvFDP!6!E+}37w&@d+=aY1#EHhowsg$^~CSqEyb_==H+9jAAakCt)yte z4|0mDLHL1-u>io+u0eZ?vt;R#;cEZfZb)NsNy? ztq>fr#u~%iqKh;R*-ti$DDDD#pFl?#Lk)enqp0*Y=0%50Y zY0R`XWs4RjIcYt2$nzD*b&6Yj|A7m0Ki=!&*Y!L!fNW;>e{X%lUGy3Yu=o4zTYKN% zXRdS24S%szi<$&y05r;6!l==ZwY0SCyYGJg{O3I#?HyDlwNw=YNmavY2Zu%X27u<4 zmVNfw=iYnoMbZN~URaY<^vrOKc&ji{<&xneMHtA~?fcJv{0!{Vm$-(a%NW^$Sgk) z9TI|r4m{|VTW^u5XzXOl#p0_Ca7=XI(UDlJ6TW@I?|%P#e!}t3?@Dwvj`sF;qyh(h z=}Y(AgVnMfBZYW*!iH~LpsYB8l&U{`tQ)nso)AKp%5^f;V@^^cXAc`T?7#yLyzaW| zAb~PKG3)r)hHwT{A(W9enWR_L#I!VJS{q}zP6gh>+Isihod@qrO?1++?#7$pH9y}F z+F%1~#=CDJv(Y3fwGO$T&I8Ah`hKzKc64+O9omLOr-)Z!NaO`P6=?RDR1;91%exc~ zp0rI(&4^K^J5?d}l5ns>vxEqIzbDNg0shFd63O07>P$rnHx%bLaBmdxr3VSAYa*QkFm&CR2lB=_uDt#xMKfF^ijtx4mjzU-T!m%ol-+^ z@4f8m%#q*y(j@SkAN0-RygyxWM+xm=EJ3(#<4fl>(x^f|K;Bn|dX z0@aj}FvKTlhUFN=Obv(xY=yv)2DyA5GZfR(b$MUmp-rW#Lc%wbc+?P!hq$1L!1a@j z6!55V$a;ctL|im8DJ0n?r31=D$Thuc3>IiOLU-efLk+Db(v9SaIwhcD6zHV`JcbOf z=cBvJq9}_G_6>Tup<*mCOafD)_~<$j1~t(U*!GNR?}m3N;M_gmJ>(DW3Aes5^^KQr z{^rJyeC5QuZQt?t``sItP6?ch|Mq!jTx%cySJdA2jmAHok^asXKtb0mg*SENNG~cg z8J^z(2AXmmS%^c(Bv3O#Q^IDYC;^thJ>@0`MK`W+#7svuFTwOQRvJo=&*4cSUNSE_ z2ozpk5lPh3PgwDcp28R}oPF#o{7GJZK2xpe@Y6PI7FrWxYn32+i4_ut25S$W**{v7 zC<+=ltwyf1F1AsDv{TiFrmpCX1k?@}FB@~s(I4RBLAPtEE*P+1p?hfTTMOO)l zxToR}S(Q){s)B$h=o3gZR`fEPHkoiva!U%krU?Ne7<%6EO>x9S%L%HI04SCvy z5Y37Zt#{-}=#5$&fLdBlBFOb4a9K%|V|;%<m3c)PufH2olRe11VV)S&T6E-y(4~W>TvPA85 zl?cLfx^3OOf28b$L_&frwLBX+YF>qTOqh|bDhsKu2$g}VkD?Ip;1O6!3@FvwC4?vw zl4dObv0NQ+qG;vLvX-l=1f*iHNfvq;678fELl~8egt8n^G)asP7L_0rht6onxFn*| zmU?C~rwirKr-H^{=Q?$ifee|9ZZyPtAc@fhgR3UU)J`Q0S%z??6E965T7q#jqml_9 zN=yp?DTh=+m_8^^;5L&QM>=wWI0db*+g1}IkCc1jIEMqUkOxa@<-j0GsAkFsgs@pS zO$<)$X2hy%7$}tt1gbSZ@dPv@H7H<;PHM_f1(EPX6IF@xCLra!5wV7|Qgmw>5*I(y zWVCq1!cO3$iG&12O_hOOALu?l%|rzXh=}TC6(L?Y1@XDU{xh@>2{%+x`z-#4B{f4M zHLVbFQqu>tmN2D_lDQ6dWi26co5QPBBL5{AIxr(=sSHKTh^itbt9pvOrI`(YmnB!$ zDFOF`f;{bs;Z_ETWKgLr$VYmxP83KOt=W`37sgaffEo=V3F1XKr~DK5`50EBF1b2I zoIq4@>_72CAlB3*;mM)w^EK3KbKQ_Ae17zocq)bn2Zc_C)IfNB5>xXUA>}kXuOeZf zGR$?t>Y9oxm3WY7J)x2e89z{aUfAhJ+-il!xd&g(}6DTf*i@?01rvLvWc1t`|N z8dSw0L_+eNCZ!rQ1yN%bC6+NR6>ZYO@I_b|2bIJ43(4m z43dXx14F!x?9EB2E8--yJg|{Tr#K&$IV&ItSI(0vN8~vj6lf?3%iD8R3B-k??4x0{ zBqbr$12TN3q?$mUm-xjih*U5sB_cI^Rkxm`B65ZuVnzoH|M^IVD3DN@Rn)OJXpMxb zSzL{B9fVc8lt4I_`v*3mO;sWBgTQgIfObRvkevvb6iOLpD@c7H^q)e&QAs0^B(Bpt zL}d^t0wNJ1m3 zsMq!cQK=v$z!LTR<2i`}e>+F%ro<$YRAR)Q%_LM6ro4V%rj;NfOW! zVN`LTSE>{YKV$w2;yO0vTQu4DAac~eL6>CINBTn7=>EXlbq=;=}(hRtfB1e6@H zNTS2jJJtiSFqKfXst}d9po<|&e3oi?HY+4`q$*TYMS>|>r4(LGfrR|-4)1L-^05}t z|4X1TL$T<&uH{2WD+q{2Ge)u_CWPgQ)@!(sv?a3IkH&Bd^MpglvkcAV~8_R{vfo1#vqm z7h07VCTYSl|zX5$| zMHHn=C1&cmP7Q%Zk0(TVszNBoOy`(aaua%A2^FdfDISNy62d_$wIoRiqzVTIbZN{h zp-(PU_tS|VvEfi_X$;A7r4je1bk|VX4RPvB5FSUN5b=@$tr@GX^vp@dYJh8`S}B#+ ztrXyq5X0!qutKWn7)p|qK&r4(DC-GLQVy=XuVL(cqEsy|S&ecX>986l@n0e0QqXIq zvQ|};M2ZMP{q!zbG+AF;s|dxQMJaU#q_$55lL;Y$L7))a=OxllHmD<1f0SkofFTjJ z3Q~kvfk2+C%|z9esKmjlY2X*=i7KOK@Ty(vD?$+@SUM_yG!lGOk%n>eBaTwl1axhQ zng}XIam1pNF;Yl*jz!ScN~shqEbYeCC)Yu2wM)jBrH)<=4oWffi4fw2 z7~wf$H2C>nK~ioCDU^Cyf_|t(N@AQTarOQXtr-I+-l^oOCPE3D=C{#_g1~n@*Y`ct z(noi)84-qLT1%2t^+K*iW^;jKTfT1>?XKo7KhxRNnX!G>w>n&>;KPu||0NV5 zRxn`5bt{ur5VGG4gygfp<>!pjQ6+&{OjM=nhoH$RwPgq?4qNo0G>Sq|qtot|1q#1XUH-A2Y^yylL(ZD1=hwwB`f2uj6d8*;fwS zPiPDNx8zj?L|4-k0?Vc10E3l+65v!Tqz=XzFj!rnz)cnAbzLQ?Z^$M`LJezaNlsED(K*iZXU_jPCjP zffx9$9TaW9=yQRpUL@7)^{9V_E}tqzOY6AAD9B-8!8N(713=L%OTS7TDA~ZF`+S(`8y!Q zu-h6Eg;eRbNwS^j_Ls6VcoYMbNz8IxnbazUOifi#kgiZYiNMsLvN@R`R0yFbccn;t z;G-t#2SKb)LWQa#83L2!z)TFHC@o5BlOWy7QHW&!>qksUof%Pq+Lj{)Rgl{sCPnC1 zuJfq_PrmoxFHODUrt>fO<~P6f&EwBM@AiMZ^v->EoqFJ=N~0=}2(q?_A966x5h95> zyTMjJiKihG^S=~f6FTryS`{iuvZ#bb4J|Q+{XuF&D#kA~5GoP$gZOHykU*+Xk_XuY zxx@veGV~v`1K*>x#?yMFgC|Gx47rB}xaK?baEuns9JwkBXq*`(8|EOI(% zCPcrwWe@;2Lf=BxKqL(xA?Rrs)h3~8%GCBB%FaNjPsDX-uM0On?1oZCX#C&KJ^COI z-R_ZlM2Lq-X>+dQWOG&~7i4VPbu*pAPTy>eOLyqrz-#vXj2+~CmYCpli^TAzM|5{9(>?kE5)5z)2zf2tgA)s!c-Gl&P%% z*bUPc-T%Ur)F(u}4Hv3PYh@m%wCW?*as2&uAOFZfdmVVfKVE;0RvLwj|Mn|)oV4ej zhdi{wZU+UCyrPf@Ym;yYV^D~=h>z8p6d_Sj1!PRth!e!hQqUqWLIPc^2u09kU8f~U z7`ui>X)Dbb(DnVNm5Gw=PC?1}#CseLOvq)dOxDZhf^617V&d>;mDQq5Kq^C@DyAmw z3+6dv^8SaNUQo<+H+S;8WM0k*V8jpd-OU}@F3Sm8{DuZUpYgMud8lM-GGJK9ak3rSQN$Y5)JXl3yPC^?a9kVb9q^=)=yThpJ4uUdaZ-_A0^S zHwh_pQ5G_aT2>L#(0rn*T(JtN3{s|DN=wZc(DfA|L1|GR83qf)N{QS>N+B5)QHf8& zN4?fZuH!rRe0T4Q%q+(QGM)?eKItF)pDZd5j=WY${EwZ5iv}|;j{_1~?<>9Fq>@6k zA2HZl)*!jAA%-eKK0M%5K}wdzLp~5hs2DBPU`b4e89>{KQ;DE&N|slIN)ZX=_f4Y} z1U3BIbWV`T`q`|N$=MmlMhZfqQ8Rk*W{D+)$y>X1&6B>^Fnp976ms1yowkQ$#mkXZ zFc9hKBP!0Kxr^3eKLux6T}Xl@Qfo4RD2v3P62YKSx&9Xrivp91S|OCH z0@V^JL4-&}aj}L5`o6ET{{dU5f&pif{r+(OXLUg|Z04Dc(a=Sl21F^+YC<^O zOAyNGY)oWRywTAZMD z!?w1|wzf|iyTs}#+I}ueH+YcsAn&0a(YAcs@|?hPyr%9Z-zo$UICQy8K!Kf2lOp-=vJx!{qXTwAn*ea=4GbzS;AP{x75Ci(z$;Mu-w(OYM5g+2_;do^v> z+Q)S0YE1@IDK6wbF-`*AT&PMA-wFoc9kM_b9=D*;rCi7NJ)1vQ?tAnGC5^jiA-*g+h zoBi>vOM{-G}X>QGB7r6G?4ebl& zBG)1Nd25@V^;|1>&YA8NJtQ@rL*MkGT*szQF=O}jun`AHqC)3Qm%*2bAdcux5GQ%1 z;3_o}MIlwq1QZ65a4--~R)ffSFkBhI)n4Gow@qpFMQ|DS1o#7Rat1ag{gT^ z9AQw#kzq^~g+w`7T@8r)gp!KFl*a{Tji6LA$bbV03K1`v;7v3Q$tF@ZX~2-z*~>%9 zKq{0o%AwFN-V)`$4&^#UE7KX|p3BbkoSq?t);w|?RJ*QE_hNi{hY3yjzK$56cf2x= zV>ylow%xL_o@M27c^m1A*BLm0)7W66zTkB_zU>DNHrqzW$-vv9Gj?eHqRIIaC+30- z?Z6rN&rV@imj*)-kh>DB5+;z4M6S^N)X0Tdi*F zPlm3|T23y=Wi0AxXz&KYM(DFU28sFVMQPyWyQ0E?V`Y6S+sVmBQZ}iwD0M(fV$VIr z(+Q8LCgdUsLl>E$gGkI{41M3%$-Z*gZeP9HJMNZ$pLzg)C(HW%mp--oMQ^Fsayo+i7tTG#wJFzWK(1p2Ua{zVF6BC$PT@iKb+|E-6UlXK`q$|l zww3d2D@(af;Q3wjBRdTZP_c?$heN4SCSzwCGRSo--}PU0gJnarV@G5yy5AtTjj$2J zuyQO3iYTgr!)4G9B6sWz%?=G?hWZW|h!D!B12T;(IY-UTAQL5g&tI2PHy^T2xM4WuUYIh`E(? zFfNf~0sEotI7mV=c+nqt1+TDVS$@84=bd$itb6hoT1Ko@bm(KPzE8^Z?JLg<3PsCv zEg$KR3v%s3!S0@a>6A8iNmCE9q5!*W*0Qsfm7~up+eI&91r9QxY+yUchEVUYMgzow zU!)I^&_{IWixK=&en~`8B}0m8fD+C;;UL5?*bt#e&SA+MmqDWxg#Ltx6}Y6fQGF)R z_pP!{(3Hzh7~b49r1Op0ZI;zQUCl`AYXhcBgGqAfR8;wTqDf!9zd$HvWQ3@!%?=us z!+`p~98xbqwvs)-Y9&HK-?@&n$!4G4Y~tq5+n0U$jEAjVzp%;XD1xf+r;}?M7#>YY z=tNjSN-2s}iN0nw$3X|p=#wc)B6ao;HsD**Jyn)5<3d~mrMRFvpxrX}Jp-KO&>I~5 z9*50|j*|&8me=DJ7q{mZI99G_(Zc4n^Y+KxuEV!<+!C|~gHGU$*S)){~5HCv{jmem!scEQ%G7_Sn0l(n69X(#5h^+L$U!Bkq*v0Vk z-`ve+S8F7Oph7U>5-5S3RH&(_xc_CYt^*(@B>cn8Vg-`BFdJtYhHdQA>8MT8wJH z%gasNUM94LJe`CpjI^QXWq6WRy{J|a;!_#Vkh#b#q#HKsKRElAsL%Knw-fXH^J^1&_8>~XRS;IdCQxb4>N9Nvb#~vY4R+)-S6=!8KT=i ze#R~YZl~MRG-3^BVWDZw;ax$ofc(g|eUO7o`?mZpGw-~z`_iXP(q=`!x>qShx(NZ! zQC$LMD=LjN$5I0!N%#P``)oU~k?RyY@F)hB`*O>icHb%TdymrL@ool^JzqNz&#Tt| z)Ik#@t9nr#Tnwm7%jxu|Z4`1M@L16(^pWd$_TAr{xWz{4^!?lW=Tja10}l%hbdHUe zfl#NcLUp3Ad7`7Cm-k^Q!E~kj^pDSxCAsnsD#%v_OcmahLoz~35-T_sefEbwf6Jf~ zb%K-O0lJJY6+Oq z+G+qfW_nhJ=bfTTKrY9r4vqBQpl&KNjjICiO%o$^T=hg%XDZXT{OOHJq?ESnA&+(Q zPNAvL*k!w}69gIh3{OBmu|preGA41g^oHa*{NXJ)M+NPo!G+M0m|m4Z4-=sbZw^IO z0bXgxN|lAr2{I{KRhJs69%h?mIwTTTOE^#0@s%q1S)|Hff|U&r@p`g8#OFN;=28$ zTE*S(+zNW;xVa$VwM1#8VdRB7DQ=}g4M^#@lpU;8B!*_tD1lIt?s;r4^=!&y95-<2 z1L3|sWQ`H0>}jn%q#?-Ud^_XOKO^J&W=JZiUHQ&1{TVz`xsKe}0bAl^^{pqRWWaR2 z53Hi~Wci4Z=0K=o+dTS3!Ob?` z@AND0ntI1K-QWGLTK-4GY5^Xt_>gH)N}V8@2UQ8fw>0k+%&KyH41*l9(aCVBmp}kj z%cnjyBL(9UwTXGBJ&t2P6A{U2R3QzL{is3-aFtb)@stc$Y=CMD#*7V75*~?=#~?q* zxIxDDot)o2Yl*c^L)W4OdHUBMcE%5EdK;5IYL4deGOT3Zs^sidxsFP8QZk(gCLcq^ z2RCJ~6qJNdW&LNMHc}Y;5h-&y)8}%00HfCR|2&0PSZ6?zcn$2Z?L`-gf@(_QO9uXuogY{+iOO5F)o}iq|fs4H7Ekltd`OnMj?Ot2$!G z#5MMrIL+#Vg29toT+sl^Y{tCMDk8aNtbJ0OA<`n@8%$ML$RFB;lCtYO2^uG3;U4H=t${5t$jznIXC66UC?3>C1`A zTvVX$AVESN(=pMnTQcq&cb$L2lnp0r{^c)yMF{*J-@fFw*OfvYD~fPX`54VL0qk*g;d9t`U$gXKWPv! z^1_|tkjT93wGoELTn+Fnpl|yw+a^aS8NL0h5ij{=nO^iasO3d*=FEWG{ z8@Y~EaQwpN&d5u*Yd(2%FVl)#Crkf=i~t?}yiTdHiXq*Pq)+AQXyB6C$+i`N@~S_+ zC{=}$7E&EoT7^hnMfWgQ&_QXiT%eg4Vp8?=GGt(hvDxQ#`X$Ed>*ioRLtIVo34QDxnxs>eQ*=C5p+pvdr{FRqt?(gMko%W_sU^)`lyZW zg<2$j^b3)`;v#5SRgv;c^BP83>P-dVdubwoU@$3(xF}tR5vwYrBszmhA<**!S?2+y z9U$R>xu-p*s{k-&UV@@|ZwBd$D1*=t60NM|ngE^dq<(xy+*m0D$Wcx#lo}y9L&ju4 zYp~QT4H}h!QDZ74zE9TeyDrHx4V>#VzY}zw_|(GRKOfk(?+3m||JqE#P6Q4pVX1f} zlLB#EVn(XCOfdNbM4qfI(H098q3H4<;-wg3Rb`Y!XV55uSqOQh!$rj>k$g^>MQ+l| zG>gw?7AB$o>02F@1&>V1FyfFhXatBA@f0X&Ts2_d3yL zilwCFl|x+R#BNlX2+ZvU&min^il=1Wwk^6>>}SZn0%qbC2tJwr}O= z|8hXb@-b25i%v0$4iT+%#O%xE@Q@0AgmwI_+*?iR&98>2ak$IItAa(I1#2Iynp)`L`I$@I%B(B(hQYHsP5yFC5Tb@Rl zZzMq?&TB}2@K+TvV0VJl5~cvN|{hi%|$|Z3ab*DghVlc zL{+S~I=zQg`zRg6)L}KJR;@sMW|w1LlTZr`Mp!y(VTB=`9`?ItmK!lsq2=X-GPGP2 z8d#Ya^-Ic!=Kh%8pOVx>XDTa##G6@Sf8`_58C0aM(!<2WqL8WxB|fQn6&G>@7X1>k z>t_NV84mr{tWE!O4B3opJDnLPztI}Q3q!I&wkzu{p8c_t&Cw6h%GN}Ez{i+T4UubF zZj`md1$F|&v7|xERUh!NoN}!r>SL9mKR)p< zeW|2hL+_v6SwV0o#Ct+LzgAlRtOAIKOl6k-h!aQ| zM=!97zT*dWCS%ht>(k1PnOj7z<2du@%$k1ot+^n(=}*7jG=427n|0)CSz?~8#4U40 zLbftN#`(I!3!lfDoiIEg48SEvx{i+EgI6+y;lXXWM)*}piL3DC4N4*@GRmrrww+Lp6%wToQR9Bo%7HlB zCz;U26oqGxH@_%uR%uOBh#ctAk}41ZNs{DAfbof+s5ahYxrv}oDUx0w%1nu&S>;-wH#<4RBx(Y&NsNX6LQ!ZV#pSp_Z`B4JAeN%ZRujh~r#)-R8D{`i%RH#+@c z%W~~k@3?B_uHX4#{RYoUgSjx#{LrHn$$3VI91BrMq+qnIKA6G8L2jp1u}I{qwoLn# z47!SPDK-LqB2AN@zywt`QO+`5G<9|852*3LD0!hoF&(3Rxr^fZg1+yvd>=;c9b)s@ zO?kA%IHGrd(&;3-?(6dwcn#n!8-j_359w zIyP+#4nY4R!t1d*8@uwBRSf7x5Lw~piLh*z(;d?~*BE3<(hwSBbL=Qls7!qLk!UH) zy`}Iij5KI5Gg4BrGA*hZYBkY4Vxn9)kV|h?7Ae<{&rWfY{47yb0xb`9N)!!HU21*5 zl9il0Vf^?MvN;)K@&6R(^*kh#xp`=QBvI3rb5UUSfd(9tasjjP_o<~qE=?a1Hk@oZ=kp`(234x|G1_ws|ZMU6t^;9j1Ukn3Cs>O$v~oJ z5QvfHZ3)69L^Uc}L8s-rmfM}_v>dN7$YyC7qP&7O2Hy&b^zR{pY+yNoY8)~OY>X!;ai!oyM-Vzw0<)pw>BOe1j&LZ2bSqU2=6bRcNgYg( z@1gS?kJ40%qeU@4dI{zUIFGJz$^RrcZx6$f)A#0HcSPRihzK zwOIEVlWe8IoVY22#V*Jn0WaM69HF#HEkO5igeXXWnF@x6OJgwf(~%h|lmf9tgMu*> zsIr1N$|0#zS-bs#HnuzzLfKk*SVf7B+{;-dAKa1gF-FONnwY6nSttiWx69t!QPBPd zMa$|8f}-v9c0U`o9o9efNrHW{z$GIrM!k%o1u21xkrH%Lx;omER4f zMY@va=*aI}5ie;L#mf~*s9_T@qf6C>633#5%?;9lIxE z2X-bKdhA+x}=z`P7S@nKPTk~4UAgbJ)vy(sZho%v+)IMJCS;a-lgteiWoM7!V4; zOy+b4*_GB`A;N?0@|mArs;v2RP}`6O8_~68Mv<=+NSZ4=%V~AvX-P*ZZ03ymuyK){ z&)W1ZR>m*-ZdUahB8)Kx%{lc^p@cj}Cc-9W)pN+P zwDNKjK?aDPV(P4hmI`GlogHj43NoN117sr7T-5I((9IZ??qI6=*}(PPVpsPo!F1bl zwsyu_%~?B7Z)7=vo%8LiN96f#r{6tiWHI;Soj2&{$v0*IScuY{5RoHH0#%H6k%Dl_ zY4V$X$Jq^#Qe|Aro7O(GXUvGT#(S>o`CfQmhw>h26{7?~37`4epM1K>VVA4TXKXAoC0i`&;e;|1C(>whH zHGJpw_cT2aev@m{AO7)QBDvzno0quMdu;^in*LJ+E=RX;6cf!Ye(9ho#>V&%TGoFm z53@3A5zdwb85&hX%JJTisHP%|Vuw{q>KgiplVTDGrBNH|dC^xgnK$wzmI(y#@MujU zg@{YA1ECT@--LtsWJp#J&wZ0_>P-H_nv{sFRP>Kfl3l&RV$)sxp-8I7oMJM4r*< zcXdvCXKa&S`2AtXb)2jtITJ2P*2Iw#MB-$vQ4SrZBg{#z;|5vJ3N~#T`I}uv9Y5J~ zi$3Q%{MC0LylxUCiA=M_kkN;#B7P{pxFezgG{(sY6}3u59YRE0f~^$sgHK^O;z+JS z;#2s{GoVxlh?FMD)B)Ejh38E8>80mx@ZLl3SXnA(-?)F;hQGSx6l5w~-(O@c*Rme@ z;YO1-*l1ItFI@DhTSH7b;#ww4b*fa-=YDEyi$G6JlRko6y0Jjm%|Y}SMV!e(WfRv(twU3iJWO*U_%2# z_|!2W%S!K*3aXMshhgdq2~1`=NFyenbLu0K?yv)~s)3T~lkiAq8GF4rmxa_5sUfL6 zcp|aacz$K*Cy$XM_#ToPujtEvz{1n9KxqT=2l^-Hc0*TFJEYBpAwkx+cy-5mXJ;KG zGrm{MT1bH!5B>E?J$|O>w0pFDU^>&1$g3i+pP*<)hok{(^mBwV$wjVtkSw0$F!}1c zKGxz)vB4eIlWSVm+@14tjc%@`n9cjJqVxf*lX$KnKCCL4j5Nl2!vDT2qQP5F28zfl z>Ogc6^D?hkKFI6Ia>2Y@l48zqfV3U>w6S6@@LV^S&(b|YGQ-XzLU}$BxSR%6PfyQK zJ36SNMlZKXBB<}2f9p1+CMY`I)Z4%H+lR-G-T(%!ncriK^wK@Iq`5=`8jJuy_Jt7VtMw$azu=(;cl2&}cDfI}X;SLOzeR zsUV|c2Ev1>ix_uJS~y^Gu)q(H%#y=IoxZ}D{D%>Ws|23=<^shnFOUjgQ$ap}QRg3+ zF+l=C*khVhV@6_VDn&Hq$Q$BmdP=UtPe6Jnh;kjIFTPhmE>AB(u(su$d?#`p%Wvvw z4RXGG%bXhL5FqC|wu4;f%^{1rk?YvVis%X%vQMNgt$RQ*f>0<#4#g!Ug#L%CfkpRr z8j6(bv^V$U{CuN_TqoCnl^9PMz67q+fLy0o;Ps>%!vqPnr5C_dOC*Pqt1y{JR1FqU zimX=vcEemZ27NtQE;5m*QWQ-RJTSgk^Jy>0xSoqA9iCvSC8P|UtdN+cQC$q2>O}gw zT@3wN;ELI|r%&Htqs^mlm{SU(*a4uh<%Szf-(a5y-kkpK8`Iyt_u7NPkfy(=+uDY- zw=cu%6`tp@5Xy9BOlM`0c&Pf5{xJ|AvX0e&7qxs%s?~`OAE+TA%tS>JAUcd!b5qm8 zg$r;54+-R4%S||!Vm|hq`gobq z+|Y#i*w)robls+=ruGiHuhZ1r)ZX4+EV_8D{n1CWd)&er!-sWucDjWgB!ivp?XAtt z-JKoSJT&22#!g1pjYx_j=cg9)bVP-cD&Rav%dDPBS0DaJQwBPzL;P;|u#5_OR3B5|9%VuvfU zo~$s5KQSVQ$yFgrzVXZ{7K_*mF#URZdXR%lLj`_?2}s|t63hQvGh>7C-t|Y3<(^eO8Jl zij)rZ4fdE0+;d?ENhflDdO;4935prN_~2$A?f%X<3uE9Fqd`LwPN2qNze36u%)@|y zmncS~JOhc&(6%8#_$4zD`P{soR=F^s7_M3H%Hfy&o5oNZ1{-bixw_w8`@Ur z(b1(sN4%;c#midQ)~f?8vld>tdIj5a_|uVi*&Af|Yqj*>p!sDO>61S=P-rw42n`K6 z9=ip20xzYp8-dVzdW!NimWNj6(88e9ST0|T%kfKB#-$mKqx(4>cTK>vU;U7v@B;k{ zH-8LH6{ZxXexE-@m7midU2z7Aic%dEn2*I*wCTKzp>f#sG*l=ta!X4 zkT?XEZw+KiimL+1_UH5aut;>Uzi@717k&D75P7Sy!D_l=lQ#;T#rz0omw&JQ$Ud_R zOM@>wy?*PsoYRwWda{4}^ow>^!{M)PVYjyX1=}w=_kMo*;#u8ojCd0b?tWh!nmspDDpl3OL;50g!2B-7=;)6TP@`Egb`24J)Z9Q#P z;FA^fG+(%>Igcb@&Z%i zbWP-s@<gea04Z7T*+^*(jrUoanFR^%x5)m1blaq0U>n)y-;<$ zp3Zg0j4G-hD6pP8=)?Ilhh6w0)-LIGYNh8E zJ?O}y5M+l>0|bAOftzttm)F_m=BC3BKm4zM{cC4uXD)}=U^#I*9)`aBfG;{&pl;F( z9&{Jo^BWr*4?XnIn{WPGcQ?Joj#Zet*yzg;QOL25Ua6p8#;1XmEXML|+q3MR_vQ~@ zdp&2}mXBw=o6FJw-~~ze@)fV7$RR$c2>BS$*tta-yTcCq>rFRxc6M=FjGY8WM?*gb zR-m(-27u`KJ}{Ubl=_o^zOQrq@!$C4AFtK-X(ZR_{oO0`rcUaep+3>eT_s(m-@{tI zx6aSIy3L72EaXuK_=kIKls6=mtBfL zu)ETIDLXUzyj@y`44t!dR^}&fxBqP2wuUv`pS&`2+0^Fjkd|!ggwwZQFuLKbUp~IZ zyiR^%IN9?yTYt#LGdrdg&w9i5e8S!+VMk0TFqEfFOovAjf6n%OSY(Gk0e1 z?9L|SyT99~y1J^m;;+7{uCDIB^&5Nl>}l2-japsO1@Y6Yj~4f9zxL}N`xvxk?>5&b zX9|}e5?db1+>zsLqfc%Y%4oRgxJc4e!Nm$!!Di4C0HASCdeW0V@{y0gTq@!L*AWk8 zLL|WDiR9TJbmV|=Mox2?v^U0e&Y)c?bJgIT^P5j}M&X}x?xiv?1)aL^TyNJkS2}x# zldpo=48*wskfKuy;nrPH*eD0~&{GK7hZM+|#Cj(2{r1uK{9@#txL3SMXFcEM&KVd9 z3@-OXP|F}c$Yz9HZ3#=bw9+#!%_9<1iAooy( z$>m$EiN(dGTCKjYu+(a{kUCUtH~JI|{L(x~G7ZDT0;T;~5F7v(0b8Vn>3CW9Vmtee zyKjHNeP%YyMD^HYmY)kUbX3+iaWBz!W?1@R5H%Yumfh?cmR+L-8&`8A@|FALBDH7S za`j>uubU#HU<}S2t06kK8g6DZv<@(+Kkr5@^=4pkQ7!ZKwzRy4P{ z$f6sJbrsGK-Q&lPo6JDn1s+CqCRKgEP)prT7=^t~ccR%uN6~9{CZk5=E0d>RfB)xd zQGD;`Jgl3U#9HXcdb8Qb0IA6^2irF)%(a5e>05L>93BW%#Ia=IYp*|Om`youn|F{<0-k0?_2G~ zYc{Wa!9!}Zts+tq=aLtHS zUKSK_x0xl`Qn;Y_wJaTS&}?%*i+lCVrbZbP$gHANY{?yWYgeV0LmaU4bIt}XT@%33 zF&;jiLIhQzbpeVa4GKdH*yu2T0%6&}J-thp?|Dg*qUel)k042sJU4QC=Vo{pN@-Kd zD)kBDa0(f7c@ss7g9aBFiBFjX+~ro+CpSstE)t*dY+-Wbs)LIytD1tPF*#aYnxP+H zM<6~J{{iHD5S9~hG3L&l@BkMjgfNv@nKz8V7T105i|1bUvPWNf@l9A3Fhu^h&wRuO z^|L9px?QMGssjb6kh279Bzvi)E-HCK3i=nq)YR*}IY* z>VmTF3>{Q*WNIVld~QZ=;U(c#{Iv}WMuG~zI3xq3PDyI+BfSvnaD*#UHC zU<29kw);ayZB`KcNk5A$btDF6*Y_i%2wC&uz^p6tZY=9=C#d3shEjkl@Dt?{Suz^Y zV1Be??M1Kr)n<1>8O6aKvrU}90Ti?Ha&5tN@+4~qi{LuC0M|h~EpiWBrQaeN?qp0$WCc{j?Yc?RvCRlzguYZ~(rg10128-82AoL=bRsI84hmF!&9$CBg^S z>G#t-Lt-ljydw+}tLnbx>8Ol4TP~xKJV{)7Z!TQIT?Cjt&Td3*Wqoo}P-ftm0Ag@? zD{c^5L|bYacQpVp4Yba(3?mA9kg~|!H7A#$?8sB}}GahjM#XHZtc;|zj{g&^!v=!>xSNzU{ms$G$ z-#q2KXMa*M>*TAW7)09{RtDQ{m30EKAjBIEWYsdN@p4u4G`hQ><~75@Q+ZF>9IXq3 z2`D)DbHu}CE-)JG*?@#RmKvsx_Hw}qZRL0e!64!Takixa7@AIj8+C9qAVu#?lFLva z8QP_LC4wuJaU5ur@tC;N(!RV#e`TNp*JWzYc8viBz3!RIkn&VXSXnl{ooiwa{qC3L z6eva}b(Xn2wK$Afo)vK@Pw)Llv!%t*0fdlLj9M-el&#YYqFSVHh7H@jw~ZKjLN(E$Wm=?q1o>2K9PBOF4TgFA0|jlRi@y-dH(u)yy1yc z>6&^n5$tT`rsF|Rdb&_ywf#-*YwbsMt99z1#x%Ewv;qOhw>R)~t9I8mBb3(1XvvMeiL zb?$!XgoVkCw+1e6-xyQ>R5QM{3S6h2dwp=7xy$~g(QTghy2nmz*`E8tbz~gN0U*6H z%@mHxIgbDxxODh{H(`=iZ}Q#uu03zN$-7>W2fi+JkcQwo$}fy?od$;OnGdz<*KMr8 zu=s?@Se^5sSs5X=Gu~j>VvxOd$aQc%ka5SL>9GhPrDORWo}L0H>yy&Mm_MA-Mr`Fa z60rg_jq?(2qNltpnOPZcCYFUFp^l`G7{>mjOSc1zmRU+yRR9C) z665C;RyTSiiMAg|!0Wl_(xjeecJ#tIf4*a;Y(s(0pDUe;=;NAA$0N&o%4usxIE2v*}AGHOe+J$J%-Dl)}HVv6hL8fLaW zJ6&WalB?Sj+0?|=tsOr#y5O#HXc^qgkO5MSmHY)LbDAv(cZxK>MXL0V^j;%7n6p5f zi!u$)shm~d8H02t!N9N*20ooZj%6+lY-rG)7jx~Z%R6@*M)#~h!Z|6hJB~hCIUiQG zMIt1ZoiIs~O!q&6@w7U(qo_{DU5;b5T<6CC%tpycsW)YYvcWNzB%j1ZY{+#ccg(bU z4Yb9@X0Nk*E>kiVaa^Yy(22jZ1jfd-&*eifXIFw3%8L@y3L{SL5Ey1%nVRzFR2Zc1 zmP@jMY99{0=UV;*j51{bc(@h?Rrj)fYH!j+y}E9;mGlzwr^$>2t35re>2 zFGI-rGMm%GZDVsghod_uPwi}c`)Rj9btUM^Xf#Vov#Y%2@fIk@TL7amcMt;^3~G1C zMEI(XzTE15$#wWA?`$)fl?QGl?aP8SawKDmp2Y}|yGu9LY+d)FUp8AO5oDNqtjZwF3#A|M z`rk1edccLmgigyS$}HlwhooWSp}jY0!WN+ zU43#>QAK4WO2Z^9hu9;B2gxK>O3L8k5U_Hx(#2C?Ra~bi9`(`duG~E?XW`APTN7pW zFk>Zu1?bG2xIBino3=59F*b)jkZqIspxBAHq+{p)?7_uu9EfcB3#@p{vmK9H3T5J$ z{m$fmmnD!G7)EjWt7ieM4#TjaT>~A*T7_PrJ#e0$?Cc?>PFH35vnI%(YaA}L;n88} zaCoQN62q9?M4Z)+Zr*}8gC|*%C$4mzVQ?f|WyQaUFI_Ku+}wP;MIniiBn-K{M3@n$ zl-0n!xa7759_vcUHU!G`kmS$1LR8Mym8*Tb?>`h>v?yU0R=1v?WD|2#)Ytmmo};w zwSz+Qqg-;)O*9cameC!gu0j>y3K+A*smLG%39V54Fm+IPVd2M~?q9d4ds9=JcCrf~ zWc)LF(-m*ET2!7Tz%tY-aORE6p+POyXg5|MgCJv5bQ(>7qoH!ZB z&}xN?%dsl1bMktf4}IzSU4QicJJNcc5`#RWAoi%Oj=l_X8r2Ey-dLNvZ{h@+-$s(l zjuNSYGW2jZz$VT=iIB4zfVQP2kE55*VhnB#4BM%|l|qG~ak;B1jl;Cw5~;2z3w}_> zDD)t%LA`Smg0v`l8NZDtD%m+12#RZ2iB(3pBnD|2cOv#9mNyp&?@Wch7)>#q0nU68 z%x#79S7BRpST zZsnff5GGDM@|ixgADV+!LFnn+s&?*Wg$CD=*D1kutaV%`3R-C^E0R>DNtA_saGkC> zaJX*L-rFCFkh(Fr4%(3Mi#+{MZ^cW@ zE4ZW(m7PTTBn*8JD>$gYuq(|D;p~WnTZMeHFdB}S zS+|Flyq`p~{CD@i!(fm!0n@cCwc`#>iB&o~b5wMPrmXO~cKYr2HmCrR=QTVp;&ms2 zv6Hd#pi-)eZdrs!9G%UCxLcj6l#sGGQ{2P_F}D#`%g<1x&anKa!pNx9S{yTuOpAH0C8-sNwYk)dEd{yAiv;>pO5_fz)QYx z;N@Qpb#v#NAFBDeiGJI*jc=kL)J5ne;hHP%tAiFs3rZE-m8Xb&FDyK5l{U&ZDl>k& z&}k8JX%HuSTy&h2`Ai;$qkD#|6`94bs*2Jsqd10@>{f+=M=4x)w8~3;)A5ocRxEAi_9tF#xfj{(bQD9kyOd$ zRi=EkTxSfIKIS3kmd4u+Fl6wG)GPXIBwn0xTTp1BG$`7kP0*?_G&g)kMaItOu4vJP z<+pzMJ#&sB3Jx4FlHl@V5+PZK#yv*Kf4I*bA8@hK!7&Fkvb`7^B*!KEVv_8Ihc*D) z@|{g7KirG?ObfZXTnO3Si#NxO`G=y1641U5d<2!G3HMo&rVg>(Cl_Ab^e_4}DxzT=l`$5JcCMKH7&+`K@@7vMGx*7b#~YdIxX~ zT|z)Lgc1mxDxg}RJJ}@CdqHM;IsSa~r+wowS`5 z8E6Ha!>LXS;w6uz1-@; zMygobn{Am|5_eJ9zOhjXYR5sa)A+7rAZ2;E*6(guqAK*2WE^xo3aJ@VKP0k4IG3fI z8l(5RHKalrSN@14qatP(Ekg3mW#Q1flM+MIil{=w!G%#8#Lk^Nun!&uD(1$q^WJFbY z%5#~UWSwGmxqmhUv_Yi;&R(*{4TTO%zk?7Nii9e5B>}3g3_-unB(b6I(vkBAAW^;w zb-+bKd`vEznMw4-F@()aTG+|q55b^sBN>65Ew?%?hVF5=rKP%!!@vrV@`XB;6CPdB zl=(mE5}?~Nk(Dv#=tkuxW5jQjpi{}%F3Dq8Z*w_ytnU568C*f+554#wovSei1F15z zI#lQ7aR7F&Z2FGtY<%)|F4D}VE;i2AftF4O@FM)V z0UD2@s{rT;%?I#70KLJ{ol{m`=$nR4r+#WCdiPJQf5tspUR~Q@dfxuiOa8p&*CQ`P zn3-?7L1MM7A&fl0Ns&i|u4OedX{JIC+{RNon!W4i*^M05u)iR7Kp`+^0ym0$_ z9~$}LVtjP}o+~|hm&(`Lc>Tnj$ZZe0aIwBwR18&MZdL1z!w9%s|ZGs`Tmny4WH(hca;9SWa+y8d(WrPF5o;W6aU5 zDdp`)er_BmxrgagGQ3=ZIlm&txlUH-lO^{)^R$OO?pGf9sDV7}+)M8N^iPgCyG>*e zZKP2ZeBc1C1BMT-gHeoUOq}~uX;dTEkpY8LO;-mvNLAstR-}8Q@+* z9mcNS=HjsN9S?+zU4l4#?U{4V0GkzEy5cTRs}dJ`!nHECH}s-1M||wif%Zh+ZM5a; zP~`u{QM#9K%b!YzxZzb<-^87>XPlrqB%Tg(k+Taj|LolII`xLqWEtG=m?I_l#3l6I zjUa9AHhvPU*}Q$iud5>17uh>|=YZ?P;6m2VebWh&LYo*mFVm(QT0^dr*UXfe42xQ( zymaZvzBm7^*?YpOtRLn}wLH^g9PyUfjoFUknb#eA-oNa5-@kZK;Dw|+rbznviOlq% ztri>LI-YfE3<;&`1dp&FI-GwZvq2IFUN6(+lEoh|4)MVamH7z?8j(cf1%0bh3~@7? zr+F@<$>pQ-T?XTf1B_fL1&~~3CYnIyzMmJ~gI@RBxyf;_fCEk~T!(9$N)PlQM`wZP z4KNbys&VE%Zm%elaT8OsN^h%jHqLcUh5U!#8(pt+cEA03R)F@A`+OFKwleYDi#NaP z=eNJ@q36Bfk@amGmsBTF8ES7uy{kW$NtHT-jaUvFnY$ndzG#lNgNBr-oJ&<@w=JpQ zW&L)OD=_dbB_s%Gm@XK1Ra#)F$iz1tx>n)foJw$L$8h395v0C+ILZ+lxvg`;`w~34 zy`qZQs$;k;D{dVy`^sz-V`)9?TIArYtNb2!OVjD)HioNhHwCNz^wn*SP49SMX{s=I zW$d6#?VRkuVbFCgE3T@c(M%Im4CmdA^}_SkU-bGXwi1%RA(q#ORidg(as%=1f~bxo z0ao?V!TEwz`UfHo@XNUmYkaCI@Cd{iiX-z?*H_=4Jid0#nz;ivw1c@`w6J-0sr~gzLe}bp82WuL3NBWfuAbRAG!7wpHg0Q=Qlp7wQlRe!rX&@@9}w-@|l_p zAw#W0Plr}(^hZ?D)R6eWCCPlJ@=8E$aupqin|!TAySxaCO>^tR-t@u6K1z{fB$VMH zytz!FPw~!!`z@u)G$#P_7hMH+I)s%qy6{6U?A6Dx!1+pICvIGV%rKi$@0XaEi zjCdOaavHfKU=YnSi0{zpje4pa+?d1Favg`eUwZKq9`i^X%k$e4gzMNGb<^0!&UI^g z8;%oIAJ$sZ5DPST!)`RC)Y6;HlVIM zRs<)bBH@+cR<(XGwNu&4@4&s>raBY9yfbfET9;ghzq}xAix(t{ZagP`hc~$Wpp4iZ z04}D>GLqdNjI22*m#SpSjCZ*%;?8ayt8sJ7VR@WIs;EOwjR84ulR9@?e7&05Ss7?p zuCXu6mojHu=Y~p9u9Nj`tskYug5|aZLsVINy8IM4SEW?Hr8gd_sA%NT*}{s-f#QZ^ z4)6pG;2vW!0O~67#*tBx`+P8DWS|7c81wa%e&FvvacN=c+PD1U@#p-<{PX@ZUF!GO zs-R#0=gU9iz3SR%Z(7eIWmImxV+VI#^M;QHs<`yEkD1-FHTBcN%fWSgqgC4I9iHn3 zOX|Y7WoqO){JK#;$vSOt9WR*dfa|E~^EXei`y~?S2WIorBKRkMTQ-;RL7hhR%mZr_ zsw1BT^R>p3BEZeEXtM>#A78a%Mdf9x2>8>&dgRfSRsmE=zv%aN9hvG+uHU&cXa@4$ zXVaX$bc_TCCE6(EuZ# zY@i>7$<}&NRxB1p>YSB;LnxeFh=!bv1|@LTg6a}}om8mW_yABKx%EL0=vz=;fG<{A zHzhI%Blm2#$U3`^wfYllx9`+-5D5?;Q)Fq8^pc?6uoIpabOSDMVU0$7Q<5SKsN^9L z1Cel%+z?4gbI!zYw!>*nsK?N4DIRL0qQus>uf5<^zgh(9M{oT^f8Si8Rd%uIsD1O_ z-({gb1E0^+6jA^ux*5h(`HbO~f}XJ|e!+#4@BiuAdDD^2ecz_4;F=rop`ze}INX%q zXJCZlBAhJhHCxj~d~LKpjo68;O|ol?JwYDyqps#sAgX=IA;)ldEQ=Npi<8@oOPB+l z_(f3ob)#&Nw2Orxk8Mr)N4n95V)5wSZr+7X5Qh#DsQWz?s_JkGac;(qr;!pvlf$T! z+k=#Gs*J0~&^O>tR+JJ$(^S#MP9FXN_4F%Vda3LpdHX@x z%F%57BG+7|M|uPLO`gFs)Hb@IN)VbLUfi2C(iGU_;f8D;2Ck0r!E-dXmea;3*GVrf z*1hXqo1Swo-3t83uO?I&gbR%Zu|Oy}bOXP!$5u!6;2hGepfvDj;Fq8q@gh-3y>!8} zXPM;vwm1uMxYg3YdVvEs84)oWeO8|JySYgX zx;J^fV`RD1AiGzEVKQ!k1i5S;4|rfZyjK1QmTBKp;YQ{{?l^Es}i!yQiw7>UsspLz)TKS*n|f!VkMT&;6V=+SnrFav3N(&>qCy#hx1|>j-z{ zi|5d(Y#+D<8J|a~8>K|kzhG+HWq(amKBNlFN3sLEyZioj(*F1ss1;nktOZPNDU z!@O41Rb$+Z)hSZ4SM__7$ptyFPGXvdgv+ zx>Ht7TFESm_$AljY%m%j=PKn%cZT7IRS||1X^5dkS9kp`6bFK1yFj2&f8yH_8o3c} zfNqg{O9Y`GL|oTg4J}GfbX6YZ?k);tEM#B>FOiCyy47#=G5DJ3&eSXwMs-ssj_k-` z8C>WB7;h^%D;Nv&mXHCEohbhdIv=ChJUE&+&YejY=XGwmnOZKde$bh7Ef~xAQ)Bc# zD`OC!Gm;T3J6j=QL#yTfZUlFfU6NOWQ_`JLg0ljKS5I5uGUovv5YV`C;ox`tRtVCG z1G`W8DZ!N~&^@3Q&aV@CV8a)m?&yLjf{`#^Wcy(rN=&cu4< zHuoH`;-;=ZnG7+k1SY1UDLj=U01v6M-5{UZe(oi&|BY+g%q%-@_k0oW;4z zV;}l}>#x6tt@-wXvQB|=pvuVuB%kx9XtFvA_|7&e;y{&E)tU^*nFr6X5CrFSNOw56 zA#1W0BO0GOg@;pV1U1$PI^a5920bvW-SF#zB53O-yTNrtgXlo`)>z4uC#7HUk61AY ze1-)D3p)D77xaa>{os(DHQL_7rKjV@>L~2Ur7addCCD zo>JY|V>tGEXm`t{!tyNQCEBp@IU5INIe1CTJ-nF7a3{x81J}yS1Cx{vi&4%9avgbI zL%X3hA-*a--~uQ-avcka2*U_GdgzMyC&KVwz3zw|zW005?f%5D1A`F<2 ztk7L};YL7lR`2NU;Um|?TYUdu$KV>*JY`@ti5GepRhoj|X9+oZ1SN|xqej%A&U0{` zxkcTrZP{?n>mSxgCZ>Bc7?sw#Q4(~0+>bl!2-lG|AerNiF7nHO)1i%HJj`47Psz0H zgn8$Nh5kf(u|Iv)OaG#K?GbRDmYr#qT&E0tEaV$KKN-AhX*_#4`yt+eG0t^Hx2_q8 z^1t)9AN=YA-u}buzxvsK`p3_G<+>kz_HFn3$M?VeN-r66dF#s{+9+7}=>}Gs!1rqE z?%ob`T332|iiEFD4C*pOeps7@){xQohR-NM3~mZvfmU!zr?{ut9z<%FziUf7*}Q4O zQ}ajO`{+Ogx-fp;LsQqX*8&s-XK<8;_2-ko${4 z+?PgbP(Ho_(?L(0dPSObYEd?sHH}w%KiET01Hba)Y-m}bvY_3lI1HNn*wwQos|>kx z$Uk?!(mzqUxkW|p<9>NF==icgxobzBdA+z_Ly^14mN=#HR8pceE&myH;*4h`%ixOl zl-l*A3&T{6200L-n$#J!9GGt>;xIH1SdKFseDRk?uZ~RZILlF4W^_NR$j;J_QpMD! zb98sMf9+C?{@VBf`f%tIqH38gQ2q}*mL~TDUIK{<-So&5OpygUX6o&=$*v`tAjVZH zGgox3otJ*)7m-3VbYMeeW6$^pI%b3FoH!mAwOA(+h!{va-^w<8RjaJ|gNV7P0<uG3S=6!a>i32$i@aQ|4FdB#(Dm_}{gwtikm>X{8LZA=+8 zy-S?fl>Z|b*aPs%f<^KzKL8x~VOmckZz8Rwfk)QJmEJCg=*pQ~_PL`AW`N4&DdZFw zb2TOj9fp(-}ID~|WQ>t7E_}N!|6kO*aZ~v{iMiO84Kf-rCYG(mv6KV{D9M_Sj*%$6L$zO&Z6h*_D_=l#JPumM7=M}gPx7-}GBSu4j6M88B2@oA<7cisDE0U~JkF&|N z1+Md;*FTxDm2|iy$XR(V;!ej3uB)spEkw}3W}k7d#ufL; z?;OQeg;s&6MHzc-e#53k{pHL5T(u$ zCpCNh%Ri@g8*BBFo;Tz=Ci8s^H+^s&k1vj`f5yExyzhVf>^mQKygmm;Q(p?~I)Coi zQEyYU?ma)yZG}rw`Pserc-N|dr3YQ^rBF~|5RGbO| z6UmJIL9o};!99wdzAoy$$vpSkVPBa>5_M}}Kt;<*pVHZ=IX-&&i~ z%J3t8rR@$-dgsA`ZmLV-9>NA(&O(>sJVJ(6Hw8DrBX8{d@VL@HkCmHS8n_E{O2By? z^e51Ds2`{|(5C1dDuTEyLY0@&mZ6+N%F89jEQU^QDqKW_+l<1IZz*NoLw=mo>Yh?1 zN|HW`uRn`K=MIFD?yLfi?wq`8hk3yIRuwc*=8!K=`pdDj93@`cB2gNtNlFa7NsR+<;s8A%S*HcC}^U1?+|K<(9`sEw0_*bKn zZhbDYesHvi&!5)Ea0iSwjphInBgkl>zSNbEPDQ>K6k%W+7YFAbo%Vk2T~9wzk4`Mk z)z{U!^K&+e@<28H7{g8j@0%yiec{8JGn@NGnnSfC36Ac&e;zB5|5HI4h4bQ;Gq}w@ zkR~5}CRz(^B~S^i46e+v@<@aH-UNuRDwLI_bWvi=V(8?y2BT5^^C+1zW?t^*%u$9k z;(eu%#<`B$jQ9>DgJ>gtoU!0M4MrN)ru-nU0zYWMlY*?NER*b(ry zZoI@!n1P7LQNcft6~t!L0vN`xI+hObv#hd=`CA2?=aC@ps9){P3zDD?p85|n4<6{bgOWSKsZP49dVL>zec z{J^wx3Je^Kns0}4U?tMC;#JU{fjwlz$TsSv%&O7>;apTGjn0xMg`YN-nt|U+C;EP# z@wFzYRxaytbRI?_R;72jsptpJ?1Jm$TPL=>_?H?R)@8L$oCdi~EMM-d3fcua@Gd{N zL{(Mf4|?5iXRrxuP|xalom_{z6I(6@)O>%O8m#n3pAyNkmbifFCg3)$;7nf+_Q2(x z^6j$D8I*+IOW=O=peI~Qtc|DhyvUQR;Jf4iXaYuyNm_KZRjqu|99pbRN8Muwp%uHe zxzPGk>$h*Y{E@8|=QaqmK6|#Zlwi>A7l2^X`(U+o9U-Fng z`Nz+H=^sDzxSv|B-&+Uhk&-Aj+(Sw$8~SOOCPqggA1;-(a*!h=H%_IX#mc({X!@L+ zQC4+oOK?|DTDi^x-!{CWnbvy2lGeeLT6ZvNwO{g?xvQ`11v*M6_~;AXq^b+yfw*e# z^Cbn7VVDC(rnXLRefgs%)^FuwWzMz=M{@lpTO*?*21kQvZxH}nnXT0u9#RnoDh$z> z)2y8rnSq|dSV}hEs_wWPk~#)C0*T&GhM?opSYg@qRYL+^l~+2e9P)SN|7C7&Q7IuO z%+Jyw{Rs~e6DJj_Y#+5cwUn1fet@BA8Jv$Zk_t4IrvqCi#QoDqiz+oNcT~fZ%m1`5 zX8$-~@FZ(<#p-}6Q-)MV+|kfy+(!O_mHr(H7`hhTy zK|lWG^#^7EV;qe(x6>UB(uA5MnuHQtrM{+^DEA1LeBZ8&9WG1mfkxSWT1J#Sf! zq#)`^Esd@2)p5l5)GJKhMY;p8X?@-I)3nHPn<2+owHX7+qcX?D4A357p9{pag$Z2&rm6Vr9et@BA8Jv&XN=E*rZV8r~m;Ila;C}#`N6(j^ ztctII=v@AfpM3g*&sXaFSHAm=58ULTSLj|d$Y<|KQoLW+ycoApyq-k`nl>ygjC9!awa7wM;_QEe^YR%HQtsb~X zI?45_Ty|LAKsbwpjG&>LOs?`=WkoVSUq5$7AI`lZ6%K^vEweh(5+y?PAr_1kY%nYm zjZ(yoI*5)RhTu9Ftz|j6jwRQj#&BZ~Nf?g|h=vNIO|S~x^=woEl}&Yhtid8Q3H3&> zlC#tJlYA=8w^z6*IzgT&DcG^>8bOtu( zN?ZSbzTxRT6&pUfmzT(F9Y=U2*9o#(*5clt%H)1pOCylCdJ-3WQ{CpKhpqVQEaWqT&^Z|IgHA$sNs~a zqr!$N)w-YdJM+hTSw9W6jRG$U3otNfFF>lJQ#*(llq2)B@X_)Sj!~pMx}S$h9;L<) z3k;uvP)($|X61o7xEh-rTO9pSeL59d3d3~`QqJYcGvA+(o4V)ErND-VaWHzP6~Q1B zip$_rh;ws0gDZ*>%qZ8{AcN51ST9AT!jGG}a|vL@aiu0^(gpZp5^=%|mk;W2OiUYR zFXb;4j z*z-g5;yJf)=Nz)ML}{%PA5jLTi{>suQRWD6tF$O3x_kve2b| zB6=`TP^eK_L`4yWcHi%RJ_~wxyZnhZ^os`6N8OJ@xq;LHgn%R(6I*yt#ksO3 zM2`Ai$|)M$ArJDT(My9Qv)QqUeT^&vdr9q5FHDzOUP6|RF`muyo&|?VkuqJ>>n4a& zL<{AVW}$D_|IrhYTK4llw9Q@taukMPtx?xu#94c`Q@%JNtzuN+IVqcCsV>!X;<*QlT=ASS`o0R(hj| zci!o|FMaNlsCswXv5nN>_5vNYs2OapP}!z;KF|j7zE^zRFJhH*#K6if6{f5<;>BfD z*?~zd7OTp{TI@x>YH{06llt9^ZwG{Y`@riPFR`4_LHFTvyyC)yKSJ&zccU6&a8z?{ zYc2_T5WX-Gx#wt00eB`h2*zM2m1X@R>8frmn?C0qk1BMCflF%gEYJAlT@qHIjKng? z4R3FPLm4@mR{rOaDD&(Vlo7BvVCC*9WrKoSF^elh>39eUqQt;F_B-l^!0CvKGnG|f z^E)3j`n={;7HsP!Mf4GR#gg}6++}r8MEzPvhHwQm8FddjPH}vC zaAiu)4U@Sus}6%O=Dr-T2id|%lk2Cme%LR>_&T)xx$2^zYl^O0J%6FN+@pe6c*gL-`%K$W2 z=L7rEFbC$b-|_q6bi~DNC?o$o5;TpPN8Q{6jCnd$35;`{!M-)i<>R0G;{C6<{;KP) zxZhVk_culHs8_%J85ex%@BX$Jb9QS>nM^bUzlQdZd)-=6HE`e~TqA&A2{R^71jH#ZqZBpH0LxB-yvgwEMke1gh&P^ zPv>NWMyS;4C9`nsm=|V^_0yd=$O1>xoNEkW`NbONOKI36bx2NTxfU{$K@K9%lQY5Pwj+23R$_NGyRxitfI+Zw#Sq?>*5DY{` z0tQzdMo$Ok+oK$K(H9|NCMxsEQbHKssO7+XqcVz?ipGidiEe!{39~iIw%c=^&~GHObrbEi*EDQR z-Z=*?%IVuTfwmeq;Z!^*8bl}*W5qTp4HKceB~b%m2U$J{5KudFbwZi>ZlpZOH@aYe zCqpi+1`?$*4E%_R_eWga{F1Y(E;(cMPzw)T3eJU-2A71;#SN!tRK3iV9Eip*1V;%s?+|5{`cj1>B(Wdx}nfvPy zY%B$OZ}0@$D2hN9*colIda?H63zeP7zP%6^ea~e5+(g@2-k#pn`c3U3>vJ1jG-wpN}tvw7{(Dcxv=}F>Ip^CHwQw7Io{2_On$cy6p z;a*?syXQNEO7STXpNIq640#`Q6?S5SGjb|<3_+v2Jv3d*=>(c(?gm$(_ z-B#3kd*=6k;Pd%`r7SVu-Lw>h;l0c@FUv5XD$<-*-2&yuYUT?l+MSt>XN zi+`u6MO*SzZbP?>nnYA0=wcy>6Qi@Nd<;%R;C+Pf$XO{2c;xhyB9Pzeqy)1-7!~6y zW`;LJ>3#SkC{KsR+e()G6U@7D^SGNcL>bJ8@09|&5w4RJkNfbh4?jZIAb4ku{NS(O^4C{-x1%j~Mw2RI32+@&4nIWQEi76!m(#ITqIqUT(KkkwT*snU=B^I) zV#7;*w*G;87u!N`9ll$h*=*t1vA2CLIGVJ*4D<(Fhr@ZPy&M&|Tb50LcXMZQcXAzQ zi3h*oso*+A81Ml(3=&5dSBY~88B(}YQ2@eqKx%T&KJ<;hqqP3a@Bax$PvjH^1CCG! zq2~vDj3)YMnD{a_uwe6*X5lWGsK}bdhTpwU?LGJCoRhRN8zE1eS2`7Kz`=u@;}XMV zQn+2Bo0M=)o$x@mb?_iJ7~Mqnydfj}11z^T9v%?_Qk@neVyj+zy$BqYGq!QA=mOnYhV;bn=DFlIy7E zboW?4oSDs13$CNX@b7;Aqh8J>yfy*Xk-oHSe?VF3rJ_R*aGqLuHUPJgrGwq5-|*sy z@2qpk=cYtU*QbLEmFlrH!FlBqzX%F$%3+(B;l~ZA5QhL<$Ma%Nu!flzw`*-5iu>5{ zeXsgL5-m=jDE{r0e-V53r_9#O_rBXYY{Vlcy2%aL8^}mb0xw1G?BeafJ38`JI+G(% zxgYuh;1Wi-p|3I+xl~>soSzXGCdJ(n0yBFYm_-9So$D@*f-W3js!m3XKgN($4$@f~ zMrS=P2bM28#@a7-Og8@Tezg~0s&u6D zAn2)7b>lqpiy-6TI~Agb$5M$Xy5*hu+ZJw9$r;>Eyt&0fo>{H}HzKiU`WmE9|}RsrHD?M?3M zS_6O(5`M-yH|fWy`tpK`|uUi#M^GDzQ_jd0>pC3-)7s=taY}}QXF*sWa-HJ<5#xTK_Z-j7oC9}ue zrN?*kIu6dK8_hvAaXucjY<_<3&Ht$PCRT;etVy2i``s@ede;~2{w@aJZSBWd!37Ik z_w0xcg`9^5xiRn0xqmU24ocx|sSSA)vr~f(gNPCC1jkaDm+=AYxmCyX+me)UI+zcOcnwm zM2@AHfrw_siX`~Th&!BEJZiT!XFu>i*FWoLBuvmKNf3j_PlYmSrFHdNqBIRHZaug- zkAf*LjSiAd!KmRha-$AzO&MU!-pS@GN+$I13m!W#129A2z+vEi)OBRf$L;N zk(k8K{cL|0&8$y6zY}g{j%rZ=I@+4AZZ*8NTWdG$%@?1i#Sy?7i_4tV_T?pGe3TCKQ0^D-zM>F z-?vfhY13}3nOggjpUjK~x@8I9uauV zkn6&z)YBbqNTKSXs-LK-p6cmE?HOEb$6f|jHVBKc5WqYdJkBAwzbvtZf~slX_7<&4 zt>(^NZfpk^Dl<{9-#dKBUmv&U=Tulze(YzVY|YiSMQWfZkS8+l()JtIfIPubWMd?2PRZ$n#V;Lgn{3L)++KmBT?eZ^?u6TIaEW{ z@*DR4;B_B|{e`c5%$m(RgTU7qxN&n3M36&Oj384FoGC}dW7&$8tAQ%k#fah`V49dJ z7=&&>G3R;SZ*&?s={7owui!)V3WIW9m_{*`rzb-KI+eH_ES-&Fc!8i<&Ii^5o59aG zV0|0P$p2^>N6pLs&l1Lix^b>k6kmS910VW7A22Qte85vbc@`sf6CqWS?O4c(<@-?N zI;MzH)jM+F2fzPUsEHT7?limlTsswpq>v!KX~%{uruN?D{^HrU`j zOU2+FZw0^nuBYYTI?-Ii#7f2eDB`2QDuGTNiZDBzNS?UZ4MF$L&+vCOaG~E+3>uy& zF2>0HNH0-dKpI>!O2;?jcDE;dQ)V*8Fxq+FXixuR14nnB=D*FIj^eh;gqw5Up6TT1 z*+t27EQJOKZB+6MswFgFH<3a!e+jAGPKeM1jijdbBnO}K@AGf{K`W}q{N4^wHU=kR zb4rW^E+>3;#*Ze0>wF{H2d;DX-Zp;Iho8jqvs$O-#TC~H>MB(7%2>s9wBJ-Vum(dl z&=;jZTT(w)O4U_u{q{BWq=|9nQq)eapASNQX@^{gl!gDfeAp|^`S~r}Lo;8vn+{*3 zg|;mf5~Im6Ba=uYEDPZ}^==(kyUmUt#8CfoRUqD&O#ZKk8_A+ENDRvVl`yau!zo?D zaz*>wFLVG`{JuVh|xjG zDP$hBpC(?&cOto+L{-IkS?ax`Oi?XH0f+^}IdW%1z{|Q;YtyUl)qKzYS37^UhWP0s zBZumpXw0waMvcPj2aBfXwJzFNPa1`zRUoi5EIr*!T?_?+DHGwpXn|6y-=au5KXKw-a{RzI@YQtoxLAelL5M@y}X z_jw>+8d)Z5qDK>P&v!rR8q=QbZBeSWFxj3zxTldDdC!Zee&k4h5~Wf910&s(?keZ2 z!H8QJ&s=a=28j=%jTE@%16qb&g5<1nI_~8Tj{jEgUX8-Bx-m+zBL6!*Rt)ECVQk(A zcUjGi{2Dopg1&%mR6#fH6eh6NGxCudC_p}_W<4G#C^iKrQo$)k*@WA*avMVH<$cSK zUC|H!ontXOxKJtsse{PSvJBMNluKl;!6 zx8C7}y>Ys;vmrUsD=rEb5GanZbQc{JQ$mYyJdx zdiZO83pbN@dz~{kLaG#-SPhPqn-SwmfylfsNXFgZtItjQ=-(Na<@Q1JaI4)oO+TWbmzOLD~;5sNmG*JYK+f>R&z*|-Kl5X2z zY{C!W`R{i4#f^WX5e#@~;vj zPS3#C7~s>fnhGq_qI~mSA}LJAVc?FwPAxa;;MSA@mf5>by&^he&Q8X_r{y%P_oR{|mo>pURoTGRG&2EDoBY7j zkY3#7w>7zYUo}51JOdcEWI$}>K;+~)7~dES>o8pE*?!K=bqE9@cjAHW8HR*2Jd8lj zOD~2yR6s-XMF>l^3bli493OhccP0+k*G#3mj+yxA^u^)yeD?od@mHIg8(K&GqtE}3 zqkr&ilcpdpA-E0(uKZRGmtYo!?csv4&~blr`G<_^Km09EOA?IkFtpW<>wxIsb|5X_ zI@!1Ss=uar@m6j5xps0LP##8;5oBbmWI6D`UtL}7?||($irtb8gLm#rH>0SsWkl@_ z1G_0$`6h#(Vc;-TCnLr?3S5*|FAgrZ%aZ|?TinRJPT+m~sSkMSXT00Rx}1}N*lRAR zEgC6lOd8f6@YbiFsQH(K=LC&N1zdxIx&~sCdnWU8ZhM6x1v@Ya>(2EmAl z&gI`*9gi#w(hc>(VlI$9NCPFZvb8#{L<6VYSiSwkm*WfaM_0FZCA#8(;t&G`u?6c4BjWoS9SgRTSN?+=$P) zB&(ECIsnmvMsxRfa7K4Nv>mFIli;jJE;4YMNB&PG4g&+hlgeVmku%;_vh1Iz(#Rj? zo|rkOhKwrD&J^%ehFJbr7RzwQeujn4Cm=~F>M817m5ANnUZkH#|8*Yy;oaHMmZWMz^)rzIHB{oX#EB z(Gh%RwjU?t6MS)$MO&6EgK{RRM=*265r`d<$5%v?piq%*=7k5YqmnpNnL*xwG8LeC zrr6tQo;R%zXD08X*>@GROI{>>a2=&49`gEUkTxQgWt|ePL#5z_23)7>@$<=fYWq>r z;AAPD;V zCd+UT9#jb6b`R8kq~i%a5pSQ_{E`P}+hTB?9J&)+hg?cFi{t8okX&a0H$RwG1 z8spZI>y&XH2*W2WlshUP<7h7Mc2@~;<6M?UUMb~N+QOy30>g0rSBnwXL!-OtxbZfJ zi^xbCO9OtSpOR&*t~}2W@UybFG21&f*Fh$s12?{Jb{56qMP2k1&Xh){==C@ZKwSa_ z*I|%ndB~6JV(7r7HWn@s(G6SSKdPRZzsaHH&$huRfx4*IL&iKM1`-|Kb~-jL!c%S!eM@pI&pFX_$H% zC7d|&6*pIBGZ|KO6J*V_h1S!nE%70GULbspBie6XMD?jKh&AGeAx)Y#yDdKeKU?DW zAuK0;U8NaqIj;QOSOA%iB_o}yz;NIqla2W5JIP*0rNY|irMIaN-5Lr zK+zOo7^`sFhIU~-+TQZ^_iex54(H_&zkA(Yaq!OVES+_;fL-aR3^A{#F<9Yt16ucvN95tS-cNr6&P{lst3p& zOA7yByf#SUZe)W1RV@eCh3nDV-tlmwMCT`PIMx1&13I#LI(RAub5@wmihxF{_gX2` zL{Zc;ZUd1A>XL8H*f)G{Vz+cIq6W*lTs8q|f~Bc~v^Pg|Mr~c&bjA`ejLGP4X<6NZ zjaUA3(NDXDGL58VskERGFcK=CJ&70GnX8VVvS=k*NcfHf2-l)hG;}?m+Npd``|YONsJCLtTLHQVPX7M6sfV-czZV`VQXV^(~ItJn~kpDHGUfUR(sWabeXmi z<%t}T5y(Cq2T6fxkSd84|4Y}WMde};5JBVWy;g=%U-%tduFeK>tAh6%+;f;pmz_MP zfu)BYk@IAsOB<$=WalLTgIo}z$S79#@$Ic9Og`DTQL|CE}U3`hs zZTU-kxdeIv4MYy zK*`dNi}oqyGZ*d}v$-v$0(#aV(Ru&mva5x+{{>ageUe9B8nqml@A%?UP0rzLBz4Rj z!I18ZcyU;kC!@IsRBnb21gFX2Wf;A*+~qQEG`MuK0H&z*CNd~BThwLh#Avmnv36g6 zwYN3obT9M;8)E64M>cGyJ4!Pf7uy#dQf)a4x)47%3KyIUi$_NVL?kGv6R6#i>-1Z4 zXI|zC8w^ez*P&ZRfZCIz*Ro%9V7L;JBRWV_II(u_x^91cNUqZZ*Fm=+D;O~JLksqb z)Y_ka+wUBo36AxTMq5;8_mQ60wO$&Ddgl#=#=82`@En)m+vB-^;n0CI@i=Nl={ZWTRrcV(aGfTJGQD7ir=({2BjF^^QJ%=*SK2 z$@sx~}q;~A~%feQJ!grDo`CPfPR=6Rt~&EQL~{Zn{)_-lUK^lXv4B6Z=o zsa=|-)23pA;2d_fdW3qX~(@f?s;tgHQ&1Y z&oVE&@DCo>+OR%|aww6WJmk?P2A|BB+QN_gFTduaxZfjQjkw9$Jq9Szp+HrsrWb~V zXKc2wSg5tvOtu>`T?|N7m!ms}PbnWR7DtXuZ#g&Y&ZfH-YXu+U1$-*!f))49H$6GS z7)n>C!tgR1Ua9F2By&$@yxedTp@Tl-GB2GjJa5apZmGfg*}|YN{|N>_sf`xg;N7$V z-5GOm^Kq)s1~*#9pUxB!2X`K~LwC(knj&hm?5RNpk5=RR)jes$Z&C*2kcAzfQ?QFKN_r1W^p^7uzjoQ9WxQ@|G;BKa|c1zvc zl;6;)TP}@ofy(X5+~Md48Y$r1vdQFof5Ui)LovvYGdm0}of_5c1UKfm!pUBi+ngqx z(_cNyDDPCJkw4C`LJZ^*?N_+A8jN{cb~?^=#x^FtoeQ^1DEhgVP0dWq9om;P^Bgs= zA53i70(y^Y9e(`E)Qv5!Uz|wSH!s=Tc|t+fLtRh#JTOxz5FEC))Hk zirsnNfKOCyo}r8C5~J4!2Q4zk$n+0>gAFaX@!9W`A4B0Iu7< z`}-$PzUs{TUhoCT*d<_K<19x{e+*;{1ItmmGjKL)7?S}8=CMm-_72GK(sUA>vr)&R z7`-|sMC9JJ9%&)~=O*2DWX={~l^+;fwIApX0WVf#5<%&(GF9#z;BFAOlOaUwIJn#N zJ#PWO$IPL3e6f9OFS$;?4sw$E;5xZqi*2EW>*OKHmW#36&qYt#J0mOC1Q@3BaeSU6 zoV%hc=yo3}3n~LGH&8*O;xqu)QM#`@avj{wOg#Cn(;vLQcWJH8H`gS*f#3$zQP4;n zdcg(?nadoR4Bnt}>GD$!<#B+qQ$mtKj9e>?E4V%t&fG_Zo8aXpV)Ra@iZ3i^Hz;Ix zexp(z1So*YFly~E&UNlsu%6C~*jhE;i0=3PXWYUhbnV7 zeIVMsaNPm4fhcYC{l4~!$s)pNAoa4=`b~Fx^Ao{Wu6p%f^{zjbD-R8-t^8c^9Rt-% zrcG4i_cu@&6clV9ov8Ig6MCM`v`Ve%_mdy_yU>L1>F?Av4c-H%Tw2{v$$Jp3Nb6?o zhuoNgF{GeNmJ@=ygz;wz#0Zv?b7Pz$vW;v4jyts_#mxb!4LM{ns$1_u4O0G=w`~sOOvf|rtUYQTt_?C?0n6m4;Az4?Bv>QTN2d+L)PGnxOWe92zs>8NPIH} zWkYmE+OwY&cG08@Cyvy&G?INMOugGMpf1!wRlLg#r(R)=7iw0RjEl1JSmlkR-uIHs z1H~(s3svcrJ3&e-`59chF_fN4UqjBtcyU3PkSdVf!pdr$k_oK_TW?PjJOiTRPJe>c zV31wky6mREw&tqAX*kW`(rMhBDNvh}1iGhcOj5_WADHG!KWF7IFc5>za&gY0}MVxd^ zEO;0gPL1;Fs7v>QV|iY|*;MJdjUYE4#G$N6rS;&)83re-!OD)ug9XO9&e#Svw{rpI z&x!~wsKmF=&PSAObr52fgko$nXF2 zyYELIRu`@V4n(e#CBkT=ZgXmf6JWgl}^Dk%@dS0M|*3?I-Dd zU;A5VVSo49Kh<@uG#jf$I|bL_dtL=tj%w7nO%}r_!x>a1Q9&aD-%tX%DY&I{(MTt( zXFKttGEjSNUI*NPTn9?R^8-ZYp>KF*ted@NFDKWTm;l%D8ey)F@4w+heewT$*JHQ* z;ZJY4>@JDw7e%JS5CMDr)Z>Pv9w(+6G1yqizRHU2r-fOvS-QEo1P9*RXX@ z##@q#GONopz(DXF{gnHi<~5ZylX?$a$H$P0&W5w|r4I>%cN8m_hZjzVQCG}p3ZsIo z!=-9o$KuFmSQ2oR?WdAaj9t1-WMtjR_$7$Lm?dT33;vcEBXFnV=N@L%-%7>3DnYT5~uZ!vI^SB<3Y zxXL~NtM+mshJltCbK}He#MLO!miWg5++f&1m%bMleyi}O&RKuStA0&|ad%Ds_|bi6 zX;Be?>vZ3A<-)W7Bj49;`{X(9;}^T5ZAJO_qDc=%V=PbX%AgKT>8it> zsU8}CycEq|xS?T!fW1HZV6uR!Wbn&Y#uF3+#tdjJs_684d7;9z)(hL7HgzvH6KD}h zy;BdNPfVU=++wGQv{8O$Z5#wTNzrd+3iKc_S!B^Ny&Ua^GdtX{Jc(>Em4W$mkf=s~ z!ju~oS2_tlt{s+xBM>bP)7+J+4#;(M(z4KwKJd#u0Quzai?93$u0Q;BPhsz^eFLTk zDrWs(dfk&V&;I*MKin^DJ8s7|dgN<dfZNW>HRAt;)8s|a!umDIn^-%Ep2BK zPKc5c6^L;s%HynK>$@HbDNoKS21IAjZT|$L0DD-@FqQ$APF}ln8r=LsJbh$J(~V(r zA)dWpgXR{hvT(=Ma@KICH&FA%Ov70exy4B+uSnaWCJ59eoplSxk2Tk>YuQQbW#7O2 zFOKiMR(3w*M=W|-yRUmzWufwd!V8QnG8hKKBb8cdu2Lr&fs?^GMnx0w)QRVG-VX~K zq3uFX2a)o_y46~xd2KFTTMG~Sle6orN%?_MY7Z#po@dh{HLB2IP*3aK$olnet6OA^ z3ujyNp*DWjFbf9{p#y;K<*IEc3ToO?b2v>SQIz;qg7eaH+$hCBEBU3JGl<%kz{bqZ zZRN%N%a0g@sYz65A)N(A%Y1B5_8O&o=XxOS!r7H!_{1Q4N&`SwND#SqWm%Rb9Sz;x zT-@4R$N!aAe)%iAcJJA>d-s<=^tijiCifoyQJhw?>&us4?8VNpLw5IVUXz(SqI?p9a1%k z2X)bQ_q*b2^~Q~@u8yM_@YxlZVR@r{2m(`xw#+dq2KC#|1Fi($NdB7hR~ z{Mh$G@h`JWDDjkP9B3JWVpF+GH5$p=t$S7+6%AVBiC6tdc#$} z_ZNXtm%jE%jdM0|@e}C>{zxsTM_e4(a|}e{DOcnYV?6kAkTg{mJcuU&PF%r_nTdfH zG01(y4P3EL zspQ`5#T%#kjcd)qo!;=PMRWS#!tn>c>Nmn5{KBg~+V|5!7hxEhUKS?u>X2V__AMNp z?JiBUv&KSk@OTuN?QehJhNb!etB$|;uO~8fm)HM#ecfj8ot%XuO-1&wl46$#z$8_+ ztR4l|7t@wp$kh%PRW>v*KWG<~`<+_52y`u(ND3~i!$qyQ=0}52r#*8NTN|E`bNRC6DHMr; zAFZrHGGWg7Mj06dV^0s#Py?gmRM&K^pCihCWI`p=(IuorkOh^AN1)0Cg7zW~w3l2G z=OdRS0diH+Aos((p~3wSXIPb20SUPZUf`4jHAdl~G3P}V_gcpHyFoYT zMLG|(Qg?1|m^(4=*QR<0i`ve$A@?`+5(9N1x@GXk#w+2MQZ`n1MB9Zz)T;RM8~*pq zl`v&T10ox3&7^3==IC_VDFZ(aMu&js_% zOJ4U|tqt4#m=D*pr1-_xKRMI>mtXbKnA14Q`ZeQQ#fiErC)mUce%7yfAb%{c-@YRFLhT=3I9a-Tfc-s9~J*UKe#Y@KsV<0+ZK^(bUE*9H0k2pBV+9N+wDg zsm}Q^1TROong?mIy}9{!AJ&-IFo8ZhNs-0q?XBMdw+U_Cc)FwVR2lgc9jY%0g;c1r zTHp`$J;;^LxkXj~_`z#m^YJ@HGu>9dvuB|;Gx>wbqmd5pRBTI1t`nGE8YDhHiJWICJ$}h&mQ$I88Uwt$Q`DHvAETEfZ?~41g zCdfa4bBP(UL9AqWF;Xw+-ueYUugAAGxgQT`OH8hl3fJNKq&VPwji02tu%T8pPc^|l zw63vFFTmA6l|mho>!b<41{`}m7D{qhrKMXqw;I))$fa0w!i8inywoCGnsjwy04%0mqgE^VbV{_+%HR+SeJHt#Iv ziUB&QAeVSIiGP)M;y~0DA-{ZKFGS=yRp_CPiNn(0S;bi=LyqMDu7^IOZt}k;To!R- zq*G%+cLv#e`-NZUr~hQr1j8`~t9p3}23BGmh_XVT6{&6^KZDy5a-I4V#4EE|tv6wP zzY}zVF1QX~xcuT9J~ll$6&)}3zw0ZuvlJR|9Y3)kM)Led!f?T$ZPMh9{ACN4n-DnB z%DZ!W-NNzXsyUk+kM+6h`e01LbsFc+UikXQDHC7+vM+QG9#2z)k#HJi=FpN}Uzq8l z-zt`_o>LKrRe56nQ|(Cu??SsR@~rl>RWUbp^*i38&AIPBxDM~{rq3llE@tJ7PAOtP zA{>Z{QBW4c0KD#i6Q@l_%?z;&NzUXd9XK~4ZeB;SMbshk-R%uVXD$HeohC61AeYaU zl%bE^Vzjv6iepE(hAn?eEB??RZf-tqRjvd4;0L|Zbm=cW_`E$o{BEIs>b!Gyo%4t< zUsFEVdURAesNi3Jm7D2N{&%jr&Oi6UJ3D(|>$YuS7{b66BwR=AGMAkdM&e8xAC6#H zj&>v;LdlfZ)(?EsQ~bzSm1QQ2XVxZ%ZEI#@VE7F=>6V2z6h4>+#nl*RkAI%?S%#}k zEHZHYJnF?gzX&27=RK}7)tzxRo`eK&-P`=Dpmey_Q^ z<1G|L*4K$KHN^o8AJeEtkdOh8kx)w^6f_Or&kL_>yrrNUCiM_}OQ*`qxlWfW4jCmR zp0g&<4zh|?6=>UeucDaaxR zM;IN+!zEuMao)~+4*5_3VzZAoE!>FDHQ}EeB~Y|fwIM}*Utju z_ZQ~FbEbOp$5op7Y3lbuBQ46Ki=okp{_)vj%gY~Pr>5FEOMR$5es?`UX&Y{D3L3`g zcWMnpC5XZ}t#_fkL5*yl;j)aVkaB4{ZsaHoFHA=}#;+R;+7d4_yOXP5`Z?vrcYezgY8y6yzvi3-Lmr0A?v=!`mPcHD4vs`+ zQ{p7|r3^4;f0Ja;6W{%P6V5<;hvhCyj9HF~!5r2*oXRX%Mt9uR6~*CX^WfBB zV0lL3AZFAqRwZneT2hf6ys6033_8{&dTp0om5}*sy^Rp~PfCvqMYqa4s&oDNF9#bK| zj+Iys>XO9@KU4sllcBrEt{QAOk{w>=#uQ{2cF!IfsVOC&J=hgU%DFZhSM^;27ByVLz$$NQo|qudK|Lne!{Vzh=4c2RZ4GUh{!T&sl1c3^=) zr9mGv1E|#Kqqu-~&khj!Z2)u06F&N$2Yv2gPx}m~SFiul zbzl1Ib1&Mtzcd6@K$KpBP2pMtxm9^?Q@g)&;5}bf`x9~<_SdLIR1V+)d>M;jIB`EE zoC(Fnnu1<954%xU6+s+;>!fHF;5zWlsbloYY2okd&A;$#UwYwR*B4s#9kU_gi~iM` zUwZ44JKnr4^1kjH8!LmRhe3wb^)S^LxDGpcsHjb!^pJZM?QO2NhZ&Q;G?`>)vo3HJR+Ivs5b;=E1aZBR`DdF*!Awp_&A5glqJL_mY<2y0<`hZAxgFfydqksYT9s-i`&fD9lp zVs;}d0^>D|3G=>}ZrpmOiDMi5BJRz0=dL-J`kCW8A&A|LVc+vPPq6jfxAxPkZ$0NE zqVp4+Ax>XvpgS&ak=29T9>Z!%-?_Pk;JA*AfLyP^`t2^U)|V(-!Pyn}@9rgVX4*pS zuw~2ejNAl@hFg>JQCqz|nf3j)Cf5PyU}Op-)B>u{5z z!iUn3k4%tr*uc+1Z}#PP+3?Pv$u3Ymj8UP!b02Dhd#p)v8Cw@Qi8?W2O(#+mrR9jL z0ZMWQg2tg4cN)V{N|58;&vlrkCJ2Q9M(P(e5-$+8u;UfZ)?$S9Mi$xjK zSrNuTe#O88rMyb8&t*M8pHOz-awz{RIScTMx2T`~#68P1&pUGXXlc5|V1McrU;V!i z`TWBk^p@|ja~;EDKeX$ipS$R3pF-Uw%%lE%?=OF5=TpnYfVlds>mK#V#h-PjM~*LU zSic_qbr8r#Q=I%@4wA9>x|6iqNoPxQ$Df}6?>^bBddz42e|Xf|`Rk9?cNQ4RXSsRG zuKOmn_FqkXqg87jwMU<}|AASNW?mY2Dv-iqPD@D*fu0q0#o58guGjzI&ackKo1VV= zzQ>Y%AKv+|>uXzo{p!2#Ub?CgwHk4gJu=**Gd2FlF8ca(v9`5-L;IQoyW{RQZf+W# zsLeg?+W&d9d*DAeUN^U)e$Rtjwbn!sx`y6VLPy9Gy9D z>&Lc!eWyNu>%W8(e!{>c$)7QWYAHC;pAKm)Z z4Z-F|?>q0r@q_h=iT``y4Vh;%uej{U&-}@{Zyil;c-rotD}vx3cI-dk?fLD4_i1Ho z{`~y^Jl;L@jO*@~*j{S7lWRA8e9JXEdg|T>w&(p$*6--4*5BS~*Hk)r-@TKc-hOou z$B+NsJ&t8Z>QUSXYoI88VZV7|*LQw)@zRMM7ynZ;Y(}3s?;6Fe6@%?PeeZ)ibI_{- zGz!qJ+#Nt^1K&^m0<}lWcTo$zd;wc|kDgyub)_anT9qn(bI>nto=q(YwzG8naO+N+ z{&L;dcI4+@@Xgl7#?+r*^e?TV`D@qReLg;Hzc;6L=&7yebq=rG$+?FhZeHi)2O`7y zp5++0Je7mh;A#HbO4G>qx(D$Yjo1JyTK>1isq)I5j>26UWcZ3-M?Y0)0BlB2&lIBp zt{6CukG%HI8UrUjHIgPGm*yAdXQpRp8c}Q2#j}E8uoVU^4F;OK$x^4kxMSkNzqsHV z^Zg^2?Rr3_(p;tAJbK-C{=bDwrgmKP)mB`K;y4nYIJoFBmgCBpR^Gz=!sO&6HGmG5 z+HDLNG0Kdmrv75%_qLq7)!$RQ+WYQf58nCb7S|oD9eULTN6+(GTl?xB2X>&>hgh9j zodvcYnA)G6_wQTkJAdvAy^sBD{+g>c{m3LA+x)%8n&~HAd+)uSYn#zzE1dkZ3%}N| zYq+HRzOa zmbjHsK8y8XkS^SVsjdQMH?35kNLsBXMw@^9$A6q<86t$vTXecO8~HyO!=U9Ce!yKF zGqzcO`<9J4FEOD1dcxPnxz6E3M@rKz1N-Rz_0P}C-u>KX{>}GFHZz9DeR%gTf9|~B z{$xpm;Qof^UiFLjf7_K_VvD=J>YqM+{`<}!T=i7#8P9k+685h5zsJ!J3Rj}A-^vuf z1Jy{Ur{D9_j`CmkyZl4TUVQd{^!41t`~SaMK7IUo|F#qz#dXhW zWen$O8Dy~T{r8#9XTx6fomcU?}?GTpHDy+7a6^9z^#R~qD5U?LNQMz49_eJ8TD z-+1<)T<}K^*`_Z1ugm^o{d<3II$e9^<$vB-P&IGu)F1t<+{*va(>{HV_dR|wIC|_k z|56nCF7JB6k?_F2=YF|35nlM05AXPk^UwNPu2Z9vR)2QQd+xIsE*^XCf7P{L*Xp`- z_ubz8CIbRh7eQW!+2q3t|wS-EeI8hE9Jt}E!XyT>1 zsR~u*{m?=X3K&t{-u2Z_nv3@xdj3Be&j&#||4$#9ANG&F=${r^hbA-R-hC&Rrmz0J zzbSn$$F_I>0*>f=-v9m&I5V*K`JZ=Y7@W-*MqN6?8R6T{X_qF?yW9I(rAaWj?`Q;I z9vB9etHfoOJqt-IPky|xVqO966gc_Pndbai!DxV^adQS|v+FruP+l&d2&DFBbuYZ< zKmYkxTyX_^prJxz>$znxm|>{&r`*`8%=&pNT{HWhpN0DET=vbxOH(h^e8UsNHH_7$ z>8M``1rtTABrKvbG1z*&1`_b%7ys@%-u@2I0zx+V0T(oCXjP1O3O_Gq-~Y2sGi$d^HV&NF+wPk` z_}qD~dHj66Gxxmz?AGSFRa)Oa|6{*WoTz1f8?yAA?<7HDpty?6WhjoW^OYDnI}Weh ziPJo?025aDtH!~&S~?kk0mzhx?sPgYdC5!P_O`b*n@vtmbG<EoaORPQ5i`Q*rJ=kmyb zq?pM;9&&|~<(wZ44%!rP?oCXt&Gsjza{>LpKH=qrKifx-|>3Ph%p%(wM%od;QDvb57I__m}>A|PyypsdYxzdotFSIAM5Oz>owyn;4?36^9Gmbf{|b>5=2Eqc`5~q zFjn>K)VXVGiy^9OZ_4)OPE0kYu89w-ByaX&8}t&Dw>|$?-gX(P3q0);{V z{aGr~^}qkq7yQY?x4-V^_#Ia6zT|h$_19i;|K{^Aw%ixUZ@?`d%P~7849>W*xS5#- zIxFtiGSx>^l!kLZv^Kr|c(}3H`bQ7?snY9j?sub_vZ=#J~(Gj$cD`b)62<`90e{1L69T~v~iwiiC=W%(EHKxx##`m zmAcu?Wk(#7C)(@RbaHrc&pZBB?_X;0`4obZ9X+@Z2eILk6tIu$ANqQnOl@5|b=gDH z4Nd49xZ^W+xDWlMAMWV~`|CSe=w7>iqX1z`kWJL^R>0|K3 zj}xKO;LB%a62+JEC@*aRN9 zPAx0Kz3oF+d|uBlM6>IY_R`_Ee9<16oAhRiK5B+#We~0dZs9VDl!qUUabYf(LHIaB zb%JMdognmdJDuyO6X>PMb+RtFPC2bf`U=ehKj=dn^E%y`Zv)p!^pX#*Q-onF7OsQ7!2uV0$-jvqd#_=)noA7(k~CQ?SN!PrTvWl=rfUy@gtSXoh=eqf6jmHJ>O z+v@3KJ)10YngeZ`3zETiSmL=g{WMLC;a1LtZk1doQ{X!KNc*~j*I)kGoi<*YK3w?y ziTQYH%Z`2{O0}}a1jf|CiZEhO26qcRjE#JLK@X#%UeP(Y?+2Iv1xn`5Z+w!sWoqu& z+yh_w1V71I-M9$4iO$=;|LxWh8MJdC3REF#fqW{r0@>3fBRd30p-A13Ypa z6U%mAC?sR*n{dmJF^5MF6hTE>d;Qj6D!FF4zFBBV0u-{qV$O zXH$IcI&d9SsV2CN4ChdOC17A~B1qJ|H15Z#O02e^vG5Q2c<8nNb^ULB{)Adcn*O0( zdzBw{&MMcr$r$ZiM?2jWaTezle!SsW;2CAtXwKgXjAv{{XGK68u)7ddM!g~3hK%`3 zJyt3-TAy7E0;Wjg5_9z%`~H+tdCkdJ^ z2AoNnKo#UBOO)4*1HE%wHxDPC_oXHVIN&PZowQvx5y$DICE6cWe<8YY9bd7gCQdbLvkH>!6jaGj@_US zQl2@HK!jhq<*K*|{t!8vd);s;Fp4i38}Ks^>XDZj2lyO%KZ~dWbfK2vi|}>^qyIbu zPtD17(2tdQh@<@C;LZndzDIGg4M8hj8D6?|xz4AaxMTayQE^YBzW3(ezW)xfx!+UV z8|i`f@u%!~3P=yk;kVxUl>05aI)E^79Qe>mz?wu`Rw$)Bj1UFfu(KwA(J*}oUZl77G*SevXaRs#jgR?EK$vLjb)cC?vG4CxJFS53w&15av z(%AWuhd1kM>RBG4rTJ6;!~Tfd=On6@Mh#8@P=DDLP@~!8we`Uu`ML#olF4l+EBJnfdc>Q4Yp#Ddm}+f# z;e+GZwOlogp_nUX9%MBaAP2tb4~~fu6oSpcDftx*pP%G_nnaz-AOFs0K*7}eb*Y1A z6DN0IFgq#FE4bct^(^NnIEz3rtw@8$N&%&_noX8(CQd_lpqr?4G+$`q2wM6@+DpYR z#bMOu=E`VjRGWh{ntAZk!e20+y=$Wv&h@{4u<3#3K<}ZgdEA8pm$(X8qFV7D@i`7z zs=%N#`9xq8fj#gcwKjQ_Cceormh0(!Ah(FlooO*FN=8`C?_ZK?@*eUsVm}EKDiEPajt9NIv&_gH23Zw?7i&scJEwdlt-?^iq7}7ILE`nKp>-~ zPAlG}LS;mi<=5m`XYA79BgIs7*I?82FZ;y8p+k#SrKn*nLaG~-8KTwMwMk8pp_&(Xo!v@reYZg8KyGmR{d`x;~gWrbdtluC98L{#fK z4A>0O#QcKu7rdA8$#ov|`X|@Pbpl;){KA`_2`&#l*2_{*0K^2&YAR^e>R>>bmv&V5 z=(YRWYr2<&8*X^TKlF|r%lI}G1`!QkxDJx&_q)mn*9ml2``zn~Uw8S(7vm%0doKpp z$yL8DTt|oGI?ytiU4Sm($I2QypN!|{kG8f?sOy&+sR_BKqFT(rb^M|pTa%@GcBRdw zY_grsbmp!)&@1xAXp#FPk?WA#kn5--PPpH)JQFN4pJ2vHb1rPaeZH87;6$KX;5x`i zsJ`nq%uj8o)t5}XB`^ot9os{JFDuKkxY?>8%x5hVhPh}0ItY=K3So!&4<`@eX7yf! zcU~P_*SMOo_$XF%IZAPWo5^xkADN$El^81#(4AX{^qdTG9RLJfwi9&yIhwy4(3RTE zDYsh$E^sz4%HUSMa$G0h+g-fu-#c&mehY(A>oaapUg(6mWR^o0MAiA?L4tEZ3}k>5 zY7C>|(9K(u>%?gaEo3}!9kURo$~J9OT-Q7@o%nZI+8TrFD8!+k6gdVr@KRDi+!M+r z(9mg_A$e&8egwUWh=60{1$qi{9pCRpYG;4_!or+ttVs^V(K+k+9c2&(8GK8m7+=SA z=HK;%nNT$@towW)tl)lK;5tYzAYHUePnAHXmj?OARXBtdAGitEaoHjl5m%~5@)Vwl zs?3g^6D8OdS@>FvG!0LI1>n~4cIS;?!u|FXzXBQ}}M_hf*X-aLCaExcL z6Av&b#Pa->haZQ~@U~x|<%;g&`#9Y191Vi|pgKK9&34NO1E-#(s-#B65DjgRYytW( zM^7u0vD{h|EfcLy1yHS(4qp~Gr-bF`LawB=32fjS1^tO5_kHI|V}3*nZ8@^hR8~L! zw*TDwt6#YCS)cx|%m3=&!CeJLLgRp3bso45*}$QF)n-QcTrxn9pZNB;?A#A{Kke zB3DM}I8X~@R!uPAfIO6@5@Iowag10k_Xpguxeoh#nb`1im#u6hvQrMr(!(WBMVnh~ z@4$)O*PyDRE5=Bj?Hmn`-B>7}pwiqsn_LGM*&4a^1It^Q+@PF>^@*H=LIYUb&RqciXe{O1^GGf zp2jJ-PE^!FbhZV*d4YP*{utvHGz#gk`AC-QNlc!0B>LP+2xE~9TqoDt)16(>N9K;H`h3F3cHl9Y1OXaS%mE8pTe3J7;;(Bsm8hPO7@M??|tiZ*KTMeCeN? zUGqr}-4K(laf?Q9ouZzq=GN)9KCva9x&GCkF+W;TT~)MDJnEa_9#iBK8FI8ck)w?I zeV<&Xh*f4wu7m7Fy9L+D3JMskw`FSki+?$6%p9LP+OIdF7u?sMn&m~#)o?lq<^Mlk z{}e}bpv%B)NI9WU49ZaQ7Ga`{tj~{9$kVGrlWIagV5A4GqxvbhPEeS9=>)6bpw&4U z!`M}bLs1c(lk5jT*Eo>UN^rOLwwx^Ub$W3aH4FAW@AFQ0GH|>aIaBv{ELkyi1B}_9 zUSua87S;#`w3WPP%>5b3$q;*2wNR`+--1>)A=fFjnQ)zDM8|cUqUFwtP%DbU6md$D z25DbtbX14bvFzq$5Rap9FDgf?q2-)Gbg%O}6lXbhM@WcH9ULx2IPe>gXFwZ>eu#zZ z6o-!2XMC+fvlx3Dr#*xWt|Mbea-*{CGj0YAzbkvB7y7QrxqKJ^B}1+Q?L%ko6>i?t zYH%HBvwobY$;q8BeyG2>!HIKu5{DrjBA|RI_=c~+b<+7C9c)kaAAZGeOnvCS>7@~L zrQD3kt-&O3t@#EzBy6_TZzPfsBbCgKIN&Ud*tS-vg11|*7E^MrxgbL zW+h+f)cE}G4hrAHU_3|mhtXA^LdK-CpT@0`!Ep)oo&eo}y0 zNFibl7=rz<_{Q8!p0p>fLx91Uk4(;P>+MJ2gKXk`3JR`lxq7Dz%bO>$L4 zNj>p9MkOBjG&)8$D9I1XWNMvjLqx) zTCV$?!Ntv`{}5MV!?(>)XJ%ct$;aAIa*=}@q4cGK$~sgnBlUj2VM z#|{R$iu<)rxESXVR6@78fU!yEs>9!Y+5h^fUSmNo&9{!vtvlS?cQ~-N)o&t~(E9SC zFgF~{p7}5H@B4Qz&(bV!=f+;D+y24ynqvygjFYqduwQGFo@H@fOM{M|S>&o!UD$U# z``xJnDo^i~Z6*0Bz}{^qIAOA^*`7etU23#5PLEJ2Sx|>8{lf2m$cy}kz3E9{HjRGM zS3$OEYU(+^WH!x)D8aOt)?s+1os73cn>Kd*PG0o2MV3-mMV^gi>(#!_PaM2q@tyx_ zjvQK3uQ$$}x$_&JFnMV5n&14`@i+Y!m+PU@V|2#FJsIc=$_3uKrBGXl zl$}iK9_mSv78!SEgciG--RVcQLWf{Ws9$9*ycyW`9(GILelDMJKn8{}egh0CP6g+8 z)Nqqg(w(2+76TZMBR%81=eg~ZrM!0YktU=PLBY>yMxKY^1vL_CdsYf}@uML>dmD;Z zIhW3*2^^DnNyl#|9)?;uMzJwhJ(z;a{~#H^o51;T3@{Nr^aZ_E-tZb6NJXB%C?80V zJ-_bhq_zYOg3iST)D;+Bw&Qv9Kx9A&rmz_o{rd2#eJ@Aky)?7^yy)dc7n&RjWBL{U z)H6|M{bbSac?S1_G6xr6x4&s(dd*Ak+I-*7h8Io;Valg`1$vDPIg&`=aN2DKmjzx)8rCpvo6d$Mg2)$VkXTGvbeq zhEo(MBhWhZ09=d;;SUT0p5x?nSo!h_{>JBZID2%*0cw~gJuY0Hl0HZ~A%!K^K~qnB zF3xLkwgT-96$MoX)B*g%a+em2DGI;euu;+MIj&QH>lBXbFieI#C?r-ainK-;5ER-{ zntRFx=`JC-WFM{UjtzR-%90PxG9>4(4ExxlUBb@t`p1!JzKl`^oBotz@}&4dv>;- z9$GliJb^UD-P+Ve8@NOXj3iiy@)#qLZVOzem|C|}yfpIQJdDFuP-O zP}m7@9i3Uv6pKTrPd_dWuygWT8FcEUN6rj4Zu3>}v0ODV=S0Uv4E0-9f5E|Ej2QrGWOJm|NYIYbnI8(VfesBM>V(JDMvp>B!j2a3Q=s-&AE6zojD$QY?B2k2yo|foW7Nkd z$D9BGd&m(bs2%847a8h0M3RB<3x+a|b-d>^f^>01EpQzeIEN3eV*)4^FX^gI-|M3V zV^kdRRS}DR!7EY@b)bboTx8B4gI>??HBH^Gb21lswrKj`hf(3z{2-|>a=r!REa0*o zYw~t&0mX?#fc)?YHz!*>up-U%i+Nt8xdp-M8LwMU>V+zO_OX zvXlzSYy9C#G(N17#a*+ycVO?#c^C8!w)yHC6oLXY-7=6tF^ESpM0X>;UX`GKE%IpF z)bTyn->I|lnu(+9x1D2dSnxpd!SHz#3}4`01b1^`;mD>BRRo@e9v1B%1A>qXj|>0A zq3h!FTDfYj={5Hs+`o4HI?anrV~3&)QgJicec_LFx%5?AY~p>Fv1Q z+qdT23$jC9kTK1Nsko1!HX_&NDz?yv2H>ha_fb+vZDV}=+8?UcM7=fHzGkkqVF!jZ zV0E=k%@fyO?YEj7CN}Xm`ufh95PLPHo&09nZ}53*N!eYmZ=@6?6X_ z4>bUZ%M1up5NPhSY^_~5bf|gmhN;aPI@cfM!$(k4SpdE;cR1TpuX%CJi)_&c%apRb zxd4^Haqsg!hvT;Q{G! z+4{k~SEXT?hQS3(8?I>`sYOvOj+d@IF|mHTJpY5v=A)p_{4u+w1tmglDQxn{^~W|( zZiQM!*TG%v(Tn4z%AYuYL;LWd_En3Mo8n;0+Vn)bbM2w2jT^aEQ-Qpgg%gYVrzgC_ zY4H6lK4*$uKZ}RG0n*|tb@=e%O`A6#JaBNsh7C|qK$$2e3z@n+ueiXPz!Bjb%u@6Da)O;4@&b*glh<^0p^_yX1;{*8yhr8lT7B1^sxsTor zbrW(@GqrvY`ay7L=}>)5t<^7Dy`mk3?J%s{qK;Ja9ZZAq7hi1R0z!EOT%r9ThQ89F zQjsY-)^>fbh8E8+NEHp=WEiD%!geQWH@vBOFX)l=ZgWdCU z{`BNTQMAZYLSw_+??LLOSvReAxYQ088>y`)Hm^5Ktyy&XMZ2HY1IXqyI6fPA{j^Ba zdKT34FwuR;d~ni>bZ%~V-sc962WA*>9JO}_VAR0?1DC+qrBR&hcg4`o2+w)WvrkUij}6XZ z>Q-4sHw|Nf4~i8AH?;nMUCXyoRGVM(0j;z!QwuoDGJx<+Sl4$5Pb@TT)HJbeKxx`tLEbu%Hv`=Y+%EQ( zZ$4n9FU(ZgOUj zyauxxps-O80(^nlm{0|g)^~buq4J5`=13CnP1+*9PkZkHRb%)r@ywGSJFa7O^t5L@ zS^16keBjM4KT!PgOAI(g37qjF`38*`tz)#qj@yP4>+ke?zqoW{|L%AGGkB#f(66I2 z=j-5biGQgI5^@zhS__SZJm&R^dpz%v_46k`|EfQE%o~5FbIsh>ulO{pASXv;_Ne4K zuyUT@n_)PgUgb}4S%nJ36 zC!DL}&htO@{lrdgUvtjy{WRY@2eG_={(}`%XJ+sEf?o(PsD18@pLoEl ze!IVa|Gu|;HEh%${~N#lnNNOl>G*LjobijsnswV=@H1+@JNMr2wJyI`x_z48JU2!E zhJy#*^e_B$N1ol~6R+FzsMlQ+%-{Q+FZ8w=^Q|Mh|Mbg^qtFX6*yaVk3E%qg{hkS5 z`Ux{Tan7smC(CV$Yv1%w-cnoET&sy^Tw332f+dZU+xqbwK@6fC{FM9rr{@CXO(bS?QnB4d_|0vZ<`OR;k2hl~MFr_))qHuQ@)q1A|^yG+}8+Gn2E-r4_viUcD{Wt#l z6Q4MC^eE?bKo$f@q3A17z>eWibxYqM=P8& zKGWmQA?dDn{OiKugPN-*ih9z5{Akm`pMUccIImOagL@D9J2v{y|NQP=Eeg6(*k!N5 z8*wD#|?$6`Tp$e?4uv^m`{E3QzuTGaGIG3afOHfWtrvrEZ(1skYT}BP1MW_es1#o zJEeQ~9C+hDaswkSb!DncUy>iZYl&rnjs$;GAfZaPD{wz#-0Wf5udP`-^O(mz>UAId zhb{R6B1RGhEQ``GW+y?iLf{g9Dz1ZGSX|vP5vW>2Peq=IlbI-;iPM=VnZ}VKHbZfz z)zLYqr88kVsk4^7KFcR;?QWa=-n53LT@&ZCxaxwc0-3H1@HL~e89$%)%ygVhO{J65 z=WIWi&8_LRuFsFh=WPp%W>ieZ-gIoHqhu;f;1>qO%>}|^$RoT@MtLjr*N4SyXs04O zQKR1}?X5YyzcbZbe`N1sXeMJbTQ_T)cHM+o?*$t=_4W2OpExnK)cNzrtlu7Z2fJpn zMXwW4=lFqxuldZD=5(idq8FP~we0qWJ-#%xeQj%Ly4IW0=~S3c@fNmGdr6LFIZF0rx0fiu`}A64b5zn&qO%dH8AUZCMaeiHKT3I%i?ugw)+dc+$PbEjp-hv ziU^FwFD9qX+t562YMUoi-sHMrrK9sV?M>%qk4GnZ^Y)^dJe^wDpROy`9=m?Y&u2W_ z#OPz`M~i7QFc(i9JK9m3;^0`v&UO3qN$uQqL2n|o(^0tghrjlorP}m%y>0%*f2EHd zTeE3v`%tIQlS(V7n7Q{od~u>}Uj6YC_1PnPyu+b7Q7;x-#$MZPB^VGjJ-bHVc~ekp z`PXV?5WOjd6xlU_zm924rfd03vzS@BYJP5NF}&xxI9(fNYXdWzg!)9QvwmUC-e-RG zA71&_(=!{g>(Gy^0Q50uy;pM>?KppepWsGoT3AG3-hlFH*tJt?Q>$1PXEXVH?01@| z>P@@0Vb<32HLx6Lwp&V|cuR#m?ew10heHvS=tNX5Rb?fm{b^*&)CKK>#e~1%*!3MI zDw~BRk_LqdwOMBxX#>42%75DR4mb@Hu}r6-_l%lYs5SE!ef)T*zhIJ1nBB$SdG*Ua z)t?M{t)laTxhPe&yxBCfX-yqjv#_Z%eZw=pa`iL6^qpsZZr}U=Z3e^Dw?C>CFGe6I zW;(R9HRN!*Zlbq7zWc_x$?n3BIKI^gtQr3ZyVsiFQ2H}rdu2L#ruKSxoSs>JnV4-f8M4Aj&%wP-QYEK%{R@|QH`6fy!bo#loRjIT|;V?kcpOOY@mYq+?yO1>OP z(Xxo0%edqc9Eg;cU=vsqfbs`iuXahTogG~I?mm8_gj1b`^^Ls!B<}*az!6k=7rx`{ z)*9;~=R1Fq|FrVza~+BqD><}i5ByDlGk(;89%$wKcSB;UUM|# ze!qTUgV6X*Q`~ia1K$9{z@f&yc))l)zUPSi)2fKOhYlTj!~eAl3raQm{mk;c#9Tf* z>=K)D&7c#mAI$m02@$tkulF}E`5Wx?=&q1gP`C@24qu zm0&O&h#&=dVHdq@huVCwmH*-uPd8aE@2_eT%uzRaf~4bGMbO~x!|YxkLUkY>e&asOkvycPGwGy1?Lz-k5<^=)wx@W3z>ZF7Vs1z4;DYp}h#R}r!^MSOR)DMD?Np-tW zK=*RvC7A)BGrB~9`Lgs?Htb^JWj>a{q2bd9A0A|N(_&MxrpUd%UZ`u$4Yy3>@f8$) z-IDL0_=@uaoU||JbY&vGx|I`|l8_-h1-Hkz9D{zeWS`%2Lgh=EsJ~W6Gn}Y2%>>Cv zPMEe2O~M6j2$Si7PT~SyzR_a?!`Eccz`0^{xW4u5OQm=zv~kO6MM|wGG9HH!XYyLc z@~h+0H(gcpazAz2(k0CauJR}m;HucF3veDqr%|A3xtN~kxaC`etR0z7YnYAMqA->YAN)q^=@v9BCiblex{4ex2d&hRO44J zf(BBT$Q!|Be<5i>H&>d`XBoaY&nF3*)vV|QnVD#9c<}=!)^3QsB1;lzP-r5fPy>;x z>{eV>xGa)fav6TIR4&g{Mhe=+)7dk^ewKJiPzz-_hg5vYhmqe=)5^H9>m}~!Tn9>n zPerS&9Le87h6>{m)z)m-5o z8r3xR(=Ys>mjzreC%c`i0wJJbLV*U#s}*Z%>D8Uuwppc{yHlqLZy)e(nb#j|n5-AI({Ve)FFZ^Tf^C(k_=XJLPLH)b>pym$D z9i&$`bgDDeP$|-4Z8Hz@qsOj()u(!Sdj4B~wXtz4x*SjIJQS`2TIOjV=duzx^NJ-u z|GzK) zCPfDaZpRsKgYcz)v!J!y(*xbto%3zJEqd`1(jJ0n)FV31{kk6&-K^ja(PXyLVyL7f0q;S>Tv7&IDR-hHE0w3qf-B~vOlDnr>p<7|tl zP0?@vKYLdJXhpTPr{~0NxJ5UJA{ftnc6T5us3cp>TJ7?6vpg`fbTkmF%y=d z`0OhBqJh-SAPI)djx0>FLctCKRy5GrepnU6N*Y&O{}ON=e*>32yoh%)6y6uW7qv<_ z;@c9ZVG#fS4*;ZRx8*zVSpTR1=jU0YW= z7yJ5%Tjr@kNyUj3s!Vraj+61tuE|}Az`8_2)vY8z8a!YxNwq?3+FS=_2m=}k%p>^v zDS=+u(1WmBGeBG|zSIR@zCh0n;gjpKgijd3D%pndfkr5sy~+uMy$k}QV1m4vy?Y8@ zGi7Tr%>rM*ym2mq5eS!Fc##x8@*&EO1mvH(MLZmyh2|acB~J9(CFTHK;v2Dmmg^k8 zKMI!*AQ&*LA)#MDt{q1fIUk9-RIZGO=6GwMY{Tpa%M6F!Tw_|C72)lSu>~=IbKBAi zT&hAB#5XCzEDS3T;0!vpF&R>18@9e{tUo>v55Rll@Nq>*p8Gyi6i5}`R0Ib@uwm5_ z)gpM~GSEJJI!eMDlc+^SmQ~qmW6lD^;GkE;a3F(q0LNu;iUJ%1Urh+*fFg0g z8(^e|MlM)Dlms=%1tm^}?hEy$Kwq-g|DWq6Rb6rhKPK?9%kYTCfyOQx` zrb1YVh+zdrDxHUg6h3-^?-~Sw0*%4oB=WMt!Qu^HP9>Qz#X$Z=yj>ADI_N%boRDZK zPD2?^PWa`Im=23~AS*~YEpa*TRR8 zC^KHSjgTI;EKP>iFW~d}CQvOJ83;HflXMw%JaidA5UyeBDGtyljF{$c5ifprj4R+k zRYb*rCo*8x04xtQA`O|78$2KdVdVra+;U?UxbI_2F*OFw4`xTa6A#D<5?3TV;0T8o zBs$D}63Jp=-~qu*<95sy9?_1rcMPaU7y}gOjJ%I)U)c~1#GthYLcuOI(3LlfuD-jX5;h{E0$?1{>lMYEN)5NfOsQ+57s7@FRWcK7RLFmk&w)3e z#RU}whWZ$9bs%+uQNn=H2NzNJkge;BO^$T$5i25^apFfRx`g8m6bd08lv_Kj`Qg4f zsU?`j-QGlCjhv9A><(lN-NIA$h)tgBKm#DI4l0V)IQOYF|b|8UUnxNV7c{ui06VMzki zM29s~RF7cc5Z95RSg?ff=`P&FN3O#$t^?zEwifV75x%;){O-5KiV$)gpbvs>@EUQQ zn8|CB!(}+C;>h^QV-5y%MRM@f(!g;zd>|ASTcRYW8NhWM1xf)5T!m`E&tt%Fk_`h? zRL1XS_(l{ByXE+SckT~k2tI{DcLPFX5#Txz#df(441iQQFgsWwi}VK;;lb&wS6kT^wxG(&LhD8`n1QoTze2Cg;PK*#oJ!fa`?t{wgdaOOs66Yhb{E1}l%L;+pk?8%XLY8DP|n z>0gL=0(wjw6gdrb3u0K3VI)QK%7><71=X20*eg?aWSe!WygmvqXMpj z^AGLo;Km(Pf1K-JmkWKus z11a#buxki@8PTEF2LsnJMC3ZEU-!pEjc(ml#g!OJ>v9Ycc!5ztCY@|h}(*Cuft!3iL9qDRqz>tNj>*Rcb@Vr0I5h=2Ej$8d1+ zYk~vR1h@{=EzD660Pbf)ivq8>_+(ryF<;Px!W1aj(y)2L$RQfA4)vK_P=)|a4Y-a3 zT*nk0Y9qh}S4p@@u&xVS)BuvOb+@&YvglXJ^=a^|+Ew!AKaA=5PCQOhS z;Be;+T%G`+ox;(^ff3x1#!WcDQ+nZ`Cv=je#ke3~W)U~X!4>CGn^twusdzpdXa`q8 zEd%$cVGQ(~LhyLwfn(t-q8+@Rh7lsz5#vxKIjH#6m92$-Q=55wP=}rYgvK3akq|;4 zZtQ461;9aIj&5g<%+F|3v%)z%5GR0}RA39XsX!-%=EcJ-n`!&92KO<_H7Pf*T{0yt z2>zi5OL*rAw0{^E96`4v3txZy{#8$g(Lhpc7(5~}eY%jvjU^33JBK&&D2}47YWexf z=S@`~b^oFAz^s@Uf+CSEzaE280n?0GhD5=%0%?MEl4TmE4lFY$!VJXeJPa&8+PJY* z9X~N@t7c|VVIL<~T4U<64$COuzrg))2ak%2qK7Jh#NhrjjILDo5E-oQfUv=6N?$Oh zLcoiCbbSIV5lE$EhZVEk3`2fJ&QyVgTB<1+;j&QE^!Ll|{irq6Uf7cL>5LafhKqxa z8c{nmoXTvxvZb5Zf=?ZgwZ(PEd@Zz&y?ZLJ@V{O=C%U@M!aX{prKQQ~A291hzFGFQ z`^0{#5eiR;6k_d}rXAC53n(8}I{W56)fNCNlt4+O`eo9MCgC_)y>usaMh@XTg^bHEoG{qng!UkA6QN#`&)R^bp4EEfa1oGE95Qs>1Gta^CPv|u&K zYi3l6s+xe$Uik$ThCcKYuWo8OlyWwkctXh`my{+{!HIdItiq6mt4kQ9c~uXXN>mig z0FXZ#$VphCpc-2Y3N{@y@ydq+XO1^aSiq!q`$)X)F*Q1Hg{2pd?6lrkFXx-~z7CWL zRVgc}PSOcz=#?)CJA0O>O4WHT$$+V`g^`9F&=DE|-7-rPsw+eh&<5?%m)mY!OY}>} z6iKorVQrQ|C0m-Gm>ER~y$;t0V8#m(e}}*W*U1EuL90jfMc%M;njGGgixWTCfKV7L zAP`wp0;<2{w(mbb`%UqzH#2m+%ZIEWVho41&}7byiNgJJCtO>(;)>^DN(iqJ!;fB1 z1yS0taDcT0&Z`1(9lzAxUVG;|T2%*d9a#$iPk=Zi0dF@(wg_&C>%c;1m^mVosz;z%Avgy;Kc%LwIS6Fs|39=C? zEnt0yX#kH42tFu4gVT`f;5~qjYRHfjOSN*&*s^HW&c0FEx}pL3QEVRO5}-#|URYXC z@^FAqF=QCPFmxX8GPGepgYJY}2cyRAo%nb`g{F(Zb&L)(0z;_e7>dVrw1H~7P#J2f z%<0poKG?D64M*4TjR8lA`he@;y+ks^3tUI^HIfVYlo)boL=;w)V>v^Yo_L0e$;^bo2Az-8M}NxDIe#yx5DkibGy7WmusIDxc1X z+aeOG{~ze4JP=e2VAqW`t7s}UXdSrGr;1WAw{J&P$j(<3oi;L&=+L0R0_Y(Yx5=;y zNC^DV4*pnO=$Bd8k_B8xv|F1>Z+R_T)!e3-z;$Ss5;`ecXR)ZzJ?Rq>bQ{yAC~RoN zmdr*i)UvE$#=ShEnrTr(bwO$>lej?7g}w|*yu*&ey>J*mk?X(^0^J(JX3-IN$&!4U zFH&8<fsi5m(NPkZ?KQoa-=P zQMu*VyMR-6^a=)znNi#ToiGd1kecQphUoBFBuCc#csBr;=v>4XQyl@X%Cpwbf}kcZ&}Y;IXzBPM56#pR zB#p`BLbr{u9swHQ17Exy7J&|6rZ5p+yew*#L^7slt7MorCC8MZ7pitZhXo0KautHb zt2m};Ed8@9AHywFbcg}s!c!6)A1shW&EaE}E#b4jZk)Bq zv<+X(k9S7%F!WHOq1R$J7IfZj7h-rTB4>?jDrzs&#QYq-N#@#kCu9dl=hAoVp@%~O zu$!YH=YoW9tWv^i#57=swc``AEBTJCuRS(nZ2vIFDH?8619^cg8L-r& z2XR>RNOeF(T!)#HnTW4hgcu!1i^U*Hs&N{KAn90gylP3Ax-V;BU#r|watndPLCHWm zBwJRj3^?+Z9W7~IdgCiUUHjtVE1r+8ZjpHz5{a9;Loyo6+vS`-3SR!R`Iv@pgEZ-i zq2%EHl?iPPsEn2w%Mu+`x1Dw~YPRBqenC+bUq&n=20RB^4rCh=hbd!?1VUg3I=eOO z0W_}Ob-ek*Ee7|ro=Ef#DoA`TA#6b4&Ih{TZRh9`lh6j>qLO0P8rHJZNYNKE{OSJnTj7f zKevMFIU+3&~io`29n&x_%w(8Yk`iv>Dh z^R46e0buH_P9=?E3PaG3XY<4-LH?3_oTEXE2u5ICP_yRNlMbB=sTe| zyHsojT!&3VtVA|U*r_{^4OOkHjtd(d+!jC%piQyGK4_9WkSq7ZY^a7ixk{*0%~=|# ztupU8ZQ^bbK)`1jCA@nMI0k;%C8BC7dwkhOrh@?iu#X|3he;T^847+12D$>XCV(5= za=DHQy+W`el3~E?57_}BqDJ!~1A4)}2YG@VD-v)W&cJ;KpXJw-7;qh$0p}m`U+H0`wVU3#cV-z9ZL(0@qOt z%WgL#W(y46jws7AaGgw`Z8%heA4or@9*dMZ4`nC`WRZjvO()&vfz$$^X67QE+upOC zG^RuE;0^p#whlek=g9LfemDZf>{IX}2=piF(acw;c;j#bVqltt-t~n|56xkzVqM<>>JyHfc37%9U&ZScVsSTWYRT9{Grf75np?OgCF`NV05rDjLEnY6X4XCzrz%ba9w--?eE$x z&9(+y2b|Kd;jTG>>$C#b3HIwZ;@ZQD!r6U{0vH6WQb8)nQhAvx3H6EPWsWWg8&Ly4 z;Dxc!z?0lqSQ3zwur&+I0=QrWK;?h}apM4vOHV7dx^Crl^Tw*VdZy8`vMwST2HrYG z1?PrY%9l3aNuN?ijia2&v>cJ`C5^ z;}ZZp-j{|ELxaa_J~(4T#zdPBa;gO5HD|ti)uS!=)|d=%3)4Ch7Yq~$1P&1RZW-NY z1b798Ie{}}0Z0?C;^s3Z01JTT&CajOc z0zM|AIOfv8T0yY>VGY1rylwgrGNXGGCglsmg?fOzLCTwID?=G3j2ue4oHw#CV9E;J zX5*G8bBw;A1Tmw$ph!xV9?(@w6fLMxAak_hr@95&0_nu`;zWh@Ae&+!rZhaTXz2;B zRNefYW;$v#h_`gpWhu%Rq@0iP(z{nZVQ_fwcBZZ7k0=hb_#n}8^aZp{mY7eYCBmpad6yO)y3YkA7< zC8$Hz^I7rX5j~*B4FJoT1{cr@My{mG8jmkF+tD1P2+q<#rRvDz^#LI>YB(kmrizZ* z+g`Ur&AEAf7w5I8oa7hf2)^zJ)~ce(+Y#9?Yr;~Y5NW9=f&`r$qlb9~V|3%jj|T-g z8NVWJnL1~OU@b|*3s~Wi{^Sr`zzRpy6iw0tVKHJFjvy&I_<{v4v{pe-WR=5prX$#b z-;`nbmxu4Cf>lzXvcwZ2EKuOAP+MQCL6l zj!fc)Uib-122{8j>W+A`NwAF&?-D^lf}{G$KOP0oSp1zWrpFBi_97ao{?ljh6>u zB5|{f)k*mRxLLE6;rXL)Ji+3)rB}|?>T80gq9BjMq9CEPP|;!p5E`$@N|xa_R1>)l zkYx-HM=HoPa4&rH0*6ncB~XrvAqHcz-P&yQ4adq`HOp3`8TbM+;xCXla1XOvl#}|K z0~puIvK6DQZuw=;L+EB3pHWbZ^By=&gp0X=6tUD%hT=+gVya|xZ@QU)3WUK`CYiVZ zldgtn#_AeM#%*t)hqhswX3lCyzwq;pJATAxD8UM^Gh_Lpx`%S?E`}taZ%>Jhnip}y z7P^S-6Z}?8_6b4gJh+XA`?vyLhrl3F=!C(03RDxAdQ+8@f@Ccl;W=;(=!6GmP73Uk zaDsBe{cjjy)P8|>r@WzT1rFrY!KuCgcyvPo1%`^F7jz_g%_$Cef{`O@z;#5);@`UB zNriXzxa|y|qr7_g^!q96w9{T+9SK)a56BV)iYj;$|j6Iye+^nEE`ha zzJ=%Q%@qfb#NxYf=m8hjX1vH5*HIwxmH{*+#0wfFj=C|Wm{gETpkksUYI00A{EX{} zl8oO-^SF+RZ_p5QWa-d=WSO2#fmmq4n~0c|6AD^)k_5hh{Qe~!N#f=bq)lf#d<>xc z4Uz!UBw4uSm*U8USHxfo*3hD0vL+LlLnKj9V!o(ofcN!Y&8&MwP@YiBoWz#>d~m zIrd_-rLvRhEk|Kfx9|o}pHLMtrhnTy>j&CYg>trV^l^~)$f6_(vLvXQ62>Koq&AFvv5cK~#N8R;JMh8aU)Zg0X_PgMr+PI$J;I>+o$$1yO+rVveQ6 z0v0~#>A<1~bCguBFbDu&z*lTz@tFZlafC3iP{~puXAvk7tSv~UTM(EEIMIa!(A3`l zdHrecaKD5snYTe$W1)csxhx7kJqPp;vJ0kA${Hkt6BSG48r#GF{-)uvZ%r%?V24=a z!JHhvtu=Jh2UcB!0Q?uy54=qfBu@VP;>U?QLa)KHaW8WsC~Yi3SV&|>aFwYiSCQmw z!vG#P2I&cIgGIQ?B$FQD1xpo;l}j~2VnUfk+q{QhQ`URF2){G)>nF1cMkJI`H+<5(i{4j3>>{QSX4cpOdJ9z$rW?s#> zV1W*y7#X^1S|Zc{3}tda_DO<-dowVa2&!e6isYE0(IG@({3*!J3a)LhzUa9=1ILDD zyyBErDFHRZ$TCe>*I0P19Ad&`g2GLR#)IFmT2z=P7K^pvOovy|1=^!C0y+o5oM6K7 zwHc5n92W3>V=Amud05TaF(Yb+S~B~o(bjrRz#S&Hpcq*61Qw!enJh^v2G0kyIH zU>y?W9n7tb@1`^G-E@#ra0CYm9&{oO@K898$SabN1w|y`#td>De4!0+9T))UGkCIu zmvk7{k%1TuQU$)Fqr40|F64}!gMhMzPCz%`$iRnUYD6-y3Jl(Q`N}8I8e^q3iJJr* z@lCpp29_dmoh-Aji8nAi5?&s&8tdDfkw6k!V!zY@M5@QB6)fPgq`a-V5i4g%31GPj1&n-f>M#2&WRYU2oEk>!>9~Myp2)@4?x47Ii z1FwU0(h!RL1dJ@6(}C+a0&pE+fMRB}wbquJcIz@(!qJNbc^DbIwg9g{P`}g*+{7?}zYEV#qA%loOYcOk zxarfCr!6SI=`(yOJoX9f3V4eU^OJ~;8loEn3&bfQp6pwbG%wX;i}M- zC;}}jsIzf0aUB)0>>5P zpzN3M)4~uR%n?4*Fcg`yM6*MPL4S|7G&==(O}za55qD^@Y+-c18c;Kl>)?HP;0u{+ zJb#!EUK5OVF%mdq%c95jQnvJG;Z6@`8ygn61*hm5Gfr=>hwR{uhd2_$z@>14j}rqN zzIQujMtwuGhhA_1H^8sqE(eX;7#g)477CkGdXj{am91w&UOg29StSF*$G;0qd|c4R zJ9jVik0V)=Vgcxu>vVSH0nB@{`U^ox=#mbWwha>Zunr`%$_n#htNRu z*1GbWUN*~H@XJXs*@#r}?1FhuaILy`0o9C0_+w;lD`8Wj#%b+*yXMH8U``12$+9gq zseK?4P0F=keZaN#PQ8H~vuwJ7F;8^F#_t)>@E#YONST@eqNT_^&#oWl0*evBl15f+ zBF0?^)5e#mTdeOfAqQR*FlpE;>q;-4oi${1%Y_RvR8}z|INx%~vc?)00%+r-C*9`ucXiOyL4$lNMCN~7E zcp!tYY_v%28gez0UvIwU#~8f~T(KOWk|MMc{2RqZXH61F=T#Te;2{Z~9?qSV2@@z{rlE?92Zu*AU_mFjh^rHV=&bQhOo{$n zV3ktM;>-;EA2>F~6&IYrlbmA+o{r9Vfd3{f45Ucp4uHzUzf;B;+#cbYkPgd>>WiIv z1Pc|%A{uevh;RSmMVS{hDaJ>9q1u|tyWSAX+wt}7csrtD!yuvZV`BM@txalnw!d8n zYFQ3mV8&~X@DpTF?(o4m<`3cR%rK^yCSF6wTE#BS+m`59YF5F(%O@%$3N%CWxBKxj z2aHh?Ogo&&mFMMH+@Qh17Y9&0UhrD<<52RNn1-=AW^Ht(bm%l+S`; zjK(b*b6F0t47?+rTwz+*DsIN$>BtxlI1al&LwEiFP&}?0z^pMG3VDOT{PlnouHz+w z)IIvz!03M~FdFaAlG7#PBm+?X23b#Fp(MHY{8Iadm70KDN0dM(4hV!-w)6P3{&&gDENJ~~S&|5bTvDC7;_13X z)hn2D%4|FdEGVV}U_Oa~d2k)Z;WqF@mKccDcx@ef0rgB=grHkk(m1w;vwLTdFYt%) z4(L}cNMBF9CE^6L3x;Ny3UVDv9Il5bRHP{g^od-@jBKeFnt0WVmki&kvtBEm@>=D! zUz-AlpW4F@VDSM*HZ|R*SLfiW4M6ORr5`H;1|3)e0kLp|s2Zm4;vmQ3MNv{@;5w8i zOa_XZdruD|5fCev>v%^3D+?Ns0C5jQoR}3bKOM>hJ$Nqp%v_zT?1a~X_%H2 zDM}B?Zcy#2u;JjrHBCiV6VF?!CgD4NWD2hfA=goe>yT?U)p_0$u9+gmD6ZK=r5lh1 zS|$FT!-OghDnOcksl?C))fR%Cn0Z%#6%Gf$5FFeJBCezGQcR8sQJ>w{7p({dvvO7Z zpeMeG19$|l3h&%HH!~;0u54X)+6ovuL|zt@4nKb1HxR;mndycSs7l}- z7@dXpxQmWyRfGe>^DI508M?pSCu;QJA9}I9&w|+q_YS=ru>|6P3dzMiM^yr@Gv@q5 zcX;5mWj;Hzqd2eMFyJ}?D~PXx$DJ-3e`vsuO9~*{SRSsz6@uq7#gkijs7kmbB-~IU zF`eKdb<#}n&<)USs0Y1fazFZ3@nBo0Wo0(VMyQynlW^z z49TB=-m6V9RUSH`-Qj>0kPAGM5VPKeV zcRj&^cQ`{3qLL&I?wi$;o2}(lp7$XQG%z&qj=|>*FUoDn2(|~LkS}voA$}pkrnv)B zLP@6-;=VT?@DT}oXWO2)pIVd2jo=4xm;?(yzz6m2rIy9ae7X<>UZy)Y*o4GDPFM-E za>b$sBi8{I26k6S4PAC;VY5gyeC444Yd{zX4gCHDd(R=+Q+>F#Lc8&9aGvxI*8!bU z9VZ(lY&sdhIbpYPASFrbk<-j)Q9h zY*aigq*Ejr2`#ENb-@FjK;dfXfT!d?0!=-2DiW@+xZH}P;vr3{FVZKBp?lGFBHT>D zeNC809TX;3WVsQhXgcj1-mw!-u87AOb(!IL5C9!>DGy_uof> z79D*3DYzhlKF^+uqQTIX@k$h|l2l+tv4~(>qAZ#+7m{_QsL*Z^<)VUiMc47up)74U z41i#R5Urq=1qqFatwPBB@am_7x&ERytMcyuwKtVR+o2^L-v1XLf+%M$T!ous_vC_= z1A0M2cWeUC7=)!5FGq5g5U{6_9g7aM=o;N6gqidP^w7mkH+~Xa2O`8PlPqnNq+UT0 z{JE0!Pb9}X|8B$sVhT7W37W;@WG7bas7d0ya1<;~)VYX)Tu16q1=R=iT*A){S$OX) zkRJ5nN?gf8Vu+h0nI)+Z7!^ApaMt4#Ue1*KB?4D7V;;XU)M4XlKjDovGN!~6YdCHu z5agH+-Agi9yHCuMc*dYy9h65(-@tP`v2L8MbJqtt!VsAP-7*V0f&rOeD}?S%PSF5Q zcm}QmV+r25i(E%Ut|O~>KZIj(R#Y@}SYc66;2(Z8 z`Zzvq29>VUt<+E|OjztF0x~5n6xSG`|(ffa}<}S%f$K;Yb1ljzpi3;)&}-U9MwD zc1SjgFWP0qyn~A_-nBz9G<>|14L{UCAg%aOV>_T_K|&)!8{c6LYssx|ugeW)#j4xQ zVgVBciGV?rt`FdNo*2@TK}EpM@v>p`h^YZdYAPlyFdRP-sPV$^T*c20-auf{qi0}< z8E|cwhi(M^aiF@hK7pit9SEHI3nrzDuZ;;*QXYPHB3WiTN%wFqyb5477UQ`#fir*A zo6h>8^?@HUO+|4;Hovmk!itOwc}bP7Aitgsow0SWcEZ$T1QZ-Uvm%Ii{~XMo6rJlP z;m<`P1?!2pPXM*Kl;%wHF&^Eh5@CDEW4Z(qQKJtGj;TDSUam;vA>qkIx7Msn(A8-hN5s}yGEl?p29M{upXNcTv!AYJ0n`2cxCU+|CoHjTu!AdP7O#Fna%0$>K-uv!hez+vOqmMQpd_6uNm}~% z23DYPcv|%4s*y9`wPsX;xFI`EjC0y}$6T&Ao%wmo1K$TM#hWB>d~hA{_|5U4C z@jV7qM#In7OSa^9RDqWaQCJ~W;-xKEjG3bD*HtOQPz)(5YhpyAuWV9icwxT)hD=!^>7t~?4N&F% zv1xgu4jSR)gwvB{nXoKVMIWr~YzIGLjrS7K_B3!fu(OfYfKQ9JV^CN~bOij)DGQAu z9&$YV?vb#Ir!ocIavhSMLT1K)fh7I$h)AdqDLPR8HrX&>^^@SNLgfT)w;gy!QC7%l z43(B;TB?Hg#(K2{j**4XxYIp4Cj&L!A3<|);>Zjkc2HY*hblh51l-Oa9?NzyMt(IAB8M#S%~6NXQxUhkr1k zwGnd%CT=LCb$xU(Ct&F0z%@$PY&gho;?OBb_tXVo-jmf|iEfjz{t4^WZ;BxmeWD6n z#0^r7*AFa;&Jm@6EU|OInJPKq8d?uNE6AcoGi(cFOa4<5Hw_qZLL;@dz#UvO} zV`j-n1)96cWK~@0o|9}`bmBTRBVg7jFI~~C;l=<;@}DaJs!^r{P&qk@;{+XOfRY59 zRpdf~rs3_Q)ay!E0;hCk3#8t!{u^cABOLej-3nd9G5G-v}FdZ6$ zJCLM(9WoK|UKywt7y_U-Sb7A810R@k&U} zHwY^W42g=A>{!^SaL*_k2J(5&~K#uCnjOV z##pqjf&{=u4WJF|8y(n3-M))|8RiQc<_mm$*OmlbvT)V~3+(F%@M7cV)eTsB0lx`X z)rda3|LDSy+$LI46Ud0|_zh7Hgax1c^+k_DM2BB@D&4Kg^9nK+N(qia0)F4zr}?6? zBZ>yB%MF+;M2WLiJ{k}W8Ixt1mZ=%AK7)t_aE9MB6xhfG;%12*U3evhCsM#MUJ9gz zTtG7L9U`)1ady~<^|^Gb0ki(e5B2MQ!;*>I!HDYsqjMz3iU{)i!`s3VjLWv<@F1A7 zlt@!S)#XN>IJ-cr?vTQDn6E@2si)-g?~!iN$qk5S+>JW<_}3v`>)xCVNq{n!ImUIM z?fMLX4+*-)n>g2?ORojQ<+lOj@v4^{X)eQynoxy!|3BVq#iCp2H}D0#AM()az{mdD8m{h=dQSVZmgk706TC* zy^1O!85l66fdWkexq?F{iGxMXOp=Z)LkMUSZmS?o+#G;b%$C_RNk%7aZy=|MLke7z zloK31he^u66Di5)nx>wT*wvY5lB8sSdcvw=hFEdQ6~&OE`Hf&vkg$Ql6*qnqjL40h z+8ZgDZw8h|7R;uP)J$MT*O4ujaVoaB!d)078M=}JEXlZFOkIKHPh5vC*Te(BfW7%b z5(U)}iR<7eZK$olftFe}XPb^ed&5HZ(4rl$Icd;&2Yfl8y~!W7IOIA$Q_uqu;5x%Q ziXB1tfiLGZ9PtDduS7wd6c%wEN7dA*0!cA}>)^BNqQqOO5c3Pbb!?bKEX#`Nc#R9m zhd|Gh0@v{}h)JVkJR9tUN63z=hBFhUg%$@RDXjiwS++PQV#KnyEGjVj+P_3JzX@E2 z@{1!gavj^wh|0AYtr<~8WZ#VQg7rf5z)UdH!Sfq3$Rmw2O>`24Rn0Hs*MdE+V5}vyQ z^Upwo8B=&(37}x&={%4!$u_R+P2#Eqk~Cz6g`eVpnJ2uGxLUNNQ)e&C*83;H)xs%N zI)&ej&>ul1MB;j*6EmZ~2hYewLZ1-e9Qdtbe4Bt()?9hhi*{>+Vk(-diM$_QE(q@9 zLj(Cpf*U5;5J-!{PAN$B3h(IF@etg-l=^h8Z?Q(+EhG z0;@MojrlarXsE4-1q|M_1C6}euLy5?0jB~4;}{SGzS`9>1$^VXfe*Py_P+Jh#*DyN zb)*d80M`-xa10wES&{N+6m8-l%X; zO$UmU>ADB{KzFVd(4FHRxQ^@DRWnU@-g^P_u?|nYTPNFkYL;)ebXluPD(XKStp4Z# zNuso{1i=v%xB#bmBB0@Vl^te*Im2eeG(CXAXYLab0ebM^8dJ#evun8i=<1oQ(G^mQ}+)_?P7lWSQIfOGQ@!*;H+`C8)5D?E!sxhLANy25fj>)jAP0v8Lo0XjFY-}MFvx$%4?g8cveB|508+>@j)NQ|*0R%=j!n$Y~L44=|Us(!V zhd1QmeYU#(1i`SEU;0e*+8S6MsFxOj%`cI00XdC>n+VDLnA@a~us=4&8QWS)2h}2V=pg;!2`#KazXHOf3-{qS;WBVY)gNmE{m4G;zBogB4@lO{%JoAJL1arlt2hcT_ zbpqVD&RADra6^TvN{z+Sv1XHG@tY72A|)VK6_27jBpH)3r8+xVrWjG6ozaa^w*Yr; zV6MtLc-j;LH%)kCdFceKS+IbCh`m1$M3SY9Ojr`(^9H76=(s9NRFI2!UKvP-L6NR2 zm{pRbCMIs-X;KV&gXgdtrzrt=?z$285J$36!lsh}oD+5%2U3!>9_idr_Zuft8)9lB z-NdreBi!zg3N-Nkcue$xPEM1{WZmThMohW`4CZ8$>If(JxCshg$6;!^c7<23fZvEF zpD{d7Xu?pezPwr5X2n9LiO*B4&8+uxyxbvZz6cN+o(npnY$=w{@LOWcXQ-B>`8CzC zW1MXWrk!0dVC%b1<|TgF<3c$oXX@OV2Vm-Puwe zeD7X)|Jn-p3D2`{szEaFfMXwR^I&rE5e*)gj$=8NZsL89EF%d}IkWuY6CXAlY?}}H z!-Ax8c+t+rYi)|ii}>A?HA1Ci;Ctl3IgPY#D5!|5dqA?ir)CN2jILZK;S5yW`tfXf zk#)jziK*&I+=Gj_I@$0q2Biy<%nqdUKvbPM@WgeuULY@YLl~k{S7V49f+F5YQ1IY- z^b8XQe&f*i1W7U0B~4&yppdu{oT|9Kk1m~h9m{Qg6&Sl9wi zAvhE7Iwt^JC&X)N*p$Eva2?SGu4DR4G3ql_OV*L=I5FNb1j`PuYBCBOU^BjUAv>?o zidk*dWk3Dr8CaHYbMq;|z5{el7X;usYNnnAYHLk2lJxbDOS`J{8gECuVlUnd!zL+=@#+$3wg5WI6j;lVR-O+8CId+M$L zn?GAzP~o#0NB~*^kYH4~*3=s4l;jl<4=qKo&3jCT870Bh#SNJQbkC%da~G~Fl4K;C zZ;<t4U8ta>kU&M*=E6ZL%5^sjiZA8-f&{q@n}X6VowUj4k0V?hoIZo|-{$GAmTNdoB-ht4NJLX`qA z{(Ge}x-se%J-F{a@Ls{Z{CVO6RVgi-b{rD+aWK@E6B zh9m*a5yb3~MQVd@HQzSjp~+PlS~1_hMzpuTd0I~409(?PfM{{1=@`1LTl5_+PJ|3X z=#F2qfzEJ_WI_~X#K3RIikxVPd@OH3|4}y_J>-ES`p-SI=$f4c6K_$(d!FgGAYeF- zXjy`32-<*acN#nUXrJQ4l*d7t^fE}fA`=)6DWhP3IfS8-u8`sDoI`2|-w%zH&vi^l zsJubz)kZ(ACm2jN5e8c_vs|45)F<|9m7xLp4H^8)-2OtdB6h z0yc3wKwQx?(61K=DZ7X3EL9+USJ5NlZhLjL4*b?YQa!OVa)RE1>15ZN)Aa-d5f?AK zM8&uU$w;j=tQxA*cp%to@xDD=jL~ym#CFJK9JB;-)d?gb>l$q$`0i|b!uq@Hgbj*? zf!rq!p8wQS7l3(BR(~b_@MLTx`RWZR>5FSv!sD`eqSuTiXFu*RS&=N=ptH5Bp@G7c zxE+Fq4;l_!mo$;NbcbU*8l*-hAPSO-guu4+XjDS3BdWX{8ewP7+%fl(@sc4T*Ac~V zUF|Oy&o45#)!d5Qi2l`#M@Lv$d^R6h-RMY$5|C`pG96R5fa_SCLXTG9CmcDSWWf<= zi)mRg3%QPkmy;|(h-qaF9U1K%rV(nCg<(vqFfw+#1T!+{FBl^m9K`j!c zEO?;2v%J#U&oyMQ@m?J`Lo#r!NUMAytc390f}r+1y6!z+-Z>Rsfzg4$!bSx}dJh;_RAZ-nlqxGn)E ziP!E^BpGp&ZmoI)^YA;RTXb^MlO(xyfhsDiB-@lfA+A7x=66aQ$!gG1;iGA)d1ozv zU7(_hg+2@(*@bEtl3;WqrsGyR_Ftx?@h$}{It<7)ATWJrw+Z9kW&K@t5*I0&UO~ZgEggIZugaXQ7SGz7x5V1%UkS1z0yl~|k|{`>Y*<{oX+kVz z(_f3qVOhyhc)#BkZAa|Dujt@MbNmvYE!&P6wRr*eu-T<5o?dl~_tpSuQlf@t_)T7v zG35;I5QvHIly@9Hk=&p$jG1tN@URdByjuyGi09WuvbIxL$>`pSqDe&x*THXe@Dd~h zR;u)hHD=3-KUu)M7fE&*hZl9SWfzHWh{OfKO2-v4V{B0148vfAGj9F&2&IV{wkzFt zrcS<+q?1lSVlNto3C!IvfNP6*p#&{mHx$eI!3*?vNw?_ardPo#0tEthLLgt3WkLru zO_Sbe1Np%mB|A%!l%Rg2#L>wdgdt%PPj0Fpe?g(^Q=o$p!1OtRDBn>#<0DuSfeG|p z@Cfx~8kQtUaD)Y#*N+GoF#IVbgqOi?;YPSFS$~(EBn9!(?p`3(?Bzq?5kEjr&uFl6 z0!a-p*<%vo&i*b*L2@G9bizQ4@3x0|1~P^Fb(CKh-MDv=9L3)yosp7GHlnj3gdX|D z4apSmo4AOgY?{#HU_7y4Y@u4Cyu%rRML{EsS0+h*f3FZanI)vN-W58~RcB)REkj*%2AnDv~qOzG~Eg4Mftex?Cl7qO!5mzUhGj&2J z5Qb!P7fH4Z$!-!d^ua@2d(4_&!V8fm1FMjC0Pk;eK0 zuTJ3$f-Idk#9>*3p4{hvhfZwG4!6{o;k$uw(_654k(1~yXWGr8t9bbMI&UN0L0*EJ zT1-XPZb$(KJSL<&(B4?wu3JZ4xK2F4O+^?w8E!VR8D|Y-Gsqo7CqpJZnQsQN8D|Y7 zox4p`HnXfHgK3j(lVt5V-cAf?8JHD==PX4Sx|#qeKqjCY`ru(H&f*dWsDYO_^kH+( zGz61drWYv#OB8Ly&69k?^HjWag%5f;g5b#b213SlaC^tw*MUG#M?{B?V8c!n6&bsd zq+*)XldFoK<4Eu8q>)A%X{3?H#)UZB*dVwBW!7O#``3WoaqR7`IEo@!j>b8L$XjMb zM>N+81=`z$>X6c=1~RC76O#nM zI!W9#^oTUqNh6Klj^8#OrIAJ&X{-6`1%^YfXm;ri-Ob%Q z*1>c(7Opel^4VXO)z+5Pe);6p6I`(BndV=n!LGT1L!TW7^ zkrPXWGTYKEhcki42%I2k89-tr*^v3DVhMS9LoYuhJ6N!Lxt!T*ih_vGasjdN9(F~# z!-DR*t>d8+%js!*}!!iiwCab2$G&@JG>~HvJg>ht)?S; zM6k6XlA}ox1Go-*mW%j`dkqU24uE!z5J_|g9g?gUHUh45{6YJbJaX6bKY?=b^Y_jw z+2@dCI@7yt8fm1FMjC0P@%KUI@YyO0w_-%uQKDQ(bX1!YbGDXK}eD? z2d;!~0)cmG#dZxQwHdRWIUt=;EbYLl9=p(8&tKwMas;;m}!!b#)mx`J==Q*8}g| zChYLycCL=&%F1h9)nA1PSAV>45cbh2E z6}O(iFLUwu`8VD&1`p})nr!v@J$vIur%`wmUt32i3-IJ;wvRgn)#;Cju(ofr@p&JGvu>^tuAU!LQiM_}T-q zLGSJjTy6jfK}%>cf@6!0C4vGY1-2~VkrE(qHbjE=!3*qN2p9~cz~(GC;v<9f`8GHL zYzNHg>&j$cTcCqDfPZtM1R+qI=o`)uHN+q~0$6zW;^PlOvw7PREEA5LW8quLAxyLt zc|j2bAJ5A?ho#2hmvj?C<$`ys^(3rFSYmC*g2e&(;VnnB={=qpCW4$WSEz)Hi@YPj z5lVtpgl$=-q1&d(IVRMYB8wuF5%oPxDdyR&6BZuj96tzy&mKTr7>>Z(0u(8$Mkr@0 zT#T2MASQsFJz*wE!m^Blv0#)?m}FoTvF_4<0`Qw;~PF80%)IL2JMon0vbBj0SbnKLXDBd z2Jz9yn=yQWvqawF@$-iGjcEfy!icDuJF>`05F+T4azq(%L21W?IHF@q)bFUPvizW+ z4qG_50$_|-%g_<xwH>1rFX=nS0(7 zX~1Ma|1wO&vhb;GXqz$)D3~eCh?^aB>=ryUV2)R8PJ|+{b&Gd&S+<}i(Gg~tmBMBW zx1ezt?ToG_e+L%deB#c73JV7n?tJQXE|*zwV&SRo4o)|=n?GXFn4&0>ESaXs<`rn) z*kKu{Z$a<(#%U7jy{_8rdZeHe2=;iKKG{IX;GSJS$pRe+POLvMg%=L9b_Kn;=3W8_ zXv5&1A*DE8VyA_nNQ8VTitO|I3`4hU8Yr1N1k=#~$zt;?F~2C(r13;L$QkAdM>lX! z0~cDyfxeRUU4U}~9AIby4TX!t6w5tk3MHN&bl|GM0mMu55eO>}9KQv~lq5+|gRxi) zatcmeFBB4G$_vL04Wniy&BDQ;$Tl7=n4lXspd@rPNdW{vjR)sQ$|gk5VnWc7(nLQL z3=oR|CvXxB1?Z_|0H;CLZRnaTN&Y~<9Y1kij2|f|5~d&%P+`4*g0jX^h49?3KPa#` zSZH0!%F7rt@J{FeU6T$01_BS=3*TS{+CVTMNwTKvkZH@Z4by}cOMzkr8s+lE5Ns)PJL!d2rffM?M zyy%)Pt14vG&`n8{poxNw3sfL)aAS#Eu;ASKN{R#L5iccFEM!g5foH4>3?eQ}M+$W3 zxktxfOpehuo-sh8_p!2N4c7ICL4cmZWX=J+BCCdBMk7(+b)ZFV25vCmgd29GpyGxI zR^px!^8$KCbWqrd65uLP9ZwH)L;1iSK@Ekp1WXK#KiGXdx6B_I z;&37YJ*DwP#_7t z;C`Jy2Lg{1%%%(5HX0k-GK0AT2MuXzYGW%L!_W*PhGR2+K*TTcKFx_~oQ4Ze3kERU z`mwo~#YIKYFNl825lvW7+PdTzFjqO21^xsuz1P3z}dz!oG@~3IAY( z{gk(C0R-X$p*0A34M$5E9)x5&F%Twc?Ry(K~brqsKTP! z<_yVjBm;6O!jJ^ZFWc6!7zJ6uH&r+WCxAFGKtU504M#M5yyE8+&9O9?da)8xvjw%- zIcHu?51z5;15L-rzW$SD?h8 zbU|>Rfp;ukg1owE-2h-Q;QksGB&>E7odc4h%lMvo9@esuFlea2q9xvxc@x_cC-b;z zYT=Fv2=3WgHtkN~MvUduH?{;bat8PB*V0gL@|MZr%gtcc;CS#TJCGwwhelvJP;U~5 z39Z$1BpI@<38KmiKF)?((jhzng2w#@N0j}d9Dt1TCR9CiI@)}J{JK?^+&WQ>T@5=N zDsa4p24X=*pw2`adH{53oVjpQQ{-_%bDS8gj9^mZI2HT81I-c|r({EdIbi<=4}Fj` zfxI==wPghI1`Zh9+|+_?l*3(1ECf>l2l&>0PLOz8g5H2z12WbQv_>mx*inJ^^PHb| zG~Us99vVD!Y8Y<7KQu|5cmdA7NaGS2f;=Ru6|?OAz$pMShU`feudvwyOR*%`mSVh~5eSr5*NBQbXh6T_#(Kq36zDIa zsf#9WYJ#b8P&<;3+8Z=b0oo|^Q{0M@EJw0L!xn+oLSgbytq>FR2kdyz*>z9b2UX&g>qJP{n|=$a*HFaSz8q+m;ezDx~B5M@!yaICOn zg=n-?c+t;`(3YaS1%h>zU(~mx-LC`HwRy;<4H!sA3>_wO zzNXrCnGZtORbd)83_TV$jTrP20s1bVDe$tv8!(8PbfF0^mvAx1>3|^#CS*sD3>=ks z5oS;5Yi1M{tF+k<1;oaoME8v!<7LQBxZR3Zi*S;51kL0u&Ea8UgxQ0>Y9g7S74V&y z(1mF`8v3=*v4b#>;B_uR7Uc{c9B_`}@ENuwbE3ryHBGg=YL6H`RE2cfVhkt_4+8`Y z%@&X-2p&cT$Byw@#4!yMCJ2~a)SxK(fQLYK4Xy(w9mSL-9;a&<|AZI}Y9=T!12|C- z1HkDbEg78HRrbx$6 zApxBL=iK1IBOTsXU*Dn#3eXjsE?&t%-g#If1LK8h1iFH0Il#;<-~}+H8NdT^zJoCq z2u8r-6caDNKveVf`pK(I|90}z7&6F;mkM40}e_jLeo;{-oMjkB+7{rVTlL0@%aO$;c4ZToFl0|93;Z7XbR z?T!_Nw27kQ6Jb#Z{R`U!kPs7E0FXNE}@5sf~3F#M#7aL&-p~W7K#fT0Y-D^S3sa)7%(g&0;@M%X4r;fwApqH z#|25@l}s3ppj2SamTkTX#uJ}!^zh-Z@&FTD0z%rL>MULak_K&Dg_tcK7GK~WXfEz> z;{XFuLOX|cfNRnqT`WwbeKQmTMo*juk$`qWSFZC{VZzpv=X_FE_sKQgeB$cZIdv6Z zU4!={BPL(*)mIgDbs(S2p_`Nu6Rw!U48MA+n-C^!J>{7%YHGf?dO{+D+ICmX{-Ua; zwz~Su+05MHkDF6d4JNL9arHRd=l=sBY_(n21Te5jzr1Q2rZtbd_KPnm_L?tdPae+< zA*uiSs&>hmB@MsMe|W3fhCp4Z6OGw1=;l6Ikq(@A;`6VUfAiV-+y5FUYzq0+fiT3J z`NBtEt*EFiT~TuP_1kPQv`zzRV?qZuV+~nb%&w?kJ?%&-5aJc!Np8FFkZ34OXf_2w zD^$TBhEqWWG9wxSzxQD$J-49k+wZR0sjXjbyQD`X$I8!CLN$`9Pn}a+_4XCp56r5H z=__j|-SX*sD=Mp2l$I`dX6r0Ds+z<6`hat9U-C=Kk82t}zWwIGLw?npqY#&1`y^{f zw7PBLUGKeDR@YLxeCd-f9DSq}Y!Nbwb~@nApBvWHRjw>uGykzY{ILRSq-ak#{o_x5 zDk*FGdf5-(K7CB4*1yT};cX6(co50}4ms?Q1eUeVB8jk|g(Y#s-fRC8UszDR=-Yp9 z*IJMlQDAbmoeqPmu7ojv^7D<=?_KlHL0OH_Xldn!aOemGMWVCb_9tENUY%rj=!*S>w_wga*% zW5&wbV{iTJ{nZtfE6Pe=d}e&M995|9&bxidveqBU8a}!6wxPpTS*@^AG=TdW8Z5V= z)z>x2rgO%E`r0pU-K|lpa0cZC+9%%d($Ak%EU#Yu;s?|Bc8d8{eQm+m;Dv9jYHE1@ zlp#$T%%(UwBNx1%nQ%7lt)iX>v+C#`{ivb9K1(y;BFZXo3%zB{T#ez6xhF z`c*&N6G2@VzOTQ~C`>~{YWmQA^7 zs~Z}AUHa(D$L^*3tND6W9r?6iq{b90<0i#_Z9vo?h}} z#hTW-h3}raU!$lE6T)Lpo%7*$Kb2K}xAvzWUpgb3;|EHC)*TLf?)#R?n&$e_hPUSL z>d#l(Ay>d-AQ^ z=ae`8IQ5u1Ma$LJwjXoTd+)ERZ(058(#Kys;)qb+hOiPpI&EniVq^IrK4r`z22z?*^fAw#7+c=_=_mF8v-S#ZK0Y7ppYBxLQi z-w7`)s95yfh1<2}_i@LQc7v~~fF;tDH<~Jcx_o$sDHO$88;*VW+mCCS8e40t7tS7^ z&9$3We;?lm#*>v5OUo)hyXl6Zg}<6jrhuEjk}bFPYu)XP$5t=@_ScqQ7Jc`_{A2st z#jO^U+WrSjeQtLB*I!<~Z9`5*b0{3i@<}0M%QK$&wsGmQ%3qhwiBGJ*4?qQ_aT88_ z_S3rBPp{nunPIXx!ZFX)R(yT+)=X<3f0a9l*M2&8%2v$K*#7dlUzUSm?N?8C4MCXn z>{qquCE2#C7ZwqQOtR*~>$e`v>cdTE9Gz!kR#$(49Dl@xquzXQ7QH>Ev(=m#!%9kA z?Sw17ym$Y1rVlJA99VF`yTk6i@OU&ocFw}HxtWK6;r=tZa~3{Dh6#bdhc0~JF$}|n z$sN1kjp^J22NxIhJ8-5w{heng;*<#Z;N0SVV2HBo^*`giZ+`$L9d&-E1jKRTQ|ApS zabFq)oaUQ*_gi?*0Ej*B(07L4eF>zBCAHz6<8q6}9dc90exE#frs?koLlUfyk?W{u z9enKYSKhrTP{xP+^^NM#cC})s`@XtEef^xG{Jz6Z{O^$IPo2|eK);x6nw9}v=dwGW z7+6|f^^a1C8_qj@ak!;Y>K1Gt1g|?M_ibRxuoQ75!4S^a_lOZMy>?TeHYYZ;vdu4Q z$aO-ERhdKdBc3~Vi*Hs3eN8`x`ep2TN8_v!uU@`Iwp`qIk2kk|`_`i~nmfu)cy#G$ zMYm4O+@|j-4-Glx^J^|`8yJIih-kxFs&u~xe!X|^5C1ixctCK(DdFMw9(iVMQFNyZ zpPWD9rNc(%1`7Hf@W%LgcTKD{S8a9mg6plj&mEJWGi1cSUM;@i>gmfynLgfuB`Ry< zw2H?$lr%W9_6ku#u4Bi-r|x&~@c+GjQ=m=`4O`oh1#5a(#kcER)^K^!^JkA=RFV}8 zEeQ<`?0jGItSw)@XhNP;)NlV!wtnrF!_TqTTkTB>PhMhAcc*OG;Z}H9AfLgyeRFv`0JDMLH`M=Az%vJmM-Se%j z-@1j>-6Km+E4=lX;5L1yJv{WZFR!~YG{lx+>1^pn%%Xb;`VP-L^2LjXe!Wr)EerM; z8mw*G>!Z65S~Pw4p<{}7dvnS02TpF_hgk|iJW*V}ym8#3!e*;sx5rEGIpUKGb}B6Jk2s}u)B}5; zUehO(f69{|k8ikZYF^<#4!Kd^|I^uL+u8k%3{$jB;5xc`;+%ITEIn(7(c^~i_1Wra zQ_hSO*X?x6>}yN!ICEfO#;7gNTRi&Kg=cpxk8XAS<8#N)J9Mi|e{tUfJ{h^-p1s@J zvODkr1;~e&Y}(rCyt{)yYd5D;Uu`??V8?w%F*?)uRMTNVxSjXb4&$%+>9O ze>U#|V_-0<+hg1zH--rg9i2=l(Y5j`RBZo`OOE|zjE*Y;*lNSx_FCz12P65 z9V@*2_}vO4Ept!Xr?_x%PG-)i?fTAmH|Oi`o``8bnYzpY*Kx;7md7Lo)gNly9FmYR zP*nrCPRF!;4j%UEYc~gKVLT~m&ysn^u(=MC%O0gnnt%3)?<%#tzG1&mGU2+0S)<>% zdWU@9fIPi*R9n%~|4mCFXlP4u_ZEt~Ln+c?ZE<&Z*Wd*T1=`~7?ryIv&cFWX<(qqWqbX~ z(PhGq0dJi%M(iK&S%ww^jPh%YZQqN)bq1?E%U-kpSVhyRA9@1Pgz0K;?b3@I*H~kwYIa&3)0Od8)2GfIEGCa}y z5~q7{8B=Ij**Epss@ROyK7G%*qbM62CkN6{9bf(6iuWcR*ZtJ0Tu!YY?TNAoNl797Oyz!v&CcC+E3hWADXWm|j2xxbGEkS(S4ve7JLZ>CSc-{PO3KDUb&TTzis ztmwN$aQFj7d`}~6VB>ojaIyJzEcF>)!Ojh9E<8)o1I;82iI;#sCKccxSt74bzsQ~; z2V;0yr}nGm_u6iIiu?vfCc%H(36$YyCMJJ`IL;BW^NAMG>(VY?GejP#3K3_qx0V;; zTi7@F@l-SQ-;QCg{AM4&8iB+B2}Cb`U8%j<}m7s z14qD1PNQgveUw5KzQkuqg4xc{)>ij*mrGW0izspt>LZx4L*@G=ucO}=VLN9!uq8bR zIGO5w($oH`i#%hrz$ri~T5|JO=#R(6ZHrUSM_49L|6}y#dehlSgg;QA>CGWG#!AVS(Ztw%yWurh7x^_TZV|=74xgx+!%kJ3`wHICPAli_w5?QB+_>n7iuuJ9IWH+ zQ9Fd(9XGG{lC?Yaa2AFN|ID6T6;@_mLWr=+)_+go4*{0_#40sMQg!ms(#ebj^}Y z1a{Nk0`!+z2k%j33hfn%QXwm9;>koV=PfdIc)5<6`0S@n5gH%CPZx~^|jGfRi}g}evdiY!v3981NvY=i~ZtdQ$no>R+;l|y{Uq*$fk@Ik}3WgIuAMGS0iyaCemMq zQ0EO=HiD_Lz~{8g?3fK@Db^r&>9q@P2ky0&9k;e>)~vmv`bcw1{~10!kb(9Y6|dn# z&_H4oM2wMC#P2M-lt}D;<_X>6an1WQC9z#-E8tgDO^5m)Urwo#H^3D{0KbF3Z~Vg4 z8-2vRKTvc(*S78WCXAiR{g&vgK?WAX{cM(a-iJk%-rt@3@O))&$9g^L#3HVaMdo>}o82%+hxDS&4SD5nY0)xW}&gVl4f^ele^(#eX%e@zR+~-y0eF zuuksP`Jvp{oInrS1H|9VSD#!jv^pB8Ja{@qV;9gW&lflFnELA@eqpD`!tXnHDHwwg zs__g{*N1+J&`pJoSgk)sJQ4PU9}EWNK2rGeF%`!-AKLyBlR2c{X!}|gT`WW)>6ACR z3_;wfuqUPxQv=F+JsUPK2Vut1zY zoDd+~NiqdDC*TNcq{rPfPlkx|T^cWb7$q#7F-$=}*e%&v&TzymbLGCix3oK)DkB9p z^6DmwKm@YxKK`H#*0xtg3wQ(gNL=Mszg~v<V8S$+KxBb%e#%ftCHQGUnAuBD%O zeyfdHVoMXUY_NuM6VoTXC9)vTZBZuev=yep`re}V!x%D#A%U2|wPWRt8)Zq?pr;xU zo7TXk!-SxdfrfdsF=TZqWk=PM^t5@%4E(PbhzG2NTlsZbG4NMKL$9DAaVy|Cu2yG>0_*T+BB;Jv^?E6tfq>aUl*RaXkyi1667?S&LEaOBAFbtZ)u+h% zZToq=BE-Y;!q(_k!I|Ivcar6`6%od}D=L=e)q(VE$G2r16y>=wv*#o8ljcsYPnuT{ zeBhGHGOuDKvsWefy21N=MijwYJvE0ZjP&?+glF)|S9hlry;_g;Pl|d>s^8NGG=o{+ zEN$T0SA|AMl^FWaC1Fw$(Xa*{bw!V`Gc`YxZpkd}c_|~2x*|nC&E?C9mwvlZFVAZ zODy$El9^uWKx3k=MvE(+y!mt>+hRM>4;L=rnD~a%2{uW%I1Kukh>0f1ROwc( zqLo%2LZBB;Qe9=0(i~k6iDXi0vU^lXzF`qkkj33Q)K%2^Ib&Y>&0`Pv1O^`3f4?3W z&FOdOc>2CrlUrJ$E=e?p5+p4mZX)3XHqAIOk3vgQC#E}gyX5~e!qHqThd`Wf-)Yy5!5hCbL z?f=@MA(2GunG4?jsv=h>T7Sm*0TqfT@bu2|2?Ve(<#VgEu)&q@n9y$8M3tJ2H@Oq_ z+BvLw(29!Yb{)%MhrOE#Idbk(TOZJFplsDCVkNG%(>bwGBzE1Xf%o`ZJ%Vd^bT5}s zp*zLMDtdG0Nzj^@H9S@&qsA>5-%fCbKBXV{V>%^Vhm48GUfamuMMHlrH+Gt!s8d|;x`|=_+33YN(<^4#dT}8 zavvFu9I0BJW)s3Fg>zcq&2VA}9xGz+2o8RMT83x%YY3X}eKd zrFI!{R#9APsg1Z_^`TsNH;r9mEpC6q3xGwi$~QhjK-03mI>?lFu=8Dwniv5SNE&)u zja_T{6L*v8Boptfnp;rOmgpBx@sCOus#-jbhCn$H4u)J|loxkK<-f&H1xis5$Fo{u z6^J1`J#!H{NS|kL9=pJ9S{1v$qq(_Bk*JQt{eyf_>tEDQHv}elDMBSVTMW%(8fJ+I zRkmG^IzF>UmiEaLPMu={Ye6NaOd-b^w3&ZL(l1t@LUjR)OsNOgq_ z;o#Io)T1=Vw=Nh)wW@L0s2S16}>6aNn_1wqax+OyuWStDpW1JhZNwT_iw4E7fsF#04 zouvjpWQF)vUKklVT98+$t?Hib4SYt-VdXAr##rtiwIWQv{Oj99 z_>}x1&~v-aCE^ivo4We@jhkp}OKt6YPl0tqoW$y`gU8-9L~2#hhfTflYP{7nvZdQ4 zA@>rUeL!Hb$}C*MSs^nv`^otl--2I+*UMeDX)ai`1&K49Uk*?ym);JD!eM~49&vX%C@UDr+=_MFA zZOKwqyfuB6zT~?ejd!~!C_(fd?FFL-Wx_HqG84N|0J$z+H#YUJaHux1 zysygLXcT-_Lk;(Q9XfzB`8omAaXmY)OevJ-aKSeH^o&@Hzy=)lQFM@BU89X%6^J^J zrO|5^tV5uhksVLSaFRlt%J+YQQSZb|2b0{r>4zZ~$-q_N2&+PHKMNbdjB|2?_XmOQ zLPy)4x}5vo=+914{?cNKvAiE z|M`s=S-&=YLE3I~$

{8ihGF+Ck&5M)+0^wnOr+Vv(?1>KN+o#zO*nkAdf78xt>N z<)W)y(?k8^OH`sVVN=<%3-%8S)|dErw8L*7m zuTIVd%_;CIY&YJ&@fEg^4y45@p{=VNeMgGbD2Qk#a`!V#bjjQ*b80;?>G7mJ{Ac;; z@|?Ds?n49CL(mklUX}HHSUrhDLt+{82awmJ5A@{5REn?;?*)|(i3`>0d-omE^RpGKWS5^P&TKYBZAq@-DDv(h%Js=mR&5>U~(OCWz@ZxZRJ*1^k6q<)vxZN8hX5#|Dh58J2RtoFVAL= zy=y?i&l|Y}TcZ$iez#VLvx~%!3|In@i1)#~Y3{e<-rPEG6F& z`uAITCSuUdv6X5)56~tSuFQ$rBVDnL^Wg!0ZIeJK{$uXj#bTl?o9_wgDHC@tWYR-% zEW=|7Y@EGoLsfQM{|84Gux|Vlm5oPw&L3ZntBaegspzSDB~WK3tA{Du$o^#o-85<| z$7|vKJSL?Beuu|V^q!%!(vp&6ZnS!e0tG)D@x1~f@r;_o!Q4IdB^oi!$H^R=BzCkN zAr4u`@2gX8J?Is=;m`EDK0-j$<9Zohp$2*NF3I{s9=zuE`x9upB*(&oink0x_;Z@_ z$mOo~iG-O5OSg3$d2zXQyaoP3#CO7VbhHSV-^e}Z2*>0B*GPuZTOHrj%%g#&w)3KN zWkWWD3ac@_!|eDo;A8m@5ab+l)JfrD$kj{L*2p9Q6 z-2bwcp>x6X^?cw=XUmU`9NHboJDe?{arQ*QUEB`>n>j7Pr#@Fh2>)^i+i3zlQvZFv zz-MdlRpT1a`6W2Q3>W+>C}Y-bj`~0$=2P)Kwh*D2`e9jaB8Tgeuw5CB@#M4E@atBHESa?67^o*kK47zs;?Rlr$%HaW;y?XLDAdSa29YQRgPm9&u zf+L`>n3<&nFCQMX2F692A=nn|@70&uL($mA6E{#w=Ki9`_!-R=a$74A`}pPmnbg)a zs9!psAXf=advPr%`|f zuOfw$WNh+ehJlK>>(vbki)kuL+~t0Q#S9bK4{g>z(LSl zP9-v1Cjv2IhTw{XDP~NzoShgbopdm}4CsirICX9d;}R$FiyXztI-e$c3{9l@3R-T; z{6?dqEc*9^s_ z>W0w$=e+J;sEtYdN7J<>%H&@5@tYwqcKZsK8idd)?<)|o^~(fh4&Zx^ybbN2Dm7kK z@UCTaeGu}9RCwb#$V=i-kP9AYzn&EU7%v6PV9Jk|eHzwwJ)abj5wQp2=pu9MOqzQ;;!}PqNeI+D1-F)8yK>ZJX zE7`0TMB@UE3mY%!8ilOCu4A{iS~v1x8f0dje?l4WbyHCE$O-C76a@`D&0Wvlx0JM+ zxAWWX5Pr<}7vXbFIl|ofXH#I%^w{Z9Vtr&yDQ3AzMs;`0;P%#k=Zd1isxxpA=W0ghNc_C|*1$X31w?a=zlDP6;pkeE5M*hWuu+WKpI6E>Mun0V{-Np3F^jgJW3c zL%-t&h6}G~Fcxa8%yyD(&wEVlPf1ptx&dES8Vbn4@)y9wxr6Nf+jwQ=F)AKJ{Glu! z>AN9I!QJ1Pl$6{)-A+VoE?;a7kWew z%-J#mr^R?@gjB-Ee-5$>G;Qp^8{Uh_Dv@69F1o0*pdlh=cCjlAQkzx$Bad27*p>mF zxecOHq}8UUsVuPFlOMRj3<^Tbp&@tYHQzBhxzM~$;#N(2Z8dMYr^u*wyUCVcVWU&| zzKNpNci94>2^)OR=GEZ$=l5|QADmt<^4>WQ(zKubV1eMWxn8+YVbf+&|Cx@do5kz$ zWp5(bV@`c=5tJZvw`9|FEx8NNO8OulLAP`hIJu0Vo8~&y=FY2@C-VIv*5WzO*!Ax- zi+=~|Kt1yQdwPIJ<)^T+?b7`1O!$Vq+gvt2WJcR?iy(W#i21c+gat{Y#dDu3PtMZy zVYIz%pGPUmz{^ir+rTu|o~ds<3Vq#$ypDHRH9o7w!i1+zZsi1a_PQ6NU;0qTLA6`e zJpkz%9VNk|!m$3)WJi%1J+1KdPh-WyTA^-*tVgNo&7YR-V!m&s#=D#^(h{4xUJQR| z-8*)cE`MWhr}udMYY_nf72p1q&xss9LJ!xPZ0OD=u|woe8VHP?4#pd;z0CPt`O(=^ zKJKG;yC+5G@4uZdF0p%~GGK}CB;$(mt(%N~wW<$pzANk>&+wfPqr2@Wah+A3e55iE z^B>(e5iiwtta_W2MgBA@d-q5w2;V>WTM%SEFz+uHHxl2pN3q);d?k}af%Zc@A35Lm z6O@YfC8Bt$1HDJL; zP4iI#qu`s}D@Lm7t3lLCeVt32qC;pi^f!sv#r8i9061=YU~_KMoJQN6 z`xKJia3d_E_=Apmduv!dK=$GMf&O&cpebbOeJ0 zH(0?okAO5%T<^(nTED7GdxmQe)_#sgC0`5WoP2HT%_R57gB~~Z>)NF}N5(<| zwZ6}kc!Ya%iHw7lr9S)^6D=6x({Z~Pi?uYMp60qaj|cSehUZ1fH!kWIQz`e&bTnyr1a#bQbP zwRwb_;#T#yI+Jg;mZo|_9hS^KSErkKhV2-$3L@2)D?zJ zs48K%x?FjoOO|C1BDrww6<-`lsKWA`p<+;_RZp}H&HNjIEb)oT6EBspsA2LynW6&x9<8yNHpRa14RGw4 z1O6@Sz9HTGly~>nqa#P&dw0wDS>5~5LcFiAOz&>7&AmO;Xz?qKhjzRSs^68#ogN@8 zM9&il?st{ZRv>x>Qp=p%%0X(cF70NrA*GW%S7-iamprx+QJeSo6NR zeHP3)r25;wzE#(Dhj^G*1_(;*d67Nq&&CDTNSTzf*vA?|*@7TVn`Y<)>hC(;JiD%Y zKFJ5w$9Yb_2!1|lXCI`TVe;rLhRpDfiqt@U#msyG_xXi#-j7;wf#o|?&U;4=YrIbIq!&g9P$vs2KZ!2~ z7P+r<{*}Q&cq=V812HzzMMfX*X|hK$zynP_nbVo@Y|g@GX&Kucp||Ro1#@H3fV`~J zcVBNpAF>I!94YYE=`8T)1Kod~9lya*=?g11QVp%o9$xj`?|cK2CA^`?FlaidgD$a9 zWz2XS=GtuqX0EhfjkYmLt(t|X&PJCt=wN3cjwK%gtW<7s`S~dv;Rj)ZcO7@|Z(t!j z$)hb?7y;hCun3F8H>KOASm=zJNR#s9FMetNWbw+KxK{gx;s(wH;mf(FH0_Q{DE0cw z6J>XSE=Sv#qYYS`kUV*j(*E}Bhln8Bks9ius=Zwb3Q}68@CKZ0Y^=m$EJ!*}d(qhj z4eI5~W*EiQXR|)+FbA)F4juXXSe50{m&ywFUAB|Vd z9(ui02JVi89p#?DzgIvpUSRO$&z=UMYgjnn&H=0$b}M?c$PksR);C5=HKie|-?aPU z>N-_5-LS{^#Hb8CtR2%^&Y3hVc7O|T0`ORr);XVH_5&-49%_Zk$WaFd zT<{)FV~1ARXg)Pv8o%XqlT!dI$P;C8DIJ9XaL_iYE-! z`{ui}P0%|8I2$^^ZH= zCL@$#uNxxX^tT&J`JaUL!a+Yllx5O{qo%jjSn?%qr`T@srD6i&_tzg9pK{2wZi`*W z%$1#t8O1LTD{Yp@#09*1_n%`}eZ4z`+cJ7cJ_O>;;@#VQ_?R-xA6?e!**el*yKGW} zuJ>&g zioO`=`j5+cF^dg+@6gUEb`a~80A`C}Y3@*{J&SVz@5vw0rV|HNc83c4a(jc-i8}AD zi+|>RUbBmLE<|9B`5&-xX}C(^`Yk@w@>X0kZ%n#*e_ibDN~W-(xs9HV8py=VP5NO; zaQacMG99!}H%US@TQ@sj*A7Y%vw37)$F9~;65gOWfX5_g%xN_GJ6iT{YpkBg)4S~~6*&~d)nl0aJ2%B0-k_KPlcD{e6=Mp?xW2l~zzwU+hLXnB0Xv+pbx zb?cJs$!WJlO5diqvc%IQ^D@!{e3AJ3Pu)%YdRbAq*KQCeosv&md&%XrO+%m)vpx~! zKisWy{FrWY}~diB2K+=PJOPiEM0hLW*1T+jQDbs6GK*7x-QDJeNcM}A98r? z#iuIwbc~?j)dxF1g*9=DeYD%hXmduYQ=PhOxiAB;(ZL!kAsIAS(PdaK`fx}hGu!O4 zJx6sI+)9Vn7aSJ--CNv?Nz?>qfsX=c4y$g7#P)L{>ai0NiqGO0-I3^(A)5lX{m&Ia zW`k6|yr&NisysZbU~85PY?u3&x@&`j|KbDaP&tEIqOvBENf*)f z+Uw>Rm1-P(o;x+%654Wi>q05CJ!MvK4%Z43p%gp|K1>KLnDc;Oi+Y~!u4{8jVuYt< z>Kn1Cq9J3|(+yE26 zOg_l%w{k>9k!D$V)hASKR+6PU&@J@VKdZPPx1^!Ex}_x7dE6Ac17Ljr*~@OoS@WdV z*0&re&k>x+-Z-UM?nV9S6|Dpeuw*J2LDQ-E&I#QBX7*G4X}m7Gr?5?1P5Y*=Tt_Rq zsEZiWH>6e}QiaDr_;f~5$kxC<5q4yw!?ILrtuez>k?iw>V-N1QdtLbQ$y>RU9rR@I z7+kn=p1z+%f}d&S?OJkjpONl&-m_JF7RT4f$J^m%f4mv{)VlER!LGtUb$tciF)fSR zx?lcSa>!n>$i*lSS+TmiRS)Z!s=J)8cQ{tPtXx&8_ybpm(@g6Yk|gVk@dK#Do(`H@ z*R~dT%lPq_lP{EgDMp2uEB)2IfyxR!iT4p?cnTcPyGEc<;GvU^fRac@?vSV-G~(fAJ9) z^Dhg0H0mci^_mcZulG~#*D=UCP>vXbi>EcIa7d;gYB%Rm;T=HQvX>tV`IgFx++%am zuP$F{P2}2{ONyfs@z&%##&y$-shekiGa1>8m|OZtv*E4uU$)6Mdsri&{>_(Xo(q2Z zo!cDpFHC3x-6wb1lVZlncCE%!{_VS88o2WO7b9M@eolBvWvFu-y_=4*uRE^0w7|i9 z|HJEC$bJeL3g=T=xWXmF{1@9h^UQ|{EjT?2pFbTCZ}@05voy6?;>RC;a6RmH4gj8~ zD~qrPZ7A*(D6+daiE7`cqXtV|<{F0IU#_{D{qMd3!O(Lys{%ttGSvTlqq7UQ9>G9* zwOW1WFMplUYk28 zB`m+Abh~M8&Rye1Hmi|E6XT9cqnqRhl~66d-j?y4qXe$d?Z^MIVz%*K#+>oz2o8W^ z$7KR{=sDd;kAhcLK5Fdh_dK?4&QaHK`huA4pq{p&lce55fv}9=sA9DL#|cSAL8?~N z+8b}#Pi+KFQhejYpJz7_e1APN_ZX5aL;AG7;g+%1r$o4~dM}7Z*`Z+RlGC->`dj+g zY$L91mC*LH(x0pmEk3{2I8g%3$?u81$icP7es43dMG!0c*9Lk%m*b_2<6j|7ov&XV zRPkA5`~Jt)WbEf-3;smlB&)J(bW?Kqw(rwqK&!0J%h&DC{3KV@IUh~sLm6F9#IN2L zmqAp;je&>nN*=zK3U2U7(~`c%XDEs=4&den-4N7RMSc$2*BN_}nwS--eedREs37r= z9^*F=t0Bw3EXQa|GO%6G4rDpUQl8dNWUc$G0o(V__UDm?SIa*xT&_i4{Zyvf=adUi z?fmaU69+u6NuhELznJj*WaN102igTaX;(CvfpPU9!;Aa$zjb*GtRK3C9I&dtgxX9d zA8nXF3&Kr)up4hS`F=BX_;~wG#RR10wwMx;LiN>V4Ssgf!|+Vw`9Ywh`f)NwHw-nx zSSP_mP{ff!b^~qlo%Dtf^O;=2kd}mFfW&5E@db_Y2+xI0j4ujtj9KbSiw6PtT2tRh zw4I9#&P$Uacu%&2|BZ%Qz1s~$(VbB|EJFL1;S);RCZ*zGJJ>vEyTpR3ltZVpK?8)z zXrR|tUaA~KcAPk01$k}Xzdtj|_uYv*w*Scij=1|TzsaAvrBJxjK^Hsm==}62Bak@e z@JjG)W`5mT1GKa2r++rT-RZYl=icZ`b+LVDlvo-GFKLcs zzM!_CNTp`gl67|uyRm6;5c!0snDJ-fe!=A{U7gz5f?+S@-qbNp_ILL4FH^wax^UJR zo;uS7R#a83aSY~?-XFIEFBe9m?$Wt`>j)nO#O`5So8wy84V?!^cX?<#_TPq4@w^=K zLybGD$h?rixvvv1-1(A1U~!0l!6M{7!t>$9t8Akn^b zM)aYI;NM6R#h+pZZl6a9TtK=NCOZ`$GK4CNO{IP8is)3^wyvlg1RWAc z!>XD~M~TzeQMUpG_X6HMB`^crQ>X`A~W* znxC1T=~wY|jr~E$e>a$|{r=Qg7qu8l*2c-uF{41r8H1EMonK~}L180w=&!k$HAaK7 zD%Ob2=he&)P9y8>)<@aP$DZ>2ci2>mE`}rZi9nKnZnxmO$KN9Rrz#cp*5eDX;-i@1 zIDf<@_&Z$;7#0tV-*%lnUo0`XN;7lu({ubh^p-*8b-cUQsL(?slf$Zik?#>NJ~~tZ zypQX%5a=Q5edGC+IcFz561ecxd9}WIzX?lonKX?QKh1A6KNc>#?n1x_PGM(wP1%4| zm$>G^SEtSsoA{k=A_s#YYGLekUwsZu3?TpJASxhmt8Jc$BUa#6*!IVYJE&^s(f{2J zQP2+gwIOE0ahStst+WNQ94~GF|If4QwcU|(dG^^0Whm2}Z;2CUJ%a#0yj%x(f8s-a z739ghVokft#5+>wb>(R+D|UD+F1gs%i6;LjEuduM1&a=&{X4w>g~`-;Y~>J21R2{( zH?vsvRzVw}@LOQjq4JqPzD+bhj;~(1LerV3Qd_6CXvKOQVB|U*w$B2-YbC!u_+50V zSeFKC!pcIbqd6nJDt8x(R)Jq(Bzl~k#KZrvdzc~lKx{OJy zH9g%4>JAD@k8Ztvvu8ujMCr4zwsE{Y59Pc=Nu?4se}!Ieoqs^;wSgzF6Jm!)(pO2d z^)CoP^}f=f$mDX(>w{_dMY+++65vk!FK0=nzaH*DHeDk%Z0E;nn(389p~4NV(*PO4 zfBy@$sJ=+1JUfkkbHMT55NK@`##j*h*~8PDn*_4_&+Ji&l$NyUH=sZ+zD{f{1y{*f^1|AJ^Y((z6xwECU-V|rA%{LjXChqo0c<~mioUtM!VZh`*O}R z=&~VKD6lSBZ8~yo)v`9BF=mS&Bsu-|qn=C74MIjZqURSdgoIFV?VUn}8jBC|4@D@{ z6gV0iyp4W5)nPd0v6(|?P$6VK^MMycM*_D891l2^7)Exw;f!^jwWH+MD6BOEmYz4{ zZt4HX)p}eB6vkD(a=CikdDE68(mF3|e!ofgFVknMxsQJ(l1v0&Vj){s?`rL>sxf`ElZcWm15PQxW9LoCD-RBi%$or9YiE`$S^B+>6 zXrb$4y~5px-Qdc07=plz#Sgys%4A%HMM}(Ou#0Z|_bxEmbqnt(V_;AlwV#5TR`1Z!kfh4?$^uQ_cq=TLVmE~Y!)49Ofmg3h8!@qH zv8h(&_DR5?wD3Y!Y-A#C~58~ z5mt%aSd5*^aK}2c6VhcHkKhLTH2Hho;i{|<=P%RnariHQ_&t);qQhss_-P~KS-R~^ zPXN(E#me!t{>fRg@sd6mO4#uT)DKy@su~&%ktEt{YbUMLj|X2pHePz`MH%y>zL{h(Z#ueOtQl!yRH4c9Y^si(4Bmt!qTCxg4Ng_z#K!s1;be>2wln|DN1t+MNs zmDsV36L3F_T9542z@!i7>{S*zDsr=bjF8b=x`$K}+=IqDHcy0^Y|iw*`5vatrF0{k z?Zm|93T`=#jp#_1oD5yRo5=`}e>f!@+>8_A9{z%*zw?OuTm|FBTjw^RU$byofsgn0 zZ8GY@cDqUF=EOWZEBx;j`L-*Ow{2JGg4pcLB2GZd6a6!uCD&>%aJU1)25>n-?x0Gd ztTeT^G=;>$A>->*d!Dr0Zdd#dwzA(m=sqK=)RauPE-|+1;+-L#+ya7P+WvQfnTt|E zWhM>mvSyZpDFw`m?Vb94a-MRM$wv-gVNs%FBL^8Do=pQkOO?w-h^x*s?X%c8{9e#~ zUY>h+vak?t=TG9+THu~~t7zh}{pmthW}R~I@n_+HiF^2BB-y2z*7(UZ6QlXu#Y^^* z`=K)2SLaDK?PaA;8n#v73wJGh)ZK$zlX>Z-AF=#1bJ9kmp>tWp0lOh26SQGh zg+3fY1<4I-?8NpHjiW}<+eBODqgbvo%cOhI)^U!gAsx80gBR04wrpSDZ(2xQLu^NcbghM=@^?eOc1gS;`FDEQSd^C$JYW ztVd8%M_qaO($fF_)HfSUMf+OLXU)&u@)Z$p(wjIB7D-ekygdUyqBF??5FR$@I zClSU{xKO#bO^JbI$u0IK)IdDA1^&8$`}$DRV&EO|31ievCB-1S3;4U4h~Sr08+jP_ zpTxwI5`oj-I2xAcF!l9)|v` zTEHs!c|5nSwckHRKf3e(&n(@bzzQHt!+gv78 zB4wWwk4px%AvYMPM?D=lp&4-c2I)zy94Dd5@yCZtj!WTxwo*h3HR`k_ijvVo6kv9& zA!c zE>xQ=uAHRUTL+||=~vq>atYijd9-W_b!20B$5b|=cq!52+x~L>f(aBk`%J6N^Ol93 zy|U;%9(C35w*K;xwu`f~>~G?=LS-u3cRLi~ds5UIz^d2OazPsy_hPT}L=>YGOXuV2 z8X9(Xo>^ZM00YwQDO7+X3K*@<(*p05Y%znOJNFw(BSiCa6a5#XC4np(Nt(~JZ!|Ld zGlP$hk5PdFowL^{Md1d14`|k}!fS2nCaG7IkfiXF6VuwVeZ~AcyR@Gjf8#PLj+X5j z)9JsQoSall7W^tJ`#8<>+|27EeIP=?luK4|wH%R^c<+rlQKz65M_h|i@@^cZKy)+^gCpsUt)*qBk9YX^`Af%-VfSw%tg^yir@X3OD6k?R zd?!Q8iSfEA+K9Bk$}ph92P_SEOT8s3#&!Bpix6^37(qAgHrNcr8RvKzh+|F)*l`LT zW{p}89UWD$M6D9&!iyv9MRSrO87Ml+A`SWvg4eNd| zUS8hjM@16Q;7B^eaS&D3cGMU_OyHvyetDyJH zj=eUTL0Qb!Jfv3-@D|`lKoL$`G=N=qbNR?i4uf6J)qp1ibrK``=U>Tt1(f}aaNrMW zt$zVCZauV|6jpGCtgmOdWs0A4oJDOF0(P29c#x)5{S(;88TXf)ttDgFW&7S;{Sz>1 zk_u}&RF)k5^ThZJvUNrvKljlmeuxnR+nOzg_r+{1fg`pd9+=fRT0u7qdU10VS};KS z*OKFPogJAa)*2z|Vj#!Hu|R8prt_B|HU>9g~ZLc%WMP zi>ev}VdTT#qx}LaqX5k@>fhHJxFY}PgM7fD=E6aC|Cq;JHv%lqyS7z~H`LMJhVog# z6%ETpqH%&sFE)e}x1Tsy3N~n-m)YwkG$@T;3E8X001>!eKD571t8?r}<$mZ+F$;rvGZzVSW6Hyc8Ee~Y| zx)viT;ZgZv__|o=PgnPmXBlT(r;#yK$0<*k#J=#=D|TdI=>zJ9d9j8q#(dZHO@hR{ zKT*@%&^@&8>P*ZJHfh4E-x!4>#&f=xteoBvDa1j2MIojnRnbG!v&oCw1Uy+cJioTM zc)hqu@zaCrmCJq~|C-b2sSb0^;EVamrths3E)a@B2T}JjGrIXnUN9!$Y*-SqlSxFb z-w<%*h!)x~a1<%O_Oz4h(1Eyw<*)l+tVLeg3t6>xp<2#|89xIaE3Y@mR3-%6N`vW*ZKA`-1JmYxPQUreWZyB?#AnnvhwjJ0(V0w*kdjGaoORiS|!GG;AS1I z!i`I;4P<@;EF_TaPRe>D4(~H@ zG6)?$Wa=N0(lLrw1ts4`pE57?IYBb`%X(}7zp}nEEY6+@m*Vd3E=3B(-3t_V7I!NS z%Tk=;ZY^4*xVyU+7N@u@#VPJ?XZ!X$=g-+|e{7!3lT4Dy+%uUZLmV)-cS~O5f;dY* zyVGZOYuG^9h~@PvbrE#8hoLxC!1T_@$O%U8$Md{~=-tGU&sRo*eaeLw0>AjZIEA;U zdma4QnergU7HB!ax9A2DDbJ`_J{F6jdTQ%dYh-(ZqMz?8O+)KlzpW*(;Juz7kD+Bh zjy<1&_HBkg7(x;t9G##y{hg^NKVynk+k3R#R-IBgT0kS%S{Ug`+eswAPifm(2r47u zM2C~WzymEm;EHbaOYMwPm4Z#nOM6eF%3yJGr&j%zm2g;jv%T1H-PR}PjK@e4;DZ%F zigSc!fyP9^A5tU2iPV%2P-(aO=|;M{`n){BlqGycbaEK5#tA%QigdX2WA=34Vfc7^U#`fS*#jL+q_)KP4%V02j-BNoM&!UyB}|-80}>8^jB4 z%@XTymG`Y8C+c6GT`2^t&GVRzJFMmpI^zWyBU@rf1S>2zK54D@CFw$7#jQ8j%Bk9R z1}Qt9bZYwUgB7uAg6QJOF#3C5o{9YC`ag_1B~P5*jt>sOaAX6n<1gQt!Nb6wed+N- z7QxE)?Ny&p+`dSQHgSt^QBv!f7};l zNZQ4Ge5P7nquh<{ZH@1LJ7RrN^QZf$qmcv41_1P_S0D6p#;rNNz6O=e1x;^ca==Ji zqq!JW!{uYG`GBe_LaZBtCtEzvm>PE6e>GaQ4=pGK7prVhW`-0^x@k^I^iS`t34Ckq zxR7>Qp6wlj^n!kNifgwGovyNdY)<}-F^}$VAsl3_egpP7Y&5wPmQ=Di@YR*m+tjA# ze>sB-`+U8u_#6j4Phz=9b7GY?iRU9`)Ooe-*4c}C+jzyXEo`uPK zi7B{vO&;&Y`*!F$NEg4Ov7;b_j7O;SYPb7d4Aiq>X&Nv7zO-k7tr)cAxwX^$g` z<+U$#o}XnSci=6rtUwjlow&FGzuH_xJWh}ieJ^mDbsl75!>N|#+!aVKX$|^gX7f+9 z6KV1L-}${*>EgdMoGF(MoP>{~w8RA(4z)Lj^*AXZu1jz7xl)*Nazy@cBrRs?2Or!W z6%C0Ad;FR{74cdycT6jRMo>(D2jfP%l0ra*h`N^W470=)1he#At!&9=@?|q1$NzF^ z&*bH54o-9VRroyS6~neVN+sKSpcu^=@KmWve!e_(JND?Xa)=4$S{Ca2T>c)`|Klnm z+)onSZz2B)Zob&xA-$Z&UTLDS?Kkuw;MM%#+79yaapcxavEfY8`z8b)-(k}QbV6O# zRt_`I7-5+i$n8s|B@;x2548oo#o)-la>XCJJABTw-(!;)ise|8HD}ZfM!L^chI(~p z%56u$sZg|VNO1GU)p{XWY5;?d2n^d!L9y6&OQ&-OSFI6T1c>sFaBw&}(j0U!fo6TS zAi-a7yQ-bt+kwrA&vWA<9vh*0>xUN?x4DnMR?ZTU_GGa>jh5pg=B#@2Z2o?y&6VHV zuADA-$q*KByxyva*{d1gcG!JdNqlx1kUyIKN|QGmYzAG?6etzWudKv);&g)s@d`$% zKY$;bY^%vOL@H5veUbYeS{gcbQsdtI51X%F8$l<%j^veLnG;(ebe8u1e4eY-h8C3&pFgltYHdp%+ezlLb=-G2%#i zCq1i!`+hA+A6i;j0D)X*FU6<#aIB-OIU%X1GV==|wC3Pk2O&Ajdd+kE$VJC18%c_$ z2vOW8bM+0AfIX1^?P8?#Q1)Z`vB~T0@B5UIw_gU--D*;1U-kl?pl*hv#)WqsPYcCy zIFHiMjU^bNq3sc1=g)bQIwz#51G@T(HI4!Wss5{*xBc~3kVsg#54_ked#d^^yCF@VIp~<3yxCYMkQ9-#{gu6F0ncp44uoR*K3eSPwlJ1UkIv6Ba99arNV%snarr{r#Rr&u2N zixG6>9bKM2&7xk1H|Bt|;($wCEDzDkc4syttR?bMU1K`&=gZ%Z2i-nT(-x}V?u`wiXxR+O;VFRa}3A0_TpHKIPl7rY+u+lI)}e zYB8jk;lC@>s0TT}P5f3d7JC|7*W@*~tSudN5c z;=UqUO;0C7vNu-3KTge1{=}dYusrdT$4PlVT1IlRRAnEunstMu-Crg;~&b;MRthz@T=1c>9eQPitarM6uv0^H)0aA}k1JP2H5)&=i{d&1 z(c`lnHvv`$n-0pEi^THH9IVdFnJ~}vWG4MSQX0au+REM3p5GnU&v;!$1FDoi~G@$Q-UzUe1_x-M8Vb{-41 zTAfGh)52DmM&}i~_cn+$TCbj(Rl05@W}?N-I~MUj?{7C}cf)Tz-znPM=HyOGk7GUM zzBb-sieKj2e4YrS zM-?ggp4XNUv#C1rT;PZl=1>NmUJVWaW93UOP`>6Nc+@7~&VL8w9skY$$!xIQuQNv| zT<+yMC*V>w;BojR==FYc=ykJ3)`3QDAYr~#Oqm}h3hLvJX4{?gh)ZxH%|2nI%QE-Z zCq(hX4H!tyhD@JjAk+rj907pMq~sE6kMPtQ#V}zFFsIBCw_f)u*z^P`a1Uc@uvIb;jplf!J`yC z#-bT7vonH?pz`#7T}*Bx93+OCN_n@M-N=g8i^PgHzt`VR`MjQQ@(thb#yyAiZhg7Z zC+ktS>UFmgi>T~Y-2U-MZuAsC33ARDmN|DqCdZc7(LtUaBop|owHArTv>xbexs?cW zw|#U}@#5TPC8e!R0MHBMK*+9o5V0IP`$F&l-mTg3Pf8_l{HDDRBGD#xmSF)aZ|%wd zF68EL7EZFmVo&=00w1FBkt$LAjjK?Q!6};zZKx!!Vf5-!`;GIb?(6hVr;oZ)p@(Me zX$xk!NT|82DxPlvw%;pyz6=}r)Wpc3io4fWlx#2D5>`N#^o-CPrwZ5vpZZ5OkQ^9T z$PU^n-wi)Yh-Z?0o<*TOf`TLldc?p`khtB)^1uTi~#LX4{W+Ni}R`FyV z`Sq)g=-qI}^UPelBKhqx^gO5oPJ;$PE~Jl6eN_`juAnIl?$~crFiOnGsxtmVUBnsO zPn~;(7n+Kn66HnFHJBD?l}sGTL=gtRtXLaWA`a3ynX!dgsIQRt6$J1xL%(2#cNVl* z0<8*bYOv#I7~a7(s7Ojm3XmI{n1pM3as;Ho z_JYwz^?I%8@RC0z-l|DC09j#aqd8)O=7XXI{N8GWOIRkF4D5>DcaT$5SI6` zilt$7iUzur@MtpMxTA{p?4+co_J+!Y8NxnW&S0-4kSjjZo3QFHatO9gJ-E%^^?d*@ z!5^lR{c*=`3AJ3Ng93|?;fEH(s$ah}aI9cT(#mzK5rcaN4yIWX*xyaRPO}grJq2CC zyf!R3Hm9aMy_Dxll2dz11gdot#I^VB`g~U@ZWBWat!XZ|l@wvb9QJv7jy zrbCKM@$fF-M;0TTs|B2&4FA<41&%>baL7iye<=5pdgoS65N&iwAD{3aS~3*q)k%TV zz4)I#eWH!glm7hqK9NpNh8ks+srNZ5TG<~j37DJXfN5~T^cgU{Qh2>nbnZUj?Y(u; z^kwB^nP`Kd(+i+u{!I_6SrdX@2nI~qh*L9DyWR;=nrv>+v>;VcUIKea^fEcV5cyRy zd9S_rQaV8vU8Qp-X@Gl$jXCkSBzoMDTV*gc@)v64B&y-x{ZiQQlGyNIGPT2h&n9!{ zp=n8MG=RQ7uG}zT&?E3~azOtK7&6}bvn#WxqCzQzq=ld4Z?+1Akcp9zk&BBuWI7!U zsQ*JlBk!AV$^Tw);+BD_%@#$+>A8hQJcSlw@3L>7tiU5+Pw}@>1!YcRsDpX0+mrxl zpdWg3KUmZS1MP3I8Za6~4GmYLCNFNTuC?qpLrt`a!v_ZklL0T6J3BjHzQE#?zZsay z5(fRP;NrsVTDJgZpERZYwJr<{_6L0vpc{gSFBRrU6_%9;BoQpX1OND{Imi3C_4oMJ zUrH>?QR=CDUw)-_ZMz7FJ^abftd&5A(jX7VB1`F4rs}ijq_*2pT>h=a8b{6|Q+RyBxN-LPe8$9-d|DPx1;IA?g&Nqk zl>YB2Tsbq`RZP}phAOUKaX~)iGe`{0F^TgxUcC7!^%nk1RM7S=5e9w%7#Xp@ecJ{+ zBqV2oJ$E7e)l)m1FINw03r6QVS!u3zP4H0SHq-R;_Uhr4-lF#W$(vh}b-+Y6JjQxi za1YkR${`~^ztoGXAP=;mDc(aQwHBI#RjsXuh8)oNSY2XDi?-9JkP_^6H6|iM&mza5 z5QMT*KUJ8TA?@o}tn{c@a~^z+(sksA^8))8EWatydu7wmdT3 zFZEP3H#6yffx%rcD%g<_S}55?J^HGlGHRaLLaum9<5;0IWzzZL=?@ejY}GVWSCiL4 z>tj9r-8-%TWjOie5Gk7Q{^_YHm&;vcoNqmAojw6iTU4iOox-jpto|6~OFsFJAM=R| z%o=j4$X6FWZqkM;Fri6oZtdMPs!Z8Bicqs7;l2fwm4ii8ORYtiCutQ}us(2om+cHn z6IM_BhL`#t5Tu}B*#ABkm}k!9jVd$Q60YV4$Mh)wE_NpS_}~)xa{UuTty0r>O`x5*K;OR|62RlVgi)7_m3 zTfi3C@2LeLZf@=mjd9jBVc5x3NS*Ew-Ma|PV4n`B4Lb`tzt4i_AA|A;)9BH#Go5tHfxWuwr0A9+ZwY3XWx zevOM=-J<=}JpADJ)Gz+uxBKdauS8>GR9ol_hlybhYerotC~{shpr2i@*5hR#mA481FHO-$&km&eF~PPF6*Jzs8{47>TTJ z38`%P2V6DH^9wMWE5}8y)PugbU)ve zop}TrdkI*-3CG&NCJ`PUihEEPi7c|cnE>Mb$PuVxyUK`UK>!28BH2juNEz$|-+Ci_ z7@baNnm2ni)kj(3>6eM94n2V>^7*=A59?4Rr_GfSqiyu;M?mDmo9VWw&;$umEEeUL20pGV%*LubU)33vv;!R&O~_ z*qBtg-(PqcIQGzKf%~S?QghNBK(RLuu)Nu$&rWSVh_p=YWkud1LHgOQ9Vs!fKZoN= z)dlv=Y*ya-Qod6x^-DEk-=o1XgMs{y)S8uJs9Hb`GQ}qFaW@b0QsYiQ)QA%C9?RJ$ zr-67lPk8W?>{|xk$$ZL>&@_+qTKWEFOH_1v!wopaL>@hDobac6e&O=vnDx%?E6U-zJdGp4l|$t;p3=+>}Cfhbez6Wb2&IT94$8&25J3) zDFO141b@P)*p>d~utNg#)lchCZoRc?33{RyTbNK$_F& znS`S5W*3CnsHwD9*+BRm1siL&DZ=9St(v?d&z3}x8$YtcOH2M>TQ*Y2L~)LPTSo_5 zUl_1XWpV&dX2W00x#y4(-W>U zr0DiO@gr~V{ztQoo!$OKmN0DsqbYwvB&{jKZa2SRYBBak{XQHJZmp@QiSfMy(z-=- zK6!Aa7LxmXSj;B#?fPwDf0H}s-PqsXjB{q~dSqf{0wba=48UO=x_%}cxmG0pub3;Y zt6-*!Gf}n;0BSo4Z7y{ZEeRcZSq)wV`^iT$rqv5VTJ*BO`6gI1IRu_Ml#q1%sW1a+ z?S*YC)4KAHG9~o(6xljS9>N;N#xLxM%!H*;}mUVe*gPRWDnFZAS#3uknP5 zl;x0fT{Ky@FHJ$P#8yuUX;23SLSi+HAV*p4t`;XAjS*9QlU%zU3r8Jz_QreMHFY^4Osa~?ip=n!KTEA9f6JmPB=!M+T}N=JoE3VWfkvoYKf z(lGD?*Fo;Z!SG_Tb_mWm8GxJP7hh*2B(K3Bf@$8OQgU(ls>R}`HGn(__Ki&@3lLBG zGP#&ij9*}rsF%1*6$>k&_ov_2pCk)`y!JL`_V#bQ$5A)qofFUXivv356zoOzh07;_O-pa7SFnIs2#C`io^dHr?0F^a10c zP4mZI9U&4D6t;nI1U$4hk+lk_+#e@N>pC!3(-x#`*_*80f>Cd3N$flH$&cMmv71=o<6Kg$neH0<0N#p%J_7%Ak3|&C&J=IX|HP@WsPX8`~4P3^t+)ibdm0Ud*4$0RbEN8Jkdyd z8XkqJwXD25E9OQiGWTQ0{Jz~e;-CJH%M%$_jJ?ytrh75S(_~IsLgLq9nehvca>l0C zX*phI1113?(>7Zpf_nRHoWr9(0PINdb{ zSHsdtNrdXUmIH@ks*S$`%ltTeVB69-wZI9UXs!dFE391bta{bW1aje8f~KD(Lb)Z1 z-C*RmgU4Hncp$L>RH%wV4alQ=XH?WaOMYNR`guDVY>6t$=L)?ZggI9n>cy+6bC2f zIbBb_l<7Cj^G%_%Vo9Zh8~HDs{~3W5mZqx~so-d%H*$&yC*wYxpQsqOhAWjUNCcPB zS*Yr4@QsZPpS-vd=VsvM6vuKB5D44JQ%J0_%P8#E0)jJ{HRTW_XPOpSxAWHisLagI zsYwUDx7`_mnTSi&xpcECvti4{cfy$~E_KENB`3!!e3JEo;qC3yQccdwvKhMT{UR;_ z+jaRQLN08ieFol#1fNQ-Wz4(E-VG!e9-blPK&>}KA=Sz0vdqqY4DO?_A3@Q>^ztM3 za|8i?{5f1miHiw&fmbcwYkQVkO5e~tF10DaE^geYe;PsvAM~~kk8x=7C3qv34Fd@$ z^I{Tg|Kqcw2Hy#@MaQPCXQ@4e*tBMcvryvN{v1PrXGfzEbW@LN_^YI6x@p9dlj0$s zR8kvXN7Fpu)NjslM8ldJg$?Vl%nbwXmvnbuirwv)Pl3l@1@!jafLc*{5iuMfKn#JS z4kEvR9tmbl44+2ua3y_d9QmcC&5C7aGM4bJ+8}1u(p6j$YZ?#aOUk&W5P;^x9~kd^ z;euU_@WI(xQFYlZ2{KC_BoW?&SV&X87q6_3L&`n3TyJB%XST3dMRU;Gni2|6JhK_V z`@Bg`lsw_mdDrHJU*NE{!KOcJ-*~27dDK8N5M80cD>}co(~|lVPw5lMdCyo>;{5KC zGH_Dj#Zm<+bv=WaJna%ka36X`ceuk<6lGj*eZF_CT|HNfKzK{XB)siqEZw)hAk@2H(vpb1jjLQEoIMy5!)+}~}`mOJ7Yp$;|EWYNI7UD(#V#8T{e zrBHeH-YC9Ia!^3KqF5-0q^ z>lG(5a;r+Lq%#h zd1q$^blQIsej3*aG&Qqjn_6BdD&tT{HILiXoS7L}243%Pfge$u3=$97n-o|sm*~Sn zAAyYe0HR@A^7BVI(p&Xd$Poo~u-v!jMe?@t+AVx;I7p++IyfvR7m6FsW>Ng?<*J~C z$9$j37Dc0O|L3V6(yMa<|MM?l#xP7kO*=WI5VBcWu0SDO%BCO2`IJTRtBh^dUvuUr z&0(A-(JLJT8z4XPpuMVW^_(JkVEaITdc{8RtX`R)zK{+}1CK?c)%86`s2f=h=}s|a znn!)f_l1@~IN@e9p|%x9$VM&TJ4s~5zQEx(bUx{}(3Gx?@*{D(utl`Jo?(x}lD1XZ zWJYb-S{EPd-@Wf`>%lI#uW2_FDt-lsiLxKd=~%NX`o_}`=w`;RR8%+Hxjy8Y7Z-(L zu50G60i2@~LuCQYxe1mqb*N5-=ngGj+9k4d_HuN<)hhz&LA}b5f<{sXmq?SjGmDO)d)i4~YuK-%7*|YAN@K^UlpE zE@Oy=f5f1T{;DfSC;|vw;bi?VVd@rs+$jGkTX~KB4<>m^ukzPgjM6FjN>9pPV+T{@ zjg%WBTa5$BH%?3kU@lJ^zeJSCUeHzvGbAXFYdtZW}Iz2oZkZW=bgk3k`$vd7dM%O(>a9dtq9&K!F z`1f>&0>=VC?Elwj8T0wl-ko!0n@Q`KOJGqk*Pm>(Vy-wd^+uUAJNrtt?L%gm{DNgW z6{(vP4Y|WaWPy=pnd1-h2YEbVQ9_;Aa{$X4gsC8W3epGk%X_E!Fpc-cq>@8-Tb zZEiG~tWX#T;Ts~|4cHS&#c>ZsRl^HJW)A5$OC$xOo2i9nnL4`aq6%-MG-I2oAv81* zAPc|EO;n~HD+uHp<5jY!$Q);kbHm!u0lyjS?C3Dm(_@BOLvHiyeMMj{8%K|tarnwk zl-xvaB*(O1e0=_)_45j|T`^rEBI2}3)oL1NM@qw> zs1_lO+$22-8;c{~fI*`Y`zd7nlat|bGBefl^0z-$ivQv1`xfVv`(*1O-(v^Q<8Kxg zq9q;ANQRQac#9!m$rY z&)H^pGTM1@km68?#Bz@G)T_yGNWYd&?2hAp`4ulrs=-Woq1I9DY?)33m$$4w57p5D zE)X)^rYmzOlj`;DmL%J!&1aDoUknLM5D5&L$3j@h=Xmiv`l)HD;UlU=Q>oIV(9?mH9kv zFEAMrdX4M3efTHzlW{Q}hB8IA>w4}4HC2Sx1VYSgp(>qMZwLwhAYeDGW}f1kG+Y(fXyyOC^6ITWqRY=_4a1b| z(8?t&=(rf;i=h6@Krg=&UK*OucT`!A@Mi-8zzDVw*A2efuD3PjUy7_|KyDsAiu@Y2ws@YYslM3O&R-0|$TrJ|&?yNDTCgaEcUBHIfIWq%cH`Su4~$=bZN3z73*Gze zdT5*m#Mi7p40)VjXM}i^9{H*-9F?bFr1t)HL~`~p!0r`QF1Fcf){_O(=F2;krjq~e zoM$jU17m$A-=_xF?CZNWsneV8rLTmjknbE@I;Q>hnWz>ekrcYi#0F_AUm`yABQya< zK)uRK=hKDNQZ7O83@B>I1EK!Vv60orBLlS}o%?Okin3(H$vR#KwszX)XY-YA|2e8- zl8FiIBU!8k6bMJKZfAAl67(NuL(;AFxVJb!FMSsFE0c1ve!Sq>OEvU-sL<^)_;?%o zd>LS?n-Gx|_YD7dBYT2LomV4-i_&rU?gcu~toImpBJ-*Cjm7!s{BhlGqC!r>ygC}= zslDE}vg3A&KV>6BNVZ2OgY(uK>-M8zibgE^U>kMZG=5p-NmqaIz2Du#K=1MlahgQv zkK2b3v$7_FYc$Ba_#_q%@qO-uYF_4ZhaG*jTxcZddA44uMdiPV<@$Uf)clf3Pk+V} z_p$6v5Z^5ITay@<-znvz`iCmDyXDVce#tI}2baeY2sNj=m+78!kLr;=Etg8o=VG|$ zx1%%F$KzFxm~oBe_)-Tt!pU`i_s<-NTqe!waoyE+rB2i%a1hm~qyhy`^Rrrof8*iJ zvijGbM z#{ALvm@>bxuJE-UQR3!Xy|Qnn$sVIOI^?u$j^pe$*}NiAYEEwv!RuTP!}HV-8T1RG z+dGlvii12xs*aYNwgFba>2Zq!MU1n3Cx!Qn zmm{9<^6zieIKHZlp+ogMzU(x;hMkgn$en1`;=P>)o?Y6eO7U%jU(6hA)E}&!SL4fG zW<3x4b`iX%{G#+&I#XHsML^;igRsd!yZXjEHMqj|`pi$znRG7gF?YAgT_|^u&}?!8 z&ozXI*Llzxg#XD5h+upg*tppn)NiRBwZyNUTOFZ8_uHdj3-RmI)yFU^M&40Z+lNQU zf7TtA4csMqfyhMUCW>UN6ZgB;{-td2dS&I@w*7p9eRD5-^6gm8m+STU@Nz2a{7xn6 zWVo{o85!%PzlHr!r@f^4U`d?#ul%4N9rnA{kDJvk*<3_K`tv0UuV1a6mRju3%CR%G zh^JF(tWvL|xqo;0Lj5j@$mH%J2&ic~?2mn;z!wY3-9_-_dI`Dg8uu|GdsW8%6W0lS zAUg6MmUPOGmNP0VwAgHLgOap~GfUiM;aWd~{+_WY!yK(5u3d}G@2M<2;D4Q_U`2kR zc9$Z?cTAg@UihB@{j^J_Yy)}}{2S?JrKx0opYEZoyR2D*LLwNMN1UxSUq&)?ZXy3W zqiOBav2%V}}&zxWguWV7jzfZo0Hd6y~P|-WA0?lcx*qx}6 zVmlrst2E*NcTux`eo}h?O-=E=TB)d@$Fu-T

    FRJ?Imda#mEEukdG85cprq!6d> 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�sM;aFyxw*v*T|j1DW-wC| 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 literal 0 HcmV?d00001 diff --git a/plugins/channelrx/CMakeLists.txt b/plugins/channelrx/CMakeLists.txt index 63330f55f..aadc7da63 100644 --- a/plugins/channelrx/CMakeLists.txt +++ b/plugins/channelrx/CMakeLists.txt @@ -20,6 +20,7 @@ add_subdirectory(demodpacket) add_subdirectory(demodais) add_subdirectory(demodpager) add_subdirectory(radioclock) +add_subdirectory(radioastronomy) if(DAB_FOUND AND ZLIB_FOUND AND FAAD_FOUND) add_subdirectory(demoddab) diff --git a/plugins/channelrx/radioastronomy/CMakeLists.txt b/plugins/channelrx/radioastronomy/CMakeLists.txt new file mode 100644 index 000000000..feed4b494 --- /dev/null +++ b/plugins/channelrx/radioastronomy/CMakeLists.txt @@ -0,0 +1,67 @@ +project(radioastronomy) + +set(radioastronomy_SOURCES + radioastronomy.cpp + radioastronomysettings.cpp + radioastronomybaseband.cpp + radioastronomysink.cpp + radioastronomyplugin.cpp + radioastronomywebapiadapter.cpp + radioastronomyworker.cpp +) + +set(radioastronomy_HEADERS + radioastronomy.h + radioastronomysettings.h + radioastronomybaseband.h + radioastronomysink.h + radioastronomyplugin.h + radioastronomywebapiadapter.h + radioastronomyworker.h +) + +include_directories( + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client +) + +if(NOT SERVER_MODE) + set(radioastronomy_SOURCES + ${radioastronomy_SOURCES} + radioastronomygui.cpp + radioastronomygui.ui + radioastronomycalibrationdialog.cpp + radioastronomycalibrationdialog.ui + radioastronomysensordialog.cpp + radioastronomysensordialog.ui + icons.qrc + ) + set(radioastronomy_HEADERS + ${radioastronomy_HEADERS} + radioastronomygui.h + radioastronomycalibrationdialog.h + radioastronomysensordialog.h + ) + + set(TARGET_NAME radioastronomy) + set(TARGET_LIB "Qt5::Widgets" Qt5::Charts) + set(TARGET_LIB_GUI "sdrgui") + set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR}) +else() + set(TARGET_NAME radioastronomysrv) + set(TARGET_LIB "") + set(TARGET_LIB_GUI "") + set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR}) +endif() + +add_library(${TARGET_NAME} SHARED + ${radioastronomy_SOURCES} +) + +target_link_libraries(${TARGET_NAME} + Qt5::Core + ${TARGET_LIB} + sdrbase + ${TARGET_LIB_GUI} +) + +install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER}) diff --git a/plugins/channelrx/radioastronomy/icons.qrc b/plugins/channelrx/radioastronomy/icons.qrc new file mode 100644 index 000000000..45a384156 --- /dev/null +++ b/plugins/channelrx/radioastronomy/icons.qrc @@ -0,0 +1,16 @@ + + + icons/hot.png + icons/cold.png + icons/temperature.png + icons/reverse.png + icons/gaussian.png + icons/peak.png + icons/marker.png + icons/refline.png + icons/legend.png + icons/lab.png + icons/galactictriangle.png + icons/noise.png + + diff --git a/plugins/channelrx/radioastronomy/icons/cold.png b/plugins/channelrx/radioastronomy/icons/cold.png new file mode 100644 index 0000000000000000000000000000000000000000..44cba24e90a02933cc5d84291dd60da247273c3f GIT binary patch literal 521 zcmV+k0`~ohP)(^cyGcYrR7i=nR!dI9Fch3t>>Ex%kB}}|ksDAp-9<`I0Gxnu0?G*} z$}Stq4ay!V;Rfjm2s?HUy)s62>ZXZQMzXBLesA7qVh1A9X9Oa$kYAJ{Qj18^X5W`U zov%rx&k;$YeKvzFOLx=&LI9Ozk#g2|PXL|)BxbQMfo>i&-bEa#&tTZcdj~}SNno;Y zNKTGOu=ZteOoD&{P?QuzYl(uM1g1nznS2?H0o-t2Fm(r$S!Sg7R^+i!&x*sr(BpV& zNzagkO+ybtM(<>9XP^!r0K9TzNP=q`C5ITSKuaG%Md#X_7gGX$nLDX_P}+`t1c5ca ztY~V^hY+&7r5%vn1I^%q4yUZWj!Uk$^+C(~>04-)XwED&f)RjQ0QUgisiyg!(x~kt z19RXz>`X%=s!ENQoYToHQvuv@?>B(+B9AK)B~4j(Jxz7f>138oc_iD=evOMfPAsYa zq3dC{VQ+j=9kD;9uTNbG&N$aCdjj8jSAq{qSxsz;JYI8s=UC}Vu$63)$6AIfmQ0}^ zraIQr>8xUK(c{8j@=wCP;PvuPdGUwG_^Z%gl!^|OOtISMTtx5#0#lSzas3|J1b7w1(&x+jp2cqf}K>)Yt7bE0G zuomFb?Po6IDn^hy@N6ty5v&wQKk)M;hjPu__pSl#0W8%e$IN_t0G0ExJB2Xnuo(yp z^cKKI7gNl@9{?-{B({GAp!5W#m^Z1SkPaSww5}4{A%UgVB$Q@oD*!jDfH%Xs3j~(p z<%H5ecS1Se0K5*)+YtE7)v(2B%anSj-vxsmoN}dL`HDr0O4{FD0~ZeYnUvWidA7QdcI7{l4_& literal 0 HcmV?d00001 diff --git a/plugins/channelrx/radioastronomy/icons/gaussian.png b/plugins/channelrx/radioastronomy/icons/gaussian.png new file mode 100644 index 0000000000000000000000000000000000000000..98a1daf1e617cc4fe8d82a0bb53bc1e3c621f92e GIT binary patch literal 539 zcmV+$0_6RPP)JCMlBbjFyNMyH1$NNVJSaw`G6 z_apxeSw-%9?_=-1<2|x0i?b|qJO}rj>{Bkh_hWq?E*(J#y`YElQpLPPooA!CEPA zj9F`?2l~dCV%z=~!C6Tjs8kKgDXK$NdSHwZN8af`NYl8iw+lgSmnyHp$X!|C*AWoS zJs@ub-TNqt8go1x4qukb(^cvq?ljR7i=fR>4ujFc94F@Nr)LIIqm$4lo_K16)FA0MY>}A#@Nr zpafF^rUNt1D=)wD;c?8tD#)@k$cCNK$UaHCchdP}h{)8Ii%7%PiAW_P$vKXxFZ|C;|lxo$JUo*rI}j zc6(~t>Og_gH~0b_x5>|%P*}%K>!X=O!5GV;zhDsge@C!!4tkbA{>xb78>a|t`L&NF zfc=6yr~k&pGM%(>nzeCSw{a?MoPM-%x^*h;plpXmP&$QB`zzWtN$&THrD0@)iW(|l z%XIFLyRct+Jy#$Ui9at?Ks_s0$Ak9oBjc5G7gTcubl(-4=XxG)b$whN4|)dnF6m>! zg|GLuW|C%&`xjA&NPX_&pYvCtm%c(t?T>*OoiBnbxoy(ytWCkJ%N=}s2i$?!e0*>o2mtFXD+xfD^KDr3v1}3mL|O*fp_KK^17OW&Yo_vVA2S=>)yg* z#>Jf-pyAlzcK!E}e?jk0B}?4y@C*qKZfiSszx1tg^V4%8lcMV_v=6QqW~g9lUy|cy T)@HH@7y=BQu6{1-oD!MH zf!h(kOV2-Hd(iduLHMu8dlQam7WQ~+OLThf@$j7doc&nzo|MTIo~(K+kEIr=&&t0X znjjj%`p?nf{i3zK+51mcJ!TWNxN&6drUTLzueZC({}!|F;%MO)_RgMM+->a#^ag{c LtDnm{r-UW|7>8-W literal 0 HcmV?d00001 diff --git a/plugins/channelrx/radioastronomy/icons/marker.png b/plugins/channelrx/radioastronomy/icons/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..9b37f8347d6f16c9646f96bcfd4139b512553f82 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9Fr-XP3)qGfs~Q1F7M zi(`mK=i6z9T!#!q+U$>BT)6nbvnLT3m@AmSy4`ayzb;rTShc=2>Z;1}ZFMig zC!IcV@_zh>EliU%QZBB2dgR~^fdgAvSRVh||Ju!yugyy1>r5TjaL$B9vbT>k7#mE_ h?heWBlXm3|(ckHyDA&KSUJ~dx22WQ%mvv4FO#rF8{ zEM7cGjz2`PTW&+`j2!!z;vi@pm@_;7%(YhBm1mpjfU0Jwe^ zpay`&$R-$nc3pc?birnpAP2l9|3`5&D^8jqKc7E(BS5J=?aww@E7J}lDu~GK0i=QM zLFW|!Sj}FYOD}qeUJwLBa?ue{qxi_~#z4eboUci2O|GO-S*AoZh|z{c8g2p+cm2QG zWG5qj9DwkG=v2%+GqX$N;hdOxVdhfNfyje?jOFPIoE!`9>6Q~wB|j%ww(4N3WKtLz zW;*Zv#e2`*`^vIOsR9g|uyiZAA>wEm{A7xpGSVjY9uQF(PJA)ccU$=glaQhn{BS>R zaz0|WjZ9_r9WENu;BgOXL`U)Mos1S7*f7Tl2Zd~Q`Dzf6HzG3 yN??eXeHQOQqY8~JL%=Msl(e+64|p!w0l*h>qYKXQd!4fY00001!2suJpDslss zo?^G7%=RGV2AdBUt>CqjVMcl$BfrR0YkgA@DUP4xKsF72bdt|m^4xFokQ`g309W*QS{UF1 lz^(qa=*Tafy-EY1`UdNsx7f2AVI=?n002ovPDHLkV1hWCy0QQO literal 0 HcmV?d00001 diff --git a/plugins/channelrx/radioastronomy/icons/refline.png b/plugins/channelrx/radioastronomy/icons/refline.png new file mode 100644 index 0000000000000000000000000000000000000000..157a7ad22a692f164276cfddd49cc9a8e2221c34 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9Fr-XP3)qGfs~P%zii z#WBRA^X;^aybT6CEd3pmngS<8G;~HVh9%AykyMqo*))YwsKq+|v!2de>;Ed8{z4lV zcRqbTBZ2kXG}}AM?o0T^I1~k0Q@?9WVBnolw2~4s2bW4h#wgPgg&ebxsLQ0Ol`;B>(^b literal 0 HcmV?d00001 diff --git a/plugins/channelrx/radioastronomy/icons/temperature.png b/plugins/channelrx/radioastronomy/icons/temperature.png new file mode 100644 index 0000000000000000000000000000000000000000..35db3dee52230d2f13837301d83535166d5733b1 GIT binary patch literal 391 zcmV;20eJq2P)(^cIY~r8R7i=fR#A<^FbsV=9e_e8gfLjgpb!dS46YCcp%4b49|vF% z0wE0E$&#asw#T0P!n zMu|dE-+QG*tMWkWer|P<)IKMYnhWUyD!vSS`{Yi}-6M(0J6GlcE-h^SU9=9G@Q@Fa l5H5tukhy4omg%|y_yZhg&Gm4#y|@4X002ovPDHLkV1mqipGE)x literal 0 HcmV?d00001 diff --git a/plugins/channelrx/radioastronomy/radioastronomy.cpp b/plugins/channelrx/radioastronomy/radioastronomy.cpp new file mode 100644 index 000000000..788b4fe6c --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomy.cpp @@ -0,0 +1,1109 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2015-2018 Edouard Griffiths, F4EXB. // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "radioastronomy.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "SWGChannelSettings.h" +#include "SWGChannelReport.h" +#include "SWGChannelActions.h" +#include "SWGRadioAstronomyActions.h" + +#include "dsp/dspengine.h" +#include "dsp/dspcommands.h" +#include "device/deviceapi.h" +#include "feature/feature.h" +#include "channel/channelwebapiutils.h" +#include "util/astronomy.h" +#include "util/db.h" +#include "maincore.h" + +#include "radioastronomyworker.h" + +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgConfigureRadioAstronomy, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgStartMeasurements, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgStopMeasurements, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgMeasurementProgress, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgStartCal, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgCalComplete, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgFFTMeasurement, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgSensorMeasurement, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgStartSweep, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgStopSweep, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgSweepComplete, Message) +MESSAGE_CLASS_DEFINITION(RadioAstronomy::MsgSweepStatus, Message) + +const char * const RadioAstronomy::m_channelIdURI = "sdrangel.channel.radioastronomy"; +const char * const RadioAstronomy::m_channelId = "RadioAstronomy"; + +RadioAstronomy::RadioAstronomy(DeviceAPI *deviceAPI) : + ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSink), + m_deviceAPI(deviceAPI), + m_basebandSampleRate(0), + m_sweeping(false) +{ + setObjectName(m_channelId); + + m_basebandSink = new RadioAstronomyBaseband(this); + m_basebandSink->setMessageQueueToChannel(getInputMessageQueue()); + m_basebandSink->setChannel(this); + m_basebandSink->moveToThread(&m_thread); + + m_worker = new RadioAstronomyWorker(this); + m_worker->setMessageQueueToChannel(getInputMessageQueue()); + m_worker->moveToThread(&m_workerThread); + + applySettings(m_settings, true); + + m_deviceAPI->addChannelSink(this); + m_deviceAPI->addChannelSinkAPI(this); + + m_selectedPipe = nullptr; + connect(&m_updatePipesTimer, SIGNAL(timeout()), this, SLOT(updatePipes())); + m_updatePipesTimer.start(1000); + + m_networkManager = new QNetworkAccessManager(); + connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); + connect(&m_channelMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleChannelMessages())); + + m_sweepTimer.setSingleShot(true); +} + +RadioAstronomy::~RadioAstronomy() +{ + qDebug("RadioAstronomy::~RadioAstronomy"); + disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); + delete m_networkManager; + m_deviceAPI->removeChannelSinkAPI(this); + m_deviceAPI->removeChannelSink(this); + + if (m_basebandSink->isRunning()) { + stop(); + } + delete m_basebandSink; + if (m_worker->isRunning()) { + stop(); + } + delete m_worker; +} + +uint32_t RadioAstronomy::getNumberOfDeviceStreams() const +{ + return m_deviceAPI->getNbSourceStreams(); +} + +void RadioAstronomy::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst) +{ + (void) firstOfBurst; + m_basebandSink->feed(begin, end); +} + +void RadioAstronomy::start() +{ + qDebug("RadioAstronomy::start"); + + m_basebandSink->reset(); + m_basebandSink->startWork(); + m_thread.start(); + + m_worker->reset(); + m_worker->setMessageQueueToGUI(getMessageQueueToGUI()); + m_worker->startWork(); + m_workerThread.start(); + + m_basebandSink->getInputMessageQueue()->push(new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency)); + + m_basebandSink->getInputMessageQueue()->push(RadioAstronomyBaseband::MsgConfigureRadioAstronomyBaseband::create(m_settings, true)); + + m_worker->getInputMessageQueue()->push(RadioAstronomyWorker::MsgConfigureRadioAstronomyWorker::create(m_settings, true)); +} + +void RadioAstronomy::stop() +{ + qDebug("RadioAstronomy::stop"); + m_basebandSink->stopWork(); + m_thread.quit(); + m_thread.wait(); + m_worker->stopWork(); + m_workerThread.quit(); + m_workerThread.wait(); +} + +bool RadioAstronomy::handleMessage(const Message& cmd) +{ + if (MsgConfigureRadioAstronomy::match(cmd)) + { + MsgConfigureRadioAstronomy& cfg = (MsgConfigureRadioAstronomy&) cmd; + qDebug() << "RadioAstronomy::handleMessage: MsgConfigureRadioAstronomy"; + applySettings(cfg.getSettings(), cfg.getForce()); + + return true; + } + else if (DSPSignalNotification::match(cmd)) + { + DSPSignalNotification& notif = (DSPSignalNotification&) cmd; + m_basebandSampleRate = notif.getSampleRate(); + m_centerFrequency = notif.getCenterFrequency(); + // Forward to the sink + DSPSignalNotification* rep = new DSPSignalNotification(notif); // make a copy + qDebug() << "RadioAstronomy::handleMessage: DSPSignalNotification"; + m_basebandSink->getInputMessageQueue()->push(rep); + // Forward to GUI + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(new DSPSignalNotification(notif)); + } + + return true; + } + else if (MainCore::MsgStarTrackerTarget::match(cmd)) + { + MainCore::MsgStarTrackerTarget& msg = (MainCore::MsgStarTrackerTarget&)cmd; + if (msg.getPipeSource() == m_selectedPipe) + { + // Forward to GUI + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(new MainCore::MsgStarTrackerTarget(msg)); + } + } + return true; + } + else if (MsgMeasurementProgress::match(cmd)) + { + // Forward to GUI + MsgMeasurementProgress& report = (MsgMeasurementProgress&)cmd; + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(new MsgMeasurementProgress(report)); + } + + return true; + } + else if (MsgStartCal::match(cmd)) + { + // Forward to the sink + MsgStartCal& calCmd = (MsgStartCal&)cmd; + + startCal(calCmd.getHot()); + + return true; + } + else if (MsgCalComplete::match(cmd)) + { + // Take copy to forward to GUI + MsgCalComplete& report = (MsgCalComplete&)cmd; + MsgCalComplete* copy = nullptr; + if (getMessageQueueToGUI()) { + copy = new MsgCalComplete(report); + } + calComplete(copy); + + return true; + } + else if (MsgFFTMeasurement::match(cmd)) + { + // Forward to GUI + MsgFFTMeasurement& report = (MsgFFTMeasurement&)cmd; + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(new MsgFFTMeasurement(report)); + } + + if (m_sweeping) { + m_sweeping = false; + sweepNext(); + } + + return true; + } + else if (MsgStartSweep::match(cmd)) + { + if (m_settings.m_runMode == RadioAstronomySettings::SWEEP) { + sweepStart(); + } else { + callOnStartTime(&RadioAstronomy::startMeasurement); + } + return true; + } + else if (MsgStopSweep::match(cmd)) + { + if (m_settings.m_runMode == RadioAstronomySettings::SWEEP) + { + m_sweepStop = true; + m_sweepTimer.setInterval(0); + } + else + { + m_basebandSink->getInputMessageQueue()->push(MsgStopMeasurements::create()); + } + return true; + } + else + { + return false; + } +} + +void RadioAstronomy::startCal(bool hot) +{ + // Set GPIO pin in SDR to enable calibration + if (m_settings.m_gpioEnabled) + { + int gpioPins; + int gpioDir; + if (ChannelWebAPIUtils::getDeviceSetting(getDeviceSetIndex(), "gpioDir", gpioDir)) + { + // Set pin as output + gpioDir |= 1 << m_settings.m_gpioPin; + ChannelWebAPIUtils::patchDeviceSetting(getDeviceSetIndex(), "gpioDir", gpioDir); + if (ChannelWebAPIUtils::getDeviceSetting(getDeviceSetIndex(), "gpioPins", gpioPins)) + { + // Set state of pin + if (m_settings.m_gpioSense) { + gpioPins |= 1 << m_settings.m_gpioPin; + } else { + gpioPins &= ~(1 << m_settings.m_gpioPin); + } + ChannelWebAPIUtils::patchDeviceSetting(getDeviceSetIndex(), "gpioPins", gpioPins); + } + else + { + qDebug() << "RadioAstronomy::startCal - Failed to read gpioPins setting. Does this SDR support it?"; + } + } + else + { + qDebug() << "RadioAstronomy::startCal - Failed to read gpioDir setting. Does this SDR support it?"; + } + } + + // Execute command to enable calibration + if (!m_settings.m_startCalCommand.isEmpty()) { + QProcess::startDetached(m_settings.m_startCalCommand); + } + + // Start calibration after requested delay + MsgStartCal* startCal = MsgStartCal::create(hot); + QTimer::singleShot(m_settings.m_calCommandDelay * 1000, [this, startCal] { + m_basebandSink->getInputMessageQueue()->push(startCal); + }); +} + +void RadioAstronomy::calComplete(MsgCalComplete* report) +{ + // Set GPIO pin in SDR to disable calibration + if (m_settings.m_gpioEnabled) + { + int gpioPins; + if (ChannelWebAPIUtils::getDeviceSetting(getDeviceSetIndex(), "gpioPins", gpioPins)) + { + if (m_settings.m_gpioSense) { + gpioPins &= ~(1 << m_settings.m_gpioPin); + } else { + gpioPins |= 1 << m_settings.m_gpioPin; + } + ChannelWebAPIUtils::patchDeviceSetting(getDeviceSetIndex(), "gpioPins", gpioPins); + } + else + { + qDebug() << "RadioAstronomy::calComplete - Failed to read gpioPins setting. Does this SDR support it?"; + } + } + + // Execute command to disable calibration + if (!m_settings.m_stopCalCommand.isEmpty()) { + QProcess::startDetached(m_settings.m_stopCalCommand); + } + + // Send calibration result to GUI + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(report); + } +} + +void RadioAstronomy::callOnStartTime(void (RadioAstronomy::*f)()) +{ + qint64 delayMSecs = 0; + + if (m_settings.m_sweepStartAtTime) { + delayMSecs = QDateTime::currentDateTime().msecsTo(m_settings.m_sweepStartDateTime); + } + + if (delayMSecs > 0) + { + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create(QString("Waiting: %1").arg(m_settings.m_sweepStartDateTime.toString()))); + } + qDebug() << "RadioAstronomy::callOnStartTime - Wait until " << m_settings.m_sweepStartDateTime.toString(); + // Wait before calling + QObject::disconnect(m_sweepTimerConnection); + m_sweepTimerConnection = m_sweepTimer.callOnTimeout(this, f); + m_sweepTimer.start(delayMSecs); + } + else + { + // Call immediately + (this->*f)(); + } +} + +void RadioAstronomy::startMeasurement() +{ + m_basebandSink->getInputMessageQueue()->push(MsgStartMeasurements::create()); +} + +void RadioAstronomy::sweepStart() +{ + m_sweepStop = false; + m_sweep1Start = m_settings.m_sweep1Start; + m_sweep1Stop = m_settings.m_sweep1Stop; + + // Handle azimuth/l sweep through 0. E.g. 340deg -> 20deg with +vs step, or 20deg -> 340deg with -ve step + if ((m_settings.m_sweep1Stop < m_settings.m_sweep1Start) && (m_settings.m_sweep1Step > 0)) { + m_sweep1Stop = m_settings.m_sweep1Stop + 360.0; + } else if ((m_settings.m_sweep1Stop > m_settings.m_sweep1Start) && (m_settings.m_sweep1Step < 0)) { + m_sweep1Start += 360.0; + } + m_sweep1 = m_sweep1Start; + m_sweep2 = m_settings.m_sweep2Start; + + const QRegExp re("F([0-9]+):([0-9]+)"); + if (re.indexIn(m_settings.m_starTracker) >= 0) + { + m_starTrackerFeatureSetIndex = re.capturedTexts()[1].toInt(); + m_starTrackerFeatureIndex = re.capturedTexts()[2].toInt(); + + if (m_settings.m_sweepType == RadioAstronomySettings::SWP_AZEL) { + ChannelWebAPIUtils::patchFeatureSetting(m_starTrackerFeatureSetIndex, m_starTrackerFeatureIndex, "target", "Custom Az/El"); + } else if (m_settings.m_sweepType == RadioAstronomySettings::SWP_LB) { + ChannelWebAPIUtils::patchFeatureSetting(m_starTrackerFeatureSetIndex, m_starTrackerFeatureIndex, "target", "Custom l/b"); + } + + if (m_settings.m_rotator == "None") + { + m_rotatorFeatureSetIndex = -1; + m_rotatorFeatureIndex = -1; + + sweep2(); + callOnStartTime(&RadioAstronomy::sweep1); + } + else if (re.indexIn(m_settings.m_rotator) >= 0) + { + m_rotatorFeatureSetIndex = re.capturedTexts()[1].toInt(); + m_rotatorFeatureIndex = re.capturedTexts()[2].toInt(); + + sweep2(); + callOnStartTime(&RadioAstronomy::sweep1); + } + else + { + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create("Invalid rotator")); + } + qDebug() << "RadioAstronomy::sweepStart: No valid rotator feature is set"; + } + } + else + { + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create("Invalid Star Tracker")); + } + qDebug() << "RadioAstronomy::sweepStart: No valid StarTracker feature is set"; + } +} + +void RadioAstronomy::sweep1() +{ + if (m_sweepStop) + { + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create("Stopped")); + } + sweepComplete(); + } + else + { + if (m_settings.m_sweepType == RadioAstronomySettings::SWP_AZEL) { + ChannelWebAPIUtils::patchFeatureSetting(m_starTrackerFeatureSetIndex, m_starTrackerFeatureIndex, "azimuth", Astronomy::modulo(m_sweep1, 360.0)); + } else if (m_settings.m_sweepType == RadioAstronomySettings::SWP_LB) { + ChannelWebAPIUtils::patchFeatureSetting(m_starTrackerFeatureSetIndex, m_starTrackerFeatureIndex, "l", Astronomy::modulo(m_sweep1, 360.0)); + } else if (m_settings.m_sweepType == RadioAstronomySettings::SWP_OFFSET) { + ChannelWebAPIUtils::patchFeatureSetting(m_starTrackerFeatureSetIndex, m_starTrackerFeatureIndex, "azimuthOffset", m_sweep1); + } + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create(QString("Rotating: %1,%2").arg(m_sweep1).arg(m_sweep2))); + } + qDebug() << "RadioAstronomy::sweep1 - Sweeping " << m_sweep1 << m_sweep2; + QObject::disconnect(m_sweepTimerConnection); + m_sweepTimerConnection = m_sweepTimer.callOnTimeout(this, &RadioAstronomy::waitUntilOnTarget); + m_sweepTimer.start(100); + } +} + +void RadioAstronomy::sweep2() +{ + if (m_settings.m_sweepType == RadioAstronomySettings::SWP_AZEL) { + ChannelWebAPIUtils::patchFeatureSetting(m_starTrackerFeatureSetIndex, m_starTrackerFeatureIndex, "elevation", m_sweep2); + } else if (m_settings.m_sweepType == RadioAstronomySettings::SWP_LB) { + ChannelWebAPIUtils::patchFeatureSetting(m_starTrackerFeatureSetIndex, m_starTrackerFeatureIndex, "b", m_sweep2); + } else if (m_settings.m_sweepType == RadioAstronomySettings::SWP_OFFSET) { + ChannelWebAPIUtils::patchFeatureSetting(m_starTrackerFeatureSetIndex, m_starTrackerFeatureIndex, "elevationOffset", m_sweep2); + } +} + +// Wait until the antenna is pointing at the target +void RadioAstronomy::waitUntilOnTarget() +{ + int onTarget; + + if (m_sweepStop) + { + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create("Stopped")); + } + sweepComplete(); + } + else + { + if (m_settings.m_rotator == "None") + { + onTarget = true; + } + else if (!ChannelWebAPIUtils::getFeatureReportValue(m_rotatorFeatureSetIndex, m_rotatorFeatureIndex, "onTarget", onTarget)) + { + sweepComplete(); + return; + } + + if (onTarget) + { + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create("Settle")); + } + QObject::disconnect(m_sweepTimerConnection); + m_sweepTimerConnection = m_sweepTimer.callOnTimeout(this, &RadioAstronomy::sweepStartMeasurement); + m_sweepTimer.start(m_settings.m_sweep1Delay * 1000); + } + else + { + // Wait some more and retry + QObject::disconnect(m_sweepTimerConnection); + m_sweepTimerConnection = m_sweepTimer.callOnTimeout(this, &RadioAstronomy::waitUntilOnTarget); + m_sweepTimer.start(100); + } + } +} + +void RadioAstronomy::sweepStartMeasurement() +{ + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create(QString("Measure: %1,%2").arg(m_sweep1).arg(m_sweep2))); + } + // Start measurement + m_sweeping = true; + m_basebandSink->getInputMessageQueue()->push(MsgStartMeasurements::create()); +} + +void RadioAstronomy::sweepNext() +{ + if (m_sweepStop) + { + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create("Stopped")); + } + sweepComplete(); + } + else + { + if ( ((m_sweep1 >= m_sweep1Stop) && (m_settings.m_sweep1Step >= 0)) + || ((m_sweep1 <= m_sweep1Stop) && (m_settings.m_sweep1Step < 0)) + ) + { + if ( ((m_sweep2 >= m_settings.m_sweep2Stop) && (m_settings.m_sweep2Step >= 0)) + || ((m_sweep2 <= m_settings.m_sweep2Stop) && (m_settings.m_sweep2Step < 0)) + ) + { + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create("Complete")); + } + // Finished + sweepComplete(); + } + else + { + m_sweep2 += m_settings.m_sweep2Step; + sweep2(); + m_sweep1 = m_sweep1Start; + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create("Delay")); + } + QObject::disconnect(m_sweepTimerConnection); + m_sweepTimerConnection = m_sweepTimer.callOnTimeout(this, &RadioAstronomy::sweep1); + m_sweepTimer.start(m_settings.m_sweep2Delay * 1000); + } + } + else + { + m_sweep1 += m_settings.m_sweep1Step; + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepStatus::create("Delay")); + } + QObject::disconnect(m_sweepTimerConnection); + m_sweepTimerConnection = m_sweepTimer.callOnTimeout(this, &RadioAstronomy::sweep1); + m_sweepTimer.start(m_settings.m_sweep2Delay * 1000); + } + } +} + +void RadioAstronomy::sweepComplete() +{ + ChannelWebAPIUtils::patchFeatureSetting(m_starTrackerFeatureSetIndex, m_starTrackerFeatureIndex, "elevationOffset", 0); + ChannelWebAPIUtils::patchFeatureSetting(m_starTrackerFeatureSetIndex, m_starTrackerFeatureIndex, "azimuthOffset", 0); + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(MsgSweepComplete::create()); + } +} + +void RadioAstronomy::updatePipes() +{ + QList availablePipes = updateAvailablePipeSources("startracker.target", RadioAstronomySettings::m_pipeTypes, RadioAstronomySettings::m_pipeURIs, this); + + if (availablePipes != m_availablePipes) + { + m_availablePipes = availablePipes; + if (getMessageQueueToGUI()) + { + MsgReportPipes *msgToGUI = MsgReportPipes::create(); + QList& msgAvailablePipes = msgToGUI->getAvailablePipes(); + msgAvailablePipes.append(availablePipes); + getMessageQueueToGUI()->push(msgToGUI); + } + } +} + +void RadioAstronomy::applySettings(const RadioAstronomySettings& settings, bool force) +{ + qDebug() << "RadioAstronomy::applySettings:" + << " m_streamIndex: " << settings.m_streamIndex + << " m_useReverseAPI: " << settings.m_useReverseAPI + << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress + << " m_reverseAPIPort: " << settings.m_reverseAPIPort + << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex + << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex + << " force: " << force; + + QList reverseAPIKeys; + + if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { + reverseAPIKeys.append("inputFrequencyOffset"); + } + if ((settings.m_sampleRate != m_settings.m_sampleRate) || force) { + reverseAPIKeys.append("sampleRate"); + } + if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { + reverseAPIKeys.append("rfBandwidth"); + } + if ((settings.m_integration != m_settings.m_integration) || force) { + reverseAPIKeys.append("integration"); + } + if ((settings.m_fftSize != m_settings.m_fftSize) || force) { + reverseAPIKeys.append("fftSize"); + } + if ((settings.m_fftWindow != m_settings.m_fftWindow) || force) { + reverseAPIKeys.append("fftWindow"); + } + if ((settings.m_filterFreqs != m_settings.m_filterFreqs) || force) { + reverseAPIKeys.append("filterFreqs"); + } + + if ((settings.m_starTracker != m_settings.m_starTracker) || force) { + reverseAPIKeys.append("starTracker"); + } + if ((settings.m_rotator != m_settings.m_rotator) || force) { + reverseAPIKeys.append("rotator"); + } + + if ((settings.m_runMode != m_settings.m_runMode) || force) { + reverseAPIKeys.append("runMode"); + } + if ((settings.m_sweepStartAtTime != m_settings.m_sweepStartAtTime) || force) { + reverseAPIKeys.append("sweepStartAtTime"); + } + if ((settings.m_sweepStartDateTime != m_settings.m_sweepStartDateTime) || force) { + reverseAPIKeys.append("sweepStartDateTime"); + } + if ((settings.m_sweepType != m_settings.m_sweepType) || force) { + reverseAPIKeys.append("sweepType"); + } + if ((settings.m_sweep1Start != m_settings.m_sweep1Start) || force) { + reverseAPIKeys.append("sweep1Start"); + } + if ((settings.m_sweep1Stop != m_settings.m_sweep1Stop) || force) { + reverseAPIKeys.append("sweep1Stop"); + } + if ((settings.m_sweep1Step != m_settings.m_sweep1Step) || force) { + reverseAPIKeys.append("sweep1Step"); + } + if ((settings.m_sweep1Delay != m_settings.m_sweep1Delay) || force) { + reverseAPIKeys.append("sweep1Delay"); + } + if ((settings.m_sweep2Start != m_settings.m_sweep2Start) || force) { + reverseAPIKeys.append("sweep2Start"); + } + if ((settings.m_sweep2Stop != m_settings.m_sweep2Stop) || force) { + reverseAPIKeys.append("sweep2Stop"); + } + if ((settings.m_sweep2Step != m_settings.m_sweep2Step) || force) { + reverseAPIKeys.append("sweep2Step"); + } + if ((settings.m_sweep2Delay != m_settings.m_sweep2Delay) || force) { + reverseAPIKeys.append("sweep2Delay"); + } + + if ((m_settings.m_starTracker != settings.m_starTracker) + || (!settings.m_starTracker.isEmpty() && (m_selectedPipe == nullptr)) // Change in available pipes + || force) + { + if (!settings.m_starTracker.isEmpty()) + { + m_selectedPipe = getPipeEndPoint(settings.m_starTracker, m_availablePipes); + if (m_selectedPipe == nullptr) { + qDebug() << "RadioAstronomy::applySettings: No plugin corresponding to target " << settings.m_starTracker; + } + } + + reverseAPIKeys.append("starTracker"); + } + + if (m_settings.m_streamIndex != settings.m_streamIndex) + { + if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only + { + m_deviceAPI->removeChannelSinkAPI(this); + m_deviceAPI->removeChannelSink(this, m_settings.m_streamIndex); + m_deviceAPI->addChannelSink(this, settings.m_streamIndex); + m_deviceAPI->addChannelSinkAPI(this); + } + + reverseAPIKeys.append("streamIndex"); + } + + m_basebandSink->getInputMessageQueue()->push(RadioAstronomyBaseband::MsgConfigureRadioAstronomyBaseband::create(settings, force)); + + m_worker->getInputMessageQueue()->push(RadioAstronomyWorker::MsgConfigureRadioAstronomyWorker::create(settings, force)); + + if (settings.m_useReverseAPI) + { + bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || + (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || + (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || + (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex) || + (m_settings.m_reverseAPIChannelIndex != settings.m_reverseAPIChannelIndex); + webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); + } + + m_settings = settings; +} + +QByteArray RadioAstronomy::serialize() const +{ + return m_settings.serialize(); +} + +bool RadioAstronomy::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureRadioAstronomy *msg = MsgConfigureRadioAstronomy::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureRadioAstronomy *msg = MsgConfigureRadioAstronomy::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} + +int RadioAstronomy::webapiSettingsGet( + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage) +{ + (void) errorMessage; + response.setRadioAstronomySettings(new SWGSDRangel::SWGRadioAstronomySettings()); + response.getRadioAstronomySettings()->init(); + webapiFormatChannelSettings(response, m_settings); + return 200; +} + +int RadioAstronomy::webapiSettingsPutPatch( + bool force, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage) +{ + (void) errorMessage; + RadioAstronomySettings settings = m_settings; + webapiUpdateChannelSettings(settings, channelSettingsKeys, response); + + MsgConfigureRadioAstronomy *msg = MsgConfigureRadioAstronomy::create(settings, force); + m_inputMessageQueue.push(msg); + + qDebug("RadioAstronomy::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); + if (m_guiMessageQueue) // forward to GUI if any + { + MsgConfigureRadioAstronomy *msgToGUI = MsgConfigureRadioAstronomy::create(settings, force); + m_guiMessageQueue->push(msgToGUI); + } + + webapiFormatChannelSettings(response, settings); + + return 200; +} + +int RadioAstronomy::webapiActionsPost( + const QStringList& channelActionsKeys, + SWGSDRangel::SWGChannelActions& query, + QString& errorMessage) +{ + SWGSDRangel::SWGRadioAstronomyActions *swgRadioAstronomyActions = query.getRadioAstronomyActions(); + + if (swgRadioAstronomyActions) + { + if (channelActionsKeys.contains("start")) + { + getInputMessageQueue()->push(MsgStartSweep::create()); + return 202; + } + else + { + errorMessage = "Unknown action"; + return 400; + } + } + else + { + errorMessage = "Missing RadioAstronomyActions in query"; + return 400; + } +} + +void RadioAstronomy::webapiUpdateChannelSettings( + RadioAstronomySettings& settings, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response) +{ + if (channelSettingsKeys.contains("inputFrequencyOffset")) { + settings.m_inputFrequencyOffset = response.getRadioAstronomySettings()->getInputFrequencyOffset(); + } + if (channelSettingsKeys.contains("sampleRate")) { + settings.m_sampleRate = response.getRadioAstronomySettings()->getSampleRate(); + } + if (channelSettingsKeys.contains("rfBandwidth")) { + settings.m_rfBandwidth = response.getRadioAstronomySettings()->getRfBandwidth(); + } + if (channelSettingsKeys.contains("integration")) { + settings.m_integration = response.getRadioAstronomySettings()->getIntegration(); + } + if (channelSettingsKeys.contains("fftSize")) { + settings.m_fftSize = response.getRadioAstronomySettings()->getFftSize(); + } + if (channelSettingsKeys.contains("fftWindow")) { + settings.m_fftWindow = (RadioAstronomySettings::FFTWindow)response.getRadioAstronomySettings()->getFftWindow(); + } + if (channelSettingsKeys.contains("filterFreqs")) { + settings.m_filterFreqs = *response.getRadioAstronomySettings()->getFilterFreqs(); + } + + if (channelSettingsKeys.contains("starTracker")) { + settings.m_starTracker = *response.getRadioAstronomySettings()->getStarTracker(); + } + if (channelSettingsKeys.contains("rotator")) { + settings.m_rotator = *response.getRadioAstronomySettings()->getRotator(); + } + + if (channelSettingsKeys.contains("runMode")) { + settings.m_runMode = (RadioAstronomySettings::RunMode)response.getRadioAstronomySettings()->getRunMode(); + } + if (channelSettingsKeys.contains("sweepStartAtTime")) { + settings.m_sweepStartAtTime = (bool)response.getRadioAstronomySettings()->getSweepStartAtTime(); + } + if (channelSettingsKeys.contains("sweepStartDateTime")) { + settings.m_sweepStartDateTime = QDateTime::fromString(*response.getRadioAstronomySettings()->getRotator(), Qt::ISODate); + } + if (channelSettingsKeys.contains("sweepType")) { + settings.m_sweepType = (RadioAstronomySettings::SweepType)response.getRadioAstronomySettings()->getSweepType(); + } + if (channelSettingsKeys.contains("sweep1Start")) { + settings.m_sweep1Start = response.getRadioAstronomySettings()->getSweep1Start(); + } + if (channelSettingsKeys.contains("sweep1Stop")) { + settings.m_sweep1Stop = response.getRadioAstronomySettings()->getSweep1Stop(); + } + if (channelSettingsKeys.contains("sweep1Step")) { + settings.m_sweep1Step = response.getRadioAstronomySettings()->getSweep1Step(); + } + if (channelSettingsKeys.contains("sweep1Delay")) { + settings.m_sweep1Delay = response.getRadioAstronomySettings()->getSweep1Delay(); + } + if (channelSettingsKeys.contains("sweep12Start")) { + settings.m_sweep2Start = response.getRadioAstronomySettings()->getSweep2Start(); + } + if (channelSettingsKeys.contains("sweep12Stop")) { + settings.m_sweep2Stop = response.getRadioAstronomySettings()->getSweep2Stop(); + } + if (channelSettingsKeys.contains("sweep2Step")) { + settings.m_sweep2Step = response.getRadioAstronomySettings()->getSweep2Step(); + } + if (channelSettingsKeys.contains("sweep2Delay")) { + settings.m_sweep2Delay = response.getRadioAstronomySettings()->getSweep2Delay(); + } + + if (channelSettingsKeys.contains("rgbColor")) { + settings.m_rgbColor = response.getRadioAstronomySettings()->getRgbColor(); + } + if (channelSettingsKeys.contains("title")) { + settings.m_title = *response.getRadioAstronomySettings()->getTitle(); + } + if (channelSettingsKeys.contains("streamIndex")) { + settings.m_streamIndex = response.getRadioAstronomySettings()->getStreamIndex(); + } + if (channelSettingsKeys.contains("useReverseAPI")) { + settings.m_useReverseAPI = response.getRadioAstronomySettings()->getUseReverseApi() != 0; + } + if (channelSettingsKeys.contains("reverseAPIAddress")) { + settings.m_reverseAPIAddress = *response.getRadioAstronomySettings()->getReverseApiAddress(); + } + if (channelSettingsKeys.contains("reverseAPIPort")) { + settings.m_reverseAPIPort = response.getRadioAstronomySettings()->getReverseApiPort(); + } + if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) { + settings.m_reverseAPIDeviceIndex = response.getRadioAstronomySettings()->getReverseApiDeviceIndex(); + } + if (channelSettingsKeys.contains("reverseAPIChannelIndex")) { + settings.m_reverseAPIChannelIndex = response.getRadioAstronomySettings()->getReverseApiChannelIndex(); + } +} + +void RadioAstronomy::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const RadioAstronomySettings& settings) +{ + response.getRadioAstronomySettings()->setInputFrequencyOffset(settings.m_inputFrequencyOffset); + response.getRadioAstronomySettings()->setSampleRate(settings.m_sampleRate); + response.getRadioAstronomySettings()->setRfBandwidth(settings.m_rfBandwidth); + response.getRadioAstronomySettings()->setIntegration(settings.m_integration); + response.getRadioAstronomySettings()->setFftSize(settings.m_fftSize); + response.getRadioAstronomySettings()->setFftWindow((int)settings.m_fftWindow); + response.getRadioAstronomySettings()->setFilterFreqs(new QString(settings.m_filterFreqs)); + + response.getRadioAstronomySettings()->setStarTracker(new QString(settings.m_starTracker)); + response.getRadioAstronomySettings()->setRotator(new QString(settings.m_rotator)); + + response.getRadioAstronomySettings()->setRunMode((int)settings.m_runMode); + response.getRadioAstronomySettings()->setSweepStartAtTime((int)settings.m_sweepStartAtTime); + response.getRadioAstronomySettings()->setSweepStartDateTime(new QString(settings.m_sweepStartDateTime.toString(Qt::ISODate))); + response.getRadioAstronomySettings()->setSweepType((int)settings.m_sweepType); + response.getRadioAstronomySettings()->setSweep1Start(settings.m_sweep1Start); + response.getRadioAstronomySettings()->setSweep1Stop(settings.m_sweep1Stop); + response.getRadioAstronomySettings()->setSweep1Step(settings.m_sweep1Step); + response.getRadioAstronomySettings()->setSweep1Delay(settings.m_sweep1Delay); + response.getRadioAstronomySettings()->setSweep2Start(settings.m_sweep2Start); + response.getRadioAstronomySettings()->setSweep2Stop(settings.m_sweep2Stop); + response.getRadioAstronomySettings()->setSweep2Step(settings.m_sweep2Step); + response.getRadioAstronomySettings()->setSweep2Delay(settings.m_sweep2Delay); + + response.getRadioAstronomySettings()->setRgbColor(settings.m_rgbColor); + if (response.getRadioAstronomySettings()->getTitle()) { + *response.getRadioAstronomySettings()->getTitle() = settings.m_title; + } else { + response.getRadioAstronomySettings()->setTitle(new QString(settings.m_title)); + } + + response.getRadioAstronomySettings()->setStreamIndex(settings.m_streamIndex); + response.getRadioAstronomySettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0); + + if (response.getRadioAstronomySettings()->getReverseApiAddress()) { + *response.getRadioAstronomySettings()->getReverseApiAddress() = settings.m_reverseAPIAddress; + } else { + response.getRadioAstronomySettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress)); + } + + response.getRadioAstronomySettings()->setReverseApiPort(settings.m_reverseAPIPort); + response.getRadioAstronomySettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex); + response.getRadioAstronomySettings()->setReverseApiChannelIndex(settings.m_reverseAPIChannelIndex); +} + +void RadioAstronomy::webapiReverseSendSettings(QList& channelSettingsKeys, const RadioAstronomySettings& settings, bool force) +{ + SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings(); + webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force); + + QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings") + .arg(settings.m_reverseAPIAddress) + .arg(settings.m_reverseAPIPort) + .arg(settings.m_reverseAPIDeviceIndex) + .arg(settings.m_reverseAPIChannelIndex); + m_networkRequest.setUrl(QUrl(channelSettingsURL)); + m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + QBuffer *buffer = new QBuffer(); + buffer->open((QBuffer::ReadWrite)); + buffer->write(swgChannelSettings->asJson().toUtf8()); + buffer->seek(0); + + // Always use PATCH to avoid passing reverse API settings + QNetworkReply *reply = m_networkManager->sendCustomRequest(m_networkRequest, "PATCH", buffer); + buffer->setParent(reply); + + delete swgChannelSettings; +} + +void RadioAstronomy::webapiFormatChannelSettings( + QList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings *swgChannelSettings, + const RadioAstronomySettings& settings, + bool force +) +{ + swgChannelSettings->setDirection(0); // Single sink (Rx) + swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet()); + swgChannelSettings->setOriginatorDeviceSetIndex(getDeviceSetIndex()); + swgChannelSettings->setChannelType(new QString("RadioAstronomy")); + swgChannelSettings->setRadioAstronomySettings(new SWGSDRangel::SWGRadioAstronomySettings()); + SWGSDRangel::SWGRadioAstronomySettings *swgRadioAstronomySettings = swgChannelSettings->getRadioAstronomySettings(); + + // transfer data that has been modified. When force is on transfer all data except reverse API data + + if (channelSettingsKeys.contains("inputFrequencyOffset") || force) { + swgRadioAstronomySettings->setInputFrequencyOffset(settings.m_inputFrequencyOffset); + } + if (channelSettingsKeys.contains("sampleRate") || force) { + swgRadioAstronomySettings->setInputFrequencyOffset(settings.m_sampleRate); + } + if (channelSettingsKeys.contains("rfBandwidth") || force) { + swgRadioAstronomySettings->setRfBandwidth(settings.m_rfBandwidth); + } + if (channelSettingsKeys.contains("integration") || force) { + swgRadioAstronomySettings->setRfBandwidth(settings.m_integration); + } + if (channelSettingsKeys.contains("fftSize") || force) { + swgRadioAstronomySettings->setRfBandwidth(settings.m_fftSize); + } + if (channelSettingsKeys.contains("fftWindow") || force) { + swgRadioAstronomySettings->setRfBandwidth((int)settings.m_fftWindow); + } + if (channelSettingsKeys.contains("filterFreqs") || force) { + swgRadioAstronomySettings->setFilterFreqs(new QString(settings.m_filterFreqs)); + } + + if (channelSettingsKeys.contains("starTracker") || force) { + swgRadioAstronomySettings->setStarTracker(new QString(settings.m_starTracker)); + } + if (channelSettingsKeys.contains("rotator") || force) { + swgRadioAstronomySettings->setRotator(new QString(settings.m_rotator)); + } + + if (channelSettingsKeys.contains("runMode") || force) { + swgRadioAstronomySettings->setRunMode((int)settings.m_runMode); + } + if (channelSettingsKeys.contains("sweepStartAtTime") || force) { + swgRadioAstronomySettings->setSweepStartAtTime((int)settings.m_sweepStartAtTime); + } + if (channelSettingsKeys.contains("sweepStartDateTime") || force) { + swgRadioAstronomySettings->setSweepStartDateTime(new QString(settings.m_sweepStartDateTime.toString(Qt::ISODate))); + } + if (channelSettingsKeys.contains("sweepType") || force) { + swgRadioAstronomySettings->setSweepType(settings.m_sweepType); + } + if (channelSettingsKeys.contains("sweep1Start") || force) { + swgRadioAstronomySettings->setSweep1Start(settings.m_sweep1Start); + } + if (channelSettingsKeys.contains("sweep1Stop") || force) { + swgRadioAstronomySettings->setSweep1Stop(settings.m_sweep1Stop); + } + if (channelSettingsKeys.contains("sweep1Step") || force) { + swgRadioAstronomySettings->setSweep1Step(settings.m_sweep1Step); + } + if (channelSettingsKeys.contains("sweep2Delay") || force) { + swgRadioAstronomySettings->setSweep2Delay(settings.m_sweep2Delay); + } + if (channelSettingsKeys.contains("sweep2Start") || force) { + swgRadioAstronomySettings->setSweep2Start(settings.m_sweep2Start); + } + if (channelSettingsKeys.contains("sweep2Stop") || force) { + swgRadioAstronomySettings->setSweep2Stop(settings.m_sweep2Stop); + } + if (channelSettingsKeys.contains("sweep2Step") || force) { + swgRadioAstronomySettings->setSweep2Step(settings.m_sweep2Step); + } + if (channelSettingsKeys.contains("sweep2Delay") || force) { + swgRadioAstronomySettings->setSweep2Delay(settings.m_sweep2Delay); + } + + if (channelSettingsKeys.contains("rgbColor") || force) { + swgRadioAstronomySettings->setRgbColor(settings.m_rgbColor); + } + if (channelSettingsKeys.contains("title") || force) { + swgRadioAstronomySettings->setTitle(new QString(settings.m_title)); + } + if (channelSettingsKeys.contains("streamIndex") || force) { + swgRadioAstronomySettings->setStreamIndex(settings.m_streamIndex); + } +} + +void RadioAstronomy::networkManagerFinished(QNetworkReply *reply) +{ + QNetworkReply::NetworkError replyError = reply->error(); + + if (replyError) + { + qWarning() << "RadioAstronomy::networkManagerFinished:" + << " error(" << (int) replyError + << "): " << replyError + << ": " << reply->errorString(); + } + else + { + QString answer = reply->readAll(); + answer.chop(1); // remove last \n + qDebug("RadioAstronomy::networkManagerFinished: reply:\n%s", answer.toStdString().c_str()); + } + + reply->deleteLater(); +} + +void RadioAstronomy::handleChannelMessages() +{ + Message* message; + + while ((message = m_channelMessageQueue.pop()) != nullptr) + { + if (handleMessage(*message)) { + delete message; + } + } +} diff --git a/plugins/channelrx/radioastronomy/radioastronomy.h b/plugins/channelrx/radioastronomy/radioastronomy.h new file mode 100644 index 000000000..305cdc390 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomy.h @@ -0,0 +1,437 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2015-2018 Edouard Griffiths, F4EXB. // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_RADIOASTRONOMY_H +#define INCLUDE_RADIOASTRONOMY_H + +#include + +#include +#include +#include +#include +#include + +#include "dsp/basebandsamplesink.h" +#include "channel/channelapi.h" +#include "util/message.h" +#include "pipes/pipeendpoint.h" + +#include "radioastronomybaseband.h" +#include "radioastronomysettings.h" + +class QNetworkAccessManager; +class QNetworkReply; +class QThread; +class DeviceAPI; +class RadioAstronomyWorker; + +class RadioAstronomy : public BasebandSampleSink, public ChannelAPI { + Q_OBJECT +public: + class MsgConfigureRadioAstronomy : public Message { + MESSAGE_CLASS_DECLARATION + + public: + const RadioAstronomySettings& getSettings() const { return m_settings; } + bool getForce() const { return m_force; } + + static MsgConfigureRadioAstronomy* create(const RadioAstronomySettings& settings, bool force) + { + return new MsgConfigureRadioAstronomy(settings, force); + } + + private: + RadioAstronomySettings m_settings; + bool m_force; + + MsgConfigureRadioAstronomy(const RadioAstronomySettings& settings, bool force) : + Message(), + m_settings(settings), + m_force(force) + { } + }; + + class MsgSensorMeasurement : public Message { + MESSAGE_CLASS_DECLARATION + + public: + int getSensor() const { return m_sensor; } + double getValue() const { return m_value; } + QDateTime getDateTime() const { return m_dateTime; } + + static MsgSensorMeasurement* create(int sensor, double value) + { + return new MsgSensorMeasurement(sensor, value, QDateTime::currentDateTime()); + } + + private: + int m_sensor; + double m_value; + QDateTime m_dateTime; + + MsgSensorMeasurement(int sensor, double value, QDateTime dateTime) : + Message(), + m_sensor(sensor), + m_value(value), + m_dateTime(dateTime) + { + } + }; + + class MsgFFTMeasurement : public Message { + MESSAGE_CLASS_DECLARATION + + public: + Real *getFFT() const { return m_fft; } + int getSize() const { return m_size; } + QDateTime getDateTime() const { return m_dateTime; } + + static MsgFFTMeasurement* create(const Real *fft, int size, QDateTime dateTime) + { + return new MsgFFTMeasurement(fft, size, dateTime); + } + + private: + Real *m_fft; + int m_size; + QDateTime m_dateTime; + + MsgFFTMeasurement(const Real *fft, int size, QDateTime dateTime) : + Message(), + m_size(size), + m_dateTime(dateTime) + { + // Take a copy of the data + m_fft = new Real[size]; + std::copy(fft, fft + size, m_fft); + } + + }; + + class MsgStartMeasurements : public Message { + MESSAGE_CLASS_DECLARATION + + public: + static MsgStartMeasurements* create() + { + return new MsgStartMeasurements(); + } + + private: + + MsgStartMeasurements() : + Message() + { + } + }; + + class MsgStopMeasurements : public Message { + MESSAGE_CLASS_DECLARATION + + public: + static MsgStopMeasurements* create() + { + return new MsgStopMeasurements(); + } + + private: + + MsgStopMeasurements() : + Message() + { + } + }; + + class MsgMeasurementProgress : public Message { + MESSAGE_CLASS_DECLARATION + + public: + int getPercentComplete() const { return m_percentComplete; } + + static MsgMeasurementProgress* create(int percentComplete) + { + return new MsgMeasurementProgress(percentComplete); + } + + private: + int m_percentComplete; + + MsgMeasurementProgress(int percentComplete) : + Message(), + m_percentComplete(percentComplete) + { + } + }; + + class MsgStartCal : public Message { + MESSAGE_CLASS_DECLARATION + + public: + bool getHot() const { return m_hot; } + + static MsgStartCal* create(bool hot) + { + return new MsgStartCal(hot); + } + + private: + bool m_hot; + + MsgStartCal(bool hot) : + Message(), + m_hot(hot) + { + } + }; + + class MsgCalComplete : public Message { + MESSAGE_CLASS_DECLARATION + + public: + Real *getCal() const { return m_cal; } + int getSize() const { return m_size; } + bool getHot() const { return m_hot; } + QDateTime getDateTime() const { return m_dateTime; } + + static MsgCalComplete* create(const Real *cal, int size, QDateTime dateTime, bool hot) + { + return new MsgCalComplete(cal, size, dateTime, hot); + } + + private: + Real *m_cal; + int m_size; + QDateTime m_dateTime; + bool m_hot; + + MsgCalComplete(const Real *cal, int size, QDateTime dateTime, bool hot) : + Message(), + m_size(size), + m_dateTime(dateTime), + m_hot(hot) + { + // Take a copy of the data + m_cal = new Real[size]; + std::copy(cal, cal + size, m_cal); + } + }; + + class MsgStartSweep : public Message { + MESSAGE_CLASS_DECLARATION + + public: + + static MsgStartSweep* create() + { + return new MsgStartSweep(); + } + + private: + + MsgStartSweep() : + Message() + { + } + }; + + class MsgStopSweep : public Message { + MESSAGE_CLASS_DECLARATION + + public: + + static MsgStopSweep* create() + { + return new MsgStopSweep(); + } + + private: + + MsgStopSweep() : + Message() + { + } + }; + + class MsgSweepComplete : public Message { + MESSAGE_CLASS_DECLARATION + + public: + + static MsgSweepComplete* create() + { + return new MsgSweepComplete(); + } + + private: + + MsgSweepComplete() : + Message() + { + } + }; + + class MsgSweepStatus : public Message { + MESSAGE_CLASS_DECLARATION + + public: + QString getStatus() const { return m_status; } + + static MsgSweepStatus* create(const QString& status) + { + return new MsgSweepStatus(status); + } + + private: + QString m_status; + + MsgSweepStatus(const QString& status) : + Message(), + m_status(status) + { + } + }; + + + RadioAstronomy(DeviceAPI *deviceAPI); + virtual ~RadioAstronomy(); + virtual void destroy() { delete this; } + + using BasebandSampleSink::feed; + virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po); + virtual void start(); + virtual void stop(); + virtual bool handleMessage(const Message& cmd); + + virtual void getIdentifier(QString& id) { id = objectName(); } + virtual const QString& getURI() const { return getName(); } + virtual void getTitle(QString& title) { title = m_settings.m_title; } + virtual qint64 getCenterFrequency() const { return 0; } + + virtual QByteArray serialize() const; + virtual bool deserialize(const QByteArray& data); + + virtual int getNbSinkStreams() const { return 1; } + virtual int getNbSourceStreams() const { return 0; } + + virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const + { + (void) streamIndex; + (void) sinkElseSource; + return 0; + } + + virtual int webapiSettingsGet( + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage) override; + + virtual int webapiSettingsPutPatch( + bool force, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage) override; + + virtual int webapiActionsPost( + const QStringList& channelActionsKeys, + SWGSDRangel::SWGChannelActions& query, + QString& errorMessage) override; + + static void webapiFormatChannelSettings( + SWGSDRangel::SWGChannelSettings& response, + const RadioAstronomySettings& settings); + + static void webapiUpdateChannelSettings( + RadioAstronomySettings& settings, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response); + + double getMagSq() const { return m_basebandSink->getMagSq(); } + + void getMagSqLevels(double& avg, double& peak, int& nbSamples) { + m_basebandSink->getMagSqLevels(avg, peak, nbSamples); + } +/* void setMessageQueueToGUI(MessageQueue* queue) override { + ChannelAPI::setMessageQueueToGUI(queue); + m_basebandSink->setMessageQueueToGUI(queue); + }*/ + + uint32_t getNumberOfDeviceStreams() const; + + static const char * const m_channelIdURI; + static const char * const m_channelId; + +private: + DeviceAPI *m_deviceAPI; + QThread m_thread; + QThread m_workerThread; + RadioAstronomyBaseband* m_basebandSink; + RadioAstronomyWorker *m_worker; + RadioAstronomySettings m_settings; + int m_basebandSampleRate; //!< stored from device message used when starting baseband sink + qint64 m_centerFrequency; + + QList m_availablePipes; + PipeEndPoint *m_selectedPipe; + QTimer m_updatePipesTimer; + + QNetworkAccessManager *m_networkManager; + QNetworkRequest m_networkRequest; + + int m_starTrackerFeatureSetIndex; + int m_starTrackerFeatureIndex; + int m_rotatorFeatureSetIndex; + int m_rotatorFeatureIndex; + + void (*sweepState)(); + float m_sweep1; // Current sweep position + float m_sweep2; + float m_sweep1Stop; + float m_sweep1Start; + bool m_sweeping; + bool m_sweepStop; + QTimer m_sweepTimer; + QMetaObject::Connection m_sweepTimerConnection; + + void applySettings(const RadioAstronomySettings& settings, bool force = false); + void webapiReverseSendSettings(QList& channelSettingsKeys, const RadioAstronomySettings& settings, bool force); + void webapiFormatChannelSettings( + QList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings *swgChannelSettings, + const RadioAstronomySettings& settings, + bool force + ); + void callOnStartTime(void (RadioAstronomy::*f)()); + void sweepStart(); + void startCal(bool hot); + void calComplete(MsgCalComplete* report); + +private slots: + void networkManagerFinished(QNetworkReply *reply); + void updatePipes(); + void handleChannelMessages(); + void startMeasurement(); + void sweepStartMeasurement(); + void sweep1(); + void sweep2(); + void waitUntilOnTarget(); + void sweepNext(); + void sweepComplete(); + +}; + +#endif // INCLUDE_RADIOASTRONOMY_H diff --git a/plugins/channelrx/radioastronomy/radioastronomybaseband.cpp b/plugins/channelrx/radioastronomy/radioastronomybaseband.cpp new file mode 100644 index 000000000..6cb8c1916 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomybaseband.cpp @@ -0,0 +1,197 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2019 Edouard Griffiths, F4EXB // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include + +#include "dsp/dspengine.h" +#include "dsp/dspcommands.h" +#include "dsp/downchannelizer.h" + +#include "radioastronomybaseband.h" +#include "radioastronomy.h" + +MESSAGE_CLASS_DEFINITION(RadioAstronomyBaseband::MsgConfigureRadioAstronomyBaseband, Message) + +RadioAstronomyBaseband::RadioAstronomyBaseband(RadioAstronomy *aisDemod) : + m_sink(aisDemod), + m_running(false), + m_mutex(QMutex::Recursive) +{ + qDebug("RadioAstronomyBaseband::RadioAstronomyBaseband"); + + m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(48000)); + m_channelizer = new DownChannelizer(&m_sink); +} + +RadioAstronomyBaseband::~RadioAstronomyBaseband() +{ + m_inputMessageQueue.clear(); + + delete m_channelizer; +} + +void RadioAstronomyBaseband::reset() +{ + QMutexLocker mutexLocker(&m_mutex); + m_inputMessageQueue.clear(); + m_sampleFifo.reset(); +} + +void RadioAstronomyBaseband::startWork() +{ + QMutexLocker mutexLocker(&m_mutex); + QObject::connect( + &m_sampleFifo, + &SampleSinkFifo::dataReady, + this, + &RadioAstronomyBaseband::handleData, + Qt::QueuedConnection + ); + connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); + m_running = true; +} + +void RadioAstronomyBaseband::stopWork() +{ + QMutexLocker mutexLocker(&m_mutex); + disconnect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); + QObject::disconnect( + &m_sampleFifo, + &SampleSinkFifo::dataReady, + this, + &RadioAstronomyBaseband::handleData + ); + m_running = false; +} + +void RadioAstronomyBaseband::setChannel(ChannelAPI *channel) +{ + m_sink.setChannel(channel); +} + +void RadioAstronomyBaseband::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end) +{ + m_sampleFifo.write(begin, end); +} + +void RadioAstronomyBaseband::handleData() +{ + QMutexLocker mutexLocker(&m_mutex); + + while ((m_sampleFifo.fill() > 0) && (m_inputMessageQueue.size() == 0)) + { + SampleVector::iterator part1begin; + SampleVector::iterator part1end; + SampleVector::iterator part2begin; + SampleVector::iterator part2end; + + std::size_t count = m_sampleFifo.readBegin(m_sampleFifo.fill(), &part1begin, &part1end, &part2begin, &part2end); + + // first part of FIFO data + if (part1begin != part1end) { + m_channelizer->feed(part1begin, part1end); + } + + // second part of FIFO data (used when block wraps around) + if(part2begin != part2end) { + m_channelizer->feed(part2begin, part2end); + } + + m_sampleFifo.readCommit((unsigned int) count); + } +} + +void RadioAstronomyBaseband::handleInputMessages() +{ + Message* message; + + while ((message = m_inputMessageQueue.pop()) != nullptr) + { + if (handleMessage(*message)) { + delete message; + } + } +} + +bool RadioAstronomyBaseband::handleMessage(const Message& cmd) +{ + if (MsgConfigureRadioAstronomyBaseband::match(cmd)) + { + QMutexLocker mutexLocker(&m_mutex); + MsgConfigureRadioAstronomyBaseband& cfg = (MsgConfigureRadioAstronomyBaseband&) cmd; + qDebug() << "RadioAstronomyBaseband::handleMessage: MsgConfigureRadioAstronomyBaseband"; + + applySettings(cfg.getSettings(), cfg.getForce()); + + return true; + } + else if (DSPSignalNotification::match(cmd)) + { + QMutexLocker mutexLocker(&m_mutex); + DSPSignalNotification& notif = (DSPSignalNotification&) cmd; + qDebug() << "RadioAstronomyBaseband::handleMessage: DSPSignalNotification: basebandSampleRate: " << notif.getSampleRate(); + setBasebandSampleRate(notif.getSampleRate()); + m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(notif.getSampleRate())); + + return true; + } + else if (RadioAstronomy::MsgStartMeasurements::match(cmd)) + { + m_sink.startMeasurements(); + + return true; + } + else if (RadioAstronomy::MsgStopMeasurements::match(cmd)) + { + m_sink.stopMeasurements(); + + return true; + } + else if (RadioAstronomy::MsgStartCal::match(cmd)) + { + RadioAstronomy::MsgStartCal& cal = (RadioAstronomy::MsgStartCal&)cmd; + m_sink.startCal(cal.getHot()); + + return true; + } + else + { + return false; + } +} + +void RadioAstronomyBaseband::applySettings(const RadioAstronomySettings& settings, bool force) +{ + if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) + || (settings.m_sampleRate != m_settings.m_sampleRate) + || force) + { + m_channelizer->setChannelization(settings.m_sampleRate, settings.m_inputFrequencyOffset); + m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); + } + + m_sink.applySettings(settings, force); + + m_settings = settings; +} + +void RadioAstronomyBaseband::setBasebandSampleRate(int sampleRate) +{ + m_channelizer->setBasebandSampleRate(sampleRate); + m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); +} diff --git a/plugins/channelrx/radioastronomy/radioastronomybaseband.h b/plugins/channelrx/radioastronomy/radioastronomybaseband.h new file mode 100644 index 000000000..4e6bb183a --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomybaseband.h @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2019 Edouard Griffiths, F4EXB // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_RADIOASTRONOMYBASEBAND_H +#define INCLUDE_RADIOASTRONOMYBASEBAND_H + +#include +#include + +#include "dsp/samplesinkfifo.h" +#include "dsp/scopevis.h" +#include "util/message.h" +#include "util/messagequeue.h" + +#include "radioastronomysink.h" + +class DownChannelizer; +class ChannelAPI; +class RadioAstronomy; + +class RadioAstronomyBaseband : public QObject +{ + Q_OBJECT +public: + class MsgConfigureRadioAstronomyBaseband : public Message { + MESSAGE_CLASS_DECLARATION + + public: + const RadioAstronomySettings& getSettings() const { return m_settings; } + bool getForce() const { return m_force; } + + static MsgConfigureRadioAstronomyBaseband* create(const RadioAstronomySettings& settings, bool force) + { + return new MsgConfigureRadioAstronomyBaseband(settings, force); + } + + private: + RadioAstronomySettings m_settings; + bool m_force; + + MsgConfigureRadioAstronomyBaseband(const RadioAstronomySettings& settings, bool force) : + Message(), + m_settings(settings), + m_force(force) + { } + }; + + RadioAstronomyBaseband(RadioAstronomy *aisDemod); + ~RadioAstronomyBaseband(); + void reset(); + void startWork(); + void stopWork(); + void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); + MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication + void getMagSqLevels(double& avg, double& peak, int& nbSamples) { + m_sink.getMagSqLevels(avg, peak, nbSamples); + } + void setMessageQueueToChannel(MessageQueue *messageQueue) { m_sink.setMessageQueueToChannel(messageQueue); } + void setBasebandSampleRate(int sampleRate); + void setChannel(ChannelAPI *channel); + double getMagSq() const { return m_sink.getMagSq(); } + bool isRunning() const { return m_running; } + +private: + SampleSinkFifo m_sampleFifo; + DownChannelizer *m_channelizer; + RadioAstronomySink m_sink; + MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication + RadioAstronomySettings m_settings; + bool m_running; + QMutex m_mutex; + + bool handleMessage(const Message& cmd); + void calculateOffset(RadioAstronomySink *sink); + void applySettings(const RadioAstronomySettings& settings, bool force = false); + +private slots: + void handleInputMessages(); + void handleData(); //!< Handle data when samples have to be processed +}; + +#endif // INCLUDE_RADIOASTRONOMYBASEBAND_H diff --git a/plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.cpp b/plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.cpp new file mode 100644 index 000000000..bcef63b96 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.cpp @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "radioastronomycalibrationdialog.h" + +RadioAstronomyCalibrationDialog::RadioAstronomyCalibrationDialog(RadioAstronomySettings *settings, QWidget* parent) : + QDialog(parent), + m_settings(settings), + ui(new Ui::RadioAstronomyCalibrationDialog) +{ + ui->setupUi(this); + ui->gpioEnabled->setChecked(settings->m_gpioEnabled); + ui->gpioPin->setValue(settings->m_gpioPin); + ui->gpioSense->setCurrentIndex(settings->m_gpioSense); + ui->startCalCommand->setText(settings->m_startCalCommand); + ui->stopCalCommand->setText(settings->m_stopCalCommand); + ui->calCommandDelay->setValue(settings->m_calCommandDelay); +} + +RadioAstronomyCalibrationDialog::~RadioAstronomyCalibrationDialog() +{ + delete ui; +} + +void RadioAstronomyCalibrationDialog::accept() +{ + m_settings->m_gpioEnabled = ui->gpioEnabled->isChecked(); + m_settings->m_gpioPin = ui->gpioPin->value(); + m_settings->m_gpioSense = ui->gpioSense->currentIndex(); + m_settings->m_startCalCommand = ui->stopCalCommand->text().trimmed(); + m_settings->m_stopCalCommand = ui->stopCalCommand->text().trimmed(); + m_settings->m_calCommandDelay = ui->calCommandDelay->value(); + QDialog::accept(); +} diff --git a/plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.h b/plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.h new file mode 100644 index 000000000..396d32cac --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_RADIOASTRONOMYCALIBRATIONDIALOG_H +#define INCLUDE_RADIOASTRONOMYCALIBRATIONDIALOG_H + +#include "ui_radioastronomycalibrationdialog.h" +#include "radioastronomysettings.h" + +class RadioAstronomyCalibrationDialog : public QDialog { + Q_OBJECT + +public: + explicit RadioAstronomyCalibrationDialog(RadioAstronomySettings *settings, QWidget* parent = 0); + ~RadioAstronomyCalibrationDialog(); + + RadioAstronomySettings *m_settings; + +private slots: + void accept(); + +private: + Ui::RadioAstronomyCalibrationDialog* ui; +}; + +#endif // INCLUDE_RADIOASTRONOMYCALIBRATIONDIALOG_H diff --git a/plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.ui b/plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.ui new file mode 100644 index 000000000..2ef3939c2 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomycalibrationdialog.ui @@ -0,0 +1,247 @@ + + + RadioAstronomyCalibrationDialog + + + + 0 + 0 + 514 + 345 + + + + + Liberation Sans + 9 + + + + Calibration Settings + + + + + + + 0 + 0 + + + + + + + SDR Device GPIO + + + + + + Enabled + + + + + + + Check to enable setting a GPIO pin in SDR to enable calibration + + + + + + + + + + Pin + + + + + + + SDR GPIO pin to set to start/stop calibration + + + 3 + + + + + + + Sense + + + + + + + Whether pin should be set to 1 or 0 to enable calibration + + + 1 + + + + Calibrate=0 + + + + + Calibrate=1 + + + + + + + + + + + Commands + + + + + + Stop calibration + + + + + + + Program/script to execute to start calibration + + + + + + + Start calibration + + + + + + + Program/script to execute to stop calibration + + + + + + + + + + Timing + + + + + + Pre-calibration delay (seconds) + + + + + + + Delay in seconds after command/GPIO before calibration starts + + + 3 + + + 0.000000000000000 + + + 100.000000000000000 + + + 0.000000000000000 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + gpioEnabled + gpioPin + gpioSense + startCalCommand + stopCalCommand + calCommandDelay + + + + + + + buttonBox + accepted() + RadioAstronomyCalibrationDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + RadioAstronomyCalibrationDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/plugins/channelrx/radioastronomy/radioastronomygui.cpp b/plugins/channelrx/radioastronomy/radioastronomygui.cpp new file mode 100644 index 000000000..a510fd7a7 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomygui.cpp @@ -0,0 +1,6012 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 Edouard Griffiths, F4EXB // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "radioastronomygui.h" + +#include "device/deviceuiset.h" +#include "dsp/dspengine.h" +#include "dsp/dspcommands.h" +#include "ui_radioastronomygui.h" +#include "plugin/pluginapi.h" +#include "util/simpleserializer.h" +#include "util/db.h" +#include "util/astronomy.h" +#include "util/interpolation.h" +#include "util/png.h" +#include "util/units.h" +#include "gui/basicchannelsettingsdialog.h" +#include "gui/devicestreamselectiondialog.h" +#include "dsp/dspengine.h" +#include "gui/crightclickenabler.h" +#include "channel/channelwebapiutils.h" +#include "maincore.h" +#include "feature/featurewebapiutils.h" +#include "feature/feature.h" +#include "feature/featureset.h" + +#include "radioastronomy.h" +#include "radioastronomysink.h" +#include "radioastronomysensordialog.h" +#include "radioastronomycalibrationdialog.h" + +#include "SWGMapItem.h" +#include "SWGStarTrackerTarget.h" +#include "SWGStarTrackerDisplaySettings.h" +#include "SWGStarTrackerDisplayLoSSettings.h" + +// Delegate for table to display time +class TimeDelegate : public QStyledItemDelegate { + +public: + TimeDelegate(QString format = "hh:mm:ss") : + m_format(format) + { + } + + virtual QString displayText(const QVariant &value, const QLocale &locale) const override + { + (void) locale; + if (value.toString() == "") { + return ""; + } else { + return value.toTime().toString(m_format); + } + } + +private: + QString m_format; + +}; + +// Time value is in milliseconds - Displays hh:mm:ss or d hh:mm:ss +class TimeDeltaDelegate : public QStyledItemDelegate { + +public: + virtual QString displayText(const QVariant &value, const QLocale &locale) const override + { + (void) locale; + qint64 v = value.toLongLong(); // In milliseconds + bool neg = v < 0; + v = abs(v); + qint64 days = v / (1000*60*60*24); + v = v % (1000*60*60*24); + qint64 hours = v / (1000*60*60); + v = v % (1000*60*60); + qint64 minutes = v / (1000*60); + v = v % (1000*60); + qint64 seconds = v / (1000); + qint64 msec = v % 1000; + + if (days > 0) { + return QString("%1%2 %3:%4:%5").arg(neg ? "-" : "").arg(days).arg(hours, 2, 10, QChar('0')).arg(minutes, 2, 10, QChar('0')).arg(seconds, 2, 10, QChar('0')); + } else { + return QString("%1%2:%3:%4").arg(neg ? "-" : "").arg(hours, 2, 10, QChar('0')).arg(minutes, 2, 10, QChar('0')).arg(seconds, 2, 10, QChar('0')); + } + } + +private: + QString m_format; + +}; + +// Delegate for table to control precision used to display floating point values - also supports strings +class DecimalDelegate : public QStyledItemDelegate { + +public: + DecimalDelegate(int precision = 2) : + m_precision(precision) + { + } + + virtual QString displayText(const QVariant &value, const QLocale &locale) const override + { + (void) locale; + bool ok; + double d = value.toDouble(&ok); + if (ok) { + return QString::number(d, 'f', m_precision); + } else { + return value.toString(); + } + } + +private: + int m_precision; + +}; + +// Delegate for table to display hours, minutes and seconds +class HMSDelegate : public QStyledItemDelegate { + +public: + virtual QString displayText(const QVariant &value, const QLocale &locale) const override + { + (void) locale; + return Units::decimalHoursToHoursMinutesAndSeconds(value.toDouble()); + } + +}; + +// Delegate for table to display degrees, minutes and seconds +class DMSDelegate : public QStyledItemDelegate { + +public: + virtual QString displayText(const QVariant &value, const QLocale &locale) const override + { + (void) locale; + return Units::decimalDegreesToDegreeMinutesAndSeconds(value.toDouble()); + } + +}; + +void RadioAstronomyGUI::LABData::read(QFile* file, float l, float b) +{ + m_l = l; + m_b = b; + m_vlsr.clear(); + m_temp.clear(); + QTextStream in(file); + + while (!in.atEnd()) + { + QString line = in.readLine().trimmed(); + if (!line.startsWith("%") && (line.size() > 0)) // Lines starting with % are comments + { + // 4 cols: v_lsr [km/s], T_B [K], freq. [Mhz], wavel. [cm] + QStringList cols = line.split(" ", Qt::SkipEmptyParts); + if (cols.size() == 4) + { + m_vlsr.append(cols[0].toFloat()); + m_temp.append(cols[1].toFloat()); + } + else + { + qDebug() << "RadioAstronomyGUI::parseLAB: Unexpected number of columns"; + } + } + } +} + +void RadioAstronomyGUI::LABData::toSeries(QLineSeries *series) +{ + series->clear(); + series->setName(QString("LAB l=%1 b=%2").arg(m_l).arg(m_b)); + for (int i = 0; i < m_vlsr.size(); i++) { + series->append(m_vlsr[i], m_temp[i]); + } +} + +void RadioAstronomyGUI::SensorMeasurements::init(const QString& name, bool visible) +{ + m_series = new QLineSeries(); + m_series->setName(name); + m_series->setVisible(visible); + m_yAxis = new QValueAxis(); + m_yAxis->setTitleText(name); + m_yAxis->setVisible(visible); + m_min = std::numeric_limits::max(); + m_max = -std::numeric_limits::max(); +} + +void RadioAstronomyGUI::SensorMeasurements::setName(const QString& name) +{ + if (m_series) { + m_series->setName(name); + } + if (m_yAxis) { + m_yAxis->setTitleText(name); + } +} + +void RadioAstronomyGUI::SensorMeasurements::clicked(bool checked) +{ + if (m_series) { + m_series->setVisible(checked); + } + if (m_yAxis) { + m_yAxis->setVisible(checked); + } +} + +void RadioAstronomyGUI::SensorMeasurements::append(SensorMeasurement *measurement) +{ + m_measurements.append(measurement); + addToSeries(measurement); +} + +void RadioAstronomyGUI::SensorMeasurements::addToSeries(SensorMeasurement *measurement) +{ + m_series->append(measurement->m_dateTime.toMSecsSinceEpoch(), measurement->m_value); + + m_max = std::max(m_max, measurement->m_value); + m_min = std::min(m_min, measurement->m_value); + if (m_min == m_max) { + // Axis isn't drawn properly if min and max are the same + m_yAxis->setRange(m_min*0.9, m_max*1.1); + } else { + m_yAxis->setRange(m_min, m_max); + } +} + +void RadioAstronomyGUI::SensorMeasurements::addAllToSeries() +{ + for (int i = 0; i < m_measurements.size(); i++) { + addToSeries(m_measurements[i]); + } +} + +void RadioAstronomyGUI::SensorMeasurements::clear() +{ + m_series->clear(); + qDeleteAll(m_measurements); + m_measurements.clear(); +} + +void RadioAstronomyGUI::SensorMeasurements::addToChart(QChart* chart, QDateTimeAxis* xAxis) +{ + chart->addSeries(m_series); + m_series->attachAxis(xAxis); + m_series->attachAxis(m_yAxis); +} + +void RadioAstronomyGUI::SensorMeasurements::setPen(const QPen& pen) +{ + m_series->setPen(pen); +} + +QValueAxis* RadioAstronomyGUI::SensorMeasurements::yAxis() const +{ + return m_yAxis; +} + +qreal RadioAstronomyGUI::SensorMeasurements::lastValue() +{ + if (m_measurements.size() > 0) { + return m_measurements.last()->m_value; + } else { + return 0.0; + } +} + +void RadioAstronomyGUI::resizePowerTable() +{ + // Fill table with a row of dummy data that will size the columns nicely + // Trailing spaces are for sort arrow + int row = ui->powerTable->rowCount(); + ui->powerTable->setRowCount(row + 1); + ui->powerTable->setItem(row, POWER_COL_DATE, new QTableWidgetItem("15/04/2016")); + ui->powerTable->setItem(row, POWER_COL_TIME, new QTableWidgetItem("10:17:00")); + ui->powerTable->setItem(row, POWER_COL_POWER, new QTableWidgetItem("1.235-e5")); + ui->powerTable->setItem(row, POWER_COL_POWER_DB, new QTableWidgetItem("-100.0")); + ui->powerTable->setItem(row, POWER_COL_POWER_DBM, new QTableWidgetItem("-100.0")); + ui->powerTable->setItem(row, POWER_COL_TSYS, new QTableWidgetItem("3000")); + ui->powerTable->setItem(row, POWER_COL_TSYS0, new QTableWidgetItem("100")); + ui->powerTable->setItem(row, POWER_COL_TSOURCE, new QTableWidgetItem("300")); + ui->powerTable->setItem(row, POWER_COL_TB, new QTableWidgetItem("100000")); + ui->powerTable->setItem(row, POWER_COL_TSKY, new QTableWidgetItem("300")); + ui->powerTable->setItem(row, POWER_COL_FLUX, new QTableWidgetItem("100000.00")); + ui->powerTable->setItem(row, POWER_COL_SIGMA_T, new QTableWidgetItem("0.01")); + ui->powerTable->setItem(row, POWER_COL_SIGMA_S, new QTableWidgetItem("1000.0")); + ui->powerTable->setItem(row, POWER_COL_OMEGA_A, new QTableWidgetItem("0.000001")); + ui->powerTable->setItem(row, POWER_COL_OMEGA_S, new QTableWidgetItem("0.000001")); + ui->powerTable->setItem(row, POWER_COL_RA, new QTableWidgetItem("12h59m59.10s")); + ui->powerTable->setItem(row, POWER_COL_DEC, new QTableWidgetItem("-90d59\'59.00\"")); + ui->powerTable->setItem(row, POWER_COL_GAL_LAT, new QTableWidgetItem("-90.0")); + ui->powerTable->setItem(row, POWER_COL_GAL_LON, new QTableWidgetItem("359.0")); + ui->powerTable->setItem(row, POWER_COL_AZ, new QTableWidgetItem("359.0")); + ui->powerTable->setItem(row, POWER_COL_EL, new QTableWidgetItem("90.0")); + ui->powerTable->setItem(row, POWER_COL_VBCRS, new QTableWidgetItem("10.0")); + ui->powerTable->setItem(row, POWER_COL_VLSR, new QTableWidgetItem("10.0")); + ui->powerTable->setItem(row, POWER_COL_SOLAR_FLUX, new QTableWidgetItem("60.0")); + ui->powerTable->setItem(row, POWER_COL_AIR_TEMP, new QTableWidgetItem("20.0")); + ui->powerTable->setItem(row, POWER_COL_SENSOR_1, new QTableWidgetItem("1.0000000")); + ui->powerTable->setItem(row, POWER_COL_SENSOR_2, new QTableWidgetItem("1.0000000")); + ui->powerTable->resizeColumnsToContents(); + ui->powerTable->removeRow(row); +} + +void RadioAstronomyGUI::resizePowerMarkerTable() +{ + // Fill table with a row of dummy data that will size the columns nicely + int row = ui->powerMarkerTable->rowCount(); + ui->powerMarkerTable->setRowCount(row + 1); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_NAME, new QTableWidgetItem("Max")); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_DATE, new QTableWidgetItem("15/04/2016")); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_TIME, new QTableWidgetItem("10:17:00")); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_VALUE, new QTableWidgetItem("1000.0")); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_DELTA_X, new QTableWidgetItem("1 23:59:59")); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_DELTA_Y, new QTableWidgetItem("1000.0")); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_DELTA_TO, new QTableWidgetItem("Max")); + ui->powerMarkerTable->resizeColumnsToContents(); + ui->powerMarkerTable->removeRow(row); +} + +void RadioAstronomyGUI::resizeSpectrumMarkerTable() +{ + // Fill table with a row of dummy data that will size the columns nicely + int row = ui->spectrumMarkerTable->rowCount(); + ui->spectrumMarkerTable->setRowCount(row + 1); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_NAME, new QTableWidgetItem("Max")); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_FREQ, new QTableWidgetItem("1420.405000")); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_VALUE, new QTableWidgetItem("1000.0")); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_DELTA_X, new QTableWidgetItem("1420.405000")); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_DELTA_Y, new QTableWidgetItem("1000.0")); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_DELTA_TO, new QTableWidgetItem("M1")); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_VR, new QTableWidgetItem("-100.0")); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_R, new QTableWidgetItem("10.0")); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_D, new QTableWidgetItem("10.0/10.0")); + QTableWidgetItem* check = new QTableWidgetItem(); + check->setFlags(Qt::ItemIsUserCheckable); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_PLOT_MAX, check); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_R_MIN, new QTableWidgetItem("10.0")); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_V, new QTableWidgetItem("250.0")); + ui->spectrumMarkerTable->resizeColumnsToContents(); + ui->spectrumMarkerTable->removeRow(row); +} + +void RadioAstronomyGUI::calcSpectrumMarkerDelta() +{ + if (m_spectrumM1Valid && m_spectrumM2Valid) + { + qreal dx = m_spectrumM2X - m_spectrumM1X; + qreal dy = m_spectrumM2Y - m_spectrumM1Y; + + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M2, SPECTRUM_MARKER_COL_DELTA_X)->setData(Qt::DisplayRole, dx); + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M2, SPECTRUM_MARKER_COL_DELTA_Y)->setData(Qt::DisplayRole, dy); + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M2, SPECTRUM_MARKER_COL_DELTA_TO)->setData(Qt::DisplayRole, "M1"); + } +} + +void RadioAstronomyGUI::calcPowerMarkerDelta() +{ + if (m_powerM1Valid && m_powerM2Valid) + { + qreal dx = m_powerM2X - m_powerM1X; + qreal dy = m_powerM2Y - m_powerM1Y; + + ui->powerMarkerTable->item(POWER_MARKER_ROW_M2, POWER_MARKER_COL_DELTA_X)->setData(Qt::DisplayRole, dx); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M2, POWER_MARKER_COL_DELTA_Y)->setData(Qt::DisplayRole, dy); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M2, POWER_MARKER_COL_DELTA_TO)->setData(Qt::DisplayRole, "M1"); + } +} + +void RadioAstronomyGUI::calcPowerPeakDelta() +{ + qreal dx = m_powerMaxX - m_powerMinX; + qreal dy = m_powerMaxY - m_powerMinY; + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_DELTA_X)->setData(Qt::DisplayRole, dx); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_DELTA_Y)->setData(Qt::DisplayRole, dy); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_DELTA_TO)->setData(Qt::DisplayRole, "Max"); +} + +void RadioAstronomyGUI::addToPowerSeries(FFTMeasurement *fft, bool skipCalcs) +{ + if ( ((m_settings.m_powerYUnits == RadioAstronomySettings::PY_DBFS) || fft->m_temp) // Only dBFS valid if no temp was calculated + && !((m_settings.m_powerYUnits == RadioAstronomySettings::PY_DBM) && (fft->m_tSys == 0.0f)) // dBm value not valid if temp is 0 + ) + { + qreal power; + switch (m_settings.m_powerYData) + { + case RadioAstronomySettings::PY_POWER: + switch (m_settings.m_powerYUnits) + { + case RadioAstronomySettings::PY_DBFS: + power = fft->m_totalPowerdBFS; + break; + case RadioAstronomySettings::PY_DBM: + power = fft->m_totalPowerdBm; + break; + case RadioAstronomySettings::PY_WATTS: + power = fft->m_totalPowerWatts; + break; + } + break; + case RadioAstronomySettings::PY_TSYS: + power = fft->m_tSys; + break; + case RadioAstronomySettings::PY_TSOURCE: + power = fft->m_tSource; + break; + case RadioAstronomySettings::PY_FLUX: + switch (m_settings.m_powerYUnits) + { + case RadioAstronomySettings::PY_SFU: + power = Units::wattsPerMetrePerHertzToSolarFluxUnits(fft->m_flux); + break; + case RadioAstronomySettings::PY_JANSKY: + power = Units::wattsPerMetrePerHertzToJansky(fft->m_flux); + break; + } + break; + } + QDateTime dateTime = fft->m_dateTime; + + if (m_powerSeries->count() == 0) + { + m_powerMin = power; + m_powerMax = power; + } + else + { + m_powerMin = std::min(power, m_powerMin); + m_powerMax = std::max(power, m_powerMax); + } + m_powerSeries->append(dateTime.toMSecsSinceEpoch(), power); + if (!skipCalcs) + { + if (m_settings.m_powerAutoscale) + { + double max = m_powerMax + (m_powerMax-m_powerMin)*0.2; // Add 20% space for markers + double range = max - m_powerMin; + blockApplySettings(true); + ui->powerRange->setValue(range); + ui->powerReference->setValue(max); + blockApplySettings(false); + } + } + + if (m_settings.m_powerYData == RadioAstronomySettings::PY_TSYS) { + m_powerTsys0Series->append(dateTime.toMSecsSinceEpoch(), fft->m_tSys0); + } else if (m_settings.m_powerYData == RadioAstronomySettings::PY_DBM) { + m_powerTsys0Series->append(dateTime.toMSecsSinceEpoch(), Astronomy::noisePowerdBm(fft->m_tSys0, fft->m_sampleRate)); + } else if (m_settings.m_powerYData == RadioAstronomySettings::PY_WATTS) { + m_powerTsys0Series->append(dateTime.toMSecsSinceEpoch(), Astronomy::m_boltzmann * fft->m_tSys0 * fft->m_sampleRate); + } + + if (!m_powerPeakValid) + { + m_powerPeakValid = true; + m_powerMinY = power; + m_powerMinX = dateTime.toMSecsSinceEpoch(); + m_powerMaxY = power; + m_powerMaxX = dateTime.toMSecsSinceEpoch(); + m_powerPeakSeries->clear(); + m_powerPeakSeries->append(m_powerMaxX, m_powerMaxY); + m_powerPeakSeries->append(m_powerMaxX, m_powerMaxY); + QDateTime dt = QDateTime::fromMSecsSinceEpoch(m_powerMaxX); + if (!skipCalcs) + { + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MAX, POWER_MARKER_COL_DATE)->setData(Qt::DisplayRole, dt.date()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MAX, POWER_MARKER_COL_TIME)->setData(Qt::DisplayRole, dt.time()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MAX, POWER_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_powerMaxY); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_DATE)->setData(Qt::DisplayRole, dt.date()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_TIME)->setData(Qt::DisplayRole, dt.time()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_powerMinY); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_DELTA_X)->setData(Qt::DisplayRole, 0.0); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_DELTA_Y)->setData(Qt::DisplayRole, 0.0); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_DELTA_TO)->setData(Qt::DisplayRole, "Max"); + } + } + + if (power > m_powerMaxY) + { + m_powerMaxY = power; + m_powerMaxX = dateTime.toMSecsSinceEpoch(); + m_powerPeakSeries->replace(0, m_powerMaxX, m_powerMaxY); + QDateTime dt = QDateTime::fromMSecsSinceEpoch(m_powerMaxX); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MAX, POWER_MARKER_COL_DATE)->setData(Qt::DisplayRole, dt.date()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MAX, POWER_MARKER_COL_TIME)->setData(Qt::DisplayRole, dt.time()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MAX, POWER_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_powerMaxY); + calcPowerPeakDelta(); + } + else if (power < m_powerMinY) + { + m_powerMinY = power; + m_powerMinX = dateTime.toMSecsSinceEpoch(); + m_powerPeakSeries->replace(1, m_powerMinX, m_powerMinY); + QDateTime dt = QDateTime::fromMSecsSinceEpoch(m_powerMinX); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_DATE)->setData(Qt::DisplayRole, dt.date()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_TIME)->setData(Qt::DisplayRole, dt.time()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_powerMinY); + calcPowerPeakDelta(); + } + + // Update markers (E.g. if scale changes) + int c = m_powerSeries->count(); + if (c >= 2) + { + QPointF p1 = m_powerSeries->at(c-2); + QPointF p2 = m_powerSeries->at(c-1); + if (m_powerM1Valid && (m_powerM1X >= p1.x()) && (m_powerM1X < p2.x())) + { + m_powerM1Y = Interpolation::interpolate(p1.x(), p1.y(), p2.x(), p2.y(), m_powerM1X); + m_powerMarkerSeries->insert(0, QPointF(dateTime.toMSecsSinceEpoch(), m_powerM1Y)); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M1, POWER_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_powerM1Y); + calcPowerMarkerDelta(); + } + if (m_powerM2Valid && (m_powerM2X >= p1.x()) && (m_powerM2X < p2.x())) + { + m_powerM2Y = Interpolation::interpolate(p1.x(), p1.y(), p2.x(), p2.y(), m_powerM2X); + m_powerMarkerSeries->append(dateTime.toMSecsSinceEpoch(), m_powerM2Y); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M2, POWER_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_powerM2Y); + calcPowerMarkerDelta(); + } + } + + if (!skipCalcs) + { + // Set X axis format to include date if measurements span over different days + // Seems there's a QT bug here, if we call m_powerXAxis->setFormat, the chart isn't + // redrawn properly, so we have to redraw the whole thing + QDateTime minDateTime = m_powerXAxis->min(); + QDateTime maxDateTime = m_powerXAxis->max(); + bool sameDay = minDateTime.date() == maxDateTime.date(); + if (!sameDay && m_powerXAxisSameDay) + { + m_powerXAxisSameDay = true; + QTimer::singleShot(100, this, SLOT(plotPowerChart())); + } + } + + if (!skipCalcs && ui->powerShowAvg->isChecked()) { + calcAverages(); + } + } + if (m_powerSeries->count() <= 1) // Don't check skipCalcs here, as that will be set for first data + { + ui->powerStartTime->setMinimumDateTime(fft->m_dateTime); + ui->powerEndTime->setMinimumDateTime(fft->m_dateTime); + if (m_settings.m_powerAutoscale) + { + ui->powerStartTime->setDateTime(fft->m_dateTime); + ui->powerEndTime->setDateTime(fft->m_dateTime); + } + } + if (!skipCalcs) + { + ui->powerStartTime->setMaximumDateTime(fft->m_dateTime); + ui->powerEndTime->setMaximumDateTime(fft->m_dateTime); + if (m_settings.m_powerAutoscale) { + ui->powerEndTime->setDateTime(fft->m_dateTime); + } + } +} + +double RadioAstronomyGUI::degreesToSteradian(double deg) const +{ + // https://en.wikipedia.org/wiki/Steradian - Other properties + double s = sin(Units::degreesToRadians(deg) / 4.0); + return 4.0 * M_PI * s * s; +} + +double RadioAstronomyGUI::hpbwToSteradians(double hpbw) const +{ + // https://www.cv.nrao.edu/~sransom/web/Ch3.html#E118 + double theta = Units::degreesToRadians(hpbw); + return theta * theta * M_PI / (4.0 * M_LN2); +} + +double RadioAstronomyGUI::calcOmegaA() const +{ + return hpbwToSteradians(m_beamWidth); +} + +double RadioAstronomyGUI::calcOmegaS() const +{ + if (m_settings.m_sourceType == RadioAstronomySettings::UNKNOWN) + { + return 0.0; + } + else if (m_settings.m_sourceType == RadioAstronomySettings::EXTENDED) + { + return calcOmegaA(); + } + else + { + return m_settings.m_omegaSUnits == RadioAstronomySettings::STERRADIANS ? m_settings.m_omegaS : degreesToSteradian(m_settings.m_omegaS); + } +} + +double RadioAstronomyGUI::beamFillingFactor() const +{ + if (m_settings.m_sourceType == RadioAstronomySettings::EXTENDED) + { + return 1.0; + } + else + { + // https://www.cv.nrao.edu/~sransom/web/Ch3.html#E55 + return calcOmegaS() / calcOmegaA(); + } +} + +void RadioAstronomyGUI::powerMeasurementReceived(FFTMeasurement *fft, bool skipCalcs) +{ + int row = ui->powerTable->rowCount(); + ui->powerTable->setRowCount(row + 1); + + QTableWidgetItem* dateItem = new QTableWidgetItem(); + QTableWidgetItem* timeItem = new QTableWidgetItem(); + QTableWidgetItem* powerItem = new QTableWidgetItem(); + QTableWidgetItem* powerDBItem = new QTableWidgetItem(); + QTableWidgetItem* powerdBmItem = new QTableWidgetItem(); + QTableWidgetItem* tSysItem = new QTableWidgetItem(); + QTableWidgetItem* tSys0Item = new QTableWidgetItem(); + QTableWidgetItem* tSourceItem = new QTableWidgetItem(); + QTableWidgetItem* tBItem = new QTableWidgetItem(); + QTableWidgetItem* tSkyItem = new QTableWidgetItem(); + QTableWidgetItem* fluxItem = new QTableWidgetItem(); + QTableWidgetItem* sigmaTItem = new QTableWidgetItem(); + QTableWidgetItem* sigmaSItem = new QTableWidgetItem(); + QTableWidgetItem* omegaAItem = new QTableWidgetItem(); + QTableWidgetItem* omegaSItem = new QTableWidgetItem(); + QTableWidgetItem* raItem = new QTableWidgetItem(); + QTableWidgetItem* decItem = new QTableWidgetItem(); + QTableWidgetItem* lonItem = new QTableWidgetItem(); + QTableWidgetItem* latItem = new QTableWidgetItem(); + QTableWidgetItem* azItem = new QTableWidgetItem(); + QTableWidgetItem* elItem = new QTableWidgetItem(); + QTableWidgetItem* vBCRSItem = new QTableWidgetItem(); + QTableWidgetItem* vLSRItem = new QTableWidgetItem(); + QTableWidgetItem* solarFluxItem = new QTableWidgetItem(); + QTableWidgetItem* airTempItem = new QTableWidgetItem(); + QTableWidgetItem* sensor1Item = new QTableWidgetItem(); + QTableWidgetItem* sensor2Item = new QTableWidgetItem(); + + ui->powerTable->setItem(row, POWER_COL_DATE, dateItem); + ui->powerTable->setItem(row, POWER_COL_TIME, timeItem); + ui->powerTable->setItem(row, POWER_COL_POWER, powerItem); + ui->powerTable->setItem(row, POWER_COL_POWER_DB, powerDBItem); + ui->powerTable->setItem(row, POWER_COL_POWER_DBM, powerdBmItem); + ui->powerTable->setItem(row, POWER_COL_TSYS, tSysItem); + ui->powerTable->setItem(row, POWER_COL_TSYS0, tSys0Item); + ui->powerTable->setItem(row, POWER_COL_TSOURCE, tSourceItem); + ui->powerTable->setItem(row, POWER_COL_TB, tBItem); + ui->powerTable->setItem(row, POWER_COL_TSKY, tSkyItem); + ui->powerTable->setItem(row, POWER_COL_FLUX, fluxItem); + ui->powerTable->setItem(row, POWER_COL_SIGMA_T, sigmaTItem); + ui->powerTable->setItem(row, POWER_COL_SIGMA_S, sigmaSItem); + ui->powerTable->setItem(row, POWER_COL_OMEGA_A, omegaAItem); + ui->powerTable->setItem(row, POWER_COL_OMEGA_S, omegaSItem); + ui->powerTable->setItem(row, POWER_COL_RA, raItem); + ui->powerTable->setItem(row, POWER_COL_DEC, decItem); + ui->powerTable->setItem(row, POWER_COL_GAL_LON, lonItem); + ui->powerTable->setItem(row, POWER_COL_GAL_LAT, latItem); + ui->powerTable->setItem(row, POWER_COL_AZ, azItem); + ui->powerTable->setItem(row, POWER_COL_EL, elItem); + ui->powerTable->setItem(row, POWER_COL_VBCRS, vBCRSItem); + ui->powerTable->setItem(row, POWER_COL_VLSR, vLSRItem); + ui->powerTable->setItem(row, POWER_COL_SOLAR_FLUX, solarFluxItem); + ui->powerTable->setItem(row, POWER_COL_AIR_TEMP, airTempItem); + ui->powerTable->setItem(row, POWER_COL_SENSOR_1, sensor1Item); + ui->powerTable->setItem(row, POWER_COL_SENSOR_2, sensor2Item); + + QDateTime dateTime = fft->m_dateTime; + dateItem->setData(Qt::DisplayRole, dateTime.date()); + timeItem->setData(Qt::DisplayRole, dateTime.time()); + + powerItem->setData(Qt::DisplayRole, fft->m_totalPower); + powerDBItem->setData(Qt::DisplayRole, fft->m_totalPowerdBFS); + if (fft->m_tSys != 0.0f) { + powerdBmItem->setData(Qt::DisplayRole, fft->m_totalPowerdBm); + } + if (fft->m_temp) { + updatePowerColumns(row, fft); + } + if (fft->m_coordsValid) + { + raItem->setData(Qt::DisplayRole, fft->m_ra); + decItem->setData(Qt::DisplayRole, fft->m_dec); + latItem->setData(Qt::DisplayRole, fft->m_b); + lonItem->setData(Qt::DisplayRole, fft->m_l); + azItem->setData(Qt::DisplayRole, fft->m_azimuth); + elItem->setData(Qt::DisplayRole, fft->m_elevation); + vBCRSItem->setData(Qt::DisplayRole, fft->m_vBCRS); + vLSRItem->setData(Qt::DisplayRole, fft->m_vLSR); + tSkyItem->setData(Qt::DisplayRole, fft->m_skyTemp); + } + solarFluxItem->setData(Qt::DisplayRole, fft->m_solarFlux); + airTempItem->setData(Qt::DisplayRole, fft->m_airTemp); + sensor1Item->setData(Qt::DisplayRole, fft->m_sensor[0]); + sensor2Item->setData(Qt::DisplayRole, fft->m_sensor[1]); + + addToPowerSeries(fft, skipCalcs); +} + +void RadioAstronomyGUI::powerAutoscale() +{ + if (m_settings.m_powerAutoscale) + { + on_powerAutoscaleX_clicked(); + on_powerAutoscaleY_clicked(); + } +} + +// Scale X and Y axis according to min and max values +void RadioAstronomyGUI::on_powerAutoscale_toggled(bool checked) +{ + m_settings.m_powerAutoscale = checked; + ui->powerAutoscaleX->setEnabled(!m_settings.m_powerAutoscale); + ui->powerAutoscaleY->setEnabled(!m_settings.m_powerAutoscale); + ui->powerReference->setEnabled(!m_settings.m_powerAutoscale); + ui->powerRange->setEnabled(!m_settings.m_powerAutoscale); + ui->powerStartTime->setEnabled(!m_settings.m_powerAutoscale); + ui->powerEndTime->setEnabled(!m_settings.m_powerAutoscale); + powerAutoscale(); + applySettings(); +} + +// Scale Y axis according to min and max values +void RadioAstronomyGUI::on_powerAutoscaleY_clicked() +{ + if (m_powerYAxis) + { + double min = m_powerMin; + double max = m_powerMax + (m_powerMax-m_powerMin)*0.2; // Add 20% space for markers + double range = m_powerMax - m_powerMin; + range = std::max(0.1, range); // Don't be smaller than minimum value we can set in GUI + + m_powerYAxis->setRange(min, max); + ui->powerRange->setValue(range); // Call before setting reference, so number of decimals are adjusted + ui->powerReference->setValue(max); + } +} + +// Scale X axis according to min and max values in series +void RadioAstronomyGUI::on_powerAutoscaleX_clicked() +{ + if (m_powerSeries && (m_powerSeries->count() > 0)) + { + QDateTime start = QDateTime::fromMSecsSinceEpoch(m_powerSeries->at(0).x()); + QDateTime end = QDateTime::fromMSecsSinceEpoch(m_powerSeries->at(m_powerSeries->count()-1).x()); + ui->powerStartTime->setDateTime(start); + ui->powerEndTime->setDateTime(end); + } +} + +void RadioAstronomyGUI::on_powerReference_valueChanged(double value) +{ + m_settings.m_powerReference = value; + if (m_powerYAxis) { + m_powerYAxis->setRange(m_settings.m_powerReference - m_settings.m_powerRange, m_settings.m_powerReference); + } + applySettings(); +} + +void RadioAstronomyGUI::on_powerRange_valueChanged(double value) +{ + m_settings.m_powerRange = value; + if (m_settings.m_powerRange <= 1.0) + { + ui->powerRange->setSingleStep(0.1); + ui->powerRange->setDecimals(2); + ui->powerReference->setDecimals(2); + } + else + { + ui->powerRange->setSingleStep(1.0); + ui->powerRange->setDecimals(1); + ui->powerReference->setDecimals(1); + } + if (m_powerYAxis) { + m_powerYAxis->setRange(m_settings.m_powerReference - m_settings.m_powerRange, m_settings.m_powerReference); + } + applySettings(); +} + +void RadioAstronomyGUI::on_powerStartTime_dateTimeChanged(QDateTime value) +{ + if (m_powerXAxis) { + m_powerXAxis->setMin(value); + } +} + +void RadioAstronomyGUI::on_powerEndTime_dateTimeChanged(QDateTime value) +{ + if (m_powerXAxis) { + m_powerXAxis->setMax(value); + } +} + +// Columns in table reordered +void RadioAstronomyGUI::powerTable_sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex) +{ + (void) oldVisualIndex; + + m_settings.m_powerTableColumnIndexes[logicalIndex] = newVisualIndex; +} + +// Column in table resized (when hidden size is 0) +void RadioAstronomyGUI::powerTable_sectionResized(int logicalIndex, int oldSize, int newSize) +{ + (void) oldSize; + + m_settings.m_powerTableColumnSizes[logicalIndex] = newSize; +} + +// Right click in table header - show column select menu +void RadioAstronomyGUI::powerTableColumnSelectMenu(QPoint pos) +{ + powerTableMenu->popup(ui->powerTable->horizontalHeader()->viewport()->mapToGlobal(pos)); +} + +// Hide/show column when menu selected +void RadioAstronomyGUI::powerTableColumnSelectMenuChecked(bool checked) +{ + (void) checked; + + QAction* action = qobject_cast(sender()); + if (action != nullptr) + { + int idx = action->data().toInt(nullptr); + ui->powerTable->setColumnHidden(idx, !action->isChecked()); + } +} + +// Create column select menu item +QAction *RadioAstronomyGUI::createCheckableItem(QString &text, int idx, bool checked, const char *slot) +{ + QAction *action = new QAction(text, this); + action->setCheckable(true); + action->setChecked(checked); + action->setData(QVariant(idx)); + connect(action, SIGNAL(triggered()), this, slot); + return action; +} + +RadioAstronomyGUI* RadioAstronomyGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel) +{ + RadioAstronomyGUI* gui = new RadioAstronomyGUI(pluginAPI, deviceUISet, rxChannel); + return gui; +} + +void RadioAstronomyGUI::destroy() +{ + delete this; +} + +void RadioAstronomyGUI::resetToDefaults() +{ + m_settings.resetToDefaults(); + displaySettings(); + applySettings(true); +} + +QByteArray RadioAstronomyGUI::serialize() const +{ + return m_settings.serialize(); +} + +bool RadioAstronomyGUI::deserialize(const QByteArray& data) +{ + if(m_settings.deserialize(data)) { + displaySettings(); + applySettings(true); + return true; + } else { + resetToDefaults(); + return false; + } +} + +void RadioAstronomyGUI::updatePipeList() +{ + QString currentText = ui->starTracker->currentText(); + ui->starTracker->blockSignals(true); + ui->starTracker->clear(); + QList::const_iterator it = m_availablePipes.begin(); + + for (int i = 0; it != m_availablePipes.end(); ++it, i++) { + ui->starTracker->addItem(it->getName()); + } + + if (currentText.isEmpty()) + { + if (m_availablePipes.size() > 0) { + ui->starTracker->setCurrentIndex(0); + } + } + else + { + ui->starTracker->setCurrentIndex(ui->starTracker->findText(currentText)); + } + ui->starTracker->blockSignals(false); + + QString newText = ui->starTracker->currentText(); + if (currentText != newText) + { + m_settings.m_starTracker = newText; + applySettings(); + } +} + +static bool withinBeam(float a, float b, float beamWidth) +{ + return abs(a-b) < beamWidth; +} + +bool RadioAstronomyGUI::handleMessage(const Message& message) +{ + if (DSPSignalNotification::match(message)) + { + DSPSignalNotification& notif = (DSPSignalNotification&) message; + m_basebandSampleRate = notif.getSampleRate(); + m_centerFrequency = notif.getCenterFrequency(); + if (m_settings.m_tempGalLink) { + calcGalacticBackgroundTemp(); + } + updateTSys0(); + return true; + } + else if (PipeEndPoint::MsgReportPipes::match(message)) + { + PipeEndPoint::MsgReportPipes& report = (PipeEndPoint::MsgReportPipes&) message; + m_availablePipes = report.getAvailablePipes(); + updatePipeList(); + return true; + } + else if (MainCore::MsgStarTrackerTarget::match(message)) + { + MainCore::MsgStarTrackerTarget& msg = (MainCore::MsgStarTrackerTarget&)message; + SWGSDRangel::SWGStarTrackerTarget *target = msg.getSWGStarTrackerTarget(); + m_coordsValid = true; + m_ra = target->getRa(); + m_dec = target->getDec(); + m_azimuth = target->getAzimuth(); + m_elevation = target->getElevation(); + m_l = target->getL(); + m_b = target->getB(); + m_vBCRS = target->getEarthRotationVelocity() + target->getEarthOrbitVelocityBcrs(); + m_vLSR = target->getSunVelocityLsr() + m_vBCRS; + m_solarFlux = target->getSolarFlux(); + double airTemp = target->getAirTemperature(); + m_skyTemp = target->getSkyTemperature(); + m_beamWidth = target->getHpbw(); + + if (m_settings.m_elevationLink) { + ui->elevation->setValue(m_elevation); + } + if (m_settings.m_tempAirLink) { + ui->tempAir->setValue(airTemp); + } + SensorMeasurement* sm = new SensorMeasurement(QDateTime::currentDateTime(), airTemp); + m_airTemps.append(sm); + updateTSys0(); + updateOmegaA(); + + return true; + } + else if (RadioAstronomy::MsgConfigureRadioAstronomy::match(message)) + { + const RadioAstronomy::MsgConfigureRadioAstronomy& cfg = (RadioAstronomy::MsgConfigureRadioAstronomy&) message; + m_settings = cfg.getSettings(); + blockApplySettings(true); + displaySettings(); + blockApplySettings(false); + return true; + } + else if (RadioAstronomy::MsgMeasurementProgress::match(message)) + { + RadioAstronomy::MsgMeasurementProgress& progress = (RadioAstronomy::MsgMeasurementProgress&) message; + ui->measurementProgress->setValue(progress.getPercentComplete()); + return true; + } + else if (RadioAstronomy::MsgSweepStatus::match(message)) + { + RadioAstronomy::MsgSweepStatus& status = (RadioAstronomy::MsgSweepStatus&) message; + ui->sweepStatus->setText(status.getStatus()); + return true; + } + else if (RadioAstronomy::MsgSweepComplete::match(message)) + { + ui->startStop->blockSignals(true); + ui->startStop->setChecked(false); + ui->startStop->blockSignals(false); + ui->startStop->setStyleSheet("QToolButton { background-color : blue; }"); + return true; + } + else if (RadioAstronomy::MsgCalComplete::match(message)) + { + RadioAstronomy::MsgCalComplete& measurement = (RadioAstronomy::MsgCalComplete&) message; + calCompletetReceived(measurement); + return true; + } + else if (RadioAstronomy::MsgFFTMeasurement::match(message)) + { + RadioAstronomy::MsgFFTMeasurement& measurement = (RadioAstronomy::MsgFFTMeasurement&) message; + fftMeasurementReceived(measurement); + if (m_settings.m_runMode == RadioAstronomySettings::SINGLE) + { + ui->startStop->blockSignals(true); + ui->startStop->setChecked(false); + ui->startStop->blockSignals(false); + ui->startStop->setStyleSheet("QToolButton { background-color : blue; }"); + } + return true; + } + else if (RadioAstronomy::MsgSensorMeasurement::match(message)) + { + RadioAstronomy::MsgSensorMeasurement& measurement = (RadioAstronomy::MsgSensorMeasurement&) message; + sensorMeasurementReceived(measurement); + return true; + } + + return false; +} + +void RadioAstronomyGUI::handleInputMessages() +{ + Message* message; + + while ((message = getInputMessageQueue()->pop()) != 0) + { + if (handleMessage(*message)) + { + delete message; + } + } +} + +void RadioAstronomyGUI::channelMarkerChangedByCursor() +{ + ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); + m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); + applySettings(); +} + +void RadioAstronomyGUI::channelMarkerHighlightedByCursor() +{ + setHighlighted(m_channelMarker.getHighlighted()); +} + +// Calculate Tsys0 - i.e. receiver noise temperature when there's no source signal, just unwanted noise +void RadioAstronomyGUI::updateTSys0() +{ + double tSys0 = calcTSys0(); + ui->tSys0->setText(QString("%1").arg(round(tSys0))); + double sigmaT = calcSigmaT(tSys0); + double sigmaS = calcSigmaS(tSys0); + ui->sigmaTSys0->setText(QString("%1").arg(sigmaT, 0, 'f', 1)); + ui->sigmaSSys0->setText(QString("%1").arg(sigmaS, 0, 'f', 1)); +} + +// Estimate of system noise temperature due to all sources of unwanted noise, from user settings +double RadioAstronomyGUI::calcTSys0() const +{ + return m_settings.m_tempRX + m_settings.m_tempCMB + m_settings.m_tempGal + m_settings.m_tempSP + m_settings.m_tempAtm; +} + +// Calculate measurement time +double RadioAstronomyGUI::calcTau() const +{ + return m_settings.m_integration / (m_settings.m_sampleRate / (double)m_settings.m_fftSize); +} + +double RadioAstronomyGUI::calcTau(const FFTMeasurement* fft) const +{ + return fft->m_integration / (fft->m_sampleRate / (double)fft->m_fftSize); +} + +// Calculate variation in Tsys due to random noise fluctuations, including receiver gain variations +// Minimum temp we can reliably detect will be ~5x this +// Uses practical total-power radiometer equation: https://www.cv.nrao.edu/~sransom/web/Ch3.html#E158 + +double RadioAstronomyGUI::calcSigmaT(double tSys) const +{ + double tau = calcTau(); + return tSys * sqrt(1.0/(m_settings.m_rfBandwidth * tau) + m_settings.m_gainVariation * m_settings.m_gainVariation); +} + +double RadioAstronomyGUI::calcSigmaT(const FFTMeasurement* fft) const +{ + double tau = calcTau(fft); + return fft->m_tSys * sqrt(1.0/(fft->m_rfBandwidth * tau) + m_settings.m_gainVariation * m_settings.m_gainVariation); +} + +// Calculate variations in flux due to random noise fluctuations, including receiver gain variations +// Minimum flux we can reliably detect will be ~5x this + +double RadioAstronomyGUI::calcSigmaS(double tSys) const +{ + double omegaA = hpbwToSteradians(m_beamWidth); + double lambda = Astronomy::m_speedOfLight / (double)m_centerFrequency; + double flux = 2.0 * Astronomy::m_boltzmann * tSys * omegaA / (lambda * lambda); // Should we use Aeff here instead? + double tau = calcTau(); + double sigma = flux * sqrt(1.0/(m_settings.m_rfBandwidth * tau) + m_settings.m_gainVariation * m_settings.m_gainVariation); + return Units::wattsPerMetrePerHertzToJansky(sigma); +} + +double RadioAstronomyGUI::calcSigmaS(const FFTMeasurement* fft) const +{ + double omegaA = fft->m_omegaA; + double lambda = Astronomy::m_speedOfLight / (double)fft->m_centerFrequency; + double flux = 2.0 * Astronomy::m_boltzmann * fft->m_tSys * omegaA / (lambda * lambda); // Should we use Aeff here instead? + double tau = calcTau(fft); + double sigma = flux * sqrt(1.0/(fft->m_rfBandwidth * tau) + m_settings.m_gainVariation * m_settings.m_gainVariation); + return Units::wattsPerMetrePerHertzToJansky(sigma); +} + +// Calculate and display how long a single measurement will take +void RadioAstronomyGUI::updateIntegrationTime() +{ + double secs = calcTau(); + if (secs >= 60) { + ui->integrationTime->setText(QString("%1m").arg(secs/60, 0, 'f', 1)); + } else { + ui->integrationTime->setText(QString("%1s").arg(secs, 0, 'f', 1)); + } + updateTSys0(); +} + +// Limit bandwidth to be less than sample rate +void RadioAstronomyGUI::updateBWLimits() +{ + qint64 sr = (qint64) m_settings.m_sampleRate; + int digits = ceil(log10(sr+1)); + ui->rfBW->setValueRange(true, digits, 1000, sr); +} + +void RadioAstronomyGUI::on_deltaFrequency_changed(qint64 value) +{ + m_channelMarker.setCenterFrequency(value); + m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); + applySettings(); +} + +void RadioAstronomyGUI::on_sampleRate_changed(qint64 value) +{ + float sr = value; + m_settings.m_sampleRate = sr; + updateBWLimits(); + updateIntegrationTime(); + applySettings(); +} + +void RadioAstronomyGUI::on_rfBW_changed(qint64 value) +{ + float bw = value; + m_channelMarker.setBandwidth(bw); + m_settings.m_rfBandwidth = bw; + applySettings(); +} + +void RadioAstronomyGUI::on_integration_changed(qint64 value) +{ + m_settings.m_integration = value; + updateIntegrationTime(); + applySettings(); +} + +void RadioAstronomyGUI::on_recalibrate_toggled(bool checked) +{ + m_settings.m_recalibrate = checked; + applySettings(); + if (checked) { + recalibrate(); + } +} + +void RadioAstronomyGUI::on_showCalSettings_clicked() +{ + RadioAstronomyCalibrationDialog dialog(&m_settings); + if (dialog.exec() == QDialog::Accepted) { + applySettings(); + } +} + +// Start hot calibration +void RadioAstronomyGUI::on_startCalHot_clicked() +{ + if (ui->startStop->isChecked()) { + ui->startStop->click(); + } + m_radioAstronomy->getInputMessageQueue()->push(RadioAstronomy::MsgStartCal::create(true)); + ui->startCalHot->setStyleSheet("QToolButton { background-color : green; }"); +} + +// Start cold calibration +void RadioAstronomyGUI::on_startCalCold_clicked() +{ + if (ui->startStop->isChecked()) { + ui->startStop->click(); + } + m_radioAstronomy->getInputMessageQueue()->push(RadioAstronomy::MsgStartCal::create(false)); + ui->startCalCold->setStyleSheet("QToolButton { background-color : green; }"); +} + +// Clear all measurements (but not calibration data) +void RadioAstronomyGUI::clearData() +{ + ui->powerTable->setRowCount(0); + m_powerSeries->clear(); + m_powerPeakSeries->clear(); + m_powerMarkerSeries->clear(); + m_powerTsys0Series->clear(); + m_airTemps.clear(); + for (int i = 0; i < RADIOASTRONOMY_SENSORS; i++) { + m_sensors[i].clear(); + } + for (int row = 0; row < POWER_MARKER_ROWS; row++) + { + for (int col = POWER_MARKER_COL_DATE; col <= POWER_MARKER_COL_DELTA_TO; col++) + { + ui->powerMarkerTable->item(row, col)->setText(""); + } + } + m_powerM1Valid = false; + m_powerM2Valid = false; + + qDeleteAll(m_fftMeasurements); + m_fftMeasurements.clear(); + m_fftSeries->clear(); + m_fftPeakSeries->clear(); + m_fftMarkerSeries->clear(); + for (int row = 0; row < SPECTRUM_MARKER_ROWS; row++) + { + for (int col = SPECTRUM_MARKER_COL_FREQ; col <= SPECTRUM_MARKER_COL_D; col++) + { + ui->spectrumMarkerTable->item(row, col)->setText(""); + } + } + m_spectrumM1Valid = false; + m_spectrumM2Valid = false; + clearLoSMarker("Max"); + clearLoSMarker("M1"); + clearLoSMarker("M2"); + + ui->spectrumIndex->setRange(0, 0); + ui->spectrumDateTime->setDateTime(QDateTime::currentDateTime()); + ui->powerMean->setText(""); + ui->powerRMS->setText(""); + ui->powerSD->setText(""); + plotPowerVsTimeChart(); // To ensure min/max/peaks are reset + + create2DImage(); + plotPowerChart(); + + ui->measurementProgress->setValue(0); + ui->sweepStatus->setText(""); +} + +// Clear calibration data +void RadioAstronomyGUI::clearCalData() +{ + delete m_calHot; + delete m_calCold; + delete m_calG; + m_calHot = nullptr; + m_calCold = nullptr; + m_calG = nullptr; + m_calHotSeries->clear(); + m_calColdSeries->clear(); + ui->calAvgDiff->setText(""); +} + +// deleteRowsComplete should be called after all rows are deleted +// Returns if the row being deleted is the currently displayed FFT +bool RadioAstronomyGUI::deleteRow(int row) +{ + ui->powerTable->removeRow(row); + delete m_fftMeasurements[row]; + m_fftMeasurements.removeAt(row); + return row == ui->spectrumIndex->value(); +} + +// Updates GUI after rows have been deleted +void RadioAstronomyGUI::deleteRowsComplete(bool deletedCurrent, int next) +{ + if (m_fftMeasurements.size() == 0) + { + clearData(); + } + else + { + if (deletedCurrent) { + ui->spectrumIndex->setValue(next); + } + plotPowerChart(); + powerAutoscale(); + } +} + +// Calculate average difference in hot and cold cal data - so we can easily validate results +void RadioAstronomyGUI::calcCalAvgDiff() +{ + if ((m_calHot && m_calCold) && (m_calHot->m_fftSize == m_calCold->m_fftSize)) + { + Real sum = 0.0f; + for (int i = 0; i < m_calHot->m_fftSize; i++) { + sum += CalcDb::dbPower(m_calHot->m_fftData[i]) - CalcDb::dbPower(m_calCold->m_fftData[i]); + } + Real avg = sum / m_calHot->m_fftSize; + ui->calAvgDiff->setText(QString::number(avg, 'f', 1)); + } + else + { + ui->calAvgDiff->setText(""); + } +} + +void RadioAstronomyGUI::calcCalibrationScaleFactors() +{ + if (m_calHot) + { + delete[] m_calG; + m_calG = new double[m_calHot->m_fftSize]; + // Calculate scaling factors from FFT mag to temperature + // FIXME: This assumes cal hot is fixed reference temp - E.g. 50Ohm term + for (int i = 0; i < m_calHot->m_fftSize; i++) { + m_calG[i] = (m_settings.m_tCalHot + m_settings.m_tempRX) / m_calHot->m_fftData[i]; + } + } +} + +void RadioAstronomyGUI::calibrate() +{ + if (m_calHotSeries) + { + calcCalibrationScaleFactors(); + calcCalTrx(); + calcCalTsp(); + + if (m_settings.m_recalibrate) + { + // Apply new calibration to existing measurements + recalibrate(); + } + } +} + +// Apply calibration to all existing measurements +void RadioAstronomyGUI::recalibrate() +{ + for (int i = 0; i < m_fftMeasurements.size(); i++) + { + FFTMeasurement* fft = m_fftMeasurements[i]; + // Recalibrate + calcFFTTemperatures(fft); + calcFFTTotalTemperature(fft); + // Update table + if (fft->m_tSys != 0.0f) { + ui->powerTable->item(i, POWER_COL_POWER_DBM)->setData(Qt::DisplayRole, fft->m_totalPowerdBm); + } + if (fft->m_temp) { + updatePowerColumns(i, fft); + } + } + // Update charts + plotFFTMeasurement(); + plotPowerChart(); +} + +// Calculate Trx using Y-factor method +void RadioAstronomyGUI::calcCalTrx() +{ + if ((m_calHot && m_calCold) && (m_calHot->m_fftSize == m_calCold->m_fftSize)) + { + // y=Ph/Pc + double sumH = 0.0; + double sumC = 0.0; + for (int i = 0; i < m_calHot->m_fftSize; i++) + { + sumH += m_calHot->m_fftData[i]; + sumC += m_calCold->m_fftData[i]; + } + double y = sumH/sumC; + // Use y to calculate Trx, which should be the same for both calibration points + double Trx = (m_settings.m_tCalHot - (m_settings.m_tCalCold * y)) / (y - 1.0); + ui->calYFactor->setText(QString::number(y, 'f', 2)); + ui->calTrx->setText(QString::number(Trx, 'f', 1)); + } + else + { + ui->calYFactor->setText(""); + ui->calTrx->setText(""); + } +} + +// Estimate spillover temperature (This is typically very Az/El depenedent as ground noise will vary) +void RadioAstronomyGUI::calcCalTsp() +{ + if (!ui->calTrx->text().isEmpty() && !ui->calTsky->text().isEmpty() && !ui->calYFactor->text().isEmpty()) + { + double Trx = ui->calTrx->text().toDouble(); + double Tsky = ui->calTsky->text().toDouble(); + double y = ui->calYFactor->text().toDouble(); + double atmosphericAbsorbtion = std::exp(-m_settings.m_zenithOpacity/cos(Units::degreesToRadians(90.0f - m_settings.m_elevation))); + + double Tsp = (m_settings.m_tCalHot + Trx) / y - (Tsky*atmosphericAbsorbtion) - m_settings.m_tempAtm - Trx; + + ui->calTsp->setText(QString::number(Tsp, 'f', 1)); + } + else + { + ui->calTsp->setText(""); + } +} + +void RadioAstronomyGUI::on_clearData_clicked() +{ + clearData(); +} + +void RadioAstronomyGUI::on_clearCal_clicked() +{ + clearCalData(); +} + +// Save power data in table to a CSV file +void RadioAstronomyGUI::on_savePowerData_clicked() +{ + // Get filename to save to + QFileDialog fileDialog(nullptr, "Select file to save data to", "", "*.csv"); + fileDialog.setAcceptMode(QFileDialog::AcceptSave); + if (fileDialog.exec()) + { + QStringList fileNames = fileDialog.selectedFiles(); + if (fileNames.size() > 0) + { + QFile file(fileNames[0]); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QMessageBox::critical(this, "Radio Astronomy", QString("Failed to open file %1").arg(fileNames[0])); + return; + } + QTextStream out(&file); + + // Create a CSV file from the values in the table + for (int i = 0; i < ui->powerTable->horizontalHeader()->count(); i++) + { + QString text = ui->powerTable->horizontalHeaderItem(i)->text(); + out << text << ","; + } + out << "\n"; + for (int i = 0; i < ui->powerTable->rowCount(); i++) + { + for (int j = 0; j < ui->powerTable->horizontalHeader()->count(); j++) + { + out << ui->powerTable->item(i,j)->data(Qt::DisplayRole).toString() << ","; + } + out << "\n"; + } + } + } +} + +// Create a hash mapping from column name to array index +QHash RadioAstronomyGUI::csvHeadersToHash(QStringList cols) +{ + QHash hash; + for (int i = 0; i < cols.size(); i++) { + hash.insert(cols[i], i); + } + return hash; +} + +// Get data from column with given name, if available +QString RadioAstronomyGUI::csvData(QHash hash, QStringList cols, QString col) +{ + QString s; + if (hash.contains(col)) + { + int idx = hash[col]; + if (idx < cols.size()) { + s = cols[idx]; + } + } + return s; +} + +bool RadioAstronomyGUI::hasNeededFFTData(QHash hash) +{ + return hash.contains("FFT Size") && hash.contains("Data"); +} + +// Write FFTMeasurement to a stream +void RadioAstronomyGUI::saveFFT(QTextStream& out, const FFTMeasurement* fft) +{ + out << fft->m_dateTime.toString(); + out << ","; + out << fft->m_centerFrequency; + out << ","; + out << fft->m_sampleRate; + out << ","; + out << fft->m_integration; + out << ","; + out << fft->m_rfBandwidth; + out << ","; + out << fft->m_omegaA; + out << ","; + out << fft->m_omegaS; + out << ","; + out << fft->m_totalPower; + out << ","; + out << fft->m_totalPowerdBFS; + out << ","; + out << fft->m_totalPowerdBm; + out << ","; + out << fft->m_totalPowerWatts; + out << ","; + out << fft->m_tSys; + out << ","; + out << fft->m_tSys0; + out << ","; + out << fft->m_tSource; + out << ","; + out << fft->m_flux; + out << ","; + out << fft->m_sigmaT; + out << ","; + out << fft->m_sigmaS; + out << ","; + out << fft->m_tempMin; + out << ","; + out << fft->m_baseline; + out << ","; + out << fft->m_ra; + out << ","; + out << fft->m_dec; + out << ","; + out << fft->m_azimuth; + out << ","; + out << fft->m_elevation; + out << ","; + out << fft->m_l; + out << ","; + out << fft->m_b; + out << ","; + out << fft->m_vBCRS; + out << ","; + out << fft->m_vLSR; + out << ","; + out << fft->m_solarFlux; + out << ","; + out << fft->m_airTemp; + out << ","; + out << fft->m_skyTemp; + out << ","; + out << fft->m_sensor[0]; + out << ","; + out << fft->m_sensor[1]; + out << ","; + out << fft->m_fftSize; + out << ","; + for (int j = 0; j < fft->m_fftSize; j++) + { + out << fft->m_fftData[j]; + out << ","; + } + if (fft->m_snr) + { + for (int j = 0; j < fft->m_fftSize; j++) + { + out << fft->m_snr[j]; + out << ","; + } + } + if (fft->m_temp) + { + for (int j = 0; j < fft->m_fftSize; j++) + { + out << fft->m_temp[j]; + out << ","; + } + } + out << "\n"; +} + +// Create a FFTMeasurement from data read from CSV file +RadioAstronomyGUI::FFTMeasurement* RadioAstronomyGUI::loadFFT(QHash hash, QStringList cols) +{ + int fftSize = csvData(hash, cols, "FFT Size").toInt(); + int fftDataIdx = hash["Data"]; + if ((fftSize > 0) && (cols.size() >= fftDataIdx + fftSize)) + { + FFTMeasurement* fft = new FFTMeasurement(); + fft->m_dateTime = QDateTime::fromString(csvData(hash, cols, "Date Time")); + fft->m_centerFrequency = csvData(hash, cols, "Centre Freq").toLongLong(); + fft->m_sampleRate = csvData(hash, cols, "Sample Rate").toInt(); + fft->m_integration = csvData(hash, cols, "Integration").toInt(); + fft->m_rfBandwidth = csvData(hash, cols, "Bandwidth").toInt(); + fft->m_omegaA = csvData(hash, cols, "OmegaA").toFloat(); + fft->m_omegaS = csvData(hash, cols, "OmegaS").toFloat(); + + fft->m_fftSize = fftSize; + fft->m_fftData = new Real[fftSize]; + fft->m_db = new Real[fftSize]; + for (int i = 0; i < fftSize; i++) + { + fft->m_fftData[i] = cols[fftDataIdx+i].toFloat(); + fft->m_db[i] = (Real)CalcDb::dbPower(fft->m_fftData[i]); + } + if (cols.size() >= fftDataIdx + 2*fftSize) + { + fft->m_snr = new Real[fftSize]; + for (int i = 0; i < fftSize; i++) { + fft->m_snr[i] = cols[fftDataIdx+fftSize+i].toFloat(); + } + if (cols.size() >= fftDataIdx + 3*fftSize) + { + fft->m_temp = new Real[fftSize]; + for (int i = 0; i < fftSize; i++) { + fft->m_temp[i] = cols[fftDataIdx+2*fftSize+i].toFloat(); + } + } + } + fft->m_totalPower = csvData(hash, cols, "Power (FFT)").toFloat(); + fft->m_totalPowerdBFS = csvData(hash, cols, "Power (dBFS)").toFloat(); + fft->m_totalPowerdBm = csvData(hash, cols, "Power (dBm)").toFloat(); + fft->m_totalPowerWatts = csvData(hash, cols, "Power (Watts)").toFloat(); + fft->m_tSys = csvData(hash, cols, "Tsys").toFloat(); + fft->m_tSys0 = csvData(hash, cols, "Tsys0").toFloat(); + fft->m_tSource = csvData(hash, cols, "Tsource").toFloat(); + fft->m_flux = csvData(hash, cols, "Sv").toFloat(); + fft->m_sigmaT = csvData(hash, cols, "SigmaTsys").toFloat(); + fft->m_sigmaS = csvData(hash, cols, "SigmaSsys").toFloat(); + fft->m_tempMin = csvData(hash, cols, "Min Temp").toFloat(); + fft->m_baseline = (RadioAstronomySettings::SpectrumBaseline)csvData(hash, cols, "Baseline").toInt(); + + + fft->m_ra = csvData(hash, cols, "RA").toFloat(); + fft->m_dec = csvData(hash, cols, "Dec").toFloat(); + fft->m_azimuth = csvData(hash, cols, "Azimuth").toFloat(); + fft->m_elevation = csvData(hash, cols, "Elevation").toFloat(); + fft->m_l = csvData(hash, cols, "l").toFloat(); + fft->m_b = csvData(hash, cols, "b").toFloat(); + if ((fft->m_ra != 0.0) || (fft->m_dec != 0.0) || (fft->m_azimuth != 0.0) || (fft->m_elevation != 0.0) || (fft->m_l != 0.0) || (fft->m_b != 0.0)) { + fft->m_coordsValid = true; + } + fft->m_vBCRS = csvData(hash, cols, "vBCRS").toFloat(); + fft->m_vLSR = csvData(hash, cols, "vLSR").toFloat(); + fft->m_solarFlux = csvData(hash, cols, "Solar Flux").toFloat(); + fft->m_airTemp = csvData(hash, cols, "Air Temp").toFloat(); + fft->m_skyTemp = csvData(hash, cols, "Sky Temp").toFloat(); + fft->m_sensor[0] = csvData(hash, cols, "Sensor 1").toFloat(); + fft->m_sensor[1] = csvData(hash, cols, "Sensor 2").toFloat(); + + if (fft->m_rfBandwidth == 0) + { + fft->m_rfBandwidth = 0.9 * fft->m_sampleRate; // Older files don't have this column and we need a value for min + calcFFTTotalPower(fft); + /*calcFFTMinTemperature(fft); + calcFFTTotalTemperature(fft);*/ + } + return fft; + } + else + { + return nullptr; + } +} + +void RadioAstronomyGUI::on_saveSpectrumData_clicked() +{ + // Get filename to save to + QFileDialog fileDialog(nullptr, "Select file to save data to", "", "*.csv"); + fileDialog.setAcceptMode(QFileDialog::AcceptSave); + if (fileDialog.exec()) + { + QStringList fileNames = fileDialog.selectedFiles(); + if (fileNames.size() > 0) + { + QFile file(fileNames[0]); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QMessageBox::critical(this, "Radio Astronomy", QString("Failed to open file %1").arg(fileNames[0])); + return; + } + QTextStream out(&file); + + if (ui->spectrumChartSelect->currentIndex() == 0) + { + // Create a CSV file for all the spectrum data + out << "Date Time,Centre Freq,Sample Rate,Integration,Bandwidth,OmegaA,OmegaS,Power (FFT),Power (dBFS),Power (dBm),Power (Watts),Tsys,Tsys0,Tsource,Sv,SigmaTsys,SigmaSsys,Min Temp,Baseline,RA,Dec,Azimuth,Elevation,l,b,vBCRS,vLSR,Solar Flux,Air Temp,Sky Temp,Sensor 1,Sensor 2,FFT Size,Data\n"; + for (int i = 0; i < m_fftMeasurements.size(); i++) { + saveFFT(out, m_fftMeasurements[i]); + } + } + else + { + // Create a CSV file for calibration data + out << "Cal,Cal Temp,Date Time,Centre Freq,Sample Rate,Integration,Bandwidth,OmegaA,OmegaS,Power (FFT),Power (dBFS),Power (dBm),Power (Watts),Tsys,Tsys0,Tsource,Sv,SigmaTsys,SigmaSsys,Min Temp,Baseline,RA,Dec,Azimuth,Elevation,l,b,vBCRS,vLSR,Solar Flux,Air Temp,Sky Temp,Sensor 1,Sensor 2,FFT Size,Data\n"; + if (m_calHot) + { + out << "Hot,"; + out << m_settings.m_tCalHot; + out << ","; + saveFFT(out, m_calHot); + } + if (m_calCold) + { + out << "Cold,"; + out << m_settings.m_tCalCold; + out << ","; + saveFFT(out, m_calCold); + } + } + } + } +} + +void RadioAstronomyGUI::on_loadSpectrumData_clicked() +{ + // Get filename to load from + QFileDialog fileDialog(nullptr, "Select file to load data from", "", "*.csv"); + fileDialog.setAcceptMode(QFileDialog::AcceptOpen); + if (fileDialog.exec()) + { + QStringList fileNames = fileDialog.selectedFiles(); + if (fileNames.size() > 0) + { + QFile file(fileNames[0]); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QMessageBox::critical(this, "Radio Astronomy", QString("Failed to open file %1").arg(fileNames[0])); + return; + } + + // Get column names + QTextStream in(&file); + QString header = in.readLine(); + QStringList colNames = header.split(","); + QHash hash = csvHeadersToHash(colNames); + + if (ui->spectrumChartSelect->currentIndex() == 0) + { + // Load data from CSV file + if (hasNeededFFTData(hash)) + { + // Remove old data - we could support multiple series for comparison + clearData(); + // Read in FFT data from file + ui->spectrumIndex->blockSignals(true); // Prevent every spectrum from being displayed + while (!in.atEnd()) + { + QString row = in.readLine(); + QStringList cols = row.split(","); + FFTMeasurement* fft = loadFFT(hash, cols); + if (fft) { + addFFT(fft, true); + } + } + ui->spectrumIndex->blockSignals(false); + // Add data from FFT to sensor measurements + for (int i = 0; i < m_fftMeasurements.size(); i++) + { + SensorMeasurement* sm; + sm = new SensorMeasurement(m_fftMeasurements[i]->m_dateTime, m_fftMeasurements[i]->m_airTemp); + m_airTemps.append(sm); + for (int j = 0; j < RADIOASTRONOMY_SENSORS; j++) + { + sm = new SensorMeasurement(m_fftMeasurements[i]->m_dateTime, m_fftMeasurements[i]->m_sensor[j]); + m_sensors[j].append(sm); + } + } + // If we're loading data from scratch, autoscale both axis + if ((ui->spectrumCenterFreq->value() == 0.0) || m_settings.m_spectrumAutoscale) + { + on_spectrumAutoscaleY_clicked(); + on_spectrumAutoscaleX_clicked(); + } + // Ensure both charts are redrawn fully, as we've disabled some updates/calcs during load + on_spectrumIndex_valueChanged(m_fftMeasurements.size() - 1); // Don't call setValue, as it already has this value + plotPowerChart(); + // As signals were blocked above, power axis may not match up with GUI. Manually update + // Just calling autoscale will not work, as the GUI values may not change + on_powerStartTime_dateTimeChanged(ui->powerStartTime->dateTime()); + on_powerEndTime_dateTimeChanged(ui->powerEndTime->dateTime()); + on_powerRange_valueChanged(m_settings.m_powerRange); + on_powerReference_valueChanged(m_settings.m_powerReference); + } + } + else + { + // Load calibration data from CSV file + if (hasNeededFFTData(hash) && hash.contains("Cal")) + { + while (!in.atEnd()) + { + QString row = in.readLine(); + QStringList cols = row.split(","); + + QString calName = csvData(hash, cols, "Cal"); + + FFTMeasurement** calp = nullptr; + FFTMeasurement* cal = nullptr; + if (calName == "Hot") { + calp = &m_calHot; + } else if (calName == "Cold") { + calp = &m_calCold; + } else { + qDebug() << "RadioAstronomyGUI::on_loadSpectrumData_clicked: Skipping unknown calibration " << calName; + } + if (calp) + { + cal = loadFFT(hash, cols); + if (cal) + { + delete *calp; + *calp = cal; + qDebug() << "RadioAstronomyGUI::on_loadSpectrumData_clicked: Loaded calibration " << calName; + if (calName == "Cold") { + ui->calTsky->setText(QString::number(cal->m_skyTemp, 'f', 1)); + } + QString calTempString = csvData(hash, cols, "Cal Temp"); + bool ok; + double calTemp = calTempString.toDouble(&ok); + if (ok) + { + if (calName == "Cold") + { + ui->tCalColdSelect->setCurrentIndex(0); + ui->tCalCold->setValue(calTemp); + } + else + { + ui->tCalHotSelect->setCurrentIndex(0); + ui->tCalHot->setValue(calTemp); + } + } + } + } + } + calcCalAvgDiff(); + calibrate(); + plotCalMeasurements(); + } + else + { + QMessageBox::critical(this, "Radio Astronomy", QString("Missing required columns in file %1").arg(fileNames[0])); + return; + } + } + } + } +} + +void RadioAstronomyGUI::on_powerTable_cellDoubleClicked(int row, int column) +{ + if ((column >= POWER_COL_RA) && (column >= POWER_COL_EL)) + { + // Display target in Star Tracker + MessagePipes& messagePipes = MainCore::instance()->getMessagePipes(); + QList *messageQueues = messagePipes.getMessageQueues(m_radioAstronomy, "startracker.display"); + if (messageQueues) + { + QList::iterator it = messageQueues->begin(); + + for (; it != messageQueues->end(); ++it) + { + SWGSDRangel::SWGStarTrackerDisplaySettings *swgSettings = new SWGSDRangel::SWGStarTrackerDisplaySettings(); + QDateTime dt(ui->powerTable->item(row, POWER_COL_DATE)->data(Qt::DisplayRole).toDate(), + ui->powerTable->item(row, POWER_COL_TIME)->data(Qt::DisplayRole).toTime()); + swgSettings->setDateTime(new QString(dt.toString(Qt::ISODateWithMs))); + swgSettings->setAzimuth(ui->powerTable->item(row, POWER_COL_AZ)->data(Qt::DisplayRole).toFloat()); + swgSettings->setElevation(ui->powerTable->item(row, POWER_COL_EL)->data(Qt::DisplayRole).toFloat()); + (*it)->push(MainCore::MsgStarTrackerDisplaySettings::create(m_radioAstronomy, swgSettings)); + } + } + } + else + { + // Display in Spectrometer + ui->spectrumIndex->setValue(row); + } +} + +void RadioAstronomyGUI::onWidgetRolled(QWidget* widget, bool rollDown) +{ + (void) widget; + (void) rollDown; +} + +void RadioAstronomyGUI::onMenuDialogCalled(const QPoint &p) +{ + if (m_contextMenuType == ContextMenuChannelSettings) + { + BasicChannelSettingsDialog dialog(&m_channelMarker, this); + dialog.setUseReverseAPI(m_settings.m_useReverseAPI); + dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); + dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); + dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); + dialog.setReverseAPIChannelIndex(m_settings.m_reverseAPIChannelIndex); + dialog.move(p); + dialog.exec(); + + m_settings.m_rgbColor = m_channelMarker.getColor().rgb(); + m_settings.m_title = m_channelMarker.getTitle(); + m_settings.m_useReverseAPI = dialog.useReverseAPI(); + m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); + m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); + m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); + m_settings.m_reverseAPIChannelIndex = dialog.getReverseAPIChannelIndex(); + + setWindowTitle(m_settings.m_title); + setTitleColor(m_settings.m_rgbColor); + + applySettings(); + } + else if ((m_contextMenuType == ContextMenuStreamSettings) && (m_deviceUISet->m_deviceMIMOEngine)) + { + DeviceStreamSelectionDialog dialog(this); + dialog.setNumberOfStreams(m_radioAstronomy->getNumberOfDeviceStreams()); + dialog.setStreamIndex(m_settings.m_streamIndex); + dialog.move(p); + dialog.exec(); + + m_settings.m_streamIndex = dialog.getSelectedStreamIndex(); + m_channelMarker.clearStreamIndexes(); + m_channelMarker.addStreamIndex(m_settings.m_streamIndex); + displayStreamIndex(); + applySettings(); + } + + resetContextMenuType(); +} + +RadioAstronomyGUI::RadioAstronomyGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent) : + ChannelGUI(parent), + ui(new Ui::RadioAstronomyGUI), + m_pluginAPI(pluginAPI), + m_deviceUISet(deviceUISet), + m_channelMarker(this), + m_doApplySettings(true), + m_basebandSampleRate(0), + m_centerFrequency(0), + m_tickCount(0), + m_powerChart(nullptr), + m_powerSeries(nullptr), + m_powerXAxis(nullptr), + m_powerYAxis(nullptr), + m_powerPeakSeries(nullptr), + m_powerMarkerSeries(nullptr), + m_powerTsys0Series(nullptr), + m_powerGaussianSeries(nullptr), + m_2DChart(nullptr), + m_2DXAxis(nullptr), + m_2DYAxis(nullptr), + m_2DMapIntensity(nullptr), + m_sweepIndex(0), + m_calChart(nullptr), + m_calXAxis(nullptr), + m_calYAxis(nullptr), + m_calHotSeries(nullptr), + m_calColdSeries(nullptr), + m_calHot(nullptr), + m_calCold(nullptr), + m_calG(nullptr), + m_fftChart(nullptr), + m_fftSeries(nullptr), + m_fftHlineSeries(nullptr), + m_fftPeakSeries(nullptr), + m_fftMarkerSeries(nullptr), + m_fftGaussianSeries(nullptr), + m_fftLABSeries(nullptr), + m_fftXAxis(nullptr), + m_fftYAxis(nullptr), + m_fftDopplerAxis(nullptr), + m_powerPeakValid(false), + m_powerM1Valid(false), + m_powerM2Valid(false), + m_spectrumM1Valid(false), + m_spectrumM2Valid(false), + m_coordsValid(false), + m_ra(0.0f), + m_dec(0.0f), + m_azimuth(0.0f), + m_elevation(0.0f), + m_l(0.0f), + m_b(0.0f), + m_vBCRS(0.0f), + m_vLSR(0.0f), + m_solarFlux(0.0f), + m_beamWidth(5.6f), + m_lLAB(0.0f), + m_bLAB(0.0f), + m_downloadingLAB(false) +{ + ui->setupUi(this); + + setAttribute(Qt::WA_DeleteOnClose, true); + connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); + + m_radioAstronomy = reinterpret_cast(rxChannel); + m_radioAstronomy->setMessageQueueToGUI(getInputMessageQueue()); + + connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); // 50 ms + + m_networkManager = new QNetworkAccessManager(); + connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); + connect(&m_dlm, &HttpDownloadManager::downloadComplete, this, &RadioAstronomyGUI::downloadFinished); + + ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03))); + ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); + ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999); + + // Need to setValue before calling setValueRange, otherwise valueChanged is called + // overwriting the default settings (could also blockSignals) + // Also, set bandwidth before sampleRate + ui->rfBW->setColorMapper(ColorMapper(ColorMapper::GrayGold)); + ui->rfBW->setValue(m_settings.m_rfBandwidth); + ui->rfBW->setValueRange(true, 8, 1000, 99999999); + ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGold)); + ui->sampleRate->setValue(m_settings.m_sampleRate); + ui->sampleRate->setValueRange(true, 8, 100000, 99999999); + ui->integration->setColorMapper(ColorMapper(ColorMapper::GrayGold)); + ui->integration->setValue(m_settings.m_integration); + ui->integration->setValueRange(true, 7, 1, 99999999); + + m_channelMarker.blockSignals(true); + m_channelMarker.setColor(Qt::yellow); + m_channelMarker.setBandwidth(m_settings.m_rfBandwidth); + m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset); + m_channelMarker.setTitle("Radio Astronomy"); + m_channelMarker.blockSignals(false); + m_channelMarker.setVisible(true); // activate signal on the last setting only + + setTitleColor(m_channelMarker.getColor()); + m_settings.setChannelMarker(&m_channelMarker); + + m_deviceUISet->addChannelMarker(&m_channelMarker); + m_deviceUISet->addRollupWidget(this); + + connect(&m_channelMarker, SIGNAL(changedByCursor()), this, SLOT(channelMarkerChangedByCursor())); + connect(&m_channelMarker, SIGNAL(highlightedByCursor()), this, SLOT(channelMarkerHighlightedByCursor())); + connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); + + // Resize the table using dummy data + resizePowerTable(); + // Allow user to reorder columns + ui->powerTable->horizontalHeader()->setSectionsMovable(true); + // Allow user to sort table by clicking on headers + ui->powerTable->setSortingEnabled(true); + // Add context menu to allow hiding/showing of columns + powerTableMenu = new QMenu(ui->powerTable); + for (int i = 0; i < ui->powerTable->horizontalHeader()->count(); i++) + { + QString text = ui->powerTable->horizontalHeaderItem(i)->text(); + powerTableMenu->addAction(createCheckableItem(text, i, true, SLOT(powerTableColumnSelectMenuChecked()))); + } + ui->powerTable->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->powerTable->horizontalHeader(), SIGNAL(customContextMenuRequested(QPoint)), SLOT(powerTableColumnSelectMenu(QPoint))); + // Get signals when columns change + connect(ui->powerTable->horizontalHeader(), SIGNAL(sectionMoved(int, int, int)), SLOT(powerTable_sectionMoved(int, int, int))); + connect(ui->powerTable->horizontalHeader(), SIGNAL(sectionResized(int, int, int)), SLOT(powerTable_sectionResized(int, int, int))); + ui->powerTable->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->powerTable, SIGNAL(customContextMenuRequested(QPoint)), SLOT(customContextMenuRequested(QPoint))); + + ui->powerTable->setItemDelegateForColumn(POWER_COL_TIME, new TimeDelegate()); + //ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER, new DecimalDelegate(6)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER_DB, new DecimalDelegate(1)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_POWER_DBM, new DecimalDelegate(1)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_TSYS, new DecimalDelegate(0)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_TSYS0, new DecimalDelegate(0)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_TSOURCE, new DecimalDelegate(0)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_TB, new DecimalDelegate(0)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_TSKY, new DecimalDelegate(0)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_FLUX, new DecimalDelegate(2)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_SIGMA_T, new DecimalDelegate(2)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_SIGMA_S, new DecimalDelegate(1)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_RA, new HMSDelegate()); + ui->powerTable->setItemDelegateForColumn(POWER_COL_DEC, new DMSDelegate()); + ui->powerTable->setItemDelegateForColumn(POWER_COL_GAL_LAT, new DecimalDelegate(0)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_GAL_LON, new DecimalDelegate(0)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_AZ, new DecimalDelegate(0)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_EL, new DecimalDelegate(0)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_VBCRS, new DecimalDelegate(1)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_VLSR, new DecimalDelegate(1)); + ui->powerTable->setItemDelegateForColumn(POWER_COL_AIR_TEMP, new DecimalDelegate(1)); + + resizeSpectrumMarkerTable(); + ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_FREQ, new DecimalDelegate(6)); + ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_VALUE, new DecimalDelegate(1)); + ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_DELTA_X, new DecimalDelegate(6)); + ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_DELTA_Y, new DecimalDelegate(1)); + ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_VR, new DecimalDelegate(2)); + ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_R, new DecimalDelegate(1)); + ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_D, new DecimalDelegate(1)); + ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_R_MIN, new DecimalDelegate(1)); + ui->spectrumMarkerTable->setItemDelegateForColumn(SPECTRUM_MARKER_COL_V, new DecimalDelegate(1)); + + // Create blank marker table + ui->spectrumMarkerTable->setRowCount(SPECTRUM_MARKER_ROWS); // 1 peak and two markers + for (int row = 0; row < SPECTRUM_MARKER_ROWS; row++) + { + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_NAME, new QTableWidgetItem()); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_FREQ, new QTableWidgetItem()); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_VALUE, new QTableWidgetItem()); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_DELTA_X, new QTableWidgetItem()); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_DELTA_Y, new QTableWidgetItem()); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_DELTA_TO, new QTableWidgetItem()); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_VR, new QTableWidgetItem()); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_R, new QTableWidgetItem()); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_D, new QTableWidgetItem()); + // It seems clearing Qt::ItemIsUserCheckable doesn't remove the checkbox, so once set, we always have it + QTableWidgetItem* item = new QTableWidgetItem(); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + item->setCheckState(Qt::Unchecked); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_PLOT_MAX, item); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_R_MIN, new QTableWidgetItem()); + ui->spectrumMarkerTable->setItem(row, SPECTRUM_MARKER_COL_V, new QTableWidgetItem()); + } + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_PEAK, SPECTRUM_MARKER_COL_NAME)->setText("Max"); + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M1, SPECTRUM_MARKER_COL_NAME)->setText("M1"); + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M2, SPECTRUM_MARKER_COL_NAME)->setText("M2"); + connect(ui->spectrumMarkerTable, &QTableWidget::itemChanged, this, &RadioAstronomyGUI::spectrumMarkerTableItemChanged); + + resizePowerMarkerTable(); + ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_TIME, new TimeDelegate()); + ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_VALUE, new DecimalDelegate(1)); + ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_DELTA_X, new TimeDeltaDelegate()); + ui->powerMarkerTable->setItemDelegateForColumn(POWER_MARKER_COL_DELTA_Y, new DecimalDelegate(1)); + + // Create blank marker table + ui->powerMarkerTable->setRowCount(POWER_MARKER_ROWS); // 1 peak and two markers + for (int row = 0; row < POWER_MARKER_ROWS; row++) + { + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_NAME, new QTableWidgetItem()); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_DATE, new QTableWidgetItem()); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_TIME, new QTableWidgetItem()); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_VALUE, new QTableWidgetItem()); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_DELTA_X, new QTableWidgetItem()); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_DELTA_Y, new QTableWidgetItem()); + ui->powerMarkerTable->setItem(row, POWER_MARKER_COL_DELTA_TO, new QTableWidgetItem()); + } + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MAX, POWER_MARKER_COL_NAME)->setText("Max"); + ui->powerMarkerTable->item(POWER_MARKER_ROW_PEAK_MIN, POWER_MARKER_COL_NAME)->setText("Min"); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M1, POWER_MARKER_COL_NAME)->setText("M1"); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M2, POWER_MARKER_COL_NAME)->setText("M2"); + + ui->sweepStartDateTime->setMinimumDateTime(QDateTime::currentDateTime()); + ui->spectrumDateTime->setDateTime(QDateTime::currentDateTime()); + + updateRotatorList(); + + ui->startStop->setStyleSheet("QToolButton { background-color : blue; }"); + + displaySettings(); + applySettings(true); + + create2DImage(); + + plotCalSpectrum(); + plotSpectrum(); + plotPowerChart(); +} + +void RadioAstronomyGUI::customContextMenuRequested(QPoint pos) +{ + QTableWidgetItem *item = ui->powerTable->itemAt(pos); + if (item) + { + QMenu* tableContextMenu = new QMenu(ui->powerTable); + connect(tableContextMenu, &QMenu::aboutToHide, tableContextMenu, &QMenu::deleteLater); + + // Copy cell contents to clipboard + QAction* copyAction = new QAction("Copy cell", tableContextMenu); + const QString text = item->text(); + connect(copyAction, &QAction::triggered, this, [text]()->void { + QClipboard *clipboard = QGuiApplication::clipboard(); + clipboard->setText(text); + }); + tableContextMenu->addAction(copyAction); + + // Delete selected rows + QAction* delAction = new QAction("Delete rows", tableContextMenu); + connect(delAction, &QAction::triggered, this, [this]()->void { + QModelIndexList rowIndexes = ui->powerTable->selectionModel()->selectedRows(); + if (rowIndexes.size() > 0) + { + // Delete in reverse row order + std::vector rows; + foreach (auto rowIndex, rowIndexes) { + rows.push_back(rowIndex.row()); + } + std::sort(rows.begin(), rows.end(), std::greater()); + bool deletedCurrent = false; + int next; + foreach (auto row, rows) { + next = row - 1; + if (deleteRow(row)) { + deletedCurrent = true; + } + } + deleteRowsComplete(deletedCurrent, next); + } + }); + tableContextMenu->addAction(delAction); + + // Update rows with new Tsys0 and baseline + QAction* updateTSysAction = new QAction(QString("Update Tsys0 / baseline / %1").arg(QChar(937)), tableContextMenu); + connect(updateTSysAction, &QAction::triggered, this, [this]()->void { + QModelIndexList rowIndexes = ui->powerTable->selectionModel()->selectedRows(); + if (rowIndexes.size() > 0) + { + foreach (auto rowIndex, rowIndexes) + { + int row = rowIndex.row(); + m_fftMeasurements[row]->m_tSys0 = calcTSys0(); + m_fftMeasurements[row]->m_baseline = m_settings.m_spectrumBaseline; + m_fftMeasurements[row]->m_omegaA = calcOmegaA(); + m_fftMeasurements[row]->m_omegaS = calcOmegaS(); + calcFFTTotalTemperature(m_fftMeasurements[row]); + updatePowerColumns(row, m_fftMeasurements[row]); + } + plotFFTMeasurement(); + } + }); + tableContextMenu->addAction(updateTSysAction); + + tableContextMenu->popup(ui->powerTable->viewport()->mapToGlobal(pos)); + } +} + +RadioAstronomyGUI::~RadioAstronomyGUI() +{ + delete ui; + delete m_calHot; + delete m_calCold; + qDeleteAll(m_dataLAB); + m_dataLAB.clear(); + delete[] m_2DMapIntensity; +} + +void RadioAstronomyGUI::blockApplySettings(bool block) +{ + m_doApplySettings = !block; +} + +void RadioAstronomyGUI::applySettings(bool force) +{ + if (m_doApplySettings) + { + RadioAstronomy::MsgConfigureRadioAstronomy* message = RadioAstronomy::MsgConfigureRadioAstronomy::create( m_settings, force); + m_radioAstronomy->getInputMessageQueue()->push(message); + } +} + +int RadioAstronomyGUI::fftSizeToIndex(int size) +{ + switch (size) + { + case 16: + return 0; + case 32: + return 1; + case 64: + return 2; + case 128: + return 3; + case 256: + return 4; + case 512: + return 5; + case 1024: + return 6; + case 2048: + return 7; + case 4096: + return 8; + } + return 0; +} + +void RadioAstronomyGUI::displaySettings() +{ + m_channelMarker.blockSignals(true); + m_channelMarker.setBandwidth(m_settings.m_rfBandwidth); + m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset); + m_channelMarker.setTitle(m_settings.m_title); + m_channelMarker.blockSignals(false); + m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only + + setTitleColor(m_settings.m_rgbColor); + setWindowTitle(m_channelMarker.getTitle()); + + blockApplySettings(true); + ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); + float rfBW = m_settings.m_rfBandwidth; // Save value, as it may be corrupted when setting sampleRate + ui->sampleRate->setValue(m_settings.m_sampleRate); + ui->rfBW->setValue(rfBW); + updateBWLimits(); + + ui->integration->setValue(m_settings.m_integration); + ui->fftSize->setCurrentIndex(fftSizeToIndex(m_settings.m_fftSize)); + ui->fftWindow->setCurrentIndex((int)m_settings.m_fftWindow); + ui->filterFreqs->setText(m_settings.m_filterFreqs); + + int idx = ui->starTracker->findText(m_settings.m_starTracker); + if (idx != -1) { + ui->starTracker->setCurrentIndex(idx); + } + idx = ui->rotator->findText(m_settings.m_rotator); + if (idx != -1) { + ui->rotator->setCurrentIndex(idx); + } + + ui->tempRXSelect->setCurrentIndex(0); + ui->tempRX->setValue(m_settings.m_tempRX); + ui->tempRXUnitsLabel->setText("K"); + ui->tempCMB->setValue(m_settings.m_tempCMB); + ui->tempGal->setValue(m_settings.m_tempGal); + ui->tempGal->setEnabled(!m_settings.m_tempGalLink); + ui->tempGalLink->setChecked(m_settings.m_tempGalLink); + ui->tempSP->setValue(m_settings.m_tempSP); + ui->tempAtm->setValue(m_settings.m_tempAtm); + ui->tempAtm->setEnabled(!m_settings.m_tempAtmLink); + ui->tempAtmLink->setChecked(m_settings.m_tempAtmLink); + ui->tempAir->setValue(m_settings.m_tempAir); + ui->tempAir->setEnabled(!m_settings.m_tempAirLink); + ui->tempAirLink->setChecked(m_settings.m_tempAirLink); + ui->zenithOpacity->setValue(m_settings.m_zenithOpacity); + ui->elevation->setValue(m_settings.m_elevation); + ui->elevation->setEnabled(!m_settings.m_elevationLink); + ui->elevationLink->setChecked(m_settings.m_elevationLink); + + ui->gainVariation->setValue(m_settings.m_gainVariation); + ui->sourceType->setCurrentIndex((int)m_settings.m_sourceType); + ui->omegaS->setValue(m_settings.m_omegaS); + ui->omegaSUnits->setCurrentIndex((int)m_settings.m_omegaSUnits); + ui->omegaAUnits->setCurrentIndex((int)m_settings.m_omegaAUnits); + + ui->recalibrate->setChecked(m_settings.m_recalibrate); + ui->tCalHot->setValue(m_settings.m_tCalHot); + ui->tCalCold->setValue(m_settings.m_tCalCold); + + ui->spectrumAutoscale->setChecked(m_settings.m_spectrumAutoscale); + ui->spectrumReference->setValue(m_settings.m_spectrumReference); + ui->spectrumRange->setValue(m_settings.m_spectrumRange); + FFTMeasurement* fft = currentFFT(); + if (fft) { + ui->spectrumCenterFreq->setValue(fft->m_centerFrequency/1e6 + m_settings.m_spectrumCenterFreqOffset); + } else { + ui->spectrumCenterFreq->setValue(m_centerFrequency/1e6 + m_settings.m_spectrumCenterFreqOffset); + } + ui->spectrumSpan->setValue(m_settings.m_spectrumSpan); + ui->spectrumYUnits->setCurrentIndex((int)m_settings.m_spectrumYScale); + ui->spectrumBaseline->setCurrentIndex((int)m_settings.m_spectrumBaseline); + ui->spectrumAutoscaleX->setEnabled(!m_settings.m_spectrumAutoscale); + ui->spectrumAutoscaleY->setEnabled(!m_settings.m_spectrumAutoscale); + ui->spectrumReference->setEnabled(!m_settings.m_spectrumAutoscale); + ui->spectrumRange->setEnabled(!m_settings.m_spectrumAutoscale); + ui->spectrumCenterFreq->setEnabled(!m_settings.m_spectrumAutoscale); + ui->spectrumSpan->setEnabled(!m_settings.m_spectrumAutoscale); + + ui->powerAutoscale->setChecked(m_settings.m_powerAutoscale); + ui->powerReference->setValue(m_settings.m_powerReference); + ui->powerRange->setValue(m_settings.m_powerRange); + ui->powerShowPeak->setChecked(m_settings.m_powerPeaks); + if (m_powerPeakSeries) + { + m_powerPeakSeries->setVisible(m_settings.m_powerPeaks); + m_powerChart->legend()->markers(m_powerPeakSeries)[0]->setVisible(false); + } + ui->powerShowMarker->setChecked(m_settings.m_powerMarkers); + if (m_powerMarkerSeries) + { + m_powerMarkerSeries->setVisible(m_settings.m_powerMarkers); + m_powerChart->legend()->markers(m_powerMarkerSeries)[0]->setVisible(false); + } + ui->powerShowAvg->setChecked(m_settings.m_powerAvg); + ui->powerChartAvgWidgets->setVisible(m_settings.m_powerAvg); + ui->powerShowGaussian->setChecked(m_settings.m_powerShowGaussian); + ui->powerGaussianWidgets->setVisible(m_settings.m_powerShowGaussian); + if (m_powerGaussianSeries) { + m_powerGaussianSeries->setVisible(m_settings.m_powerShowGaussian); + } + ui->powerShowLegend->setChecked(m_settings.m_powerLegend); + if (m_powerChart) { + m_powerChart->legend()->setVisible(m_settings.m_powerLegend); + } + ui->powerChartSelect->setCurrentIndex((int)m_settings.m_powerYData); + ui->powerYUnits->setCurrentIndex(powerYUnitsToIndex(m_settings.m_powerYUnits)); + ui->powerShowTsys0->setChecked(m_settings.m_powerShowTsys0); + ui->powerShowAirTemp->setChecked(m_settings.m_powerShowAirTemp); + m_airTemps.clicked(m_settings.m_powerShowAirTemp); + ui->powerShowSensor1->setChecked(m_settings.m_sensorVisible[0]); + m_sensors[0].setName(m_settings.m_sensorName[0]); + m_sensors[0].clicked(m_settings.m_sensorVisible[0]); + ui->powerShowSensor2->setChecked(m_settings.m_sensorVisible[1]); + m_sensors[1].setName(m_settings.m_sensorName[1]); + m_sensors[1].clicked(m_settings.m_sensorVisible[1]); + + ui->power2DLinkSweep->setChecked(m_settings.m_power2DLinkSweep); + ui->power2DSweepType->setCurrentIndex((int)m_settings.m_power2DSweepType); + ui->power2DWidth->setValue(m_settings.m_power2DWidth); + ui->power2DHeight->setValue(m_settings.m_power2DHeight); + ui->power2DXMin->setValue(m_settings.m_power2DXMin); + ui->power2DXMax->setValue(m_settings.m_power2DXMax); + ui->power2DYMin->setValue(m_settings.m_power2DYMin); + ui->power2DYMax->setValue(m_settings.m_power2DYMax); + ui->powerColourAutoscale->setChecked(m_settings.m_powerColourAutoscale); + ui->powerColourScaleMin->setValue(m_settings.m_powerColourScaleMin); + ui->powerColourScaleMin->setEnabled(!m_settings.m_powerColourAutoscale); + ui->powerColourScaleMax->setValue(m_settings.m_powerColourScaleMax); + ui->powerColourScaleMax->setEnabled(!m_settings.m_powerColourAutoscale); + ui->powerColourPalette->setCurrentIndex(ui->powerColourPalette->findText(m_settings.m_powerColourPalette)); + + ui->spectrumReverseXAxis->setChecked(m_settings.m_spectrumReverseXAxis); + ui->spectrumPeak->setChecked(m_settings.m_spectrumPeaks); + ui->spectrumMarker->setChecked(m_settings.m_spectrumMarkers); + ui->spectrumTemp->setChecked(m_settings.m_spectrumTemp); + if (m_fftGaussianSeries) { + m_fftGaussianSeries->setVisible(m_settings.m_spectrumTemp); + } + ui->spectrumShowRefLine->setChecked(m_settings.m_spectrumRefLine); + if (m_fftHlineSeries) + { + m_fftHlineSeries->setVisible(m_settings.m_spectrumRefLine); + m_fftDopplerAxis->setVisible(m_settings.m_spectrumRefLine); + } + ui->spectrumShowLAB->setChecked(m_settings.m_spectrumLAB); + if (m_fftLABSeries) { + m_fftLABSeries->setVisible(m_settings.m_spectrumLAB); + } + ui->spectrumShowDistance->setChecked(m_settings.m_spectrumDistance); + updateDistanceColumns(); + ui->spectrumShowLegend->setChecked(m_settings.m_spectrumLegend); + if (m_fftChart) { + m_fftChart->legend()->setVisible(m_settings.m_spectrumLegend); + } + if (m_calChart) { + m_calChart->legend()->setVisible(m_settings.m_spectrumLegend); + } + + + ui->refFrame->setCurrentIndex((int)m_settings.m_refFrame); + ui->spectrumLine->setCurrentIndex((int)m_settings.m_line); + ui->sunDistanceToGC->setValue(m_settings.m_sunDistanceToGC); + ui->sunOrbitalVelocity->setValue(m_settings.m_sunOrbitalVelocity); + displaySpectrumLineFrequency(); + updateSpectrumSelect(); + updatePowerSelect(); + + // Updates visibility of widgets + updateSpectrumMarkerTableVisibility(); + updatePowerMarkerTableVisibility(); + updatePowerChartWidgetsVisibility(); + updateSpectrumChartWidgetsVisibility(); + + updateIntegrationTime(); + + ui->runMode->setCurrentIndex((int)m_settings.m_runMode); + ui->sweepStartAtTime->setCurrentIndex(m_settings.m_sweepStartAtTime ? 1 : 0); + ui->sweepStartDateTime->setDateTime(m_settings.m_sweepStartDateTime); + ui->sweepStartDateTime->setVisible(m_settings.m_sweepStartAtTime); + ui->sweepType->setCurrentIndex((int)m_settings.m_sweepType); + ui->sweep1Start->setValue(m_settings.m_sweep1Start); + ui->sweep1Stop->setValue(m_settings.m_sweep1Stop); + ui->sweep1Step->setValue(m_settings.m_sweep1Step); + ui->sweep1Delay->setValue(m_settings.m_sweep1Delay); + ui->sweep2Start->setValue(m_settings.m_sweep2Start); + ui->sweep2Stop->setValue(m_settings.m_sweep2Stop); + ui->sweep2Step->setValue(m_settings.m_sweep2Step); + ui->sweep2Delay->setValue(m_settings.m_sweep2Delay); + displayRunModeSettings(); + + displayStreamIndex(); + + // Order and size columns + QHeaderView *header = ui->powerTable->horizontalHeader(); + for (int i = 0; i < RADIOASTRONOMY_POWERTABLE_COLUMNS; i++) + { + bool hidden = m_settings.m_powerTableColumnSizes[i] == 0; + header->setSectionHidden(i, hidden); + powerTableMenu->actions().at(i)->setChecked(!hidden); + if (m_settings.m_powerTableColumnSizes[i] > 0) + ui->powerTable->setColumnWidth(i, m_settings.m_powerTableColumnSizes[i]); + header->moveSection(header->visualIndex(i), m_settings.m_powerTableColumnIndexes[i]); + } + + blockApplySettings(false); + arrangeRollups(); +} + +void RadioAstronomyGUI::displayStreamIndex() +{ + if (m_deviceUISet->m_deviceMIMOEngine) { + setStreamIndicator(tr("%1").arg(m_settings.m_streamIndex)); + } else { + setStreamIndicator("S"); // single channel indicator + } +} + +void RadioAstronomyGUI::leaveEvent(QEvent*) +{ + m_channelMarker.setHighlighted(false); +} + +void RadioAstronomyGUI::enterEvent(QEvent*) +{ + m_channelMarker.setHighlighted(true); +} + +void RadioAstronomyGUI::tick() +{ + double magsqAvg, magsqPeak; + int nbMagsqSamples; + m_radioAstronomy->getMagSqLevels(magsqAvg, magsqPeak, nbMagsqSamples); + double powDbAvg = CalcDb::dbPower(magsqAvg); + double powDbPeak = CalcDb::dbPower(magsqPeak); + + if (m_tickCount % 4 == 0) { + ui->channelPower->setText(QString::number(powDbAvg, 'f', 1)); + } + + if (m_tickCount % 20 == 0) { // 1s + updateRotatorList(); + } + + m_tickCount++; +} + +void RadioAstronomyGUI::updateRotatorList() +{ + // Update list of rotators + std::vector featureSets = MainCore::instance()->getFeatureeSets(); + for (int i = 0; i < featureSets.size(); i++) + { + FeatureSet* featureSet = featureSets[i]; + for (int j = 0; j < featureSet->getNumberOfFeatures(); j++) + { + const Feature* feature = featureSet->getFeatureAt(j); + if (feature->getURI() == "sdrangel.feature.gs232controller") + { + // Add if it doesn't already exist + QString name = QString("F%1:%2 GS232Controller").arg(i).arg(j); + if (ui->rotator->findText(name) == -1) + { + ui->rotator->addItem(name); + // Rotator feature can be created after this plugin, so select it + // if the chosen rotator appears + if (name == m_settings.m_rotator) { + ui->rotator->setCurrentIndex(ui->rotator->findText(name)); + } + } + } + else + { + // Try to remove + QString prefix = QString("F%1:%2").arg(i).arg(j); + for (int k = 0; k < ui->rotator->count(); k++) + { + if (ui->rotator->itemText(k).startsWith(prefix)) + { + ui->rotator->removeItem(k); + break; + } + } + } + } + } +} + +void RadioAstronomyGUI::on_fftSize_currentIndexChanged(int index) +{ + m_settings.m_fftSize = 1 << (4+index); + applySettings(); + updateIntegrationTime(); +} + +void RadioAstronomyGUI::on_fftWindow_currentIndexChanged(int index) +{ + m_settings.m_fftWindow = (RadioAstronomySettings::FFTWindow)index; + applySettings(); +} + +void RadioAstronomyGUI::on_filterFreqs_editingFinished() +{ + m_settings.m_filterFreqs = ui->filterFreqs->text(); + applySettings(); +} + +void RadioAstronomyGUI::on_gainVariation_valueChanged(double value) +{ + m_settings.m_gainVariation = value; + applySettings(); + updateTSys0(); +} + +// Can we allow user to enter text that is automatically looked up on SIMBAD? +void RadioAstronomyGUI::on_sourceType_currentIndexChanged(int index) +{ + m_settings.m_sourceType = (RadioAstronomySettings::SourceType)index; + applySettings(); + if (m_settings.m_sourceType == RadioAstronomySettings::SUN) + { + // Mean diameter of Sun in degrees from Earth + ui->omegaS->setValue(0.53); + ui->omegaSUnits->setCurrentIndex(0); + } + else if (m_settings.m_sourceType == RadioAstronomySettings::CAS_A) + { + // Diameter of Cas A in degrees http://simbad.u-strasbg.fr/simbad/sim-id?Ident=Cassiopeia+A + ui->omegaS->setValue(0.08333); + ui->omegaSUnits->setCurrentIndex(0); + } + bool visible = index == 1 || index >= 3; + ui->omegaS->setVisible(visible); + ui->omegaSUnits->setVisible(visible); +} + +void RadioAstronomyGUI::on_omegaS_valueChanged(double value) +{ + m_settings.m_omegaS = value; + if ((m_settings.m_sourceType == RadioAstronomySettings::SUN) && (value != 0.53)) { + ui->sourceType->setCurrentIndex((int)RadioAstronomySettings::COMPACT); + } else if ((m_settings.m_sourceType == RadioAstronomySettings::CAS_A) && (value != 0.08333)) { + ui->sourceType->setCurrentIndex((int)RadioAstronomySettings::COMPACT); + } + applySettings(); +} + +void RadioAstronomyGUI::updateOmegaA() +{ + if (m_settings.m_omegaAUnits == RadioAstronomySettings::DEGREES) { + ui->omegaA->setText(QString("%1").arg(m_beamWidth, 0, 'f', 1)); + } else { + ui->omegaA->setText(QString("%1").arg(hpbwToSteradians(m_beamWidth), 0, 'f', 4)); + } +} + +void RadioAstronomyGUI::on_omegaAUnits_currentIndexChanged(int index) +{ + m_settings.m_omegaAUnits = (RadioAstronomySettings::AngleUnits)index; + updateOmegaA(); + if (m_settings.m_omegaAUnits == RadioAstronomySettings::DEGREES) { + ui->omegaALabel->setText("HPBW"); + } else { + ui->omegaALabel->setText(QString("%1A").arg(QChar(937))); + } + applySettings(); +} + +void RadioAstronomyGUI::on_omegaSUnits_currentIndexChanged(int index) +{ + m_settings.m_omegaSUnits = (RadioAstronomySettings::AngleUnits)index; + if ( ( (m_settings.m_sourceType == RadioAstronomySettings::SUN) + || (m_settings.m_sourceType == RadioAstronomySettings::CAS_A) + ) + && (m_settings.m_omegaSUnits != RadioAstronomySettings::DEGREES) + ) + { + ui->sourceType->setCurrentIndex((int)RadioAstronomySettings::COMPACT); + } + applySettings(); +} + +void RadioAstronomyGUI::on_starTracker_currentTextChanged(const QString& text) +{ + m_settings.m_starTracker = text; + applySettings(); +} + +void RadioAstronomyGUI::on_rotator_currentTextChanged(const QString& text) +{ + m_settings.m_rotator = text; + applySettings(); +} + +void RadioAstronomyGUI::on_showSensors_clicked() +{ + RadioAstronomySensorDialog dialog(&m_settings); + if (dialog.exec() == QDialog::Accepted) + { + m_sensors[0].setName(m_settings.m_sensorName[0]); + m_sensors[1].setName(m_settings.m_sensorName[1]); + applySettings(); + } +} + +void RadioAstronomyGUI::sensorMeasurementReceived(const RadioAstronomy::MsgSensorMeasurement& measurement) +{ + int sensor = measurement.getSensor(); + double value = measurement.getValue(); + QDateTime dateTime = measurement.getDateTime(); + SensorMeasurement* sm = new SensorMeasurement(dateTime, value); + m_sensors[sensor].append(sm); +} + +void RadioAstronomyGUI::on_powerChartSelect_currentIndexChanged(int index) +{ + m_settings.m_powerYData = (RadioAstronomySettings::PowerYData)index; + ui->powerYUnits->clear(); + switch (m_settings.m_powerYData) + { + case RadioAstronomySettings::PY_POWER: + ui->powerYUnits->addItem("dBFS"); + ui->powerYUnits->addItem("dBm"); + ui->powerYUnits->addItem("Watts"); + break; + case RadioAstronomySettings::PY_TSYS: + case RadioAstronomySettings::PY_TSOURCE: + ui->powerYUnits->addItem("K"); + break; + case RadioAstronomySettings::PY_FLUX: + ui->powerYUnits->addItem("SFU"); + ui->powerYUnits->addItem("Jy"); + break; + case RadioAstronomySettings::PY_2D_MAP: + ui->powerYUnits->addItem("dBFS"); + ui->powerYUnits->addItem("dBm"); + //ui->powerYUnits->addItem("Watts"); // No watts for now, as range spin boxes can't handle scientific notation + ui->powerYUnits->addItem("K"); + break; + } + updatePowerMarkerTableVisibility(); + updatePowerChartWidgetsVisibility(); + plotPowerChart(); + applySettings(); +} + +void RadioAstronomyGUI::updatePowerChartWidgetsVisibility() +{ + bool powerChart; + if (m_settings.m_powerYData != RadioAstronomySettings::PY_2D_MAP) { + powerChart = true; + } else { + powerChart = false; + } + ui->powerShowLegend->setVisible(powerChart); + ui->powerShowSensor2->setVisible(powerChart); + ui->powerShowSensor1->setVisible(powerChart); + ui->powerShowAirTemp->setVisible(powerChart); + ui->powerShowTsys0->setVisible(powerChart); + ui->powerShowAvg->setVisible(powerChart); + ui->powerShowGaussian->setVisible(powerChart); + ui->powerShowMarker->setVisible(powerChart); + ui->powerShowPeak->setVisible(powerChart); + ui->powerScaleWidgets->setVisible(powerChart); + ui->powerGaussianWidgets->setVisible(powerChart && m_settings.m_powerShowGaussian); + ui->powerMarkerTableWidgets->setVisible(powerChart && (m_settings.m_powerPeaks || m_settings.m_powerMarkers)); + ui->power2DScaleWidgets->setVisible(!powerChart); + ui->power2DColourScaleWidgets->setVisible(!powerChart); + arrangeRollups(); +} + +int RadioAstronomyGUI::powerYUnitsToIndex(RadioAstronomySettings::PowerYUnits units) +{ + switch (units) + { + case RadioAstronomySettings::PY_DBFS: + return 0; + case RadioAstronomySettings::PY_DBM: + return 1; + case RadioAstronomySettings::PY_WATTS: + return 2; + case RadioAstronomySettings::PY_KELVIN: + return 0; + case RadioAstronomySettings::PY_SFU: + return 0; + case RadioAstronomySettings::PY_JANSKY: + return 1; + } + return -1; +} + +void RadioAstronomyGUI::on_powerYUnits_currentIndexChanged(int index) +{ + QString text = ui->powerYUnits->currentText(); + if (text == "dBFS") + { + m_settings.m_powerYUnits = RadioAstronomySettings::PY_DBFS; + ui->powerMarkerTable->horizontalHeaderItem(POWER_MARKER_COL_VALUE)->setText("Power (dBFS)"); + ui->powerColourScaleMin->setDecimals(2); + ui->powerColourScaleMax->setDecimals(2); + } + else if (text == "dBm") + { + m_settings.m_powerYUnits = RadioAstronomySettings::PY_DBM; + ui->powerMarkerTable->horizontalHeaderItem(POWER_MARKER_COL_VALUE)->setText("Power (dBm)"); + ui->powerColourScaleMin->setDecimals(2); + ui->powerColourScaleMax->setDecimals(2); + } + else if (text == "Watts") + { + m_settings.m_powerYUnits = RadioAstronomySettings::PY_WATTS; + ui->powerMarkerTable->horizontalHeaderItem(POWER_MARKER_COL_VALUE)->setText("Power (W)"); + } + else if (text == "K") + { + m_settings.m_powerYUnits = RadioAstronomySettings::PY_KELVIN; + ui->powerMarkerTable->horizontalHeaderItem(POWER_MARKER_COL_VALUE)->setText("Temp (K)"); + ui->powerColourScaleMin->setDecimals(0); + ui->powerColourScaleMax->setDecimals(0); + } + else if (text == "SFU") + { + m_settings.m_powerYUnits = RadioAstronomySettings::PY_SFU; + ui->powerMarkerTable->horizontalHeaderItem(POWER_MARKER_COL_VALUE)->setText("Flux (SFU)"); + } + else if (text == "Jy") + { + m_settings.m_powerYUnits = RadioAstronomySettings::PY_JANSKY; + ui->powerMarkerTable->horizontalHeaderItem(POWER_MARKER_COL_VALUE)->setText("Flux (Jy)"); + } + if (text == "dBFS") + { + ui->powerColourScaleMinUnits->setText("dB"); + ui->powerColourScaleMaxUnits->setText("dB"); + } + else + { + ui->powerColourScaleMinUnits->setText(text); + ui->powerColourScaleMaxUnits->setText(text); + } + if (m_settings.m_powerColourAutoscale && (ui->powerChartSelect->currentIndex() == 4)) { + powerColourAutoscale(); + } + applySettings(); + plotPowerChart(); +} + +void RadioAstronomyGUI::on_spectrumChartSelect_currentIndexChanged(int index) +{ + updateSpectrumMarkerTableVisibility(); // If this follows updateSpectrumChartWidgetsVisibility, widgets are not redrawn properly. + updateSpectrumChartWidgetsVisibility(); // when switching from cal to spectrum if table is visible + if (index == 0) + { + if (m_fftChart) { + ui->spectrumChart->setChart(m_fftChart); + } + } + else + { + if (m_calChart) { + ui->spectrumChart->setChart(m_calChart); + } + } +} + +void RadioAstronomyGUI::updateSpectrumChartWidgetsVisibility() +{ + bool fft = ui->spectrumChartSelect->currentIndex() == 0; + ui->spectrumYUnits->setVisible(fft); + ui->spectrumScaleWidgets->setVisible(fft); + ui->spectrumSelectWidgets->setVisible(fft); + ui->spectrumRefLineWidgets->setVisible(fft && m_settings.m_spectrumRefLine); + + ui->spectrumGaussianWidgets->setVisible(fft && m_settings.m_spectrumTemp); + ui->calWidgets->setVisible(!fft); + ui->recalibrate->setVisible(!fft); + ui->startCalHot->setVisible(!fft); + ui->startCalCold->setVisible(!fft); + ui->clearCal->setVisible(!fft); + ui->showCalSettings->setVisible(!fft); + ui->spectrumShowRefLine->setVisible(fft); + ui->spectrumShowDistance->setVisible(fft); + ui->spectrumShowLAB->setVisible(fft); + ui->spectrumTemp->setVisible(fft); + ui->spectrumMarker->setVisible(fft); + ui->spectrumPeak->setVisible(fft); + ui->saveSpectrumChartImages->setVisible(fft); + + arrangeRollups(); +} + +// Calulate mean, RMS and standard deviation +// Currently this is for all data - but could make it only for visible data +void RadioAstronomyGUI::calcAverages() +{ + qreal sum = 0.0; + qreal sumSq = 0.0; + QVector points = m_powerSeries->pointsVector(); + for (int i = 0; i < points.size(); i++) + { + QPointF point = points.at(i); + qreal y = point.y(); + sum += y; + sumSq += y * y; + } + qreal mean = sum / points.size(); + qreal rms = std::sqrt(sumSq / points.size()); + qreal sumSqDiff = 0.0; + for (int i = 0; i < points.size(); i++) + { + QPointF point = points.at(i); + qreal y = point.y(); + qreal diff = y - mean; + sumSqDiff += diff * diff; + } + qreal sigma = std::sqrt(sumSqDiff / points.size()); + + ui->powerMean->setText(QString::number(mean)); + ui->powerRMS->setText(QString::number(rms)); + ui->powerSD->setText(QString::number(sigma)); +} + +QRgb RadioAstronomyGUI::intensityToColor(float intensity) +{ + QRgb c1, c2; + float scale; + + if (isnan(intensity)) { + return qRgb(0, 0, 0); + } + // Get in range 0-1 + intensity = (intensity - m_settings.m_powerColourScaleMin) / (m_settings.m_powerColourScaleMax - m_settings.m_powerColourScaleMin); + intensity = std::min(intensity, 1.0f); + intensity = std::max(intensity, 0.0f); + + if (m_settings.m_powerColourPalette[0] == 'C') + { + // Colour heat map gradient + if (intensity <= 0.25f) + { + c1 = qRgb(0, 0, 0x80); // Navy + c2 = qRgb(0, 0, 0xff); // Blue + scale = intensity * 4.0f; + } + else if (intensity <= 0.5f) + { + c1 = qRgb(0, 0, 0xff); // Blue + c2 = qRgb(0, 0xff, 0); // Green + scale = (intensity - 0.25f) * 4.0f; + } + else if (intensity <= 0.75f) + { + c1 = qRgb(0, 0xff, 0); // Green + c2 = qRgb(0xff, 0xff, 0); // Yellow + scale = (intensity - 0.5f) * 4.0f; + } + else + { + c1 = qRgb(0xff, 0xff, 0); // Yellow + c2 = qRgb(0xff, 0, 0); // Red + scale = (intensity - 0.75f) * 4.0f; + } + + int r, g, b; + r = (qRed(c2)-qRed(c1))*scale+qRed(c1); + g = (qGreen(c2)-qGreen(c1))*scale+qGreen(c1); + b = (qBlue(c2)-qBlue(c1))*scale+qBlue(c1); + + return qRgb(r, g, b); + } + else + { + // Greyscale + int g = 255 * intensity; + return qRgb(g, g, g); + } +} + +void RadioAstronomyGUI::plot2DChart() +{ + // Only plot if visible + if (ui->powerChartSelect->currentIndex() == 4) + { + QChart *oldChart = m_2DChart; + + m_2DChart = new QChart(); + + m_2DChart->layout()->setContentsMargins(0, 0, 0, 0); + m_2DChart->setMargins(QMargins(1, 1, 1, 1)); + m_2DChart->setTheme(QChart::ChartThemeDark); + m_2DChart->setTitle(""); + + m_2DXAxis = new QValueAxis(); + m_2DYAxis = new QValueAxis(); + + m_2DXAxis->setGridLineVisible(false); + m_2DYAxis->setGridLineVisible(false); + set2DAxisTitles(); + m_2DXAxis->setRange(m_settings.m_power2DXMin, m_settings.m_power2DXMax); + m_2DYAxis->setRange(m_settings.m_power2DYMin, m_settings.m_power2DYMax); + + m_2DChart->addAxis(m_2DXAxis, Qt::AlignBottom); + m_2DChart->addAxis(m_2DYAxis, Qt::AlignLeft); + + m_2DMap.fill(qRgb(0, 0, 0)); + for (int i = 0; i < m_fftMeasurements.size(); i++) { + update2DImage(m_fftMeasurements[i], i < m_fftMeasurements.size() - 1); + } + + connect(m_2DChart, SIGNAL(plotAreaChanged(QRectF)), this, SLOT(plotAreaChanged(QRectF))); + + ui->powerChart->setChart(m_2DChart); + + delete oldChart; + } +} + +void RadioAstronomyGUI::set2DAxisTitles() +{ + if (m_settings.m_power2DSweepType == RadioAstronomySettings::SWP_LB) + { + m_2DXAxis->setTitleText(QString("Galactic longitude (%1)").arg(QChar(0xb0))); + m_2DYAxis->setTitleText(QString("Galactic latitude (%1)").arg(QChar(0xb0))); + } + else + { + m_2DXAxis->setTitleText(QString("Azimuth (%1)").arg(QChar(0xb0))); + m_2DYAxis->setTitleText(QString("Elevation (%1)").arg(QChar(0xb0))); + } +} + +void RadioAstronomyGUI::update2DSettingsFromSweep() +{ + if (m_settings.m_runMode == RadioAstronomySettings::SWEEP) + { + ui->power2DSweepType->setCurrentIndex((int)m_settings.m_sweepType); + + // Calculate width and height of image - 1 pixel per sweep measurement + float sweep1Start, sweep1Stop; + sweep1Start = m_settings.m_sweep1Start; + sweep1Stop = m_settings.m_sweep1Stop; + // Handle azimuth/l sweep through 0. E.g. 340deg -> 20deg with +vs step, or 20deg -> 340deg with -ve step + if ((m_settings.m_sweep1Stop < m_settings.m_sweep1Start) && (m_settings.m_sweep1Step > 0)) { + sweep1Stop = m_settings.m_sweep1Stop + 360.0; + } else if ((m_settings.m_sweep1Stop > m_settings.m_sweep1Start) && (m_settings.m_sweep1Step < 0)) { + sweep1Start += 360.0; + } + int width = abs((sweep1Stop - sweep1Start) / m_settings.m_sweep1Step) + 1; + int height = abs((m_settings.m_sweep2Stop - m_settings.m_sweep2Start) / m_settings.m_sweep2Step) + 1; + ui->power2DWidth->setValue(width); + ui->power2DHeight->setValue(height); + + // Subtract/add half a step so that pixels are centred on coordinates + int start1 = m_settings.m_sweep1Start - m_settings.m_sweep1Step / 2; + int stop1 = m_settings.m_sweep1Stop + m_settings.m_sweep1Step / 2; + if (start1 < stop1) + { + ui->power2DXMin->setValue(start1); + ui->power2DXMax->setValue(stop1); + } + else + { + ui->power2DXMin->setValue(stop1); + ui->power2DXMax->setValue(start1); + } + + int start2 = m_settings.m_sweep2Start - m_settings.m_sweep2Step / 2; + int stop2 = m_settings.m_sweep2Stop + m_settings.m_sweep2Step / 2; + if (start2 < stop2) + { + ui->power2DYMin->setValue(start2); + ui->power2DYMax->setValue(stop2); + } + else + { + ui->power2DYMin->setValue(stop2); + ui->power2DYMax->setValue(start2); + } + + m_sweepIndex = 0; + } +} + +void RadioAstronomyGUI::create2DImage() +{ + // Intensity array holds power/temperature values which are then colourised in to a QImage + delete m_2DMapIntensity; + int size = m_settings.m_power2DWidth * m_settings.m_power2DHeight; + if (size > 0) + { + m_2DMapIntensity = new float[size]; + for (int i = 0; i < size; i++) { + m_2DMapIntensity[i] = NAN; + } + m_2DMapMin = std::numeric_limits::max(); + m_2DMapMax = -std::numeric_limits::max(); + QImage map(m_settings.m_power2DWidth, m_settings.m_power2DHeight, QImage::Format_ARGB32); + map.fill(qRgb(0, 0, 0)); + m_2DMap = map; + } + else + { + m_2DMapIntensity = nullptr; + m_2DMap = QImage(); + } +} + +void RadioAstronomyGUI::update2DImage(FFTMeasurement* fft, bool skipCalcs) +{ + if (m_2DMap.width() > 0) + { + int x, y; + if (m_settings.m_power2DSweepType == RadioAstronomySettings::SWP_OFFSET) + { + y = fft->m_sweepIndex / m_2DMap.width(); + x = fft->m_sweepIndex % m_2DMap.width(); + + if (m_settings.m_sweep2Step >= 0) { + y = m_2DMap.height() - 1 - y; + } + if (m_settings.m_sweep1Step < 0) { + x = m_2DMap.width() - 1 - x; + } + } + else + { + if (m_settings.m_power2DSweepType == RadioAstronomySettings::SWP_LB) + { + x = (int)round(fft->m_l); + y = (int)round(fft->m_b); + } + else + { + x = (int)round(fft->m_azimuth); + y = (int)round(fft->m_elevation); + } + + // Map coordinates to pixels + float xRange = m_settings.m_power2DXMax - m_settings.m_power2DXMin; + float yRange = m_settings.m_power2DYMax - m_settings.m_power2DYMin; + + x = (x - m_settings.m_power2DXMin) * m_settings.m_power2DWidth / xRange; + y = (y - m_settings.m_power2DYMin) * m_settings.m_power2DHeight / yRange; + + if (yRange >= 0) { + y = m_2DMap.height() - 1 - y; + } + if (xRange < 0) { + x = m_2DMap.width() - 1 - x; + } + } + + if ((x >= 0) && (x < m_2DMap.width()) && (y >= 0) && (y < m_2DMap.height())) + { + float intensity; + switch (m_settings.m_powerYUnits) + { + case RadioAstronomySettings::PY_DBFS: + intensity = fft->m_totalPowerdBFS; + break; + case RadioAstronomySettings::PY_DBM: + intensity = fft->m_totalPowerdBm; + break; + case RadioAstronomySettings::PY_WATTS: + intensity = fft->m_totalPowerWatts; + break; + case RadioAstronomySettings::PY_KELVIN: + intensity = fft->m_tSys; + break; + } + + float newMin = std::min(m_2DMapMin, intensity); + float newMax = std::max(m_2DMapMax, intensity); + bool rescale = false; + if ((newMin != m_2DMapMin) || (newMax != m_2DMapMax)) { + rescale = m_settings.m_powerColourAutoscale; + } + m_2DMapMin = newMin; + m_2DMapMax = newMax; + m_2DMapIntensity[y*m_2DMap.width()+x] = intensity; + m_2DMap.setPixel(x, y, intensityToColor(intensity)); + if (rescale && !skipCalcs) { + powerColourAutoscale(); + } + if (m_2DChart && !skipCalcs) { + plotAreaChanged(m_2DChart->plotArea()); + } + } + } +} + +void RadioAstronomyGUI::recolour2DImage() +{ + for (int y = 0; y < m_2DMap.height(); y++) + { + for (int x = 0; x < m_2DMap.width(); x++) { + m_2DMap.setPixel(x, y, intensityToColor(m_2DMapIntensity[y*m_2DMap.width()+x])); + } + } + if (m_2DChart) { + plotAreaChanged(m_2DChart->plotArea()); + } +} + +void RadioAstronomyGUI::plotAreaChanged(const QRectF& plotArea) +{ + if (ui->powerChartSelect->currentIndex() == 4) + { + int width = static_cast(plotArea.width()); + int height = static_cast(plotArea.height()); + int viewW = static_cast(ui->powerChart->width()); + int viewH = static_cast(ui->powerChart->height()); + + // Scale the image to fit plot area + QImage image = m_2DMap.scaled(QSize(width, height), Qt::IgnoreAspectRatio); + QImage translated(viewW, viewH, QImage::Format_ARGB32); + translated.fill(Qt::black); + QPainter painter(&translated); + painter.drawImage(plotArea.topLeft(), image); + + m_2DChart->setPlotAreaBackgroundBrush(translated); + m_2DChart->setPlotAreaBackgroundVisible(true); + } +} + +// Find min and max coordinates from existing data +void RadioAstronomyGUI::power2DAutoscale() +{ + if (m_fftMeasurements.size() > 0) + { + float minX = std::numeric_limits::max(); + float maxX = -std::numeric_limits::max(); + float minY = std::numeric_limits::max(); + float maxY = -std::numeric_limits::max(); + + for (int i = 0; i < m_fftMeasurements.size(); i++) + { + FFTMeasurement* fft = m_fftMeasurements[i]; + float x, y; + if (m_settings.m_power2DSweepType == RadioAstronomySettings::SWP_LB) + { + x = fft->m_l; + y = fft->m_b; + } + else + { + x = fft->m_azimuth; + y = fft->m_elevation; + } + minX = std::min(minX, x); + maxX = std::max(maxX, x); + minY = std::min(minY, y); + maxY = std::max(maxY, y); + } + + // Adjust so pixels are centered + float xAdjust = (maxX - minX) / m_2DMap.width() / 2; + float yAdjust = (maxY - minY) / m_2DMap.height() / 2; + + ui->power2DXMin->setValue(minX - xAdjust); + ui->power2DXMax->setValue(maxX + xAdjust); + ui->power2DYMin->setValue(minY - yAdjust); + ui->power2DYMax->setValue(maxY + xAdjust); + } +} + +void RadioAstronomyGUI::on_power2DAutoscale_clicked() +{ + power2DAutoscale(); + plot2DChart(); +} + +void RadioAstronomyGUI::on_power2DLinkSweep_toggled(bool checked) +{ + m_settings.m_power2DLinkSweep = checked; + applySettings(); +} + +void RadioAstronomyGUI::on_power2DSweepType_currentIndexChanged(int index) +{ + m_settings.m_power2DSweepType = (RadioAstronomySettings::SweepType)index; + applySettings(); + plot2DChart(); +} + +void RadioAstronomyGUI::on_power2DWidth_valueChanged(int value) +{ + m_settings.m_power2DWidth = value; + applySettings(); + create2DImage(); + plot2DChart(); +} + +void RadioAstronomyGUI::on_power2DHeight_valueChanged(int value) +{ + m_settings.m_power2DHeight = value; + applySettings(); + create2DImage(); + plot2DChart(); +} + +void RadioAstronomyGUI::on_power2DXMin_valueChanged(double value) +{ + m_settings.m_power2DXMin = value; + applySettings(); + if (m_2DXAxis) + { + m_2DXAxis->setMin(m_settings.m_power2DXMin); + plot2DChart(); + } +} + +void RadioAstronomyGUI::on_power2DXMax_valueChanged(double value) +{ + m_settings.m_power2DXMax = value; + applySettings(); + if (m_2DXAxis) + { + m_2DXAxis->setMax(m_settings.m_power2DXMax); + plot2DChart(); + } +} + +void RadioAstronomyGUI::on_power2DYMin_valueChanged(double value) +{ + m_settings.m_power2DYMin = value; + applySettings(); + if (m_2DYAxis) + { + m_2DYAxis->setMin(m_settings.m_power2DYMin); + plot2DChart(); + } +} + +void RadioAstronomyGUI::on_power2DYMax_valueChanged(double value) +{ + m_settings.m_power2DYMax = value; + applySettings(); + if (m_2DYAxis) + { + m_2DYAxis->setMax(m_settings.m_power2DYMax); + plot2DChart(); + } +} + +void RadioAstronomyGUI::powerColourAutoscale() +{ + int width = m_2DMap.width(); + int height = m_2DMap.height(); + float newMin = std::numeric_limits::max(); + float newMax = -std::numeric_limits::max(); + for (int i = 0; i < width * height; i++) + { + if (!isnan(m_2DMapIntensity[i])) + { + newMin = std::min(newMin, m_2DMapIntensity[i]); + newMax = std::max(newMax, m_2DMapIntensity[i]); + } + } + + if ((newMin != ui->powerColourScaleMin->value()) || (newMax != ui->powerColourScaleMax->value())) + { + ui->powerColourScaleMin->setValue(std::floor(newMin * 10.0) / 10.0); + ui->powerColourScaleMax->setValue(std::ceil(newMax * 10.0) / 10.0); + } +} + +void RadioAstronomyGUI::on_powerColourAutoscale_toggled(bool checked) +{ + m_settings.m_powerColourAutoscale = checked; + applySettings(); + if (m_settings.m_powerColourAutoscale) { + powerColourAutoscale(); + } + ui->powerColourScaleMin->setEnabled(!m_settings.m_powerColourAutoscale); + ui->powerColourScaleMax->setEnabled(!m_settings.m_powerColourAutoscale); +} + +void RadioAstronomyGUI::updatePowerColourScaleStep() +{ + float diff = abs(m_settings.m_powerColourScaleMax - m_settings.m_powerColourScaleMin); + double step = (diff <= 1.0f) ? 0.1 : 1.0f; + ui->powerColourScaleMin->setSingleStep(step); + ui->powerColourScaleMax->setSingleStep(step); +} + +void RadioAstronomyGUI::on_powerColourScaleMin_valueChanged(double value) +{ + m_settings.m_powerColourScaleMin = value; + updatePowerColourScaleStep(); + applySettings(); + recolour2DImage(); +} + +void RadioAstronomyGUI::on_powerColourScaleMax_valueChanged(double value) +{ + m_settings.m_powerColourScaleMax = value; + updatePowerColourScaleStep(); + applySettings(); + recolour2DImage(); +} + +void RadioAstronomyGUI::on_powerColourPalette_currentIndexChanged(int index) +{ + (void) index; + m_settings.m_powerColourPalette = ui->powerColourPalette->currentText(); + applySettings(); + recolour2DImage(); +} + +void RadioAstronomyGUI::plotPowerChart() +{ + if (ui->powerChartSelect->currentIndex() == 4) { + plot2DChart(); + } else { + plotPowerVsTimeChart(); + } +} + +void RadioAstronomyGUI::plotPowerVsTimeChart() +{ + QChart *oldChart = m_powerChart; + + m_powerChart = new QChart(); + + m_powerChart->layout()->setContentsMargins(0, 0, 0, 0); + m_powerChart->setMargins(QMargins(1, 1, 1, 1)); + m_powerChart->setTheme(QChart::ChartThemeDark); + + m_powerChart->legend()->setAlignment(Qt::AlignRight); + m_powerChart->legend()->setVisible(m_settings.m_powerLegend); + + // Create measurement data series + m_powerSeries = new QLineSeries(); + connect(m_powerSeries, &QXYSeries::clicked, this, &RadioAstronomyGUI::powerSeries_clicked); + + // Plot peak info + m_powerPeakSeries = new QScatterSeries(); + m_powerPeakSeries->setName("Peak"); + m_powerPeakSeries->setPointLabelsVisible(true); + m_powerPeakSeries->setPointLabelsFormat("@yPoint"); // Qt can't display dates, so omit @xPoint + m_powerPeakSeries->setMarkerSize(5); + m_powerPeakSeries->setVisible(m_settings.m_powerPeaks); + + // Markers + m_powerMarkerSeries = new QScatterSeries(); + m_powerMarkerSeries->setName("Marker"); + m_powerMarkerSeries->setPointLabelsVisible(true); + m_powerMarkerSeries->setPointLabelsFormat("@yPoint"); + m_powerMarkerSeries->setMarkerSize(5); + m_powerMarkerSeries->setVisible(m_settings.m_powerMarkers); + + // Noise + m_powerTsys0Series = new QLineSeries(); + m_powerTsys0Series->setName("Tsys0"); + m_powerTsys0Series->setVisible(m_settings.m_powerShowTsys0); + + // Air temperature + m_airTemps.init("Air temp", m_settings.m_powerShowAirTemp); + + // Gaussian + m_powerGaussianSeries = new QLineSeries(); + m_powerGaussianSeries->setName("Gaussian fit"); + m_powerGaussianSeries->setVisible(m_settings.m_powerShowGaussian); + + // Sensors + for (int i = 0; i < RADIOASTRONOMY_SENSORS; i++) { + m_sensors[i].init(m_settings.m_sensorName[i], m_settings.m_sensorVisible[i]); + } + + // Reset min/max and peaks + m_powerMin = std::numeric_limits::max(); + m_powerMax = -std::numeric_limits::max(); + m_powerPeakValid = false; + + // Create X axis + m_powerXAxis = new QDateTimeAxis(); + int rows = ui->powerTable->rowCount(); + QString dateTimeFormat = "hh:mm:ss"; + m_powerXAxisSameDay = true; + if (rows > 1) + { + QDate start = ui->powerTable->item(0, POWER_COL_DATE)->data(Qt::DisplayRole).toDate(); + QDate end = ui->powerTable->item(rows-1, POWER_COL_DATE)->data(Qt::DisplayRole).toDate(); + if (start != end) + { + dateTimeFormat = QString("%1 hh:mm").arg(QLocale::system().dateFormat(QLocale::ShortFormat)); + m_powerXAxisSameDay = false; + } + } + m_powerXAxis->setFormat(dateTimeFormat); + m_powerXAxis->setRange(ui->powerStartTime->dateTime(), ui->powerEndTime->dateTime()); + ui->powerStartTime->setDisplayFormat(dateTimeFormat); + ui->powerEndTime->setDisplayFormat(dateTimeFormat); + + // Create Y axis + m_powerYAxis = new QValueAxis(); + + m_powerXAxis->setTitleText("Time"); + calcPowerChartTickCount(size().width()); + switch (m_settings.m_powerYData) + { + case RadioAstronomySettings::PY_POWER: + m_powerSeries->setName("Measurement"); + switch (m_settings.m_powerYUnits) + { + case RadioAstronomySettings::PY_DBFS: + m_powerYAxis->setTitleText("Power (dBFS)"); + break; + case RadioAstronomySettings::PY_DBM: + m_powerYAxis->setTitleText("Power (dBm)"); + break; + case RadioAstronomySettings::PY_WATTS: + m_powerYAxis->setTitleText("Power (Watts)"); + break; + } + break; + case RadioAstronomySettings::PY_TSYS: + m_powerSeries->setName("Tsys"); + m_powerYAxis->setTitleText("Tsys (K)"); + break; + case RadioAstronomySettings::PY_TSOURCE: + m_powerSeries->setName("Tsource"); + m_powerYAxis->setTitleText("Tsource (K)"); + break; + case RadioAstronomySettings::PY_FLUX: + m_powerSeries->setName("Flux density"); + switch (m_settings.m_powerYUnits) + { + case RadioAstronomySettings::PY_SFU: + m_powerYAxis->setTitleText("Flux density (SFU)"); + break; + case RadioAstronomySettings::PY_JANSKY: + m_powerYAxis->setTitleText("Flux density (Jy)"); + break; + } + break; + } + + m_powerChart->addAxis(m_powerXAxis, Qt::AlignBottom); + m_powerChart->addAxis(m_powerYAxis, Qt::AlignLeft); + m_powerChart->addAxis(m_airTemps.yAxis(), Qt::AlignRight); + for (int i = 0; i < RADIOASTRONOMY_SENSORS; i++) { + m_powerChart->addAxis(m_sensors[i].yAxis(), Qt::AlignRight); + } + + // Add data to series and calculate peaks + for (int i = 0; i < m_fftMeasurements.size(); i++) { + addToPowerSeries(m_fftMeasurements[i], i < (m_fftMeasurements.size() - 1)); + } + m_airTemps.addAllToSeries(); + for (int i = 0; i < RADIOASTRONOMY_SENSORS; i++) { + m_sensors[i].addAllToSeries(); + } + + m_powerChart->addSeries(m_powerSeries); + m_powerSeries->attachAxis(m_powerXAxis); + m_powerSeries->attachAxis(m_powerYAxis); + + m_powerChart->addSeries(m_powerTsys0Series); + m_powerTsys0Series->attachAxis(m_powerXAxis); + m_powerTsys0Series->attachAxis(m_powerYAxis); + + m_powerChart->addSeries(m_powerGaussianSeries); + m_powerGaussianSeries->attachAxis(m_powerXAxis); + m_powerGaussianSeries->attachAxis(m_powerYAxis); + + m_airTemps.addToChart(m_powerChart, m_powerXAxis); + for (int i = 0; i < RADIOASTRONOMY_SENSORS; i++) { + m_sensors[i].addToChart(m_powerChart, m_powerXAxis); + } + + m_powerChart->addSeries(m_powerPeakSeries); + m_powerPeakSeries->attachAxis(m_powerXAxis); + m_powerPeakSeries->attachAxis(m_powerYAxis); + + m_powerChart->addSeries(m_powerMarkerSeries); + m_powerMarkerSeries->attachAxis(m_powerXAxis); + m_powerMarkerSeries->attachAxis(m_powerYAxis); + + // Dark theme only has 5 colours for series, so use an extra unique colour (purple) + QPen pen(QColor(qRgb(146, 65, 146)), 2, Qt::SolidLine); + m_sensors[1].setPen(pen); + + // Don't have peaks and markers in legend + m_powerChart->legend()->markers(m_powerPeakSeries)[0]->setVisible(false); + m_powerChart->legend()->markers(m_powerMarkerSeries)[0]->setVisible(false); + + ui->powerChart->setChart(m_powerChart); + + delete oldChart; +} + +void RadioAstronomyGUI::calCompletetReceived(const RadioAstronomy::MsgCalComplete& measurement) +{ + bool hot = measurement.getHot(); + int size = measurement.getSize(); + Real* data = measurement.getCal(); + + FFTMeasurement* fft = new FFTMeasurement(); + if (hot) + { + delete m_calHot; + m_calHot = fft; + ui->startCalHot->setStyleSheet("QToolButton { background: none; }"); + } + else + { + delete m_calCold; + m_calCold = fft; + ui->startCalCold->setStyleSheet("QToolButton { background: none; }"); + } + fft->m_fftData = data; + fft->m_fftSize = size; + fft->m_dateTime = measurement.getDateTime(); + fft->m_centerFrequency = m_centerFrequency; + fft->m_sampleRate = m_settings.m_sampleRate; + fft->m_integration = m_settings.m_integration; + fft->m_rfBandwidth = m_settings.m_rfBandwidth; + fft->m_omegaA = calcOmegaA(); + fft->m_omegaS = calcOmegaS(); + fft->m_coordsValid = m_coordsValid; + fft->m_ra = m_ra; + fft->m_dec = m_dec; + fft->m_azimuth = m_azimuth; + fft->m_elevation = m_elevation; + fft->m_l = m_l; + fft->m_b = m_b; + fft->m_vBCRS = m_vBCRS; + fft->m_vLSR = m_vLSR; + fft->m_solarFlux = m_solarFlux; + fft->m_airTemp = m_airTemps.lastValue(); + fft->m_skyTemp = m_skyTemp; + for (int i = 0; i < RADIOASTRONOMY_SENSORS; i++) { + fft->m_sensor[i] = m_sensors[i].lastValue(); + } + fft->m_tSys0 = calcTSys0(); + fft->m_baseline = m_settings.m_spectrumBaseline; + + if (!hot) { + ui->calTsky->setText(QString::number(m_skyTemp, 'f', 1)); + } + + calcFFTTotalPower(fft); + calcCalAvgDiff(); + calibrate(); + calcFFTTemperatures(fft); + calcFFTTotalTemperature(fft); + plotCalMeasurements(); +} + +void RadioAstronomyGUI::plotCalMeasurements() +{ + m_calHotSeries->clear(); + m_calColdSeries->clear(); + + if (m_calHot || m_calCold) + { + float minVal = std::numeric_limits::max(); + float maxVal = -std::numeric_limits::max(); + + double size; + double sampleRate; + double centerFrequency; + if (m_calCold && m_calHot) + { + size = (double)std::min(m_calCold->m_fftSize, m_calHot->m_fftSize); + sampleRate = (double)m_calCold->m_sampleRate; + centerFrequency = (double)m_calCold->m_centerFrequency; + } + else if (m_calCold) + { + size = (double)m_calCold->m_fftSize; + sampleRate = (double)m_calCold->m_sampleRate; + centerFrequency = (double)m_calCold->m_centerFrequency; + } + else + { + size = (double)m_calHot->m_fftSize; + sampleRate = (double)m_calHot->m_sampleRate; + centerFrequency = (double)m_calHot->m_centerFrequency; + } + + double binRes = sampleRate / size; + double startFreq = centerFrequency - sampleRate / 2.0; + double freq = startFreq; + for (int i = 0; i < size; i++) + { + float value; + bool hotValid = m_calHot && (i < m_calHot->m_fftSize); + bool coldValid = m_calCold && (i < m_calCold->m_fftSize); + + if (hotValid) + { + value = CalcDb::dbPower(m_calHot->m_fftData[i]); + m_calHotSeries->append(freq / 1e6, value); + minVal = std::min(minVal, value); + maxVal = std::max(maxVal, value); + } + if (coldValid) + { + value = CalcDb::dbPower(m_calCold->m_fftData[i]); + m_calColdSeries->append(freq / 1e6, value); + minVal = std::min(minVal, value); + maxVal = std::max(maxVal, value); + } + freq += binRes; + } + + m_calYAxis->setRange(minVal, maxVal); + + double startFreqMHz = centerFrequency/1e6 - sampleRate/ 1e6 / 2.0; + double endFreqMHz = centerFrequency/1e6 + sampleRate/ 1e6 / 2.0; + m_calXAxis->setRange(startFreqMHz, endFreqMHz); + m_calXAxis->setReverse(m_settings.m_spectrumReverseXAxis); + } +} + +void RadioAstronomyGUI::plotCalSpectrum() +{ + QChart *oldChart = m_calChart; + + m_calChart = new QChart(); + + m_calChart->layout()->setContentsMargins(0, 0, 0, 0); + m_calChart->setMargins(QMargins(1, 1, 1, 1)); + m_calChart->setTheme(QChart::ChartThemeDark); + + m_calChart->legend()->setAlignment(Qt::AlignRight); + m_calChart->legend()->setVisible(m_settings.m_spectrumLegend); + + m_calHotSeries = new QLineSeries(); + m_calHotSeries->setName("Hot"); + m_calColdSeries = new QLineSeries(); + m_calColdSeries->setName("Cold"); + + m_calXAxis = new QValueAxis(); + m_calYAxis = new QValueAxis(); + + m_calChart->addAxis(m_calXAxis, Qt::AlignBottom); + m_calChart->addAxis(m_calYAxis, Qt::AlignLeft); + + m_calXAxis->setTitleText("Frequency (MHz)"); + calcSpectrumChartTickCount(m_calXAxis, size().width()); + m_calYAxis->setTitleText("Power (dBFS)"); + + m_calChart->addSeries(m_calHotSeries); + m_calHotSeries->attachAxis(m_calXAxis); + m_calHotSeries->attachAxis(m_calYAxis); + + m_calChart->addSeries(m_calColdSeries); + m_calColdSeries->attachAxis(m_calXAxis); + m_calColdSeries->attachAxis(m_calYAxis); + + plotCalMeasurements(); + + ui->spectrumChart->setChart(m_calChart); + + delete oldChart; +} + +void RadioAstronomyGUI::on_spectrumReference_valueChanged(double value) +{ + m_settings.m_spectrumReference = value; + spectrumUpdateYRange(); + if (!m_settings.m_spectrumAutoscale) { + applySettings(); + } +} + +void RadioAstronomyGUI::on_spectrumRange_valueChanged(double value) +{ + m_settings.m_spectrumRange = value; + if (m_settings.m_spectrumRange <= 1.0) + { + ui->spectrumRange->setSingleStep(0.1); + ui->spectrumRange->setDecimals(2); + ui->spectrumReference->setDecimals(2); + } + else + { + ui->spectrumRange->setSingleStep(1.0); + ui->spectrumRange->setDecimals(1); + ui->spectrumReference->setDecimals(1); + } + spectrumUpdateYRange(); + if (!m_settings.m_spectrumAutoscale) { + applySettings(); + } +} + +void RadioAstronomyGUI::on_spectrumSpan_valueChanged(double value) +{ + m_settings.m_spectrumSpan = value; + spectrumUpdateXRange(); + applySettings(); +} + +void RadioAstronomyGUI::on_spectrumCenterFreq_valueChanged(double value) +{ + double offset; + FFTMeasurement* fft = currentFFT(); + if (fft) { + offset = value - fft->m_centerFrequency/1e6; + } else { + offset = value - m_centerFrequency/1e6; + } + m_settings.m_spectrumCenterFreqOffset = offset; + spectrumUpdateXRange(); + applySettings(); +} + +void RadioAstronomyGUI::spectrumUpdateXRange(FFTMeasurement* fft) +{ + if (!fft) { + fft = currentFFT(); + } + if (m_fftXAxis && fft) + { + double startFreqMHz = fft->m_centerFrequency/1e6 - m_settings.m_spectrumSpan / 2.0; + double endFreqMHz = fft->m_centerFrequency/1e6 + m_settings.m_spectrumSpan / 2.0; + m_fftXAxis->setRange(startFreqMHz + m_settings.m_spectrumCenterFreqOffset, endFreqMHz + m_settings.m_spectrumCenterFreqOffset); + double lineFreqMHz = ui->spectrumLineFrequency->value(); + double lineFreq = lineFreqMHz * 1e6; + double startFreq = fft->m_centerFrequency + m_settings.m_spectrumSpan*1e6 / 2.0 + m_settings.m_spectrumCenterFreqOffset*1e6; + double endFreq = fft->m_centerFrequency - m_settings.m_spectrumSpan*1e6 / 2.0 + m_settings.m_spectrumCenterFreqOffset*1e6; + m_fftDopplerAxis->setRange(dopplerToVelocity(lineFreq, startFreq, fft), + dopplerToVelocity(lineFreq, endFreq, fft)); + } +} + +void RadioAstronomyGUI::spectrumUpdateYRange(FFTMeasurement* fft) +{ + if (!fft) { + fft = currentFFT(); + } + if (m_fftYAxis && fft) { + m_fftYAxis->setRange(m_settings.m_spectrumReference - m_settings.m_spectrumRange, m_settings.m_spectrumReference); + } +} + +void RadioAstronomyGUI::spectrumAutoscale() +{ + if (m_settings.m_spectrumAutoscale) + { + on_spectrumAutoscaleX_clicked(); + on_spectrumAutoscaleY_clicked(); + } +} + +// Scale Y axis according to min and max values +void RadioAstronomyGUI::on_spectrumAutoscale_toggled(bool checked) +{ + m_settings.m_spectrumAutoscale = checked; + ui->spectrumAutoscaleX->setEnabled(!m_settings.m_spectrumAutoscale); + ui->spectrumAutoscaleY->setEnabled(!m_settings.m_spectrumAutoscale); + ui->spectrumReference->setEnabled(!m_settings.m_spectrumAutoscale); + ui->spectrumRange->setEnabled(!m_settings.m_spectrumAutoscale); + ui->spectrumCenterFreq->setEnabled(!m_settings.m_spectrumAutoscale); + ui->spectrumSpan->setEnabled(!m_settings.m_spectrumAutoscale); + spectrumAutoscale(); + applySettings(); +} + +// Get minimum and maximum values in a series +// Assumes minVal and maxVal are initialised +static bool seriesMinAndMax(QLineSeries* series, qreal& minVal, qreal& maxVal) +{ + QVector points = series->pointsVector(); + for (int i = 0; i < points.size(); i++) + { + qreal power = points[i].y(); + minVal = std::min(minVal, power); + maxVal = std::max(maxVal, power); + } + return points.size() > 0; +} + +// Scale Y axis according to min and max values +void RadioAstronomyGUI::on_spectrumAutoscaleY_clicked() +{ + double minVal = std::numeric_limits::max(); + double maxVal = -std::numeric_limits::max(); + bool v0 = false, v1 = false; + if (m_fftSeries) { + v0 = seriesMinAndMax(m_fftSeries, minVal, maxVal); + } + if (m_fftLABSeries && m_settings.m_spectrumLAB) { + v1 = seriesMinAndMax(m_fftLABSeries, minVal, maxVal); + } + if (v0 || v1) + { + double range = (maxVal - minVal) * 1.2; // 20% wider than signal range, for space for markers + range = std::max(0.1, range); // Don't be smaller than minimum value we can set in GUI + ui->spectrumRange->setValue(range); // Call before setting reference, so number of decimals are adjusted + ui->spectrumReference->setValue(maxVal + range * 0.15); + } +} + +// Scale X axis according to min and max values +void RadioAstronomyGUI::on_spectrumAutoscaleX_clicked() +{ + FFTMeasurement* fft = currentFFT(); + if (fft) + { + ui->spectrumSpan->setValue(fft->m_sampleRate/1e6); + ui->spectrumCenterFreq->setValue(fft->m_centerFrequency/1e6); + } + else + { + ui->spectrumSpan->setValue(m_basebandSampleRate/1e6); + ui->spectrumCenterFreq->setValue(m_centerFrequency/1e6); + } +} + +RadioAstronomyGUI::FFTMeasurement* RadioAstronomyGUI::currentFFT() +{ + int index = ui->spectrumIndex->value(); + if ((index >= 0) && (index < m_fftMeasurements.size())) { + return m_fftMeasurements[index]; + } else { + return nullptr; + } +} + +void RadioAstronomyGUI::on_spectrumYUnits_currentIndexChanged(int index) +{ + QString text = ui->spectrumYUnits->currentText(); + if (text == "dBFS") + { + m_settings.m_spectrumYScale = RadioAstronomySettings::SY_DBFS; + ui->spectrumMarkerTable->horizontalHeaderItem(SPECTRUM_MARKER_COL_VALUE)->setText("Power (dBFS)"); + } + else if (text == "SNR") + { + m_settings.m_spectrumYScale = RadioAstronomySettings::SY_SNR; + ui->spectrumMarkerTable->horizontalHeaderItem(SPECTRUM_MARKER_COL_VALUE)->setText("SNR"); + } + else if (text == "dBm") + { + m_settings.m_spectrumYScale = RadioAstronomySettings::SY_DBM; + ui->spectrumMarkerTable->horizontalHeaderItem(SPECTRUM_MARKER_COL_VALUE)->setText("Power (dBm)"); + } + else if (text == "Tsys K") + { + m_settings.m_spectrumYScale = RadioAstronomySettings::SY_TSYS; + ui->spectrumMarkerTable->horizontalHeaderItem(SPECTRUM_MARKER_COL_VALUE)->setText("Tsys (K)"); + } + else + { + m_settings.m_spectrumYScale = RadioAstronomySettings::SY_TSOURCE; + ui->spectrumMarkerTable->horizontalHeaderItem(SPECTRUM_MARKER_COL_VALUE)->setText("Tsource (K)"); + } + plotFFTMeasurement(); + applySettings(); +} + +void RadioAstronomyGUI::on_spectrumBaseline_currentIndexChanged(int index) +{ + m_settings.m_spectrumBaseline = (RadioAstronomySettings::SpectrumBaseline)index; + plotFFTMeasurement(); + if ((m_settings.m_powerYData == RadioAstronomySettings::PY_TSOURCE) || (m_settings.m_powerYData == RadioAstronomySettings::PY_FLUX)) { + plotPowerChart(); + } + applySettings(); +} + +// Convert frequency shift to velocity in km/s (+ve approaching) +static double lineDopplerVelocity(double centre, double f) +{ + return Astronomy::dopplerToVelocity(f, centre) / 1000.0f; +} + +// Convert frequency shift to velocity (+ve receeding - which seems to be the astronomical convention) +double RadioAstronomyGUI::dopplerToVelocity(double centre, double f, FFTMeasurement *fft) +{ + double v = lineDopplerVelocity(centre, f); + // Adjust in to selected reference frame + switch (m_settings.m_refFrame) + { + case RadioAstronomySettings::BCRS: + v -= fft->m_vBCRS; + break; + case RadioAstronomySettings::LSR: + v -= fft->m_vLSR; + break; + } + // Make +ve receeding + return -v; +} + +// Replot current FFT +void RadioAstronomyGUI::plotFFTMeasurement() +{ + plotFFTMeasurement(ui->spectrumIndex->value()); +} + +// Plot FFT with specified index +void RadioAstronomyGUI::plotFFTMeasurement(int index) +{ + if (index < m_fftMeasurements.size()) + { + FFTMeasurement *fft = m_fftMeasurements[index]; + + m_fftSeries->clear(); + m_fftHlineSeries->clear(); + m_fftGaussianSeries->clear(); + m_fftLABSeries->clear(); + m_fftPeakSeries->clear(); + + double binRes = fft->m_sampleRate / (double)fft->m_fftSize; + double startFreq = fft->m_centerFrequency - fft->m_sampleRate / 2.0; + + // Plot reference spectral line and Doppler axis + plotRefLine(fft); + + // Plot Gaussian for temp estimation + plotTempGaussian(startFreq, binRes, fft->m_fftSize); + + // Plot LAB reference data + if ( fft->m_coordsValid && m_settings.m_spectrumLAB + && ( (m_settings.m_spectrumYScale == RadioAstronomySettings::SY_TSYS) + || (m_settings.m_spectrumYScale == RadioAstronomySettings::SY_TSOURCE) + ) + ) + { + plotLAB(fft->m_l, fft->m_b, m_beamWidth); + } + + if ( ((m_settings.m_spectrumYScale == RadioAstronomySettings::SY_SNR) && !fft->m_snr) + || ((m_settings.m_spectrumYScale == RadioAstronomySettings::SY_DBM) && !fft->m_temp) + || ((m_settings.m_spectrumYScale == RadioAstronomySettings::SY_TSYS) && !fft->m_temp) + || ((m_settings.m_spectrumYScale == RadioAstronomySettings::SY_TSOURCE) && !fft->m_temp) + ) + { + m_fftChart->setTitle("No cal data: Run calibration or set units to dBFS."); + } + else + { + m_fftChart->setTitle(""); + + if (fft->m_coordsValid) + { + m_fftChart->setTitle(QString("RA: %1 Dec: %2 l: %3%7 b: %4%7 Az: %5%7 El: %6%7") + .arg(Units::decimalHoursToHoursMinutesAndSeconds(fft->m_ra)) + .arg(Units::decimalDegreesToDegreeMinutesAndSeconds(fft->m_dec)) + .arg(QString::number(fft->m_l, 'f', 1)) + .arg(QString::number(fft->m_b, 'f', 1)) + .arg(QString::number(fft->m_azimuth, 'f', 0)) + .arg(QString::number(fft->m_elevation, 'f', 0)) + .arg(QChar(0xb0))); + } + + int peakIdx = 0; + double peakValue = -std::numeric_limits::max(); + + double freq = startFreq; // Main spectrum seems to use bin midpoint - this uses lowest frequency, so we're tone at centre freq appears in centre of plot + + // Plot power/temp + for (int i = 0; i < fft->m_fftSize; i++) + { + qreal value; + switch (m_settings.m_spectrumYScale) + { + case RadioAstronomySettings::SY_DBFS: + value = fft->m_db[i]; + break; + case RadioAstronomySettings::SY_SNR: + value = fft->m_snr[i]; + break; + case RadioAstronomySettings::SY_DBM: + value = Astronomy::noisePowerdBm(fft->m_temp[i], fft->m_sampleRate/(double)fft->m_fftSize); + break; + case RadioAstronomySettings::SY_TSYS: + value = fft->m_temp[i]; + break; + case RadioAstronomySettings::SY_TSOURCE: + switch (m_settings.m_spectrumBaseline) + { + case RadioAstronomySettings::SBL_TSYS0: + value = fft->m_temp[i] - fft->m_tSys0; + break; + case RadioAstronomySettings::SBL_TMIN: + value = fft->m_temp[i] - fft->m_tempMin; + break; + case RadioAstronomySettings::SBL_CAL_COLD: + if (m_calCold) { + value = m_calG[i] * (fft->m_fftData[i] - m_calCold->m_fftData[i]); + } else { + value = 0.0; + } + break; + } + break; + } + if (value > peakValue) + { + peakValue = value; + peakIdx = i; + } + + m_fftSeries->append(freq / 1e6, value); + freq += binRes; + } + + double startFreqMHz = fft->m_centerFrequency/1e6 - m_settings.m_spectrumSpan / 2.0; + double endFreqMHz = fft->m_centerFrequency/1e6 + m_settings.m_spectrumSpan / 2.0; + + spectrumUpdateXRange(fft); + spectrumUpdateYRange(fft); + m_fftXAxis->setReverse(m_settings.m_spectrumReverseXAxis); + + switch (m_settings.m_spectrumYScale) + { + case RadioAstronomySettings::SY_DBFS: + m_fftYAxis->setTitleText("Power (dBFS)"); + break; + case RadioAstronomySettings::SY_SNR: + m_fftYAxis->setTitleText("SNR"); + break; + case RadioAstronomySettings::SY_DBM: + m_fftYAxis->setTitleText("Power (dBm)"); + break; + case RadioAstronomySettings::SY_TSYS: + m_fftYAxis->setTitleText("Tsys (K)"); + break; + case RadioAstronomySettings::SY_TSOURCE: + m_fftYAxis->setTitleText("Tsource (K)"); + break; + } + + // Plot peaks + if (m_settings.m_spectrumPeaks) + { + double peakFreqMHz = (startFreq + peakIdx * binRes) / 1e6; + double peakFreq = peakFreqMHz * 1e6; + + m_fftPeakSeries->append(peakFreqMHz, peakValue); + + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_PEAK, SPECTRUM_MARKER_COL_FREQ)->setData(Qt::DisplayRole, peakFreqMHz); + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_PEAK, SPECTRUM_MARKER_COL_VALUE)->setData(Qt::DisplayRole, peakValue); + + calcVrAndDistanceToPeak(peakFreq, fft, SPECTRUM_MARKER_ROW_PEAK); + } + + // Update markers to track current data + if (m_spectrumM1Valid) + { + m_fftMarkerSeries->clear(); + int idx; + idx = (m_spectrumM1X - startFreqMHz) / (binRes/1e6); + if ((idx >= 0) && (idx < m_fftSeries->count())) + { + m_spectrumM1Y = m_fftSeries->at(idx).y(); + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M1, SPECTRUM_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_spectrumM1Y); + m_fftMarkerSeries->append(m_spectrumM1X, m_spectrumM1Y); + calcVrAndDistanceToPeak(m_spectrumM1X*1e6, fft, SPECTRUM_MARKER_ROW_M1); + } + if (m_spectrumM2Valid) + { + idx = (m_spectrumM2X - startFreqMHz) / (binRes/1e6); + if (idx < m_fftSeries->count()) + { + m_spectrumM2Y = m_fftSeries->at(idx).y(); + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M2, SPECTRUM_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_spectrumM2Y); + m_fftMarkerSeries->append(m_spectrumM2X, m_spectrumM2Y); + calcVrAndDistanceToPeak(m_spectrumM2X*1e6, fft, SPECTRUM_MARKER_ROW_M2); + calcSpectrumMarkerDelta(); + } + } + } + + spectrumAutoscale(); + } + } +} + +bool RadioAstronomyGUI::losMarkerEnabled(const QString& name) +{ + if (m_settings.m_spectrumDistance && m_settings.m_spectrumRefLine) + { + if (name == "Max") { + return m_settings.m_spectrumPeaks; + } else if (name == "M1") { + return m_settings.m_spectrumMarkers; + } else { + return m_settings.m_spectrumMarkers; + } + } + return false; +} + +void RadioAstronomyGUI::showLoSMarker(const QString& name) +{ + if (losMarkerEnabled(name)) + { + if (name == "Max") { + showLoSMarker(SPECTRUM_MARKER_ROW_PEAK); + } else if (name == "M1") { + showLoSMarker(SPECTRUM_MARKER_ROW_M1); + } else { + showLoSMarker(SPECTRUM_MARKER_ROW_M2); + } + } +} + +void RadioAstronomyGUI::showLoSMarker(int row) +{ + bool ok; + float d = ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_D)->data(Qt::DisplayRole).toFloat(&ok); + if (ok) + { + FFTMeasurement *fft = currentFFT(); + if (fft) + { + QString name = ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_NAME)->text(); + updateLoSMarker(name, fft->m_l, fft->m_b, d); + } + } +} + +void RadioAstronomyGUI::updateLoSMarker(const QString& name, float l, float b, float d) +{ + // Send to Star Tracker + MessagePipes& messagePipes = MainCore::instance()->getMessagePipes(); + QList *messageQueues = messagePipes.getMessageQueues(m_radioAstronomy, "startracker.display"); + if (messageQueues) + { + QList::iterator it = messageQueues->begin(); + + for (; it != messageQueues->end(); ++it) + { + SWGSDRangel::SWGStarTrackerDisplayLoSSettings *swgSettings = new SWGSDRangel::SWGStarTrackerDisplayLoSSettings(); + swgSettings->setName(new QString(name)); + swgSettings->setL(l); + swgSettings->setB(b); + swgSettings->setD(d); + (*it)->push(MainCore::MsgStarTrackerDisplayLoSSettings::create(m_radioAstronomy, swgSettings)); + } + } +} + +void RadioAstronomyGUI::clearLoSMarker(const QString& name) +{ + // Set d to 0 to clear + updateLoSMarker(name, 0.0f, 0.0f, 0.0f); +} + +void RadioAstronomyGUI::calcVrAndDistanceToPeak(double freq, FFTMeasurement *fft, int row) +{ + double lineFreq = ui->spectrumLineFrequency->value() * 1e6; + + // Calculate radial velocity (along line-of-sight) from Doppler shift + double vR = dopplerToVelocity(lineFreq, freq, fft); + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_VR)->setData(Qt::DisplayRole, vR); + + // Tangent point method only valid for Galactic quadrants I (0-90) and IV (270-360) + if ((fft->m_l < 90.0) || (fft->m_l > 270.0)) + { + // Calculate minimum distance to Galactic centre along line of sight (tangential radius) + double rMin = m_settings.m_sunDistanceToGC * sin(Units::degreesToRadians(fft->m_l)); + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_R_MIN)->setData(Qt::DisplayRole, rMin); + + // Calculate orbital velocity at tangent/minimum point + // This is the velocity to plot for the rotation curve + double w0 = m_settings.m_sunOrbitalVelocity / m_settings.m_sunDistanceToGC; + double vOrb = vR + rMin * w0; + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_V)->setData(Qt::DisplayRole, vOrb); + } + else + { + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_R_MIN)->setText(""); + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_V)->setText(""); + } + + // Calculate distance of HI cloud (as indicated by a peak) to Sun and Galactic center + double r, d1, d2; + int solutions = calcDistanceToPeak(vR, fft->m_l, fft->m_b, r, d1, d2); + if (solutions == 0) + { + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_R)->setText(""); + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_D)->setText(""); + } + else if (solutions == 1) + { + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_R)->setData(Qt::DisplayRole, r); + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_D)->setData(Qt::DisplayRole, d1); + } + else + { + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_R)->setData(Qt::DisplayRole, r); + ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_D)->setText(QString("%1/%2").arg(QString::number(d1, 'f', 1)).arg(QString::number(d2, 'f', 1))); + } + + // Send to Star Tracker + QString name = ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_NAME)->text(); + if (losMarkerEnabled(name)) + { + if ((solutions == 0) || isnan(d1)) + { + updateLoSMarker(name, fft->m_l, fft->m_b, 0.0f); + } + else if (solutions == 1) + { + updateLoSMarker(name, fft->m_l, fft->m_b, d1); + } + else + { + bool plotMax = ui->spectrumMarkerTable->item(row, SPECTRUM_MARKER_COL_PLOT_MAX)->checkState() == Qt::Checked; + if ((plotMax && (d1 > d2)) || (!plotMax && (d1 < d2))) { + updateLoSMarker(name, fft->m_l, fft->m_b, d1); + } else { + updateLoSMarker(name, fft->m_l, fft->m_b, d2); + } + } + } +} + +int RadioAstronomyGUI::calcDistanceToPeak(double vr, float l, float b, double& r, double &d1, double &d2) +{ + // Radio Astronomy 4th edition - Burke - p343 + double r0 = m_settings.m_sunDistanceToGC; // Distance of Sun to Galactic centre in kpc + double v0 = m_settings.m_sunOrbitalVelocity; // Orbital velocity of the Sun around Galactic centre in km/s + double w0 = v0/r0; // Angular velocity of the Sun + double gl = Units::degreesToRadians(l); + double gb = Units::degreesToRadians(b); + double w = vr/(r0*sin(gl)*cos(gb))+w0; + r = v0/w; // Assume constant v, regardless of distance from GC - Dark matter magic - Not valid <1kpc from GC + if (r < 0) { + return 0; + } + // https://en.wikipedia.org/wiki/Solution_of_triangles#Two_sides_and_non-included_angle_given_(SSA) + double beta = gl; + double d = sin(beta)*r0/r; + if (d > 1.0) { + // No solutions + return 0; + } + if ((r <= r0) && (beta >= M_PI/2.0)) { + return 0; + } + double gamma = asin(d); + double alpha1 = M_PI - beta - gamma; + d1 = r * sin(alpha1)/sin(beta); // Distance from Sun to peak + if (r < r0) + { + double alpha2 = M_PI - beta - (M_PI-gamma); + d2 = r * sin(alpha2)/sin(beta); // Distance from Sun to peak + return 2; + } + else + { + return 1; + } +} + +void RadioAstronomyGUI::spectrumMarkerTableItemChanged(QTableWidgetItem *item) +{ + if (item->column() == SPECTRUM_MARKER_COL_PLOT_MAX) { + // Plot max checkbox clicked + calcDistances(); + } +} + +void RadioAstronomyGUI::calcDistances() +{ + double freq; + bool ok; + FFTMeasurement* fft = currentFFT(); + if (fft) + { + freq = ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_PEAK, SPECTRUM_MARKER_COL_FREQ)->data(Qt::DisplayRole).toDouble(&ok); + if (ok) { + calcVrAndDistanceToPeak(freq*1e6, fft, SPECTRUM_MARKER_ROW_PEAK); + } + freq = ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M1, SPECTRUM_MARKER_COL_FREQ)->data(Qt::DisplayRole).toDouble(&ok); + if (ok) { + calcVrAndDistanceToPeak(freq*1e6, fft, SPECTRUM_MARKER_ROW_M1); + } + freq = ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M2, SPECTRUM_MARKER_COL_FREQ)->data(Qt::DisplayRole).toDouble(&ok); + if (ok) { + calcVrAndDistanceToPeak(freq*1e6, fft, SPECTRUM_MARKER_ROW_M2); + } + } +} + +void RadioAstronomyGUI::plotRefLine(FFTMeasurement *fft) +{ + double lineFreqMHz = ui->spectrumLineFrequency->value(); + double lineFreq = lineFreqMHz * 1e6; + QString refFrame[] = {"Topocentric", "Barycentric", "LSR"}; + m_fftDopplerAxis->setTitleText(QString("%1 radial velocity (km/s - +ve receeding)").arg(refFrame[m_settings.m_refFrame])); + m_fftHlineSeries->setName(QString("%1 line").arg(ui->spectrumLine->currentText())); + m_fftHlineSeries->append(0.0f, -200.0f); // For dB + m_fftHlineSeries->append(0.0f, 10000.0f); // For temp can be >1e6? + double startFreq = fft->m_centerFrequency + m_settings.m_spectrumSpan*1e6 / 2.0 + m_settings.m_spectrumCenterFreqOffset*1e6; + double endFreq = fft->m_centerFrequency - m_settings.m_spectrumSpan*1e6 / 2.0 + m_settings.m_spectrumCenterFreqOffset*1e6; + m_fftDopplerAxis->setRange(dopplerToVelocity(lineFreq, startFreq, fft), + dopplerToVelocity(lineFreq, endFreq, fft)); + m_fftDopplerAxis->setReverse(!m_settings.m_spectrumReverseXAxis); + m_fftDopplerAxis->setVisible(m_settings.m_spectrumRefLine); +} + +void RadioAstronomyGUI::plotTempGaussian(double startFreq, double freqStep, int steps) +{ + m_fftGaussianSeries->clear(); + double f0 = ui->spectrumGaussianFreq->value() * 1e6; + double a = ui->spectrumGaussianAmp->value(); + double floor = ui->spectrumGaussianFloor->value(); + double fwhm = ui->spectrumGaussianFWHM->value(); + double fwhm_sq = fwhm*fwhm; + double freq = startFreq; + for (int i = 0; i < steps; i++) + { + double fd = freq - f0; + double g = a * std::exp(-4.0*M_LN2*fd*fd/fwhm_sq) + floor; + m_fftGaussianSeries->append(freq/1e6, g); + freq += freqStep; + } +} + +void RadioAstronomyGUI::calcFFTPower(FFTMeasurement* fft) +{ + // Convert linear to dB + for (int i = 0; i < fft->m_fftSize; i++) { + fft->m_db[i] = CalcDb::dbPower(fft->m_fftData[i]); + } +} + +void RadioAstronomyGUI::calcFFTTotalPower(FFTMeasurement* fft) +{ + double total = 0.0; + for (int i = 0; i < fft->m_fftSize; i++) { + total += fft->m_fftData[i]; + } + fft->m_totalPower = total; + fft->m_totalPowerdBFS = CalcDb::dbPower(total); +} + +void RadioAstronomyGUI::calcFFTTemperatures(FFTMeasurement* fft) +{ + if (m_calCold && !fft->m_snr) { + fft->m_snr = new Real[fft->m_fftSize]; + } + if (m_calG && !fft->m_temp) { + fft->m_temp = new Real[fft->m_fftSize]; + } + for (int i = 0; i < fft->m_fftSize; i++) + { + if (fft->m_snr && m_calCold) + { + // Calculate SNR (relative to cold cal) + fft->m_snr[i] = fft->m_fftData[i] / m_calCold->m_fftData[i]; + } + if (m_calG) + { + // Calculate temperature using scaling from hot cal + fft->m_temp[i] = m_calG[i] * fft->m_fftData[i]; + // Calculate temperature using linear interpolation from hot/cold cal + //fft->m_temp[i] = m_calG[i] * (fft->m_fftData[i] - m_calCold->m_fftData[i]) + m_settings.m_tCalCold; + //fft->m_temp[i] = std::max(fft->m_temp[i], 0.0f); // Can't have negative temperatures + } + } + calcFFTMinTemperature(fft); +} + +void RadioAstronomyGUI::calcFFTMinTemperature(FFTMeasurement* fft) +{ + fft->m_tempMin = 0; + if (fft->m_temp) + { + // Select minimum from within band. 95% of that to account for a little bit of inband rolloff + float tempMin = std::numeric_limits::max(); + double pc = 0.95 * fft->m_rfBandwidth / (double)fft->m_sampleRate; + int count = (int)(pc * fft->m_fftSize); + int start = (fft->m_fftSize - count) / 2; + for (int i = 0; i < count; i++) + { + int idx = i + start; + tempMin = std::min(tempMin, fft->m_temp[idx]); + } + if (tempMin != std::numeric_limits::max()) { + fft->m_tempMin = tempMin; + } + } +} + +// Estimate Tsource by subtracting selected baseline +double RadioAstronomyGUI::calcTSource(FFTMeasurement *fft) const +{ + switch (fft->m_baseline) + { + case RadioAstronomySettings::SBL_TSYS0: + return fft->m_tSys - fft->m_tSys0; + case RadioAstronomySettings::SBL_TMIN: + return fft->m_tSys - fft->m_tempMin; + case RadioAstronomySettings::SBL_CAL_COLD: + if (m_calCold) { + return fft->m_tSys - m_calCold->m_tSys; + } + break; + } + return fft->m_tSys; +} + +// Calculate spectral flux density of source +double RadioAstronomyGUI::calcFlux(double Ta, const FFTMeasurement *fft) const +{ + // Factor of 2 here assumes single polarization + // See equation 5.13 and 5.20 in Radio Astronomy 4th edition - Burke + double lambda = Astronomy::m_speedOfLight / (double)fft->m_centerFrequency; + return 2.0 * Astronomy::m_boltzmann * Ta * fft->m_omegaA / (lambda * lambda); +} + +void RadioAstronomyGUI::calcFFTTotalTemperature(FFTMeasurement* fft) +{ + if (fft->m_temp) + { + double tempSum = 0.0; + for (int i = 0; i < fft->m_fftSize; i++) { + tempSum += fft->m_temp[i]; + } + + // Convert from temperature to power in Watts and dBm + Real bw = fft->m_sampleRate/(Real)fft->m_fftSize; + fft->m_totalPowerWatts = Astronomy::m_boltzmann * tempSum * bw; + fft->m_totalPowerdBm = Astronomy::noisePowerdBm(tempSum, bw); + fft->m_tSys = tempSum/fft->m_fftSize; + + // Esimate source temperature + fft->m_tSource = calcTSource(fft); + + // Calculate error due to thermal noise and gain variation + fft->m_sigmaT = calcSigmaT(fft); + fft->m_sigmaS = calcSigmaS(fft); + + // Calculate spectral flux density of source + fft->m_flux = calcFlux(fft->m_tSource, fft); + } +} + +void RadioAstronomyGUI::updatePowerColumns(int row, FFTMeasurement* fft) +{ + ui->powerTable->item(row, POWER_COL_TSYS)->setData(Qt::DisplayRole, fft->m_tSys); + ui->powerTable->item(row, POWER_COL_TSYS0)->setData(Qt::DisplayRole, fft->m_tSys0); + ui->powerTable->item(row, POWER_COL_TSOURCE)->setData(Qt::DisplayRole, fft->m_tSource); + if (m_settings.m_sourceType != RadioAstronomySettings::UNKNOWN) { + ui->powerTable->item(row, POWER_COL_TB)->setData(Qt::DisplayRole, fft->m_tSource/beamFillingFactor()); + } else { + ui->powerTable->item(row, POWER_COL_TB)->setText(""); + } + ui->powerTable->item(row, POWER_COL_FLUX)->setData(Qt::DisplayRole, Units::wattsPerMetrePerHertzToJansky(fft->m_flux)); + ui->powerTable->item(row, POWER_COL_SIGMA_T)->setData(Qt::DisplayRole, fft->m_sigmaT); + ui->powerTable->item(row, POWER_COL_SIGMA_S)->setData(Qt::DisplayRole, fft->m_sigmaS); + ui->powerTable->item(row, POWER_COL_OMEGA_A)->setData(Qt::DisplayRole, fft->m_omegaA); + ui->powerTable->item(row, POWER_COL_OMEGA_S)->setData(Qt::DisplayRole, fft->m_omegaS); +} + +void RadioAstronomyGUI::addFFT(FFTMeasurement *fft, bool skipCalcs) +{ + m_fftMeasurements.append(fft); + + powerMeasurementReceived(fft, skipCalcs); // Call before ui->spectrumIndex->setValue, so table row is valid + update2DImage(fft, skipCalcs); + + ui->spectrumIndex->setRange(0, m_fftMeasurements.size() - 1); + if ((ui->spectrumIndex->value() == m_fftMeasurements.size() - 2) || (m_fftMeasurements.size() == 1)) { + ui->spectrumIndex->setValue(m_fftMeasurements.size() - 1); + } + if ( m_fftMeasurements.size() == 1) + { + // Force drawing for first measurement + on_spectrumIndex_valueChanged(0); + } +} + +void RadioAstronomyGUI::fftMeasurementReceived(const RadioAstronomy::MsgFFTMeasurement& measurement) +{ + FFTMeasurement *fft = new FFTMeasurement(); + fft->m_fftData = measurement.getFFT(); + fft->m_fftSize = measurement.getSize(); + fft->m_dateTime = measurement.getDateTime(); + fft->m_centerFrequency = m_centerFrequency; + fft->m_sampleRate = m_settings.m_sampleRate; + fft->m_integration = m_settings.m_integration; + fft->m_rfBandwidth = m_settings.m_rfBandwidth; + fft->m_omegaA = calcOmegaA(); + fft->m_omegaS = calcOmegaS(); + fft->m_coordsValid = m_coordsValid; + fft->m_ra = m_ra; + fft->m_dec = m_dec; + fft->m_azimuth = m_azimuth; + fft->m_elevation = m_elevation; + fft->m_l = m_l; + fft->m_b = m_b; + fft->m_vBCRS = m_vBCRS; + fft->m_vLSR = m_vLSR; + fft->m_solarFlux = m_solarFlux; + fft->m_airTemp = m_airTemps.lastValue(); + fft->m_skyTemp = m_skyTemp; + for (int i = 0; i < RADIOASTRONOMY_SENSORS; i++) { + fft->m_sensor[i] = m_sensors[i].lastValue(); + } + fft->m_db = new Real[fft->m_fftSize]; + fft->m_sweepIndex = m_sweepIndex++; + fft->m_tSys0 = calcTSys0(); + fft->m_baseline = m_settings.m_spectrumBaseline; + + calcFFTPower(fft); + calcFFTTotalPower(fft); + calcFFTTemperatures(fft); + calcFFTTotalTemperature(fft); + addFFT(fft); +} + +void RadioAstronomyGUI::on_spectrumIndex_valueChanged(int value) +{ + if (value < m_fftMeasurements.size()) + { + plotFFTMeasurement(value); + + // Highlight in table + ui->powerTable->selectRow(value); + ui->powerTable->scrollTo(ui->powerTable->model()->index(value, 0)); + ui->spectrumDateTime->setDateTime(m_fftMeasurements[value]->m_dateTime); + // Display target in Star Tracker + MessagePipes& messagePipes = MainCore::instance()->getMessagePipes(); + QList *messageQueues = messagePipes.getMessageQueues(m_radioAstronomy, "startracker.display"); + if (messageQueues) + { + QList::iterator it = messageQueues->begin(); + + for (; it != messageQueues->end(); ++it) + { + SWGSDRangel::SWGStarTrackerDisplaySettings *swgSettings = new SWGSDRangel::SWGStarTrackerDisplaySettings(); + swgSettings->setDateTime(new QString(m_fftMeasurements[value]->m_dateTime.toString(Qt::ISODateWithMs))); + swgSettings->setAzimuth(m_fftMeasurements[value]->m_azimuth); + swgSettings->setElevation(m_fftMeasurements[value]->m_elevation); + (*it)->push(MainCore::MsgStarTrackerDisplaySettings::create(m_radioAstronomy, swgSettings)); + } + } + } +} + +void RadioAstronomyGUI::plotSpectrum() +{ + QChart *oldChart = m_fftChart; + + m_fftChart = new QChart(); + + m_fftChart->layout()->setContentsMargins(0, 0, 0, 0); + m_fftChart->setMargins(QMargins(1, 1, 1, 1)); + m_fftChart->setTheme(QChart::ChartThemeDark); + + m_fftChart->legend()->setAlignment(Qt::AlignRight); + m_fftChart->legend()->setVisible(m_settings.m_spectrumLegend); + + m_fftSeries = new QLineSeries(); + m_fftSeries->setName("Measurement"); + connect(m_fftSeries, &QXYSeries::clicked, this, &RadioAstronomyGUI::spectrumSeries_clicked); + + // Plot vertical reference spectral line + m_fftHlineSeries = new QLineSeries(); + m_fftHlineSeries->setName(QString("%1 line").arg(ui->spectrumLine->currentText())); + m_fftHlineSeries->setVisible(m_settings.m_spectrumRefLine); + + // Plot peak info + m_fftPeakSeries = new QScatterSeries(); + m_fftPeakSeries->setPointLabelsVisible(true); + m_fftPeakSeries->setMarkerSize(5); + m_fftPeakSeries->setName("Max"); + + // Markers + m_fftMarkerSeries = new QScatterSeries(); + m_fftMarkerSeries->setPointLabelsVisible(true); + m_fftMarkerSeries->setMarkerSize(5); + m_fftMarkerSeries->setName("Markers"); + + // Gaussian + m_fftGaussianSeries = new QLineSeries(); + m_fftGaussianSeries->setName("Gaussian fit"); + m_fftGaussianSeries->setVisible(m_settings.m_spectrumTemp); + + m_fftLABSeries = new QLineSeries(); + m_fftLABSeries->setName("LAB reference"); + m_fftLABSeries->setVisible(m_settings.m_spectrumLAB); + + m_fftXAxis = new QValueAxis(); + m_fftYAxis = new QValueAxis(); + m_fftDopplerAxis = new QValueAxis(); + + m_fftChart->addAxis(m_fftXAxis, Qt::AlignBottom); + m_fftChart->addAxis(m_fftYAxis, Qt::AlignLeft); + m_fftChart->addAxis(m_fftDopplerAxis, Qt::AlignTop); + + m_fftXAxis->setTitleText("Frequency (MHz)"); + calcSpectrumChartTickCount(m_fftXAxis, size().width()); + calcSpectrumChartTickCount(m_fftDopplerAxis, size().width()); + m_fftYAxis->setTitleText("Power"); + + m_fftChart->addSeries(m_fftSeries); + m_fftSeries->attachAxis(m_fftXAxis); + m_fftSeries->attachAxis(m_fftYAxis); + + m_fftChart->addSeries(m_fftHlineSeries); + //m_fftHlineSeries->attachAxis(m_fftXAxis); + m_fftHlineSeries->attachAxis(m_fftDopplerAxis); + m_fftHlineSeries->attachAxis(m_fftYAxis); + + m_fftChart->addSeries(m_fftGaussianSeries); + m_fftGaussianSeries->attachAxis(m_fftXAxis); + m_fftGaussianSeries->attachAxis(m_fftYAxis); + + m_fftChart->addSeries(m_fftLABSeries); + //m_fftLABSeries->attachAxis(m_fftXAxis); + m_fftLABSeries->attachAxis(m_fftDopplerAxis); + m_fftLABSeries->attachAxis(m_fftYAxis); + + m_fftChart->addSeries(m_fftPeakSeries); + m_fftPeakSeries->attachAxis(m_fftXAxis); + m_fftPeakSeries->attachAxis(m_fftYAxis); + + m_fftChart->addSeries(m_fftMarkerSeries); + m_fftMarkerSeries->attachAxis(m_fftXAxis); + m_fftMarkerSeries->attachAxis(m_fftYAxis); + + // Don't have peaks and markers in legend + m_fftChart->legend()->markers(m_fftPeakSeries)[0]->setVisible(false); + m_fftChart->legend()->markers(m_fftMarkerSeries)[0]->setVisible(false); + + ui->spectrumChart->setChart(m_fftChart); + + delete oldChart; +} + +// Calculate galactic background temperature based on center frequency +void RadioAstronomyGUI::calcGalacticBackgroundTemp() +{ + // https://arxiv.org/ftp/arxiv/papers/1912/1912.12699.pdf - page 6 + // 17.1, 25.2 and 54.8 K for the 10th, 50th and 90th percentile of the all-sky distribution + // See also ITU-R P.372-7 section 6 + // If this is used for cold calibration, we don't want to use the higher value + double temp = 25.2 * std::pow(m_centerFrequency/408000000.0, -2.75); + ui->tempGal->setValue(temp); +} + +// Calculate athmospheric noise temperature based on air temperature, zenith opacity and elevation +void RadioAstronomyGUI::calcAtmosphericTemp() +{ + float el = m_settings.m_elevation; + if (m_settings.m_elevation < 1.0f) { + el = 1.0f; // Avoid divide by 0 and limit max value to match ITU-R P.372-7 figure 5 + } + double temp = Units::celsiusToKelvin(m_settings.m_tempAir) * (1.0 - std::exp(-m_settings.m_zenithOpacity/cos(Units::degreesToRadians(90.0f - el)))); + ui->tempAtm->setValue(temp); +} + +void RadioAstronomyGUI::on_tempRXSelect_currentIndexChanged(int value) +{ + if (value == 0) + { + // T_RX + ui->tempRX->setValue(m_settings.m_tempRX); + ui->tempRXUnitsLabel->setText("K"); + } + else + { + // NF + ui->tempRX->setValue(Units::noiseTempToNoiseFigureTo(m_settings.m_tempRX)); + ui->tempRXUnitsLabel->setText("dB"); + } +} + +void RadioAstronomyGUI::on_tempRX_valueChanged(double value) +{ + if (ui->tempRXSelect->currentIndex() == 0) { + m_settings.m_tempRX = value; + } else { + m_settings.m_tempRX = Units::noiseFigureToNoiseTemp(value); + } + updateTSys0(); + applySettings(); +} + +void RadioAstronomyGUI::on_tempCMB_valueChanged(double value) +{ + m_settings.m_tempCMB = value; + updateTSys0(); + applySettings(); +} + +void RadioAstronomyGUI::on_tempGal_valueChanged(double value) +{ + m_settings.m_tempGal = value; + updateTSys0(); + applySettings(); +} + +void RadioAstronomyGUI::on_tempSP_valueChanged(double value) +{ + m_settings.m_tempSP = value; + updateTSys0(); + applySettings(); +} + +void RadioAstronomyGUI::on_tempAtm_valueChanged(double value) +{ + m_settings.m_tempAtm = value; + updateTSys0(); + applySettings(); +} + +void RadioAstronomyGUI::on_tempAir_valueChanged(double value) +{ + m_settings.m_tempAir = value; + if (m_settings.m_tempAtmLink) { + calcAtmosphericTemp(); + } + applySettings(); +} + +void RadioAstronomyGUI::on_zenithOpacity_valueChanged(double value) +{ + m_settings.m_zenithOpacity = value; + if (m_settings.m_tempAtmLink) { + calcAtmosphericTemp(); + } + applySettings(); +} + +void RadioAstronomyGUI::on_elevation_valueChanged(double value) +{ + m_settings.m_elevation = value; + if (m_settings.m_tempAtmLink) { + calcAtmosphericTemp(); + } + applySettings(); +} + +void RadioAstronomyGUI::on_elevationLink_toggled(bool checked) +{ + m_settings.m_elevationLink = checked; + ui->elevation->setValue(m_elevation); + ui->elevation->setEnabled(!m_settings.m_elevationLink); + applySettings(); +} + +void RadioAstronomyGUI::on_tempAtmLink_toggled(bool checked) +{ + m_settings.m_tempAtmLink = checked; + ui->tempAtm->setEnabled(!m_settings.m_tempAtmLink); + if (checked) { + calcAtmosphericTemp(); + } + applySettings(); +} + +void RadioAstronomyGUI::on_tempAirLink_toggled(bool checked) +{ + m_settings.m_tempAirLink = checked; + ui->tempAir->setEnabled(!m_settings.m_tempAirLink); + if (checked) + { + ui->tempAir->setValue(m_airTemps.lastValue()); + calcAtmosphericTemp(); + } + applySettings(); +} + +void RadioAstronomyGUI::on_tempGalLink_toggled(bool checked) +{ + m_settings.m_tempGalLink = checked; + if (checked) { + calcGalacticBackgroundTemp(); + } + ui->tempGal->setEnabled(!m_settings.m_tempGalLink); + applySettings(); +} + +void RadioAstronomyGUI::on_tCalHotSelect_currentIndexChanged(int value) +{ + if (value == 0) + { + // Thot + ui->tCalHot->setValue(m_settings.m_tCalHot); + ui->tCalHotUnitsLabel->setText("K"); + } + else + { + // Phot + double power = Astronomy::noisePowerdBm(m_settings.m_tCalHot, m_settings.m_sampleRate); + ui->tCalHot->setValue(power); + ui->tCalHotUnitsLabel->setText("dBm"); + } +} + +void RadioAstronomyGUI::on_tCalHot_valueChanged(double value) +{ + double temp; + if (ui->tCalHotSelect->currentIndex() == 0) { + temp = value; + } else { + temp = Astronomy::noiseTemp(value, m_settings.m_sampleRate); + } + m_settings.m_tCalHot = (float)temp; + calibrate(); + applySettings(); +} + +void RadioAstronomyGUI::on_tCalColdSelect_currentIndexChanged(int value) +{ + if (value == 0) + { + // Tcold + ui->tCalCold->setValue(m_settings.m_tCalCold); + ui->tCalColdUnitsLabel->setText("K"); + } + else + { + // Pcold + double power = Astronomy::noisePowerdBm(m_settings.m_tCalCold, m_settings.m_sampleRate); + ui->tCalCold->setValue(power); + ui->tCalColdUnitsLabel->setText("dBm"); + } +} + +void RadioAstronomyGUI::on_tCalCold_valueChanged(double value) +{ + double temp; + if (ui->tCalColdSelect->currentIndex() == 0) { + temp = value; + } else { + temp = Astronomy::noiseTemp(value, m_settings.m_sampleRate); + } + m_settings.m_tCalCold = (float)temp; + calibrate(); + applySettings(); +} + +void RadioAstronomyGUI::on_spectrumLine_currentIndexChanged(int value) +{ + m_settings.m_line = (RadioAstronomySettings::Line)value; + displaySpectrumLineFrequency(); + plotFFTMeasurement(); + applySettings(); +} + +void RadioAstronomyGUI::displaySpectrumLineFrequency() +{ + switch (m_settings.m_line) + { + case RadioAstronomySettings::HI: + ui->spectrumLineFrequency->setValue(Astronomy::m_hydrogenLineFrequency / 1e6); + ui->spectrumLineFrequency->setEnabled(false); + break; + case RadioAstronomySettings::OH: + ui->spectrumLineFrequency->setValue(Astronomy::m_hydroxylLineFrequency / 1e6); + ui->spectrumLineFrequency->setEnabled(false); + break; + case RadioAstronomySettings::DI: + ui->spectrumLineFrequency->setValue(Astronomy::m_deuteriumLineFrequency / 1e6); + ui->spectrumLineFrequency->setEnabled(false); + break; + case RadioAstronomySettings::CUSTOM_LINE: + ui->spectrumLineFrequency->setValue(m_settings.m_lineCustomFrequency / 1e6); + ui->spectrumLineFrequency->setEnabled(true); + break; + } +} + +void RadioAstronomyGUI::on_spectrumLineFrequency_valueChanged(double value) +{ + m_settings.m_lineCustomFrequency = value * 1e6; + plotFFTMeasurement(); + applySettings(); +} + +void RadioAstronomyGUI::on_refFrame_currentIndexChanged(int value) +{ + m_settings.m_refFrame = (RadioAstronomySettings::RefFrame)value; + plotFFTMeasurement(); + applySettings(); +} + +void RadioAstronomyGUI::on_sunDistanceToGC_valueChanged(double value) +{ + m_settings.m_sunDistanceToGC = value; + applySettings(); + calcDistances(); +} + +void RadioAstronomyGUI::on_sunOrbitalVelocity_valueChanged(double value) +{ + m_settings.m_sunOrbitalVelocity = value; + applySettings(); + calcDistances(); +} + +void RadioAstronomyGUI::on_savePowerChartImage_clicked() +{ + QFileDialog fileDialog(nullptr, "Select file to save image to", "", "*.png;*.jpg;*.jpeg;*.bmp;*.ppm;*.xbm;*.xpm"); + fileDialog.setAcceptMode(QFileDialog::AcceptSave); + if (fileDialog.exec()) + { + QStringList fileNames = fileDialog.selectedFiles(); + if (fileNames.size() > 0) + { + QImage image(ui->powerChart->size(), QImage::Format_ARGB32); + image.fill(Qt::transparent); + QPainter painter(&image); + ui->powerChart->render(&painter); + if (!image.save(fileNames[0])) { + QMessageBox::critical(this, "Radio Astronomy", QString("Failed to save image to %1").arg(fileNames[0])); + } + } + } +} + +void RadioAstronomyGUI::on_saveSpectrumChartImage_clicked() +{ + QFileDialog fileDialog(nullptr, "Select file to save image to", "", "*.png;*.jpg;*.jpeg;*.bmp;*.ppm;*.xbm;*.xpm"); + fileDialog.setAcceptMode(QFileDialog::AcceptSave); + if (fileDialog.exec()) + { + QStringList fileNames = fileDialog.selectedFiles(); + if (fileNames.size() > 0) + { + QImage image(ui->spectrumChart->size(), QImage::Format_ARGB32); + image.fill(Qt::transparent); + QPainter painter(&image); + ui->spectrumChart->render(&painter); + if (!image.save(fileNames[0])) { + QMessageBox::critical(this, "Radio Astronomy", QString("Failed to save image to %1").arg(fileNames[0])); + } + } + } +} + +void RadioAstronomyGUI::on_saveSpectrumChartImages_clicked() +{ + if (m_fftMeasurements.size() > 1) + { + // Get filename of animation file + QFileDialog fileDialog(nullptr, "Select file to save animation to", "", "*.png"); + fileDialog.setAcceptMode(QFileDialog::AcceptSave); + if (fileDialog.exec()) + { + QStringList fileNames = fileDialog.selectedFiles(); + if (fileNames.size() > 0) + { + // Create animation file + APNG apng(m_fftMeasurements.size()); + + // Plot each FFT to a temp .png file (in memory) then append to animation file + for (int i = 0; i < m_fftMeasurements.size(); i++) + { + plotFFTMeasurement(i); + QImage image(ui->spectrumChart->size(), QImage::Format_ARGB32); + image.fill(Qt::transparent); + QPainter painter(&image); + ui->spectrumChart->render(&painter); + apng.addImage(image); + } + if (!apng.save(fileNames[0])) { + QMessageBox::critical(this, "Radio Astronomy", QString("Failed to write to file %1").arg(fileNames[0])); + } + } + } + } +} + +void RadioAstronomyGUI::on_spectrumReverseXAxis_toggled(bool checked) +{ + m_settings.m_spectrumReverseXAxis = checked; + applySettings(); + if (ui->spectrumChartSelect->currentIndex() == 0) { + plotFFTMeasurement(); + } else { + m_calXAxis->setReverse(m_settings.m_spectrumReverseXAxis); + } +} + +void RadioAstronomyGUI::on_powerShowPeak_toggled(bool checked) +{ + m_settings.m_powerPeaks = checked; + updatePowerMarkerTableVisibility(); + applySettings(); + if (m_powerPeakSeries) + { + m_powerPeakSeries->setVisible(checked); + if (checked) { + m_powerChart->legend()->markers(m_powerPeakSeries)[0]->setVisible(false); + } + } + arrangeRollups(); +} + +void RadioAstronomyGUI::on_spectrumPeak_toggled(bool checked) +{ + m_settings.m_spectrumPeaks = checked; + updateSpectrumMarkerTableVisibility(); + plotFFTMeasurement(); + applySettings(); + if (m_fftChart) + { + if (checked) { + m_fftChart->legend()->markers(m_fftPeakSeries)[0]->setVisible(false); + showLoSMarker("Max"); + } else { + clearLoSMarker("Max"); + } + } + arrangeRollups(); +} + +void RadioAstronomyGUI::on_powerShowMarker_toggled(bool checked) +{ + m_settings.m_powerMarkers = checked; + updatePowerMarkerTableVisibility(); + applySettings(); + if (m_powerMarkerSeries) + { + m_powerMarkerSeries->setVisible(checked); + if (checked) { + m_powerChart->legend()->markers(m_powerMarkerSeries)[0]->setVisible(false); + } + } + updatePowerSelect(); + arrangeRollups(); +} + +void RadioAstronomyGUI::on_powerShowAvg_toggled(bool checked) +{ + m_settings.m_powerAvg = checked; + applySettings(); + ui->powerChartAvgWidgets->setVisible(checked); + arrangeRollups(); + if (checked) { + calcAverages(); + } +} + +void RadioAstronomyGUI::on_powerShowLegend_toggled(bool checked) +{ + m_settings.m_powerLegend = checked; + applySettings(); + if (m_powerChart) + { + if (checked) { + m_powerChart->legend()->show(); + } else { + m_powerChart->legend()->hide(); + } + } +} + +void RadioAstronomyGUI::on_powerShowTsys0_toggled(bool checked) +{ + m_settings.m_powerShowTsys0 = checked; + applySettings(); + if (m_powerTsys0Series) { + m_powerTsys0Series->setVisible(checked); + } +} + +void RadioAstronomyGUI::on_powerShowAirTemp_toggled(bool checked) +{ + m_settings.m_powerShowAirTemp = checked; + applySettings(); + m_airTemps.clicked(checked); +} + +void RadioAstronomyGUI::on_powerShowSensor1_toggled(bool checked) +{ + m_settings.m_sensorVisible[0] = checked; + applySettings(); + m_sensors[0].clicked(checked); +} + +void RadioAstronomyGUI::on_powerShowSensor2_toggled(bool checked) +{ + m_settings.m_sensorVisible[1] = checked; + applySettings(); + m_sensors[1].clicked(checked); +} + +void RadioAstronomyGUI::updatePowerMarkerTableVisibility() +{ + ui->powerMarkerTableWidgets->setVisible(m_settings.m_powerPeaks || m_settings.m_powerMarkers); + if (m_settings.m_powerPeaks) + { + ui->powerMarkerTable->showRow(POWER_MARKER_ROW_PEAK_MAX); + ui->powerMarkerTable->showRow(POWER_MARKER_ROW_PEAK_MIN); + } + else + { + ui->powerMarkerTable->hideRow(POWER_MARKER_ROW_PEAK_MAX); + ui->powerMarkerTable->hideRow(POWER_MARKER_ROW_PEAK_MIN); + } + if (m_settings.m_powerMarkers) + { + ui->powerMarkerTable->showRow(POWER_MARKER_ROW_M1); + ui->powerMarkerTable->showRow(POWER_MARKER_ROW_M2); + } + else + { + ui->powerMarkerTable->hideRow(POWER_MARKER_ROW_M1); + ui->powerMarkerTable->hideRow(POWER_MARKER_ROW_M2); + } + ui->powerMarkerTableWidgets->updateGeometry(); // Without this, widgets aren't resized properly +} + +void RadioAstronomyGUI::updateSpectrumMarkerTableVisibility() +{ + bool fft = ui->spectrumChartSelect->currentIndex() == 0; + ui->spectrumMarkerTableWidgets->setVisible(fft && (m_settings.m_spectrumPeaks || m_settings.m_spectrumMarkers)); + if (m_settings.m_spectrumPeaks) + { + ui->spectrumMarkerTable->showRow(SPECTRUM_MARKER_ROW_PEAK); + } + else + { + ui->spectrumMarkerTable->hideRow(SPECTRUM_MARKER_ROW_PEAK); + } + if (m_settings.m_spectrumMarkers) + { + ui->spectrumMarkerTable->showRow(SPECTRUM_MARKER_ROW_M1); + ui->spectrumMarkerTable->showRow(SPECTRUM_MARKER_ROW_M2); + } + else + { + ui->spectrumMarkerTable->hideRow(SPECTRUM_MARKER_ROW_M1); + ui->spectrumMarkerTable->hideRow(SPECTRUM_MARKER_ROW_M2); + } + ui->spectrumMarkerTableWidgets->updateGeometry(); // Without this, widgets aren't resized properly +} + +void RadioAstronomyGUI::on_spectrumMarker_toggled(bool checked) +{ + m_settings.m_spectrumMarkers = checked; + applySettings(); + updateSpectrumMarkerTableVisibility(); + m_fftMarkerSeries->setVisible(checked); + if (checked) + { + m_fftChart->legend()->markers(m_fftMarkerSeries)[0]->setVisible(false); + showLoSMarker("M1"); + showLoSMarker("M2"); + } + else + { + clearLoSMarker("M1"); + clearLoSMarker("M2"); + } + updateSpectrumSelect(); + arrangeRollups(); +} + +void RadioAstronomyGUI::on_spectrumTemp_toggled(bool checked) +{ + m_settings.m_spectrumTemp = checked; + applySettings(); + ui->spectrumGaussianWidgets->setVisible(checked); + m_fftGaussianSeries->setVisible(checked); + updateSpectrumSelect(); + arrangeRollups(); +} + +void RadioAstronomyGUI::on_spectrumShowLegend_toggled(bool checked) +{ + m_settings.m_spectrumLegend = checked; + applySettings(); + if (m_fftChart) + { + m_fftChart->legend()->setVisible(checked); + m_calChart->legend()->setVisible(checked); + } +} + +void RadioAstronomyGUI::on_spectrumShowRefLine_toggled(bool checked) +{ + m_settings.m_spectrumRefLine = checked; + applySettings(); + ui->spectrumRefLineWidgets->setVisible(checked); + if (m_fftHlineSeries) + { + m_fftHlineSeries->setVisible(m_settings.m_spectrumRefLine); + m_fftDopplerAxis->setVisible(m_settings.m_spectrumRefLine); + } + updateDistanceColumns(); + arrangeRollups(); +} + +void RadioAstronomyGUI::on_spectrumShowLAB_toggled(bool checked) +{ + m_settings.m_spectrumLAB = checked; + applySettings(); + m_fftLABSeries->setVisible(m_settings.m_spectrumLAB); + if (m_settings.m_spectrumLAB) { + plotLAB(); // Replot incase data needs to be downloaded + } + spectrumAutoscale(); +} + +void RadioAstronomyGUI::updateDistanceColumns() +{ + if (m_settings.m_spectrumDistance && m_settings.m_spectrumRefLine) + { + ui->spectrumMarkerTable->showColumn(SPECTRUM_MARKER_COL_R); + ui->spectrumMarkerTable->showColumn(SPECTRUM_MARKER_COL_D); + showLoSMarker("Max"); + showLoSMarker("M1"); + showLoSMarker("M2"); + ui->sunDistanceToGCLine->setVisible(true); + ui->sunDistanceToGCLabel->setVisible(true); + ui->sunDistanceToGC->setVisible(true); + ui->sunDistanceToGCUnits->setVisible(true); + ui->sunOrbitalVelocityLine->setVisible(true); + ui->sunOrbitalVelocityLabel->setVisible(true); + ui->sunOrbitalVelocity->setVisible(true); + ui->sunOrbitalVelocityUnits->setVisible(true); + } + else + { + ui->spectrumMarkerTable->hideColumn(SPECTRUM_MARKER_COL_R); + ui->spectrumMarkerTable->hideColumn(SPECTRUM_MARKER_COL_D); + clearLoSMarker("Max"); + clearLoSMarker("M1"); + clearLoSMarker("M2"); + ui->sunDistanceToGCLine->setVisible(false); + ui->sunDistanceToGCLabel->setVisible(false); + ui->sunDistanceToGC->setVisible(false); + ui->sunDistanceToGCUnits->setVisible(false); + ui->sunOrbitalVelocityLine->setVisible(false); + ui->sunOrbitalVelocityLabel->setVisible(false); + ui->sunOrbitalVelocity->setVisible(false); + ui->sunOrbitalVelocityUnits->setVisible(false); + } +} + +void RadioAstronomyGUI::on_spectrumShowDistance_toggled(bool checked) +{ + m_settings.m_spectrumDistance = checked; + applySettings(); + if (m_settings.m_spectrumDistance && !m_settings.m_spectrumRefLine) { + ui->spectrumShowRefLine->setChecked(true); + } + updateDistanceColumns(); +} + +// point isn't necessarily a point in the series - may be interpolated +void RadioAstronomyGUI::powerSeries_clicked(const QPointF &point) +{ + QString selection = ui->powerSelect->currentText(); + if (selection.startsWith("M")) + { + if (selection == "M1") + { + // Place marker 1 + m_powerM1X = point.x(); + m_powerM1Y = point.y(); + if (m_powerM1Valid) { + m_powerMarkerSeries->replace(0, m_powerM1X, m_powerM1Y); + } else { + m_powerMarkerSeries->insert(0, QPointF(m_powerM1X, m_powerM1Y)); + } + m_powerM1Valid = true; + QDateTime dt = QDateTime::fromMSecsSinceEpoch(m_powerM1X); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M1, POWER_MARKER_COL_DATE)->setData(Qt::DisplayRole, dt.date()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M1, POWER_MARKER_COL_TIME)->setData(Qt::DisplayRole, dt.time()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M1, POWER_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_powerM1Y); + calcPowerMarkerDelta(); + } + else if (selection == "M2") + { + // Place marker 2 + m_powerM2X = point.x(); + m_powerM2Y = point.y(); + if (m_powerM2Valid) { + m_powerMarkerSeries->replace(1, m_powerM2X, m_powerM2Y); + } else { + m_powerMarkerSeries->insert(1, QPointF(m_powerM2X, m_powerM2Y)); + } + m_powerM2Valid = true; + QDateTime dt = QDateTime::fromMSecsSinceEpoch(m_powerM2X); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M2, POWER_MARKER_COL_DATE)->setData(Qt::DisplayRole, dt.date()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M2, POWER_MARKER_COL_TIME)->setData(Qt::DisplayRole, dt.time()); + ui->powerMarkerTable->item(POWER_MARKER_ROW_M2, POWER_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_powerM2Y); + calcPowerMarkerDelta(); + } + } + else if (selection == "Gaussian") + { + // Fit a Gaussian assuming point clicked is the peak + ui->powerGaussianCenter->setDateTime(QDateTime::fromMSecsSinceEpoch(point.x())); + // Calculate noise floor - take average of lowest 10% + qreal floor = calcSeriesFloor(m_powerSeries); + ui->powerGaussianFloor->setValue(floor); + // Set amplitude to achieve selected point + ui->powerGaussianAmp->setValue(point.y() - floor); + } + else + { + if (m_fftMeasurements.size() > 1) + { + // Select row closest to clicked data + QDateTime dt = QDateTime::fromMSecsSinceEpoch(point.x()); + int i = 0; + while ((i < m_fftMeasurements.size()) && (dt > m_fftMeasurements[i]->m_dateTime)) { + i++; + } + if (i < m_fftMeasurements.size()) { + ui->spectrumIndex->setValue(i); + } + } + } +} + +qreal RadioAstronomyGUI::calcSeriesFloor(QXYSeries *series, int percent) +{ + QList minValues; + double count = series->count() * percent / 100.0; + for (int i = 0; i < series->count(); i++) + { + qreal y = series->at(i).y(); + if (minValues.size() < count) + { + minValues.append(y); + std::sort(minValues.begin(), minValues.end()); + } + else if (y < minValues.last()) + { + minValues.append(y); + std::sort(minValues.begin(), minValues.end()); + } + } + qreal sum = std::accumulate(minValues.begin(), minValues.end(), 0.0); + return sum / minValues.size(); +} + +void RadioAstronomyGUI::updateSpectrumSelect() +{ + ui->spectrumSelect->clear(); + if (m_settings.m_spectrumMarkers) + { + ui->spectrumSelect->addItem("M1"); + ui->spectrumSelect->addItem("M2"); + } + if (m_settings.m_spectrumTemp) + { + ui->spectrumSelect->addItem("Gaussian"); + } + bool visible = ui->spectrumSelect->count() != 0; + ui->spectrumSelectLabel->setVisible(visible); + ui->spectrumSelect->setVisible(visible); +} + +void RadioAstronomyGUI::updatePowerSelect() +{ + ui->powerSelect->clear(); + if (m_settings.m_powerMarkers || m_settings.m_powerShowGaussian) { + ui->powerSelect->addItem("Row"); + } + if (m_settings.m_powerMarkers) + { + ui->powerSelect->addItem("M1"); + ui->powerSelect->addItem("M2"); + } + if (m_settings.m_powerShowGaussian) { + ui->powerSelect->addItem("Gaussian"); + } + bool visible = ui->powerSelect->count() != 0; + ui->powerSelectLabel->setVisible(visible); + ui->powerSelect->setVisible(visible); +} + +void RadioAstronomyGUI::spectrumSeries_clicked(const QPointF &point) +{ + QString selection = ui->spectrumSelect->currentText(); + if (selection.startsWith("M")) + { + FFTMeasurement *fft = currentFFT(); + if (selection == "M1") + { + m_spectrumM1X = point.x(); + m_spectrumM1Y = point.y(); + m_spectrumM1Valid = true; + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M1, SPECTRUM_MARKER_COL_FREQ)->setData(Qt::DisplayRole, m_spectrumM1X); + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M1, SPECTRUM_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_spectrumM1Y); + calcVrAndDistanceToPeak(m_spectrumM1X*1e6, fft, SPECTRUM_MARKER_ROW_M1); + } + else if (selection == "M2") + { + m_spectrumM2X = point.x(); + m_spectrumM2Y = point.y(); + m_spectrumM2Valid = true; + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M2, SPECTRUM_MARKER_COL_FREQ)->setData(Qt::DisplayRole, m_spectrumM2X); + ui->spectrumMarkerTable->item(SPECTRUM_MARKER_ROW_M2, SPECTRUM_MARKER_COL_VALUE)->setData(Qt::DisplayRole, m_spectrumM2Y); + calcVrAndDistanceToPeak(m_spectrumM2X*1e6, fft, SPECTRUM_MARKER_ROW_M2); + } + calcSpectrumMarkerDelta(); + + m_fftMarkerSeries->clear(); + if (m_spectrumM1Valid) { + m_fftMarkerSeries->append(m_spectrumM1X, m_spectrumM1Y); + } + if (m_spectrumM2Valid) { + m_fftMarkerSeries->append(m_spectrumM2X, m_spectrumM2Y); + } + } + else if (selection == "Gaussian") + { + ui->spectrumGaussianFreq->setValue(point.x()); + // Calculate noise floor - take average of lowest 10% + qreal floor = calcSeriesFloor(m_fftSeries); + ui->spectrumGaussianFloor->setValue(floor); + // Set amplitude to achieve selected point + ui->spectrumGaussianAmp->setValue(point.y() - floor); + plotFFTMeasurement(); + } +} + +void RadioAstronomyGUI::on_spectrumGaussianFreq_valueChanged(double value) +{ + (void) value; + calcFWHM(); + plotFFTMeasurement(); +} + +void RadioAstronomyGUI::on_spectrumGaussianAmp_valueChanged(double value) +{ + (void) value; + plotFFTMeasurement(); + calcColumnDensity(); +} + +void RadioAstronomyGUI::on_spectrumGaussianFloor_valueChanged(double value) +{ + (void) value; + plotFFTMeasurement(); +} + +void RadioAstronomyGUI::on_spectrumGaussianFWHM_valueChanged(double fFWHM) +{ + double c = Astronomy::m_speedOfLight; + double k = Astronomy::m_boltzmann; + double m = Astronomy::m_hydrogenMass; + double f0 = ui->spectrumGaussianFreq->value() * 1e6; + double vTurb = ui->spectrumGaussianTurb->value() * 1e3; // RSM turbulent velocties - Convert to m/s + const double bf = 2.0*sqrt(M_LN2); // Convert from Doppler parameter to FWHM + + double fr = fFWHM * c / (bf*f0); + double frs = fr*fr; + + double T = m * (frs-vTurb*vTurb) / (2.0*k); + + ui->spectrumTemperature->blockSignals(true); + ui->spectrumTemperature->setValue(T); + ui->spectrumTemperature->blockSignals(false); + plotFFTMeasurement(); + calcColumnDensity(); +} + +void RadioAstronomyGUI::on_spectrumGaussianTurb_valueChanged(double value) +{ + (void) value; + calcFWHM(); + plotFFTMeasurement(); +} + +void RadioAstronomyGUI::on_spectrumTemperature_valueChanged(double value) +{ + (void) value; + calcFWHM(); + plotFFTMeasurement(); +} + +void RadioAstronomyGUI::calcFWHM() +{ + double c = Astronomy::m_speedOfLight; + double k = Astronomy::m_boltzmann; + double m = Astronomy::m_hydrogenMass; + double f0 = ui->spectrumGaussianFreq->value() * 1e6; + double vTurb = ui->spectrumGaussianTurb->value() * 1e3; // RSM turbulent velocties - Convert to m/s + double T = ui->spectrumTemperature->value(); + const double bf = 2.0*sqrt(M_LN2); // Convert from Doppler parameter to FWHM + + double fFWHM = bf * f0/c * sqrt((2*k*T)/m + vTurb * vTurb); + + ui->spectrumGaussianFWHM->blockSignals(true); + ui->spectrumGaussianFWHM->setValue(fFWHM); + ui->spectrumGaussianFWHM->blockSignals(false); + calcColumnDensity(); +} + +// Assumes optically thin +void RadioAstronomyGUI::calcColumnDensity() +{ + double f0 = ui->spectrumLineFrequency->value() * 1e6; + double f = f0 + ui->spectrumGaussianFWHM->value() / 2.0; + double v = lineDopplerVelocity(f0, f) * 2.0; + double a = ui->spectrumGaussianAmp->value(); + double integratedIntensity = v * a; + double columnDensity = 1.81e18 * integratedIntensity; + ui->columnDensity->setText(QString::number(columnDensity, 'g', 2)); +} + +void RadioAstronomyGUI::on_powerShowGaussian_clicked(bool checked) +{ + m_settings.m_powerShowGaussian = checked; + applySettings(); + ui->powerGaussianWidgets->setVisible(checked); + m_powerGaussianSeries->setVisible(checked); + updatePowerSelect(); + arrangeRollups(); +} + +void RadioAstronomyGUI::plotPowerGaussian() +{ + m_powerGaussianSeries->clear(); + double dt0 = ui->powerGaussianCenter->dateTime().toMSecsSinceEpoch(); + double a = ui->powerGaussianAmp->value(); + double floor = ui->powerGaussianFloor->value(); + double fwhm = ui->powerGaussianFWHM->value() * 1000; // Convert from s to ms + double fwhm_sq = fwhm*fwhm; + qint64 dt = m_powerXAxis->min().toMSecsSinceEpoch(); + qint64 end = m_powerXAxis->max().toMSecsSinceEpoch(); + int steps = 256; + qint64 step = (end - dt) / steps; + for (int i = 0; i < steps; i++) + { + double fd = dt - dt0; + double g = a * std::exp(-4.0*M_LN2*fd*fd/fwhm_sq) + floor; + m_powerGaussianSeries->append(dt, g); + dt += step; + } +} + +// Calculate antenna HPBW from Sun's FWHM time +void RadioAstronomyGUI::calcHPBWFromFWHM() +{ + double fwhmSeconds = ui->powerGaussianFWHM->value(); + double sunDegPerSecond = 360.0/(24.0*60.0*60.0); + double hpbwDeg = fwhmSeconds * sunDegPerSecond; + ui->powerGaussianHPBW->setValue(hpbwDeg); +} + +// Calculate Sun's FWHM time for anntena HPBW +void RadioAstronomyGUI::calcFHWMFromHPBW() +{ + double hpwmDeg = ui->powerGaussianHPBW->value(); + double sunDegPerSecond = 360.0/(24.0*60.0*60.0); + double fwhmSeconds = hpwmDeg / sunDegPerSecond; + ui->powerGaussianFWHM->setValue(fwhmSeconds); +} + +void RadioAstronomyGUI::on_powerGaussianCenter_dateTimeChanged(QDateTime dateTime) +{ + (void) dateTime; + plotPowerGaussian(); +} + +void RadioAstronomyGUI::on_powerGaussianAmp_valueChanged(double value) +{ + (void) value; + plotPowerGaussian(); +} + +void RadioAstronomyGUI::on_powerGaussianFloor_valueChanged(double value) +{ + (void) value; + plotPowerGaussian(); +} + +void RadioAstronomyGUI::on_powerGaussianFWHM_valueChanged(double value) +{ + (void) value; + plotPowerGaussian(); + ui->powerGaussianHPBW->blockSignals(true); + calcHPBWFromFWHM(); + ui->powerGaussianHPBW->blockSignals(false); +} + +void RadioAstronomyGUI::on_powerGaussianHPBW_valueChanged(double value) +{ + (void) value; + calcFHWMFromHPBW(); + ui->powerGaussianFWHM->blockSignals(true); + plotPowerGaussian(); + ui->powerGaussianFWHM->blockSignals(false); +} + +RadioAstronomyGUI::LABData* RadioAstronomyGUI::parseLAB(QFile* file, float l, float b) +{ + LABData *data = new LABData(); + data->read(file, l, b); + m_dataLAB.append(data); + return data; +} + +void RadioAstronomyGUI::plotLAB() +{ + int index = ui->spectrumIndex->value(); + if (index < m_fftMeasurements.size()) + { + FFTMeasurement *fft = m_fftMeasurements[index]; + plotLAB(fft->m_l, fft->m_b, m_beamWidth); + } +} + +void RadioAstronomyGUI::plotLAB(float l, float b, float beamWidth) +{ + // Assume a beamwidth >1deg + l = round(l); + b = round(b); + + // Check if we already have the data in memory + LABData* data = nullptr; + for (int i = 0; i < m_dataLAB.size(); i++) + { + if ((m_dataLAB[i]->m_l == l) && (m_dataLAB[i]->m_b == b)) + { + data = m_dataLAB[i]; + break; + } + } + + if (!data) + { + // Try to open previously downloaded data + m_filenameLAB = HttpDownloadManager::downloadDir() + "/" + QString("lab_l_%1_b_%2.txt").arg(l).arg(b); + QFile file(m_filenameLAB); + if (file.open(QIODevice::ReadOnly)) + { + qDebug() << "RadioAstronomyGUI::plotLAB: Using cached file: " << m_filenameLAB; + data = parseLAB(&file, l, b); + } + else + { + // Only download one file at a time, so we don't overload the server + if (!m_downloadingLAB) + { + m_downloadingLAB = true; + m_lLAB = l; + m_bLAB = b; + + // Request data be generated via web server + QNetworkRequest request(QUrl("https://www.astro.uni-bonn.de/hisurvey/euhou/LABprofile/index.php")); + request.setRawHeader("Content-Type", "application/x-www-form-urlencoded"); + + QUrlQuery params; + params.addQueryItem("coordinates", "lb"); + params.addQueryItem("ral", QString::number(l)); + params.addQueryItem("decb", QString::number(b)); + params.addQueryItem("beam", QString::number(beamWidth)); + params.addQueryItem("vmin", "-100.0" ); + params.addQueryItem("vmax", "100.0" ); + params.addQueryItem("search", "Search data" ); + + m_networkManager->post(request, params.query(QUrl::FullyEncoded).toUtf8()); + } + } + } + + if (data) + { + data->toSeries(m_fftLABSeries); + spectrumAutoscale(); + } +} + +void RadioAstronomyGUI::networkManagerFinished(QNetworkReply *reply) +{ + QNetworkReply::NetworkError replyError = reply->error(); + + if (replyError) + { + qWarning() << "RadioAstronomyGUI::networkManagerFinished:" + << " error(" << (int) replyError + << "): " << replyError + << ": " << reply->errorString(); + m_downloadingLAB = false; + } + else + { + QString answer = reply->readAll(); + QRegExp re("a href=\\\"download.php([^\"]*)\""); + if (re.indexIn(answer) != -1) + { + QString filename = re.capturedTexts()[1]; + qDebug() << "RadioAstronomyGUI: Downloading LAB reference data: " << filename; + m_dlm.download(QUrl("https://www.astro.uni-bonn.de/hisurvey/euhou/LABprofile/download.php" + filename), m_filenameLAB); + } + else + { + qDebug() << "RadioAstronomyGUI::networkManagerFinished - No filename found: " << answer; + m_downloadingLAB = false; + } + } + + reply->deleteLater(); +} + +void RadioAstronomyGUI::downloadFinished(const QString& filename, bool success) +{ + if (success) + { + QFile file(filename); + if (file.open(QIODevice::ReadOnly)) + { + LABData *data = parseLAB(&file, m_lLAB, m_bLAB); + // Check if the data we've downloaded is for the current FFT being displayed + int index = ui->spectrumIndex->value(); + if (index < m_fftMeasurements.size()) + { + FFTMeasurement *fft = m_fftMeasurements[index]; + if (m_lLAB == fft->m_l && m_bLAB == fft->m_b) + { + data->toSeries(m_fftLABSeries); + spectrumAutoscale(); + } + else + { + // Try ploting for current FFT (as we only allow one download at a time, so may have been skipped) + m_downloadingLAB = false; + plotLAB(fft->m_l, fft->m_b, m_beamWidth); + } + } + } else { + qDebug() << "RadioAstronomyGUI::downloadFinished: Failed to open downloaded file: " << filename; + } + } + m_downloadingLAB = false; +} + +void RadioAstronomyGUI::displayRunModeSettings() +{ + bool sweep = m_settings.m_runMode == RadioAstronomySettings::SWEEP; + ui->sweep1CoordLabel->setVisible(sweep); + ui->sweepType->setVisible(sweep); + ui->sweep1StartLabel->setVisible(sweep); + ui->sweep1Start->setVisible(sweep); + ui->sweep1StopLabel->setVisible(sweep); + ui->sweep1Stop->setVisible(sweep); + ui->sweep1StepLabel->setVisible(sweep); + ui->sweep1Step->setVisible(sweep); + ui->sweep1DelayLabel->setVisible(sweep); + ui->sweep1Delay->setVisible(sweep); + ui->sweep2CoordLabel->setVisible(sweep); + ui->sweep2StartLabel->setVisible(sweep); + ui->sweep2Start->setVisible(sweep); + ui->sweep2StopLabel->setVisible(sweep); + ui->sweep2Stop->setVisible(sweep); + ui->sweep2StepLabel->setVisible(sweep); + ui->sweep2Step->setVisible(sweep); + ui->sweep2DelayLabel->setVisible(sweep); + ui->sweep2Delay->setVisible(sweep); + ui->sweepStatus->setVisible(sweep); + ui->runLayout->activate(); // Needed otherwise height of rollup doesn't seem to be reduced + ui->statusLayout->activate(); // going from sweep to single/continuous + arrangeRollups(); +} + +void RadioAstronomyGUI::on_runMode_currentIndexChanged(int index) +{ + m_settings.m_runMode = (RadioAstronomySettings::RunMode)index; + applySettings(); + displayRunModeSettings(); +} + +void RadioAstronomyGUI::on_sweepType_currentIndexChanged(int index) +{ + m_settings.m_sweepType = (RadioAstronomySettings::SweepType)index; + if ((index == 0) || (index == 2)) + { + ui->sweep1CoordLabel->setText("Az"); + ui->sweep2CoordLabel->setText("El"); + } + else if (index == 1) + { + ui->sweep1CoordLabel->setText("l"); + ui->sweep2CoordLabel->setText("b"); + } +} + +void RadioAstronomyGUI::on_sweep1Start_valueChanged(double value) +{ + m_settings.m_sweep1Start = ui->sweep1Start->value(); + applySettings(); +} + +void RadioAstronomyGUI::on_sweep1Stop_valueChanged(double value) +{ + m_settings.m_sweep1Stop = ui->sweep1Stop->value(); + applySettings(); +} + +void RadioAstronomyGUI::on_sweep1Step_valueChanged(double value) +{ + m_settings.m_sweep1Step = ui->sweep1Step->value(); + applySettings(); +} + +void RadioAstronomyGUI::on_sweep1Delay_valueChanged(double value) +{ + m_settings.m_sweep1Delay = ui->sweep1Delay->value(); + applySettings(); +} + +void RadioAstronomyGUI::on_sweep2Start_valueChanged(double value) +{ + m_settings.m_sweep2Start = ui->sweep2Start->value(); + applySettings(); +} + +void RadioAstronomyGUI::on_sweep2Stop_valueChanged(double value) +{ + m_settings.m_sweep2Stop = ui->sweep2Stop->value(); + applySettings(); +} + +void RadioAstronomyGUI::on_sweep2Step_valueChanged(double value) +{ + m_settings.m_sweep2Step = ui->sweep2Step->value(); + applySettings(); +} + +void RadioAstronomyGUI::on_sweep2Delay_valueChanged(double value) +{ + m_settings.m_sweep2Delay = ui->sweep2Delay->value(); + applySettings(); +} + +void RadioAstronomyGUI::on_sweepStartAtTime_currentIndexChanged(int index) +{ + m_settings.m_sweepStartAtTime = ui->sweepStartAtTime->currentIndex() == 1; + ui->sweepStartDateTime->setVisible(index == 1); + arrangeRollups(); + applySettings(); +} + +void RadioAstronomyGUI::on_sweepStartDateTime_dateTimeChanged(const QDateTime& dateTime) +{ + m_settings.m_sweepStartDateTime = dateTime; + applySettings(); +} + +void RadioAstronomyGUI::on_startStop_clicked(bool checked) +{ + if (checked) + { + ui->startStop->setStyleSheet("QToolButton { background-color : green; }"); + applySettings(); + if (m_settings.m_power2DLinkSweep) + { + update2DSettingsFromSweep(); + create2DImage(); + } + m_radioAstronomy->getInputMessageQueue()->push(RadioAstronomy::MsgStartSweep::create()); + } + else + { + m_radioAstronomy->getInputMessageQueue()->push(RadioAstronomy::MsgStopSweep::create()); + if (m_settings.m_runMode != RadioAstronomySettings::SWEEP) { + ui->startStop->setStyleSheet("QToolButton { background-color : blue; }"); + } + } +} + +void RadioAstronomyGUI::calcPowerChartTickCount(int width) +{ + // These values should probably be dependent on the font used + if (m_powerXAxis) { + if (m_powerXAxisSameDay) { + m_powerXAxis->setTickCount(width > 700 ? 10 : 5); + } else { + m_powerXAxis->setTickCount(width > 1200 ? 10 : 5); + } + } +} + +void RadioAstronomyGUI::calcSpectrumChartTickCount(QValueAxis *axis, int width) +{ + if (axis) { + axis->setTickCount(width > 700 ? 10 : 5); + } +} + +void RadioAstronomyGUI::resizeEvent(QResizeEvent* size) +{ + int width = size->size().width(); + calcPowerChartTickCount(width); + calcSpectrumChartTickCount(m_fftXAxis, width); + calcSpectrumChartTickCount(m_fftDopplerAxis, width); + calcSpectrumChartTickCount(m_calXAxis, width); + ChannelGUI::resizeEvent(size); +} diff --git a/plugins/channelrx/radioastronomy/radioastronomygui.h b/plugins/channelrx/radioastronomy/radioastronomygui.h new file mode 100644 index 000000000..84ce11ed4 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomygui.h @@ -0,0 +1,672 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 Edouard Griffiths, F4EXB // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_RADIOASTRONOMYGUI_H +#define INCLUDE_RADIOASTRONOMYGUI_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "channel/channelgui.h" +#include "dsp/channelmarker.h" +#include "util/messagequeue.h" +#include "util/httpdownloadmanager.h" +#include "pipes/pipeendpoint.h" + +#include "radioastronomysettings.h" +#include "radioastronomy.h" + +class PluginAPI; +class DeviceUISet; +class BasebandSampleSink; +class RadioAstronomy; +class RadioAstronomyGUI; + +namespace Ui { + class RadioAstronomyGUI; +} +class RadioAstronomyGUI; + +using namespace QtCharts; + +class RadioAstronomyGUI : public ChannelGUI { + Q_OBJECT + + struct FFTMeasurement { + QDateTime m_dateTime; + qint64 m_centerFrequency; + int m_sampleRate; + int m_integration; + int m_rfBandwidth; + + int m_fftSize; + Real* m_fftData; + Real* m_db; // dBFS + Real* m_snr; // SNR (noise is cold cal data) + Real* m_temp; // Temp in Kelvin base on hot/cold cal data + Real m_totalPower; // Total power based on sum of fftData (i.e unknown units) + Real m_totalPowerdBFS; // m_totalPower in dB + Real m_totalPowerdBm; // Total power in dBm + Real m_totalPowerWatts; // Total power in Watts + Real m_tSys; // Total temp in K + Real m_tSys0; // Total unwanted noise (E.g. Trx+Tgal..) in K + Real m_tSource; // Estimated source temp (tSys-tSys0) in K + Real m_flux; // Average spectral flux density of source in W m^-2 Hz^-1 + Real m_sigmaT; // Temperature variation + Real m_sigmaS; // Flux variation + Real m_tempMin; // Minimum value in m_temp array + RadioAstronomySettings::SpectrumBaseline m_baseline; + + float m_omegaA; + float m_omegaS; + + bool m_coordsValid; //!< Whether follow variables are valid + float m_ra; + float m_dec; + float m_azimuth; + float m_elevation; + float m_l; + float m_b; + float m_vBCRS; + float m_vLSR; + float m_solarFlux; + float m_airTemp; + float m_skyTemp; + float m_sensor[RADIOASTRONOMY_SENSORS]; + + int m_sweepIndex; + + FFTMeasurement() : + m_fftSize(0), + m_fftData(nullptr), + m_db(nullptr), + m_snr(nullptr), + m_temp(nullptr), + m_totalPower(0.0f), + m_totalPowerdBFS(0.0f), + m_totalPowerdBm(0.0f), + m_totalPowerWatts(0.0f), + m_tSys(0.0f), + m_tSys0(0.0f), + m_tSource(0.0f), + m_flux(0.0f), + m_sigmaT(0.0f), + m_sigmaS(0.0f), + m_tempMin(0.0f), + m_baseline(RadioAstronomySettings::SBL_TSYS0), + m_coordsValid(false), + m_airTemp(0.0), + m_skyTemp(0.0), + m_sweepIndex(0) + { + } + + ~FFTMeasurement() + { + delete[] m_fftData; + delete[] m_db; + delete[] m_snr; + delete[] m_temp; + } + }; + + struct LABData { + + float m_l; + float m_b; + QList m_vlsr; + QList m_temp; + + LABData() : + m_l(0.0f), + m_b(0.0f) + { + } + + void read(QFile* file, float l, float b); + void toSeries(QLineSeries *series); + }; + + struct SensorMeasurement { + + QDateTime m_dateTime; + double m_value; + + SensorMeasurement(QDateTime dateTime, double value) : + m_dateTime(dateTime), + m_value(value) + { + } + }; + + class SensorMeasurements { + + QLineSeries* m_series; + QValueAxis* m_yAxis; + double m_max; + double m_min; + QList m_measurements; + + public: + + SensorMeasurements() : + m_series(nullptr), + m_yAxis(nullptr) + { + } + + void init(const QString& name, bool visible); + void setName(const QString& name); + void clicked(bool checked); + void append(SensorMeasurement *measurement); + void addToSeries(SensorMeasurement *measurement); + void addAllToSeries(); + void clear(); + void addToChart(QChart* chart, QDateTimeAxis* xAxis); + void setPen(const QPen& pen); + QValueAxis* yAxis() const; + qreal lastValue(); + }; + +public: + static RadioAstronomyGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel); + virtual void destroy(); + + void resetToDefaults(); + QByteArray serialize() const; + bool deserialize(const QByteArray& data); + virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + +public slots: + void channelMarkerChangedByCursor(); + void channelMarkerHighlightedByCursor(); + +private: + Ui::RadioAstronomyGUI* ui; + PluginAPI* m_pluginAPI; + DeviceUISet* m_deviceUISet; + ChannelMarker m_channelMarker; + RadioAstronomySettings m_settings; + bool m_doApplySettings; + QList m_availablePipes; + + int m_basebandSampleRate; + quint64 m_centerFrequency; + + RadioAstronomy* m_radioAstronomy; + uint32_t m_tickCount; + MessageQueue m_inputMessageQueue; + + QMenu *powerTableMenu; // Column select context menu + QMenu *copyMenu; + + QChart *m_powerChart; + QLineSeries *m_powerSeries; + QDateTimeAxis *m_powerXAxis; + bool m_powerXAxisSameDay; + QValueAxis *m_powerYAxis; + QScatterSeries *m_powerPeakSeries; + QScatterSeries *m_powerMarkerSeries; + QLineSeries *m_powerTsys0Series; + QLineSeries *m_powerGaussianSeries; + double m_powerMin; // For axis autoscale + double m_powerMax; + bool m_powerPeakValid; + qreal m_powerMinX; // For min peak + qreal m_powerMinY; + qreal m_powerMaxX; // For max peak + qreal m_powerMaxY; + + QChart *m_2DChart; + QValueAxis *m_2DXAxis; + QValueAxis *m_2DYAxis; + float *m_2DMapIntensity; + float m_2DMapMax; + float m_2DMapMin; + QImage m_2DMap; + int m_sweepIndex; + + SensorMeasurements m_airTemps; + SensorMeasurements m_sensors[RADIOASTRONOMY_SENSORS]; + + QChart *m_calChart; + QValueAxis *m_calXAxis; + QValueAxis *m_calYAxis; + + QLineSeries *m_calHotSeries; + QLineSeries *m_calColdSeries; + FFTMeasurement* m_calHot; + FFTMeasurement* m_calCold; + double *m_calG; + + QChart *m_fftChart; + QLineSeries *m_fftSeries; + QLineSeries *m_fftHlineSeries; + QScatterSeries *m_fftPeakSeries; + QScatterSeries *m_fftMarkerSeries; + QLineSeries *m_fftGaussianSeries; + QLineSeries *m_fftLABSeries; + QValueAxis *m_fftXAxis; + QValueAxis *m_fftYAxis; + QValueAxis *m_fftDopplerAxis; + QList m_fftMeasurements; + + // Markers + bool m_powerM1Valid; + bool m_powerM2Valid; + qreal m_powerM1X; + qreal m_powerM1Y; + qreal m_powerM2X; + qreal m_powerM2Y; + bool m_spectrumM1Valid; + bool m_spectrumM2Valid; + qreal m_spectrumM1X; + qreal m_spectrumM1Y; + qreal m_spectrumM2X; + qreal m_spectrumM2Y; + + // Target received from Star Tracker + bool m_coordsValid; + float m_ra; + float m_dec; + float m_azimuth; + float m_elevation; + float m_l; + float m_b; + float m_vBCRS; + float m_vLSR; + float m_solarFlux; + float m_skyTemp; + float m_beamWidth; + + float m_lLAB; // Galactic coords for current LAB data + float m_bLAB; + QString m_filenameLAB; + bool m_downloadingLAB; + QList m_dataLAB; + + QNetworkAccessManager *m_networkManager; + QNetworkRequest m_networkRequest; + HttpDownloadManager m_dlm; + + explicit RadioAstronomyGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0); + virtual ~RadioAstronomyGUI(); + + void blockApplySettings(bool block); + void applySettings(bool force = false); + void displaySettings(); + void displayStreamIndex(); + void displaySpectrumLineFrequency(); + void displayRunModeSettings(); + void updatePipeList(); + void updateRotatorList(); + bool handleMessage(const Message& message); + double degreesToSteradian(double deg) const; + double hpbwToSteradians(double hpbw) const; + double calcOmegaA() const; + double calcOmegaS() const; + double beamFillingFactor() const; + void updateOmegaA(); + void powerMeasurementReceived(FFTMeasurement *fft, bool skipCalcs); + void calCompletetReceived(const RadioAstronomy::MsgCalComplete& measurement); + void calcFFTPower(FFTMeasurement* fft); + void calcFFTTotalPower(FFTMeasurement* fft); + void calcFFTTemperatures(FFTMeasurement* fft); + void calcFFTTotalTemperature(FFTMeasurement* fft); + void calcFFTMinTemperature(FFTMeasurement* fft); + void addFFT(FFTMeasurement *fft, bool skipCalcs=false); + void fftMeasurementReceived(const RadioAstronomy::MsgFFTMeasurement& measurement); + void addToPowerSeries(FFTMeasurement *fft, bool skipCalcs=false); + void plotPowerGaussian(); + void plotSpectrum(); + void plotCalSpectrum(); + void plotCalMeasurements(); + void plotFFTMeasurement(int index); + void plotFFTMeasurement(); + void plotTempGaussian(double startFreq, double freqStep, int steps); + void plotRefLine(FFTMeasurement *fft); + void plotLAB(); + void plotLAB(float l, float b, float beamWidth); + LABData* parseLAB(QFile* file, float l, float b); + int fftSizeToIndex(int size); + double dopplerToVelocity(double centre, double f, FFTMeasurement *fft); + QHash csvHeadersToHash(QStringList cols); + QString csvData(QHash hash, QStringList cols, QString col); + bool hasNeededFFTData(QHash hash); + void saveFFT(QTextStream& out, const FFTMeasurement* fft); + FFTMeasurement* loadFFT(QHash hash, QStringList cols); + void clearData(); + void clearCalData(); + bool deleteRow(int row); + void deleteRowsComplete(bool deletedCurrent, int next); + void calcCalibrationScaleFactors(); + void calibrate(); + void recalibrate(); + void calcGalacticBackgroundTemp(); + void calcAtmosphericTemp(); + void calcCalAvgDiff(); + void calcCalTrx(); + void calcCalTsp(); + void calcAverages(); + void calcFWHM(); + void calcHPBWFromFWHM(); + void calcFHWMFromHPBW(); + void calcColumnDensity(); + qreal calcSeriesFloor(QXYSeries *series, int percent=10); + void calcVrAndDistanceToPeak(double freq, FFTMeasurement *fft, int row); + int calcDistanceToPeak(double vr, float l, float b, double& r, double &d1, double &d2); + void calcDistances(); + void clearLoSMarker(const QString& name); + void updateLoSMarker(const QString& name, float l, float b, float d); + bool losMarkerEnabled(const QString& name); + void showLoSMarker(const QString& name); + void showLoSMarker(int row); + void sensorMeasurementReceived(const RadioAstronomy::MsgSensorMeasurement& measurement); + void updateSpectrumMarkerTableVisibility(); + void updatePowerMarkerTableVisibility(); + void updatePowerChartWidgetsVisibility(); + void updateSpectrumChartWidgetsVisibility(); + void updateSpectrumSelect(); + void updatePowerSelect(); + void spectrumAutoscale(); + void powerAutoscale(); + void calcSpectrumMarkerDelta(); + void calcPowerMarkerDelta(); + void calcPowerPeakDelta(); + QRgb intensityToColor(float intensity); + void set2DAxisTitles(); + void update2DSettingsFromSweep(); + void create2DImage(); + void update2DImage(FFTMeasurement* fft, bool skipCalcs); + void recolour2DImage(); + void power2DAutoscale(); + void powerColourAutoscale(); + void updatePowerColourScaleStep(); + void updateSpectrumMinMax(qreal x, qreal y); + RadioAstronomyGUI::FFTMeasurement* currentFFT(); + void spectrumUpdateXRange(FFTMeasurement* fft = nullptr); + void spectrumUpdateYRange(FFTMeasurement* fft = nullptr); + void updateDistanceColumns(); + void updateBWLimits(); + void updateIntegrationTime(); + void updateTSys0(); + double calcTSys0() const; + double calcTau() const; + double calcTau(const FFTMeasurement* fft) const; + double calcSigmaT(double tSys) const; + double calcSigmaS(double tSys) const; + double calcSigmaT(const FFTMeasurement* fft) const; + double calcSigmaS(const FFTMeasurement* fft) const; + double calcFlux(double Ta, const FFTMeasurement *fft) const; + double calcTSource(FFTMeasurement *fft) const; + void updatePowerColumns(int row, FFTMeasurement* fft); + void calcPowerChartTickCount(int width); + void calcSpectrumChartTickCount(QValueAxis *axis, int width); + int powerYUnitsToIndex(RadioAstronomySettings::PowerYUnits units); + + void leaveEvent(QEvent*); + void enterEvent(QEvent*); + + void resizePowerTable(); + void resizePowerMarkerTable(); + void resizeSpectrumMarkerTable(); + QAction *createCheckableItem(QString& text, int idx, bool checked, const char *slot); + + enum PowerTableCol { + POWER_COL_DATE, + POWER_COL_TIME, + POWER_COL_POWER, + POWER_COL_POWER_DB, + POWER_COL_POWER_DBM, + POWER_COL_TSYS, + POWER_COL_TSYS0, + POWER_COL_TSOURCE, + POWER_COL_TB, + POWER_COL_TSKY, + POWER_COL_FLUX, + POWER_COL_SIGMA_T, + POWER_COL_SIGMA_S, + POWER_COL_OMEGA_A, + POWER_COL_OMEGA_S, + POWER_COL_RA, + POWER_COL_DEC, + POWER_COL_GAL_LON, + POWER_COL_GAL_LAT, + POWER_COL_AZ, + POWER_COL_EL, + POWER_COL_VBCRS, + POWER_COL_VLSR, + POWER_COL_SOLAR_FLUX, + POWER_COL_AIR_TEMP, + POWER_COL_SENSOR_1, + POWER_COL_SENSOR_2 + }; + + enum PowerMarkerTable { + POWER_MARKER_COL_NAME, + POWER_MARKER_COL_DATE, + POWER_MARKER_COL_TIME, + POWER_MARKER_COL_VALUE, + POWER_MARKER_COL_DELTA_X, + POWER_MARKER_COL_DELTA_Y, + POWER_MARKER_COL_DELTA_TO + }; + + enum PowerMarkerRow { + POWER_MARKER_ROW_PEAK_MAX, + POWER_MARKER_ROW_PEAK_MIN, + POWER_MARKER_ROW_M1, + POWER_MARKER_ROW_M2, + POWER_MARKER_ROWS + }; + + enum SpectrumMarkerTable { + SPECTRUM_MARKER_COL_NAME, + SPECTRUM_MARKER_COL_FREQ, + SPECTRUM_MARKER_COL_VALUE, + SPECTRUM_MARKER_COL_DELTA_X, + SPECTRUM_MARKER_COL_DELTA_Y, + SPECTRUM_MARKER_COL_DELTA_TO, + SPECTRUM_MARKER_COL_VR, + SPECTRUM_MARKER_COL_R, + SPECTRUM_MARKER_COL_D, + SPECTRUM_MARKER_COL_PLOT_MAX, + SPECTRUM_MARKER_COL_R_MIN, + SPECTRUM_MARKER_COL_V + }; + + enum SpecrumMarkerRow { + SPECTRUM_MARKER_ROW_PEAK, + SPECTRUM_MARKER_ROW_M1, + SPECTRUM_MARKER_ROW_M2, + SPECTRUM_MARKER_ROWS + }; + +protected: + void resizeEvent(QResizeEvent* size); + +private slots: + void on_deltaFrequency_changed(qint64 value); + void on_sampleRate_changed(qint64 index); + void on_rfBW_changed(qint64 index); + + void on_integration_changed(qint64 value); + void on_fftSize_currentIndexChanged(int index); + void on_fftWindow_currentIndexChanged(int index); + void on_filterFreqs_editingFinished(); + + void on_starTracker_currentTextChanged(const QString& text); + void on_rotator_currentTextChanged(const QString& text); + void on_showSensors_clicked(); + + void on_tempRXSelect_currentIndexChanged(int value); + void on_tempRX_valueChanged(double value); + void on_tempCMB_valueChanged(double value); + void on_tempGal_valueChanged(double value); + void on_tempSP_valueChanged(double value); + void on_tempAtm_valueChanged(double value); + void on_tempAir_valueChanged(double value); + void on_zenithOpacity_valueChanged(double value); + void on_elevation_valueChanged(double value); + void on_tempAtmLink_toggled(bool checked); + void on_tempAirLink_toggled(bool checked); + void on_tempGalLink_toggled(bool checked); + void on_elevationLink_toggled(bool checked); + + void on_gainVariation_valueChanged(double value); + void on_omegaAUnits_currentIndexChanged(int index); + void on_sourceType_currentIndexChanged(int index); + void on_omegaS_valueChanged(double value); + void on_omegaSUnits_currentIndexChanged(int index); + + void on_spectrumChartSelect_currentIndexChanged(int index); + void on_showCalSettings_clicked(); + void on_startCalHot_clicked(); + void on_startCalCold_clicked(); + void on_recalibrate_toggled(bool checked=false); + void on_spectrumShowLegend_toggled(bool checked); + void on_spectrumShowRefLine_toggled(bool checked); + void on_spectrumTemp_toggled(bool checked); + void on_spectrumMarker_toggled(bool checked); + void on_spectrumPeak_toggled(bool checked); + void on_spectrumReverseXAxis_toggled(bool checked); + void on_savePowerData_clicked(); + void on_savePowerChartImage_clicked(); + void on_saveSpectrumData_clicked(); + void on_loadSpectrumData_clicked(); + void on_saveSpectrumChartImage_clicked(); + void on_saveSpectrumChartImages_clicked(); + void on_clearData_clicked(); + void on_clearCal_clicked(); + + void spectrumSeries_clicked(const QPointF &point); + void on_spectrumAutoscale_toggled(bool checked=false); + void on_spectrumAutoscaleX_clicked(); + void on_spectrumAutoscaleY_clicked(); + void on_spectrumReference_valueChanged(double value); + void on_spectrumRange_valueChanged(double value); + void on_spectrumCenterFreq_valueChanged(double value); + void on_spectrumSpan_valueChanged(double value); + void on_spectrumYUnits_currentIndexChanged(int index); + void on_spectrumBaseline_currentIndexChanged(int index); + void on_spectrumIndex_valueChanged(int value); + + void on_spectrumLine_currentIndexChanged(int value); + void on_spectrumLineFrequency_valueChanged(double value); + void on_refFrame_currentIndexChanged(int value); + void on_sunDistanceToGC_valueChanged(double value); + void on_sunOrbitalVelocity_valueChanged(double value); + void spectrumMarkerTableItemChanged(QTableWidgetItem *item); + + void on_spectrumGaussianFreq_valueChanged(double value); + void on_spectrumGaussianAmp_valueChanged(double value); + void on_spectrumGaussianFloor_valueChanged(double value); + void on_spectrumGaussianFWHM_valueChanged(double value); + void on_spectrumGaussianTurb_valueChanged(double value); + void on_spectrumTemperature_valueChanged(double t); + void on_spectrumShowLAB_toggled(bool checked=false); + void on_spectrumShowDistance_toggled(bool checked=false); + + void on_tCalHotSelect_currentIndexChanged(int index); + void on_tCalHot_valueChanged(double value); + void on_tCalColdSelect_currentIndexChanged(int index); + void on_tCalCold_valueChanged(double value); + + void on_powerChartSelect_currentIndexChanged(int index); + void on_powerYUnits_currentIndexChanged(int index); + void on_powerShowMarker_toggled(bool checked); + void on_powerShowTsys0_toggled(bool checked); + void on_powerShowAirTemp_toggled(bool checked); + void on_powerShowSensor1_toggled(bool checked); + void on_powerShowSensor2_toggled(bool checked); + void on_powerShowPeak_toggled(bool checked); + void on_powerShowAvg_toggled(bool checked); + void on_powerShowLegend_toggled(bool checked); + void powerSeries_clicked(const QPointF &point); + + void on_powerAutoscale_toggled(bool checked); + void on_powerAutoscaleY_clicked(); + void on_powerAutoscaleX_clicked(); + void on_powerReference_valueChanged(double value); + void on_powerRange_valueChanged(double value); + void on_powerStartTime_dateTimeChanged(QDateTime value); + void on_powerEndTime_dateTimeChanged(QDateTime value); + + void on_powerShowGaussian_clicked(bool checked=false); + void on_powerGaussianCenter_dateTimeChanged(QDateTime dateTime); + void on_powerGaussianAmp_valueChanged(double value); + void on_powerGaussianFloor_valueChanged(double value); + void on_powerGaussianFWHM_valueChanged(double value); + void on_powerGaussianHPBW_valueChanged(double value); + + void on_runMode_currentIndexChanged(int index); + void on_sweepType_currentIndexChanged(int index); + void on_startStop_clicked(bool checked=false); + void on_sweepStartAtTime_currentIndexChanged(int index); + void on_sweepStartDateTime_dateTimeChanged(const QDateTime& dateTime); + void on_sweep1Start_valueChanged(double value); + void on_sweep1Stop_valueChanged(double value); + void on_sweep1Step_valueChanged(double value); + void on_sweep1Delay_valueChanged(double value); + void on_sweep2Start_valueChanged(double value); + void on_sweep2Stop_valueChanged(double value); + void on_sweep2Step_valueChanged(double value); + void on_sweep2Delay_valueChanged(double value); + + void on_power2DLinkSweep_toggled(bool checked=false); + void on_power2DAutoscale_clicked(); + void on_power2DSweepType_currentIndexChanged(int index); + void on_power2DWidth_valueChanged(int value); + void on_power2DHeight_valueChanged(int value); + void on_power2DXMin_valueChanged(double value); + void on_power2DXMax_valueChanged(double value); + void on_power2DYMin_valueChanged(double value); + void on_power2DYMax_valueChanged(double value); + + void on_powerColourAutoscale_toggled(bool checked=false); + void on_powerColourScaleMin_valueChanged(double value); + void on_powerColourScaleMax_valueChanged(double value); + void on_powerColourPalette_currentIndexChanged(int index); + + void powerTable_sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex); + void powerTable_sectionResized(int logicalIndex, int oldSize, int newSize); + void powerTableColumnSelectMenu(QPoint pos); + void powerTableColumnSelectMenuChecked(bool checked = false); + void on_powerTable_cellDoubleClicked(int row, int column); + + void plotPowerChart(); + void plotPowerVsTimeChart(); + void plot2DChart(); + void plotAreaChanged(const QRectF& plotArea); + void customContextMenuRequested(QPoint point); + void onWidgetRolled(QWidget* widget, bool rollDown); + void onMenuDialogCalled(const QPoint& p); + void handleInputMessages(); + void tick(); + void networkManagerFinished(QNetworkReply *reply); + void downloadFinished(const QString& filename, bool success); +}; + +#endif // INCLUDE_RADIOASTRONOMYGUI_H diff --git a/plugins/channelrx/radioastronomy/radioastronomygui.ui b/plugins/channelrx/radioastronomy/radioastronomygui.ui new file mode 100644 index 000000000..d065346f4 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomygui.ui @@ -0,0 +1,5197 @@ + + + RadioAstronomyGUI + + + + 0 + 0 + 740 + 1688 + + + + + 0 + 0 + + + + + 740 + 0 + + + + + Liberation Sans + 9 + + + + Qt::StrongFocus + + + Radio Astronomy + + + + + + + + 0 + 0 + 731 + 241 + + + + + 350 + 0 + + + + Settings + + + + 3 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + 2 + + + + + + 16 + 0 + + + + Df + + + + + + + + 0 + 0 + + + + + 32 + 16 + + + + + Liberation Mono + 12 + + + + PointingHandCursor + + + Qt::StrongFocus + + + Shift frequency from center in Hz + + + + + + + Hz + + + + + + + Qt::Vertical + + + + + + + SR + + + + + + + + 0 + 0 + + + + + 32 + 16 + + + + + Liberation Mono + 12 + + + + PointingHandCursor + + + Qt::StrongFocus + + + Sample rate in samples per second + + + + + + + Sa/s + + + + + + + Qt::Vertical + + + + + + + Δν + + + + + + + + 0 + 0 + + + + + 32 + 16 + + + + + Liberation Mono + 12 + + + + PointingHandCursor + + + Qt::StrongFocus + + + RF bandwidth in Hertz + + + + + + + Hz + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Channel power + + + Qt::RightToLeft + + + 0.0 + + + + + + + dB + + + + + + + + + + + Qt::Horizontal + + + + + + + + + FFT + + + + + + + Qt::Vertical + + + + + + + Σ + + + + + + + + 0 + 0 + + + + + 32 + 16 + + + + + Liberation Mono + 12 + + + + PointingHandCursor + + + Qt::StrongFocus + + + FFT integration count per measurement + + + + + + + Qt::Vertical + + + + + + + Channels + + + + + + + + 56 + 0 + + + + FFT size (number of bins / channels) + + + + 16 + + + + + 32 + + + + + 64 + + + + + 128 + + + + + 256 + + + + + 512 + + + + + 1k + + + + + 2k + + + + + 4k + + + + + + + + Qt::Vertical + + + + + + + Window + + + + + + + + 56 + 0 + + + + FFT windowing function + + + + None + + + + + Hann + + + + + + + + Qt::Vertical + + + + + + + Filter + + + + + + + List of channels to filter to remove RFI (FFT bin is set to minimum of other bins) + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + t<sub>Σ</sub> + + + + + + + Time taken for a single measurement in seconds or minutes + + + s + + + + + + + + + Qt::Horizontal + + + + + + + + + Star Tracker + + + + + + + + 140 + 0 + + + + Star Tracker feature that sets the observation target + + + + + + + Qt::Vertical + + + + + + + Rotator + + + + + + + + 140 + 0 + + + + Rotator controller for the antenna used for measurement + + + + None + + + + + + + + Qt::Vertical + + + + + + + Sensors + + + + + + + Open sensor settings dialog + + + + + + + :/listing.png:/listing.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + + + + + + + + 0 + 0 + + + + + Trx + + + + + NF + + + + + + + + Receiver noise temperature in Kelvin or noise figure in dB + +This is the combined noise of LNA, feed and SDR + + + 1 + + + 10000.000000000000000 + + + + + + + + 0 + 0 + + + + K + + + + + + + Qt::Vertical + + + + + + + T<sub>CMB</sub> + + + + + + + Cosmic microwave background (CMB) temperature in Kelvin + +This should be 2.73K when pointing at the sky + + + 300.000000000000000 + + + 2.730000000000000 + + + + + + + K + + + + + + + Qt::Vertical + + + + + + + T<sub>Gal</sub> + + + + + + + Frequency dependent Galactic background temperature in Kelvin + + + 1 + + + 9999.000000000000000 + + + 2.000000000000000 + + + + + + + K + + + + + + + Check to automatically update Tgal based on center frequency. Uncheck to manually enter a temperature in Kelvin + + + + + + + :/link.png:/link.png + + + true + + + true + + + + + + + Qt::Vertical + + + + + + + T<sub>SP</sub> + + + + + + + Spillover temperature in Kelvin + + + 1 + + + 1000.000000000000000 + + + + + + + K + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + T<sub>sys0</sub> + + + + + + + System noise temperature in Kelvin assuming no source (i.e. Tsource=0) + + + 0 + + + + + + + K + + + + + + + + + + + T<sub>Atm</sub> + + + + + + + Atmospheric noise temperature in Kelvin + + + 1 + + + 1000.000000000000000 + + + 2.000000000000000 + + + + + + + K + + + + + + + Check to automatically calculate Tatm from Tair, tz and elevation. Uncheck to manually enter a value + + + + + + + :/link.png:/link.png + + + true + + + true + + + + + + + Qt::Vertical + + + + + + + T<sub>Air</sub> + + + + + + + Surface air temperature in degrees celsius + + + 0 + + + -100.000000000000000 + + + 20.000000000000000 + + + + + + + C + + + + + + + Check to automatically update Tair from air temperature from Star Tracker. Uncheck to set manually + + + + + + + :/link.png:/link.png + + + true + + + true + + + + + + + Qt::Vertical + + + + + + + τ<sub>z</sub> + + + + + + + Zenith opacity + + + 4 + + + 100.000000000000000 + + + 0.001000000000000 + + + 0.005500000000000 + + + + + + + Qt::Vertical + + + + + + + El + + + + + + + Elevation angle in degrees + + + 0 + + + 90.000000000000000 + + + 90.000000000000000 + + + + + + + ° + + + + + + + Check to automatically update elevation from Star Tracker. Uncheck to manually enter an elevation in degrees. + + + + + + + :/link.png:/link.png + + + true + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + σT<sub>sys0</sub> + + + + + + + Standard deviation / RMS of Tsys0 + + + 0 + + + + + + + K + + + + + + + + + Qt::Horizontal + + + + + + + + + Baseline + + + + + + + + 56 + 0 + + + + Baseline to subtract from Tsys to calculate Tsource + + + + Tsys0 + + + + + Tmin + + + + + Tcold + + + + + + + + Qt::Vertical + + + + + + + ΔG/G + + + + + + + Gain variation + + + 4 + + + 1000.000000000000000 + + + 0.010000000000000 + + + + + + + Qt::Vertical + + + + + + + HPBW + + + + + + + Antenna half-power beamwidth in degrees or solid angle in steradians from Star Tracker + + + 0 + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + ° + + + + + sr + + + + + + + + Qt::Vertical + + + + + + + Ω<sub>S</sub> + + + + + + + + 80 + 0 + + + + Angular size of source relative to antenna beam + + + 1 + + + + Unknown + + + + + Compact + + + + + Extended + + + + + Sun + + + + + Cas A + + + + + + + + Angle / solid angle subtended by source + + + 5 + + + 0.000010000000000 + + + 180.000000000000000 + + + 0.100000000000000 + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Select degrees to enter source angle or steradians for source solid angle + + + + ° + + + + + sr + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + σS<sub>sys0</sub> + + + + + + + Standard deviation / RMS of flux assuming no source (i.e. Tsource=0) + + + 0 + + + + + + + Jy + + + + + + + + + + + 0 + 270 + 731 + 51 + + + + + 0 + 0 + + + + Run Control + + + + 2 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + true + + + + + + + 1 + + + -360.000000000000000 + + + 360.000000000000000 + + + -5.000000000000000 + + + + + + + Stop + + + + + + + + 70 + 0 + + + + Measurement mode + + + + Single + + + + + Continuous + + + + + Sweep + + + + + + + + Delay in seconds after rotation before measurements starts + + + 1 + + + 1000000.000000000000000 + + + + + + + + 60 + 0 + + + + Coordinates to sweep + + + 0 + + + + Az/El + + + + + l/b + + + + + Offset + + + + + + + + 1 + + + -360.000000000000000 + + + 360.000000000000000 + + + -5.000000000000000 + + + + + + + 1 + + + -360.000000000000000 + + + 360.000000000000000 + + + 5.000000000000000 + + + + + + + Clear data + + + + + + + :/bin.png:/bin.png + + + + + + + Settle + + + + + + + El + + + + + + + Start + + + + + + + 1 + + + -360.000000000000000 + + + 360.000000000000000 + + + 5.000000000000000 + + + + + + + 1 + + + -180.000000000000000 + + + 180.000000000000000 + + + 5.000000000000000 + + + + + + + Az + + + + + + + Delay + + + + + + + Delay in seconds after a measurement before the next step starts + + + 1 + + + 1000000.000000000000000 + + + + + + + Start + + + + + + + + 56 + 0 + + + + When to start the sweep + + + + Now + + + + + At + + + + + + + + 1 + + + -360.000000000000000 + + + 360.000000000000000 + + + 5.000000000000000 + + + + + + + Stop + + + + + + + Start/stop measurements + + + + + + + :/play.png + :/stop.png:/play.png + + + + + + + Step + + + + + + + Step + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 120 + 16777215 + + + + Measurement status + + + 0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Sweep status + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + + + 0 + 350 + 731 + 631 + + + + + 0 + 0 + + + + + 200 + 320 + + + + Spectrometer + + + + 2 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + + + Select data to plot on chart + + + + Spectrum + + + + + Cal spectrum + + + + + + + + + 56 + 0 + + + + Spectrum Y axis units + + + + dBFS + + + + + SNR + + + + + dBm + + + + + Tsys K + + + + + Tsource K + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Open calibration settings dialog + + + + + + + :/listing.png:/listing.png + + + + + + + Clear calibration data + + + + + + + :/bin.png:/bin.png + + + + + + + Start hot calibration + + + + + + + :/radioastronomy/icons/hot.png:/radioastronomy/icons/hot.png + + + + + + + Start cold calibration + + + + + + + :/radioastronomy/icons/cold.png:/radioastronomy/icons/cold.png + + + + + + + Recalibrate all measurements when checked. Only use calibration for new measurements when unchecked. + + + + + + + :/recycle.png:/recycle.png + + + true + + + false + + + + + + + Display legend + + + + + + + :/radioastronomy/icons/legend.png:/radioastronomy/icons/legend.png + + + true + + + false + + + + + + + Download and plot LAB survey data for the corresponding Galactic latitude and longitude + + + + + + + :/radioastronomy/icons/lab.png:/radioastronomy/icons/lab.png + + + true + + + false + + + + + + + Calculate and plot distance to gas clouds + + + + + + + :/radioastronomy/icons/galactictriangle.png:/radioastronomy/icons/galactictriangle.png + + + true + + + false + + + + + + + Display reference spectral line + + + + + + + :/radioastronomy/icons/refline.png:/radioastronomy/icons/refline.png + + + true + + + false + + + + + + + Display Gaussian fitting tools + + + + + + + :/radioastronomy/icons/gaussian.png:/radioastronomy/icons/gaussian.png + + + true + + + false + + + + + + + Display markers + + + + + + + :/radioastronomy/icons/marker.png:/radioastronomy/icons/marker.png + + + true + + + false + + + + + + + Display peak data + + + + + + + :/radioastronomy/icons/peak.png:/radioastronomy/icons/peak.png + + + true + + + false + + + + + + + Reverse X axis + + + + + + + :/radioastronomy/icons/reverse.png:/radioastronomy/icons/reverse.png + + + true + + + false + + + + + + + Save charts to an animation file + + + + + + + :/camera.png:/camera.png + + + + + + + Save chart to an image file + + + + + + + :/picture.png:/picture.png + + + + + + + Load data from a .csv file + + + + + + + :/load.png:/load.png + + + + + + + Save data to a .csv file + + + + + + + :/save.png:/save.png + + + + + + + + + + 200 + 275 + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Continuously scale X and Y axis so all data is visible + + + + + + A + + + true + + + + + + + + 0 + 0 + + + + Set X scale to fit all data + + + Autoscale spectrum + + + X + + + false + + + + + + + + 0 + 0 + + + + Set Y scale to fit all data + + + Autoscale spectrum + + + Y + + + false + + + + + + + Ref + + + + + + + Spectrum reference level (Y axis maximum value) + + + 1 + + + -150.000000000000000 + + + 10000000000000.000000000000000 + + + + + + + Range + + + + + + + Spectrum Y axis range + + + 1 + + + 0.100000000000000 + + + 10000000000000.000000000000000 + + + + + + + CF + + + + + + + Spectrum X axis center frequency in MHz + + + 3 + + + 0.000000000000000 + + + 20000.000000000000000 + + + 0.100000000000000 + + + + + + + Span + + + + + + + Spectrum X axis range in MHz + + + 2 + + + 0.010000000000000 + + + 100.000000000000000 + + + 0.100000000000000 + + + + + + + Sel + + + + + + + + 80 + 0 + + + + Object to select when clicking on the chart + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Date & time + + + + + + + Select spectrum + + + 0 + + + 1 + + + Qt::Horizontal + + + + + + + true + + + Date and time the spectrum was recorded + + + true + + + QAbstractSpinBox::NoButtons + + + dd/MM/yyyy HH:mm:ss + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Line + + + + + + + Reference spectral line + + + + HI + + + + + OH + + + + + DI + + + + + Custom + + + + + + + + Reference spectral line frequency in MHz + + + 6 + + + 20000.000000000000000 + + + 1420.404999999999973 + + + + + + + MHz + + + + + + + Qt::Vertical + + + + + + + Ref + + + + + + + Reference frame for velocities + + + + Topo + + + + + BCRS + + + + + LSR + + + + + + + + Qt::Vertical + + + + + + + R☉ + + + + + + + Distance from Sun to Galactic center in kiloparsec. Estimates range from 7.4 to 8.7 + + + 1 + + + 7.000000000000000 + + + 9.000000000000000 + + + 0.100000000000000 + + + 8.100000000000000 + + + + + + + kpc + + + + + + + Qt::Vertical + + + + + + + V☉ + + + + + + + Sun's orbital velocity around the Galactic Center in km/s. Typical values are 220 and 248 + + + 0 + + + 100.000000000000000 + + + 300.000000000000000 + + + 248.000000000000000 + + + + + + + km/s + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + f<sub>0</sub> + + + + + + + Centre frequency of Gaussian in MHz. Click on chart to set. + + + 3 + + + 20000.000000000000000 + + + 0.010000000000000 + + + 1420.404999999999973 + + + + + + + MHz + + + + + + + Qt::Vertical + + + + + + + a + + + + + + + Gaussian amplitude + + + 2 + + + 0.010000000000000 + + + 10000000.000000000000000 + + + + + + + f + + + + + + + Gaussian floor (minimum value) + + + 2 + + + -10000000.000000000000000 + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + + Qt::Vertical + + + + + + + Δf<sub>FWHM</sub> + + + + + + + Frequency difference at full width half maximum in Hertz + + + 0 + + + 0.000000000000000 + + + 1000000.000000000000000 + + + 84774.000000000000000 + + + + + + + Hz + + + + + + + Qt::Vertical + + + + + + + T<sub>K</sub> + + + + + + + Kinetic temperature in Kelvin + +CNM 50-100 +WNM 5000-10000 + + + 0 + + + 100000.000000000000000 + + + 100.000000000000000 + + + 6680.000000000000000 + + + + + + + K + + + + + + + Qt::Vertical + + + + + + + v<sub>t</sub> + + + + + + + RMS of turbulent velocity in km/s + + + 1 + + + 1000000.000000000000000 + + + 2.400000000000000 + + + + + + + km/s + + + + + + + Qt::Vertical + + + + + + + N<sub>H</sub> + + + + + + + Column density (cm<sup>-2</sup>) + + + true + + + + + + + cm<sup>-2</sup> + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + Tcold + + + + + Pcold + + + + + + + + Cold calibration antenna temperature in Kelvin or total channel power in dBm + + + 1 + + + -200.000000000000000 + + + 10000000000000.000000000000000 + + + 10.000000000000000 + + + + + + + K + + + + + + + Qt::Vertical + + + + + + + + Thot + + + + + Phot + + + + + + + + Hot calibration antenna temperature in Kelvin or total channel power in dBm + + + 1 + + + -200.000000000000000 + + + 10000000000000.000000000000000 + + + 120.000000000000000 + + + + + + + K + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Avg Δ + + + + + + + Average difference in dB between hot and cold. + +This should be close to the expected difference in power between hot and cold calibration points + + + true + + + + + + + dB + + + + + + + Qt::Vertical + + + + + + + y + + + + + + + Y-factor + + + + + + + Qt::Vertical + + + + + + + T<sub>rx</sub> + + + + + + + Receiver noise temperature in Kelvin calculated from Y-factor + + + true + + + + + + + K + + + + + + + Qt::Vertical + + + + + + + T<sub>sky</sub> + + + + + + + Sky temperature in Kelvin at time of cold calibration from StarTracker + + + + + + + K + + + + + + + Qt::Vertical + + + + + + + T<sub>SP</sub> + + + + + + + Estimated spillover temperature in Kelvin + + + true + + + + + + + K + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + QAbstractScrollArea::AdjustToContents + + + QAbstractItemView::NoEditTriggers + + + true + + + 0 + + + false + + + + Name + + + Marker name + + + + + Freq (MHz) + + + Frequency in MHz + + + + + Power (dBFS) + + + + + ΔX (MHz) + + + + + ΔY + + + + + ΔTo + + + + + Vr (km/s) + + + Radial velocity in km/s + + + + + R (kpc) + + + Distance to Galactic center in kiloparsec + + + + + d (kpc) + + + Distance from observer in kiloparsec + + + + + Plot max + + + Check to plot maximum of two solutions for d in Star Tracker + + + + + Rmin (kpc) + + + Minimum distance to Galactic center along the line-of-slight in kiloparsec + + + + + Vmax (km/s) + + + Orbital velocity at minimum distance to Galactic Centre along line-of-sight in km/s + + + + + + + + + + + + + 0 + 990 + 731 + 481 + + + + + 0 + 0 + + + + + 200 + 230 + + + + Radiometer + + + + 2 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + + + Select data to plot on chart + + + + Power vs time + + + + + Tsys vs time + + + + + Tsource vs time + + + + + Flux vs time + + + + + 2D map + + + + + + + + + 60 + 0 + + + + + dBFS + + + + + dBm + + + + + Watts + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Display legend + + + + + + + :/radioastronomy/icons/legend.png:/radioastronomy/icons/legend.png + + + true + + + true + + + + + + + Plot sensor 2 data + + + + + + + :/slot2_on.png:/slot2_on.png + + + true + + + true + + + + + + + Plot sensor 1 data + + + + + + + :/slot1_on.png:/slot1_on.png + + + true + + + true + + + + + + + Plot air temperature data + + + + + + + :/radioastronomy/icons/temperature.png:/radioastronomy/icons/temperature.png + + + true + + + true + + + + + + + Plot Tsys0 + + + + + + + :/radioastronomy/icons/noise.png:/radioastronomy/icons/noise.png + + + true + + + true + + + + + + + Display mean, RMS and standard deviation + + + σ + + + true + + + true + + + + + + + Display Gaussian fitting tools + + + + + + + :/radioastronomy/icons/gaussian.png:/radioastronomy/icons/gaussian.png + + + true + + + false + + + + + + + Display markers + + + + + + + :/radioastronomy/icons/marker.png:/radioastronomy/icons/marker.png + + + true + + + true + + + + + + + Display peak data + + + + + + + :/radioastronomy/icons/peak.png:/radioastronomy/icons/peak.png + + + true + + + true + + + + + + + Save chart to an image file + + + + + + + :/picture.png:/picture.png + + + + + + + Save data to a .csv file + + + + + + + :/save.png:/save.png + + + + + + + + + + 200 + 200 + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Continuously scale X and Y axis so all data is visible + + + Autoscale spectrum + + + A + + + true + + + + + + + + 0 + 0 + + + + Set X scale to fit all data + + + Autoscale spectrum + + + X + + + false + + + + + + + + 0 + 0 + + + + Set Y scale to fit all data + + + Autoscale spectrum + + + Y + + + false + + + + + + + Ref + + + + + + + Reference level (Y axis maximum value) + + + 1 + + + -150.000000000000000 + + + 10000000000000.000000000000000 + + + + + + + Range + + + + + + + Y axis range + + + 1 + + + 0.100000000000000 + + + 10000000000000.000000000000000 + + + + + + + Start + + + + + + + X axis start time + + + + + + + End + + + + + + + X axis end time + + + + + + + Sel + + + + + + + + 80 + 0 + + + + Object to select when clicking on the chart + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 2 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Center + + + + + + + Date and time (x axis value) of the center of the Gaussian + + + dd/MM/yyyy HH:mm:ss + + + + + + + Qt::Vertical + + + + + + + a + + + + + + + Gaussian amplitude + + + 2 + + + 0.010000000000000 + + + 10000000.000000000000000 + + + + + + + f + + + + + + + Gaussian floor (minimum value) + + + 2 + + + -10000000.000000000000000 + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + + Qt::Vertical + + + + + + + Δt<sub>FWHM</sub> + + + + + + + Time difference at full width half maximum in seconds + + + 0 + + + 0.000000000000000 + + + 10000000.000000000000000 + + + 10.000000000000000 + + + 1350.000000000000000 + + + + + + + s + + + + + + + Qt::Vertical + + + + + + + HPBW + + + + + + + Antenna half-power beam width in degrees assuming a drift-scan of the Sun with a radiation pattern matching the Gaussian + + + 1 + + + 0.100000000000000 + + + 180.000000000000000 + + + 0.100000000000000 + + + 5.000000000000000 + + + + + + + ° + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 6 + + + 2 + + + + + Width of map image in pixels + + + 0 + + + 1000 + + + 0 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Width of map image in pixels + + + 0 + + + 1000 + + + 0 + + + + + + + Minimum value for X axis + + + 1 + + + -360.000000000000000 + + + 360.000000000000000 + + + + + + + Check to automatically update map dimensions when a sweep starts + + + + + + + :/link.png:/link.png + + + true + + + true + + + + + + + Maximum value for X axis + + + 1 + + + -360.000000000000000 + + + 400.000000000000000 + + + + + + + Height + + + + + + + to + + + + + + + Width + + + + + + + Y Range + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + ° + + + + + + + Maximum value for Y axis + + + 1 + + + -180.000000000000000 + + + 180.000000000000000 + + + + + + + + 0 + 0 + + + + Automatically scale axes range based on data in radiometer table + + + + + + A + + + false + + + + + + + Minimum value for Y axis + + + 1 + + + -180.000000000000000 + + + 180.000000000000000 + + + + + + + ° + + + + + + + X Range + + + + + + + ° + + + + + + + ° + + + + + + + + Az/El + + + + + l/b + + + + + Offset + + + + + + + + to + + + + + + + + + + Qt::Horizontal + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Automatically scale colour gradient to range from minimum and maximum values + + + + + + A + + + true + + + + + + + Qt::Vertical + + + + + + + Min + + + + + + + 1 + + + -1000000.000000000000000 + + + 1000000.000000000000000 + + + + + + + dB + + + + + + + Qt::Vertical + + + + + + + Max + + + + + + + 1 + + + -1000000.000000000000000 + + + 1000000.000000000000000 + + + + + + + dB + + + + + + + Qt::Vertical + + + + + + + + Colour + + + + + Greyscale + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + QAbstractScrollArea::AdjustToContents + + + QAbstractItemView::NoEditTriggers + + + true + + + 0 + + + false + + + + Name + + + Marker name + + + + + Date + + + Date of measurement + + + + + Time + + + Time of measurement + + + + + Power (dBFS) + + + Value of measurement + + + + + ΔX + + + Time difference between markers (d hh:mm:ss) + + + + + ΔY + + + Difference in Y values between markers + + + + + ΔTo + + + Which marker the delta values are to + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Mean + + + + + + + Arithmetic mean (average) + + + + + + + RMS + + + + + + + Root mean squared + + + + + + + σ + + + + + + + Standard deviation + + + + + + + + + + + + 10 + 1490 + 721 + 171 + + + + + 0 + 0 + + + + Radiometer Data + + + + 2 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::SelectRows + + + + Date + + + Date of measurement + + + + + Time + + + Time measurement finished + + + + + Power (FFT) + + + Measured power (Sum of FFT absolute magnitude) + + + + + Power (dBFS) + + + Measured power (dBFS) + + + + + Power (dBm) + + + Measured power (dBm) + + + + + Tsys (K) + + + Measured system noise temperature in Kelvin + + + + + Tsys0 (K) + + + System noise temperature in Kelvin assuming no source (i.e. Tsource=0) + + + + + Tsource (K) + + + Estimation of noise temperature contribution from astronomical source in Kelvin (Tsource=Tsys-Tsys0) + + + + + Tb (K) + + + Brightness temperature of source in Kelvin + + + + + Tsky (K) + + + Sky temperature in Kelvin towards target from Star Tracker + + + + + Sν (Jy) + + + Spectral flux density in Jansky + + + + + σTsys (K) + + + Standard deviation / RMS of temperature in Kelvin due to random fluctuations + + + + + σSsys (Jy) + + + Standard deviation / RMS of flux in Jansky due to random fluctuations + + + + + ΩA (sr) + + + Antenna solid angle in steradians + + + + + ΩS (sr) + + + Source solid angle in steradians + + + + + RA + + + Right ascension + + + + + Dec + + + Declination + + + + + l + + + Galactic latitude in degrees + + + + + b + + + Galactic longitude in degrees + + + + + Az + + + Azimuth in degrees + + + + + El + + + Elevation in degrees + + + + + Vbcrs + + + Velocity towards RA/Dec relative to barycentric reference frame (km/s) + + + + + Vlsr + + + Velocity towards RA/Dec relative to local standard of rest (km/s) + + + + + Solar Flux (Jy) + + + Solar flux in Jansky from Star Tracker + + + + + Air Temp (C) + + + Surface air temperature in degrees Celsius from Star Tracker + + + + + Sensor 1 + + + Sensor 1 data + + + + + Sensor 2 + + + Sensor 2 data + + + + + + + + + + RollupWidget + QWidget +

    gui/rollupwidget.h
    + 1 + + + ValueDialZ + QWidget +
    gui/valuedialz.h
    + 1 +
    + + ButtonSwitch + QToolButton +
    gui/buttonswitch.h
    +
    + + QChartView + QGraphicsView +
    QtCharts
    +
    + + WrappingDateTimeEdit + QDateTimeEdit +
    gui/wrappingdatetimeedit.h
    + 1 +
    + + + powerMean + powerRMS + powerSD + powerTable + fftSize + fftWindow + filterFreqs + starTracker + rotator + showSensors + tempRXSelect + tempRX + tempCMB + tempGal + tempGalLink + tempSP + tempAtm + tempAtmLink + tempAir + tempAirLink + zenithOpacity + elevation + elevationLink + gainVariation + sourceType + omegaS + omegaSUnits + startStop + clearData + runMode + sweepStartAtTime + sweepType + sweep1Start + sweep1Stop + sweep1Step + sweep1Delay + sweepStartDateTime + sweep2Start + sweep2Stop + sweep2Step + sweep2Delay + spectrumChartSelect + spectrumYUnits + clearCal + integration + startCalHot + startCalCold + recalibrate + deltaFrequency + spectrumShowLegend + spectrumShowLAB + spectrumShowDistance + rfBW + spectrumShowRefLine + spectrumTemp + spectrumMarker + spectrumPeak + powerChart + spectrumReverseXAxis + saveSpectrumChartImages + saveSpectrumChartImage + loadSpectrumData + saveSpectrumData + spectrumChart + spectrumAutoscale + sampleRate + spectrumAutoscaleX + spectrumAutoscaleY + spectrumReference + spectrumRange + spectrumCenterFreq + spectrumSpan + spectrumSelect + spectrumIndex + spectrumDateTime + spectrumLine + spectrumLineFrequency + refFrame + sunDistanceToGC + sunOrbitalVelocity + spectrumGaussianFreq + spectrumGaussianAmp + spectrumGaussianFloor + spectrumGaussianFWHM + spectrumTemperature + spectrumGaussianTurb + columnDensity + tCalColdSelect + tCalCold + tCalHotSelect + tCalHot + calAvgDiff + calYFactor + calTrx + calTsky + calTsp + spectrumMarkerTable + powerChartSelect + powerYUnits + powerShowLegend + powerShowSensor2 + powerShowSensor1 + powerShowAirTemp + powerShowTsys0 + powerShowAvg + powerShowGaussian + powerShowMarker + powerShowPeak + savePowerChartImage + savePowerData + powerAutoscale + powerAutoscaleX + powerAutoscaleY + powerReference + powerRange + powerStartTime + powerEndTime + powerSelect + powerGaussianCenter + powerGaussianAmp + powerGaussianFloor + powerGaussianFWHM + powerGaussianHPBW + power2DLinkSweep + power2DSweepType + power2DWidth + power2DXMin + power2DXMax + power2DAutoscale + power2DHeight + power2DYMin + power2DYMax + powerColourAutoscale + powerColourScaleMin + powerColourScaleMax + powerColourPalette + powerMarkerTable + + + + + + + diff --git a/plugins/channelrx/radioastronomy/radioastronomyplugin.cpp b/plugins/channelrx/radioastronomy/radioastronomyplugin.cpp new file mode 100644 index 000000000..8c2661b55 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomyplugin.cpp @@ -0,0 +1,92 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 Edouard Griffiths, F4EXB // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include +#include "plugin/pluginapi.h" + +#ifndef SERVER_MODE +#include "radioastronomygui.h" +#endif +#include "radioastronomy.h" +#include "radioastronomywebapiadapter.h" +#include "radioastronomyplugin.h" + +const PluginDescriptor RadioAstronomyPlugin::m_pluginDescriptor = { + RadioAstronomy::m_channelId, + QStringLiteral("Radio Astronomy"), + QStringLiteral("6.17.0"), + QStringLiteral("(c) Jon Beniston, M7RCE"), + QStringLiteral("https://github.com/f4exb/sdrangel"), + true, + QStringLiteral("https://github.com/f4exb/sdrangel") +}; + +RadioAstronomyPlugin::RadioAstronomyPlugin(QObject* parent) : + QObject(parent), + m_pluginAPI(0) +{ +} + +const PluginDescriptor& RadioAstronomyPlugin::getPluginDescriptor() const +{ + return m_pluginDescriptor; +} + +void RadioAstronomyPlugin::initPlugin(PluginAPI* pluginAPI) +{ + m_pluginAPI = pluginAPI; + + m_pluginAPI->registerRxChannel(RadioAstronomy::m_channelIdURI, RadioAstronomy::m_channelId, this); +} + +void RadioAstronomyPlugin::createRxChannel(DeviceAPI *deviceAPI, BasebandSampleSink **bs, ChannelAPI **cs) const +{ + if (bs || cs) + { + RadioAstronomy *instance = new RadioAstronomy(deviceAPI); + + if (bs) { + *bs = instance; + } + + if (cs) { + *cs = instance; + } + } +} + +#ifdef SERVER_MODE +ChannelGUI* RadioAstronomyPlugin::createRxChannelGUI( + DeviceUISet *deviceUISet, + BasebandSampleSink *rxChannel) const +{ + (void) deviceUISet; + (void) rxChannel; + return 0; +} +#else +ChannelGUI* RadioAstronomyPlugin::createRxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel) const +{ + return RadioAstronomyGUI::create(m_pluginAPI, deviceUISet, rxChannel); +} +#endif + +ChannelWebAPIAdapter* RadioAstronomyPlugin::createChannelWebAPIAdapter() const +{ + return new RadioAstronomyWebAPIAdapter(); +} diff --git a/plugins/channelrx/radioastronomy/radioastronomyplugin.h b/plugins/channelrx/radioastronomy/radioastronomyplugin.h new file mode 100644 index 000000000..edd1b1697 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomyplugin.h @@ -0,0 +1,49 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 Edouard Griffiths, F4EXB // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_RADIOASTRONOMYPLUGIN_H +#define INCLUDE_RADIOASTRONOMYPLUGIN_H + +#include +#include "plugin/plugininterface.h" + +class DeviceUISet; +class BasebandSampleSink; + +class RadioAstronomyPlugin : public QObject, PluginInterface { + Q_OBJECT + Q_INTERFACES(PluginInterface) + Q_PLUGIN_METADATA(IID "sdrangel.channel.radioastronomy") + +public: + explicit RadioAstronomyPlugin(QObject* parent = NULL); + + const PluginDescriptor& getPluginDescriptor() const; + void initPlugin(PluginAPI* pluginAPI); + + virtual void createRxChannel(DeviceAPI *deviceAPI, BasebandSampleSink **bs, ChannelAPI **cs) const; + virtual ChannelGUI* createRxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel) const; + virtual ChannelWebAPIAdapter* createChannelWebAPIAdapter() const; + +private: + static const PluginDescriptor m_pluginDescriptor; + + PluginAPI* m_pluginAPI; +}; + +#endif // INCLUDE_RADIOASTRONOMYPLUGIN_H diff --git a/plugins/channelrx/radioastronomy/radioastronomysensordialog.cpp b/plugins/channelrx/radioastronomy/radioastronomysensordialog.cpp new file mode 100644 index 000000000..cbea748b8 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomysensordialog.cpp @@ -0,0 +1,68 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include + +#include "util/visa.h" + +#include "radioastronomysensordialog.h" + +RadioAstronomySensorDialog::RadioAstronomySensorDialog(RadioAstronomySettings *settings, QWidget* parent) : + QDialog(parent), + m_settings(settings), + ui(new Ui::RadioAstronomySensorDialog) +{ + ui->setupUi(this); + ui->sensor1Enabled->setChecked(settings->m_sensorEnabled[0]); + ui->sensor1Name->setText(settings->m_sensorName[0]); + ui->sensor1Device->setText(settings->m_sensorDevice[0]); + ui->sensor1Init->setPlainText(settings->m_sensorInit[0]); + ui->sensor1Measure->setText(settings->m_sensorMeasure[0]); + ui->sensor2Enabled->setChecked(settings->m_sensorEnabled[1]); + ui->sensor2Name->setText(settings->m_sensorName[1]); + ui->sensor2Device->setText(settings->m_sensorDevice[1]); + ui->sensor2Init->setPlainText(settings->m_sensorInit[1]); + ui->sensor2Measure->setText(settings->m_sensorMeasure[1]); + ui->period->setValue(settings->m_sensorMeasurePeriod); + VISA visa; + if (!visa.isAvailable()) + { + ui->sensor1Group->setEnabled(false); + ui->sensor2Group->setEnabled(false); + } +} + +RadioAstronomySensorDialog::~RadioAstronomySensorDialog() +{ + delete ui; +} + +void RadioAstronomySensorDialog::accept() +{ + m_settings->m_sensorEnabled[0] = ui->sensor1Enabled->isChecked(); + m_settings->m_sensorName[0] = ui->sensor1Name->text().trimmed(); + m_settings->m_sensorDevice[0] = ui->sensor1Device->text().trimmed(); + m_settings->m_sensorInit[0] = ui->sensor1Init->toPlainText(); + m_settings->m_sensorMeasure[0] = ui->sensor1Measure->text().trimmed(); + m_settings->m_sensorEnabled[1] = ui->sensor2Enabled->isChecked(); + m_settings->m_sensorName[1] = ui->sensor2Name->text().trimmed(); + m_settings->m_sensorDevice[1] = ui->sensor2Device->text().trimmed(); + m_settings->m_sensorInit[1] = ui->sensor2Init->toPlainText(); + m_settings->m_sensorMeasure[1] = ui->sensor2Measure->text().trimmed(); + m_settings->m_sensorMeasurePeriod = ui->period->value(); + QDialog::accept(); +} diff --git a/plugins/channelrx/radioastronomy/radioastronomysensordialog.h b/plugins/channelrx/radioastronomy/radioastronomysensordialog.h new file mode 100644 index 000000000..267574b4f --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomysensordialog.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_RADIOASTRONOMYSENSORDIALOG_H +#define INCLUDE_RADIOASTRONOMYSENSORDIALOG_H + +#include "ui_radioastronomysensordialog.h" +#include "radioastronomysettings.h" + +class RadioAstronomySensorDialog : public QDialog { + Q_OBJECT + +public: + explicit RadioAstronomySensorDialog(RadioAstronomySettings *settings, QWidget* parent = 0); + ~RadioAstronomySensorDialog(); + + RadioAstronomySettings *m_settings; + +private slots: + void accept(); + +private: + Ui::RadioAstronomySensorDialog* ui; +}; + +#endif // INCLUDE_RADIOASTRONOMYSENSORDIALOG_H diff --git a/plugins/channelrx/radioastronomy/radioastronomysensordialog.ui b/plugins/channelrx/radioastronomy/radioastronomysensordialog.ui new file mode 100644 index 000000000..34d524cc7 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomysensordialog.ui @@ -0,0 +1,251 @@ + + + RadioAstronomySensorDialog + + + + 0 + 0 + 514 + 746 + + + + + Liberation Sans + 9 + + + + Sensor Control Settings + + + + + + + 0 + 0 + + + + + + + Sensor 1 + + + + + + + + + Device + + + + + + + Init + + + + + + + + + + Measure + + + + + + + + + + Name + + + + + + + + + + Enabled + + + + + + + Check to enable measurements from this device + + + + + + + + + + + + + Sensor 2 + + + + + + Device + + + + + + + Init + + + + + + + + + + Enabled + + + + + + + Name + + + + + + + Measure + + + + + + + + + + + + + + + + Check to enable measurements from this device + + + + + + + + + + + + + Timing + + + + + + Measurement period (seconds) + + + + + + + Delay in seconds between measurements being made + + + 3 + + + 0.001000000000000 + + + 100.000000000000000 + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + period + + + + + + + buttonBox + accepted() + RadioAstronomySensorDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + RadioAstronomySensorDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/plugins/channelrx/radioastronomy/radioastronomysettings.cpp b/plugins/channelrx/radioastronomy/radioastronomysettings.cpp new file mode 100644 index 000000000..fe03f8cfa --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomysettings.cpp @@ -0,0 +1,491 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2015 Edouard Griffiths, F4EXB. // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include + +#include "dsp/dspengine.h" +#include "util/simpleserializer.h" +#include "settings/serializable.h" +#include "radioastronomysettings.h" + +const QStringList RadioAstronomySettings::m_pipeTypes = { + QStringLiteral("StarTracker") +}; + +const QStringList RadioAstronomySettings::m_pipeURIs = { + QStringLiteral("sdrangel.feature.startracker") +}; + +RadioAstronomySettings::RadioAstronomySettings() : + m_channelMarker(0) +{ + resetToDefaults(); +} + +void RadioAstronomySettings::resetToDefaults() +{ + m_inputFrequencyOffset = 0; + m_sampleRate = 1000000; + m_rfBandwidth = 1000000; + m_integration = 4000; + m_fftSize = 256; + m_fftWindow = HAN; + m_filterFreqs = ""; + + m_starTracker = ""; + m_rotator = "None"; + + m_tempRX = 75.0f; + m_tempCMB = 2.73; + m_tempGal = 2.0; + m_tempSP = 85.0; + m_tempAtm = 2.0; + m_tempAir = 15.0; + m_zenithOpacity = 0.0055; + m_elevation = 90.0; + m_tempGalLink = true; + m_tempAtmLink = true; + m_tempAirLink = true; + m_elevationLink = true; + + m_gainVariation = 0.0011f; + m_sourceType = UNKNOWN; + m_omegaS = 0.0; + m_omegaSUnits = DEGREES; + m_omegaAUnits = DEGREES; + + m_spectrumPeaks = false; + m_spectrumMarkers = false; + m_spectrumTemp = false; + m_spectrumReverseXAxis = false; + m_spectrumRefLine = false; + m_spectrumLAB = false; + m_spectrumDistance = false; + m_spectrumLegend = false; + m_spectrumReference = 0.0f; + m_spectrumRange = 120.0f; + m_spectrumCenterFreqOffset = 0.0f; + m_spectrumAutoscale = true; + m_spectrumSpan = 1.0f; + m_spectrumYScale = SY_DBFS; + m_spectrumBaseline = SBL_TSYS0; + m_recalibrate = false; + m_tCalHot = 300.0f; + m_tCalCold = 10.0f; + m_line = HI; + m_lineCustomFrequency = 0.0f; + m_refFrame = LSR; + + m_powerAutoscale = true; + m_powerReference = 0.0f; + m_powerRange = 100.0f; + m_powerPeaks = false; + m_powerMarkers = false; + m_powerAvg = false; + m_powerLegend = false; + m_powerYData = PY_POWER; + m_powerYUnits = PY_DBFS; + m_powerShowTsys0 = false; + m_powerShowAirTemp = false; + m_powerShowGaussian = false; + + m_power2DLinkSweep = true; + m_power2DSweepType = SWP_OFFSET; + m_power2DHeight = 3; + m_power2DWidth = 3; + m_power2DXMin = 0; + m_power2DXMax = 10; + m_power2DYMin = 0; + m_power2DYMax = 10; + m_powerColourAutoscale = true; + m_powerColourScaleMin = 0.0f; + m_powerColourScaleMax = 0.0f; + m_powerColourPalette = "Colour"; + + m_sensorName[0] = "Temperature"; + m_sensorDevice[0] = ""; + m_sensorInit[0] = "UNIT:TEMP C"; + m_sensorMeasure[0] = "MEAS:TEMP?"; + m_sensorEnabled[0] = false; + m_sensorVisible[0] = false; + m_sensorName[1] = "Voltage"; + m_sensorDevice[1] = ""; + m_sensorInit[1] = ""; + m_sensorMeasure[1] = "MEAS:VOLT:DC?"; + m_sensorEnabled[1] = false; + m_sensorVisible[1] = false; + m_sensorMeasurePeriod = 1.0f; + + m_sunDistanceToGC = 8.1f; + m_sunOrbitalVelocity = 248.0f; + + m_runMode = CONTINUOUS; + m_sweepStartAtTime = false; + m_sweepStartDateTime = QDateTime::currentDateTime(); + m_sweepType = SWP_OFFSET; + m_sweep1Start = -5.0; + m_sweep1Stop = 5.0; + m_sweep1Step = 5.0; + m_sweep1Delay = 0.0; + m_sweep2Start = -5.0; + m_sweep2Stop = 5.0; + m_sweep2Step = 5.0; + m_sweep2Delay = 0.0; + + m_gpioEnabled = false; + m_gpioPin = 0; + m_gpioSense = 1; + m_startCalCommand = ""; + m_stopCalCommand = ""; + m_calCommandDelay = 1.0f; + + m_rgbColor = QColor(102, 0, 0).rgb(); + m_title = "Radio Astronomy"; + m_streamIndex = 0; + m_useReverseAPI = false; + m_reverseAPIAddress = "127.0.0.1"; + m_reverseAPIPort = 8888; + m_reverseAPIDeviceIndex = 0; + m_reverseAPIChannelIndex = 0; + + for (int i = 0; i < RADIOASTRONOMY_POWERTABLE_COLUMNS; i++) + { + m_powerTableColumnIndexes[i] = i; + m_powerTableColumnSizes[i] = -1; // Autosize + } +} + +QByteArray RadioAstronomySettings::serialize() const +{ + SimpleSerializer s(1); + + s.writeS32(1, m_inputFrequencyOffset); + s.writeS32(2, m_sampleRate); + s.writeS32(3, m_rfBandwidth); + s.writeS32(4, m_integration); + s.writeS32(5, m_fftSize); + s.writeS32(6, (int)m_fftWindow); + s.writeString(7, m_filterFreqs); + + s.writeString(10, m_starTracker); + s.writeString(11, m_rotator); + + s.writeFloat(20, m_tempRX); + s.writeFloat(21, m_tempCMB); + s.writeFloat(22, m_tempGal); + s.writeFloat(23, m_tempSP); + s.writeFloat(24, m_tempAtm); + s.writeFloat(25, m_tempAir); + s.writeFloat(26, m_zenithOpacity); + s.writeFloat(27, m_elevation); + s.writeBool(28, m_tempGalLink); + s.writeBool(29, m_tempAtmLink); + s.writeBool(30, m_tempAirLink); + s.writeBool(31, m_elevationLink); + + s.writeFloat(40, m_gainVariation); + s.writeS32(41, (int)m_sourceType); + s.writeFloat(42, m_omegaS); + s.writeS32(43, (int)m_omegaSUnits); + s.writeS32(44, (int)m_omegaAUnits); + + s.writeBool(50, m_spectrumPeaks); + s.writeBool(51, m_spectrumMarkers); + s.writeBool(52, m_spectrumTemp); + s.writeBool(53, m_spectrumReverseXAxis); + s.writeBool(54, m_spectrumRefLine); + s.writeBool(55, m_spectrumLegend); + s.writeBool(56, m_spectrumDistance); + s.writeBool(57, m_spectrumLAB); + + s.writeFloat(60, m_spectrumReference); + s.writeFloat(61, m_spectrumRange); + s.writeFloat(62, m_spectrumSpan); + s.writeFloat(63, m_spectrumCenterFreqOffset); + s.writeBool(64, m_spectrumAutoscale); + s.writeS32(65, (int)m_spectrumYScale); + s.writeS32(66, (int)m_spectrumBaseline); + + s.writeBool(70, m_recalibrate); + s.writeFloat(71, m_tCalHot); + s.writeFloat(72, m_tCalCold); + + s.writeS32(73, (int)m_line); + s.writeFloat(74, m_lineCustomFrequency); + s.writeS32(75, (int)m_refFrame); + + s.writeFloat(76, m_sunDistanceToGC); + s.writeFloat(77, m_sunOrbitalVelocity); + + s.writeBool(80, m_powerPeaks); + s.writeBool(81, m_powerMarkers); + s.writeBool(82, m_powerAvg); + s.writeBool(83, m_powerLegend); + s.writeBool(84, m_powerShowTsys0); + s.writeBool(85, m_powerShowAirTemp); + s.writeBool(86, m_powerShowGaussian); + s.writeFloat(87, m_powerReference); + s.writeFloat(88, m_powerRange); + s.writeBool(89, m_powerAutoscale); + s.writeS32(90, (int)m_powerYData); + s.writeS32(91, (int)m_powerYUnits); + + s.writeBool(100, m_power2DLinkSweep); + s.writeS32(102, (int)m_power2DSweepType); + s.writeS32(103, m_power2DWidth); + s.writeS32(104, m_power2DHeight); + s.writeFloat(105, m_power2DXMin); + s.writeFloat(106, m_power2DXMax); + s.writeFloat(107, m_power2DYMin); + s.writeFloat(108, m_power2DYMax); + s.writeBool(109, m_powerColourAutoscale); + s.writeFloat(110, m_powerColourScaleMin); + s.writeFloat(111, m_powerColourScaleMax); + s.writeString(112, m_powerColourPalette); + + s.writeS32(120, m_runMode); + s.writeBool(121, m_sweepStartAtTime); + s.writeS64(122, m_sweepStartDateTime.toMSecsSinceEpoch()); + s.writeS32(123, (int)m_sweepType); + s.writeFloat(124, m_sweep1Start); + s.writeFloat(125, m_sweep1Stop); + s.writeFloat(126, m_sweep1Step); + s.writeFloat(127, m_sweep1Delay); + s.writeFloat(128, m_sweep2Start); + s.writeFloat(129, m_sweep2Stop); + s.writeFloat(130, m_sweep2Step); + s.writeFloat(131, m_sweep2Delay); + + s.writeString(140, m_sensorName[0]); + s.writeString(141, m_sensorDevice[0]); + s.writeString(142, m_sensorInit[0]); + s.writeString(143, m_sensorMeasure[0]); + s.writeBool(144, m_sensorEnabled[0]); + s.writeBool(145, m_sensorVisible[0]); + s.writeString(146, m_sensorName[1]); + s.writeString(147, m_sensorDevice[1]); + s.writeString(148, m_sensorInit[1]); + s.writeString(149, m_sensorMeasure[1]); + s.writeBool(150, m_sensorEnabled[1]); + s.writeBool(151, m_sensorVisible[1]); + s.writeFloat(152, m_sensorMeasurePeriod); + + s.writeBool(160, m_gpioEnabled); + s.writeS32(161, m_gpioPin); + s.writeS32(162, m_gpioSense); + + s.writeString(167, m_startCalCommand); + s.writeString(168, m_stopCalCommand); + s.writeFloat(169, m_calCommandDelay); + + s.writeU32(180, m_rgbColor); + s.writeString(181, m_title); + if (m_channelMarker) { + s.writeBlob(182, m_channelMarker->serialize()); + } + s.writeS32(183, m_streamIndex); + s.writeBool(184, m_useReverseAPI); + s.writeString(185, m_reverseAPIAddress); + s.writeU32(186, m_reverseAPIPort); + s.writeU32(187, m_reverseAPIDeviceIndex); + s.writeU32(188, m_reverseAPIChannelIndex); + + for (int i = 0; i < RADIOASTRONOMY_POWERTABLE_COLUMNS; i++) { + s.writeS32(400 + i, m_powerTableColumnIndexes[i]); + } + for (int i = 0; i < RADIOASTRONOMY_POWERTABLE_COLUMNS; i++) { + s.writeS32(500 + i, m_powerTableColumnSizes[i]); + } + + return s.final(); +} + +bool RadioAstronomySettings::deserialize(const QByteArray& data) +{ + SimpleDeserializer d(data); + + if(!d.isValid()) + { + resetToDefaults(); + return false; + } + + if(d.getVersion() == 1) + { + QByteArray bytetmp; + uint32_t utmp; + QString strtmp; + qint64 dttmp; + + d.readS32(1, &m_inputFrequencyOffset, 0); + d.readS32(2, &m_sampleRate, 1000000); + d.readS32(3, &m_rfBandwidth, 1000000); + d.readS32(4, &m_integration, 4000); + d.readS32(5, &m_fftSize, 256); + d.readS32(6, (int*)&m_fftWindow, (int)HAN); + d.readString(7, &m_filterFreqs, ""); + + d.readString(10, &m_starTracker, ""); + d.readString(11, &m_rotator, "None"); + + d.readFloat(20, &m_tempRX, 75.0f); + d.readFloat(21, &m_tempCMB, 2.73f); + d.readFloat(22, &m_tempGal, 2.0f); + d.readFloat(23, &m_tempSP, 85.0f); + d.readFloat(24, &m_tempAtm, 2.0f); + d.readFloat(25, &m_tempAir, 15.0f); + d.readFloat(26, &m_zenithOpacity, 0.0055f); + d.readFloat(27, &m_elevation, 90.0f); + d.readBool(28, &m_tempGalLink, true); + d.readBool(29, &m_tempAtmLink, true); + d.readBool(30, &m_tempAirLink, true); + d.readBool(31, &m_elevationLink, true); + + d.readFloat(40, &m_gainVariation, 0.0011f); + d.readS32(41, (int*)&m_sourceType, UNKNOWN); + d.readFloat(42, &m_omegaS, 0.0f); + d.readS32(43, (int*)&m_omegaSUnits, DEGREES); + d.readS32(44, (int*)&m_omegaAUnits, DEGREES); + + d.readBool(50, &m_spectrumPeaks, false); + d.readBool(51, &m_spectrumMarkers, false); + d.readBool(52, &m_spectrumTemp, false); + d.readBool(53, &m_spectrumReverseXAxis, false); + d.readBool(54, &m_spectrumRefLine, false); + d.readBool(55, &m_spectrumLegend, false); + d.readBool(56, &m_spectrumDistance, false); + d.readBool(57, &m_spectrumLAB, false); + + d.readFloat(60, &m_spectrumReference, 0.0f); + d.readFloat(61, &m_spectrumRange, 120.0f); + d.readFloat(62, &m_spectrumSpan, 1.0f); + d.readFloat(63, &m_spectrumCenterFreqOffset, 0.0f); + d.readBool(64, &m_spectrumAutoscale, false); + d.readS32(65, (int*)&m_spectrumYScale, SY_DBFS); + d.readS32(66, (int*)&m_spectrumBaseline, SBL_TSYS0); + + d.readBool(70, &m_recalibrate, false); + d.readFloat(71, &m_tCalHot, 300.0f); + d.readFloat(72, &m_tCalCold, 10.0f); + + d.readS32(73, (int*)&m_line, (int)HI); + d.readFloat(74, &m_lineCustomFrequency, 0.0f); + d.readS32(75, (int*)&m_refFrame, LSR); + + d.readFloat(76, &m_sunDistanceToGC, 8.1f); + d.readFloat(77, &m_sunOrbitalVelocity, 248.0f); + + d.readBool(80, &m_powerPeaks, false); + d.readBool(81, &m_powerMarkers, false); + d.readBool(82, &m_powerAvg, false); + d.readBool(83, &m_powerLegend, false); + d.readBool(84, &m_powerShowTsys0, false); + d.readBool(85, &m_powerShowAirTemp, false); + d.readBool(86, &m_powerShowGaussian, false); + d.readFloat(87, &m_powerReference, 0.0f); + d.readFloat(88, &m_powerRange, 100.0f); + d.readBool(89, &m_powerAutoscale, true); + d.readS32(90, (int*)&m_powerYData, PY_POWER); + d.readS32(91, (int*)&m_powerYUnits, PY_DBFS); + + d.readBool(100, &m_power2DLinkSweep, true); + d.readS32(102, (int*)&m_power2DSweepType, SWP_OFFSET); + d.readS32(103, &m_power2DWidth, 3); + d.readS32(104, &m_power2DHeight, 3); + d.readFloat(105, &m_power2DXMin, 0); + d.readFloat(106, &m_power2DXMax, 10); + d.readFloat(107, &m_power2DYMin, 0); + d.readFloat(108, &m_power2DYMax, 10); + d.readBool(109, &m_powerColourAutoscale, true); + d.readFloat(110, &m_powerColourScaleMin, 0.0f); + d.readFloat(111, &m_powerColourScaleMax, 0.0f); + d.readString(112, &m_powerColourPalette, "Colour"); + + d.readS32(120, (int *)&m_runMode, CONTINUOUS); + d.readBool(121, &m_sweepStartAtTime, false); + d.readS64(122, &dttmp, QDateTime::currentDateTime().toMSecsSinceEpoch()); + m_sweepStartDateTime = QDateTime::fromMSecsSinceEpoch(dttmp); + d.readS32(123, (int*)&m_sweepType, SWP_OFFSET); + d.readFloat(124, &m_sweep1Start, -5.0f); + d.readFloat(125, &m_sweep1Stop, 5.0f); + d.readFloat(126, &m_sweep1Step, 5.0f); + d.readFloat(127, &m_sweep1Delay, 0.0f); + d.readFloat(128, &m_sweep2Start, -5.0f); + d.readFloat(129, &m_sweep2Stop, 5.0); + d.readFloat(130, &m_sweep2Step, 5.0f); + d.readFloat(131, &m_sweep2Delay, 0.0f); + + d.readString(140, &m_sensorName[0], ""); + d.readString(141, &m_sensorDevice[0], ""); + d.readString(142, &m_sensorInit[0], ""); + d.readString(143, &m_sensorMeasure[0], ""); + d.readBool(144, &m_sensorEnabled[0], false); + d.readBool(145, &m_sensorVisible[0], false); + d.readString(146, &m_sensorName[1], ""); + d.readString(147, &m_sensorDevice[1], ""); + d.readString(148, &m_sensorInit[1], ""); + d.readString(149, &m_sensorMeasure[1], ""); + d.readBool(150, &m_sensorEnabled[1], false); + d.readBool(151, &m_sensorVisible[1], false); + d.readFloat(152, &m_sensorMeasurePeriod, 1.0f); + + d.readBool(160, &m_gpioEnabled, false); + d.readS32(161, &m_gpioPin, 0); + d.readS32(162, &m_gpioSense, 1); + + d.readString(167, &m_startCalCommand, ""); + d.readString(168, &m_stopCalCommand, ""); + d.readFloat(169, &m_calCommandDelay, 1.0f); + + d.readU32(180, &m_rgbColor, QColor(102, 0, 0).rgb()); + d.readString(181, &m_title, "Radio Astronomy"); + d.readBlob(182, &bytetmp); + if (m_channelMarker) { + m_channelMarker->deserialize(bytetmp); + } + d.readS32(183, &m_streamIndex, 0); + d.readBool(184, &m_useReverseAPI, false); + d.readString(185, &m_reverseAPIAddress, "127.0.0.1"); + d.readU32(186, &utmp, 0); + if ((utmp > 1023) && (utmp < 65535)) { + m_reverseAPIPort = utmp; + } else { + m_reverseAPIPort = 8888; + } + d.readU32(187, &utmp, 0); + m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp; + d.readU32(188, &utmp, 0); + m_reverseAPIChannelIndex = utmp > 99 ? 99 : utmp; + + for (int i = 0; i < RADIOASTRONOMY_POWERTABLE_COLUMNS; i++) { + d.readS32(400 + i, &m_powerTableColumnIndexes[i], i); + } + for (int i = 0; i < RADIOASTRONOMY_POWERTABLE_COLUMNS; i++) { + d.readS32(500 + i, &m_powerTableColumnSizes[i], -1); + } + + return true; + } + else + { + resetToDefaults(); + return false; + } +} + + diff --git a/plugins/channelrx/radioastronomy/radioastronomysettings.h b/plugins/channelrx/radioastronomy/radioastronomysettings.h new file mode 100644 index 000000000..dc1a2c9e9 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomysettings.h @@ -0,0 +1,225 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2017 Edouard Griffiths, F4EXB. // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_RADIOASTRONOMYSETTINGS_H +#define INCLUDE_RADIOASTRONOMYSETTINGS_H + +#include +#include +#include + +#include "dsp/dsptypes.h" + +class Serializable; + +// Number of columns in the tables +#define RADIOASTRONOMY_POWERTABLE_COLUMNS 27 + +// Number of sensors +#define RADIOASTRONOMY_SENSORS 2 + +struct RadioAstronomySettings +{ + int m_inputFrequencyOffset; + int m_sampleRate; + int m_rfBandwidth; + int m_integration; //!< Number of samples to integrate + + int m_fftSize; + enum FFTWindow { + REC, + HAN + } m_fftWindow; //!< FFT windowing function + QString m_filterFreqs; //!< List of channels (bin indices) to filter in FFT to remove RFI + + QString m_starTracker; //!< Name of Star Tracker plugin to link with + QString m_rotator; //!< Name of antenna rotator + + float m_tempRX; //!< Receiver noise temperature in K (Front end NF) + float m_tempCMB; //!< Cosmic microwave background temperature in K + float m_tempGal; //!< Galactic background temperature in K + float m_tempSP; //!< Spillover temperature in K + float m_tempAtm; //!< Atmospheric temperature in K + float m_tempAir; //!< Surface air temperature in C + float m_zenithOpacity; //!< Opacity of atmosphere at zenith + float m_elevation; //!< Elevation in degrees, if not using value from Star Tracker + bool m_tempGalLink; + bool m_tempAtmLink; + bool m_tempAirLink; + bool m_elevationLink; + + float m_gainVariation; //!< delta G/G + enum SourceType { + UNKNOWN, + COMPACT, + EXTENDED, + SUN, + CAS_A + } m_sourceType; //!< Whether the source it smaller than the beam + float m_omegaS; //!< Source angle + enum AngleUnits { + DEGREES, + STERRADIANS + } m_omegaSUnits; + enum AngleUnits m_omegaAUnits; + + bool m_spectrumPeaks; + bool m_spectrumMarkers; + bool m_spectrumTemp; + bool m_spectrumReverseXAxis; + bool m_spectrumRefLine; + bool m_spectrumLAB; + bool m_spectrumDistance; + bool m_spectrumLegend; + float m_spectrumReference; //!< In dB + float m_spectrumRange; //!< In dB + float m_spectrumSpan; //!< In Mhz + float m_spectrumCenterFreqOffset; //!< Offset - rather than absolute - In Mhz + bool m_spectrumAutoscale; + enum SpectrumYScale { + SY_DBFS, + SY_SNR, + SY_DBM, + SY_TSYS, + SY_TSOURCE + } m_spectrumYScale; + enum SpectrumBaseline { + SBL_TSYS0, + SBL_TMIN, + SBL_CAL_COLD + } m_spectrumBaseline; + bool m_recalibrate; + float m_tCalHot; //!< Hot calibration antenna noise temperature in K (Sky + Spillover?) + float m_tCalCold; //!< Cold calibration antenna noise temperature in K + enum Line { + HI, + OH, + DI, + CUSTOM_LINE + } m_line; //!< Spectral line to plot and use as Doppler reference + float m_lineCustomFrequency; //!< Spectral line frequency when m_line==CUSTOM + enum RefFrame { + TOPOCENTRIC, + BCRS, + LSR + } m_refFrame; //!< Reference frame for velocities + + float m_sunDistanceToGC; //!< Sun distance to Galactic Center In kpc + float m_sunOrbitalVelocity; //!< In km/s around GC + + bool m_powerPeaks; + bool m_powerMarkers; + bool m_powerAvg; + bool m_powerLegend; + bool m_powerShowTsys0; //!< Plot total noise temperature + bool m_powerShowAirTemp; + bool m_powerShowGaussian; + float m_powerReference; //!< In dB + float m_powerRange; //!< In dB + bool m_powerAutoscale; + enum PowerYData { + PY_POWER, + PY_TSYS, + PY_TSOURCE, + PY_FLUX, + PY_2D_MAP + } m_powerYData; + enum PowerYUnits { + PY_DBFS, + PY_DBM, + PY_WATTS, + PY_KELVIN, + PY_SFU, + PY_JANSKY + } m_powerYUnits; + + enum SweepType { + SWP_AZEL, + SWP_LB, + SWP_OFFSET + }; + + bool m_power2DLinkSweep; //. // +/////////////////////////////////////////////////////////////////////////////////// + +#include + +#include "dsp/dspengine.h" + +#include "radioastronomy.h" +#include "radioastronomysink.h" + +RadioAstronomySink::RadioAstronomySink(RadioAstronomy *aisDemod) : + m_radioAstronomy(aisDemod), + m_channelSampleRate(1000000), + m_channelFrequencyOffset(0), + m_fftSequence(-1), + m_fft(nullptr), + m_fftCounter(0), + m_fftSum(nullptr), + m_fftTemp(nullptr), + m_fftSumCount(0), + m_enabled(false), + m_cal(false), + m_magsqSum(0.0f), + m_magsqPeak(0.0f), + m_magsqCount(0), + m_messageQueueToChannel(nullptr) +{ + m_magsq = 0.0; + + applySettings(m_settings, true); + applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); +} + +RadioAstronomySink::~RadioAstronomySink() +{ + delete[] m_fftSum; + delete[] m_fftTemp; +} + +void RadioAstronomySink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end) +{ + Complex ci; + + for (SampleVector::const_iterator it = begin; it != end; ++it) + { + Complex c(it->real(), it->imag()); + c *= m_nco.nextIQ(); + + if (m_interpolatorDistance < 1.0f) // interpolate + { + while (!m_interpolator.interpolate(&m_interpolatorDistanceRemain, c, &ci)) + { + processOneSample(ci); + m_interpolatorDistanceRemain += m_interpolatorDistance; + } + } + else // decimate + { + if (m_interpolator.decimate(&m_interpolatorDistanceRemain, c, &ci)) + { + processOneSample(ci); + m_interpolatorDistanceRemain += m_interpolatorDistance; + } + } + } +} + +void RadioAstronomySink::processOneSample(Complex &ci) +{ + // Calculate power + double magsqRaw = ci.real()*ci.real() + ci.imag()*ci.imag(); + double magsq = (magsqRaw / (SDR_RX_SCALED*SDR_RX_SCALED)); + + // Calculate average and peak levels for level meter + m_movingAverage(magsq); + m_magsq = m_movingAverage.asDouble(); + m_magsqSum += magsq; + if (magsq > m_magsqPeak) + { + m_magsqPeak = magsq; + } + m_magsqCount++; + + if (m_enabled || m_cal) + { + // Add to FFT input buffer + m_fft->in()[m_fftCounter] = Complex(ci.real() / SDR_RX_SCALEF, ci.imag() / SDR_RX_SCALEF); + m_fftCounter++; + if (m_fftCounter >= m_settings.m_fftSize) + { + // Calculate FFT + m_fftWindow.apply(m_fft->in()); + m_fft->transform(); + m_fftCounter = 0; + + // Calculate power and accumulate + for (int i = 0; i < m_settings.m_fftSize; i++) + { + Complex s = m_fft->out()[i]; + Real v = s.real() * s.real() + s.imag() * s.imag(); + Real enbw = 1.0f; + /*if (m_settings.m_fftWindow == RadioAstronomySettings::HAN && m_settings.m_fftCorrection == RadioAstronomySettings::POWER) { + enbw = 1.5; // FIXME: Small dependence on fftSize in Matlab + }*/ + m_fftSum[i] += v / (enbw * m_settings.m_fftSize * m_settings.m_fftSize); // Why FFT size here and not Fs? + } + + m_fftSumCount++; + if (m_fftSumCount >= m_settings.m_integration) + { + // Average + for (int i = 0; i < m_settings.m_fftSize; i++) { + m_fftSum[i] /= m_fftSumCount; + } + + // Put negative frequencies first + std::copy(m_fftSum + m_settings.m_fftSize/2, m_fftSum + m_settings.m_fftSize, m_fftTemp); + std::copy(m_fftSum, m_fftSum + m_settings.m_fftSize/2, m_fftTemp + m_settings.m_fftSize/2); + + // Filter freqs with RFI + if (m_filterBins.size() > 0) + { + // Find minimum value to use as replacement + // Should possibly use an average of the n lowest values or something + float minVal = std::numeric_limits::max(); + for (int i = 0; i < m_settings.m_fftSize; i++) { + minVal = std::min(minVal, m_fftTemp[i]); + } + for (int i = 0; i < m_filterBins.size(); i++) + { + int bin = m_filterBins[i]; + if (bin < m_settings.m_fftSize) { + m_fftTemp[bin] = minVal; + } + } + } + + getMessageQueueToChannel()->push(RadioAstronomy::MsgMeasurementProgress::create(100)); + + if (m_cal) + { + // Indicate calibration complete + if (getMessageQueueToChannel()) + { + RadioAstronomy::MsgCalComplete *msg = RadioAstronomy::MsgCalComplete::create(m_fftTemp, m_settings.m_fftSize, QDateTime::currentDateTime(), m_hot); + getMessageQueueToChannel()->push(msg); + } + + // Cal complete + m_cal = false; + } + else + { + // Send averaged FFT to channel + if (getMessageQueueToChannel()) + { + + RadioAstronomy::MsgFFTMeasurement *msg = RadioAstronomy::MsgFFTMeasurement::create(m_fftTemp, m_settings.m_fftSize, QDateTime::currentDateTime()); + getMessageQueueToChannel()->push(msg); + } + + m_enabled = (m_settings.m_runMode == RadioAstronomySettings::CONTINUOUS); + if (m_enabled) { + getMessageQueueToChannel()->push(RadioAstronomy::MsgMeasurementProgress::create(0)); + } + } + + m_fftSumCount = 0; + std::fill(m_fftSum, m_fftSum + m_settings.m_fftSize, 0.0f); + } + else + { + // Don't send more than ~4 updates per second + int fftsPerSecond = m_settings.m_sampleRate / m_settings.m_fftSize; + if ((m_fftSumCount % (fftsPerSecond/4)) == 0) { + getMessageQueueToChannel()->push(RadioAstronomy::MsgMeasurementProgress::create(100 * m_fftSumCount / m_settings.m_integration)); + } + } + + } + } +} + +void RadioAstronomySink::startMeasurements() +{ + getMessageQueueToChannel()->push(RadioAstronomy::MsgMeasurementProgress::create(0)); + m_enabled = true; + m_fftSumCount = 0; + std::fill(m_fftSum, m_fftSum + m_settings.m_fftSize, 0.0f); +} + +void RadioAstronomySink::stopMeasurements() +{ + m_enabled = false; +} + +void RadioAstronomySink::startCal(bool hot) +{ + getMessageQueueToChannel()->push(RadioAstronomy::MsgMeasurementProgress::create(0)); + m_cal = true; + m_hot = hot; + m_fftSumCount = 0; + std::fill(m_fftSum, m_fftSum + m_settings.m_fftSize, 0.0f); +} + +void RadioAstronomySink::applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force) +{ + qDebug() << "RadioAstronomySink::applyChannelSettings:" + << " channelSampleRate: " << channelSampleRate + << " channelFrequencyOffset: " << channelFrequencyOffset; + + if ((m_channelFrequencyOffset != channelFrequencyOffset) || + (m_channelSampleRate != channelSampleRate) || force) + { + m_nco.setFreq(-channelFrequencyOffset, channelSampleRate); + } + + if ((m_channelSampleRate != channelSampleRate) || force) + { + m_interpolator.create(16, channelSampleRate, m_settings.m_rfBandwidth / 2.0f); + m_interpolatorDistance = (Real) channelSampleRate / (Real) m_settings.m_sampleRate; + m_interpolatorDistanceRemain = m_interpolatorDistance; + } + + m_channelSampleRate = channelSampleRate; + m_channelFrequencyOffset = channelFrequencyOffset; +} + +void RadioAstronomySink::applySettings(const RadioAstronomySettings& settings, bool force) +{ + qDebug() << "RadioAstronomySink::applySettings:" + << " m_sampleRate: " << settings.m_sampleRate + << " m_rfBandwidth: " << settings.m_rfBandwidth + << " m_fftSize: " << settings.m_fftSize + << " m_fftWindow: " << settings.m_fftWindow + << " m_filterFreqs: " << settings.m_filterFreqs + << " force: " << force; + + if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) + || (settings.m_sampleRate != m_settings.m_sampleRate) + || force) + { + m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth / 2.0f); // 2.0 rather than 2.2 as in other plugins, to reduce rolloff at edge of band + m_interpolatorDistance = (Real) m_channelSampleRate / (Real) settings.m_sampleRate; + m_interpolatorDistanceRemain = m_interpolatorDistance; + } + + if ((settings.m_fftSize != m_settings.m_fftSize) || force) + { + FFTFactory *fftFactory = DSPEngine::instance()->getFFTFactory(); + if (m_fftSequence >= 0) { + fftFactory->releaseEngine(m_settings.m_fftSize, false, m_fftSequence); + } + m_fftSequence = fftFactory->getEngine(settings.m_fftSize, false, &m_fft); + m_fftCounter = 0; + delete[] m_fftSum; + delete[] m_fftTemp; + m_fftSum = new Real[settings.m_fftSize](); + m_fftTemp = new Real[settings.m_fftSize](); + m_fftSumCount = 0; + } + + if ((settings.m_fftSize != m_settings.m_fftSize) + || (settings.m_fftWindow != m_settings.m_fftWindow) + || force) + { + if (settings.m_fftWindow == RadioAstronomySettings::HAN) { + m_fftWindow.create(FFTWindow::Hanning, settings.m_fftSize); + } else { + m_fftWindow.create(FFTWindow::Rectangle, settings.m_fftSize); + } + } + + if ((settings.m_filterFreqs != m_settings.m_filterFreqs) || force) + { + m_filterBins.clear(); + QStringList filterFreqs = settings.m_filterFreqs.split(" "); + for (int i = 0; i < filterFreqs.size(); i++) + { + bool ok; + int bin = filterFreqs[i].toInt(&ok); + if (ok) { + m_filterBins.append(bin); + } + } + } + + m_settings = settings; +} diff --git a/plugins/channelrx/radioastronomy/radioastronomysink.h b/plugins/channelrx/radioastronomy/radioastronomysink.h new file mode 100644 index 000000000..6386c42fd --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomysink.h @@ -0,0 +1,123 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2019 Edouard Griffiths, F4EXB // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_RADIOASTRONOMYSINK_H +#define INCLUDE_RADIOASTRONOMYSINK_H + +#include "dsp/channelsamplesink.h" +#include "dsp/nco.h" +#include "dsp/interpolator.h" +#include "dsp/fftfactory.h" +#include "dsp/fftengine.h" +#include "dsp/fftwindow.h" +#include "util/movingaverage.h" +#include "util/messagequeue.h" + +#include "radioastronomysettings.h" + +class ChannelAPI; +class RadioAstronomy; + +class RadioAstronomySink : public ChannelSampleSink { +public: + RadioAstronomySink(RadioAstronomy *aisDemod); + ~RadioAstronomySink(); + + virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); + + void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false); + void applySettings(const RadioAstronomySettings& settings, bool force = false); + void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } + void setChannel(ChannelAPI *channel) { m_channel = channel; } + void startMeasurements(); + void stopMeasurements(); + void startCal(bool hot); + void clearCal(); + + double getMagSq() const { return m_magsq; } + + void getMagSqLevels(double& avg, double& peak, int& nbSamples) + { + if (m_magsqCount > 0) + { + m_magsq = m_magsqSum / m_magsqCount; + m_magSqLevelStore.m_magsq = m_magsq; + m_magSqLevelStore.m_magsqPeak = m_magsqPeak; + } + + avg = m_magSqLevelStore.m_magsq; + peak = m_magSqLevelStore.m_magsqPeak; + nbSamples = m_magsqCount == 0 ? 1 : m_magsqCount; + + m_magsqSum = 0.0f; + m_magsqPeak = 0.0f; + m_magsqCount = 0; + } + + +private: + struct MagSqLevelsStore + { + MagSqLevelsStore() : + m_magsq(1e-12), + m_magsqPeak(1e-12) + {} + double m_magsq; + double m_magsqPeak; + }; + + RadioAstronomy *m_radioAstronomy; + RadioAstronomySettings m_settings; + ChannelAPI *m_channel; + int m_channelSampleRate; + int m_channelFrequencyOffset; + + int m_fftSequence; + FFTEngine *m_fft; + FFTWindow m_fftWindow; + int m_fftCounter; + QList m_filterBins; + + Real *m_fftSum; + Real *m_fftTemp; + int m_fftSumCount; + + bool m_enabled; + bool m_cal; + bool m_hot; + + NCO m_nco; + Interpolator m_interpolator; + Real m_interpolatorDistance; + Real m_interpolatorDistanceRemain; + + double m_magsq; + double m_magsqSum; + double m_magsqPeak; + int m_magsqCount; + MagSqLevelsStore m_magSqLevelStore; + + MessageQueue *m_messageQueueToChannel; + + MovingAverageUtil m_movingAverage; + + void processOneSample(Complex &ci); + MessageQueue *getMessageQueueToChannel() { return m_messageQueueToChannel; } +}; + +#endif // INCLUDE_RADIOASTRONOMYSINK_H diff --git a/plugins/channelrx/radioastronomy/radioastronomywebapiadapter.cpp b/plugins/channelrx/radioastronomy/radioastronomywebapiadapter.cpp new file mode 100644 index 000000000..7615d0107 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomywebapiadapter.cpp @@ -0,0 +1,52 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2019 Edouard Griffiths, F4EXB. // +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "SWGChannelSettings.h" +#include "radioastronomy.h" +#include "radioastronomywebapiadapter.h" + +RadioAstronomyWebAPIAdapter::RadioAstronomyWebAPIAdapter() +{} + +RadioAstronomyWebAPIAdapter::~RadioAstronomyWebAPIAdapter() +{} + +int RadioAstronomyWebAPIAdapter::webapiSettingsGet( + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage) +{ + (void) errorMessage; + response.setRadioAstronomySettings(new SWGSDRangel::SWGRadioAstronomySettings()); + response.getRadioAstronomySettings()->init(); + RadioAstronomy::webapiFormatChannelSettings(response, m_settings); + + return 200; +} + +int RadioAstronomyWebAPIAdapter::webapiSettingsPutPatch( + bool force, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage) +{ + (void) force; + (void) errorMessage; + RadioAstronomy::webapiUpdateChannelSettings(m_settings, channelSettingsKeys, response); + + return 200; +} diff --git a/plugins/channelrx/radioastronomy/radioastronomywebapiadapter.h b/plugins/channelrx/radioastronomy/radioastronomywebapiadapter.h new file mode 100644 index 000000000..7262b960c --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomywebapiadapter.h @@ -0,0 +1,50 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2019 Edouard Griffiths, F4EXB. // +// Copyright (C) 2020 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_RADIOASTRONOMY_WEBAPIADAPTER_H +#define INCLUDE_RADIOASTRONOMY_WEBAPIADAPTER_H + +#include "channel/channelwebapiadapter.h" +#include "radioastronomysettings.h" + +/** + * Standalone API adapter only for the settings + */ +class RadioAstronomyWebAPIAdapter : public ChannelWebAPIAdapter { +public: + RadioAstronomyWebAPIAdapter(); + virtual ~RadioAstronomyWebAPIAdapter(); + + virtual QByteArray serialize() const { return m_settings.serialize(); } + virtual bool deserialize(const QByteArray& data) { return m_settings.deserialize(data); } + + virtual int webapiSettingsGet( + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage); + + virtual int webapiSettingsPutPatch( + bool force, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage); + +private: + RadioAstronomySettings m_settings; +}; + +#endif // INCLUDE_RADIOASTRONOMY_WEBAPIADAPTER_H diff --git a/plugins/channelrx/radioastronomy/radioastronomyworker.cpp b/plugins/channelrx/radioastronomy/radioastronomyworker.cpp new file mode 100644 index 000000000..99d8a0776 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomyworker.cpp @@ -0,0 +1,160 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2021 Jon Beniston, M7RCE // +// Copyright (C) 2020 Edouard Griffiths, F4EXB // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include + +#include + +#include "radioastronomy.h" +#include "radioastronomyworker.h" + +MESSAGE_CLASS_DEFINITION(RadioAstronomyWorker::MsgConfigureRadioAstronomyWorker, Message) + +RadioAstronomyWorker::RadioAstronomyWorker(RadioAstronomy* radioAstronomy) : + m_radioAstronomy(radioAstronomy), + m_msgQueueToChannel(nullptr), + m_msgQueueToGUI(nullptr), + m_running(false), + m_mutex(QMutex::Recursive), + m_sensorTimer(this) +{ + connect(&m_sensorTimer, SIGNAL(timeout()), this, SLOT(measureSensors())); + m_sensorTimer.start((int)round(m_settings.m_sensorMeasurePeriod*1000.0)); + for (int i = 0; i < RADIOASTRONOMY_SENSORS; i++) { + m_session[i] = VI_NULL; + } +} + +RadioAstronomyWorker::~RadioAstronomyWorker() +{ + m_inputMessageQueue.clear(); + m_visa.closeDefault(); +} + +void RadioAstronomyWorker::reset() +{ + QMutexLocker mutexLocker(&m_mutex); + m_inputMessageQueue.clear(); +} + +bool RadioAstronomyWorker::startWork() +{ + QMutexLocker mutexLocker(&m_mutex); + connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); + m_running = true; + return m_running; +} + +void RadioAstronomyWorker::stopWork() +{ + QMutexLocker mutexLocker(&m_mutex); + disconnect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); + m_running = false; +} + +void RadioAstronomyWorker::handleInputMessages() +{ + Message* message; + + while ((message = m_inputMessageQueue.pop()) != nullptr) + { + if (handleMessage(*message)) { + delete message; + } + } +} + +bool RadioAstronomyWorker::handleMessage(const Message& cmd) +{ + if (MsgConfigureRadioAstronomyWorker::match(cmd)) + { + QMutexLocker mutexLocker(&m_mutex); + MsgConfigureRadioAstronomyWorker& cfg = (MsgConfigureRadioAstronomyWorker&) cmd; + + applySettings(cfg.getSettings(), cfg.getForce()); + return true; + } + else + { + return false; + } +} + +void RadioAstronomyWorker::applySettings(const RadioAstronomySettings& settings, bool force) +{ + qDebug() << "RadioAstronomyWorker::applySettings:" + << " m_sensorEnabled[0]: " << settings.m_sensorEnabled[0] + << " m_sensorDevice[0]: " << settings.m_sensorDevice[0] + << " m_sensorInit[0]: " << settings.m_sensorInit[0] + << " m_sensorMeasure[0]: " << settings.m_sensorMeasure[0] + << " force: " << force; + + for (int i = 0; i < RADIOASTRONOMY_SENSORS; i++) + { + if ( (settings.m_sensorEnabled[i] != m_settings.m_sensorEnabled[i]) + || (settings.m_sensorEnabled[i] && (settings.m_sensorDevice[i] != m_settings.m_sensorDevice[i])) + || force) + { + if (!settings.m_sensorEnabled[i] && (m_session[i] != VI_NULL)) + { + m_visa.close(m_session[i]); + m_session[i] = VI_NULL; + } + if (settings.m_sensorEnabled[i] && !settings.m_sensorDevice[i].trimmed().isEmpty()) + { + m_visa.openDefault(); + m_session[i] = m_visa.open(settings.m_sensorDevice[i]); + } + } + if ( (settings.m_sensorEnabled[i] && !m_settings.m_sensorEnabled[i]) + || (settings.m_sensorEnabled[i] && (settings.m_sensorInit[i] != m_settings.m_sensorInit[i])) + || force) + { + if (m_session[i]) { + m_visa.processCommands(m_session[i], settings.m_sensorInit[i]); + } + } + } + if ((settings.m_sensorMeasurePeriod != m_settings.m_sensorMeasurePeriod) || force) { + m_sensorTimer.start((int)round(settings.m_sensorMeasurePeriod * 1000.0)); + } + + m_settings = settings; +} + +void RadioAstronomyWorker::measureSensors() +{ + for (int i = 0; i < RADIOASTRONOMY_SENSORS; i++) + { + if (m_settings.m_sensorEnabled[i] && m_session[i]) + { + QStringList results = m_visa.processCommands(m_session[i], m_settings.m_sensorMeasure[i]); + if (results.size() >= 1) + { + double value = results[0].toDouble(); + if (getMessageQueueToGUI()) { + getMessageQueueToGUI()->push(RadioAstronomy::MsgSensorMeasurement::create(i, value)); + } + } + else + { + qDebug() << "RadioAstronomyWorker::measureSensors: No result for command " << m_settings.m_sensorMeasure[i]; + } + } + } +} diff --git a/plugins/channelrx/radioastronomy/radioastronomyworker.h b/plugins/channelrx/radioastronomy/radioastronomyworker.h new file mode 100644 index 000000000..760210d62 --- /dev/null +++ b/plugins/channelrx/radioastronomy/radioastronomyworker.h @@ -0,0 +1,93 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2021 Jon Beniston, M7RCE // +// Copyright (C) 2020 Edouard Griffiths, F4EXB // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_RADIOASTRONOMYWORKER_H +#define INCLUDE_RADIOASTRONOMYWORKER_H + +#include +#include + +#include "util/message.h" +#include "util/messagequeue.h" +#include "util/visa.h" + +#include "radioastronomysettings.h" + +class RadioAstronomy; + +class RadioAstronomyWorker : public QObject +{ + Q_OBJECT +public: + class MsgConfigureRadioAstronomyWorker : public Message { + MESSAGE_CLASS_DECLARATION + + public: + const RadioAstronomySettings& getSettings() const { return m_settings; } + bool getForce() const { return m_force; } + + static MsgConfigureRadioAstronomyWorker* create(const RadioAstronomySettings& settings, bool force) + { + return new MsgConfigureRadioAstronomyWorker(settings, force); + } + + private: + RadioAstronomySettings m_settings; + bool m_force; + + MsgConfigureRadioAstronomyWorker(const RadioAstronomySettings& settings, bool force) : + Message(), + m_settings(settings), + m_force(force) + { } + }; + + RadioAstronomyWorker(RadioAstronomy* radioAstronomy); + ~RadioAstronomyWorker(); + void reset(); + bool startWork(); + void stopWork(); + bool isRunning() const { return m_running; } + MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } + void setMessageQueueToChannel(MessageQueue *messageQueue) { m_msgQueueToChannel = messageQueue; } + void setMessageQueueToGUI(MessageQueue *messageQueue) { m_msgQueueToGUI = messageQueue; } + +private: + + RadioAstronomy* m_radioAstronomy; + MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication + MessageQueue *m_msgQueueToChannel; + MessageQueue *m_msgQueueToGUI; + RadioAstronomySettings m_settings; + bool m_running; + QMutex m_mutex; + + VISA m_visa; + ViSession m_session[RADIOASTRONOMY_SENSORS]; + QTimer m_sensorTimer; + + bool handleMessage(const Message& cmd); + void applySettings(const RadioAstronomySettings& settings, bool force = false); + MessageQueue *getMessageQueueToGUI() { return m_msgQueueToGUI; } + +private slots: + void handleInputMessages(); + void measureSensors(); +}; + +#endif // INCLUDE_RADIOASTRONOMYWORKER_H diff --git a/plugins/channelrx/radioastronomy/readme.md b/plugins/channelrx/radioastronomy/readme.md new file mode 100644 index 000000000..c8305aebb --- /dev/null +++ b/plugins/channelrx/radioastronomy/readme.md @@ -0,0 +1,864 @@ +

    Radio Astronomy plugin

    + +

    Introduction

    + +The Radio Astronomy plugin provides a number of tools to help make radio astronomy measurements. It supports: + +- A spectrometer for displaying time averaged spectra. +- A radiometer for displaying time averaged continuum measurements (total power). +- Calibration to enable measurements to be displayed as noise temperatures (K), power (dBm/Watts) and spectral flux density (Jy). +- Utilities are included for estimation and calculation of noise temperature components (Tsys, Trx, Tgal, Tatm, Tsky, Tsp) and sensitivity (sigma Tsys and sigma Sv). +- Spectra can be displayed against frequency and velocity (with a configurable reference spectral line), with the velocity adjusted to topocentric, Solar System barycentric or the Local Standard of Rest (LSR) reference frames. +- Calculation and plotting of radial and Galactocentric distance to HI clouds, based on spectral peaks. +- Position of HI clouds can be sent to Star Tracker plugin for visualisation on the Galactic line-of-sight image and created in to an animation mapping out the Milky Way's spiral arms. +- A Gaussian fitting tool in the spectrometer for HI cloud kinetic temperature and column density estimation. +- A Gaussian fitting tool in the radiometer to enable antenna HPBW measurement from Solar drift-scans. +- Ability to record and plot real-time surface air temperature and other sensor measurements (component voltages / temperatures) alongside radiometer measurements. +- Ability to export charts to animated .png files and static image files. +- Reference spectra from the LAB (Leiden/Argentine/Bonn) Galactic HI survey can be automatically downloaded and plotted for comparison against user measurements. +- 2D sweeps can be made and plotted in different coordinate systems (Az/El, Galactic, offsets around a target and drift scans). +- All spectra are held in memory and can be scrolled through. +- Data can be saved and loaded from .csv files. +- Hardware for calibration (E.g. RF switches) can be automatically controlled. + +![Radio Astronomy plugin GUI](../../../doc/img/RadioAstronomy_plugin.png) + +Several of the features in this plugin are tailored towards measurements of neutral hydrogen (HI) that is dispersed throughout the Milky Way's interstellar medium (ISM). +The HI in the ISM is a particularly interesting astronomical radiation source for SDR users, as the ground-state hyperfine transition of HI has a rest frequency of 1420.405MHz, +which is both quite powerful (due to the vast amount of HI spread throughout the Milky Way) and at a frequency that is easy to detect with relatively small dishes and low-cost LNAs and SDRs. +The HI spectrum can be used to determine some of the Milky Way's spiral structure and calculate rotation curves for the inner Milky Way, which suggest the presence of dark matter. + +In radio astronomy it is common to use noise temperatures rather than power, via the relation: + + T=P/(k*B) + +Where: + + T is the noise temperature in Kelvin + P is power in Watts + k is Boltzmann's constant + B is bandwidth in Hertz + +Similarly, for low frequencies (where the Rayleigh-Jeans approximation is valid), brightness temperatures are used rather than intensity: + + Tb=e*Iv*c^2/(2k*v^2) + +Where: + + Tb is the brightness temperature in Kelvin + e is the emissivity of the source + Iv is the intensity of the source (power per unit solid angle at the frequency v) + c is the speed of light + v is the frequency in Hertz + +This can be convenient, as if a large astronomical source completely fills the antenna beam with a uniform brightness temperature, +there will be an equal increase in the noise temperature measured by the receiver. +For thermal sources of radiation, the brightness temperature can also correspond directly to the physical temperature of the source. +This isn't true for non-thermal sources, however, such as synchrotron radiation. + +In this plugin, the following notation is used for the different temperature sources and combinations: + +- Trx - Receiver noise temperature. This is the combined noise temperature due to the LNA, feed line and SDR. +- Tcmb - Cosmic Microwave Background temperature (2.73K). +- Tgal - Galactic background temperature. An estimate of the frequency dependent background that is assumed to be the same in all directions. +- Tsky - Combined CMB, Galactic background and foreground as calculated in Star Tracker plugin using all-sky survey data. +- Tatm - Atmospheric emission, dependent upon frequency, opacity (which is dependent on temperature, pressure and water vapour) and elevation. +- Tsp - Spillover temperature due to thermal ground noise and other thermal noise sources such as trees and buildings around the antenna. +- Tair - Surface air temperature (In C, unlike all other temperatures which are in K). +- Tsource - Contribution from astronomical source (What we are typically trying to measure). +- Tsys0 - Total of all unwanted noise (Trx+Tcmb+Tgal+Tatm+Tsp). +- Tsys - System noise temperature. Sum of all received noise (Tsys0+Tsource). +- Tb - Brightness temperature of the source. +- Ta - Antenna temperature (which is typically Tcmb+Tgal+Tatm+Tsp+Tsource). + +Care should be taken when comparing to definitions in the literature, as these vary significantly. In particular, Tsys can be defined to include or +exclude the astronomical source contribution and Ta can be just the source or all antenna noise. + +For most astronomical observations, Tsource<Settings + +![Settings GUI](../../../doc/img/RadioAstronomy_Settings.png) + +

    1: Frequency shift from center frequency of reception

    + +Use the wheels to adjust the frequency shift in Hz from the center frequency of reception. Left click on a digit sets the cursor position at this digit. +Right click on a digit sets all digits on the right to zero. This effectively floors value at the digit position. +Wheels are moved with the mousewheel while pointing at the wheel or by selecting the wheel with the left mouse click and using the keyboard arrows. +Pressing shift simultaneously moves digit by 5 and pressing control moves it by 2. + +

    2: SR - Sample Rate

    + +Sample rate in millions of samples per second. This determines the maximum bandwidth for the radiometer and spectrometer and thus the maximum Doppler shift range. +Typically this should be set to match SDRangel's baseband sample rate. + +

    3: BW - RF Bandwidth

    + +This specifies the bandwidth of a LPF that is applied to the input signal to limit the RF bandwidth. This can be used to eliminate RFI. + +

    4: Channel power

    + +Average total power in dB relative to a +/- 1.0 amplitude signal received in the pass band. + +

    5: Integration Count

    + +Specifies the number of FFTs that are summed in each average. Higher integration counts increase measurement time, but also increase sensitivity (up to the limit imposed by receiver gain variation). + +

    6: Channels

    + +Specifies the number of channels (FFT bins). A larger number means an increased resolution in the spectrometer, +however, the sensitivity per bin is decreased for a fixed measurement time. + +

    7: Window function

    + +A windowing function to be applied before the FFT, to compensate for spectral leakage. This can be either: + +- Rec: Rectangular or no windowing function. Use for broadband / continuum sources. +- Han: Hanning window. Use for narrowband / spectral line sources for better frequency resolution. + +

    8: Filter

    + +Specifies a list of FFT bins that will have their values replaced with the minimum of other FFTs bins. This can be used to filter inband RFI. + +

    9: Integration Time

    + +Displays in seconds or minutes how long it will take to make a single measurement. This is dependent on the sample rate (2), Integration Count (5) and number of channels (6). + +

    10: Star Tracker

    + +Specifies the Star Tracker feature that determines the observation target. +A corresponding Star Tracker feature is required to calculate and display numerous values within the Radio Astronomy plugin and also for performing sweeps. + +

    11: Rotator

    + +Specifies the rotator controller feature that is controlling the antenna used for measurements by the Radio Astronomy plugin. +This setting is used when sweeps are performed, to determine when rotation is complete and the antenna is pointing at the target. +If no rotator is used (and only drift scans are performed), this can be set to None. + +

    12: Sensors

    + +Opens the Sensors dialog. + +The Sensors dialog allows two measurements such as voltage and temperature to be recorded and plotted along with radiometer data. +The sensor measurements are made using the VISA (Virtual Instruments Software Architecture) API, which is implemented in many +benchtop multimeters, oscilloscopes and spectrum analyzers. + +Sensor measurements can be used to monitor temperatures and voltages that might have an impact on measurements. For example, the gain +on the LNA will be dependent upon both, and gain variations limit the benefit of increased integration counts on sensitivity. + +![Sensors dialog](../../../doc/img/RadioAstronomy_SensorSettings.png) + +

    13: Trx/NF

    + +Sets the receiver noise temperature in Kelvin or noise figure (NF) in dB. This is the noise temperature / figure for the combination of the LNA, feed line and SDR (at a specific gain setting). +The value set here can be measured using SDRangel's [Noise Figure plugin](https://github.com/f4exb/sdrangel/blob/master/plugins/channelrx/noisefigure/readme.md) +or estimated from datasheet values for the individual components using the [Friis formula](https://en.wikipedia.org/wiki/Friis_formulas_for_noise). + +

    14: Tcmb

    + +Sets the contribution to noise temperature from the Cosmic Microwave Background (CMB). This is 2.73K when an antenna is pointed at the Sky, but may be set to 0K if measurements are made +where there is no CMB contribution (E.g. if the feedhorn is covered with absorbing foam or a 50Ohm terminator or other noise source is used for calibration). + +

    15: Tgal

    + +Sets the contribution to the noise temperature from the Galactic background. This is frequency dependent and varies with direction. It does not include +the Galactic foreground (i.e. the increased noise temperature when looking in the Galactic plane). +If the link button to the right is unchecked, a value can be entered manually. +If the link button is checked, Tgal is calculated using: + + Tgal = 25.2 * (f/f0)^-2.75 + +Where: + + 25.2 is the 50th percentile of the all-sky distribution temperature. + f is the center frequency. + f0 is 408MHz. + +Tgal is used in calibration to estimate Tsp. + +

    16: Tsp

    + +Sets spillover noise temperature. This is unwanted noise due to thermal ground radiation or other thermal radiation sources such as buildings and trees that can be picked +up via an antenna's side and back lobes. +It can be very dependent on azimuth and elevation in urban environments. +An estimate for Tsp can be made via the hot/cold calibration process. + +

    17: Tatm

    + +Contribution to noise temperature due to atmospheric emission. Atmospheric emission is dependent upon frequency, opacity (which is dependent on air temperature, pressure and water vapour) and antenna elevation. +If the link button to the right is unchecked, a value can be entered manually. +If the link button is checked, Tatm is calculated using: + + Tatm = Tair * (1 - exp(-tau_z*sec(el))) + +Where: + + Tair is the surface air temperature from (18). + tau_z is the zenith opacity from (19). + el is the elevation of the antenna from (20) + +

    18: Tair

    + +Tair specifies the surface air temperature at the antenna location in degrees Celsius. +If the link button to the right is unchecked, a value can be entered manually. +If the link button is checked, Tair is set to the air temperature value received from the Star Tracker plugin, which itself is periodically downloaded from openweathermap.org for the antenna's location. + +

    19: tau_z - Zenith Opacity

    + +tau_z specifies the Zenith opacity. This value determines atmospheric absorption and emission. It is dependent upon air temperature, pressure and water vapour. + +The default value of 0.0055 roughly corresponds to clear air as per ITU-R P.372-14 figure 5 at 1.4GHz. + +

    20: El - Antenna Elevation

    + +This specifies the antenna elevation in degrees. It is used for calculating atmospheric emission and absorption. +If the link button to the right is unchecked, a value can be entered manually. +If the link button is checked, El is automatically set to the elevation received from the Star Tracker plugin. + +

    21: Tsys0

    + +This displays the value of Tsys0, the system noise temperature without an astronomical source, which is calculated as: + + Tsys0=Trx+Tcmb+Tgal+Tsp+Tatm. + +

    22: sigma Tsys0

    + +This displays the value of sigma Tsys0, which is the standard deviation / RMS of Tsys0, and gives an indication of the sensitivity. It is calculated as: + + sigma_Tsys0 = Tsys0 * sqrt(1/(B*tau) + (deltaG/G)^2) + +

    24: Baseline

    + +Specifies the baseline used for calculating Tsource from Tsys. This can be: + +- Tsys0 - Tsource = Tsys-Tsys0. +- Tmin - Tsource = Tsys-Tmin - where Tmin is the minimum in-band temperature. +- Tcold - Tsource = Tsys-Tcold - where Tcold is the cold calibration spectrum. This can be used for on/off source observations. + +

    25: delta G / G - Gain Variation

    + +delta G / G specifies the gain variation of the LNA / receiver. Gain variation places a limit on the sensitvity improvement available by increased integration counts. +This value is only used for the estimation of sigma_Tsys0 and sigma_Ssys0, it does not affect any measurements. + +

    26: HPBW / Omega A

    + +This displays the antenna half-power (-3dB) beamwidth (HPBW) in degrees or beam solid angle in steradians, as set in the Star Tracker plugins set by (10). + +

    27: Omega S Type

    + +This sets the type of astronomical source, with respect to its and the antenna beam's angular size: + +- Unknown - Used for when the source is unknown. Brightness temperature (Tb) will not be able to be calculated. +- Compact - The source is smaller than the antenna beam. The source angle can be entered in (28). +- Extended - The source is larger than the antenna beam. +- Sun - The source is the Sun and the source angle is set to 0.53 degrees. +- CasA - The source is Cassiopeia A and the source is set to 0.08333 degrees. + +

    28: Omega S

    + +Enter the angle subtended by the astronomical source. This can be a diameter entered in degrees or solid angle in steradians. +Values for many astronomical sources are available in the [SIMBAD Astronomical Database](http://simbad.u-strasbg.fr/simbad/). + +

    29: Omega S Units

    + +Select whether Omega S is calculated from a diameter in degrees or solid angle in steradians. + +

    Run Control

    + +![Run Control GUI](../../../doc/img/RadioAstronomy_RunControl.png) + +

    Start / Stop

    + +Starts or stops measurements. + +The Radio Astronomy plugin has this button in addition to SDRangel's device acquisition Start/stop button, so that the +SDR continues to run when measurements are not being taken. This can help to reduce small gain & frequency variations that may occur in a SDR +when it is turned on from cold. + +

    Clear Measurements

    + +Clears all measurements from memory. Calibration data is kept. + +

    Run Mode

    + +The run mode field determines the number of measurements that are made then the Start button is pressed. + +- Single: A single measurement is made. +- Continuous: Measurements are continuously made until the Stop button is pressed. +- Sweep: Measurements are made at each of the coordinates specified by the sweep fields. + +

    Start Time

    + +The start time field determines when the measurements start after the Start button is pressed: + +- Now: Measurements start immediately. +- At: Measurements start at the date and time specified in the date/time editor immediately below. + +Delaying the start of the measurements can be used to ensure that the target has risen to its maximum elevation. + +

    Sweep Parameters

    + +The Sweep Type field determines the coordinates that are swept: + +- Az/El - Coordinates are swept in azimuth then elevation. +- l/b - Coordinates are swept in Galactic longitude then latitude. +- Offset - Sweep values are azimuth and elevation offsets from the center of the target set in Star Tracker. + +Here are some examples: + +Sweep Type: Az/El +Az Start: 100 +Az Stop: 120 +Az Step: 10 +El Start: 80 +El Stop: 85 +El Step: 5 +Will measure at (Az,El): 100,80 110,80, 120,80 100,85 110,85, 120,85 + +Sweep Type: Az/El +Az Start: 15 +Az Stop: 345 +Az Step: -15 +El Start: 85 +El Stop: 85 +El Step: 0 +Will measure at (Az,El): 15,85 0,85, 345,85 + +Sweep Type: l/b +l Start: -60 +l Stop: 60 +l Step: 20 +b Start: 0 +b Stop: 0 +b Step: 0 +Will measure at (l,b): 300,0 320,0 340,0 0,0 20,0 40,0, 60,0 + +Sweep Type: Offset +Az Start: -5 +Az Stop: 5 +Az Step: 5 +El Start: -5 +El Stop: 5 +El Step: 5 +Target in Star Tracker: Sun +Will measure at (Az,El): Sun-5,Sun-5 Sun,Sun-5 Sun+5,Sun-5 Sun-5,Sun Sun,Sun Sun+5,Sun Sun-5,Sun+5 Sun,Sun+5 Sun+5,Sun+5 + +The Settle field specifies a delay in seconds after antenna rotation has completed, before the measurement starts. + +The Delay field specifies a delay in seconds after a measurement has completed, before the antenna is rotated for the next measurement. + +

    Status

    + +The measurement status bar shows how complete a measurement is in percent. + +

    Spectrometer

    + +![Spectrometer GUI](../../../doc/img/RadioAstronomy_Spectrometer.png) + +

    Spectrum Selection

    + +This combo box selects between the display of measurement spectra and calibration spectra. + +

    Y Axis Units

    + +Selects the units for the Y-axis: + +- dBFS displays received power in dB relative to fullscale. +- SNR displays the signal to noise ratio (where the noise is the cold calibration spectrum). +- dBm displays the received power in dBm (requires hot calibration). +- TSys K displays the system noise temperature in Kelvin (requires hot calibration). +- TSource K displays the astronomical source temperature in Kelvin (requires hot calibration). + +

    Display Legend

    + +Displays a legend at the side of the chart with the colour and name of each series. + +

    Display LAB Reference Spectrum

    + +When checked, a reference spectrum from the Leiden/Argentine/Bonn (LAB) Galactic HI survey corresponding to the current Galactic coordinates +and antenna HPBW will be downloaded and displayed along side the measured spectrum. +This allows a comparison between your HI measurements and that from a professional survey. + +![LAB Reference Spectrum](../../../doc/img/RadioAstronomy_LAB.png) + +In order to reduce bandwidth to the server supplying this data, it is recommended to use this option sparingly. + +If the series does not appear on Windows (and you see "SSL handshake failed" in the log file), you may need to open https://www.astro.uni-bonn.de/hisurvey/euhou/index.php in your Web browser first, so that the certificate for the website is downloaded. + +

    Calculate and plot distance to HI gas clouds

    + +When checked, the marker table will have six additional columns that display estimates of the distance to a HI cloud corresponding to the marker and the tangent point +along the line of sight. + +- Vr is radial velocity of the cloud in km/s, relative to the selected reference frame. +- R is the distance from the cloud to the Galactic centre in kiloparsecs (kpc). +- d is the line-of-sight distance to the cloud in kpc. In some instances there can be two possible solutions. +- Plot max determines whether the smaller or larger solution to d is sent to the Star Tracker plugin for display. +- Rmin is the minimum distance to the Galactic centre in kiloparsecs (kpc) along the line of sight (i.e. at the tangent point). +- Vmax is the orbital velocity at the tangent point. + +Vmax can be plotted against Rmin to determine the rotation curve of the Milky Way. +d can be plotted against Galactic longitude in Star Tracker to map out the Milky Way's spiral arms. + +The spectrometer GUI will also display two additional fields, R0 and V0, +which allow you to enter the distance from the Sun to the Galactic centre and the Sun's orbital velocity +around the Galactic centre, which are used in the above calculations. + +![Distance to HI Cloud](../../../doc/img/RadioAstronomy_RadioAstronomy_DistanceToHICloud.png) + +

    Display Reference Spectral Line

    + +When checked, a horizontal axis showing Doppler shift in km/s is added to the top of the spectrometer chart and a vertical reference spectral line is plotted at 0km/s. +The rest frequency of the spectral line can be set via the reference spectral line field or manually entered. +The relationship between the frequency and velocity axes is determined by the selected reference frame. + +![Reference Spectral Line](../../../doc/img/RadioAstronomy_RefLine.png) + +

    Display Gaussian Fitting Tools

    + +When checked, the Gaussian fitting tools are displayed. These allow a Gaussian to be fitted to a spectral peak for kinetic temperature and column density estimation. + +![Gaussian Fit](../../../doc/img/RadioAstronomy_SpectrumGaussian.png) + +

    Display Markers

    + +When checked, the marker table is displayed and the user may place two markers (M1 and M2) on the chart for accurate display of the corresponding values. + +

    Display Peaks

    + +When checked, the peak table is displayed and the peak Max marker is displayed at the maximum value in the spectrum. + +

    Reverse X axis

    + +When checked, the X axis is reversed. This allows switching between an axis that increases with frequency (which is most common in engineering) or increases with velocity (which is most common in radio astronomy). + +

    Save Charts to an Animation File

    + +Click to export all of the spectral measurements to a animated .png file. + +

    Save Chart to an Image File

    + +Click to save the current chart to an image file. + +

    Load Data from a .csv File

    + +Click to restore data that had been saved to a .csv file. All existing data will be cleared. + +

    Save Data from a .csv File

    + +Click to save all data to a .csv file. + +

    Autoscale

    + +When checked, continuously automatically scales both X and Y axis so all data is visible. When unchecked, the axis scales can be set manually. + +

    Autoscale X

    + +When clicked, automatically scales the X axis so all data is visible. + +

    Autoscale Y

    + +When clicked, automatically scales the Y axis so all data is visible. + +

    Ref

    + +Sets the reference level (maximum value) of the Y axis. + +

    Range

    + +Sets the range of the Y axis. + +

    CF

    + +Sets the centre frequency of the X axis. + +

    Span

    + +Sets the span (range) of the X axis. + +

    Sel

    + +Selects what is selected when clicking on the chart: + +- M1 sets position of marker 1 +- M2 sets position of marker 2 +- Gaussian sets peak of Gaussian + +

    Date & Time

    + +Allows the user to scroll through and select the recorded spectra, showing the date and time they were measured at. + +

    Line

    + +Specifies the rest frequency of the reference spectral line: + +- HI neutral hydrogen at 1420.405760MHz. +- OH hydroxyl at 1612.231040Mhz. +- DI neutral deuterium at 327.384MHz. +- Custom allows a user-defined frequency in MHz to be entered. + +

    Reference Frame

    + +Determines the reference frame used for calculating velocities from frequency. + +- Topo is a topocentric reference frame (i.e. relative to the observation location). +- BCRS is the barycentric celestial reference system (i.e. relative to the Solar System's barycenter (centre of mass)). +- LSR is the local standard of rest (i.e. relative to the local standard of rest, which accounts for the Sun's movements relative to other nearby stars). + +Professional astronomers tend to plot spectra using the LSR, so any observed Doppler shift can assumed to be due to the source moving. + +

    R0

    + +Specifies the distance of the Sun from the Galactic centre in kpc. + +

    V0

    + +Specifies the orbital velocity of the Sun around the Galactic centre in km/s. + +

    f0

    + +Specifies the frequency of the centre of the Gaussian in MHz. + +

    a

    + +Specifies the amplitude of the Gaussian. Units correspond to the Y axis units. + +

    f

    + +Specifies the floor (minimum value of the Gaussian). Units correspond to the Y axis units. + +

    Delta f FHWM

    + +Specifies the full-width at half maximum of the Gaussian in Hertz. + +

    Tk

    + +An estimate of kinetic temperature in Kelvin of a HI cloud whose spectral profile matches the Gaussian. + +Note that it's not possible to determine how much spectral broadening is due to kinetic temperature and +how much is due to turbulent velocity, as from a single measurement, there is no way +to distinguish between the two. + +

    Vt

    + +An estimate of the turbulent velocity within a HI cloud whose spectral profile matches the Gaussian. + +

    NH

    + +Estimated column density of an optically thin HI cloud whose spectral profile matches the Gaussian, +measured in HI atoms per square centimetre. + +

    Marker Table

    + +The marker table displays corresponding values for markers that are placed on the chart. + +

    Radiometer

    + +![Radiometer GUI](../../../doc/img/RadioAstronomy_Radiometer.png) + +

    Chart Selection

    + +This field selects between the display of power, temperature and flux in one or two dimensions. + +

    Y Axis Units

    + +Selects the units for the Y-axis: + +- dBFS displays received power in dB relative to fullscale. +- dBm displays the received power in dBm (requires hot calibration). +- dBm displays the received power in Watts (requires hot calibration). +- K displays the temperature in Kelvin (requires hot calibration). +- SFU displays the flux in Solar Flux units (requires hot calibration). +- Jy displays the flux in Jansky (requires hot calibration). + +

    Display Legend

    + +Displays a legend at the side of the chart with the colour and name of each series. + +

    Plot Sensor 2

    + +Plot the data recorded for sensor 2 on the chart. + +

    Plot Sensor 1

    + +Plot the data recorded for sensor 1 on the chart. + +

    Plot Air Temperature

    + +Plot the surface air temperature data received from Star Tracker on the chart. + +

    Plot Tsys0

    + +Plot Tsys0 on the chart. + +

    Display Statistics

    + +Displays statistics calculated across all measurements (not just those visible on the chart), including the mean, RMS and standard deviation. + +

    Display Gaussian Fitting Tools

    + +When checked, the Gaussian fitting tools are displayed. These allow a Gaussian to be fitted to the data, allowing measurement of the HPBW of the antenna. + +

    Display Markers

    + +When checked, the marker table is displayed and the user may place two markers (M1 and M2) on the chart for accurate display of the corresponding values from the measurement series. + +

    Display Peaks

    + +When checked, the marker table is displayed and the peak Max and Min markers are displayed at the maximum and minimum values on the measurement series. + +

    Save Chart to an Image File

    + +Click to save the current chart to an image file. + +

    Save Data to a .csv File

    + +Click to save data from the Radiometer Data table to a .csv file. + +

    Autoscale

    + +When checked, continuously automatically scales both X and Y axis so all data is visible. When unchecked, the axis scales can be set manually. + +

    Autoscale X

    + +When clicked, automatically scales the X axis so all data is visible. + +

    Autoscale Y

    + +When clicked, automatically scales the Y axis so all data is visible. + +

    Ref

    + +Sets the reference level (maximum value) of the Y axis. + +

    Range

    + +Sets the range of the Y axis. + +

    Start

    + +Sets the start time of the X axis. + +

    End

    + +Sets the end time of the X axis. + +

    Sel

    + +Selects what is selected when clicking on the chart: + +- Row highlights the corresponding row in the Radiometer Data table to the point clicked. +- M1 sets position of marker 1 +- M2 sets position of marker 2 +- Gaussian sets peak of Gaussian + +

    Center

    + +Specifies the date and time of the center of the Gaussian. + +

    a

    + +Specifies the amplitude of the Gaussian. Units correspond to the Y axis units. + +

    f

    + +Specifies the floor (minimum value of the Gaussian). Units correspond to the Y axis units. + +

    Delta t FHWM

    + +Specifies the full-width at half maximum of the Gaussian in seconds. + +

    HPBW

    + +An estimate of the HPBW in degrees of an antenna whose main lobe corresponds to the Gaussian profile of a drift scan of the Sun, using a linear scale (E.g. Y axis must not be in not dB). + +![Radiometer Gaussian Fit](../../../doc/img/RadioAstronomy_RadiometerGaussian.png) + +

    Marker Table

    + +The marker table displays corresponding values for markers that are placed on the chart. + +

    Radiometer 2D Map

    + +![Radiometer 2D Map](../../../doc/img/RadioAstronomy_Radiometer2D.png) + +

    Link Sweep

    + +When checked, the parameters for the 2D Map will be automatically updated based on the Run Control sweep parameters. + +

    Sweep Type

    + +Sets the coordinates used for the axes of the map. + +

    Width

    + +Width in pixels of the map. Typically there should be one pixel per measurement. + +

    Height

    + +Height in pixels of the map. + +

    X Range

    + +Specifies the range of the 2D map's horizontal axis. This determines how measurements map to pixels. + +

    Y Range

    + +Specifies the range of the 2D map's vertical axis. + +

    Autoscale

    + +Automatically scales the X and Y axes to fit the Radiometer data in the table. + +

    Colour Autoscale

    + +Automatically scales the colour palette to the range of existing values in the Radiometer data table. + +

    Min

    + +Specifies the value that maps to the first colour in the palette. All values lower than this will be clipped to the first colour. + +

    Max

    + +Specifies the value that maps to the last colour in the palette. All values higher than this will be clipped to the last colour. + +

    Palette

    + +Specifies the palette / gradient used to plot the 2D map. This can either be colour or greyscale. The gradient is applied linearly between the Min and Max values. + +

    Radiometer Data

    + +The Radiometer Data table shows measurement results and settings at the time of measurement in tabular form. + +![Radiometer Data GUI](../../../doc/img/RadioAstronomy_RadiometerData.png) + +The columns in the table include: + +- Date - Date at the end of the measurement. +- Time - Time at the end of the measurement. +- Power (FFT) - Power relative to fullscale (sum of FFT absolute magnitude). +- Power (dBFS) - Power in dBFS. +- Power (dBm) - Power in dBm. +- Tsys (K) - System noise temperature in Kelvin. +- Tsys0 (K) - System noise temperature (excluding Tsource) in Kelvin. +- Tsource (K) - Source noise temperature in Kelvin. +- Tb (K) - Source brightness temperature in Kelvin. +- Tsky (K) - Sky temperature in Kelvin towards the target from Star Tracker. +- Sv (Jy) - Spectral flux density in Jansky. +- sigmaTsys (K) - Standard deviation of Tsys in Kelvin. +- sigmaSsys (Jy) - Standard deviation of Sv in Jansky. +- omegaA (sr) - Antenna beam solid angle. +- omegaS (sr) - Source solid angle. +- RA - Right ascension of target from Star Tracker. +- Dec - Declination of target from Star Tracker. +- l - Galactic longitude of target from Star Tracker. +- b - Galactic latitude of target from Star Tracker. +- Az - Azimuth of target from Star Tracker. +- El - Elevation of target from Star Tracker. +- Vbcrs - Observer velocity relative to barycentric celestial reference system (BCRS). +- Vlsr - Observer velocity relative to local standard of rest (LSR). +- Solar Flux (jy) - Solar flux from Star Tracker. +- Air Temp (C) - Surface air temperature at observation point in Celsius from Star Tracker. +- Sensor 1 - Data recorded for Sensor 1. +- Sensor 2 - Data recorded for Sensor 2. + +Right clicking on the table shows a popup menu that supports: + +- Copying the value in the cell to the clipboard +- Deleting the selected rows +- Applying the current values of Tsys0, baseline and omega S to recalculate Tsource, Tb and Sv. + +

    Calibration

    + +Power measurements in SDRs are typically relative (E.g. dBFS) rather than absolute (E.g. dBm). In order to produce absolute power measurements, +and thus noise temperature measurements, we need to perform a calibration process that calculates a mapping from the relative power value to an absolute value. +Also, there are multiple unwanted noise sources that contribute to the measured power (LNA and receiver noise, for example), +that we wish to subtract from our power measurement, to get a measurement of the power of the radiation received from the astronomical object we are observing. + +The first step is to measure the noise of the receiver, Trx. This is the combined noise of the LNA, feed line and SDR, for a particular gain setting. +This can be measured with a calibrated noise source connected to the LNA input using SDRangel's [Noise Figure plugin](https://github.com/f4exb/sdrangel/blob/master/plugins/channelrx/noisefigure/readme.md), +or estimated from datasheet values for the individual components using the [Friis formula](https://en.wikipedia.org/wiki/Friis_formulas_for_noise). +It is also possible to calculate this within the Radio Astronomy plugin by running a hot and cold calibration. The plugin will then use the Y factor method +to estimate Trx, and this will be displayed in the Trx field, below the chart. Whatever method is used, the value should be entered in to the Trx field in the Settings area. + +In order to map relative powers to absolute powers (and temperatures), a hot calibration should be run. To run a hot calibration, the noise +temperature of the calibration source is entered in to the Thot field (or power into Phot) and then press the "Start hot calibration" button. (The process +is likewise to run a cold calibration). The main consideration for a user, is what can be used as a calibration source and how is it connected to the antenna/receiver. +There are two ways, with and without an antenna: + +For parabolic dishes or horn antennas, an object at a known temperature can be used, so long as it completely covers the feed horn aperture. +The object needs to be as close to an ideal blackbody as possible, with high emissivity at the frequencies of interest, so that the temperature +of the object results in an identical increase in noise temperature in the antenna. If the dish is steerable to point towards the ground, the temperature +of the ground may be used. + +It is also possible to calibrate by directly connecting a noise source to the LNA input. This could be as simple as 50Ohm termination resistor, +which should result in a noise temperature corresponding to the physical temperature of the resistor, assuming good impedance matching and very low insertion loss. + +One large unknown can be the spillover temperature, Tsp. This is the noise contribution due to ground or building thermal radiation leaking in +to the feed horn from the back or side lobes. Once Trx is known, is possible to estimate Tsp by performing a hot and cold calibration, +where the hot calibration uses an object blocking the feed, but the cold calibration has the feed unblocked pointing to a cold part of the sky. +The temperature of the cold sky can be estimated from an all-sky survey in Star Tracker, and this is displayed under the calibration chart as Tsky. +If Thot is measured with Tsp=0, Tcold is Tsky, and Trx is known, then the plugin can estimate Tsp for the cold measurement. Note that Tsp is typically strongly +dependent on the antenna's elevation and azimuth, as this changes the amount of ground thermal radiation that gets in to the antenna. + +![Calibration Settings dialog](../../../doc/img/RadioAstronomy_Calibration.png) + +

    Show Calibration Settings Dialog

    + +When clicked, shows the Calibration Settings dialog. + +The Calibration Settings dialog allows a user to control hardware used for calibration. It supports two methods: GPIO pins in a SDR can be toggled during calibration and/or +commands/scripts can be run before and after calibration. The pre-calibration delay setting specifies a delay in seconds between the GPIO being toggled or start command +being executed, before the calibration routine in the plugin starts. + +An example of its use would be to electronically switch in a 50Ohm resistor to the LNA input when calibration is run, using one of the SDR's GPIO pins to control the RF switch. + +![Calibration Settings dialog](../../../doc/img/RadioAstronomy_CalibrationSettings.png) + +

    Clear Calibration Data

    + +Clears all calibration data. + +

    Start Hot Calibration

    + +Starts a measurement that will be used as the hot calibration data. + +

    Start Cold Calibration

    + +Starts a measurement that will be used as the cold calibration data. + +

    Recalibrate All Measurements

    + +When checked, results of a new calibration will be applied to all existing measurements. When unchecked, the calibration will only apply to new measurements. + +

    API

    + +Full details of the API can be found in the Swagger documentation. Here is a quick example of how to start a measurement from the command line: + + curl -X POST "http://127.0.0.1:8091/sdrangel/deviceset/0/channel/0/actions" -d '{"channelType": "RadioAstronomy", "direction": 0, "RadioAstronomyActions": { "start": {"sampleRate": 2000000} }}' + +Or to set the sample rate: + + curl -X PATCH "http://127.0.0.1:8091/sdrangel/deviceset/0/channel/0/settings" -d '{"channelType": "RadioAstronomy", "direction": 0, "RadioAstronomySettings": {"sampleRate": 2000000}}' + +

    Attribution

    + +Many equations are from Essential Radio Astronomy by James Condon and Scott Ransom: https://www.cv.nrao.edu/~sransom/web/xxx.html + +The Leiden/Argentine/Bonn (LAB) Survey of Galactic HI: https://arxiv.org/abs/astro-ph/0504140 and EU-HOU project: https://www.astro.uni-bonn.de/hisurvey/euhou/index.php + +Thermometer icons are by Freepik from https://www.flaticon.com/ + +Reverse icon by Creaticca Creative Agency from https://www.flaticon.com/ diff --git a/plugins/feature/startracker/startracker.cpp b/plugins/feature/startracker/startracker.cpp index b8cd38a47..908d810c8 100644 --- a/plugins/feature/startracker/startracker.cpp +++ b/plugins/feature/startracker/startracker.cpp @@ -662,13 +662,13 @@ void StarTracker::networkManagerFinished(QNetworkReply *reply) void StarTracker::weatherUpdated(float temperature, float pressure, float humidity) { - if (!isnan(temperature)) { + if (!std::isnan(temperature)) { m_settings.m_temperature = temperature; } - if (!isnan(pressure)) { + if (!std::isnan(pressure)) { m_settings.m_pressure = pressure; } - if (!isnan(humidity)) { + if (!std::isnan(humidity)) { m_settings.m_humidity = humidity; } diff --git a/sdrbase/channel/channelwebapiutils.cpp b/sdrbase/channel/channelwebapiutils.cpp index 9f27394a4..53bbb0557 100644 --- a/sdrbase/channel/channelwebapiutils.cpp +++ b/sdrbase/channel/channelwebapiutils.cpp @@ -27,6 +27,8 @@ #include "SWGDeviceSet.h" #include "SWGChannelActions.h" #include "SWGFileSinkActions.h" +#include "SWGFeatureSettings.h" +#include "SWGFeatureReport.h" #include "maincore.h" #include "device/deviceset.h" @@ -37,14 +39,13 @@ #include "dsp/devicesamplemimo.h" #include "webapi/webapiadapterinterface.h" #include "webapi/webapiutils.h" +#include "feature/featureset.h" +#include "feature/feature.h" -// Get device center frequency -bool ChannelWebAPIUtils::getCenterFrequency(unsigned int deviceIndex, double &frequencyInHz) +bool ChannelWebAPIUtils::getDeviceSettings(unsigned int deviceIndex, SWGSDRangel::SWGDeviceSettings &deviceSettingsResponse, DeviceSet *&deviceSet) { - SWGSDRangel::SWGDeviceSettings deviceSettingsResponse; QString errorResponse; int httpRC; - DeviceSet *deviceSet; // Get current device settings std::vector deviceSets = MainCore::instance()->getDeviceSets(); @@ -74,114 +75,129 @@ bool ChannelWebAPIUtils::getCenterFrequency(unsigned int deviceIndex, double &fr } else { - qDebug() << "ChannelWebAPIUtils::getCenterFrequency - not a sample source device " << deviceIndex; + qDebug() << "ChannelWebAPIUtils::getDeviceSettings - not a sample source device " << deviceIndex; return false; } } else { - qDebug() << "ChannelWebAPIUtils::getCenterFrequency - no device " << deviceIndex; + qDebug() << "ChannelWebAPIUtils::getDeviceSettings - no device " << deviceIndex; return false; } if (httpRC/100 != 2) { - qWarning("ChannelWebAPIUtils::getCenterFrequency: get device frequency error %d: %s", + qWarning("ChannelWebAPIUtils::getDeviceSettings: get device settings error %d: %s", httpRC, qPrintable(errorResponse)); return false; } - QJsonObject *jsonObj = deviceSettingsResponse.asJsonObject(); - return WebAPIUtils::getSubObjectDouble(*jsonObj, "centerFrequency", frequencyInHz); + return true; +} + +bool ChannelWebAPIUtils::getFeatureSettings(unsigned int featureSetIndex, unsigned int featureIndex, SWGSDRangel::SWGFeatureSettings &featureSettingsResponse, Feature *&feature) +{ + QString errorResponse; + int httpRC; + FeatureSet *featureSet; + + // Get current feature settings + std::vector featureSets = MainCore::instance()->getFeatureeSets(); + if (featureSetIndex < featureSets.size()) + { + featureSet = featureSets[featureSetIndex]; + if (featureIndex < featureSet->getNumberOfFeatures()) + { + feature = featureSet->getFeatureAt(featureIndex); + httpRC = feature->webapiSettingsGet(featureSettingsResponse, errorResponse); + } + else + { + qDebug() << "ChannelWebAPIUtils::getFeatureSettings: no feature " << featureSetIndex << ":" << featureIndex; + return false; + } + } + else + { + qDebug() << "ChannelWebAPIUtils::getFeatureSettings: no feature set " << featureSetIndex; + return false; + } + + if (httpRC/100 != 2) + { + qWarning("ChannelWebAPIUtils::getFeatureSettings: get feature settings error %d: %s", + httpRC, qPrintable(errorResponse)); + return false; + } + + return true; +} + + +// Get device center frequency +bool ChannelWebAPIUtils::getCenterFrequency(unsigned int deviceIndex, double &frequencyInHz) +{ + SWGSDRangel::SWGDeviceSettings deviceSettingsResponse; + DeviceSet *deviceSet; + + if (getDeviceSettings(deviceIndex, deviceSettingsResponse, deviceSet)) + { + QJsonObject *jsonObj = deviceSettingsResponse.asJsonObject(); + return WebAPIUtils::getSubObjectDouble(*jsonObj, "centerFrequency", frequencyInHz); + } + else + { + return false; + } } // Set device center frequency bool ChannelWebAPIUtils::setCenterFrequency(unsigned int deviceIndex, double frequencyInHz) { SWGSDRangel::SWGDeviceSettings deviceSettingsResponse; - QString errorResponse; int httpRC; DeviceSet *deviceSet; - // Get current device settings - std::vector deviceSets = MainCore::instance()->getDeviceSets(); - if (deviceIndex < deviceSets.size()) + if (getDeviceSettings(deviceIndex, deviceSettingsResponse, deviceSet)) { - deviceSet = deviceSets[deviceIndex]; - if (deviceSet->m_deviceSourceEngine) + // Patch centerFrequency + QJsonObject *jsonObj = deviceSettingsResponse.asJsonObject(); + double freq; + if (WebAPIUtils::getSubObjectDouble(*jsonObj, "centerFrequency", freq)) { - deviceSettingsResponse.setDeviceHwType(new QString(deviceSet->m_deviceAPI->getHardwareId())); - deviceSettingsResponse.setDirection(0); + WebAPIUtils::setSubObjectDouble(*jsonObj, "centerFrequency", frequencyInHz); + QStringList deviceSettingsKeys; + deviceSettingsKeys.append("centerFrequency"); + deviceSettingsResponse.init(); + deviceSettingsResponse.fromJsonObject(*jsonObj); + SWGSDRangel::SWGErrorResponse errorResponse2; + DeviceSampleSource *source = deviceSet->m_deviceAPI->getSampleSource(); - httpRC = source->webapiSettingsGet(deviceSettingsResponse, errorResponse); - } - else if (deviceSet->m_deviceSinkEngine) - { - deviceSettingsResponse.setDeviceHwType(new QString(deviceSet->m_deviceAPI->getHardwareId())); - deviceSettingsResponse.setDirection(1); - DeviceSampleSink *sink = deviceSet->m_deviceAPI->getSampleSink(); - httpRC = sink->webapiSettingsGet(deviceSettingsResponse, errorResponse); - } - else if (deviceSet->m_deviceMIMOEngine) - { - deviceSettingsResponse.setDeviceHwType(new QString(deviceSet->m_deviceAPI->getHardwareId())); - deviceSettingsResponse.setDirection(2); - DeviceSampleMIMO *mimo = deviceSet->m_deviceAPI->getSampleMIMO(); - httpRC = mimo->webapiSettingsGet(deviceSettingsResponse, errorResponse); + + httpRC = source->webapiSettingsPutPatch(false, deviceSettingsKeys, deviceSettingsResponse, *errorResponse2.getMessage()); + + if (httpRC/100 == 2) + { + qDebug("ChannelWebAPIUtils::setCenterFrequency: set device frequency %f OK", frequencyInHz); + return true; + } + else + { + qWarning("ChannelWebAPIUtils::setCenterFrequency: set device frequency error %d: %s", + httpRC, qPrintable(*errorResponse2.getMessage())); + return false; + } } else { - qDebug() << "ChannelWebAPIUtils::setCenterFrequency: not a sample source device " << deviceIndex; + qWarning("ChannelWebAPIUtils::setCenterFrequency: no centerFrequency key in device settings"); return false; } } else { - qDebug() << "ChannelWebAPIUtils::setCenterFrequency: no device " << deviceIndex; return false; } - - if (httpRC/100 != 2) - { - qWarning("ChannelWebAPIUtils::setCenterFrequency: get device frequency error %d: %s", - httpRC, qPrintable(errorResponse)); - return false; - } - - // Patch centerFrequency - QJsonObject *jsonObj = deviceSettingsResponse.asJsonObject(); - double freq; - if (WebAPIUtils::getSubObjectDouble(*jsonObj, "centerFrequency", freq)) - { - WebAPIUtils::setSubObjectDouble(*jsonObj, "centerFrequency", frequencyInHz); - QStringList deviceSettingsKeys; - deviceSettingsKeys.append("centerFrequency"); - deviceSettingsResponse.init(); - deviceSettingsResponse.fromJsonObject(*jsonObj); - SWGSDRangel::SWGErrorResponse errorResponse2; - - DeviceSampleSource *source = deviceSet->m_deviceAPI->getSampleSource(); - - httpRC = source->webapiSettingsPutPatch(false, deviceSettingsKeys, deviceSettingsResponse, *errorResponse2.getMessage()); - - if (httpRC/100 == 2) - { - qDebug("ChannelWebAPIUtils::setCenterFrequency: set device frequency %f OK", frequencyInHz); - } - else - { - qWarning("ChannelWebAPIUtils::setCenterFrequency: set device frequency error %d: %s", - httpRC, qPrintable(*errorResponse2.getMessage())); - return false; - } - } - else - { - qWarning("ChannelWebAPIUtils::setCenterFrequency: no centerFrequency key in device settings"); - return false; - } - - return true; } // Start acquisition @@ -462,3 +478,214 @@ bool ChannelWebAPIUtils::satelliteLOS(const QString name) } return true; } + +bool ChannelWebAPIUtils::getDeviceSetting(unsigned int deviceIndex, const QString &setting, int &value) +{ + SWGSDRangel::SWGDeviceSettings deviceSettingsResponse; + DeviceSet *deviceSet; + + if (getDeviceSettings(deviceIndex, deviceSettingsResponse, deviceSet)) + { + QJsonObject *jsonObj = deviceSettingsResponse.asJsonObject(); + return WebAPIUtils::getSubObjectInt(*jsonObj, setting, value); + } + else + { + return false; + } +} + +bool ChannelWebAPIUtils::patchDeviceSetting(unsigned int deviceIndex, const QString &setting, int value) +{ + SWGSDRangel::SWGDeviceSettings deviceSettingsResponse; + QString errorResponse; + int httpRC; + DeviceSet *deviceSet; + + if (getDeviceSettings(deviceIndex, deviceSettingsResponse, deviceSet)) + { + // Patch centerFrequency + QJsonObject *jsonObj = deviceSettingsResponse.asJsonObject(); + int oldValue; + if (WebAPIUtils::getSubObjectInt(*jsonObj, setting, oldValue)) + { + WebAPIUtils::setSubObjectInt(*jsonObj, setting, value); + QStringList deviceSettingsKeys; + deviceSettingsKeys.append(setting); + deviceSettingsResponse.init(); + deviceSettingsResponse.fromJsonObject(*jsonObj); + SWGSDRangel::SWGErrorResponse errorResponse2; + + DeviceSampleSource *source = deviceSet->m_deviceAPI->getSampleSource(); + + httpRC = source->webapiSettingsPutPatch(false, deviceSettingsKeys, deviceSettingsResponse, *errorResponse2.getMessage()); + + if (httpRC/100 == 2) + { + qDebug("ChannelWebAPIUtils::patchDeviceSetting: set device setting %s OK", setting); + return true; + } + else + { + qWarning("ChannelWebAPIUtils::patchDeviceSetting: set device setting error %d: %s", + httpRC, qPrintable(*errorResponse2.getMessage())); + return false; + } + } + else + { + qWarning("ChannelWebAPIUtils::patchDeviceSetting: no key %s in device settings", setting); + return false; + } + } + else + { + return false; + } +} + +// Set feature setting +bool ChannelWebAPIUtils::patchFeatureSetting(unsigned int featureSetIndex, unsigned int featureIndex, const QString &setting, const QString &value) +{ + SWGSDRangel::SWGFeatureSettings featureSettingsResponse; + int httpRC; + Feature *feature; + + if (getFeatureSettings(featureSetIndex, featureIndex, featureSettingsResponse, feature)) + { + // Patch settings + QJsonObject *jsonObj = featureSettingsResponse.asJsonObject(); + QString oldValue; + if (WebAPIUtils::getSubObjectString(*jsonObj, setting, oldValue)) + { + WebAPIUtils::setSubObjectString(*jsonObj, setting, value); + QStringList featureSettingsKeys; + featureSettingsKeys.append(setting); + featureSettingsResponse.init(); + featureSettingsResponse.fromJsonObject(*jsonObj); + SWGSDRangel::SWGErrorResponse errorResponse2; + + httpRC = feature->webapiSettingsPutPatch(false, featureSettingsKeys, featureSettingsResponse, *errorResponse2.getMessage()); + + if (httpRC/100 == 2) + { + qDebug("ChannelWebAPIUtils::patchFeatureSetting: set feature setting %s to %s OK", setting, value); + return true; + } + else + { + qWarning("ChannelWebAPIUtils::patchFeatureSetting: set feature setting %s to %s error %d: %s", + setting, value, httpRC, qPrintable(*errorResponse2.getMessage())); + return false; + } + } + else + { + qWarning("ChannelWebAPIUtils::patchFeatureSetting: no key %s in feature settings", setting); + return false; + } + } + else + { + return false; + } +} + +bool ChannelWebAPIUtils::patchFeatureSetting(unsigned int featureSetIndex, unsigned int featureIndex, const QString &setting, double value) +{ + SWGSDRangel::SWGFeatureSettings featureSettingsResponse; + QString errorResponse; + int httpRC; + FeatureSet *featureSet; + Feature *feature; + + if (getFeatureSettings(featureSetIndex, featureIndex, featureSettingsResponse, feature)) + { + // Patch settings + QJsonObject *jsonObj = featureSettingsResponse.asJsonObject(); + double oldValue; + if (WebAPIUtils::getSubObjectDouble(*jsonObj, setting, oldValue)) + { + WebAPIUtils::setSubObjectDouble(*jsonObj, setting, value); + QStringList featureSettingsKeys; + featureSettingsKeys.append(setting); + featureSettingsResponse.init(); + featureSettingsResponse.fromJsonObject(*jsonObj); + SWGSDRangel::SWGErrorResponse errorResponse2; + + httpRC = feature->webapiSettingsPutPatch(false, featureSettingsKeys, featureSettingsResponse, *errorResponse2.getMessage()); + + if (httpRC/100 == 2) + { + qDebug("ChannelWebAPIUtils::patchFeatureSetting: set feature setting %s to %f OK", setting, value); + return true; + } + else + { + qWarning("ChannelWebAPIUtils::patchFeatureSetting: set feature setting %s to %s error %d: %s", + setting, value, httpRC, qPrintable(*errorResponse2.getMessage())); + return false; + } + } + else + { + qWarning("ChannelWebAPIUtils::patchFeatureSetting: no key %s in feature settings", setting); + return false; + } + } + else + { + return false; + } +} + +bool ChannelWebAPIUtils::getFeatureReportValue(unsigned int featureSetIndex, unsigned int featureIndex, const QString &key, int &value) +{ + SWGSDRangel::SWGFeatureReport featureReport; + QString errorResponse; + int httpRC; + FeatureSet *featureSet; + Feature *feature; + + // Get feature report + std::vector featureSets = MainCore::instance()->getFeatureeSets(); + if (featureSetIndex < featureSets.size()) + { + featureSet = featureSets[featureSetIndex]; + if (featureIndex < featureSet->getNumberOfFeatures()) + { + feature = featureSet->getFeatureAt(featureIndex); + httpRC = feature->webapiReportGet(featureReport, errorResponse); + } + else + { + qDebug() << "ChannelWebAPIUtils::getFeatureReportValue: no feature " << featureSetIndex << ":" << featureIndex; + return false; + } + } + else + { + qDebug() << "ChannelWebAPIUtils::getFeatureReportValue: no feature set " << featureSetIndex; + return false; + } + + if (httpRC/100 != 2) + { + qWarning("ChannelWebAPIUtils::getFeatureReportValue: get feature report error %d: %s", + httpRC, qPrintable(errorResponse)); + return false; + } + + // Get value of requested key + QJsonObject *jsonObj = featureReport.asJsonObject(); + if (WebAPIUtils::getSubObjectInt(*jsonObj, key, value)) + { + // Done + return true; + } + else + { + qWarning("ChannelWebAPIUtils::getFeatureReportValue: no key %s in feature report", key); + return false; + } +} diff --git a/sdrbase/channel/channelwebapiutils.h b/sdrbase/channel/channelwebapiutils.h index 0550ed34e..50bbe0cbe 100644 --- a/sdrbase/channel/channelwebapiutils.h +++ b/sdrbase/channel/channelwebapiutils.h @@ -20,8 +20,14 @@ #include +#include "SWGDeviceSettings.h" +#include "SWGFeatureSettings.h" + #include "export.h" +class DeviceSet; +class Feature; + class SDRBASE_API ChannelWebAPIUtils { public: @@ -34,6 +40,14 @@ public: static bool startStopFileSinks(unsigned int deviceIndex, bool start); static bool satelliteAOS(const QString name, bool northToSouthPass); static bool satelliteLOS(const QString name); + static bool getDeviceSetting(unsigned int deviceIndex, const QString &setting, int &value); + static bool patchDeviceSetting(unsigned int deviceIndex, const QString &setting, int value); + static bool patchFeatureSetting(unsigned int featureSetIndex, unsigned int featureIndex, const QString &setting, const QString &value); + static bool patchFeatureSetting(unsigned int featureSetIndex, unsigned int featureIndex, const QString &setting, double value); + static bool getFeatureReportValue(unsigned int featureSetIndex, unsigned int featureIndex, const QString &key, int &value); +protected: + static bool getDeviceSettings(unsigned int deviceIndex, SWGSDRangel::SWGDeviceSettings &deviceSettingsResponse, DeviceSet *&deviceSet); + static bool getFeatureSettings(unsigned int featureSetIndex, unsigned int featureIndex, SWGSDRangel::SWGFeatureSettings &featureSettingsResponse, Feature *&feature); }; #endif // SDRBASE_CHANNEL_CHANNELWEBAPIUTILS_H_ diff --git a/sdrbase/util/units.h b/sdrbase/util/units.h index 9a17d0699..d82a1a0b7 100644 --- a/sdrbase/util/units.h +++ b/sdrbase/util/units.h @@ -298,6 +298,30 @@ public: return sfu * 1e-22f; } + template + static T wattsPerMetrePerHertzToSolarFluxUnits(T w) + { + return w / 1e-22f; + } + + template + static T wattsPerMetrePerHertzToJansky(T w) + { + return w / 1e-26f; + } + + template + static T noiseFigureToNoiseTemp(T nfdB, T refTempK=T(290.0)) + { + return refTempK * (std::pow(T(10.0), nfdB/T(10.0)) - T(1.0)); + } + + template + static T noiseTempToNoiseFigureTo(T tempK, T refTempK=T(290.0)) + { + return T(10.0) * std::log10(tempK/refTempK+T(1.0)); + } + }; #endif // INCLUDE_UNITS_H diff --git a/sdrbase/util/visa.cpp b/sdrbase/util/visa.cpp index eee60b1c5..6cc01935d 100644 --- a/sdrbase/util/visa.cpp +++ b/sdrbase/util/visa.cpp @@ -106,6 +106,31 @@ void VISA::close(ViSession session) } } +QStringList VISA::processCommands(ViSession session, const QString& commands) +{ + QStringList list = commands.split("\n"); + QStringList results; + for (int i = 0; i < list.size(); i++) + { + QString command = list[i].trimmed(); + if (!command.isEmpty() && !command.startsWith("#")) // Allow # to comment out lines + { + qDebug() << "VISA ->: " << command; + QByteArray bytes = QString("%1\n").arg(command).toLatin1(); + char *cmd = bytes.data(); + viPrintf(session, cmd); + if (command.endsWith("?")) + { + char buf[1024] = ""; + char format[] = "%t"; + viScanf(session, format, buf); + results.append(buf); + qDebug() << "VISA <-: " << QString(buf).trimmed(); + } + } + } + return results; +} #ifdef _MSC_VER diff --git a/sdrbase/util/visa.h b/sdrbase/util/visa.h index 153a60de9..b8f60cfae 100644 --- a/sdrbase/util/visa.h +++ b/sdrbase/util/visa.h @@ -61,6 +61,7 @@ public: void closeDefault(); ViSession open(const QString& device); void close(ViSession session); + QStringList processCommands(ViSession session, const QString& commands); // Is the VISA library available bool isAvailable() const diff --git a/sdrbase/webapi/webapirequestmapper.cpp b/sdrbase/webapi/webapirequestmapper.cpp index 5bd9274eb..bf5d093e6 100644 --- a/sdrbase/webapi/webapirequestmapper.cpp +++ b/sdrbase/webapi/webapirequestmapper.cpp @@ -4305,6 +4305,11 @@ bool WebAPIRequestMapper::getChannelSettings( channelSettings->setPagerDemodSettings(new SWGSDRangel::SWGPagerDemodSettings()); channelSettings->getPagerDemodSettings()->fromJsonObject(settingsJsonObject); } + else if (channelSettingsKey == "RadioAstronomySettings") + { + channelSettings->setRadioAstronomySettings(new SWGSDRangel::SWGRadioAstronomySettings()); + channelSettings->getRadioAstronomySettings()->fromJsonObject(settingsJsonObject); + } else if (channelSettingsKey == "RadioClockSettings") { channelSettings->setRadioClockSettings(new SWGSDRangel::SWGRadioClockSettings()); @@ -4412,6 +4417,11 @@ bool WebAPIRequestMapper::getChannelActions( channelActions->setIeee802154ModActions(new SWGSDRangel::SWGIEEE_802_15_4_ModActions()); channelActions->getIeee802154ModActions()->fromJsonObject(actionsJsonObject); } + else if (channelActionsKey == "RadioAstronomyActions") + { + channelActions->setRadioAstronomyActions(new SWGSDRangel::SWGRadioAstronomyActions()); + channelActions->getRadioAstronomyActions()->fromJsonObject(actionsJsonObject); + } else if (channelActionsKey == "PacketModActions") { channelActions->setPacketModActions(new SWGSDRangel::SWGPacketModActions()); @@ -5004,6 +5014,8 @@ void WebAPIRequestMapper::resetChannelSettings(SWGSDRangel::SWGChannelSettings& channelSettings.setPacketDemodSettings(nullptr); channelSettings.setPacketModSettings(nullptr); channelSettings.setPagerDemodSettings(nullptr); + channelSettings.setRadioAstronomySettings(nullptr); + channelSettings.setRadioClockSettings(nullptr); channelSettings.setRemoteSinkSettings(nullptr); channelSettings.setRemoteSourceSettings(nullptr); channelSettings.setSsbDemodSettings(nullptr); @@ -5033,6 +5045,8 @@ void WebAPIRequestMapper::resetChannelReport(SWGSDRangel::SWGChannelReport& chan channelReport.setNoiseFigureReport(nullptr); channelReport.setIeee802154ModReport(nullptr); channelReport.setPacketModReport(nullptr); + channelReport.setRadioAstronomyReport(nullptr); + channelReport.setRadioClockReport(nullptr); channelReport.setRemoteSourceReport(nullptr); channelReport.setSsbDemodReport(nullptr); channelReport.setSsbModReport(nullptr); @@ -5051,6 +5065,7 @@ void WebAPIRequestMapper::resetChannelActions(SWGSDRangel::SWGChannelActions& ch channelActions.setChannelType(nullptr); channelActions.setFileSourceActions(nullptr); channelActions.setIeee802154ModActions(nullptr); + channelActions.setRadioAstronomyActions(nullptr); channelActions.setPacketModActions(nullptr); } diff --git a/sdrbase/webapi/webapiutils.cpp b/sdrbase/webapi/webapiutils.cpp index bef32be37..f05f84e8b 100644 --- a/sdrbase/webapi/webapiutils.cpp +++ b/sdrbase/webapi/webapiutils.cpp @@ -25,7 +25,6 @@ const QMap WebAPIUtils::m_channelURIToSettingsKey = { {"sdrangel.channel.adsbdemod", "ADSBDemodSettings"}, {"sdrangel.channel.modais", "AISModSettings"}, {"sdrangel.channel.aisdemod", "AISDemodSettings"}, - {"sdrangel.channel.aptdemod", "APTDemodSettings"}, {"sdrangel.channel.amdemod", "AMDemodSettings"}, {"sdrangel.channel.aptdemod", "APTDemodSettings"}, {"de.maintech.sdrangelove.channel.am", "AMDemodSettings"}, // remap @@ -64,6 +63,7 @@ const QMap WebAPIUtils::m_channelURIToSettingsKey = { {"sdrangel.channeltx.modssb", "SSBModSettings"}, {"sdrangel.channel.ssbdemod", "SSBDemodSettings"}, {"de.maintech.sdrangelove.channel.ssb", "SSBDemodSettings"}, // remap + {"sdrangel.channel.radioastronomy", "RadioAstronomySettings"}, {"sdrangel.channeltx.udpsource", "UDPSourceSettings"}, {"sdrangel.channeltx.udpsink", "UDPSinkSettings"}, // remap {"sdrangel.channel.udpsink", "UDPSinkSettings"}, @@ -157,6 +157,7 @@ const QMap WebAPIUtils::m_channelTypeToSettingsKey = { {"PagerDemod", "PagerDemodSettings"}, {"LocalSink", "LocalSinkSettings"}, {"LocalSource", "LocalSourceSettings"}, + {"RadioAstronomy", "RadioAstronomySettings"}, {"RadioClock", "RadioClockSettings"}, {"RemoteSink", "RemoteSinkSettings"}, {"RemoteSource", "RemoteSourceSettings"}, @@ -179,6 +180,7 @@ const QMap WebAPIUtils::m_channelTypeToActionsKey = { {"FileSource", "FileSourceActions"}, {"SigMFFileSink", "SigMFFileSinkActions"}, {"IEEE_802_15_4_Mod", "IEEE_802_15_4_ModActions"}, + {"RadioAstronomy", "RadioAstronomyActions"}, {"PacketMod", "PacketModActions"} }; @@ -431,6 +433,51 @@ bool WebAPIUtils::setSubObjectInt(QJsonObject &json, const QString &key, int val return false; } +// Get string value from within nested JSON object +bool WebAPIUtils::getSubObjectString(const QJsonObject &json, const QString &key, QString &value) +{ + for (QJsonObject::const_iterator it = json.begin(); it != json.end(); it++) + { + QJsonValue jsonValue = it.value(); + + if (jsonValue.isObject()) + { + QJsonObject subObject = jsonValue.toObject(); + + if (subObject.contains(key)) + { + value = subObject[key].toString(); + return true; + } + } + } + + return false; +} + +// Set string value withing nested JSON object +bool WebAPIUtils::setSubObjectString(QJsonObject &json, const QString &key, const QString &value) +{ + for (QJsonObject::iterator it = json.begin(); it != json.end(); it++) + { + QJsonValue jsonValue = it.value(); + + if (jsonValue.isObject()) + { + QJsonObject subObject = jsonValue.toObject(); + + if (subObject.contains(key)) + { + subObject[key] = value; + it.value() = subObject; + return true; + } + } + } + + return false; +} + // look for value in key=value bool WebAPIUtils::extractValue(const QJsonObject &json, const QString &key, QJsonValue &value) { diff --git a/sdrbase/webapi/webapiutils.h b/sdrbase/webapi/webapiutils.h index 2c6c28714..a9b511123 100644 --- a/sdrbase/webapi/webapiutils.h +++ b/sdrbase/webapi/webapiutils.h @@ -49,6 +49,8 @@ public: static bool setSubObjectDouble(QJsonObject &json, const QString &key, double value); static bool getSubObjectInt(const QJsonObject &json, const QString &key, int &value); static bool setSubObjectInt(QJsonObject &json, const QString &key, int value); + static bool getSubObjectString(const QJsonObject &json, const QString &key, QString &value); + static bool setSubObjectString(QJsonObject &json, const QString &key, const QString &value); static bool extractValue(const QJsonObject &json, const QString &key, QJsonValue &value); static bool extractArray(const QJsonObject &json, const QString &key, QJsonArray &value); static bool extractObject(const QJsonObject &json, const QString &key, QJsonObject &value); diff --git a/sdrgui/gui/wrappingdatetimeedit.cpp b/sdrgui/gui/wrappingdatetimeedit.cpp index 14cac8347..b492795a1 100644 --- a/sdrgui/gui/wrappingdatetimeedit.cpp +++ b/sdrgui/gui/wrappingdatetimeedit.cpp @@ -20,52 +20,61 @@ WrappingDateTimeEdit::WrappingDateTimeEdit(QWidget *parent) : QDateTimeEdit(parent) { + // We need to set this true in order for stepBy to be called + // when minutes are at 59 + // However, this also causes dates/times to wrap from max to min + // which we don't want, so in stepBy, we clip to max/min ourselves setWrapping(true); } void WrappingDateTimeEdit::stepBy(int steps) { if (currentSection() == QDateTimeEdit::MonthSection) - setDate(date().addMonths(steps)); + { + clipAndSetDate(date().addMonths(steps)); + } else if (currentSection() == QDateTimeEdit::DaySection) - setDate(date().addDays(steps)); + { + clipAndSetDate(date().addDays(steps)); + } else if (currentSection() == QDateTimeEdit::HourSection) { - QTime t = time(); - int h = t.hour(); - - setTime(time().addSecs(steps*3600)); - - if ((h < -steps) && (steps < 0)) - setDate(date().addDays(-1)); - else if ((h + steps > 23) && (steps > 0)) - setDate(date().addDays(1)); + clipAndSetDateTime(dateTime().addSecs(steps*3600)); } else if (currentSection() == QDateTimeEdit::MinuteSection) { - QTime t = time(); - int h = t.hour(); - int m = t.minute(); - - setTime(time().addSecs(steps*60)); - - if ((m < -steps) && (steps < 0) && (h == 0)) - setDate(date().addDays(-1)); - else if ((m + steps > 59) && (steps > 0) && (h == 23)) - setDate(date().addDays(1)); + clipAndSetDateTime(dateTime().addSecs(steps*60)); } else if (currentSection() == QDateTimeEdit::SecondSection) { - QTime t = time(); - int h = t.hour(); - int m = t.minute(); - int s = t.second(); - - setTime(time().addSecs(steps)); - - if ((s < -steps) && (steps < 0) && (h == 0) && (m == 0)) - setDate(date().addDays(-1)); - else if ((s + steps > 59) && (steps > 0) && (h == 23) && (m == 59)) - setDate(date().addDays(1)); + clipAndSetDateTime(dateTime().addSecs(steps)); + } +} + +void WrappingDateTimeEdit::clipAndSetDate(QDate date) +{ + QDate max = maximumDate(); + QDate min = minimumDate(); + if (date > max) { + setDate(max); + } else if (date < min) { + setDate(min); + } else { + setDate(date); + } +} + +void WrappingDateTimeEdit::clipAndSetDateTime(QDateTime dateTime) +{ + // We have set wrapping as described in the constructor, but we don't want + // to wrap from max to min, so clip to this outself + QDateTime max = maximumDateTime(); + QDateTime min = minimumDateTime(); + if (dateTime > max) { + setDateTime(max); + } else if (dateTime < min) { + setDateTime(min); + } else { + setDateTime(dateTime); } } diff --git a/sdrgui/gui/wrappingdatetimeedit.h b/sdrgui/gui/wrappingdatetimeedit.h index ddc766222..58571ae43 100644 --- a/sdrgui/gui/wrappingdatetimeedit.h +++ b/sdrgui/gui/wrappingdatetimeedit.h @@ -30,6 +30,10 @@ public: explicit WrappingDateTimeEdit(QWidget *parent = nullptr); void stepBy(int steps) override; + +protected: + void clipAndSetDate(QDate date); + void clipAndSetDateTime(QDateTime dateTime); }; #endif // SDRGUI_GUI_WRAPPINGDATETIMEEDIT_H diff --git a/swagger/sdrangel/api/swagger/include/ChannelActions.yaml b/swagger/sdrangel/api/swagger/include/ChannelActions.yaml index dd497db1b..86ce9318a 100644 --- a/swagger/sdrangel/api/swagger/include/ChannelActions.yaml +++ b/swagger/sdrangel/api/swagger/include/ChannelActions.yaml @@ -29,5 +29,7 @@ ChannelActions: $ref: "http://swgserver:8081/api/swagger/include/IEEE_802_15_4_Mod.yaml#/IEEE_802_15_4_ModActions" PacketModActions: $ref: "http://swgserver:8081/api/swagger/include/PacketMod.yaml#/PacketModActions" + RadioAstronomyActions: + $ref: "http://swgserver:8081/api/swagger/include/RadioAstronomy.yaml#/RadioAstronomyActions" SigMFFileSinkActions: $ref: "http://swgserver:8081/api/swagger/include/SigMFFileSink.yaml#/SigMFFileSinkActions" diff --git a/swagger/sdrangel/api/swagger/include/ChannelReport.yaml b/swagger/sdrangel/api/swagger/include/ChannelReport.yaml index b3cd88b35..a8914da66 100644 --- a/swagger/sdrangel/api/swagger/include/ChannelReport.yaml +++ b/swagger/sdrangel/api/swagger/include/ChannelReport.yaml @@ -53,6 +53,8 @@ ChannelReport: $ref: "http://swgserver:8081/api/swagger/include/NoiseFigure.yaml#/NoiseFigureReport" SSBDemodReport: $ref: "http://swgserver:8081/api/swagger/include/SSBDemod.yaml#/SSBDemodReport" + RadioAstronomyReport: + $ref: "http://swgserver:8081/api/swagger/include/RadioAstronomy.yaml#/RadioAstronomyReport" RadioClockReport: $ref: "http://swgserver:8081/api/swagger/include/RadioClock.yaml#/RadioClockReport" RemoteSourceReport: diff --git a/swagger/sdrangel/api/swagger/include/ChannelSettings.yaml b/swagger/sdrangel/api/swagger/include/ChannelSettings.yaml index 1964ba6a2..d82a11a04 100644 --- a/swagger/sdrangel/api/swagger/include/ChannelSettings.yaml +++ b/swagger/sdrangel/api/swagger/include/ChannelSettings.yaml @@ -81,6 +81,8 @@ ChannelSettings: $ref: "http://swgserver:8081/api/swagger/include/PacketMod.yaml#/PacketModSettings" PagerDemodSettings: $ref: "http://swgserver:8081/api/swagger/include/PagerDemod.yaml#/PagerDemodSettings" + RadioAstronomySettings: + $ref: "http://swgserver:8081/api/swagger/include/RadioAstronomy.yaml#/RadioAstronomySettings" RadioClockSettings: $ref: "http://swgserver:8081/api/swagger/include/RadioClock.yaml#/RadioClockSettings" RemoteSinkSettings: diff --git a/swagger/sdrangel/api/swagger/include/RadioAstronomy.yaml b/swagger/sdrangel/api/swagger/include/RadioAstronomy.yaml new file mode 100644 index 000000000..4362bc140 --- /dev/null +++ b/swagger/sdrangel/api/swagger/include/RadioAstronomy.yaml @@ -0,0 +1,92 @@ +RadioAstronomySettings: + description: RadioAstronomy + properties: + inputFrequencyOffset: + type: integer + format: int64 + sampleRate: + type: integer + rfBandwidth: + type: integer + integration: + type: integer + fftSize: + type: integer + fftWindow: + type: integer + filterFreqs: + type: string + starTracker: + type: string + rotator: + type: string + runMode: + description: "(0 for single, 1 for continuous, 2 for sweep)" + type: integer + sweepStartAtTime: + description: "(0 for now, 1 for at sweepStartDateTime)" + type: integer + sweepStartDateTime: + type: string + sweepType: + description: "(0 for Az/El, 1 for l/b, 2 for offset)" + type: integer + sweep1Start: + type: number + format: float + sweep1Stop: + type: number + format: float + sweep1Step: + type: number + format: float + sweep1Delay: + type: number + format: float + sweep2Start: + type: number + format: float + sweep2Stop: + type: number + format: float + sweep2Step: + type: number + format: float + sweep2Delay: + type: number + format: float + rgbColor: + type: integer + title: + type: string + streamIndex: + description: MIMO channel. Not relevant when connected to SI (single Rx). + type: integer + useReverseAPI: + description: Synchronize with reverse API (1 for yes, 0 for no) + type: integer + reverseAPIAddress: + type: string + reverseAPIPort: + type: integer + reverseAPIDeviceIndex: + type: integer + reverseAPIChannelIndex: + type: integer + +RadioAstronomyReport: + description: RadioAstronomy + properties: + channelPowerDB: + description: power received in channel (dB) + type: number + format: float + channelSampleRate: + type: integer + +RadioAstronomyActions: + description: RadioAstronomy + properties: + start: + type: object + description: "Start measurement(s)" diff --git a/swagger/sdrangel/api/swagger/swagger.yaml b/swagger/sdrangel/api/swagger/swagger.yaml index e25826e8f..06c590fee 100644 --- a/swagger/sdrangel/api/swagger/swagger.yaml +++ b/swagger/sdrangel/api/swagger/swagger.yaml @@ -3079,6 +3079,16 @@ definitions: MapItem: $ref: "http://swgserver:8081/api/swagger/include/Map.yaml#/MapItem" + # StarTracker settings passed to/from Radio Astronomy plugin + StarTrackerTarget: + $ref: "http://swgserver:8081/api/swagger/include/StarTracker.yaml#/StarTrackerTarget" + + StarTrackerDisplaySettings: + $ref: "http://swgserver:8081/api/swagger/include/StarTracker.yaml#/StarTrackerDisplaySettings" + + StarTrackerDisplayLoSSettings: + $ref: "http://swgserver:8081/api/swagger/include/StarTracker.yaml#/StarTrackerDisplayLoSSettings" + # This isn't in GS232Controller, as it may eventually be used by other controllers or features TargetAzimuthElevation: description: "A target azimuth and elevation" diff --git a/swagger/sdrangel/code/qt5/client/SWGChannelActions.cpp b/swagger/sdrangel/code/qt5/client/SWGChannelActions.cpp index 10fe16473..90ec4ee8a 100644 --- a/swagger/sdrangel/code/qt5/client/SWGChannelActions.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGChannelActions.cpp @@ -48,6 +48,8 @@ SWGChannelActions::SWGChannelActions() { m_ieee_802_15_4_mod_actions_isSet = false; packet_mod_actions = nullptr; m_packet_mod_actions_isSet = false; + radio_astronomy_actions = nullptr; + m_radio_astronomy_actions_isSet = false; sig_mf_file_sink_actions = nullptr; m_sig_mf_file_sink_actions_isSet = false; } @@ -78,6 +80,8 @@ SWGChannelActions::init() { m_ieee_802_15_4_mod_actions_isSet = false; packet_mod_actions = new SWGPacketModActions(); m_packet_mod_actions_isSet = false; + radio_astronomy_actions = new SWGRadioAstronomyActions(); + m_radio_astronomy_actions_isSet = false; sig_mf_file_sink_actions = new SWGSigMFFileSinkActions(); m_sig_mf_file_sink_actions_isSet = false; } @@ -108,6 +112,9 @@ SWGChannelActions::cleanup() { if(packet_mod_actions != nullptr) { delete packet_mod_actions; } + if(radio_astronomy_actions != nullptr) { + delete radio_astronomy_actions; + } if(sig_mf_file_sink_actions != nullptr) { delete sig_mf_file_sink_actions; } @@ -144,6 +151,8 @@ SWGChannelActions::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&packet_mod_actions, pJson["PacketModActions"], "SWGPacketModActions", "SWGPacketModActions"); + ::SWGSDRangel::setValue(&radio_astronomy_actions, pJson["RadioAstronomyActions"], "SWGRadioAstronomyActions", "SWGRadioAstronomyActions"); + ::SWGSDRangel::setValue(&sig_mf_file_sink_actions, pJson["SigMFFileSinkActions"], "SWGSigMFFileSinkActions", "SWGSigMFFileSinkActions"); } @@ -192,6 +201,9 @@ SWGChannelActions::asJsonObject() { if((packet_mod_actions != nullptr) && (packet_mod_actions->isSet())){ toJsonValue(QString("PacketModActions"), packet_mod_actions, obj, QString("SWGPacketModActions")); } + if((radio_astronomy_actions != nullptr) && (radio_astronomy_actions->isSet())){ + toJsonValue(QString("RadioAstronomyActions"), radio_astronomy_actions, obj, QString("SWGRadioAstronomyActions")); + } if((sig_mf_file_sink_actions != nullptr) && (sig_mf_file_sink_actions->isSet())){ toJsonValue(QString("SigMFFileSinkActions"), sig_mf_file_sink_actions, obj, QString("SWGSigMFFileSinkActions")); } @@ -299,6 +311,16 @@ SWGChannelActions::setPacketModActions(SWGPacketModActions* packet_mod_actions) this->m_packet_mod_actions_isSet = true; } +SWGRadioAstronomyActions* +SWGChannelActions::getRadioAstronomyActions() { + return radio_astronomy_actions; +} +void +SWGChannelActions::setRadioAstronomyActions(SWGRadioAstronomyActions* radio_astronomy_actions) { + this->radio_astronomy_actions = radio_astronomy_actions; + this->m_radio_astronomy_actions_isSet = true; +} + SWGSigMFFileSinkActions* SWGChannelActions::getSigMfFileSinkActions() { return sig_mf_file_sink_actions; @@ -344,6 +366,9 @@ SWGChannelActions::isSet(){ if(packet_mod_actions && packet_mod_actions->isSet()){ isObjectUpdated = true; break; } + if(radio_astronomy_actions && radio_astronomy_actions->isSet()){ + isObjectUpdated = true; break; + } if(sig_mf_file_sink_actions && sig_mf_file_sink_actions->isSet()){ isObjectUpdated = true; break; } diff --git a/swagger/sdrangel/code/qt5/client/SWGChannelActions.h b/swagger/sdrangel/code/qt5/client/SWGChannelActions.h index d80b97983..e11d1d2c6 100644 --- a/swagger/sdrangel/code/qt5/client/SWGChannelActions.h +++ b/swagger/sdrangel/code/qt5/client/SWGChannelActions.h @@ -28,6 +28,7 @@ #include "SWGFileSourceActions.h" #include "SWGIEEE_802_15_4_ModActions.h" #include "SWGPacketModActions.h" +#include "SWGRadioAstronomyActions.h" #include "SWGSigMFFileSinkActions.h" #include @@ -79,6 +80,9 @@ public: SWGPacketModActions* getPacketModActions(); void setPacketModActions(SWGPacketModActions* packet_mod_actions); + SWGRadioAstronomyActions* getRadioAstronomyActions(); + void setRadioAstronomyActions(SWGRadioAstronomyActions* radio_astronomy_actions); + SWGSigMFFileSinkActions* getSigMfFileSinkActions(); void setSigMfFileSinkActions(SWGSigMFFileSinkActions* sig_mf_file_sink_actions); @@ -116,6 +120,9 @@ private: SWGPacketModActions* packet_mod_actions; bool m_packet_mod_actions_isSet; + SWGRadioAstronomyActions* radio_astronomy_actions; + bool m_radio_astronomy_actions_isSet; + SWGSigMFFileSinkActions* sig_mf_file_sink_actions; bool m_sig_mf_file_sink_actions_isSet; diff --git a/swagger/sdrangel/code/qt5/client/SWGChannelReport.cpp b/swagger/sdrangel/code/qt5/client/SWGChannelReport.cpp index 75eefce19..14f39c952 100644 --- a/swagger/sdrangel/code/qt5/client/SWGChannelReport.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGChannelReport.cpp @@ -74,6 +74,8 @@ SWGChannelReport::SWGChannelReport() { m_noise_figure_report_isSet = false; ssb_demod_report = nullptr; m_ssb_demod_report_isSet = false; + radio_astronomy_report = nullptr; + m_radio_astronomy_report_isSet = false; radio_clock_report = nullptr; m_radio_clock_report_isSet = false; remote_source_report = nullptr; @@ -152,6 +154,8 @@ SWGChannelReport::init() { m_noise_figure_report_isSet = false; ssb_demod_report = new SWGSSBDemodReport(); m_ssb_demod_report_isSet = false; + radio_astronomy_report = new SWGRadioAstronomyReport(); + m_radio_astronomy_report_isSet = false; radio_clock_report = new SWGRadioClockReport(); m_radio_clock_report_isSet = false; remote_source_report = new SWGRemoteSourceReport(); @@ -247,6 +251,9 @@ SWGChannelReport::cleanup() { if(ssb_demod_report != nullptr) { delete ssb_demod_report; } + if(radio_astronomy_report != nullptr) { + delete radio_astronomy_report; + } if(radio_clock_report != nullptr) { delete radio_clock_report; } @@ -342,6 +349,8 @@ SWGChannelReport::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&ssb_demod_report, pJson["SSBDemodReport"], "SWGSSBDemodReport", "SWGSSBDemodReport"); + ::SWGSDRangel::setValue(&radio_astronomy_report, pJson["RadioAstronomyReport"], "SWGRadioAstronomyReport", "SWGRadioAstronomyReport"); + ::SWGSDRangel::setValue(&radio_clock_report, pJson["RadioClockReport"], "SWGRadioClockReport", "SWGRadioClockReport"); ::SWGSDRangel::setValue(&remote_source_report, pJson["RemoteSourceReport"], "SWGRemoteSourceReport", "SWGRemoteSourceReport"); @@ -451,6 +460,9 @@ SWGChannelReport::asJsonObject() { if((ssb_demod_report != nullptr) && (ssb_demod_report->isSet())){ toJsonValue(QString("SSBDemodReport"), ssb_demod_report, obj, QString("SWGSSBDemodReport")); } + if((radio_astronomy_report != nullptr) && (radio_astronomy_report->isSet())){ + toJsonValue(QString("RadioAstronomyReport"), radio_astronomy_report, obj, QString("SWGRadioAstronomyReport")); + } if((radio_clock_report != nullptr) && (radio_clock_report->isSet())){ toJsonValue(QString("RadioClockReport"), radio_clock_report, obj, QString("SWGRadioClockReport")); } @@ -721,6 +733,16 @@ SWGChannelReport::setSsbDemodReport(SWGSSBDemodReport* ssb_demod_report) { this->m_ssb_demod_report_isSet = true; } +SWGRadioAstronomyReport* +SWGChannelReport::getRadioAstronomyReport() { + return radio_astronomy_report; +} +void +SWGChannelReport::setRadioAstronomyReport(SWGRadioAstronomyReport* radio_astronomy_report) { + this->radio_astronomy_report = radio_astronomy_report; + this->m_radio_astronomy_report_isSet = true; +} + SWGRadioClockReport* SWGChannelReport::getRadioClockReport() { return radio_clock_report; @@ -915,6 +937,9 @@ SWGChannelReport::isSet(){ if(ssb_demod_report && ssb_demod_report->isSet()){ isObjectUpdated = true; break; } + if(radio_astronomy_report && radio_astronomy_report->isSet()){ + isObjectUpdated = true; break; + } if(radio_clock_report && radio_clock_report->isSet()){ isObjectUpdated = true; break; } diff --git a/swagger/sdrangel/code/qt5/client/SWGChannelReport.h b/swagger/sdrangel/code/qt5/client/SWGChannelReport.h index 2b3ac035a..f0d6d6996 100644 --- a/swagger/sdrangel/code/qt5/client/SWGChannelReport.h +++ b/swagger/sdrangel/code/qt5/client/SWGChannelReport.h @@ -44,6 +44,7 @@ #include "SWGNoiseFigureReport.h" #include "SWGPacketModReport.h" #include "SWGPagerDemodReport.h" +#include "SWGRadioAstronomyReport.h" #include "SWGRadioClockReport.h" #include "SWGRemoteSourceReport.h" #include "SWGSSBDemodReport.h" @@ -144,6 +145,9 @@ public: SWGSSBDemodReport* getSsbDemodReport(); void setSsbDemodReport(SWGSSBDemodReport* ssb_demod_report); + SWGRadioAstronomyReport* getRadioAstronomyReport(); + void setRadioAstronomyReport(SWGRadioAstronomyReport* radio_astronomy_report); + SWGRadioClockReport* getRadioClockReport(); void setRadioClockReport(SWGRadioClockReport* radio_clock_report); @@ -253,6 +257,9 @@ private: SWGSSBDemodReport* ssb_demod_report; bool m_ssb_demod_report_isSet; + SWGRadioAstronomyReport* radio_astronomy_report; + bool m_radio_astronomy_report_isSet; + SWGRadioClockReport* radio_clock_report; bool m_radio_clock_report_isSet; diff --git a/swagger/sdrangel/code/qt5/client/SWGChannelSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGChannelSettings.cpp index fc37227fc..ca2a88d60 100644 --- a/swagger/sdrangel/code/qt5/client/SWGChannelSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGChannelSettings.cpp @@ -100,6 +100,8 @@ SWGChannelSettings::SWGChannelSettings() { m_packet_mod_settings_isSet = false; pager_demod_settings = nullptr; m_pager_demod_settings_isSet = false; + radio_astronomy_settings = nullptr; + m_radio_astronomy_settings_isSet = false; radio_clock_settings = nullptr; m_radio_clock_settings_isSet = false; remote_sink_settings = nullptr; @@ -204,6 +206,8 @@ SWGChannelSettings::init() { m_packet_mod_settings_isSet = false; pager_demod_settings = new SWGPagerDemodSettings(); m_pager_demod_settings_isSet = false; + radio_astronomy_settings = new SWGRadioAstronomySettings(); + m_radio_astronomy_settings_isSet = false; radio_clock_settings = new SWGRadioClockSettings(); m_radio_clock_settings_isSet = false; remote_sink_settings = new SWGRemoteSinkSettings(); @@ -334,6 +338,9 @@ SWGChannelSettings::cleanup() { if(pager_demod_settings != nullptr) { delete pager_demod_settings; } + if(radio_astronomy_settings != nullptr) { + delete radio_astronomy_settings; + } if(radio_clock_settings != nullptr) { delete radio_clock_settings; } @@ -455,6 +462,8 @@ SWGChannelSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&pager_demod_settings, pJson["PagerDemodSettings"], "SWGPagerDemodSettings", "SWGPagerDemodSettings"); + ::SWGSDRangel::setValue(&radio_astronomy_settings, pJson["RadioAstronomySettings"], "SWGRadioAstronomySettings", "SWGRadioAstronomySettings"); + ::SWGSDRangel::setValue(&radio_clock_settings, pJson["RadioClockSettings"], "SWGRadioClockSettings", "SWGRadioClockSettings"); ::SWGSDRangel::setValue(&remote_sink_settings, pJson["RemoteSinkSettings"], "SWGRemoteSinkSettings", "SWGRemoteSinkSettings"); @@ -603,6 +612,9 @@ SWGChannelSettings::asJsonObject() { if((pager_demod_settings != nullptr) && (pager_demod_settings->isSet())){ toJsonValue(QString("PagerDemodSettings"), pager_demod_settings, obj, QString("SWGPagerDemodSettings")); } + if((radio_astronomy_settings != nullptr) && (radio_astronomy_settings->isSet())){ + toJsonValue(QString("RadioAstronomySettings"), radio_astronomy_settings, obj, QString("SWGRadioAstronomySettings")); + } if((radio_clock_settings != nullptr) && (radio_clock_settings->isSet())){ toJsonValue(QString("RadioClockSettings"), radio_clock_settings, obj, QString("SWGRadioClockSettings")); } @@ -1003,6 +1015,16 @@ SWGChannelSettings::setPagerDemodSettings(SWGPagerDemodSettings* pager_demod_set this->m_pager_demod_settings_isSet = true; } +SWGRadioAstronomySettings* +SWGChannelSettings::getRadioAstronomySettings() { + return radio_astronomy_settings; +} +void +SWGChannelSettings::setRadioAstronomySettings(SWGRadioAstronomySettings* radio_astronomy_settings) { + this->radio_astronomy_settings = radio_astronomy_settings; + this->m_radio_astronomy_settings_isSet = true; +} + SWGRadioClockSettings* SWGChannelSettings::getRadioClockSettings() { return radio_clock_settings; @@ -1236,6 +1258,9 @@ SWGChannelSettings::isSet(){ if(pager_demod_settings && pager_demod_settings->isSet()){ isObjectUpdated = true; break; } + if(radio_astronomy_settings && radio_astronomy_settings->isSet()){ + isObjectUpdated = true; break; + } if(radio_clock_settings && radio_clock_settings->isSet()){ isObjectUpdated = true; break; } diff --git a/swagger/sdrangel/code/qt5/client/SWGChannelSettings.h b/swagger/sdrangel/code/qt5/client/SWGChannelSettings.h index 58e8261d8..074c83cb1 100644 --- a/swagger/sdrangel/code/qt5/client/SWGChannelSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGChannelSettings.h @@ -54,6 +54,7 @@ #include "SWGPacketDemodSettings.h" #include "SWGPacketModSettings.h" #include "SWGPagerDemodSettings.h" +#include "SWGRadioAstronomySettings.h" #include "SWGRadioClockSettings.h" #include "SWGRemoteSinkSettings.h" #include "SWGRemoteSourceSettings.h" @@ -194,6 +195,9 @@ public: SWGPagerDemodSettings* getPagerDemodSettings(); void setPagerDemodSettings(SWGPagerDemodSettings* pager_demod_settings); + SWGRadioAstronomySettings* getRadioAstronomySettings(); + void setRadioAstronomySettings(SWGRadioAstronomySettings* radio_astronomy_settings); + SWGRadioClockSettings* getRadioClockSettings(); void setRadioClockSettings(SWGRadioClockSettings* radio_clock_settings); @@ -342,6 +346,9 @@ private: SWGPagerDemodSettings* pager_demod_settings; bool m_pager_demod_settings_isSet; + SWGRadioAstronomySettings* radio_astronomy_settings; + bool m_radio_astronomy_settings_isSet; + SWGRadioClockSettings* radio_clock_settings; bool m_radio_clock_settings_isSet; diff --git a/swagger/sdrangel/code/qt5/client/SWGModelFactory.h b/swagger/sdrangel/code/qt5/client/SWGModelFactory.h index 7529bc53c..902208ad4 100644 --- a/swagger/sdrangel/code/qt5/client/SWGModelFactory.h +++ b/swagger/sdrangel/code/qt5/client/SWGModelFactory.h @@ -210,6 +210,9 @@ #include "SWGPresets.h" #include "SWGRDSReport.h" #include "SWGRDSReport_altFrequencies.h" +#include "SWGRadioAstronomyActions.h" +#include "SWGRadioAstronomyReport.h" +#include "SWGRadioAstronomySettings.h" #include "SWGRadioClockReport.h" #include "SWGRadioClockSettings.h" #include "SWGRange.h" @@ -253,7 +256,13 @@ #include "SWGSoapySDRReport.h" #include "SWGSpectrumServer.h" #include "SWGSpectrumServer_clients.h" +#include "SWGStarTrackerDisplayLoSSettings.h" +#include "SWGStarTrackerDisplayLoSSettings_2.h" +#include "SWGStarTrackerDisplaySettings.h" +#include "SWGStarTrackerDisplaySettings_2.h" #include "SWGStarTrackerSettings.h" +#include "SWGStarTrackerTarget.h" +#include "SWGStarTrackerTarget_2.h" #include "SWGSuccessResponse.h" #include "SWGTargetAzimuthElevation.h" #include "SWGTestMISettings.h" @@ -1269,6 +1278,21 @@ namespace SWGSDRangel { obj->init(); return obj; } + if(QString("SWGRadioAstronomyActions").compare(type) == 0) { + SWGRadioAstronomyActions *obj = new SWGRadioAstronomyActions(); + obj->init(); + return obj; + } + if(QString("SWGRadioAstronomyReport").compare(type) == 0) { + SWGRadioAstronomyReport *obj = new SWGRadioAstronomyReport(); + obj->init(); + return obj; + } + if(QString("SWGRadioAstronomySettings").compare(type) == 0) { + SWGRadioAstronomySettings *obj = new SWGRadioAstronomySettings(); + obj->init(); + return obj; + } if(QString("SWGRadioClockReport").compare(type) == 0) { SWGRadioClockReport *obj = new SWGRadioClockReport(); obj->init(); @@ -1484,11 +1508,41 @@ namespace SWGSDRangel { obj->init(); return obj; } + if(QString("SWGStarTrackerDisplayLoSSettings").compare(type) == 0) { + SWGStarTrackerDisplayLoSSettings *obj = new SWGStarTrackerDisplayLoSSettings(); + obj->init(); + return obj; + } + if(QString("SWGStarTrackerDisplayLoSSettings_2").compare(type) == 0) { + SWGStarTrackerDisplayLoSSettings_2 *obj = new SWGStarTrackerDisplayLoSSettings_2(); + obj->init(); + return obj; + } + if(QString("SWGStarTrackerDisplaySettings").compare(type) == 0) { + SWGStarTrackerDisplaySettings *obj = new SWGStarTrackerDisplaySettings(); + obj->init(); + return obj; + } + if(QString("SWGStarTrackerDisplaySettings_2").compare(type) == 0) { + SWGStarTrackerDisplaySettings_2 *obj = new SWGStarTrackerDisplaySettings_2(); + obj->init(); + return obj; + } if(QString("SWGStarTrackerSettings").compare(type) == 0) { SWGStarTrackerSettings *obj = new SWGStarTrackerSettings(); obj->init(); return obj; } + if(QString("SWGStarTrackerTarget").compare(type) == 0) { + SWGStarTrackerTarget *obj = new SWGStarTrackerTarget(); + obj->init(); + return obj; + } + if(QString("SWGStarTrackerTarget_2").compare(type) == 0) { + SWGStarTrackerTarget_2 *obj = new SWGStarTrackerTarget_2(); + obj->init(); + return obj; + } if(QString("SWGSuccessResponse").compare(type) == 0) { SWGSuccessResponse *obj = new SWGSuccessResponse(); obj->init(); diff --git a/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyActions.cpp b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyActions.cpp new file mode 100644 index 000000000..fc24bcb47 --- /dev/null +++ b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyActions.cpp @@ -0,0 +1,110 @@ +/** + * SDRangel + * This is the web REST/JSON API of SDRangel SDR software. SDRangel is an Open Source Qt5/OpenGL 3.0+ (4.3+ in Windows) GUI and server Software Defined Radio and signal analyzer in software. It supports Airspy, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube --- Limitations and specifcities: * In SDRangel GUI the first Rx device set cannot be deleted. Conversely the server starts with no device sets and its number of device sets can be reduced to zero by as many calls as necessary to /sdrangel/deviceset with DELETE method. * Preset import and export from/to file is a server only feature. * Device set focus is a GUI only feature. * The following channels are not implemented (status 501 is returned): ATV and DATV demodulators, Channel Analyzer NG, LoRa demodulator * The device settings and report structures contains only the sub-structure corresponding to the device type. The DeviceSettings and DeviceReport structures documented here shows all of them but only one will be or should be present at a time * The channel settings and report structures contains only the sub-structure corresponding to the channel type. The ChannelSettings and ChannelReport structures documented here shows all of them but only one will be or should be present at a time --- + * + * OpenAPI spec version: 6.0.0 + * Contact: f4exb06@gmail.com + * + * NOTE: This class is auto generated by the swagger code generator program. + * https://github.com/swagger-api/swagger-codegen.git + * Do not edit the class manually. + */ + + +#include "SWGRadioAstronomyActions.h" + +#include "SWGHelpers.h" + +#include +#include +#include +#include + +namespace SWGSDRangel { + +SWGRadioAstronomyActions::SWGRadioAstronomyActions(QString* json) { + init(); + this->fromJson(*json); +} + +SWGRadioAstronomyActions::SWGRadioAstronomyActions() { + start = nullptr; + m_start_isSet = false; +} + +SWGRadioAstronomyActions::~SWGRadioAstronomyActions() { + this->cleanup(); +} + +void +SWGRadioAstronomyActions::init() { + start = NULL; + m_start_isSet = false; +} + +void +SWGRadioAstronomyActions::cleanup() { + if(start != nullptr) { + delete start; + } +} + +SWGRadioAstronomyActions* +SWGRadioAstronomyActions::fromJson(QString &json) { + QByteArray array (json.toStdString().c_str()); + QJsonDocument doc = QJsonDocument::fromJson(array); + QJsonObject jsonObject = doc.object(); + this->fromJsonObject(jsonObject); + return this; +} + +void +SWGRadioAstronomyActions::fromJsonObject(QJsonObject &pJson) { + ::SWGSDRangel::setValue(&start, pJson["start"], "SWGObject", "SWGObject"); + +} + +QString +SWGRadioAstronomyActions::asJson () +{ + QJsonObject* obj = this->asJsonObject(); + + QJsonDocument doc(*obj); + QByteArray bytes = doc.toJson(); + delete obj; + return QString(bytes); +} + +QJsonObject* +SWGRadioAstronomyActions::asJsonObject() { + QJsonObject* obj = new QJsonObject(); + if((start != nullptr) && (start->isSet())){ + toJsonValue(QString("start"), start, obj, QString("SWGObject")); + } + + return obj; +} + +SWGObject* +SWGRadioAstronomyActions::getStart() { + return start; +} +void +SWGRadioAstronomyActions::setStart(SWGObject* start) { + this->start = start; + this->m_start_isSet = true; +} + + +bool +SWGRadioAstronomyActions::isSet(){ + bool isObjectUpdated = false; + do{ + if(start && start->isSet()){ + isObjectUpdated = true; break; + } + }while(false); + return isObjectUpdated; +} +} + diff --git a/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyActions.h b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyActions.h new file mode 100644 index 000000000..92ecb71e7 --- /dev/null +++ b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyActions.h @@ -0,0 +1,59 @@ +/** + * SDRangel + * This is the web REST/JSON API of SDRangel SDR software. SDRangel is an Open Source Qt5/OpenGL 3.0+ (4.3+ in Windows) GUI and server Software Defined Radio and signal analyzer in software. It supports Airspy, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube --- Limitations and specifcities: * In SDRangel GUI the first Rx device set cannot be deleted. Conversely the server starts with no device sets and its number of device sets can be reduced to zero by as many calls as necessary to /sdrangel/deviceset with DELETE method. * Preset import and export from/to file is a server only feature. * Device set focus is a GUI only feature. * The following channels are not implemented (status 501 is returned): ATV and DATV demodulators, Channel Analyzer NG, LoRa demodulator * The device settings and report structures contains only the sub-structure corresponding to the device type. The DeviceSettings and DeviceReport structures documented here shows all of them but only one will be or should be present at a time * The channel settings and report structures contains only the sub-structure corresponding to the channel type. The ChannelSettings and ChannelReport structures documented here shows all of them but only one will be or should be present at a time --- + * + * OpenAPI spec version: 6.0.0 + * Contact: f4exb06@gmail.com + * + * NOTE: This class is auto generated by the swagger code generator program. + * https://github.com/swagger-api/swagger-codegen.git + * Do not edit the class manually. + */ + +/* + * SWGRadioAstronomyActions.h + * + * RadioAstronomy + */ + +#ifndef SWGRadioAstronomyActions_H_ +#define SWGRadioAstronomyActions_H_ + +#include + + +#include "SWGObject.h" + +#include "SWGObject.h" +#include "export.h" + +namespace SWGSDRangel { + +class SWG_API SWGRadioAstronomyActions: public SWGObject { +public: + SWGRadioAstronomyActions(); + SWGRadioAstronomyActions(QString* json); + virtual ~SWGRadioAstronomyActions(); + void init(); + void cleanup(); + + virtual QString asJson () override; + virtual QJsonObject* asJsonObject() override; + virtual void fromJsonObject(QJsonObject &json) override; + virtual SWGRadioAstronomyActions* fromJson(QString &jsonString) override; + + SWGObject* getStart(); + void setStart(SWGObject* start); + + + virtual bool isSet() override; + +private: + SWGObject* start; + bool m_start_isSet; + +}; + +} + +#endif /* SWGRadioAstronomyActions_H_ */ diff --git a/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyReport.cpp b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyReport.cpp new file mode 100644 index 000000000..1635b3cbf --- /dev/null +++ b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyReport.cpp @@ -0,0 +1,131 @@ +/** + * SDRangel + * This is the web REST/JSON API of SDRangel SDR software. SDRangel is an Open Source Qt5/OpenGL 3.0+ (4.3+ in Windows) GUI and server Software Defined Radio and signal analyzer in software. It supports Airspy, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube --- Limitations and specifcities: * In SDRangel GUI the first Rx device set cannot be deleted. Conversely the server starts with no device sets and its number of device sets can be reduced to zero by as many calls as necessary to /sdrangel/deviceset with DELETE method. * Preset import and export from/to file is a server only feature. * Device set focus is a GUI only feature. * The following channels are not implemented (status 501 is returned): ATV and DATV demodulators, Channel Analyzer NG, LoRa demodulator * The device settings and report structures contains only the sub-structure corresponding to the device type. The DeviceSettings and DeviceReport structures documented here shows all of them but only one will be or should be present at a time * The channel settings and report structures contains only the sub-structure corresponding to the channel type. The ChannelSettings and ChannelReport structures documented here shows all of them but only one will be or should be present at a time --- + * + * OpenAPI spec version: 6.0.0 + * Contact: f4exb06@gmail.com + * + * NOTE: This class is auto generated by the swagger code generator program. + * https://github.com/swagger-api/swagger-codegen.git + * Do not edit the class manually. + */ + + +#include "SWGRadioAstronomyReport.h" + +#include "SWGHelpers.h" + +#include +#include +#include +#include + +namespace SWGSDRangel { + +SWGRadioAstronomyReport::SWGRadioAstronomyReport(QString* json) { + init(); + this->fromJson(*json); +} + +SWGRadioAstronomyReport::SWGRadioAstronomyReport() { + channel_power_db = 0.0f; + m_channel_power_db_isSet = false; + channel_sample_rate = 0; + m_channel_sample_rate_isSet = false; +} + +SWGRadioAstronomyReport::~SWGRadioAstronomyReport() { + this->cleanup(); +} + +void +SWGRadioAstronomyReport::init() { + channel_power_db = 0.0f; + m_channel_power_db_isSet = false; + channel_sample_rate = 0; + m_channel_sample_rate_isSet = false; +} + +void +SWGRadioAstronomyReport::cleanup() { + + +} + +SWGRadioAstronomyReport* +SWGRadioAstronomyReport::fromJson(QString &json) { + QByteArray array (json.toStdString().c_str()); + QJsonDocument doc = QJsonDocument::fromJson(array); + QJsonObject jsonObject = doc.object(); + this->fromJsonObject(jsonObject); + return this; +} + +void +SWGRadioAstronomyReport::fromJsonObject(QJsonObject &pJson) { + ::SWGSDRangel::setValue(&channel_power_db, pJson["channelPowerDB"], "float", ""); + + ::SWGSDRangel::setValue(&channel_sample_rate, pJson["channelSampleRate"], "qint32", ""); + +} + +QString +SWGRadioAstronomyReport::asJson () +{ + QJsonObject* obj = this->asJsonObject(); + + QJsonDocument doc(*obj); + QByteArray bytes = doc.toJson(); + delete obj; + return QString(bytes); +} + +QJsonObject* +SWGRadioAstronomyReport::asJsonObject() { + QJsonObject* obj = new QJsonObject(); + if(m_channel_power_db_isSet){ + obj->insert("channelPowerDB", QJsonValue(channel_power_db)); + } + if(m_channel_sample_rate_isSet){ + obj->insert("channelSampleRate", QJsonValue(channel_sample_rate)); + } + + return obj; +} + +float +SWGRadioAstronomyReport::getChannelPowerDb() { + return channel_power_db; +} +void +SWGRadioAstronomyReport::setChannelPowerDb(float channel_power_db) { + this->channel_power_db = channel_power_db; + this->m_channel_power_db_isSet = true; +} + +qint32 +SWGRadioAstronomyReport::getChannelSampleRate() { + return channel_sample_rate; +} +void +SWGRadioAstronomyReport::setChannelSampleRate(qint32 channel_sample_rate) { + this->channel_sample_rate = channel_sample_rate; + this->m_channel_sample_rate_isSet = true; +} + + +bool +SWGRadioAstronomyReport::isSet(){ + bool isObjectUpdated = false; + do{ + if(m_channel_power_db_isSet){ + isObjectUpdated = true; break; + } + if(m_channel_sample_rate_isSet){ + isObjectUpdated = true; break; + } + }while(false); + return isObjectUpdated; +} +} + diff --git a/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyReport.h b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyReport.h new file mode 100644 index 000000000..c79cfd411 --- /dev/null +++ b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomyReport.h @@ -0,0 +1,64 @@ +/** + * SDRangel + * This is the web REST/JSON API of SDRangel SDR software. SDRangel is an Open Source Qt5/OpenGL 3.0+ (4.3+ in Windows) GUI and server Software Defined Radio and signal analyzer in software. It supports Airspy, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube --- Limitations and specifcities: * In SDRangel GUI the first Rx device set cannot be deleted. Conversely the server starts with no device sets and its number of device sets can be reduced to zero by as many calls as necessary to /sdrangel/deviceset with DELETE method. * Preset import and export from/to file is a server only feature. * Device set focus is a GUI only feature. * The following channels are not implemented (status 501 is returned): ATV and DATV demodulators, Channel Analyzer NG, LoRa demodulator * The device settings and report structures contains only the sub-structure corresponding to the device type. The DeviceSettings and DeviceReport structures documented here shows all of them but only one will be or should be present at a time * The channel settings and report structures contains only the sub-structure corresponding to the channel type. The ChannelSettings and ChannelReport structures documented here shows all of them but only one will be or should be present at a time --- + * + * OpenAPI spec version: 6.0.0 + * Contact: f4exb06@gmail.com + * + * NOTE: This class is auto generated by the swagger code generator program. + * https://github.com/swagger-api/swagger-codegen.git + * Do not edit the class manually. + */ + +/* + * SWGRadioAstronomyReport.h + * + * RadioAstronomy + */ + +#ifndef SWGRadioAstronomyReport_H_ +#define SWGRadioAstronomyReport_H_ + +#include + + + +#include "SWGObject.h" +#include "export.h" + +namespace SWGSDRangel { + +class SWG_API SWGRadioAstronomyReport: public SWGObject { +public: + SWGRadioAstronomyReport(); + SWGRadioAstronomyReport(QString* json); + virtual ~SWGRadioAstronomyReport(); + void init(); + void cleanup(); + + virtual QString asJson () override; + virtual QJsonObject* asJsonObject() override; + virtual void fromJsonObject(QJsonObject &json) override; + virtual SWGRadioAstronomyReport* fromJson(QString &jsonString) override; + + float getChannelPowerDb(); + void setChannelPowerDb(float channel_power_db); + + qint32 getChannelSampleRate(); + void setChannelSampleRate(qint32 channel_sample_rate); + + + virtual bool isSet() override; + +private: + float channel_power_db; + bool m_channel_power_db_isSet; + + qint32 channel_sample_rate; + bool m_channel_sample_rate_isSet; + +}; + +} + +#endif /* SWGRadioAstronomyReport_H_ */ diff --git a/swagger/sdrangel/code/qt5/client/SWGRadioAstronomySettings.cpp b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomySettings.cpp new file mode 100644 index 000000000..38c9f77c1 --- /dev/null +++ b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomySettings.cpp @@ -0,0 +1,764 @@ +/** + * SDRangel + * This is the web REST/JSON API of SDRangel SDR software. SDRangel is an Open Source Qt5/OpenGL 3.0+ (4.3+ in Windows) GUI and server Software Defined Radio and signal analyzer in software. It supports Airspy, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube --- Limitations and specifcities: * In SDRangel GUI the first Rx device set cannot be deleted. Conversely the server starts with no device sets and its number of device sets can be reduced to zero by as many calls as necessary to /sdrangel/deviceset with DELETE method. * Preset import and export from/to file is a server only feature. * Device set focus is a GUI only feature. * The following channels are not implemented (status 501 is returned): ATV and DATV demodulators, Channel Analyzer NG, LoRa demodulator * The device settings and report structures contains only the sub-structure corresponding to the device type. The DeviceSettings and DeviceReport structures documented here shows all of them but only one will be or should be present at a time * The channel settings and report structures contains only the sub-structure corresponding to the channel type. The ChannelSettings and ChannelReport structures documented here shows all of them but only one will be or should be present at a time --- + * + * OpenAPI spec version: 6.0.0 + * Contact: f4exb06@gmail.com + * + * NOTE: This class is auto generated by the swagger code generator program. + * https://github.com/swagger-api/swagger-codegen.git + * Do not edit the class manually. + */ + + +#include "SWGRadioAstronomySettings.h" + +#include "SWGHelpers.h" + +#include +#include +#include +#include + +namespace SWGSDRangel { + +SWGRadioAstronomySettings::SWGRadioAstronomySettings(QString* json) { + init(); + this->fromJson(*json); +} + +SWGRadioAstronomySettings::SWGRadioAstronomySettings() { + input_frequency_offset = 0L; + m_input_frequency_offset_isSet = false; + sample_rate = 0; + m_sample_rate_isSet = false; + rf_bandwidth = 0; + m_rf_bandwidth_isSet = false; + integration = 0; + m_integration_isSet = false; + fft_size = 0; + m_fft_size_isSet = false; + fft_window = 0; + m_fft_window_isSet = false; + filter_freqs = nullptr; + m_filter_freqs_isSet = false; + star_tracker = nullptr; + m_star_tracker_isSet = false; + rotator = nullptr; + m_rotator_isSet = false; + run_mode = 0; + m_run_mode_isSet = false; + sweep_start_at_time = 0; + m_sweep_start_at_time_isSet = false; + sweep_start_date_time = nullptr; + m_sweep_start_date_time_isSet = false; + sweep_type = 0; + m_sweep_type_isSet = false; + sweep1_start = 0.0f; + m_sweep1_start_isSet = false; + sweep1_stop = 0.0f; + m_sweep1_stop_isSet = false; + sweep1_step = 0.0f; + m_sweep1_step_isSet = false; + sweep1_delay = 0.0f; + m_sweep1_delay_isSet = false; + sweep2_start = 0.0f; + m_sweep2_start_isSet = false; + sweep2_stop = 0.0f; + m_sweep2_stop_isSet = false; + sweep2_step = 0.0f; + m_sweep2_step_isSet = false; + sweep2_delay = 0.0f; + m_sweep2_delay_isSet = false; + rgb_color = 0; + m_rgb_color_isSet = false; + title = nullptr; + m_title_isSet = false; + stream_index = 0; + m_stream_index_isSet = false; + use_reverse_api = 0; + m_use_reverse_api_isSet = false; + reverse_api_address = nullptr; + m_reverse_api_address_isSet = false; + reverse_api_port = 0; + m_reverse_api_port_isSet = false; + reverse_api_device_index = 0; + m_reverse_api_device_index_isSet = false; + reverse_api_channel_index = 0; + m_reverse_api_channel_index_isSet = false; +} + +SWGRadioAstronomySettings::~SWGRadioAstronomySettings() { + this->cleanup(); +} + +void +SWGRadioAstronomySettings::init() { + input_frequency_offset = 0L; + m_input_frequency_offset_isSet = false; + sample_rate = 0; + m_sample_rate_isSet = false; + rf_bandwidth = 0; + m_rf_bandwidth_isSet = false; + integration = 0; + m_integration_isSet = false; + fft_size = 0; + m_fft_size_isSet = false; + fft_window = 0; + m_fft_window_isSet = false; + filter_freqs = new QString(""); + m_filter_freqs_isSet = false; + star_tracker = new QString(""); + m_star_tracker_isSet = false; + rotator = new QString(""); + m_rotator_isSet = false; + run_mode = 0; + m_run_mode_isSet = false; + sweep_start_at_time = 0; + m_sweep_start_at_time_isSet = false; + sweep_start_date_time = new QString(""); + m_sweep_start_date_time_isSet = false; + sweep_type = 0; + m_sweep_type_isSet = false; + sweep1_start = 0.0f; + m_sweep1_start_isSet = false; + sweep1_stop = 0.0f; + m_sweep1_stop_isSet = false; + sweep1_step = 0.0f; + m_sweep1_step_isSet = false; + sweep1_delay = 0.0f; + m_sweep1_delay_isSet = false; + sweep2_start = 0.0f; + m_sweep2_start_isSet = false; + sweep2_stop = 0.0f; + m_sweep2_stop_isSet = false; + sweep2_step = 0.0f; + m_sweep2_step_isSet = false; + sweep2_delay = 0.0f; + m_sweep2_delay_isSet = false; + rgb_color = 0; + m_rgb_color_isSet = false; + title = new QString(""); + m_title_isSet = false; + stream_index = 0; + m_stream_index_isSet = false; + use_reverse_api = 0; + m_use_reverse_api_isSet = false; + reverse_api_address = new QString(""); + m_reverse_api_address_isSet = false; + reverse_api_port = 0; + m_reverse_api_port_isSet = false; + reverse_api_device_index = 0; + m_reverse_api_device_index_isSet = false; + reverse_api_channel_index = 0; + m_reverse_api_channel_index_isSet = false; +} + +void +SWGRadioAstronomySettings::cleanup() { + + + + + + + if(filter_freqs != nullptr) { + delete filter_freqs; + } + if(star_tracker != nullptr) { + delete star_tracker; + } + if(rotator != nullptr) { + delete rotator; + } + + + if(sweep_start_date_time != nullptr) { + delete sweep_start_date_time; + } + + + + + + + + + + + if(title != nullptr) { + delete title; + } + + + if(reverse_api_address != nullptr) { + delete reverse_api_address; + } + + + +} + +SWGRadioAstronomySettings* +SWGRadioAstronomySettings::fromJson(QString &json) { + QByteArray array (json.toStdString().c_str()); + QJsonDocument doc = QJsonDocument::fromJson(array); + QJsonObject jsonObject = doc.object(); + this->fromJsonObject(jsonObject); + return this; +} + +void +SWGRadioAstronomySettings::fromJsonObject(QJsonObject &pJson) { + ::SWGSDRangel::setValue(&input_frequency_offset, pJson["inputFrequencyOffset"], "qint64", ""); + + ::SWGSDRangel::setValue(&sample_rate, pJson["sampleRate"], "qint32", ""); + + ::SWGSDRangel::setValue(&rf_bandwidth, pJson["rfBandwidth"], "qint32", ""); + + ::SWGSDRangel::setValue(&integration, pJson["integration"], "qint32", ""); + + ::SWGSDRangel::setValue(&fft_size, pJson["fftSize"], "qint32", ""); + + ::SWGSDRangel::setValue(&fft_window, pJson["fftWindow"], "qint32", ""); + + ::SWGSDRangel::setValue(&filter_freqs, pJson["filterFreqs"], "QString", "QString"); + + ::SWGSDRangel::setValue(&star_tracker, pJson["starTracker"], "QString", "QString"); + + ::SWGSDRangel::setValue(&rotator, pJson["rotator"], "QString", "QString"); + + ::SWGSDRangel::setValue(&run_mode, pJson["runMode"], "qint32", ""); + + ::SWGSDRangel::setValue(&sweep_start_at_time, pJson["sweepStartAtTime"], "qint32", ""); + + ::SWGSDRangel::setValue(&sweep_start_date_time, pJson["sweepStartDateTime"], "QString", "QString"); + + ::SWGSDRangel::setValue(&sweep_type, pJson["sweepType"], "qint32", ""); + + ::SWGSDRangel::setValue(&sweep1_start, pJson["sweep1Start"], "float", ""); + + ::SWGSDRangel::setValue(&sweep1_stop, pJson["sweep1Stop"], "float", ""); + + ::SWGSDRangel::setValue(&sweep1_step, pJson["sweep1Step"], "float", ""); + + ::SWGSDRangel::setValue(&sweep1_delay, pJson["sweep1Delay"], "float", ""); + + ::SWGSDRangel::setValue(&sweep2_start, pJson["sweep2Start"], "float", ""); + + ::SWGSDRangel::setValue(&sweep2_stop, pJson["sweep2Stop"], "float", ""); + + ::SWGSDRangel::setValue(&sweep2_step, pJson["sweep2Step"], "float", ""); + + ::SWGSDRangel::setValue(&sweep2_delay, pJson["sweep2Delay"], "float", ""); + + ::SWGSDRangel::setValue(&rgb_color, pJson["rgbColor"], "qint32", ""); + + ::SWGSDRangel::setValue(&title, pJson["title"], "QString", "QString"); + + ::SWGSDRangel::setValue(&stream_index, pJson["streamIndex"], "qint32", ""); + + ::SWGSDRangel::setValue(&use_reverse_api, pJson["useReverseAPI"], "qint32", ""); + + ::SWGSDRangel::setValue(&reverse_api_address, pJson["reverseAPIAddress"], "QString", "QString"); + + ::SWGSDRangel::setValue(&reverse_api_port, pJson["reverseAPIPort"], "qint32", ""); + + ::SWGSDRangel::setValue(&reverse_api_device_index, pJson["reverseAPIDeviceIndex"], "qint32", ""); + + ::SWGSDRangel::setValue(&reverse_api_channel_index, pJson["reverseAPIChannelIndex"], "qint32", ""); + +} + +QString +SWGRadioAstronomySettings::asJson () +{ + QJsonObject* obj = this->asJsonObject(); + + QJsonDocument doc(*obj); + QByteArray bytes = doc.toJson(); + delete obj; + return QString(bytes); +} + +QJsonObject* +SWGRadioAstronomySettings::asJsonObject() { + QJsonObject* obj = new QJsonObject(); + if(m_input_frequency_offset_isSet){ + obj->insert("inputFrequencyOffset", QJsonValue(input_frequency_offset)); + } + if(m_sample_rate_isSet){ + obj->insert("sampleRate", QJsonValue(sample_rate)); + } + if(m_rf_bandwidth_isSet){ + obj->insert("rfBandwidth", QJsonValue(rf_bandwidth)); + } + if(m_integration_isSet){ + obj->insert("integration", QJsonValue(integration)); + } + if(m_fft_size_isSet){ + obj->insert("fftSize", QJsonValue(fft_size)); + } + if(m_fft_window_isSet){ + obj->insert("fftWindow", QJsonValue(fft_window)); + } + if(filter_freqs != nullptr && *filter_freqs != QString("")){ + toJsonValue(QString("filterFreqs"), filter_freqs, obj, QString("QString")); + } + if(star_tracker != nullptr && *star_tracker != QString("")){ + toJsonValue(QString("starTracker"), star_tracker, obj, QString("QString")); + } + if(rotator != nullptr && *rotator != QString("")){ + toJsonValue(QString("rotator"), rotator, obj, QString("QString")); + } + if(m_run_mode_isSet){ + obj->insert("runMode", QJsonValue(run_mode)); + } + if(m_sweep_start_at_time_isSet){ + obj->insert("sweepStartAtTime", QJsonValue(sweep_start_at_time)); + } + if(sweep_start_date_time != nullptr && *sweep_start_date_time != QString("")){ + toJsonValue(QString("sweepStartDateTime"), sweep_start_date_time, obj, QString("QString")); + } + if(m_sweep_type_isSet){ + obj->insert("sweepType", QJsonValue(sweep_type)); + } + if(m_sweep1_start_isSet){ + obj->insert("sweep1Start", QJsonValue(sweep1_start)); + } + if(m_sweep1_stop_isSet){ + obj->insert("sweep1Stop", QJsonValue(sweep1_stop)); + } + if(m_sweep1_step_isSet){ + obj->insert("sweep1Step", QJsonValue(sweep1_step)); + } + if(m_sweep1_delay_isSet){ + obj->insert("sweep1Delay", QJsonValue(sweep1_delay)); + } + if(m_sweep2_start_isSet){ + obj->insert("sweep2Start", QJsonValue(sweep2_start)); + } + if(m_sweep2_stop_isSet){ + obj->insert("sweep2Stop", QJsonValue(sweep2_stop)); + } + if(m_sweep2_step_isSet){ + obj->insert("sweep2Step", QJsonValue(sweep2_step)); + } + if(m_sweep2_delay_isSet){ + obj->insert("sweep2Delay", QJsonValue(sweep2_delay)); + } + if(m_rgb_color_isSet){ + obj->insert("rgbColor", QJsonValue(rgb_color)); + } + if(title != nullptr && *title != QString("")){ + toJsonValue(QString("title"), title, obj, QString("QString")); + } + if(m_stream_index_isSet){ + obj->insert("streamIndex", QJsonValue(stream_index)); + } + if(m_use_reverse_api_isSet){ + obj->insert("useReverseAPI", QJsonValue(use_reverse_api)); + } + if(reverse_api_address != nullptr && *reverse_api_address != QString("")){ + toJsonValue(QString("reverseAPIAddress"), reverse_api_address, obj, QString("QString")); + } + if(m_reverse_api_port_isSet){ + obj->insert("reverseAPIPort", QJsonValue(reverse_api_port)); + } + if(m_reverse_api_device_index_isSet){ + obj->insert("reverseAPIDeviceIndex", QJsonValue(reverse_api_device_index)); + } + if(m_reverse_api_channel_index_isSet){ + obj->insert("reverseAPIChannelIndex", QJsonValue(reverse_api_channel_index)); + } + + return obj; +} + +qint64 +SWGRadioAstronomySettings::getInputFrequencyOffset() { + return input_frequency_offset; +} +void +SWGRadioAstronomySettings::setInputFrequencyOffset(qint64 input_frequency_offset) { + this->input_frequency_offset = input_frequency_offset; + this->m_input_frequency_offset_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getSampleRate() { + return sample_rate; +} +void +SWGRadioAstronomySettings::setSampleRate(qint32 sample_rate) { + this->sample_rate = sample_rate; + this->m_sample_rate_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getRfBandwidth() { + return rf_bandwidth; +} +void +SWGRadioAstronomySettings::setRfBandwidth(qint32 rf_bandwidth) { + this->rf_bandwidth = rf_bandwidth; + this->m_rf_bandwidth_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getIntegration() { + return integration; +} +void +SWGRadioAstronomySettings::setIntegration(qint32 integration) { + this->integration = integration; + this->m_integration_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getFftSize() { + return fft_size; +} +void +SWGRadioAstronomySettings::setFftSize(qint32 fft_size) { + this->fft_size = fft_size; + this->m_fft_size_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getFftWindow() { + return fft_window; +} +void +SWGRadioAstronomySettings::setFftWindow(qint32 fft_window) { + this->fft_window = fft_window; + this->m_fft_window_isSet = true; +} + +QString* +SWGRadioAstronomySettings::getFilterFreqs() { + return filter_freqs; +} +void +SWGRadioAstronomySettings::setFilterFreqs(QString* filter_freqs) { + this->filter_freqs = filter_freqs; + this->m_filter_freqs_isSet = true; +} + +QString* +SWGRadioAstronomySettings::getStarTracker() { + return star_tracker; +} +void +SWGRadioAstronomySettings::setStarTracker(QString* star_tracker) { + this->star_tracker = star_tracker; + this->m_star_tracker_isSet = true; +} + +QString* +SWGRadioAstronomySettings::getRotator() { + return rotator; +} +void +SWGRadioAstronomySettings::setRotator(QString* rotator) { + this->rotator = rotator; + this->m_rotator_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getRunMode() { + return run_mode; +} +void +SWGRadioAstronomySettings::setRunMode(qint32 run_mode) { + this->run_mode = run_mode; + this->m_run_mode_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getSweepStartAtTime() { + return sweep_start_at_time; +} +void +SWGRadioAstronomySettings::setSweepStartAtTime(qint32 sweep_start_at_time) { + this->sweep_start_at_time = sweep_start_at_time; + this->m_sweep_start_at_time_isSet = true; +} + +QString* +SWGRadioAstronomySettings::getSweepStartDateTime() { + return sweep_start_date_time; +} +void +SWGRadioAstronomySettings::setSweepStartDateTime(QString* sweep_start_date_time) { + this->sweep_start_date_time = sweep_start_date_time; + this->m_sweep_start_date_time_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getSweepType() { + return sweep_type; +} +void +SWGRadioAstronomySettings::setSweepType(qint32 sweep_type) { + this->sweep_type = sweep_type; + this->m_sweep_type_isSet = true; +} + +float +SWGRadioAstronomySettings::getSweep1Start() { + return sweep1_start; +} +void +SWGRadioAstronomySettings::setSweep1Start(float sweep1_start) { + this->sweep1_start = sweep1_start; + this->m_sweep1_start_isSet = true; +} + +float +SWGRadioAstronomySettings::getSweep1Stop() { + return sweep1_stop; +} +void +SWGRadioAstronomySettings::setSweep1Stop(float sweep1_stop) { + this->sweep1_stop = sweep1_stop; + this->m_sweep1_stop_isSet = true; +} + +float +SWGRadioAstronomySettings::getSweep1Step() { + return sweep1_step; +} +void +SWGRadioAstronomySettings::setSweep1Step(float sweep1_step) { + this->sweep1_step = sweep1_step; + this->m_sweep1_step_isSet = true; +} + +float +SWGRadioAstronomySettings::getSweep1Delay() { + return sweep1_delay; +} +void +SWGRadioAstronomySettings::setSweep1Delay(float sweep1_delay) { + this->sweep1_delay = sweep1_delay; + this->m_sweep1_delay_isSet = true; +} + +float +SWGRadioAstronomySettings::getSweep2Start() { + return sweep2_start; +} +void +SWGRadioAstronomySettings::setSweep2Start(float sweep2_start) { + this->sweep2_start = sweep2_start; + this->m_sweep2_start_isSet = true; +} + +float +SWGRadioAstronomySettings::getSweep2Stop() { + return sweep2_stop; +} +void +SWGRadioAstronomySettings::setSweep2Stop(float sweep2_stop) { + this->sweep2_stop = sweep2_stop; + this->m_sweep2_stop_isSet = true; +} + +float +SWGRadioAstronomySettings::getSweep2Step() { + return sweep2_step; +} +void +SWGRadioAstronomySettings::setSweep2Step(float sweep2_step) { + this->sweep2_step = sweep2_step; + this->m_sweep2_step_isSet = true; +} + +float +SWGRadioAstronomySettings::getSweep2Delay() { + return sweep2_delay; +} +void +SWGRadioAstronomySettings::setSweep2Delay(float sweep2_delay) { + this->sweep2_delay = sweep2_delay; + this->m_sweep2_delay_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getRgbColor() { + return rgb_color; +} +void +SWGRadioAstronomySettings::setRgbColor(qint32 rgb_color) { + this->rgb_color = rgb_color; + this->m_rgb_color_isSet = true; +} + +QString* +SWGRadioAstronomySettings::getTitle() { + return title; +} +void +SWGRadioAstronomySettings::setTitle(QString* title) { + this->title = title; + this->m_title_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getStreamIndex() { + return stream_index; +} +void +SWGRadioAstronomySettings::setStreamIndex(qint32 stream_index) { + this->stream_index = stream_index; + this->m_stream_index_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getUseReverseApi() { + return use_reverse_api; +} +void +SWGRadioAstronomySettings::setUseReverseApi(qint32 use_reverse_api) { + this->use_reverse_api = use_reverse_api; + this->m_use_reverse_api_isSet = true; +} + +QString* +SWGRadioAstronomySettings::getReverseApiAddress() { + return reverse_api_address; +} +void +SWGRadioAstronomySettings::setReverseApiAddress(QString* reverse_api_address) { + this->reverse_api_address = reverse_api_address; + this->m_reverse_api_address_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getReverseApiPort() { + return reverse_api_port; +} +void +SWGRadioAstronomySettings::setReverseApiPort(qint32 reverse_api_port) { + this->reverse_api_port = reverse_api_port; + this->m_reverse_api_port_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getReverseApiDeviceIndex() { + return reverse_api_device_index; +} +void +SWGRadioAstronomySettings::setReverseApiDeviceIndex(qint32 reverse_api_device_index) { + this->reverse_api_device_index = reverse_api_device_index; + this->m_reverse_api_device_index_isSet = true; +} + +qint32 +SWGRadioAstronomySettings::getReverseApiChannelIndex() { + return reverse_api_channel_index; +} +void +SWGRadioAstronomySettings::setReverseApiChannelIndex(qint32 reverse_api_channel_index) { + this->reverse_api_channel_index = reverse_api_channel_index; + this->m_reverse_api_channel_index_isSet = true; +} + + +bool +SWGRadioAstronomySettings::isSet(){ + bool isObjectUpdated = false; + do{ + if(m_input_frequency_offset_isSet){ + isObjectUpdated = true; break; + } + if(m_sample_rate_isSet){ + isObjectUpdated = true; break; + } + if(m_rf_bandwidth_isSet){ + isObjectUpdated = true; break; + } + if(m_integration_isSet){ + isObjectUpdated = true; break; + } + if(m_fft_size_isSet){ + isObjectUpdated = true; break; + } + if(m_fft_window_isSet){ + isObjectUpdated = true; break; + } + if(filter_freqs && *filter_freqs != QString("")){ + isObjectUpdated = true; break; + } + if(star_tracker && *star_tracker != QString("")){ + isObjectUpdated = true; break; + } + if(rotator && *rotator != QString("")){ + isObjectUpdated = true; break; + } + if(m_run_mode_isSet){ + isObjectUpdated = true; break; + } + if(m_sweep_start_at_time_isSet){ + isObjectUpdated = true; break; + } + if(sweep_start_date_time && *sweep_start_date_time != QString("")){ + isObjectUpdated = true; break; + } + if(m_sweep_type_isSet){ + isObjectUpdated = true; break; + } + if(m_sweep1_start_isSet){ + isObjectUpdated = true; break; + } + if(m_sweep1_stop_isSet){ + isObjectUpdated = true; break; + } + if(m_sweep1_step_isSet){ + isObjectUpdated = true; break; + } + if(m_sweep1_delay_isSet){ + isObjectUpdated = true; break; + } + if(m_sweep2_start_isSet){ + isObjectUpdated = true; break; + } + if(m_sweep2_stop_isSet){ + isObjectUpdated = true; break; + } + if(m_sweep2_step_isSet){ + isObjectUpdated = true; break; + } + if(m_sweep2_delay_isSet){ + isObjectUpdated = true; break; + } + if(m_rgb_color_isSet){ + isObjectUpdated = true; break; + } + if(title && *title != QString("")){ + isObjectUpdated = true; break; + } + if(m_stream_index_isSet){ + isObjectUpdated = true; break; + } + if(m_use_reverse_api_isSet){ + isObjectUpdated = true; break; + } + if(reverse_api_address && *reverse_api_address != QString("")){ + isObjectUpdated = true; break; + } + if(m_reverse_api_port_isSet){ + isObjectUpdated = true; break; + } + if(m_reverse_api_device_index_isSet){ + isObjectUpdated = true; break; + } + if(m_reverse_api_channel_index_isSet){ + isObjectUpdated = true; break; + } + }while(false); + return isObjectUpdated; +} +} + diff --git a/swagger/sdrangel/code/qt5/client/SWGRadioAstronomySettings.h b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomySettings.h new file mode 100644 index 000000000..432e4767f --- /dev/null +++ b/swagger/sdrangel/code/qt5/client/SWGRadioAstronomySettings.h @@ -0,0 +1,227 @@ +/** + * SDRangel + * This is the web REST/JSON API of SDRangel SDR software. SDRangel is an Open Source Qt5/OpenGL 3.0+ (4.3+ in Windows) GUI and server Software Defined Radio and signal analyzer in software. It supports Airspy, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube --- Limitations and specifcities: * In SDRangel GUI the first Rx device set cannot be deleted. Conversely the server starts with no device sets and its number of device sets can be reduced to zero by as many calls as necessary to /sdrangel/deviceset with DELETE method. * Preset import and export from/to file is a server only feature. * Device set focus is a GUI only feature. * The following channels are not implemented (status 501 is returned): ATV and DATV demodulators, Channel Analyzer NG, LoRa demodulator * The device settings and report structures contains only the sub-structure corresponding to the device type. The DeviceSettings and DeviceReport structures documented here shows all of them but only one will be or should be present at a time * The channel settings and report structures contains only the sub-structure corresponding to the channel type. The ChannelSettings and ChannelReport structures documented here shows all of them but only one will be or should be present at a time --- + * + * OpenAPI spec version: 6.0.0 + * Contact: f4exb06@gmail.com + * + * NOTE: This class is auto generated by the swagger code generator program. + * https://github.com/swagger-api/swagger-codegen.git + * Do not edit the class manually. + */ + +/* + * SWGRadioAstronomySettings.h + * + * RadioAstronomy + */ + +#ifndef SWGRadioAstronomySettings_H_ +#define SWGRadioAstronomySettings_H_ + +#include + + +#include + +#include "SWGObject.h" +#include "export.h" + +namespace SWGSDRangel { + +class SWG_API SWGRadioAstronomySettings: public SWGObject { +public: + SWGRadioAstronomySettings(); + SWGRadioAstronomySettings(QString* json); + virtual ~SWGRadioAstronomySettings(); + void init(); + void cleanup(); + + virtual QString asJson () override; + virtual QJsonObject* asJsonObject() override; + virtual void fromJsonObject(QJsonObject &json) override; + virtual SWGRadioAstronomySettings* fromJson(QString &jsonString) override; + + qint64 getInputFrequencyOffset(); + void setInputFrequencyOffset(qint64 input_frequency_offset); + + qint32 getSampleRate(); + void setSampleRate(qint32 sample_rate); + + qint32 getRfBandwidth(); + void setRfBandwidth(qint32 rf_bandwidth); + + qint32 getIntegration(); + void setIntegration(qint32 integration); + + qint32 getFftSize(); + void setFftSize(qint32 fft_size); + + qint32 getFftWindow(); + void setFftWindow(qint32 fft_window); + + QString* getFilterFreqs(); + void setFilterFreqs(QString* filter_freqs); + + QString* getStarTracker(); + void setStarTracker(QString* star_tracker); + + QString* getRotator(); + void setRotator(QString* rotator); + + qint32 getRunMode(); + void setRunMode(qint32 run_mode); + + qint32 getSweepStartAtTime(); + void setSweepStartAtTime(qint32 sweep_start_at_time); + + QString* getSweepStartDateTime(); + void setSweepStartDateTime(QString* sweep_start_date_time); + + qint32 getSweepType(); + void setSweepType(qint32 sweep_type); + + float getSweep1Start(); + void setSweep1Start(float sweep1_start); + + float getSweep1Stop(); + void setSweep1Stop(float sweep1_stop); + + float getSweep1Step(); + void setSweep1Step(float sweep1_step); + + float getSweep1Delay(); + void setSweep1Delay(float sweep1_delay); + + float getSweep2Start(); + void setSweep2Start(float sweep2_start); + + float getSweep2Stop(); + void setSweep2Stop(float sweep2_stop); + + float getSweep2Step(); + void setSweep2Step(float sweep2_step); + + float getSweep2Delay(); + void setSweep2Delay(float sweep2_delay); + + qint32 getRgbColor(); + void setRgbColor(qint32 rgb_color); + + QString* getTitle(); + void setTitle(QString* title); + + qint32 getStreamIndex(); + void setStreamIndex(qint32 stream_index); + + qint32 getUseReverseApi(); + void setUseReverseApi(qint32 use_reverse_api); + + QString* getReverseApiAddress(); + void setReverseApiAddress(QString* reverse_api_address); + + qint32 getReverseApiPort(); + void setReverseApiPort(qint32 reverse_api_port); + + qint32 getReverseApiDeviceIndex(); + void setReverseApiDeviceIndex(qint32 reverse_api_device_index); + + qint32 getReverseApiChannelIndex(); + void setReverseApiChannelIndex(qint32 reverse_api_channel_index); + + + virtual bool isSet() override; + +private: + qint64 input_frequency_offset; + bool m_input_frequency_offset_isSet; + + qint32 sample_rate; + bool m_sample_rate_isSet; + + qint32 rf_bandwidth; + bool m_rf_bandwidth_isSet; + + qint32 integration; + bool m_integration_isSet; + + qint32 fft_size; + bool m_fft_size_isSet; + + qint32 fft_window; + bool m_fft_window_isSet; + + QString* filter_freqs; + bool m_filter_freqs_isSet; + + QString* star_tracker; + bool m_star_tracker_isSet; + + QString* rotator; + bool m_rotator_isSet; + + qint32 run_mode; + bool m_run_mode_isSet; + + qint32 sweep_start_at_time; + bool m_sweep_start_at_time_isSet; + + QString* sweep_start_date_time; + bool m_sweep_start_date_time_isSet; + + qint32 sweep_type; + bool m_sweep_type_isSet; + + float sweep1_start; + bool m_sweep1_start_isSet; + + float sweep1_stop; + bool m_sweep1_stop_isSet; + + float sweep1_step; + bool m_sweep1_step_isSet; + + float sweep1_delay; + bool m_sweep1_delay_isSet; + + float sweep2_start; + bool m_sweep2_start_isSet; + + float sweep2_stop; + bool m_sweep2_stop_isSet; + + float sweep2_step; + bool m_sweep2_step_isSet; + + float sweep2_delay; + bool m_sweep2_delay_isSet; + + qint32 rgb_color; + bool m_rgb_color_isSet; + + QString* title; + bool m_title_isSet; + + qint32 stream_index; + bool m_stream_index_isSet; + + qint32 use_reverse_api; + bool m_use_reverse_api_isSet; + + QString* reverse_api_address; + bool m_reverse_api_address_isSet; + + qint32 reverse_api_port; + bool m_reverse_api_port_isSet; + + qint32 reverse_api_device_index; + bool m_reverse_api_device_index_isSet; + + qint32 reverse_api_channel_index; + bool m_reverse_api_channel_index_isSet; + +}; + +} + +#endif /* SWGRadioAstronomySettings_H_ */

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 V=vLy(TOJ^P%JKlY;+LiY{{cla!*T!s literal 0 HcmV?d00001 diff --git a/doc/img/RadioAstronomy_RadiometerGaussian.png b/doc/img/RadioAstronomy_RadiometerGaussian.png new file mode 100644 index 0000000000000000000000000000000000000000..0bac013283aca0871bfd5d3aa9e305dc61b69ff3 GIT binary patch literal 27058 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 literal 0 HcmV?d00001 diff --git a/doc/img/RadioAstronomy_RefLine.png b/doc/img/RadioAstronomy_RefLine.png new file mode 100644 index 0000000000000000000000000000000000000000..5854cb0ce74e17899f465e9e20744671a2f5c97e GIT binary patch literal 84459 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