From bb452a3216d6aebe1f2aa00360abca1a614c81b3 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Fri, 26 Feb 2021 20:40:23 +0000 Subject: [PATCH] Add APT demodulator --- doc/img/APTDemod_plugin.png | Bin 0 -> 258198 bytes doc/img/APTDemod_plugin_settings.png | Bin 0 -> 10060 bytes doc/img/APTDemod_plugin_settingsdialog.png | Bin 0 -> 10633 bytes plugins/channelrx/CMakeLists.txt | 4 + plugins/channelrx/demodapt/CMakeLists.txt | 68 ++ plugins/channelrx/demodapt/aptdemod.cpp | 851 ++++++++++++++++++ plugins/channelrx/demodapt/aptdemod.h | 242 +++++ .../channelrx/demodapt/aptdemodbaseband.cpp | 177 ++++ plugins/channelrx/demodapt/aptdemodbaseband.h | 94 ++ plugins/channelrx/demodapt/aptdemodgui.cpp | 479 ++++++++++ plugins/channelrx/demodapt/aptdemodgui.h | 116 +++ plugins/channelrx/demodapt/aptdemodgui.ui | 723 +++++++++++++++ plugins/channelrx/demodapt/aptdemodplugin.cpp | 92 ++ plugins/channelrx/demodapt/aptdemodplugin.h | 49 + .../channelrx/demodapt/aptdemodsettings.cpp | 163 ++++ plugins/channelrx/demodapt/aptdemodsettings.h | 64 ++ .../demodapt/aptdemodsettingsdialog.cpp | 56 ++ .../demodapt/aptdemodsettingsdialog.h | 41 + .../demodapt/aptdemodsettingsdialog.ui | 205 +++++ plugins/channelrx/demodapt/aptdemodsink.cpp | 205 +++++ plugins/channelrx/demodapt/aptdemodsink.h | 126 +++ .../demodapt/aptdemodwebapiadapter.cpp | 52 ++ .../demodapt/aptdemodwebapiadapter.h | 50 + plugins/channelrx/demodapt/icons.qrc | 7 + .../channelrx/demodapt/icons/cropnoise.png | Bin 0 -> 353 bytes plugins/channelrx/demodapt/icons/denoise.png | Bin 0 -> 456 bytes .../demodapt/icons/precipitation.png | Bin 0 -> 420 bytes plugins/channelrx/demodapt/readme.md | 108 +++ 28 files changed, 3972 insertions(+) create mode 100644 doc/img/APTDemod_plugin.png create mode 100644 doc/img/APTDemod_plugin_settings.png create mode 100644 doc/img/APTDemod_plugin_settingsdialog.png create mode 100644 plugins/channelrx/demodapt/CMakeLists.txt create mode 100644 plugins/channelrx/demodapt/aptdemod.cpp create mode 100644 plugins/channelrx/demodapt/aptdemod.h create mode 100644 plugins/channelrx/demodapt/aptdemodbaseband.cpp create mode 100644 plugins/channelrx/demodapt/aptdemodbaseband.h create mode 100644 plugins/channelrx/demodapt/aptdemodgui.cpp create mode 100644 plugins/channelrx/demodapt/aptdemodgui.h create mode 100644 plugins/channelrx/demodapt/aptdemodgui.ui create mode 100644 plugins/channelrx/demodapt/aptdemodplugin.cpp create mode 100644 plugins/channelrx/demodapt/aptdemodplugin.h create mode 100644 plugins/channelrx/demodapt/aptdemodsettings.cpp create mode 100644 plugins/channelrx/demodapt/aptdemodsettings.h create mode 100644 plugins/channelrx/demodapt/aptdemodsettingsdialog.cpp create mode 100644 plugins/channelrx/demodapt/aptdemodsettingsdialog.h create mode 100644 plugins/channelrx/demodapt/aptdemodsettingsdialog.ui create mode 100644 plugins/channelrx/demodapt/aptdemodsink.cpp create mode 100644 plugins/channelrx/demodapt/aptdemodsink.h create mode 100644 plugins/channelrx/demodapt/aptdemodwebapiadapter.cpp create mode 100644 plugins/channelrx/demodapt/aptdemodwebapiadapter.h create mode 100644 plugins/channelrx/demodapt/icons.qrc create mode 100644 plugins/channelrx/demodapt/icons/cropnoise.png create mode 100644 plugins/channelrx/demodapt/icons/denoise.png create mode 100644 plugins/channelrx/demodapt/icons/precipitation.png create mode 100644 plugins/channelrx/demodapt/readme.md diff --git a/doc/img/APTDemod_plugin.png b/doc/img/APTDemod_plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..24d98125b50c31427bbd86503b187e47b05c46a5 GIT binary patch literal 258198 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%0ALA+ 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 sL(NYY0H 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 Y_lCMO_7QjBA8;@-l8O>#;-CEf3lpqIH2?qr literal 0 HcmV?d00001 diff --git a/doc/img/APTDemod_plugin_settingsdialog.png b/doc/img/APTDemod_plugin_settingsdialog.png new file mode 100644 index 0000000000000000000000000000000000000000..c98d10d0eebe53747d7e81263a87d8cc38612244 GIT binary patch literal 10633 zcmaia1yEey^5zf{Ah-l~cMBHW-GaLWcL>hl!QFLmLKxg3ctY^tOmGGg+--2%$?xrd ztMYloFZlAt=&ez}99rIpI9s`vG6#xKWC@RQk0sshM@C$(Q0zLwzN#KG1 zA$VxYO95&p$oAkjFKs1NB>{kjB(#SQui*Eu-4qNw007J%e=md~SFjZTz)YbiBdP6c zdbElb@aEU5!093e5fyekk%SAi-;3{5S*S?i$#UUXoS#`(vh^fs0t*PsR{BWKW+zFV z+9;I^p)|!37YYZU$R#uss6%cRRxI}liv??7G6^m&&8HSBfe}%wwdWiU8*gtP_>Tv) zNY`6OWHT|Amt)`^C3=&=g^F z?de{JMO?iA-VUmVvv& ztCQk!o7_T94x_NQphphxSK+)~plP9?-<0yC+DgZ9tu2L8^d8>8{Mmbx4kMt`kH{gl zr}uTv$z3iRv9z7a(sq1PagT+1hi*ER{1hu7B&zMO%yyRM_Tr%CPg@s3_Slsr zk|q0yDh@xw!)SuTWt>mJe-0FKyem zP8VF}hW{jPKD}otmKv>o#lK97wutIvXl&y7n)4lVu0eG|nX%{6Ij;RRrYVWUWu}0p z>_x=Mr-TQVi z$I@$_OR=D6D!n?>mP)?xG5j7EC$^wp_)eAFhqWd0kbilgik(u&w6i7nBnQt0#6w@8YuCB=xJ}%> zNil88EAJk>?eOZ9LlT+fxmvWvqPVer+ol!T?LsNiDACOp=8E$^YsAYV=T5#O;E1Ds z(~CZW=U=A$oX=?#SlyNR{K_<6IvTLGwPib5fX|cv^PZrE`GXa2jEJ$T-Rc$a$cO*= z`WgD9I1REr@+Or{)&G*(iBqdQXi(OkDHKaWWeK+ZF3fyRPOCRcOz&E@qRrwD3{7=( zX=!j5qfb!Gr#@D0z}~b52C!YW2(OJ6%=JtBs-Wf39Ga4WdjxJqbtfM%B2vLhP1?*E!h${CJF^cM4-_d*p`T%vmukA5v~Br!I~yv$d?prt z#2d}wM4K+e#l;P%?39@J_hZXPG%Jj~#9Fh&K%JWqX~A*Llq|Pgv+NFj4&p`@HN4Es zTcJe|jt6`&M{D;%S`9lOB-(1@o~C$FMHK_&eZtHMA$sxu#H9k~hnusrna`WznB-d5R?59P>*8qAAnad?fUAYP=4V3 zRYGiRAGr&F>r*dh@WvnpXnasPKr!E~ZJMsc%h1RO1OnL$nRf%GerPO51j)(EYh9F8 zRKyV8;r3tSY23X>Z@{_3mIh#>OroMza6Cr;~qKKIVL@CdZaXQ@%q!bGnNU?w78q8jf}Rz?oD?R*H~y$y zW*NU!VFV63nJkONO|+xcdEw!CdN*&c6^d{3k4dK+-umn!4HIp)$Pe!H2*&dy%fbH~E@T1{%g-5%MIiH$wQ zU3Yl$cQt-u_<31%dp$%W>$gL%m6ekF4;y$@~C71ZMsc5is7tfd0=^ABQQ;x#U?^Iu1uvZtsF() z6vXKY?lsdJM?G0$(oJ_>{81&gUGOZlGz)O_8UIg*Co3;cVDG-3w3Z+)+|43AHB|tUG#>Q2!f3hlH5VUI! z;7bQxRn4*OLNfERi=0@+yK0>?NPY#AvzOTvf)Kwhh`VxK_*avXk`5)1wpop&h9V*( z%~G9zRj2C(?<IEw0L_+m6%D%gGDNE~Xml&O+E2(w9_IJthe=00lPcYV{qn(D zJ@ah9EKgj>i6`WY?QNG?{!*o525#%oIr_f$$SjhVo5wEkSg++O6l$ui-CvF&5G`_y z=hv09q1j&ZHN0C`+Ob+;B}JVuA4MBF$BDF6n+5vY z+w!x!QBSFehoITRZ`Pk>=Vgb`=%>Vm1L4ljZlM9!e5e$3DnF^TL~Gq^H0oq-=|g8) z)9`6fw__Tjs#7QPv?a0&WR{E`m1qMbjb%eB9u&|U^w^*0iim{%HR!P;dwOhnRqlsD*_Ec>g;Rkhgrck|4cyQ$J#0Jb z#Ba3L6F7hl@bp1S8*aXrN#{(rL!gcXd^1`QKSBUtWB(^*`M0C<%VQ#6xT3W5k8zLy zHv_6n`tI)T)s;7GFW3n-OEEGs^6}%xl5YZZDfBleA7NT!h}q6lMUvNR!M)ksk*0)u z_I~@2iYmRj!T$beP0DzN>9HIhBSS-(P*(*SD2c-v>oG^;<`%fJ6ZI3Ti=UBqesx_;SjHWB2ATy!yWoCglg%QAs3))O{53x%rHNm)=(y?`CBf`W2y6Yk)Q8ilee4hvv{^#2c1 zdJRiU+Go2@!Ogh~0D#1Yr4xOvQRAKfgRvX$W#=~HMRI^A7QsVe%Xrl1&vdA7;TU{5 zIH>yuQSCm{dh0!;7N-H>o7IP2b*r{z0hg7V^Pij-Nn^LEZv~oaX{L&-=P+e!5~DEy zHfa91)>c;WBz*g;K5Nd-&iJxI`q<>d!t1d#ZAc2b2=}Ogl+qeiv?31m-^CzhN~}t@ z@11nn&A^8mCPV(=j`P&hk+pmks4X@vLUn;75r4p72mY6N`ty?%2*CJyx|AifrsX4b zv0E!;<)2k`J)_Dn4Q$1hU+2S;Jw~#*#bD+)>BV3ZT9HakUDwf+*nt@fX4|xYhy(Q4 zz#&)Z5*cMGWqqS#yv z%gqKH(ikSoD`P*ZVI?m%r+mo^3{64U`uH*di99!N=h&n~5TmaB^kiFI6 z_aTW)i}V|4L=m#E@XlrBE4^|iI@!A^yD$Yc1Ti`iQk|u514O$)I4uQaEiq0`L8^uF zuJ4`rV)Y3!A9_iP6WmPnSmk3PCwe@S+T{}~Fp7R`(m6OduyAlB#>Bu+A?^jLKg?7< z@AWCmJ|_yWK72^PdIpDnAKadY`N5C}I94@iG~S%aEe2K2rQ_6IUX}TeRo9m%z$Y4V z*~|+0)ENByR9RVxOyNrii4k)BKy1!N69I?M7H2xm)lZOS< zj??^Bt(hpVqcJxr;>hv6lV32a?kSY|fGn4*ujQ#{fqOEO^)o@5yBxz2PEl3U5E4lr zxBk)5k*ut2fRI~Q^jgvM%h$5WD<3Rs@VTQ~w2k{Xoe0#=-$Q0vW%u7hK)64%I@;(q zKUR_lFq2j+HIzbziWZvR#+AgQ2Z3T;M+6SPq0EaRtwS@-QmH6^eOYYTawx5i`n#aX z%+yp1y7+i_wDWt;)tU(Voo{w^i6qg*#>E{p^jfN7wP+hCYDlw}sbW?TnQ-qS#0QlI zWv32j739enyz(a_b~mf3Euj-n>a|9i>h|)+<>TikA$~n%(?m?1^Aga39HwZsBq0{|o?|C2EM-yCAHd948{WO#mVZrf8xSZqNL4o=SeMs=p${avp4 zkM>w7Y1`Y|aHc2g`FXY7{t20z*jfyeavN4oI8v}e9w&n&{ zm%LWy+{G;r_Bqxw3#8u`wt)lI{q+e}HU&}|icd8yiI6omiTEVhzEO^pwk@vzMUfqx zJgnv`;Bfwk!~j)udmrlWd&gM!#3+r2@Z(6R`yAA?P2>sA)^a;9HAkQkB6T5K(cq;q zRY^Pv*+e|MMor?L%&tP?L>18SesoU3NKZpJH>cOj zY$o^ZWSrMb*u`f!Zee?T81lJZLfiY1d4ww)*^YUcfB7eGxB80S89GsWg4c79$IGv% zlEbnP#i0^~V?!eaqhnxD(=hJvWai{_Jzf6}5yOqUj8+;q@9o|q;I^+FecbYT9W&xI zJ#A^c&{dMH$~@BK$iV9~RUjm+`tpj`MMZPm{#kGK^NtV8 zQKhu-FG4S1=rvOs2*t_dHp48KwMW?bUbZHx#bpz>y}-%ZLyt%5`n`HrOC5v#*gHSg zGPOC}&E-aN+Y>gUob=|#_)LfEpA;`Y7A^gl6Xbl}DOt=<(pm@EVM?2p#qIy9nt!}r zd#-T}WEB$XsHv%uoxXL=SP*_%&b+(fviZeZ#zWQZ81CQdAot~SBKPD_#ts*DkDT{h z9*J4qLT4uPII`hEzGiPtn&PCZ8MAZ#Bq^0qS%y1ecx~0V;{9gdtx?r>1$)is3`-?F z4CUa^Mmbm3y47j?DhO?xi}7W33hIo(hm_{GNrd~9EPN`d4wYi~9_U9vo;AKBU+C42 zxCwtR_{$f&o>`6utNx9YtnS--V|>6`0eHsxy{V@Z0^0iSL1qKcWx9bhK+mN>-vo=bULer77ZP8tU*cI3Ijva!| z*CobN5Rsz6S0bw7W%WL%S*>LzhZu99Q6zxs30^^k|=HL-o91;y8| zv&Zwo>tZh*K-*({HNKG~-lKVze-gmR!{hNcPu8s|G1%`vyKLEH8He+6iyA;T!d_Td z=xLeBE7_URM(N3_la-&YdydfIdDGSN(d7&;`*FTe6NcNtS|;(civH5D4r-6N)4|Yw zmmT0EFl0g(_(2LoKvmQ+z#Bgdg~l7r2*SLkqSyq~W>H4aL9VAG7G8>@BIw?uc-4px#G)yHbOHKFwS zTq*ih&+GEneNpI1+Y&-={aS_1Tp}4UUuRZVSEsJ5ym8=bXK(L!f7G_TS%-H{31oF7jj_#X@y}!X;?2!XY%FTPi&iuR(+0)npiJe0 zqpvPuCS|OPojMj2G`V(TOyD2ZZOctfO+yJ6emuwP-^1QWTOj&aVDJ>FzM1Zj1EJ6) z)$wZpfgP=?GDsLCyl{#4Nv=mA7L+9Zq(Anxlz+NdI%>=Tk2;2iBo#%-g z*{p)VY2iYHB{HTA2nEpBw@ZF7@$g9j05G{3m;3MXo|q589y|kZfp+cj-p5q{g!*in z;HedH3}$JsdN^II)f?%AgoM9zG<@w_DB{jIh|wmXsCBUhAUG>3r<@S zo?f5TOEZ?n1&*dOTMQzPX0^7qVu{@psTYcs48t>>@Ov2?jQqFtFYlA9%;sxNO3@wc z?QuvwiQuF}B&JIPmK8%Bq5q2xPFGH&gdEYVd8uRjzID-Aln!?e#xT~tmckJWrtXODXn?W51Haa*M3T`sX0Lhv}NHIX>dhUn6V z$j2sfwY2)9n1mauiokLdk0x!{--sx9VQ;UJf*&@rk;XNt&6N6=Y`6qs9I(=rV@A&D zUTNHh8v4zs{?+)RM4UWh(wn4W@O1{yWxV!SLAY4;)CHIGkhiTmqx-6YnrE7Za&VC@ zPxbJ;Tnd@%b#Fcj`=UW!aT)Lx*%wvQDjSv z!?Z&>zYgAHsr%JvV+*z}TaIOYyFmNdhf6X$z1!nnL~NLaRAMpCg<7KjtzgW8{v=!M z?u$AP(hjjVUM-R)d7lbvlrA!b9Pk93-A}On=xvk;E*myYXQL>E`hBm+zsZeHx<%g^ z^X*f{Q#;lF;M1v+5lGn7H$am!4%n#c_PpekT*yDDpJ5ORi$RD2(My*`(8L)ZgA=TFp(@VGR!;q|+i| z0T<)k|8dk8Mx4%5+_yjQWO7|J;1o!*O?T6O#h~jEt;dNlDPaOF$=jTl!MYFF(o|z>*HUM5&;1Lva+w( z@h`;I@#+ECG}GHDXPGJTj?s9IAOv_pr9ftei7Bkh65QQw0-ujgLk6D1Tc8%<#nhiA z+!P>_@ibCwngm+s$PpQz(81lL) zH|tr;@d8h;^#LJV#dK1L$p7B_@Gm9tdg9v)zoz>H%DIEuo8yOrMn=x1=b)aN({3d0 zliHS+UwfYX{QR-E$6(jB9)8gH@C~IeAtjpxH?O$ZhOsgtmvsa!3;q!8f;isDOxn_guLp8|4H{9gxy^Q(UG zkxz&gu23f<{ySJ(@Qz@h{9-2{&8SeW$jGW@6qfrMLb87qwl(#7#-8LblqTjIsv2lk5#z??DN0Q% zuZ|)`e>L}=4q~#5IYOOd>+%y0peKEYI7fXChEhw%^q(;aV$7g`d|Cw#7So)KOM$#9^;w@oGrp$Hhi<%n>+^c zo2W!7M?AP}b*GSLU* z`0&=^?2{{5uwd}KpxFK5Z-J)+Rpx^f{{{4A9v+K99(DD{okR@RaKXq2*o2VzoF$fW z9pMvf-GDpzYW>8+gYX$f1)>l=Xz$Z&@7u8%iIW%C(7)-gW|Z;!jaRy*IiDLb$t=6y zT3a$1W_!cI##n*3;Dhgn4$$zV#r7HTaZ#Pn|S2(P8fO z8YQKSc7*vH%zq--?W^usJE+C?s2;1pM5f?z;MRZ6C7V7==?7&Hq}`F6HBc4k%gw6d zE8YXgI$dvSxGtvP(6swM}IYe#~a{Q2@4QJ5Ji>H=IVj4#ll z8SRPkgoD2y=mbE>eNIgpO`b2a{3f5zG4?|FYDpJ=(-qcYHoSZ3wKLJgHJ!nA5M%aW z!P&;4x)|r}Gs;_LkS{__7f-}dR)Ys};6I)!9$i=@fp7l56Tb_1x+T>5QWitJIJ~#^ zb>rrY)=4v!Bd;8-{y2&B`JnF;;rWU#8rH`?1|eld-oP)%fqC)IIl_;euaev%APnc0 zH^UkhN^&hqL#P8^8Y%UnW%J<&4uN@1CfDQbA(m?}?`7~Koj-|Jubnq!EJ}|({i*q$ z^IWslwr44&Q1FR2UYGQ{?T;(@yn2ch9ZCP^B>ysbvy~1y%Vs8`{Ik^>qh1g<5H|dK z#?O=!pPgdj`gbc2x0e46=guqv=Lh`y1hadW$csnXA(_`1?6(|M>IP;UXbD~2)bLI4 z$+skOV7hO|J0Sb2hVmHbw^N%Hd^1c=DVEiHU)>eHlYF{(yh2V$;a!b3*}3+1Dd(LT zr$s_CqmL|TE9NhxBU>I z|F!hr%`Gvs{9qDxaxY^MLGgFyzx%z(L`1c--J34uH(jo!-J`M@=*9G5ga2u z;M4}Y4pw5ESc4@}C-%W{t=m8NDbG+E-a%)Mj`L3=!O0&)2^opM!r&>C7@*I&e^3WX zK%YSYU^9e8p-Z2j|2t?DJf3g;{HNT0mBV8j`%klhyNAbK9h~EQZEQ@1%T9T|JNZ7x zOD)Q#EY`NRv+82Xv%K6^!`Pjx1t}@TnL|TERcm5H^S|+67v0y;`}y9dvdq~@cuDFR zwD$1Dn_NtFW_C6T%XY21szmlpx_~QGMM2@c-iA@i#m*$9kY}_yo);nP0_uMv3WR}M z^BllcRU7mb6%}|4D!xZ8^AvuYIJsqIVaQmmi%vN?IbBFSxrU^wliA#~EG+wQ+NOQ} z9hovu)ZZIU0!!tSdfa~Z!HGxTJfnxaNl;ZIXCb^)e+}1c)RN-cd+E4^m<5G8>hcpA wSYn^3QOMiJ2ZNLj#c6_~1w)1z6`v`cZQcx4iWorQ?UMjSSv8qjDf3VN3p$p_vH$=8 literal 0 HcmV?d00001 diff --git a/plugins/channelrx/CMakeLists.txt b/plugins/channelrx/CMakeLists.txt index fc20e0df6..90a06fa44 100644 --- a/plugins/channelrx/CMakeLists.txt +++ b/plugins/channelrx/CMakeLists.txt @@ -18,6 +18,10 @@ add_subdirectory(demodchirpchat) add_subdirectory(demodvorsc) add_subdirectory(demodpacket) +if(APT_FOUND) + add_subdirectory(demodapt) +endif() + if(LIBDSDCC_FOUND AND LIBMBE_FOUND) add_subdirectory(demoddsd) endif(LIBDSDCC_FOUND AND LIBMBE_FOUND) diff --git a/plugins/channelrx/demodapt/CMakeLists.txt b/plugins/channelrx/demodapt/CMakeLists.txt new file mode 100644 index 000000000..2eeacf6de --- /dev/null +++ b/plugins/channelrx/demodapt/CMakeLists.txt @@ -0,0 +1,68 @@ +project(demodapt) + +set(demodapt_SOURCES + aptdemod.cpp + aptdemodsettings.cpp + aptdemodbaseband.cpp + aptdemodsink.cpp + aptdemodplugin.cpp + aptdemodwebapiadapter.cpp +) + +set(demodapt_HEADERS + aptdemod.h + aptdemodsettings.h + aptdemodbaseband.h + aptdemodsink.h + aptdemodplugin.h + aptdemodwebapiadapter.h +) + +include_directories( + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client + ${APT_INCLUDE_DIR} +) + +if(NOT SERVER_MODE) + set(demodapt_SOURCES + ${demodapt_SOURCES} + aptdemodgui.cpp + aptdemodgui.ui + aptdemodsettingsdialog.cpp + aptdemodsettingsdialog.ui + icons.qrc + ) + set(demodapt_HEADERS + ${demodapt_HEADERS} + aptdemodgui.h + aptdemodsettingsdialog.h + ) + + set(TARGET_NAME demodapt) + set(TARGET_LIB "Qt5::Widgets") + set(TARGET_LIB_GUI "sdrgui") + set(INSTALL_FOLDER ${INSTALL_PLUGINS_DIR}) +else() + set(TARGET_NAME demodaptsrv) + set(TARGET_LIB "") + set(TARGET_LIB_GUI "") + set(INSTALL_FOLDER ${INSTALL_PLUGINSSRV_DIR}) +endif() + +add_library(${TARGET_NAME} SHARED + ${demodapt_SOURCES} +) + +if(APT_EXTERNAL) + add_dependencies(${TARGET_NAME} apt) +endif() + +target_link_libraries(${TARGET_NAME} + Qt5::Core + ${TARGET_LIB} + sdrbase + ${TARGET_LIB_GUI} + ${APT_LIBRARIES} +) + +install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER}) diff --git a/plugins/channelrx/demodapt/aptdemod.cpp b/plugins/channelrx/demodapt/aptdemod.cpp new file mode 100644 index 000000000..86f9f65c2 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemod.cpp @@ -0,0 +1,851 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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 "aptdemod.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "SWGChannelSettings.h" +#include "SWGAPTDemodSettings.h" +#include "SWGChannelReport.h" +#include "SWGChannelActions.h" +#include "SWGMapItem.h" +#include "SWGAPTDemodActions.h" + +#include "dsp/dspengine.h" +#include "dsp/dspcommands.h" +#include "device/deviceapi.h" +#include "feature/feature.h" +#include "util/db.h" +#include "maincore.h" + +MESSAGE_CLASS_DEFINITION(APTDemod::MsgConfigureAPTDemod, Message) +MESSAGE_CLASS_DEFINITION(APTDemod::MsgPixels, Message) +MESSAGE_CLASS_DEFINITION(APTDemod::MsgImage, Message) +MESSAGE_CLASS_DEFINITION(APTDemod::MsgResetDecoder, Message) + +const char * const APTDemod::m_channelIdURI = "sdrangel.channel.aptdemod"; +const char * const APTDemod::m_channelId = "APTDemod"; + +APTDemod::APTDemod(DeviceAPI *deviceAPI) : + ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSink), + m_deviceAPI(deviceAPI), + m_basebandSampleRate(0) +{ + setObjectName(m_channelId); + + m_basebandSink = new APTDemodBaseband(this); + m_basebandSink->setMessageQueueToChannel(getInputMessageQueue()); + m_basebandSink->moveToThread(&m_thread); + + applySettings(m_settings, true); + + m_deviceAPI->addChannelSink(this); + m_deviceAPI->addChannelSinkAPI(this); + + m_networkManager = new QNetworkAccessManager(); + connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*))); + + for (int y = 0; y < APT_MAX_HEIGHT; y++) + { + m_image.prow[y] = new float[APT_PROW_WIDTH]; + m_tempImage.prow[y] = new float[APT_PROW_WIDTH]; + } + resetDecoder(); +} + +APTDemod::~APTDemod() +{ + qDebug("APTDemod::~APTDemod"); + 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; + + for (int y = 0; y < APT_MAX_HEIGHT; y++) + { + delete m_image.prow[y]; + delete m_tempImage.prow[y]; + } +} + +uint32_t APTDemod::getNumberOfDeviceStreams() const +{ + return m_deviceAPI->getNbSourceStreams(); +} + +void APTDemod::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst) +{ + (void) firstOfBurst; + m_basebandSink->feed(begin, end); +} + +void APTDemod::start() +{ + qDebug("APTDemod::start"); + + m_basebandSink->reset(); + m_basebandSink->startWork(); + m_thread.start(); + + DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency); + m_basebandSink->getInputMessageQueue()->push(dspMsg); + + APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg = APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(m_settings, true); + m_basebandSink->getInputMessageQueue()->push(msg); +} + +void APTDemod::stop() +{ + qDebug("APTDemod::stop"); + m_basebandSink->stopWork(); + m_thread.quit(); + m_thread.wait(); +} + +bool APTDemod::matchSatellite(const QString satelliteName) +{ + return m_settings.m_satelliteTrackerControl + && ( (satelliteName == m_settings.m_satelliteName) + || ( (m_settings.m_satelliteName == "All") + && ( (satelliteName == "NOAA 15") + || (satelliteName == "NOAA 18") + || (satelliteName == "NOAA 19")))); +} + +bool APTDemod::handleMessage(const Message& cmd) +{ + if (MsgConfigureAPTDemod::match(cmd)) + { + MsgConfigureAPTDemod& cfg = (MsgConfigureAPTDemod&) cmd; + qDebug() << "APTDemod::handleMessage: MsgConfigureAPTDemod"; + 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() << "APTDemod::handleMessage: DSPSignalNotification"; + m_basebandSink->getInputMessageQueue()->push(rep); + // Forward to GUI if any + if (m_guiMessageQueue) + m_guiMessageQueue->push(new DSPSignalNotification(notif)); + + return true; + } + else if (APTDemod::MsgPixels::match(cmd)) + { + const APTDemod::MsgPixels& pixelsMsg = (APTDemod::MsgPixels&) cmd; + const float *pixels = pixelsMsg.getPixels(); + processPixels(pixels); + return true; + } + else if (APTDemod::MsgResetDecoder::match(cmd)) + { + resetDecoder(); + // Forward to sink + m_basebandSink->getInputMessageQueue()->push(APTDemod::MsgResetDecoder::create()); + return true; + } + else + { + return false; + } +} + +void APTDemod::applySettings(const APTDemodSettings& settings, bool force) +{ + bool callProcessImage = false; + + qDebug() << "APTDemod::applySettings:" + << " m_cropNoise: " << settings.m_cropNoise + << " m_denoise: " << settings.m_denoise + << " m_linearEqualise: " << settings.m_linearEqualise + << " m_histogramEqualise: " << settings.m_histogramEqualise + << " m_precipitationOverlay: " << settings.m_precipitationOverlay + << " m_flip: " << settings.m_flip + << " m_channels: " << settings.m_channels + << " m_decodeEnabled: " << settings.m_decodeEnabled + << " m_autoSave: " << settings.m_autoSave + << " m_autoSavePath: " << settings.m_autoSavePath + << " m_autoSaveMinScanLines: " << settings.m_autoSaveMinScanLines + << " 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_rfBandwidth != m_settings.m_rfBandwidth) || force) { + reverseAPIKeys.append("rfBandwidth"); + } + if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) { + reverseAPIKeys.append("fmDeviation"); + } + if ((settings.m_denoise != m_settings.m_denoise) || force) { + reverseAPIKeys.append("denoise"); + } + if ((settings.m_linearEqualise != m_settings.m_linearEqualise) || force) { + reverseAPIKeys.append("linearEqualise"); + } + if ((settings.m_histogramEqualise != m_settings.m_histogramEqualise) || force) { + reverseAPIKeys.append("histogramEqualise"); + } + if ((settings.m_precipitationOverlay != m_settings.m_precipitationOverlay) || force) { + reverseAPIKeys.append("precipitationOverlay"); + } + if ((settings.m_flip != m_settings.m_flip) || force) { + reverseAPIKeys.append("flip"); + } + if ((settings.m_channels != m_settings.m_channels) || force) { + reverseAPIKeys.append("channels"); + } + if ((settings.m_decodeEnabled != m_settings.m_decodeEnabled) || force) { + reverseAPIKeys.append("decodeEnabled"); + } + if ((settings.m_autoSave != m_settings.m_autoSave) || force) { + reverseAPIKeys.append("autoSave"); + } + if ((settings.m_autoSavePath != m_settings.m_autoSavePath) || force) { + reverseAPIKeys.append("autoSavePath"); + } + if ((settings.m_autoSaveMinScanLines != m_settings.m_autoSaveMinScanLines) || force) { + reverseAPIKeys.append("autoSaveMinScanLines"); + } + + 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"); + } + + APTDemodBaseband::MsgConfigureAPTDemodBaseband *msg = APTDemodBaseband::MsgConfigureAPTDemodBaseband::create(settings, force); + m_basebandSink->getInputMessageQueue()->push(msg); + + 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); + } + + if ((settings.m_cropNoise != m_settings.m_cropNoise) || + (settings.m_denoise != m_settings.m_denoise) || + (settings.m_linearEqualise != m_settings.m_linearEqualise) || + (settings.m_histogramEqualise != m_settings.m_histogramEqualise) || + (settings.m_precipitationOverlay != m_settings.m_precipitationOverlay) || + (settings.m_flip != m_settings.m_flip) || + (settings.m_channels != m_settings.m_channels)) + { + // Call after settings have been applied + callProcessImage = true; + } + + m_settings = settings; + + if (callProcessImage) + sendImageToGUI(); +} + +QByteArray APTDemod::serialize() const +{ + return m_settings.serialize(); +} + +bool APTDemod::deserialize(const QByteArray& data) +{ + if (m_settings.deserialize(data)) + { + MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return true; + } + else + { + m_settings.resetToDefaults(); + MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(m_settings, true); + m_inputMessageQueue.push(msg); + return false; + } +} + +int APTDemod::webapiSettingsGet( + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage) +{ + (void) errorMessage; + response.setAptDemodSettings(new SWGSDRangel::SWGAPTDemodSettings()); + response.getAptDemodSettings()->init(); + webapiFormatChannelSettings(response, m_settings); + return 200; +} + +int APTDemod::webapiSettingsPutPatch( + bool force, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage) +{ + (void) errorMessage; + APTDemodSettings settings = m_settings; + webapiUpdateChannelSettings(settings, channelSettingsKeys, response); + + MsgConfigureAPTDemod *msg = MsgConfigureAPTDemod::create(settings, force); + m_inputMessageQueue.push(msg); + + qDebug("APTDemod::webapiSettingsPutPatch: forward to GUI: %p", m_guiMessageQueue); + if (m_guiMessageQueue) // forward to GUI if any + { + MsgConfigureAPTDemod *msgToGUI = MsgConfigureAPTDemod::create(settings, force); + m_guiMessageQueue->push(msgToGUI); + } + + webapiFormatChannelSettings(response, settings); + + return 200; +} + +void APTDemod::webapiUpdateChannelSettings( + APTDemodSettings& settings, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response) +{ + if (channelSettingsKeys.contains("inputFrequencyOffset")) { + settings.m_inputFrequencyOffset = response.getAptDemodSettings()->getInputFrequencyOffset(); + } + if (channelSettingsKeys.contains("fmDeviation")) { + settings.m_fmDeviation = response.getAptDemodSettings()->getFmDeviation(); + } + if (channelSettingsKeys.contains("rfBandwidth")) { + settings.m_rfBandwidth = response.getAptDemodSettings()->getRfBandwidth(); + } + if (channelSettingsKeys.contains("cropNoise")) { + settings.m_cropNoise = response.getAptDemodSettings()->getCropNoise(); + } + if (channelSettingsKeys.contains("denoise")) { + settings.m_denoise = response.getAptDemodSettings()->getDenoise(); + } + if (channelSettingsKeys.contains("linearEqualise")) { + settings.m_linearEqualise = response.getAptDemodSettings()->getLinearEqualise(); + } + if (channelSettingsKeys.contains("histogramEqualise")) { + settings.m_histogramEqualise = response.getAptDemodSettings()->getHistogramEqualise(); + } + if (channelSettingsKeys.contains("precipitationOverlay")) { + settings.m_precipitationOverlay = response.getAptDemodSettings()->getPrecipitationOverlay(); + } + if (channelSettingsKeys.contains("flip")) { + settings.m_flip = response.getAptDemodSettings()->getFlip(); + } + if (channelSettingsKeys.contains("channels")) { + settings.m_channels = (APTDemodSettings::ChannelSelection)response.getAptDemodSettings()->getChannels(); + } + if (channelSettingsKeys.contains("decodeEnabled")) { + settings.m_decodeEnabled = response.getAptDemodSettings()->getDecodeEnabled(); + } + if (channelSettingsKeys.contains("autoSave")) { + settings.m_autoSave = response.getAptDemodSettings()->getAutoSave(); + } + if (channelSettingsKeys.contains("autoSavePath")) { + settings.m_autoSavePath = *response.getAptDemodSettings()->getAutoSavePath(); + } + if (channelSettingsKeys.contains("autoSaveMinScanLines")) { + settings.m_autoSaveMinScanLines = response.getAptDemodSettings()->getAutoSaveMinScanLines(); + } + if (channelSettingsKeys.contains("rgbColor")) { + settings.m_rgbColor = response.getAptDemodSettings()->getRgbColor(); + } + if (channelSettingsKeys.contains("title")) { + settings.m_title = *response.getAptDemodSettings()->getTitle(); + } + if (channelSettingsKeys.contains("streamIndex")) { + settings.m_streamIndex = response.getAptDemodSettings()->getStreamIndex(); + } + if (channelSettingsKeys.contains("useReverseAPI")) { + settings.m_useReverseAPI = response.getAptDemodSettings()->getUseReverseApi() != 0; + } + if (channelSettingsKeys.contains("reverseAPIAddress")) { + settings.m_reverseAPIAddress = *response.getAptDemodSettings()->getReverseApiAddress(); + } + if (channelSettingsKeys.contains("reverseAPIPort")) { + settings.m_reverseAPIPort = response.getAptDemodSettings()->getReverseApiPort(); + } + if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) { + settings.m_reverseAPIDeviceIndex = response.getAptDemodSettings()->getReverseApiDeviceIndex(); + } + if (channelSettingsKeys.contains("reverseAPIChannelIndex")) { + settings.m_reverseAPIChannelIndex = response.getAptDemodSettings()->getReverseApiChannelIndex(); + } +} + +void APTDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& response, const APTDemodSettings& settings) +{ + response.getAptDemodSettings()->setInputFrequencyOffset(settings.m_inputFrequencyOffset); + response.getAptDemodSettings()->setRfBandwidth(settings.m_rfBandwidth); + response.getAptDemodSettings()->setFmDeviation(settings.m_fmDeviation); + response.getAptDemodSettings()->setCropNoise(settings.m_cropNoise); + response.getAptDemodSettings()->setCropNoise(settings.m_denoise); + response.getAptDemodSettings()->setLinearEqualise(settings.m_linearEqualise); + response.getAptDemodSettings()->setHistogramEqualise(settings.m_histogramEqualise); + response.getAptDemodSettings()->setPrecipitationOverlay(settings.m_precipitationOverlay); + response.getAptDemodSettings()->setFlip(settings.m_flip); + response.getAptDemodSettings()->setChannels((int)settings.m_channels); + response.getAptDemodSettings()->setDecodeEnabled(settings.m_decodeEnabled); + response.getAptDemodSettings()->setAutoSave(settings.m_autoSave); + response.getAptDemodSettings()->setAutoSavePath(new QString(settings.m_autoSavePath)); + response.getAptDemodSettings()->setAutoSaveMinScanLines(settings.m_autoSaveMinScanLines); + + response.getAptDemodSettings()->setRgbColor(settings.m_rgbColor); + + if (response.getAptDemodSettings()->getTitle()) { + *response.getAptDemodSettings()->getTitle() = settings.m_title; + } else { + response.getAptDemodSettings()->setTitle(new QString(settings.m_title)); + } + + response.getAptDemodSettings()->setStreamIndex(settings.m_streamIndex); + response.getAptDemodSettings()->setUseReverseApi(settings.m_useReverseAPI ? 1 : 0); + + if (response.getAptDemodSettings()->getReverseApiAddress()) { + *response.getAptDemodSettings()->getReverseApiAddress() = settings.m_reverseAPIAddress; + } else { + response.getAptDemodSettings()->setReverseApiAddress(new QString(settings.m_reverseAPIAddress)); + } + + response.getAptDemodSettings()->setReverseApiPort(settings.m_reverseAPIPort); + response.getAptDemodSettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex); + response.getAptDemodSettings()->setReverseApiChannelIndex(settings.m_reverseAPIChannelIndex); +} + +void APTDemod::webapiReverseSendSettings(QList& channelSettingsKeys, const APTDemodSettings& 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 APTDemod::webapiFormatChannelSettings( + QList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings *swgChannelSettings, + const APTDemodSettings& settings, + bool force +) +{ + swgChannelSettings->setDirection(0); // Single sink (Rx) + swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet()); + swgChannelSettings->setOriginatorDeviceSetIndex(getDeviceSetIndex()); + swgChannelSettings->setChannelType(new QString("APTDemod")); + swgChannelSettings->setAptDemodSettings(new SWGSDRangel::SWGAPTDemodSettings()); + SWGSDRangel::SWGAPTDemodSettings *swgAPTDemodSettings = swgChannelSettings->getAptDemodSettings(); + + // transfer data that has been modified. When force is on transfer all data except reverse API data + + if (channelSettingsKeys.contains("inputFrequencyOffset") || force) { + swgAPTDemodSettings->setInputFrequencyOffset(settings.m_inputFrequencyOffset); + } + if (channelSettingsKeys.contains("rfBandwidth") || force) { + swgAPTDemodSettings->setRfBandwidth(settings.m_rfBandwidth); + } + if (channelSettingsKeys.contains("fmDeviation") || force) { + swgAPTDemodSettings->setFmDeviation(settings.m_fmDeviation); + } + if (channelSettingsKeys.contains("cropNoise") || force) { + swgAPTDemodSettings->setCropNoise(settings.m_cropNoise); + } + if (channelSettingsKeys.contains("denoise") || force) { + swgAPTDemodSettings->setDenoise(settings.m_denoise); + } + if (channelSettingsKeys.contains("linearEqualise") || force) { + swgAPTDemodSettings->setLinearEqualise(settings.m_linearEqualise); + } + if (channelSettingsKeys.contains("histogramEqualise") || force) { + swgAPTDemodSettings->setHistogramEqualise(settings.m_histogramEqualise); + } + if (channelSettingsKeys.contains("precipitationOverlay") || force) { + swgAPTDemodSettings->setPrecipitationOverlay(settings.m_precipitationOverlay); + } + if (channelSettingsKeys.contains("flip") || force) { + swgAPTDemodSettings->setFlip(settings.m_flip); + } + if (channelSettingsKeys.contains("channels") || force) { + swgAPTDemodSettings->setChannels((int)settings.m_channels); + } + if (channelSettingsKeys.contains("decodeEnabled") || force) { + swgAPTDemodSettings->setDecodeEnabled(settings.m_decodeEnabled); + } + if (channelSettingsKeys.contains("m_autoSave") || force) { + swgAPTDemodSettings->setAutoSave(settings.m_autoSave); + } + if (channelSettingsKeys.contains("m_autoSavePath") || force) { + swgAPTDemodSettings->setAutoSavePath(new QString(settings.m_autoSavePath)); + } + if (channelSettingsKeys.contains("m_autoSaveMinScanLines") || force) { + swgAPTDemodSettings->setAutoSaveMinScanLines(settings.m_autoSaveMinScanLines); + } + if (channelSettingsKeys.contains("rgbColor") || force) { + swgAPTDemodSettings->setRgbColor(settings.m_rgbColor); + } + if (channelSettingsKeys.contains("title") || force) { + swgAPTDemodSettings->setTitle(new QString(settings.m_title)); + } + if (channelSettingsKeys.contains("streamIndex") || force) { + swgAPTDemodSettings->setStreamIndex(settings.m_streamIndex); + } +} + +int APTDemod::webapiActionsPost( + const QStringList& channelActionsKeys, + SWGSDRangel::SWGChannelActions& query, + QString& errorMessage) +{ + SWGSDRangel::SWGAPTDemodActions *swgAPTDemodActions = query.getAptDemodActions(); + + if (swgAPTDemodActions) + { + if (channelActionsKeys.contains("aos")) + { + qDebug() << "Aos action"; + SWGSDRangel::SWGAPTDemodActions_aos* aos = swgAPTDemodActions->getAos(); + QString *satelliteName = aos->getSatelliteName(); + if (satelliteName != nullptr) + { + qDebug() << "sat " << *satelliteName; + if (matchSatellite(*satelliteName)) + { + qDebug() << "Matched sat"; + // Reset for new pass + resetDecoder(); + m_basebandSink->getInputMessageQueue()->push(APTDemod::MsgResetDecoder::create()); + + // Save satellite name + m_satelliteName = *satelliteName; + + // Enable decoder and set direction of pass + APTDemodSettings settings = m_settings; + settings.m_decodeEnabled = true; + settings.m_flip = !aos->getNorthToSouthPass(); + qDebug() << "Sending settings"; + m_inputMessageQueue.push(MsgConfigureAPTDemod::create(settings, false)); + if (m_guiMessageQueue) + m_guiMessageQueue->push(MsgConfigureAPTDemod::create(settings, false)); + } + + return 202; + } + else + { + errorMessage = "Missing satellite name"; + return 400; + } + } + else if (channelActionsKeys.contains("los")) + { + SWGSDRangel::SWGAPTDemodActions_los* los = swgAPTDemodActions->getLos(); + QString *satelliteName = los->getSatelliteName(); + if (satelliteName != nullptr) + { + if (matchSatellite(*satelliteName)) + { + // Save image + if (m_settings.m_autoSave) + saveImageToDisk(); + // Disable decoder + APTDemodSettings settings = m_settings; + settings.m_decodeEnabled = false; + m_inputMessageQueue.push(MsgConfigureAPTDemod::create(settings, false)); + if (m_guiMessageQueue) + m_guiMessageQueue->push(MsgConfigureAPTDemod::create(settings, false)); + } + + return 202; + } + else + { + errorMessage = "Missing satellite name"; + return 400; + } + } + else + { + errorMessage = "Unknown action"; + return 400; + } + } + else + { + errorMessage = "Missing APTDemodActions in query"; + return 400; + } +} + +void APTDemod::networkManagerFinished(QNetworkReply *reply) +{ + QNetworkReply::NetworkError replyError = reply->error(); + + if (replyError) + { + qWarning() << "APTDemod::networkManagerFinished:" + << " error(" << (int) replyError + << "): " << replyError + << ": " << reply->errorString(); + } + else + { + QString answer = reply->readAll(); + answer.chop(1); // remove last \n + qDebug("APTDemod::networkManagerFinished: reply:\n%s", answer.toStdString().c_str()); + } + + reply->deleteLater(); +} + +void APTDemod::resetDecoder() +{ + m_image.nrow = 0; + m_tempImage.nrow = 0; + m_greyImage = QImage(APT_IMG_WIDTH, APT_MAX_HEIGHT, QImage::Format_Grayscale8); + m_greyImage.fill(0); + m_colourImage = QImage(APT_IMG_WIDTH, APT_MAX_HEIGHT, QImage::Format_RGB888); + m_colourImage.fill(0); + m_satelliteName = ""; +} + +void APTDemod::processPixels(const float *pixels) +{ + memcpy(m_image.prow[m_image.nrow], pixels, sizeof(float) * APT_PROW_WIDTH); + m_image.nrow++; + sendImageToGUI(); +} + +static void copyImage(apt_image_t *dst, apt_image_t *src) +{ + dst->nrow = src->nrow; + dst->zenith = src->zenith; + dst->chA = src->chA; + dst->chB = src->chB; + for (int i = 0; i < src->nrow; i++) + memcpy(dst->prow[i], src->prow[i], sizeof(float) * APT_PROW_WIDTH); +} + +static uchar roundAndClip(float p) +{ + int q = (int)round(p); + if (q > 255) + q = 255; + else if (q < 0) + q = 0; + return q; +} + +QImage APTDemod::extractImage(QImage image) +{ + if (m_settings.m_channels == APTDemodSettings::BOTH_CHANNELS) + return image.copy(0, 0, APT_IMG_WIDTH, m_tempImage.nrow); + else if (m_settings.m_channels == APTDemodSettings::CHANNEL_A) + return image.copy(APT_CHA_OFFSET, 0, APT_CH_WIDTH, m_tempImage.nrow); + else + return image.copy(APT_CHB_OFFSET, 0, APT_CH_WIDTH, m_tempImage.nrow); +} + +QImage APTDemod::processImage(QStringList& imageTypes) +{ + copyImage(&m_tempImage, &m_image); + + // Calibrate channels according to wavelength + if (m_tempImage.nrow >= APT_CALIBRATION_ROWS) + { + m_tempImage.chA = apt_calibrate(m_tempImage.prow, m_tempImage.nrow, APT_CHA_OFFSET, APT_CH_WIDTH); + m_tempImage.chB = apt_calibrate(m_tempImage.prow, m_tempImage.nrow, APT_CHB_OFFSET, APT_CH_WIDTH); + QStringList channelTypes({ + "", // Unknown + "Visible (0.58-0.68 um)", + "Near-IR (0.725-1.0 um)", + "Near-IR (1.58-1.64 um)", + "Mid-infrared (3.55-3.93 um)", + "Thermal-infrared (10.3-11.3 um)", + "Thermal-infrared (11.5-12.5 um)" + }); + + imageTypes.append(channelTypes[m_tempImage.chA]); + imageTypes.append(channelTypes[m_tempImage.chB]); + } + + // Crop noise due to low elevation at top and bottom of image + if (m_settings.m_cropNoise) + m_tempImage.zenith -= apt_cropNoise(&m_tempImage); + + // Denoise filter + if (m_settings.m_denoise) + { + apt_denoise(m_tempImage.prow, m_tempImage.nrow, APT_CHA_OFFSET, APT_CH_WIDTH); + apt_denoise(m_tempImage.prow, m_tempImage.nrow, APT_CHB_OFFSET, APT_CH_WIDTH); + } + + // Flip image if satellite pass is North to South + if (m_settings.m_flip) + { + apt_flipImage(&m_tempImage, APT_CH_WIDTH, APT_CHA_OFFSET); + apt_flipImage(&m_tempImage, APT_CH_WIDTH, APT_CHB_OFFSET); + } + + // Linear equalise to improve contrast + if (m_settings.m_linearEqualise) + { + apt_linearEnhance(m_tempImage.prow, m_tempImage.nrow, APT_CHA_OFFSET, APT_CH_WIDTH); + apt_linearEnhance(m_tempImage.prow, m_tempImage.nrow, APT_CHB_OFFSET, APT_CH_WIDTH); + } + + // Histogram equalise to improve contrast + if (m_settings.m_histogramEqualise) + { + apt_histogramEqualise(m_tempImage.prow, m_tempImage.nrow, APT_CHA_OFFSET, APT_CH_WIDTH); + apt_histogramEqualise(m_tempImage.prow, m_tempImage.nrow, APT_CHB_OFFSET, APT_CH_WIDTH); + } + + if (m_settings.m_precipitationOverlay) + { + // Overlay precipitation + for (int r = 0; r < m_tempImage.nrow; r++) + { + uchar *l = m_colourImage.scanLine(r); + for (int i = 0; i < APT_IMG_WIDTH; i++) + { + float p = m_tempImage.prow[r][i]; + + if ((i >= APT_CHB_OFFSET) && (i < APT_CHB_OFFSET + APT_CH_WIDTH) && (p >= 198)) + { + apt_rgb_t rgb = apt_applyPalette(apt_PrecipPalette, p - 198); + // Negative float values get converted to positive uchars here + l[i*3] = (uchar)rgb.r; + l[i*3+1] = (uchar)rgb.g; + l[i*3+2] = (uchar)rgb.b; + int a = i - APT_CHB_OFFSET + APT_CHA_OFFSET; + l[a*3] = (uchar)rgb.r; + l[a*3+1] = (uchar)rgb.g; + l[a*3+2] = (uchar)rgb.b; + } + else + { + uchar q = roundAndClip(p); + l[i*3] = q; + l[i*3+1] = q; + l[i*3+2] = q; + } + } + } + return extractImage(m_colourImage); + } + else + { + for (int r = 0; r < m_tempImage.nrow; r++) + { + uchar *l = m_greyImage.scanLine(r); + for (int i = 0; i < APT_IMG_WIDTH; i++) + { + float p = m_tempImage.prow[r][i]; + l[i] = roundAndClip(p); + } + } + return extractImage(m_greyImage); + } +} + +void APTDemod::sendImageToGUI() +{ + // Send image to GUI + if (getMessageQueueToGUI()) + { + QStringList imageTypes; + QImage image = processImage(imageTypes); + getMessageQueueToGUI()->push(APTDemod::MsgImage::create(image, imageTypes, m_satelliteName)); + } +} + +void APTDemod::saveImageToDisk() +{ + QStringList imageTypes; + QImage image = processImage(imageTypes); + if (image.height() >= m_settings.m_autoSaveMinScanLines) + { + QString filename; + QDateTime datetime = QDateTime::currentDateTime(); + filename = QString("apt_%1_%2.png").arg(m_satelliteName).arg(datetime.toString("yyyyMMdd_hhmm")); + if (!m_settings.m_autoSavePath.isEmpty()) + { + if (m_settings.m_autoSavePath.endsWith('/')) + filename = m_settings.m_autoSavePath + filename; + else + filename = m_settings.m_autoSavePath + '/' + filename; + } + if (!image.save(filename)) + qCritical() << "Failed to save APT image to: " << filename; + } +} diff --git a/plugins/channelrx/demodapt/aptdemod.h b/plugins/channelrx/demodapt/aptdemod.h new file mode 100644 index 000000000..f38341e6a --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemod.h @@ -0,0 +1,242 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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_APTDEMOD_H +#define INCLUDE_APTDEMOD_H + +#include + +#include +#include +#include + +#include + +#include "dsp/basebandsamplesink.h" +#include "channel/channelapi.h" +#include "util/message.h" + +#include "aptdemodbaseband.h" +#include "aptdemodsettings.h" + +class QNetworkAccessManager; +class QNetworkReply; +class QThread; +class DeviceAPI; + +class APTDemod : public BasebandSampleSink, public ChannelAPI { + Q_OBJECT +public: + class MsgConfigureAPTDemod : public Message { + MESSAGE_CLASS_DECLARATION + + public: + const APTDemodSettings& getSettings() const { return m_settings; } + bool getForce() const { return m_force; } + + static MsgConfigureAPTDemod* create(const APTDemodSettings& settings, bool force) + { + return new MsgConfigureAPTDemod(settings, force); + } + + private: + APTDemodSettings m_settings; + bool m_force; + + MsgConfigureAPTDemod(const APTDemodSettings& settings, bool force) : + Message(), + m_settings(settings), + m_force(force) + { } + }; + + // One row of pixels from sink + class MsgPixels : public Message { + MESSAGE_CLASS_DECLARATION + + public: + const float *getPixels() const { return m_pixels; } + int getZenith() const { return m_zenith; } + + static MsgPixels* create(const float *pixels, int zenith) + { + return new MsgPixels(pixels, zenith); + } + + private: + float m_pixels[APT_PROW_WIDTH]; + int m_zenith; + + MsgPixels(const float *pixels, int zenith) : + Message(), + m_zenith(zenith) + { + memcpy(m_pixels, pixels, sizeof(m_pixels)); + } + }; + + // Processed image to be sent to GUI + class MsgImage : public Message { + MESSAGE_CLASS_DECLARATION + + public: + const QImage getImage() const { return m_image; } + const QStringList getImageTypes() const { return m_imageTypes; } + const QString getSatelliteName() const { return m_satelliteName; } + + static MsgImage* create(const QImage image, const QStringList imageTypes, const QString satelliteName) + { + return new MsgImage(image, imageTypes, satelliteName); + } + + private: + QImage m_image; + QStringList m_imageTypes; + QString m_satelliteName; + + MsgImage(const QImage image, const QStringList imageTypes, const QString satelliteName) : + Message(), + m_image(image), + m_imageTypes(imageTypes), + m_satelliteName(satelliteName) + { + } + }; + + // Sent from GUI to reset decoder + class MsgResetDecoder : public Message { + MESSAGE_CLASS_DECLARATION + + public: + static MsgResetDecoder* create() + { + return new MsgResetDecoder(); + } + + private: + + MsgResetDecoder() : + Message() + { + } + }; + + APTDemod(DeviceAPI *deviceAPI); + virtual ~APTDemod(); + 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); + + virtual int webapiSettingsPutPatch( + bool force, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage); + + virtual int webapiActionsPost( + const QStringList& channelActionsKeys, + SWGSDRangel::SWGChannelActions& query, + QString& errorMessage); + + static void webapiFormatChannelSettings( + SWGSDRangel::SWGChannelSettings& response, + const APTDemodSettings& settings); + + static void webapiUpdateChannelSettings( + APTDemodSettings& 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); + } + + uint32_t getNumberOfDeviceStreams() const; + + static const char * const m_channelIdURI; + static const char * const m_channelId; + +private: + DeviceAPI *m_deviceAPI; + QThread m_thread; + APTDemodBaseband* m_basebandSink; + APTDemodSettings m_settings; + int m_basebandSampleRate; //!< stored from device message used when starting baseband sink + qint64 m_centerFrequency; + + QNetworkAccessManager *m_networkManager; + QNetworkRequest m_networkRequest; + + // Image buffers + apt_image_t m_image; // Received image + apt_image_t m_tempImage; // Processed image + QImage m_greyImage; + QImage m_colourImage; + QString m_satelliteName; + + void applySettings(const APTDemodSettings& settings, bool force = false); + void webapiReverseSendSettings(QList& channelSettingsKeys, const APTDemodSettings& settings, bool force); + void webapiFormatChannelSettings( + QList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings *swgChannelSettings, + const APTDemodSettings& settings, + bool force + ); + + bool matchSatellite(const QString satelliteName); + void resetDecoder(); + void processPixels(const float *pixels); + QImage extractImage(QImage image); + QImage processImage(QStringList& imageTypes); + void sendImageToGUI(); + void saveImageToDisk(); + +private slots: + void networkManagerFinished(QNetworkReply *reply); + +}; + +#endif // INCLUDE_APTDEMOD_H diff --git a/plugins/channelrx/demodapt/aptdemodbaseband.cpp b/plugins/channelrx/demodapt/aptdemodbaseband.cpp new file mode 100644 index 000000000..9a700a1b7 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodbaseband.cpp @@ -0,0 +1,177 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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 "aptdemodbaseband.h" +#include "aptdemod.h" + +MESSAGE_CLASS_DEFINITION(APTDemodBaseband::MsgConfigureAPTDemodBaseband, Message) + +APTDemodBaseband::APTDemodBaseband(APTDemod *packetDemod) : + m_sink(packetDemod), + m_running(false), + m_mutex(QMutex::Recursive) +{ + qDebug("APTDemodBaseband::APTDemodBaseband"); + + m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(48000)); + m_channelizer = new DownChannelizer(&m_sink); +} + +APTDemodBaseband::~APTDemodBaseband() +{ + m_inputMessageQueue.clear(); + + delete m_channelizer; +} + +void APTDemodBaseband::reset() +{ + QMutexLocker mutexLocker(&m_mutex); + m_inputMessageQueue.clear(); + m_sampleFifo.reset(); +} + +void APTDemodBaseband::startWork() +{ + QMutexLocker mutexLocker(&m_mutex); + connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); + QObject::connect( + &m_sampleFifo, + &SampleSinkFifo::dataReady, + this, + &APTDemodBaseband::handleData, + Qt::QueuedConnection + ); + m_running = true; +} + +void APTDemodBaseband::stopWork() +{ + QMutexLocker mutexLocker(&m_mutex); + disconnect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); + QObject::disconnect( + &m_sampleFifo, + &SampleSinkFifo::dataReady, + this, + &APTDemodBaseband::handleData + ); + m_running = false; +} + +void APTDemodBaseband::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end) +{ + m_sampleFifo.write(begin, end); +} + +void APTDemodBaseband::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 APTDemodBaseband::handleInputMessages() +{ + Message* message; + + while ((message = m_inputMessageQueue.pop()) != nullptr) + { + if (handleMessage(*message)) { + delete message; + } + } +} + +bool APTDemodBaseband::handleMessage(const Message& cmd) +{ + qDebug() << "APTDemodBaseband::handleMessage"; + if (MsgConfigureAPTDemodBaseband::match(cmd)) + { + QMutexLocker mutexLocker(&m_mutex); + MsgConfigureAPTDemodBaseband& cfg = (MsgConfigureAPTDemodBaseband&) cmd; + qDebug() << "APTDemodBaseband::handleMessage: MsgConfigureAPTDemodBaseband"; + + applySettings(cfg.getSettings(), cfg.getForce()); + + return true; + } + else if (DSPSignalNotification::match(cmd)) + { + QMutexLocker mutexLocker(&m_mutex); + DSPSignalNotification& notif = (DSPSignalNotification&) cmd; + qDebug() << "APTDemodBaseband::handleMessage: DSPSignalNotification: basebandSampleRate: " << notif.getSampleRate(); + setBasebandSampleRate(notif.getSampleRate()); + m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(notif.getSampleRate())); + + return true; + } + else if (APTDemod::MsgResetDecoder::match(cmd)) + { + m_sink.resetDecoder(); + return true; + } + else + { + return false; + } +} + +void APTDemodBaseband::applySettings(const APTDemodSettings& settings, bool force) +{ + if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + { + m_channelizer->setChannelization(APTDEMOD_AUDIO_SAMPLE_RATE, settings.m_inputFrequencyOffset); + m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); + } + + m_sink.applySettings(settings, force); + + m_settings = settings; +} + +void APTDemodBaseband::setBasebandSampleRate(int sampleRate) +{ + m_channelizer->setBasebandSampleRate(sampleRate); + m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); +} diff --git a/plugins/channelrx/demodapt/aptdemodbaseband.h b/plugins/channelrx/demodapt/aptdemodbaseband.h new file mode 100644 index 000000000..8acbf26fe --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodbaseband.h @@ -0,0 +1,94 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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_APTDEMODBASEBAND_H +#define INCLUDE_APTDEMODBASEBAND_H + +#include +#include + +#include "dsp/samplesinkfifo.h" +#include "util/message.h" +#include "util/messagequeue.h" + +#include "aptdemodsink.h" + +class DownChannelizer; +class APTDemod; + +class APTDemodBaseband : public QObject +{ + Q_OBJECT +public: + class MsgConfigureAPTDemodBaseband : public Message { + MESSAGE_CLASS_DECLARATION + + public: + const APTDemodSettings& getSettings() const { return m_settings; } + bool getForce() const { return m_force; } + + static MsgConfigureAPTDemodBaseband* create(const APTDemodSettings& settings, bool force) + { + return new MsgConfigureAPTDemodBaseband(settings, force); + } + + private: + APTDemodSettings m_settings; + bool m_force; + + MsgConfigureAPTDemodBaseband(const APTDemodSettings& settings, bool force) : + Message(), + m_settings(settings), + m_force(force) + { } + }; + + APTDemodBaseband(APTDemod *packetDemod); + ~APTDemodBaseband(); + 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); + double getMagSq() const { return m_sink.getMagSq(); } + bool isRunning() const { return m_running; } + +private: + SampleSinkFifo m_sampleFifo; + DownChannelizer *m_channelizer; + APTDemodSink m_sink; + MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication + APTDemodSettings m_settings; + bool m_running; + QMutex m_mutex; + + bool handleMessage(const Message& cmd); + void calculateOffset(APTDemodSink *sink); + void applySettings(const APTDemodSettings& settings, bool force = false); + +private slots: + void handleInputMessages(); + void handleData(); //!< Handle data when samples have to be processed +}; + +#endif // INCLUDE_APTDEMODBASEBAND_H diff --git a/plugins/channelrx/demodapt/aptdemodgui.cpp b/plugins/channelrx/demodapt/aptdemodgui.cpp new file mode 100644 index 000000000..06e724482 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodgui.cpp @@ -0,0 +1,479 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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 "aptdemodgui.h" +#include "util/ax25.h" + +#include "device/deviceuiset.h" +#include "dsp/dspengine.h" +#include "dsp/dspcommands.h" +#include "ui_aptdemodgui.h" +#include "plugin/pluginapi.h" +#include "util/simpleserializer.h" +#include "util/db.h" +#include "util/morse.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 "aptdemod.h" +#include "aptdemodsink.h" +#include "aptdemodsettingsdialog.h" + +APTDemodGUI* APTDemodGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel) +{ + APTDemodGUI* gui = new APTDemodGUI(pluginAPI, deviceUISet, rxChannel); + return gui; +} + +void APTDemodGUI::destroy() +{ + delete this; +} + +void APTDemodGUI::resetToDefaults() +{ + m_settings.resetToDefaults(); + displaySettings(); + applySettings(true); +} + +QByteArray APTDemodGUI::serialize() const +{ + return m_settings.serialize(); +} + +bool APTDemodGUI::deserialize(const QByteArray& data) +{ + if(m_settings.deserialize(data)) { + displaySettings(); + applySettings(true); + return true; + } else { + resetToDefaults(); + return false; + } +} + +bool APTDemodGUI::handleMessage(const Message& message) +{ + if (APTDemod::MsgConfigureAPTDemod::match(message)) + { + qDebug("APTDemodGUI::handleMessage: APTDemod::MsgConfigureAPTDemod"); + const APTDemod::MsgConfigureAPTDemod& cfg = (APTDemod::MsgConfigureAPTDemod&) message; + m_settings = cfg.getSettings(); + blockApplySettings(true); + displaySettings(); + blockApplySettings(false); + return true; + } + else if (APTDemod::MsgImage::match(message)) + { + const APTDemod::MsgImage& imageMsg = (APTDemod::MsgImage&) message; + m_image = imageMsg.getImage(); + m_pixmap.convertFromImage(m_image); + ui->image->setPixmap(m_pixmap); + QStringList imageTypes = imageMsg.getImageTypes(); + if (imageTypes.size() == 0) + { + ui->channelALabel->setText("Channel A"); + ui->channelBLabel->setText("Channel B"); + } + else + { + if (imageTypes[0].isEmpty()) + ui->channelALabel->setText("Channel A"); + else + ui->channelALabel->setText(imageTypes[0]); + if (imageTypes[1].isEmpty()) + ui->channelBLabel->setText("Channel B"); + else + ui->channelBLabel->setText(imageTypes[1]); + } + QString satelliteName = imageMsg.getSatelliteName(); + if (!satelliteName.isEmpty()) + ui->imageContainer->setWindowTitle("Received image from " + satelliteName); + else + ui->imageContainer->setWindowTitle("Received image"); + return true; + } + else if (DSPSignalNotification::match(message)) + { + DSPSignalNotification& notif = (DSPSignalNotification&) message; + m_basebandSampleRate = notif.getSampleRate(); + return true; + } + + return false; +} + +void APTDemodGUI::handleInputMessages() +{ + Message* message; + + while ((message = getInputMessageQueue()->pop()) != 0) + { + if (handleMessage(*message)) + { + delete message; + } + } +} + +void APTDemodGUI::channelMarkerChangedByCursor() +{ + ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); + m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); + applySettings(); +} + +void APTDemodGUI::channelMarkerHighlightedByCursor() +{ + setHighlighted(m_channelMarker.getHighlighted()); +} + +void APTDemodGUI::on_deltaFrequency_changed(qint64 value) +{ + m_channelMarker.setCenterFrequency(value); + m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency(); + applySettings(); +} + +void APTDemodGUI::on_rfBW_valueChanged(int value) +{ + float bw = value * 100.0f; + ui->rfBWText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); + m_channelMarker.setBandwidth(bw); + m_settings.m_rfBandwidth = bw; + applySettings(); +} + +void APTDemodGUI::on_fmDev_valueChanged(int value) +{ + ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1)); + m_settings.m_fmDeviation = value * 100.0; + applySettings(); +} + +void APTDemodGUI::on_channels_currentIndexChanged(int index) +{ + m_settings.m_channels = (APTDemodSettings::ChannelSelection)index; + if (m_settings.m_channels == APTDemodSettings::BOTH_CHANNELS) + { + ui->channelALabel->setVisible(true); + ui->channelBLabel->setVisible(true); + } + else if (m_settings.m_channels == APTDemodSettings::CHANNEL_A) + { + ui->channelALabel->setVisible(true); + ui->channelBLabel->setVisible(false); + } + else + { + ui->channelALabel->setVisible(false); + ui->channelBLabel->setVisible(true); + } + applySettings(); +} + +void APTDemodGUI::on_cropNoise_clicked(bool checked) +{ + m_settings.m_cropNoise = checked; + applySettings(); +} + +void APTDemodGUI::on_denoise_clicked(bool checked) +{ + m_settings.m_denoise = checked; + applySettings(); +} + +void APTDemodGUI::on_linear_clicked(bool checked) +{ + m_settings.m_linearEqualise = checked; + applySettings(); +} + +void APTDemodGUI::on_histogram_clicked(bool checked) +{ + m_settings.m_histogramEqualise = checked; + applySettings(); +} + +void APTDemodGUI::on_precipitation_clicked(bool checked) +{ + m_settings.m_precipitationOverlay = checked; + applySettings(); +} + +void APTDemodGUI::on_flip_clicked(bool checked) +{ + m_settings.m_flip = checked; + if (m_settings.m_flip) + ui->image->setAlignment(Qt::AlignBottom | Qt::AlignHCenter); + else + ui->image->setAlignment(Qt::AlignTop | Qt::AlignHCenter); + applySettings(); +} + +void APTDemodGUI::on_startStop_clicked(bool checked) +{ + m_settings.m_decodeEnabled = checked; + applySettings(); +} + +void APTDemodGUI::on_resetDecoder_clicked() +{ + ui->image->setPixmap(QPixmap()); + ui->imageContainer->setWindowTitle("Received image"); + // Send message to reset decoder + m_aptDemod->getInputMessageQueue()->push(APTDemod::MsgResetDecoder::create()); +} + +void APTDemodGUI::on_showSettings_clicked() +{ + APTDemodSettingsDialog dialog(&m_settings); + if (dialog.exec() == QDialog::Accepted) + applySettings(); +} + +// Save image to disk +void APTDemodGUI::on_saveImage_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) + { + qDebug() << "APT: Saving image to " << fileNames; + if (!m_image.save(fileNames[0])) + QMessageBox::critical(this, "APT Demodulator", QString("Failed to save image to %1").arg(fileNames[0])); + } + } +} + +void APTDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) +{ + (void) widget; + (void) rollDown; +} + +void APTDemodGUI::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_aptDemod->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(); +} + +APTDemodGUI::APTDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent) : + ChannelGUI(parent), + ui(new Ui::APTDemodGUI), + m_pluginAPI(pluginAPI), + m_deviceUISet(deviceUISet), + m_channelMarker(this), + m_doApplySettings(true), + m_tickCount(0) +{ + 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_aptDemod = reinterpret_cast(rxChannel); + m_aptDemod->setMessageQueueToGUI(getInputMessageQueue()); + + connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick())); // 50 ms + + ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03))); + ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); + ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999); + ui->channelPowerMeter->setColorTheme(LevelMeterSignalDB::ColorGreenAndBlue); + + 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("APT Demodulator"); + 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())); + + displaySettings(); + applySettings(true); +} + +APTDemodGUI::~APTDemodGUI() +{ + delete ui; +} + +void APTDemodGUI::blockApplySettings(bool block) +{ + m_doApplySettings = !block; +} + +void APTDemodGUI::applySettings(bool force) +{ + if (m_doApplySettings) + { + APTDemod::MsgConfigureAPTDemod* message = APTDemod::MsgConfigureAPTDemod::create( m_settings, force); + m_aptDemod->getInputMessageQueue()->push(message); + } +} + +void APTDemodGUI::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()); + + ui->rfBWText->setText(QString("%1k").arg(m_settings.m_rfBandwidth / 1000.0, 0, 'f', 1)); + ui->rfBW->setValue(m_settings.m_rfBandwidth / 100.0); + + ui->fmDevText->setText(QString("%1k").arg(m_settings.m_fmDeviation / 1000.0, 0, 'f', 1)); + ui->fmDev->setValue(m_settings.m_fmDeviation / 100.0); + + ui->startStop->setChecked(m_settings.m_decodeEnabled); + ui->cropNoise->setChecked(m_settings.m_cropNoise); + ui->denoise->setChecked(m_settings.m_denoise); + ui->linear->setChecked(m_settings.m_linearEqualise); + ui->histogram->setChecked(m_settings.m_histogramEqualise); + ui->precipitation->setChecked(m_settings.m_precipitationOverlay); + ui->flip->setChecked(m_settings.m_flip); + if (m_settings.m_flip) + ui->image->setAlignment(Qt::AlignBottom | Qt::AlignHCenter); + else + ui->image->setAlignment(Qt::AlignTop | Qt::AlignHCenter); + ui->channels->setCurrentIndex((int)m_settings.m_channels); + + displayStreamIndex(); + + blockApplySettings(false); +} + +void APTDemodGUI::displayStreamIndex() +{ + if (m_deviceUISet->m_deviceMIMOEngine) { + setStreamIndicator(tr("%1").arg(m_settings.m_streamIndex)); + } else { + setStreamIndicator("S"); // single channel indicator + } +} + +void APTDemodGUI::leaveEvent(QEvent*) +{ + m_channelMarker.setHighlighted(false); +} + +void APTDemodGUI::enterEvent(QEvent*) +{ + m_channelMarker.setHighlighted(true); +} + +void APTDemodGUI::tick() +{ + double magsqAvg, magsqPeak; + int nbMagsqSamples; + m_aptDemod->getMagSqLevels(magsqAvg, magsqPeak, nbMagsqSamples); + double powDbAvg = CalcDb::dbPower(magsqAvg); + double powDbPeak = CalcDb::dbPower(magsqPeak); + + ui->channelPowerMeter->levelChanged( + (100.0f + powDbAvg) / 100.0f, + (100.0f + powDbPeak) / 100.0f, + nbMagsqSamples); + + if (m_tickCount % 4 == 0) { + ui->channelPower->setText(QString::number(powDbAvg, 'f', 1)); + } + + m_tickCount++; +} diff --git a/plugins/channelrx/demodapt/aptdemodgui.h b/plugins/channelrx/demodapt/aptdemodgui.h new file mode 100644 index 000000000..7c324af48 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodgui.h @@ -0,0 +1,116 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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_APTDEMODGUI_H +#define INCLUDE_APTDEMODGUI_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "channel/channelgui.h" +#include "dsp/channelmarker.h" +#include "dsp/movingaverage.h" +#include "util/messagequeue.h" +#include "aptdemodsettings.h" + +class PluginAPI; +class DeviceUISet; +class BasebandSampleSink; +class APTDemod; +class APTDemodGUI; + +namespace Ui { + class APTDemodGUI; +} +class APTDemodGUI; + +class APTDemodGUI : public ChannelGUI { + Q_OBJECT + +public: + static APTDemodGUI* 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::APTDemodGUI* ui; + PluginAPI* m_pluginAPI; + DeviceUISet* m_deviceUISet; + ChannelMarker m_channelMarker; + APTDemodSettings m_settings; + bool m_doApplySettings; + + APTDemod* m_aptDemod; + int m_basebandSampleRate; + uint32_t m_tickCount; + MessageQueue m_inputMessageQueue; + + QImage m_image; + QPixmap m_pixmap; + + explicit APTDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0); + virtual ~APTDemodGUI(); + + void blockApplySettings(bool block); + void applySettings(bool force = false); + void displaySettings(); + void displayStreamIndex(); + bool handleMessage(const Message& message); + + void leaveEvent(QEvent*); + void enterEvent(QEvent*); + +private slots: + void on_deltaFrequency_changed(qint64 value); + void on_rfBW_valueChanged(int index); + void on_fmDev_valueChanged(int value); + void on_channels_currentIndexChanged(int index); + void on_cropNoise_clicked(bool checked=false); + void on_denoise_clicked(bool checked=false); + void on_linear_clicked(bool checked=false); + void on_histogram_clicked(bool checked=false); + void on_precipitation_clicked(bool checked=false); + void on_flip_clicked(bool checked=false); + void on_startStop_clicked(bool checked=false); + void on_showSettings_clicked(); + void on_resetDecoder_clicked(); + void on_saveImage_clicked(); + void onWidgetRolled(QWidget* widget, bool rollDown); + void onMenuDialogCalled(const QPoint& p); + void handleInputMessages(); + void tick(); +}; + +#endif // INCLUDE_APTDEMODGUI_H diff --git a/plugins/channelrx/demodapt/aptdemodgui.ui b/plugins/channelrx/demodapt/aptdemodgui.ui new file mode 100644 index 000000000..2579d8c26 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodgui.ui @@ -0,0 +1,723 @@ + + + APTDemodGUI + + + + 0 + 0 + 451 + 569 + + + + + 0 + 0 + + + + + 352 + 0 + + + + + Liberation Sans + 9 + + + + Qt::StrongFocus + + + APT Demodulator + + + APT Demodulator + + + + + 0 + 0 + 431 + 121 + + + + + 350 + 0 + + + + Settings + + + + 3 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + 2 + + + + + + 16 + 0 + + + + Df + + + + + + + + 0 + 0 + + + + + 32 + 16 + + + + + Liberation Mono + 12 + + + + PointingHandCursor + + + Qt::StrongFocus + + + Demod shift frequency from center in Hz + + + + + + + Hz + + + + + + + Qt::Vertical + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Channel power + + + Qt::RightToLeft + + + 0.0 + + + + + + + dB + + + + + + + + + + + + + dB + + + + + + + + 0 + 0 + + + + + 0 + 24 + + + + + Liberation Mono + 8 + + + + Level meter (dB) top trace: average, bottom trace: instantaneous peak, tip: peak hold + + + + + + + + + + + BW + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + RF bandwidth + + + 300 + + + 600 + + + 1 + + + 400 + + + Qt::Horizontal + + + + + + + + 30 + 0 + + + + 40.0k + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Vertical + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + + + + Dev + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Frequency deviation + + + 100 + + + 250 + + + 1 + + + 170 + + + Qt::Horizontal + + + + + + + + 30 + 0 + + + + 17.0k + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + Start/stop decoding + + + + + + + :/play.png + :/stop.png:/play.png + + + + + + + Show settings dialog + + + + + + + :/listing.png:/listing.png + + + + + + + Reset decoder (clears current image) + + + + + + + :/bin.png:/bin.png + + + + + + + Save image to disk + + + + + + + :/save.png:/save.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Channels + + + + + + + + 55 + 0 + + + + Which channels from the image to display + + + + Both + + + + + A + + + + + B + + + + + + + + Crop noise from top and bottom of image + + + ^ + + + + :/apt/icons/cropnoise.png:/apt/icons/cropnoise.png + + + true + + + true + + + + + + + Apply denoise filter to the image + + + ^ + + + + :/apt/icons/denoise.png:/apt/icons/denoise.png + + + true + + + true + + + + + + + Apply linear equalisation to the image + + + ^ + + + + :/linear.png:/linear.png + + + true + + + true + + + + + + + Apply histogram equalisation to the image + + + ^ + + + + :/dsb.png:/dsb.png + + + true + + + true + + + + + + + Overlay precipitation + + + ^ + + + + :/apt/icons/precipitation.png:/apt/icons/precipitation.png + + + true + + + true + + + + + + + Satellite pass direction (flips image) + + + ^ + + + + :/arrow_down.png + :/arrow_up.png:/arrow_down.png + + + true + + + true + + + + + + + + + + + 0 + 150 + 431 + 381 + + + + + 0 + 0 + + + + Received Image + + + + 2 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + + + Channel A + + + Qt::AlignCenter + + + + + + + Channel B + + + Qt::AlignCenter + + + + + + + + + + 0 + 0 + + + + + 300 + 350 + + + + + + + Qt::AlignCenter + + + + + + + + + RollupWidget + QWidget +

gui/rollupwidget.h
+ 1 + + + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
+ + LevelMeterSignalDB + QWidget +
gui/levelmeter.h
+ 1 +
+ + ValueDialZ + QWidget +
gui/valuedialz.h
+ 1 +
+ + ScaledImage + QLabel +
gui/scaledimage.h
+
+ + + deltaFrequency + rfBW + fmDev + startStop + showSettings + resetDecoder + saveImage + channels + cropNoise + denoise + linear + histogram + precipitation + flip + + + + + + + diff --git a/plugins/channelrx/demodapt/aptdemodplugin.cpp b/plugins/channelrx/demodapt/aptdemodplugin.cpp new file mode 100644 index 000000000..cde064db4 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodplugin.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 "aptdemodgui.h" +#endif +#include "aptdemod.h" +#include "aptdemodwebapiadapter.h" +#include "aptdemodplugin.h" + +const PluginDescriptor APTDemodPlugin::m_pluginDescriptor = { + APTDemod::m_channelId, + QStringLiteral("APT Demodulator"), + QStringLiteral("6.5.5"), + QStringLiteral("(c) Jon Beniston, M7RCE and Aptdec authors"), + QStringLiteral("https://github.com/f4exb/sdrangel"), + true, + QStringLiteral("https://github.com/f4exb/sdrangel") +}; + +APTDemodPlugin::APTDemodPlugin(QObject* parent) : + QObject(parent), + m_pluginAPI(0) +{ +} + +const PluginDescriptor& APTDemodPlugin::getPluginDescriptor() const +{ + return m_pluginDescriptor; +} + +void APTDemodPlugin::initPlugin(PluginAPI* pluginAPI) +{ + m_pluginAPI = pluginAPI; + + m_pluginAPI->registerRxChannel(APTDemod::m_channelIdURI, APTDemod::m_channelId, this); +} + +void APTDemodPlugin::createRxChannel(DeviceAPI *deviceAPI, BasebandSampleSink **bs, ChannelAPI **cs) const +{ + if (bs || cs) + { + APTDemod *instance = new APTDemod(deviceAPI); + + if (bs) { + *bs = instance; + } + + if (cs) { + *cs = instance; + } + } +} + +#ifdef SERVER_MODE +ChannelGUI* APTDemodPlugin::createRxChannelGUI( + DeviceUISet *deviceUISet, + BasebandSampleSink *rxChannel) const +{ + (void) deviceUISet; + (void) rxChannel; + return 0; +} +#else +ChannelGUI* APTDemodPlugin::createRxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel) const +{ + return APTDemodGUI::create(m_pluginAPI, deviceUISet, rxChannel); +} +#endif + +ChannelWebAPIAdapter* APTDemodPlugin::createChannelWebAPIAdapter() const +{ + return new APTDemodWebAPIAdapter(); +} diff --git a/plugins/channelrx/demodapt/aptdemodplugin.h b/plugins/channelrx/demodapt/aptdemodplugin.h new file mode 100644 index 000000000..6fce4ea67 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodplugin.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_APTDEMODPLUGIN_H +#define INCLUDE_APTDEMODPLUGIN_H + +#include +#include "plugin/plugininterface.h" + +class DeviceUISet; +class BasebandSampleSink; + +class APTDemodPlugin : public QObject, PluginInterface { + Q_OBJECT + Q_INTERFACES(PluginInterface) + Q_PLUGIN_METADATA(IID "sdrangel.channel.aptdemod") + +public: + explicit APTDemodPlugin(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_APTDEMODPLUGIN_H diff --git a/plugins/channelrx/demodapt/aptdemodsettings.cpp b/plugins/channelrx/demodapt/aptdemodsettings.cpp new file mode 100644 index 000000000..a53e681ce --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodsettings.cpp @@ -0,0 +1,163 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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 "aptdemodsettings.h" + +APTDemodSettings::APTDemodSettings() : + m_channelMarker(0) +{ + resetToDefaults(); +} + +void APTDemodSettings::resetToDefaults() +{ + m_inputFrequencyOffset = 0; + m_rfBandwidth = 40000.0f; + m_fmDeviation = 17000.0f; + m_cropNoise = false; + m_denoise = true; + m_linearEqualise = false; + m_histogramEqualise = false; + m_precipitationOverlay = false; + m_flip = false; + m_channels = BOTH_CHANNELS; + m_decodeEnabled = true; + m_satelliteTrackerControl = true; + m_satelliteName = "All"; + m_autoSave = false; + m_autoSavePath = ""; + m_autoSaveMinScanLines = 200; + + m_rgbColor = QColor(216, 112, 169).rgb(); + m_title = "APT Demodulator"; + m_streamIndex = 0; + m_useReverseAPI = false; + m_reverseAPIAddress = "127.0.0.1"; + m_reverseAPIPort = 8888; + m_reverseAPIDeviceIndex = 0; + m_reverseAPIChannelIndex = 0; +} + +QByteArray APTDemodSettings::serialize() const +{ + SimpleSerializer s(1); + s.writeS32(1, m_inputFrequencyOffset); + s.writeS32(2, m_streamIndex); + s.writeReal(3, m_rfBandwidth); + s.writeReal(4, m_fmDeviation); + s.writeBool(5, m_cropNoise); + s.writeBool(6, m_denoise); + s.writeBool(7, m_linearEqualise); + s.writeBool(8, m_histogramEqualise); + s.writeBool(9, m_precipitationOverlay); + s.writeBool(10, m_flip); + s.writeS32(11, (int)m_channels); + s.writeBool(12, m_decodeEnabled); + s.writeBool(13, m_satelliteTrackerControl); + s.writeString(14, m_satelliteName); + s.writeBool(15, m_autoSave); + s.writeString(16, m_autoSavePath); + s.writeS32(17, m_autoSaveMinScanLines); + + if (m_channelMarker) { + s.writeBlob(20, m_channelMarker->serialize()); + } + + s.writeU32(21, m_rgbColor); + s.writeString(22, m_title); + s.writeBool(23, m_useReverseAPI); + s.writeString(24, m_reverseAPIAddress); + s.writeU32(25, m_reverseAPIPort); + s.writeU32(26, m_reverseAPIDeviceIndex); + s.writeU32(27, m_reverseAPIChannelIndex); + + return s.final(); +} + +bool APTDemodSettings::deserialize(const QByteArray& data) +{ + SimpleDeserializer d(data); + + if(!d.isValid()) + { + resetToDefaults(); + return false; + } + + if(d.getVersion() == 1) + { + QByteArray bytetmp; + uint32_t utmp; + QString strtmp; + + d.readS32(1, &m_inputFrequencyOffset, 0); + d.readS32(2, &m_streamIndex, 0); + d.readReal(3, &m_rfBandwidth, 40000.0f); + d.readReal(4, &m_fmDeviation, 17000.0f); + d.readBool(5, &m_cropNoise, false); + d.readBool(6, &m_denoise, true); + d.readBool(7, &m_linearEqualise, false); + d.readBool(8, &m_histogramEqualise, false); + d.readBool(9, &m_precipitationOverlay, false); + d.readBool(10, &m_flip, false); + d.readS32(11, (int *)&m_channels, (int)BOTH_CHANNELS); + d.readBool(12, &m_decodeEnabled, true); + d.readBool(13, &m_satelliteTrackerControl, true); + d.readString(14, &m_satelliteName, "All"); + d.readBool(15, &m_autoSave, false); + d.readString(16, &m_autoSavePath, ""); + d.readS32(17, &m_autoSaveMinScanLines, 200); + + d.readBlob(20, &bytetmp); + + if (m_channelMarker) { + m_channelMarker->deserialize(bytetmp); + } + + d.readU32(21, &m_rgbColor, QColor(216, 112, 169).rgb()); + d.readString(22, &m_title, "APT Demodulator"); + d.readBool(23, &m_useReverseAPI, false); + d.readString(24, &m_reverseAPIAddress, "127.0.0.1"); + d.readU32(25, &utmp, 0); + + if ((utmp > 1023) && (utmp < 65535)) { + m_reverseAPIPort = utmp; + } else { + m_reverseAPIPort = 8888; + } + + d.readU32(26, &utmp, 0); + m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp; + d.readU32(27, &utmp, 0); + m_reverseAPIChannelIndex = utmp > 99 ? 99 : utmp; + + return true; + } + else + { + resetToDefaults(); + return false; + } +} + + diff --git a/plugins/channelrx/demodapt/aptdemodsettings.h b/plugins/channelrx/demodapt/aptdemodsettings.h new file mode 100644 index 000000000..bcd805562 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodsettings.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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_APTDEMODSETTINGS_H +#define INCLUDE_APTDEMODSETTINGS_H + +#include +#include + +class Serializable; + +struct APTDemodSettings +{ + qint32 m_inputFrequencyOffset; + float m_rfBandwidth; + float m_fmDeviation; + bool m_cropNoise; + bool m_denoise; + bool m_linearEqualise; + bool m_histogramEqualise; + bool m_precipitationOverlay; + bool m_flip; + enum ChannelSelection {BOTH_CHANNELS, CHANNEL_A, CHANNEL_B} m_channels; + bool m_decodeEnabled; + bool m_satelliteTrackerControl; //! Whether Sat Tracker can set direction of pass + QString m_satelliteName; //!< All, NOAA 15, NOAA 18 or NOAA 19 + bool m_autoSave; + QString m_autoSavePath; + int m_autoSaveMinScanLines; + + quint32 m_rgbColor; + QString m_title; + Serializable *m_channelMarker; + QString m_audioDeviceName; + int m_streamIndex; //!< MIMO channel. Not relevant when connected to SI (single Rx). + bool m_useReverseAPI; + QString m_reverseAPIAddress; + uint16_t m_reverseAPIPort; + uint16_t m_reverseAPIDeviceIndex; + uint16_t m_reverseAPIChannelIndex; + + APTDemodSettings(); + void resetToDefaults(); + void setChannelMarker(Serializable *channelMarker) { m_channelMarker = channelMarker; } + QByteArray serialize() const; + bool deserialize(const QByteArray& data); +}; + +#endif /* INCLUDE_APTDEMODSETTINGS_H */ diff --git a/plugins/channelrx/demodapt/aptdemodsettingsdialog.cpp b/plugins/channelrx/demodapt/aptdemodsettingsdialog.cpp new file mode 100644 index 000000000..67b160826 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodsettingsdialog.cpp @@ -0,0 +1,56 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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 "aptdemodsettingsdialog.h" + +APTDemodSettingsDialog::APTDemodSettingsDialog(APTDemodSettings *settings, QWidget* parent) : + QDialog(parent), + m_settings(settings), + ui(new Ui::APTDemodSettingsDialog) +{ + ui->setupUi(this); + ui->satelliteTrackerControl->setChecked(settings->m_satelliteTrackerControl); + ui->satellite->setCurrentText(settings->m_satelliteName); + ui->autoSave->setChecked(settings->m_autoSave); + ui->autoSavePath->setText(settings->m_autoSavePath); + ui->minScanlines->setValue(settings->m_autoSaveMinScanLines); +} + +APTDemodSettingsDialog::~APTDemodSettingsDialog() +{ + delete ui; +} + +void APTDemodSettingsDialog::accept() +{ + m_settings->m_satelliteTrackerControl = ui->satelliteTrackerControl->isChecked(); + m_settings->m_satelliteName = ui->satellite->currentText(); + m_settings->m_autoSave = ui->autoSave->isChecked(); + m_settings->m_autoSavePath = ui->autoSavePath->text(); + m_settings->m_autoSaveMinScanLines = ui->minScanlines->value(); + QDialog::accept(); +} + +void APTDemodSettingsDialog::on_autoSavePathBrowse_clicked() +{ + QString dir = QFileDialog::getExistingDirectory(this, "Select directory to save images to", "", + QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + ui->autoSavePath->setText(dir); +} diff --git a/plugins/channelrx/demodapt/aptdemodsettingsdialog.h b/plugins/channelrx/demodapt/aptdemodsettingsdialog.h new file mode 100644 index 000000000..f43aaddd1 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodsettingsdialog.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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_APTDEMODSETTINGSDIALOG_H +#define INCLUDE_APTDEMODSETTINGSDIALOG_H + +#include "ui_aptdemodsettingsdialog.h" +#include "aptdemodsettings.h" + +class APTDemodSettingsDialog : public QDialog { + Q_OBJECT + +public: + explicit APTDemodSettingsDialog(APTDemodSettings *settings, QWidget* parent = 0); + ~APTDemodSettingsDialog(); + + APTDemodSettings *m_settings; + +private slots: + void accept(); + void on_autoSavePathBrowse_clicked(); + +private: + Ui::APTDemodSettingsDialog* ui; +}; + +#endif // INCLUDE_APTDEMODSETTINGSDIALOG_H diff --git a/plugins/channelrx/demodapt/aptdemodsettingsdialog.ui b/plugins/channelrx/demodapt/aptdemodsettingsdialog.ui new file mode 100644 index 000000000..4f146269f --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodsettingsdialog.ui @@ -0,0 +1,205 @@ + + + APTDemodSettingsDialog + + + + 0 + 0 + 385 + 212 + + + + + Liberation Sans + 9 + + + + APT Demodulator Settings + + + + + + + 0 + 0 + + + + + + + Path to save image + + + + + + + + + Path to save images to + + + + + + + + + + + :/load.png:/load.png + + + + + + + + + Minimum scanlines + + + + + + + Enter the minimum number of scanlines in an image (after cropping) for it to be automatically saved + + + 1 + + + 30000 + + + 100 + + + 200 + + + + + + + Satellite + + + + + + + Select which satellite this channel will be used for + + + true + + + + All + + + + + NOAA 15 + + + + + NOAA 18 + + + + + NOAA 19 + + + + + + + + Check to enable control by Satellite Tracker feature + + + Enable Satellite Tracker control + + + + + + + Check to automatically save images when acquisition is stopped or LOS + + + Auto save image + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + satelliteTrackerControl + satellite + autoSave + autoSavePath + autoSavePathBrowse + minScanlines + + + + + + + + buttonBox + accepted() + APTDemodSettingsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + APTDemodSettingsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/plugins/channelrx/demodapt/aptdemodsink.cpp b/plugins/channelrx/demodapt/aptdemodsink.cpp new file mode 100644 index 000000000..38538dc2f --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodsink.cpp @@ -0,0 +1,205 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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 + +#include "dsp/dspengine.h" +#include "dsp/dspengine.h" +#include "util/db.h" +#include "util/stepfunctions.h" +#include "pipes/pipeendpoint.h" +#include "maincore.h" + +#include "aptdemod.h" +#include "aptdemodsink.h" + +APTDemodSink::APTDemodSink(APTDemod *packetDemod) : + m_aptDemod(packetDemod), + m_channelSampleRate(APTDEMOD_AUDIO_SAMPLE_RATE), + m_channelFrequencyOffset(0), + m_magsqSum(0.0f), + m_magsqPeak(0.0f), + m_magsqCount(0), + m_messageQueueToChannel(nullptr), + m_samples(nullptr) +{ + m_magsq = 0.0; + + applySettings(m_settings, true); + applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true); + + m_samplesLength = APTDEMOD_AUDIO_SAMPLE_RATE * APT_MAX_HEIGHT / 2; // APT broadcasts at 2 lines per second + m_samples = new float[m_samplesLength]; + + resetDecoder(); +} + +void APTDemodSink::resetDecoder() +{ + m_sampleCount = 0; + m_writeIdx = 0; + m_readIdx = 0; + + apt_init(APTDEMOD_AUDIO_SAMPLE_RATE); + + m_row = 0; + m_zenith = 0; +} + +APTDemodSink::~APTDemodSink() +{ + delete m_samples; +} + +// callback from APT library to get audio samples +static int getsamples(void *context, float *samples, int count) +{ + APTDemodSink *sink = (APTDemodSink *)context; + return sink->getSamples(samples, count); +} + +int APTDemodSink::getSamples(float *samples, int count) +{ + for (int i = 0; i < count; i++) + { + if ((m_sampleCount > 0) && (m_readIdx < m_samplesLength)) + { + *samples++ = m_samples[m_readIdx++]; + m_sampleCount--; + } + else + return i; + } + + return count; +} + +void APTDemodSink::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; + } + } + } + + // Have we enough samples to decode one line? + // 2 lines per second + if (m_sampleCount >= APTDEMOD_AUDIO_SAMPLE_RATE) + { + float pixels[APT_PROW_WIDTH]; + apt_getpixelrow(pixels, m_row, &m_zenith, m_row == 0, getsamples, this); + getMessageQueueToChannel()->push(APTDemod::MsgPixels::create(pixels, m_zenith)); + m_row++; + } +} + + +void APTDemodSink::processOneSample(Complex &ci) +{ + Complex ca; + + // FM demodulation + double magsqRaw; + Real deviation; + Real fmDemod = m_phaseDiscri.phaseDiscriminatorDelta(ci, magsqRaw, deviation); + + // Add to sample buffer, if there's space and decoding is enabled + if ((m_writeIdx < m_samplesLength) && m_settings.m_decodeEnabled) + { + m_samples[m_writeIdx++] = fmDemod; + m_sampleCount++; + } + + // Calculate average and peak levels for level meter + Real magsq = magsqRaw / (SDR_RX_SCALED*SDR_RX_SCALED); + m_movingAverage(magsq); + m_magsq = m_movingAverage.asDouble(); + m_magsqSum += magsq; + if (magsq > m_magsqPeak) + { + m_magsqPeak = magsq; + } + m_magsqCount++; +} + +void APTDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force) +{ + qDebug() << "APTDemodSink::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.2); + m_interpolatorDistance = (Real) channelSampleRate / (Real) APTDEMOD_AUDIO_SAMPLE_RATE; + m_interpolatorDistanceRemain = m_interpolatorDistance; + } + + m_channelSampleRate = channelSampleRate; + m_channelFrequencyOffset = channelFrequencyOffset; +} + +void APTDemodSink::applySettings(const APTDemodSettings& settings, bool force) +{ + qDebug() << "APTDemodSink::applySettings:" + << " m_rfBandwidth: " << settings.m_rfBandwidth + << " m_fmDeviation: " << settings.m_fmDeviation + << " m_decodeEnabled: " << settings.m_decodeEnabled + << " force: " << force; + + if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + { + m_interpolator.create(16, m_channelSampleRate, settings.m_rfBandwidth, 2.2); + m_interpolatorDistance = (Real) m_channelSampleRate / (Real) APTDEMOD_AUDIO_SAMPLE_RATE; + m_interpolatorDistanceRemain = m_interpolatorDistance; + } + + if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) + { + m_phaseDiscri.setFMScaling(APTDEMOD_AUDIO_SAMPLE_RATE / (2.0f * settings.m_fmDeviation)); + } + + m_settings = settings; +} diff --git a/plugins/channelrx/demodapt/aptdemodsink.h b/plugins/channelrx/demodapt/aptdemodsink.h new file mode 100644 index 000000000..9a8a14284 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodsink.h @@ -0,0 +1,126 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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_APTDEMODSINK_H +#define INCLUDE_APTDEMODSINK_H + +#include "dsp/channelsamplesink.h" +#include "dsp/phasediscri.h" +#include "dsp/nco.h" +#include "dsp/interpolator.h" +#include "dsp/firfilter.h" +#include "util/movingaverage.h" +#include "util/doublebufferfifo.h" +#include "util/messagequeue.h" + +#include "aptdemodsettings.h" +#include + +#include +#include +#include + +// FIXME: Use lower sample rate for better SNR? +// Do we want an audio filter? Subcarrier at 2800Hz. Does libaptdec have one? +#define APTDEMOD_AUDIO_SAMPLE_RATE 48000 +// Lines are 2 per second -> 4160 words per second + +class APTDemod; + +class APTDemodSink : public ChannelSampleSink { +public: + APTDemodSink(APTDemod *packetDemod); + ~APTDemodSink(); + + 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 APTDemodSettings& settings, bool force = false); + void setMessageQueueToChannel(MessageQueue *messageQueue) { m_messageQueueToChannel = messageQueue; } + + 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; + } + + int getSamples(float *samples, int count); + void resetDecoder(); + +private: + struct MagSqLevelsStore + { + MagSqLevelsStore() : + m_magsq(1e-12), + m_magsqPeak(1e-12) + {} + double m_magsq; + double m_magsqPeak; + }; + + APTDemod *m_aptDemod; + APTDemodSettings m_settings; + int m_channelSampleRate; + int m_channelFrequencyOffset; + + 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; + + PhaseDiscriminators m_phaseDiscri; + + // Audio buffer - should probably use a FIFO + float *m_samples; + int m_sampleCount; + int m_samplesLength; + int m_readIdx; + int m_writeIdx; + + int m_row; // Row of image currently being received + int m_zenith; // Row number of Zenith + + void processOneSample(Complex &ci); + MessageQueue *getMessageQueueToChannel() { return m_messageQueueToChannel; } +}; + +#endif // INCLUDE_APTDEMODSINK_H diff --git a/plugins/channelrx/demodapt/aptdemodwebapiadapter.cpp b/plugins/channelrx/demodapt/aptdemodwebapiadapter.cpp new file mode 100644 index 000000000..b6cc87b0a --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodwebapiadapter.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 "aptdemod.h" +#include "aptdemodwebapiadapter.h" + +APTDemodWebAPIAdapter::APTDemodWebAPIAdapter() +{} + +APTDemodWebAPIAdapter::~APTDemodWebAPIAdapter() +{} + +int APTDemodWebAPIAdapter::webapiSettingsGet( + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage) +{ + (void) errorMessage; + response.setAptDemodSettings(new SWGSDRangel::SWGAPTDemodSettings()); + response.getAptDemodSettings()->init(); + APTDemod::webapiFormatChannelSettings(response, m_settings); + + return 200; +} + +int APTDemodWebAPIAdapter::webapiSettingsPutPatch( + bool force, + const QStringList& channelSettingsKeys, + SWGSDRangel::SWGChannelSettings& response, + QString& errorMessage) +{ + (void) force; + (void) errorMessage; + APTDemod::webapiUpdateChannelSettings(m_settings, channelSettingsKeys, response); + + return 200; +} diff --git a/plugins/channelrx/demodapt/aptdemodwebapiadapter.h b/plugins/channelrx/demodapt/aptdemodwebapiadapter.h new file mode 100644 index 000000000..32027f238 --- /dev/null +++ b/plugins/channelrx/demodapt/aptdemodwebapiadapter.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_APTDEMOD_WEBAPIADAPTER_H +#define INCLUDE_APTDEMOD_WEBAPIADAPTER_H + +#include "channel/channelwebapiadapter.h" +#include "aptdemodsettings.h" + +/** + * Standalone API adapter only for the settings + */ +class APTDemodWebAPIAdapter : public ChannelWebAPIAdapter { +public: + APTDemodWebAPIAdapter(); + virtual ~APTDemodWebAPIAdapter(); + + 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: + APTDemodSettings m_settings; +}; + +#endif // INCLUDE_APTDEMOD_WEBAPIADAPTER_H diff --git a/plugins/channelrx/demodapt/icons.qrc b/plugins/channelrx/demodapt/icons.qrc new file mode 100644 index 000000000..0806ccca5 --- /dev/null +++ b/plugins/channelrx/demodapt/icons.qrc @@ -0,0 +1,7 @@ + + + icons/cropnoise.png + icons/denoise.png + icons/precipitation.png + + diff --git a/plugins/channelrx/demodapt/icons/cropnoise.png b/plugins/channelrx/demodapt/icons/cropnoise.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d4f6944f37860dbf1b7f1070c4e457078230f7 GIT binary patch literal 353 zcmV-n0iOPeP)KR>6(JFc2If3J4XPD?llMbinhTlmI^-AR+7mDCH{1 zUI|wM{PKifenAUsSj-}EaF2Urq>=4euSe@h-k@#Ulv_i4id9uj(tQ~Kgy3BWzQ7qD zxWWPWf{lrxZe`@WF;6lP_QDH@XetRSrEO%I3!`2z%d-4d=bd4c-b%T}FRo_Hv|>HJ z^W<9I!9iEXV1x8L7J4t5+~sDE_x=q!gU+Bc=nVdYLEq30@+!Uxox8It$mPksV+ekr zH6kjBXr?qIInL@(D>Zj|?fqKE9(F^`nCQG;PbF|_mC^>;fSI<)ysqn^S{JNY2B&YZ zSS-11#)keQV{F{;iBEBwJEY@ix&000000NkvXXu0mjf%+Qtm literal 0 HcmV?d00001 diff --git a/plugins/channelrx/demodapt/icons/denoise.png b/plugins/channelrx/demodapt/icons/denoise.png new file mode 100644 index 0000000000000000000000000000000000000000..4084374adac3afa24d20b24fdf238a8d7c7fff9c GIT binary patch literal 456 zcmV;(0XP1MP)F8{ 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!4fY0000(^cR!KxbR7i=nRf|=GFc2JV;OIa)5G#-lqy##!1xvW=fD*0*tU&A_ zc5qfO_x7Cd^1OV&!+9^jOR_tgon-@(rO}g|c#TPGS^GPCB+vjj0(j8!JAhH&Er4fz ze*x$KOi?!p=7!`+G4DxMkv)~xsJ%_hSI)VOZb1sWVE+|K%)sZnnBQRZvYAo@cHB3T zP8){>PQx^YaPn1okt>P!D8Wpu9>6K3zF>BP-XUrg#^n_{w?RvPZc`D8b>7I55PelF7x)+Tn5Xx7eO5F@Y(`UbGSaXy=(dZYOy zLDAPT Demodulator Plugin + +

Introduction

+ +This plugin can be used to demodulate APT (Automatic Picture Transmission) signals transmitted by NOAA weather satellites. These images are at a 4km/pixel resolution in either the visible, near-IR, mid-IR or thermal-IR bands. + +![APT Demodulator plugin GUI](../../../doc/img/APTDemod_plugin.png) + +* NOAA 15 transmits on 137.620 MHz. +* NOAA 18 transmits on 137.912 MHz. +* NOAA 19 transmits on 137.100 MHz. + +

Interface

+ +![APT Demodulator plugin GUI](../../../doc/img/APTDemod_plugin_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: Channel power

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

3: Level meter in dB

+ + - top bar (green): average value + - bottom bar (blue green): instantaneous peak value + - tip vertical bar (bright green): peak hold value + +

4: RF Bandwidth

+ +This specifies the bandwidth of a LPF that is applied to the input signal to limit the RF bandwidth. APT signals are nominally 34kHz wide, however, this defaults to 40kHz to allow for some Doppler shift. + +

5: Frequency deviation

+ +Adjusts the expected frequency deviation in 0.1 kHz steps from 10 to 25 kHz. The typical value for APT is 17 kHz. + +

6: Start/stop decoding

+ +Starts or stops decoding. A maximum of 3000 scanlines can be decoded, after which, the Reset Decoder (7) button needs to be pressed, to start a new image. + +

7: Show settings dialog

+ +When clicked, shows additional APT Demodulator settings. + +![APT Demodulator settings dialog](../../../doc/img/APTDemod_plugin_settingsdialog.png) + +This includes: + + - Whether the APT demodulator can be controlled by the Satellite Tracker feature. When checked, the image decoder will be enabled and reset on AOS and the satellite pass direction will be used to control image rotation. The decoder will be stopped on LOS. + - Which satellites the APT demodulator will respond to AOS and LOS indications from the Satellite Tracker. This can be used to simulataneously decode images from multiple satellites, by having multiple instances of the APT Demodulator and setting a unique satellite name for each demodulator. + - Whether to automatically save the image on LOS. + - Path to save automatically saved images in. + - The minimum number of scanlines required to be in an image, after noise cropping, for it to be automatically saved. + +

8: Reset decoder

+ +Clears the current image and restarts the decoder. The decoder must be reset between passes of different satellites. + +

9: Save image to disk

+ +Saves the current image to disk. Images can be saved in PNG, JPEG, BMP, PPM, XBM or XPM formats. + +

10: Channel selection

+ +Selects whether: + + - both channels are displayed + - only channel A is displayed + - only channel B is displayed + +

11: Crop noise

+ +When checked, noise is cropped from the top and bottom of the image. This is noise that is typically the result of the satellite being at a low elevation. + +

12: Apply denoise filter

+ +When checked, a denoise filter is applied to the received image. + +

13: Apply linear equalisation

+ +When checked, linear equalisation is performed, which can enhance the contrast. The equalisation is performed separately on each channel. + +

14: Apply histogram equalisation

+ +When checked, histogram equalisation is performed, which can enhance the contrast. The equalisation is performed separately on each channel. + +

15: Overlay precipitation

+ +When checked, precipitation is detected from the IR channel and overlayed on both channels using a colour palette. + +This option will not work if linear or histogram equalisation has been applied. + +

16: Pass direction

+ +The pass direction check button should be set to match the direction of the satellite pass. +i.e. select down arrow for satellite passing from the North to the South and the up arrow for the satellite passing from the South to the North. +This will ensure the image has the Northern latitudes at the top of the image. +This can be set automatically by the Satellite Tracker feature. + +

Attribution

+ +This plugin uses libapt, part of Aptdec by Thierry Leconte and Xerbo, to perform image decoding and processing: https://github.com/Xerbo/aptdec + +Icons are by Freepik from Flaticon https://www.flaticon.com/ + +Icons are by Hare Krishna from the Noun Project Noun Project: https://thenounproject.com/