From 5b5424df3b756e2dbdc7add561a0a75f462deb63 Mon Sep 17 00:00:00 2001 From: Malcolm Robb Date: Fri, 27 Sep 2013 15:01:46 +0100 Subject: [PATCH] View1090 WinXP bugfix Updated the way socket handles are used in View1090 to maintain compatibility between UNIX and Windows. Added the initial attempt at a Planeplotter uploader --- Makefile | 7 +- Release/view1090.exe | Bin 86016 -> 86016 bytes coaa.h | 6 ++ coaa1090.obj | Bin 0 -> 19120 bytes dump1090.h | 2 +- interactive.c | 36 +------- mode_s.c | 9 +- ppup1090.c | 214 +++++++++++++++++++++++++++++++++++++++++++ ppup1090.h | 104 +++++++++++++++++++++ 9 files changed, 333 insertions(+), 45 deletions(-) create mode 100644 coaa.h create mode 100644 coaa1090.obj create mode 100644 ppup1090.c create mode 100644 ppup1090.h diff --git a/Makefile b/Makefile index 1827026..f8309e7 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ LIBS=`pkg-config --libs librtlsdr` -lpthread -lm CC=gcc -all: dump1090 view1090 +all: dump1090 view1090 ppup1090 %.o: %.c $(CC) $(CFLAGS) $(EXTRACFLAGS) -c $< @@ -26,5 +26,8 @@ dump1090: dump1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o $(CC) -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o $(LIBS) +ppup1090: ppup1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o + $(CC) -g -o ppup1090 ppup1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o coaa1090.obj $(LIBS) + clean: - rm -f *.o dump1090 view1090 + rm -f *.o dump1090 view1090 ppup1090 diff --git a/Release/view1090.exe b/Release/view1090.exe index 57ffc19f15cb51594b4275cc7ec4735144059d50..83ec3a9e2e7561076bdb7b9859f8785ccf550206 100644 GIT binary patch delta 16613 zcmd^me_T}6*7rHX42(K3qYOA8BZ#A-qN0Gm26RwByrB(0oB@BJmD-W4OlQ(cg*sr2 zM~dz?v$A`ku_se2Z2F`vX6QpUFPOb06bX392wv{dmz@k0Po=t$!T89DLm=QR<>WRS#4{~%b!T~&5g8Ri zak z>{Omm!Dn#30s3Pf=LsdLiJLp3B|2V`s&{jCD#%o zIn;@DG1r-D=2-xN7O}-}ZCeexNb8DOB%BAOI@gj}s>zez`xPOzD^_w? zsxvJq`NEk#WzYOV4wf1le!q?9tZiG>u)x^Y4X%5yZDU?jOxS6vqR>)U8k{d@&1Qc# zB}MN9NnQ>$VvD7-lt*(Tc7Rk{!?B@J`^ze*M6P8;sWwlZi;k6c?SQ?~wkkaH?ZV~& zdvoc4Jf+{omIO&@(X|$pD^hR~yU=2%`ZOplw&;B3eJWQJdf5cExprY4L`sA6vpH)NR&e3z>wY_ zf85%%HAyu?#@In0GD|5I~&Xd+HFPerv4ZVDY{ULTZ zw6@0%RSlh1-x+(9pKKcdKly>*JV^XOT^8J6Lbh4_K|^^h^6Ef-0Of}u-=SrH9T8i0 zTC0c|i5v;?!9aefI}ARetvu;o-LNM>GPy&=%@!^1E^Md>P-5KCB!o)c!3~80n#!Hp z5En?A-QfWpE)9v88@K>H)=f(Ubb}rOhNj_s2zw;n&i_zu?8AiO|3{O`{%=jn;7(+3;;J03l42~FeZRT{IHm&& z>rnW*R?11p6P6m_Jf4Y)f*jN39&$~ILtHe{jzhBOUGa>Us4g+$Wu1~gz!OWAQ~NSIyF z5%C3usFkvf1z3R>39=r6F^@>_Q6_-au4GLVm#XRfCAVmG4Pd_^)>%FfBR%Nzgg_uGY) zM4z0~neltm^NM6|>@`V*d_-5R#MGU_zl1UODkVLk&NmiGM9lTvgAmY0qN>9)h zlPBniupfk*=Dwh0)EJa&iZ$iGRNJjXfrm)Lu5xI=UP%Oj2>r%iYvF%crU4=rIZKhL zKq0%ZhYF>D@N* zim@zi((tnX=`({N^&foZ+XPhGH}e#qxd_6~?d4t5q=hRb$BMjsL2;wwB>xLHIs{7p zxJ;3~N{$9bauntZXUWhfl`=(eD9SymNEiZc=SpB-Pf9MUAjV9Ep$jl3+|*O?yIPFK zFULyp%z>o#rf2q!xz+Ap^UTj6@e9v9*5PKpa z5knH|Z;+*?HA+)IS>Br*}i?MfgCgZ7oX21~mrYReZ|!0l|L zFm)Rd?7|@u_mBFyJGA>$`ilP|i6>}N$rJWak!ld^LOCTLLsIO~xI^AvhisWo^R@tt z_T~b~Z$Xu`i-K}V{d6s+wp~ae`U{{VELq4mbq3`LF+|!{H;xiTf>7n_{-Hn#|4*nEg-CNiE+b2iXH=p8*N&Nd9QMLnU5h z&nFKmQw%;#D*Co)i};^*=p7_^bBEqaIkcq3DE1iL<4La?t1ek}7gg2Q2=`!R`PxDB z+dxOl0$w!B64vi`h>hynafVD85sTnQ2}|5V>I_IDk{IBS3$RgwT6g(}`VA?G!6B2N zNA5PW|C+fhiwbn`6^;6eC$LRl&`bvbC$LL4PVCZNh_T4~M{*$KfN&mXybDVKw+N9$ z)kv0OJsa{`Jha{)!^Wf?2kDwQJA z@T{}pf%72_lbP39^sEPT1EOITYPQS%DE7>(sbPE^49c{a&=c~zQS96-mo6(xk(q9n ztx;^r>=|J*V-=Y=lDTSPFV23eY*jdFQop5@>2R#;QTj=;sjW@!!F3g=6rtGk951DO zNmh*k0$@}H7_m8CO8JIbH6~){>vjYf!8u+^NjgPup6nmWajk($;B{PWM<7hx7w0Mq za|kOb&J!U5v+A@^WIa*h9@DC!q#wWJlMQ5^IGu9^dqRmSHmWnyDY5xqx5U6ia3o)= zY}`D*Kw4@sE|S(-jL!FzriGv#BXOcIN_MsNL$|45kwd;`2*;%$;IuZo;0<5V(gbfH zE!kqL+S2KF*99ebPNufb!YLA zBF^9muQW)vCD9c{UE38lC)29>F@}|8j@F(-uy*E|d7{{*efy-MbtVM^1XuN~)+ zMe_b(Y-`r=akXIj;&3%ER1yPcfjx@&`u`?==P-66Yq)8r!c0?`hMTq}4r9Gp@nsbX zQ>8FXH<{mJ`oUd;X0ocv%%=Wk_Mn6a z#gJA_*A-U&o9Hq)*>?wE$>0p`Z7uY?$KhTC%L8mmb#ufE)q`Qr#*V)9| zqRQSHh*tH`&f@o^UxuCTD8Yz|g(N!qJ}_8mM=3A=*1&OZbFe+R@w)?k`-GYHj?X); zwPd(f^plGENW6Q&1r1eu-fX)mHM5^&@0TibkLjoNe9@=Ooz_PhMI|qoNsBL`Rnhj# zM*Lc91BTS)C{=eur{#v1GGwRC72aPPaX`vwvAK1Mu#Q*6bYJUyTaTSqh&rvuOhn(DV@HWFX`sHc9A!w9t<0O62gP=Q=7OO8C+;jq z!d&uHo#^-LE1!TQCJkir0y4Fc{Z6aKh~W$aryWJkjmu~3nxGPK1Euot>$pVc<)dIf>gOPMe<`U3qPBGep3CPO8K%L%JU= zbLgwzLG`P}^b{D*xu+vFRY^@0h$5)aCH}~W%g~7ZJzBUrw0|7l)3P55CaR7OWn&97 z3#)F@XJZwiVQll4pf8)1>TF)B)RR(41}kJ3^mE)2uuklX!vrk-w?85VwMi39Y_MTi zyjrQ*9V>hUJB6dB49@>C?kj+W&3MRJLF_ie$TDNU*xyKO#s3iF&{%}**vCzI4*w^J zuVaOCB%1R-L_bj}q6l>i@UA#zyI~V#6BsUG#XK6Wn;1X?-;f^%ZaMMKNWN@JCosbxE^~z!`VHxTNy#K<~@a1?N zKY~Lg)ma@#B_g$2%KF!8t0w(L)a14zCnHx&nTg0;LFRXq8G+0f$UH|GBQhPx?50de zU5%5aIIM$^c?rMeUgRHkScc$gTUwwMTVin4uJZ6Fn@_XX9VMzql9=8(ENwp6#l_Nz zl9SB^j$?G8>vYJ6rlU*`ULBe2ewW4Mkf$fX)t%B=dE^WlTa(nhykto;o9diqM~6}G zMmpr}==$QyMu%&vU4Dhq#lD$hkIFr|I!kM>&g!*02>-`y(*TD#YW zOTnP2{O#gbYHKP)*vKVQP}s3#!i2OGT7Igt45&|sD&-c8BCyoskY5Fl8q>PGWLa~a z4do6kF(p86Dg0sXG_=5*h~|+yjVM(+JgE@jLEAK{M8S5bbT%?8B2{87u~5qZDdUB0*LOyj^$bG4o-M9Cr>}S(2KLRZTxpBe;Vh6ZVd`K|u}VyJ z$RqURO~sXd*92*qR+`(JV?D86C7rMrIOX&6Xze}#Wi%#d3*=KsVoWOi?zxrM+(D&$ ziFiUUUg_@hj{e!ns_q&(s2YV)tU#_9#P;76OS9V_k%``udQjdhrrXd)&SiASom%#f zyKb{4n#gD}3})|9%%(M9Ly>f&>1(yKKyi^?`OnHxzyP1ppgq1RPWed_yJzLF`2Wg= zwS7V(pi41SUs;GVV4r<#-^#c-D{m3|91{UzKBEJc20Z*$EA^GVbRG*>s;~GO8Hd~w z!UnDy7k#ri=*GzY#)LZL@{sz4tNz5N771u+>pNJOIk8i{UMF@01-1DtmFw@FJcegJqph~cSnsPE!Fe6+kw&mDS$+P1rP%;0(1iV?CzX! zr9MBYT?g0LtINhs^L>W6?;AKnDSD0*(S&0H*T?>&sc(%u#kHW^5c0OsvVcu^ADznxGvc^x%@Wv`GbXq#XWw1aWSqu zW|bz|;nQqi)Y`R^gN464oYv;j5 z9D0NO{^3~KTkA+0MNH)%|7(Cm_d3q(G9g0a(1hu7FUEb88S}L_ElH=Q|a|d_jRp%J< z?DEm8e!rB3?NR3sr8eLO49^GE;=NiU8iT_CH5d|}bh6S*Tj2_&Wj!heHcGX@=J$j>-)m22BmG;mGA;b<#+Ps2o0Cm%Izb}mJXURtBPHT*h;HhDNZ=k z!Cu^cQ1w9?vrAEyi)rxpEFB`M1qP2+@sjd%J8b6)9Ii3aGDBT%5v!IGRjKLhUCE-_ zoyIOoi4h&Bb$Tet>322-wFRBZlP3&j@jI5q1j^FAp~2yFjjJn!46Z(7q*N$+e#h9@ zaa7|{9OAki=;)wkdvc>VYl41fW6=9{d6$)4+Hsr8Uc{2B&8qTLc6+ti{+Jc(S1#$v zQO}1-o={Snd{Ue~!CpZ1BX;=4Azz+}nMh&?`$=+!BBtNdR25o8g>C8_v8UHtSj3K2 z+o*~g)sdqVbLrTEB~EujLs_1Z1ac16opOk<8BYkIJH~RH&F%>L-XY&{k-hdrj%wX7 z*7L+l)fO`=d2(}T1gxaUE5sq6n92V6Hu%boTDIXR5oRWpt~ckkjcZRl6AL+?{1H|md7G|9*|^{B<35KmT%{_)OWEWVb? zflt;CyYFjWbvd2s);*+pVH$gUUA3wsokcz{RrSP4w(x;jd>gBNAbJc%_QmBt-tE>Q zHqko$5p)J9E}uQYtu0^h6F<+h<*HM@ZzTK60}hn0AHDv5-nc3iCu3~>ml1e0C;8nS z@}(5^%7(91+mqRIuB9q(8|!h!4WI3?ar!E3SAb1`*8vTHZa{^HO?Ahq$A9nlv&HV0 z2PyY-{s#^6x0BhqwIjx0lUep^To8vrRa06z*!wgy-N$UJFY;kYGEVqUAS!e zX^g?@(67YRCQcm9iL13-F<#(hT6EWJp$1ooU5kF1rkzerJ)Zq}VR<}umJn%KHDn~sp zOKetKZ)|=i`5Y;&{p~0|hMoBBY%I6IY$h%IbRvqzreW16N6v|Mnfn}8QxNRV^~KVu zDB7B;oIi*3oj)Jz>=&5rDAo2a`?Mh|(X6FE037C!$A22IILap}L8Vjf97R#4PC3a$ zH#>Y?=(vA7oTWj@{*oEWv1Mx}ok>1rBZt8}f65`b2;B(M9IjZj9OAOAB;_5tlg|ce zL%P%^wKx5s5x@H@CPBd+O;VRqS}y{B(m6ql??3z>%l394V+|Pwq+#ql1tqOY7T%R?2JG z$z8*fAsYh;PdfR8FLHcV_b(hIph-C`^=;AV4J`VZX*iqZKeLQ)s6X_~S`DAf%rDH- zK|wrJHPb1pe%%X?sX{SvJPWiqI(b4@7BTG;zo^=h5s) z{!%>U7pi0%m+bdU5U8}d+eXh0Jmvdv)`g#1{~dT)E3AWnKOzBbvNr20hN!T*5=jbe z!SkNRwAC{v97d{?U+m2xEfJ&<-_L#%dC#@9pc4uaG6PY+YgnDBn0;7h(?SFxf>6w& zUYzoCrr^a%`4F?dk7Kq&Zbvh5E-%(s=r9oe)EKbjciyCv#v&ap!tz&tpu2sY^?fh# z^c8fY=CI4oZ*b=qr z&q_aj@0Z%WnZ-==@xsdV2JDml>4hRr$x5Cp`#6z}KLwvXsH)D%&tHJL!`rQWkciES@ zsA1i&n8qs=7x*J;`zrnmsw-6$dDo!;t!5S}D+a|hbw$N2dH*=nRp9~ z)#E!CuHA$nW9PGS`61@O5vO0hf z5CgCProG12ugM7ym}3W_2p|A9voBv=#h+sZuZ>hi8`!4TJ~hxCnA5G1*TiD2NlhtY zcf3BT?8;tcgS398|)i@*hyh z+Fa}jR>ZfHxYIvXj=qe9ctTwq^wacM_sL~`RD!i&&dapxnknrWzPzMWlL<@Uaom#T zMUxTA=M^NMn_a za~D|n;hA^rK*lM58cGX|p}KMf`dC<}2vlD1`vU~0U9P&B5!Nc)jUf0BTQczZyHdz5 zuL4Cd#PNLuAybi?%w9We38U+M?7$U3xVB}B8fL4m?q|Ci-c?Q8&kEiitJ3XfTi=dW zWe#P}z5N9CzOnD*)|bEIRYlbpl{jJHrkLuqdOF}>-SJP8A2Qab{V^s;wJ3xwZXB;l z2w{)ozYzAX{eGJr*TG|6W+6?Z=b|%9xzfRS&nNZ1^wR2=|TIh-3dAmHexfCHgrni6nO zXsN%JIT=w0wj$;ALyy1MjaOy+oNV3k_}@@;&=+~SYW`nC zgJ!?xDjZ9o*jOII*!knrhQXYGHS2@$>Hx1GJ7Qsv68*5=!%&CHtsjAST_Kt0HfP%+zWt@0p^ofP=Ox>z6UVvBr}|f!oQ5hoys<1sSvlwyeG8{ z??b;ku-{|8+{-FXP1e&IV)K1fYD;b`ey`(4)^ch(R+pbn#f|KHYisvX5%~nVvik68 z4BdO}$iMVbu@@R_r-#mj2CXffZt>RR$h-rXSacRS->1SC>@ib1xlt*5;J^W2=nV6j z#q6omBhoM{uzlWe8}QZ$XiIm1GUx^%{7FSnngKT3h{6ILUI z>$u5A6iDrom*MQ8$ly;^inh4F7=J^IR4~MrrOA!e)m?a3yjmK3?Ktm>EU&r<8x7lc zYDjBUO$X}q#auhCav1`wIATGW?^1bf$91;#FL8G%1=`A+;;O0?ah#X#SRXF-JiIZi zzf4>{ zveQ^oo&LY#!jl*-{GT8|5cU!Fo(IwYS8oSU9i=hlBmM2tS-5pr9Z^Bh6c7cs8>W81 z=0@7+{TL2mJ?Q^DF}(<5#ud2Dbko>#hknQFFiB*)K1kqKvG+bG(SR-I*2lNIRQbKA z+n2o>FY6-kqMhR!@rN6%GwzAPRpRKaJ?@bT!7OxvP(2rSP*a-F*b{SuG{xeoUi?J? zEfy~KGb8HdkGy;YItp>2^6~;tE!KSuD62g)0{g@9Go$#YnS5p>Kc!yx$uU*1wyQrz zElVnJI1$6qelDY3rTlWY&DlVasvVat)Y`ymhznBU`$jq&C|K-co>7?k3W`r#H6(xp zC%KK*@3tCnD`JorehAx(rEZVgIAd81#ji1bw@IF+kUd%Im^yheTYYvi7U11yKU7`% zoZa*3y(-t|?6XhrW@|qiUxpPZ`P}ppUca;1syTz4TW6P_M;8=(Dg3dvx(jD)(Yc~# zq$`WnU^xoziJ_a-e@wJ~uCJt%QK?#Pc?eNZYoMU(bI zjtW@hxl#OhmUeD9zlJS2H)c-8<7kj_+_GVc;MJ=~cSu}$NR5w`V2-#&$GNg8zF77# zwpSd!{=G>F*D9|SyC#C}kXN#nb0bHWJpwh!jh!7dJNs5$WeuHxTN#6sUd$ThT`ctc z=)q9i)T8?TEG_jX#%tQ0Ec1NIkV*Y|rLUBjF1UtmKR+>nCX8F(_cHX0D(ZZ^SX`i8 ztv}4KMz_q=A8uEosE+gY@qfc8z{GVM15I)b!d86gFqJ8Rcb7CPk$m96>=)*0-$uA- z)pRXp&tJ$#l=Rhw$lM%|N;yFeqCWu2`;mLp$Cc0eq?CK~^S}S$1zsrMwVQJmtj2w^ z90RT=Sh*Qjlw$HY9R-qGhu3h`8hdfQ{qN;`*@`bYZXKW;@C0B#pbc;Zp#BQ9Z}5** z;2gl6fc1c_fE|EZz?*>6fX@J3fa`#;uQ|>Fm<3n}SPCcwYywmPo&y{Nyz@0;pwmcn z0J;D-0MXs}=PV!_-~g-!YyxZt>;)VH{1wm*=mmtqz~O*#fE0iYU0b`3S6>uVA-mV&&DUBR`zJ0BhhENLu1l`^qRZ3Oqe&KS=KpY?jr#;Z>B?7dZvvq7 zfCDxz^g#U^a(>XvQ=i(n4**1;`I(KI1z6fe8UjBfI)dwfJ?O~(UlM4SJDwU5`TtqB zCk^B0t#akwf7cyr3)kGc3WKcV@7UnVTEG7O^&B^ho4fY@4XbkQxNqg!Ra}%Qt49DjZZVw4YT{XNM&y7cFCfcVyReu}!}O?=q82T%@J0Z0IJ1!r(A zfCj)0z)FA}kOr^-u4=#sGywJjb^ta3Rsbx3ZhX>z7SO0ZvR%Uu4&|pE*)xQ<1;fgk zVHpeTxmg8EGu`*Do18QwY3ar__ib>w@7yr)E{-*QX^waAhW`N`TV&&&?E^B{hOje$ zk6btLyVT|@i*3s8YEa0SU3fD>&_HnHEi)e;S4Q~`tgeHaY`+SHmu*}ofSi&Wh}rf} zyk7;qH))&Z6R>;M}e319&j0qQHZGVba>P!P}#I0V=O z*aRS90oYDyKmx!7&;fd3kPIN1(|x!BcrTy|-~ucK5Py7M<8id&GO_dF+d|F;jIVpS zG`Y+MPr)2{8KCb23f$5^O&4xr25{67+@ntcHD(Fi}C4+EbD?&VMweYs3w(a~pK&ETI8Mhd?p Q*>m{y{E^1FyiNCi0M)&6Z2$lO delta 16624 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 Ie82Gj3sBnWJpcdz literal 0 HcmV?d00001 diff --git a/dump1090.h b/dump1090.h index 58a50fc..a3ec71b 100644 --- a/dump1090.h +++ b/dump1090.h @@ -37,7 +37,7 @@ // MinorVer changes when additional features are added, but not for bug fixes (range 00-99) // DayDate & Year changes for all changes, including for bug fixes. It represent the release date of the update // -#define MODES_DUMP1090_VERSION "1.07.2609.13" +#define MODES_DUMP1090_VERSION "1.07.2709.13" // ============================= Include files ========================== diff --git a/interactive.c b/interactive.c index 6bc4efb..6fdb7a5 100644 --- a/interactive.c +++ b/interactive.c @@ -41,40 +41,6 @@ static uint64_t mstime(void) { mst += tv.tv_usec/1000; return mst; } - -#ifdef _WIN32 -// Standard error macro for reporting API errors -#define PERR(bSuccess, api){if(!(bSuccess)) printf("%s:Error %d from %s on line %d\n", __FILE__, GetLastError(), api, __LINE__);} - -void cls( HANDLE hConsole ) { - COORD coordScreen = { 0, 0 }; // here's where we'll home the cursor - BOOL bSuccess; - DWORD cCharsWritten; - CONSOLE_SCREEN_BUFFER_INFO csbi; // to get buffer info - DWORD dwConSize; // number of character cells in the current buffer - - // get the number of character cells in the current buffer - bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi ); - PERR( bSuccess, "GetConsoleScreenBufferInfo" ); - dwConSize = csbi.dwSize.X * csbi.dwSize.Y; - - // fill the entire screen with blanks - bSuccess = FillConsoleOutputCharacter( hConsole, (TCHAR) ' ', dwConSize, coordScreen, &cCharsWritten ); - PERR( bSuccess, "FillConsoleOutputCharacter" ); - - // get the current text attribute - bSuccess = GetConsoleScreenBufferInfo( hConsole, &csbi ); - PERR( bSuccess, "ConsoleScreenBufferInfo" ); - - // now set the buffer's attributes accordingly - bSuccess = FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten ); - PERR( bSuccess, "FillConsoleOutputAttribute" ); - - // put the cursor at (0, 0) - bSuccess = SetConsoleCursorPosition( hConsole, coordScreen ); - PERR( bSuccess, "SetConsoleCursorPosition" ); -} -#endif // //========================= Interactive mode =============================== // @@ -376,7 +342,7 @@ void interactiveShowData(void) { #ifndef _WIN32 printf("\x1b[H\x1b[2J"); // Clear the screen #else - cls(GetStdHandle(STD_OUTPUT_HANDLE)); + cls(); #endif if (Modes.interactive_rtl1090 == 0) { diff --git a/mode_s.c b/mode_s.c index d106989..fbccf0a 100644 --- a/mode_s.c +++ b/mode_s.c @@ -1816,13 +1816,8 @@ void detectModeS(uint16_t *m, uint32_t mlen) { void useModesMessage(struct modesMessage *mm) { if ((Modes.check_crc == 0) || (mm->crcok) || (mm->correctedbits)) { // not checking, ok or fixed - // Track aircrafts if... - if ( (Modes.interactive) // in interactive mode - || (Modes.stat_http_requests) // or if the HTTP interface is enabled - || (Modes.stat_sbs_connections) // or if sbs connections are established - || (Modes.mode_ac) ) { // or if mode A/C decoding is enabled - interactiveReceiveData(mm); - } + // Always track aircraft + interactiveReceiveData(mm); // In non-interactive non-quiet mode, display messages on standard output if (!Modes.interactive && !Modes.quiet) { diff --git a/ppup1090.c b/ppup1090.c new file mode 100644 index 0000000..c3ac3fe --- /dev/null +++ b/ppup1090.c @@ -0,0 +1,214 @@ +// ppup1090, a Mode S PlanePlotter Uploader for dump1090 devices. +// +// Copyright (C) 2013 by Malcolm Robb +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +#include "coaa.h" +#include "ppup1090.h" +// +// ============================= Utility functions ========================== +// +void sigintHandler(int dummy) { + NOTUSED(dummy); + signal(SIGINT, SIG_DFL); // reset signal handler - bit extra safety + Modes.exit = 1; // Signal to threads that we are done +} +// +// =============================== Initialization =========================== +// +void ppup1090InitConfig(void) { + + int iErr; + + // Default everything to zero/NULL + memset(&Modes, 0, sizeof(Modes)); + memset(&ppup1090, 0, sizeof(ppup1090)); + + // Now initialise things that should not be 0/NULL to their defaults + Modes.check_crc = 1; + Modes.quiet = 1; + strcpy(ppup1090.net_input_beast_ipaddr,PPUP1090_NET_OUTPUT_IP_ADDRESS); + Modes.net_input_beast_port = MODES_NET_OUTPUT_BEAST_PORT; + Modes.interactive_delete_ttl = MODES_INTERACTIVE_DELETE_TTL; + Modes.interactive_display_ttl = MODES_INTERACTIVE_DISPLAY_TTL; + Modes.fUserLat = MODES_USER_LATITUDE_DFLT; + Modes.fUserLon = MODES_USER_LONGITUDE_DFLT; + + if ((iErr = openCOAA())) + { + fprintf(stderr, "Error 0x%X initialising uploader\n", iErr); + exit(1); + } +} +// +//========================================================================= +// +void ppup1090Init(void) { + + int iErr; + + // Allocate the various buffers used by Modes + if ( NULL == (Modes.icao_cache = (uint32_t *) malloc(sizeof(uint32_t) * MODES_ICAO_CACHE_LEN * 2))) + { + fprintf(stderr, "Out of memory allocating data buffer.\n"); + exit(1); + } + + // Clear the buffers that have just been allocated, just in-case + memset(Modes.icao_cache, 0, sizeof(uint32_t) * MODES_ICAO_CACHE_LEN * 2); + + // Validate the users Lat/Lon home location inputs + if ( (Modes.fUserLat > 90.0) // Latitude must be -90 to +90 + || (Modes.fUserLat < -90.0) // and + || (Modes.fUserLon > 360.0) // Longitude must be -180 to +360 + || (Modes.fUserLon < -180.0) ) { + Modes.fUserLat = Modes.fUserLon = 0.0; + } else if (Modes.fUserLon > 180.0) { // If Longitude is +180 to +360, make it -180 to 0 + Modes.fUserLon -= 360.0; + } + // If both Lat and Lon are 0.0 then the users location is either invalid/not-set, or (s)he's in the + // Atlantic ocean off the west coast of Africa. This is unlikely to be correct. + // Set the user LatLon valid flag only if either Lat or Lon are non zero. Note the Greenwich meridian + // is at 0.0 Lon,so we must check for either fLat or fLon being non zero not both. + // Testing the flag at runtime will be much quicker than ((fLon != 0.0) || (fLat != 0.0)) + Modes.bUserFlags &= ~MODES_USER_LATLON_VALID; + if ((Modes.fUserLat != 0.0) || (Modes.fUserLon != 0.0)) { + Modes.bUserFlags |= MODES_USER_LATLON_VALID; + } + + // Prepare error correction tables + modesInitErrorInfo(); + + // Setup the uploader - read the user paramaters from the coaa.h header file + coaa1090.fUserLat = USER_LATITUDE; + coaa1090.fUserLon = USER_LONGITUDE; + strcpy(coaa1090.strAuthCode,STR(USER_AUTHCODE)); + strcpy(coaa1090.strRegNo, STR(USER_REGNO)); + + if ((iErr = initCOAA (coaa1090))) + { + fprintf(stderr, "Error 0x%X initialising uploader\n", iErr); + exit(1); + } +} +// +// ================================ Main ==================================== +// +void showHelp(void) { + printf( +"-----------------------------------------------------------------------------\n" +"| ppup1090 dump1090 Uploader Ver : "MODES_DUMP1090_VERSION " |\n" +"-----------------------------------------------------------------------------\n" + "--net-bo-ipaddr TCP Beast output listen IPv4 (default: 127.0.0.1)\n" + "--net-bo-port TCP Beast output listen port (default: 30005)\n" + "--quiet Disable output to stdout. Use for daemon applications\n" + "--help Show this help\n" + ); +} +// +//========================================================================= +// +int main(int argc, char **argv) { + int j, fd; + struct client *c; + + // Set sane defaults + + ppup1090InitConfig(); + signal(SIGINT, sigintHandler); // Define Ctrl/C handler (exit program) + + // Parse the command line options + for (j = 1; j < argc; j++) { + int more = ((j + 1) < argc); // There are more arguments + + if (!strcmp(argv[j],"--net-bo-port") && more) { + Modes.net_input_beast_port = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--net-bo-ipaddr") && more) { + strcpy(ppup1090.net_input_beast_ipaddr, argv[++j]); + } else if (!strcmp(argv[j],"--quiet")) { + ppup1090.quiet = 1; + } else if (!strcmp(argv[j],"--help")) { + showHelp(); + exit(0); + } else { + fprintf(stderr, "Unknown or not enough arguments for option '%s'.\n\n", argv[j]); + showHelp(); + exit(1); + } + } + + // Initialization + ppup1090Init(); + + // Try to connect to the selected ip address and port. We only support *ONE* input connection which we initiate.here. + if ((fd = anetTcpConnect(Modes.aneterr, ppup1090.net_input_beast_ipaddr, Modes.net_input_beast_port)) == ANET_ERR) { + fprintf(stderr, "Failed to connect to %s:%d\n", ppup1090.net_input_beast_ipaddr, Modes.net_input_beast_port); + exit(1); + } + // + // Setup a service callback client structure for a beast binary input (from dump1090) + // This is a bit dodgy under Windows. The fd parameter is a handle to the internet + // socket on which we are receiving data. Under Linux, these seem to start at 0 and + // count upwards. However, Windows uses "HANDLES" and these don't nececeriy start at 0. + // dump1090 limits fd to values less than 1024, and then uses the fd parameter to + // index into an array of clients. This is ok-ish if handles are allocated up from 0. + // However, there is no gaurantee that Windows will behave like this, and if Windows + // allocates a handle greater than 1024, then dump1090 won't like it. On my test machine, + // the first Windows handle is usually in the 0x54 (84 decimal) region. + + if (fd >= MODES_NET_MAX_FD) { // Max number of clients reached + close(fd); + exit(1); + } + + c = (struct client *) malloc(sizeof(*c)); + c->buflen = 0; + c->fd = + c->service = + Modes.bis = fd; + Modes.clients[fd] = c; + if (Modes.maxfd < fd) { + Modes.maxfd = fd; + } + + // Keep going till the user does something that stops us + while (!Modes.exit) { + modesReadFromClient(c,"",decodeBinMessage); + interactiveRemoveStaleAircrafts(); + postCOAA (); + } + + // The user has stopped us, so close any socket we opened + if (fd != ANET_ERR) + {close(fd);} + + closeCOAA (); + pthread_exit(0); +} +// +//========================================================================= +// diff --git a/ppup1090.h b/ppup1090.h new file mode 100644 index 0000000..21fa998 --- /dev/null +++ b/ppup1090.h @@ -0,0 +1,104 @@ +// ppup1090, a Mode S PlanePlotter Uploader for dump1090 devices. +// +// Copyright (C) 2013 by Malcolm Robb +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +#ifndef __PPUP1090_H +#define __PPUP1090_H + +// ============================= Include files ========================== + +#include "dump1090.h" + +#ifndef _WIN32 + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include "rtl-sdr.h" + #include "anet.h" + #include +#else + #include "winstubs.h" //Put everything Windows specific in here +#endif + +// ============================= #defines =============================== + +#define PPUP1090_NET_OUTPUT_IP_ADDRESS "127.0.0.1" + +#define NOTUSED(V) ((void) V) + +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) + +// ======================== structure declarations ======================== + +// Program global state +struct { // Internal state + int quiet; + // Networking + char net_input_beast_ipaddr[32]; // IPv4 address or network name of server/RPi +} ppup1090; + + +// COAA Initialisation structure +struct _coaa1090 { + double fUserLat; + double fUserLon; + char strAuthCode[16]; + char strRegNo[16]; +} coaa1090; + +// ======================== function declarations ========================= + +#ifdef __cplusplus +extern "C" { +#endif + +// +// Functions exported from coaa1090.c +// +int openCOAA (void); +int closeCOAA (void); +int initCOAA (struct _coaa1090 coaa1090); +void postCOAA (void); + +#ifdef __cplusplus +} +#endif + +#endif // __PPUP1090_H